@tea-agent/loop-agent 0.13.0-beta.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/AGENTS.md +2 -0
  2. package/CHANGELOG.md +56 -305
  3. package/README.md +13 -19
  4. package/dist/commands/init.js +92 -23
  5. package/dist/executors/pi-event-serializer.js +33 -11
  6. package/dist/executors/shell-executor.js +200 -21
  7. package/dist/infrastructure/evaluation/candidate-store.js +5 -1
  8. package/dist/worker/observe/spec-evidence.js +19 -10
  9. package/dist/worker/observe/static/app.js +4 -3
  10. package/dist/worker/observe/static/constants.js +10 -2
  11. package/dist/worker/observe/static/dag-helpers.js +37 -8
  12. package/dist/worker/observe/static/dom.js +159 -0
  13. package/dist/worker/observe/static/format-pool.d.ts +71 -0
  14. package/dist/worker/observe/static/format-pool.js +67 -0
  15. package/dist/worker/observe/static/format.js +27 -2
  16. package/dist/worker/observe/static/index.html +76 -34
  17. package/dist/worker/observe/static/kpi.js +12 -6
  18. package/dist/worker/observe/static/markdown-render.js +124 -0
  19. package/dist/worker/observe/static/shell-chrome.js +8 -2
  20. package/dist/worker/observe/static/state.js +20 -0
  21. package/dist/worker/observe/static/styles.css +662 -60
  22. package/dist/worker/observe/static/views/dag-inspector.js +65 -142
  23. package/dist/worker/observe/static/views/dag.js +9 -0
  24. package/dist/worker/observe/static/views/dashboard.js +512 -269
  25. package/dist/worker/observe/static/views/pool.js +595 -237
  26. package/dist/worker/observe/static/views/session-timeline.js +577 -11
  27. package/dist/workflows/dag/backend-test-case-manifest.js +503 -0
  28. package/dist/workflows/dag/backend-test-execution-contract.js +353 -0
  29. package/dist/workflows/dag/backend-test-result-contract.js +568 -0
  30. package/dist/workflows/dag/decision-envelope.js +57 -2
  31. package/dist/workflows/dag/frontend-implementation-contract.js +240 -0
  32. package/dist/workflows/dag/frontend-project-capability.js +309 -0
  33. package/dist/workflows/dag/frontend-repair.js +341 -0
  34. package/dist/workflows/dag/frontend-risk.js +161 -0
  35. package/dist/workflows/dag/frontend-verification-trace.js +190 -0
  36. package/dist/workflows/dag/init-hybrid.js +1020 -125
  37. package/dist/workflows/dag/repair-artifact.js +43 -3
  38. package/dist/workflows/dag/skill-instructions.js +4 -2
  39. package/dist/workflows/dag/types.js +29 -8
  40. package/docs/README.md +2 -0
  41. package/docs/agent-dag-recovery-playbook.md +3 -3
  42. package/docs/agent-dag-runner.md +3 -3
  43. package/docs/architecture/README.md +3 -3
  44. package/docs/architecture/dag-execution.md +1 -1
  45. package/docs/architecture/evolution.md +13 -13
  46. package/docs/architecture/facts-and-state.md +1 -1
  47. package/docs/architecture/runtime-boundaries.md +7 -7
  48. package/docs/architecture/system-overview.md +3 -3
  49. package/docs/architecture/worker-and-feature.md +3 -3
  50. package/docs/design/README.md +7 -7
  51. package/docs/development-principles.md +4 -4
  52. package/docs/exec-plans/active/README.md +2 -4
  53. package/docs/exec-plans/completed/README.md +29 -6
  54. package/docs/feature-workflow.md +57 -32
  55. package/docs/init-surface.manifest.json +21 -3
  56. package/docs/loop-agent-harness.md +8 -8
  57. package/docs/production-readiness.md +1 -1
  58. package/docs/progress/README.md +20 -3
  59. package/docs/reports/README.md +53 -7
  60. package/docs/templates/agent-dag.supervised-implementation.json +127 -8
  61. package/docs/templates/backend-test-case-manifest.schema.json +190 -0
  62. package/docs/templates/backend-test-dag.classify.prompt.md +75 -0
  63. package/docs/templates/backend-test-dag.generate-pytest.prompt.md +6 -4
  64. package/docs/templates/backend-test-dag.json +269 -21
  65. package/docs/templates/backend-test-dag.retrospect.prompt.md +44 -30
  66. package/docs/templates/backend-test-dag.review-cases.prompt.md +6 -4
  67. package/docs/templates/backend-test-execution.schema.json +133 -0
  68. package/docs/templates/backend-test-result.schema.json +99 -0
  69. package/docs/templates/branch-merge-report.md +93 -0
  70. package/docs/templates/frontend-eval/fixtures/failures/01-type-build-error.md +17 -0
  71. package/docs/templates/frontend-eval/fixtures/failures/02-unit-component-test-fail.md +16 -0
  72. package/docs/templates/frontend-eval/fixtures/failures/03-fixture-schema-drift.md +16 -0
  73. package/docs/templates/frontend-eval/fixtures/failures/04-missing-loading-empty-error-state.md +16 -0
  74. package/docs/templates/frontend-eval/fixtures/failures/05-forbidden-write-writeset-expansion.md +16 -0
  75. package/docs/templates/frontend-eval/fixtures/failures/06-unapproved-dependency-add.md +16 -0
  76. package/docs/templates/frontend-eval/fixtures/failures/07-mock-production-on.md +21 -0
  77. package/docs/templates/frontend-eval/fixtures/functional/01-simple-component-style.md +29 -0
  78. package/docs/templates/frontend-eval/fixtures/functional/02-form-validation.md +28 -0
  79. package/docs/templates/frontend-eval/fixtures/functional/03-list-detail-page.md +28 -0
  80. package/docs/templates/frontend-eval/fixtures/functional/04-api-mock.md +29 -0
  81. package/docs/templates/frontend-eval/fixtures/functional/05-permission-auth-gated-ui.md +27 -0
  82. package/docs/templates/frontend-eval/fixtures/functional/06-ssr-server-client-boundary.md +28 -0
  83. package/docs/templates/frontend-eval/fixtures/functional/07-shared-public-component-api.md +28 -0
  84. package/docs/templates/frontend-eval/fixtures/functional/08-pure-local-no-remote.md +27 -0
  85. package/docs/templates/frontend-eval/metrics.md +138 -0
  86. package/docs/templates/frontend-eval/smoke-targets.md +53 -0
  87. package/docs/templates/frontend-implementation-contract.schema.json +27 -0
  88. package/docs/verification-matrix.md +1 -1
  89. package/examples/decision-gate-agent-dag.json +4 -4
  90. package/examples/hybrid-loop-agent-dag.json +1 -1
  91. package/package.json +2 -2
  92. package/skills/ai-engineering-context/SKILL.md +2 -2
  93. package/skills/browser-tools/SKILL.md +196 -0
  94. package/skills/browser-tools/browser-content.js +103 -0
  95. package/skills/browser-tools/browser-cookies.js +35 -0
  96. package/skills/browser-tools/browser-eval.js +53 -0
  97. package/skills/browser-tools/browser-hn-scraper.js +108 -0
  98. package/skills/browser-tools/browser-nav.js +44 -0
  99. package/skills/browser-tools/browser-pick.js +162 -0
  100. package/skills/browser-tools/browser-screenshot.js +34 -0
  101. package/skills/browser-tools/browser-start.js +86 -0
  102. package/skills/browser-tools/package-lock.json +2556 -0
  103. package/skills/browser-tools/package.json +19 -0
  104. package/skills/frontend-implementation/SKILL.md +3 -1
  105. package/skills/frontend-implementation/references/node-contracts.md +17 -66
  106. package/skills/frontend-verification/SKILL.md +1 -1
  107. package/skills/grill-with-docs/SKILL.md +5 -5
  108. package/skills/grill-with-docs/adr-format.md +3 -3
  109. package/skills/init-capability-evolution/SKILL.md +5 -5
  110. package/skills/loop-agent/SKILL.md +5 -5
  111. package/skills/loop-agent/references/README.md +3 -3
  112. package/skills/loop-agent/references/command-reference.md +39 -17
  113. package/skills/loop-agent/references/docs-converge.md +15 -15
  114. package/skills/loop-agent/references/harness-policy.md +2 -2
  115. package/skills/loop-agent/references/hybrid-dag.md +20 -15
  116. package/skills/loop-agent/references/multi-worktree.md +1 -1
  117. package/skills/loop-agent/references/orchestrator-and-interventions.md +8 -8
  118. package/skills/loop-agent/references/task-workflow.md +1 -1
  119. package/skills/loop-agent/references/verification-and-failure-handling.md +6 -4
  120. package/skills/requesting-code-review/SKILL.md +1 -1
  121. package/skills/systematic-debugging/CREATION-LOG.md +3 -3
  122. package/skills/systematic-debugging/SKILL.md +1 -1
  123. package/skills/systematic-debugging/test-academic.md +1 -1
  124. package/skills/systematic-debugging/test-pressure-1.md +1 -1
  125. package/skills/systematic-debugging/test-pressure-2.md +1 -1
  126. package/skills/systematic-debugging/test-pressure-3.md +1 -1
  127. package/skills/verification-before-completion/SKILL.md +1 -1
@@ -279,6 +279,11 @@ td:first-child,
279
279
 
280
280
  .panel-primary {
281
281
  border-color: var(--hairline-strong);
282
+ box-shadow: var(--shadow-panel);
283
+ }
284
+ .panel-features {
285
+ background: var(--canvas-soft);
286
+ border-color: var(--hairline);
282
287
  }
283
288
  .panel-meta {
284
289
  background: transparent;
@@ -312,41 +317,263 @@ td:first-child,
312
317
  }
313
318
 
314
319
  .view-dashboard {
320
+ --dashboard-cols: minmax(0, 1.65fr) minmax(280px, 0.85fr);
321
+ /* Secondary: timeline + batch table — more even, batch side slightly wider. */
322
+ --dashboard-secondary-cols: minmax(0, 1fr) minmax(0, 1.2fr);
323
+ --dashboard-gap: var(--space-4);
315
324
  display: grid;
316
325
  gap: var(--space-4);
317
326
  }
318
327
 
319
- .repo-banner {
328
+ .view-pool {
329
+ display: grid;
330
+ gap: var(--space-4);
331
+ }
332
+ .page-header,
333
+ .pool-page-header,
334
+ .dashboard-page-header {
335
+ display: grid;
336
+ grid-template-columns: minmax(0, 1fr) auto;
337
+ gap: var(--space-4) var(--space-6);
338
+ align-items: start;
339
+ padding-bottom: var(--space-4);
340
+ border-bottom: 1px solid var(--hairline);
341
+ }
342
+ .page-header-heading,
343
+ .view-dashboard .page-header-heading,
344
+ .view-pool .page-header-heading {
345
+ margin-bottom: 0;
346
+ }
347
+ .pool-toolbar {
348
+ display: grid;
349
+ justify-items: end;
350
+ gap: 8px;
351
+ padding-top: 2px;
352
+ }
353
+ .pool-toolbar-actions {
320
354
  display: flex;
355
+ flex-wrap: wrap;
321
356
  align-items: center;
322
- gap: var(--space-3);
323
- padding: 10px 14px;
357
+ justify-content: flex-end;
358
+ gap: 10px 12px;
359
+ }
360
+ .pool-toolbar .pool-updated-at {
361
+ margin: 0;
362
+ max-width: 28ch;
363
+ font-size: 11px;
364
+ line-height: 1.4;
365
+ text-align: right;
366
+ }
367
+ .pool-refresh-btn {
368
+ appearance: none;
324
369
  border: 1px solid var(--hairline-strong);
325
- border-radius: var(--radius-lg);
370
+ border-radius: var(--radius-md);
326
371
  background: var(--surface);
372
+ color: var(--ink);
373
+ font-size: 13px;
374
+ font-weight: 700;
375
+ padding: 8px 14px;
376
+ cursor: pointer;
377
+ }
378
+ .pool-refresh-btn:hover {
379
+ border-color: var(--orange);
380
+ color: var(--orange-active);
381
+ }
382
+ .pool-auto-refresh-label {
383
+ display: inline-flex;
384
+ align-items: center;
385
+ gap: 6px;
386
+ color: var(--body);
387
+ font-size: 13px;
388
+ cursor: pointer;
389
+ }
390
+ .pool-workspace {
391
+ display: grid;
392
+ grid-template-columns: repeat(2, minmax(0, 1fr));
393
+ gap: var(--space-4);
394
+ align-items: start;
395
+ }
396
+ .pool-ops-list {
397
+ display: grid;
398
+ gap: 10px;
399
+ }
400
+ .pool-ops-card {
401
+ padding: 12px 14px;
402
+ border: 1px solid var(--hairline);
403
+ border-radius: var(--radius-md);
404
+ background: var(--canvas-soft);
405
+ border-left: 3px solid var(--hairline-strong);
406
+ }
407
+ .pool-ops-card-attention {
408
+ border-left-color: var(--red);
409
+ border-color: color-mix(in srgb, var(--red) 35%, var(--hairline));
410
+ background: #fff8f9;
411
+ }
412
+ .pool-ops-card-ready {
413
+ border-left-color: var(--orange);
414
+ background: #fffaf5;
327
415
  }
328
- .repo-banner > i {
416
+ .pool-ops-card-title {
417
+ margin-bottom: 6px;
418
+ font-size: 14px;
419
+ font-weight: 700;
420
+ }
421
+ .pool-ops-card-meta {
422
+ display: flex;
423
+ flex-wrap: wrap;
424
+ align-items: center;
425
+ gap: 8px;
329
426
  color: var(--muted);
330
- font-size: 18px;
427
+ font-size: 12px;
331
428
  }
332
- .repo-banner-text {
429
+ .pool-ops-card-detail {
430
+ margin: 8px 0 0;
431
+ color: var(--body);
432
+ font-size: 12px;
433
+ line-height: 1.5;
434
+ }
435
+ .pool-filters {
436
+ display: block;
437
+ }
438
+ .pool-filters-inner {
439
+ display: flex;
440
+ flex-wrap: wrap;
441
+ align-items: end;
442
+ gap: var(--space-3);
443
+ }
444
+ .pool-filters-inner label {
333
445
  display: grid;
334
- gap: 2px;
446
+ gap: 4px;
447
+ color: var(--muted);
448
+ font-size: 11px;
449
+ font-weight: 700;
450
+ }
451
+ .pool-filters-inner select,
452
+ .pool-filters-inner input[type="search"] {
453
+ min-width: 160px;
454
+ padding: 7px 10px;
455
+ border: 1px solid var(--hairline);
456
+ border-radius: var(--radius-md);
457
+ background: var(--surface);
458
+ color: var(--ink);
459
+ font-size: 13px;
460
+ }
461
+ .pool-table-wrap {
462
+ overflow-x: auto;
463
+ }
464
+ .pool-ref-links {
465
+ display: inline;
466
+ font-size: 12px;
467
+ overflow-wrap: anywhere;
468
+ }
469
+ .pool-events-details {
470
+ border: 1px solid var(--hairline);
471
+ border-radius: var(--radius-lg);
472
+ background: var(--surface);
473
+ padding: 0 var(--space-5) var(--space-4);
474
+ }
475
+ .pool-events-details > summary {
476
+ cursor: pointer;
477
+ padding: var(--space-4) 0;
478
+ color: var(--ink);
479
+ font-size: 14px;
480
+ font-weight: 700;
481
+ }
482
+ .pool-events-details > summary:hover {
483
+ color: var(--orange-active);
484
+ }
485
+ .pool-events-details .panel-timeline {
486
+ border: 0;
487
+ padding: 0;
488
+ box-shadow: none;
489
+ }
490
+ #pool-kpi.panel-kpi {
491
+ display: grid;
492
+ grid-template-columns: 1fr;
493
+ gap: var(--space-2);
494
+ }
495
+ #pool-kpi .section-heading {
496
+ margin: 0;
497
+ }
498
+ .pool-fault-active {
499
+ display: grid;
500
+ gap: var(--space-3);
501
+ }
502
+
503
+ .repo-banner {
504
+ display: flex;
505
+ align-items: flex-start;
506
+ gap: 10px;
507
+ padding: 6px 12px;
508
+ border: 1px solid var(--hairline);
509
+ border-radius: var(--radius-md);
510
+ background: transparent;
511
+ }
512
+ .repo-banner-inline {
513
+ justify-self: end;
514
+ align-items: center;
515
+ max-width: min(48ch, 100%);
516
+ padding: 4px 10px 4px 8px;
517
+ border: 1px solid var(--hairline);
518
+ border-radius: 999px;
519
+ background: var(--canvas-soft);
520
+ }
521
+ .repo-banner-icon {
522
+ display: inline-flex;
523
+ align-items: center;
524
+ justify-content: center;
525
+ flex: 0 0 auto;
526
+ width: 28px;
527
+ height: 28px;
528
+ border-radius: 8px;
529
+ background: var(--surface);
530
+ border: 1px solid var(--hairline);
531
+ color: var(--orange-active);
532
+ }
533
+ .repo-banner-icon > i {
534
+ font-size: 15px;
535
+ line-height: 1;
536
+ }
537
+ .repo-banner-inline .repo-banner-text {
538
+ display: grid;
539
+ justify-items: start;
540
+ gap: 1px;
541
+ min-width: 0;
542
+ }
543
+ .repo-banner-text {
544
+ display: flex;
545
+ flex-wrap: wrap;
546
+ align-items: baseline;
547
+ gap: 6px 10px;
335
548
  min-width: 0;
336
549
  }
337
550
  .repo-banner-name {
338
551
  color: var(--ink);
339
- font-size: 14px;
552
+ font-size: 13px;
340
553
  font-weight: 700;
341
- overflow-wrap: anywhere;
554
+ letter-spacing: 0.01em;
555
+ line-height: 1.25;
556
+ overflow: hidden;
557
+ text-overflow: ellipsis;
558
+ white-space: nowrap;
342
559
  }
343
560
  .repo-banner-path {
344
561
  color: var(--muted);
345
562
  font-size: 11px;
346
- overflow-wrap: anywhere;
563
+ line-height: 1.35;
564
+ font-variant-numeric: tabular-nums;
565
+ letter-spacing: 0.01em;
566
+ overflow: hidden;
567
+ text-overflow: ellipsis;
568
+ white-space: nowrap;
569
+ max-width: 36ch;
347
570
  }
348
571
 
349
572
  .panel-kpi {
573
+ display: grid;
574
+ grid-template-columns: var(--dashboard-cols);
575
+ gap: var(--space-2) var(--dashboard-gap);
576
+ align-items: stretch;
350
577
  padding: 0;
351
578
  background: transparent;
352
579
  border: 0;
@@ -356,11 +583,13 @@ td:first-child,
356
583
  margin: 0;
357
584
  padding: 0;
358
585
  border: 0;
586
+ min-width: 0;
359
587
  display: grid;
360
- gap: var(--space-3);
588
+ grid-template-rows: auto 1fr;
589
+ gap: var(--space-2);
361
590
  }
362
591
  .kpi-group + .kpi-group {
363
- margin-top: var(--space-3);
592
+ margin-top: 0;
364
593
  }
365
594
  .kpi-group-legend {
366
595
  padding: 0;
@@ -373,18 +602,56 @@ td:first-child,
373
602
 
374
603
  .kpi-grid {
375
604
  display: grid;
376
- grid-template-columns: repeat(6, minmax(0, 1fr));
605
+ grid-template-columns: repeat(5, minmax(0, 1fr));
377
606
  overflow: visible;
378
- border: 1px solid var(--hairline-strong);
379
- border-radius: var(--radius-lg);
607
+ border: 1px solid var(--hairline);
608
+ border-radius: var(--radius-md);
380
609
  background: var(--surface);
610
+ height: 100%;
611
+ }
612
+
613
+ /* Must follow .kpi-grid so display:flex wins over display:grid. */
614
+ .kpi-grid.pool-health-grid {
615
+ display: flex;
616
+ flex-wrap: nowrap;
617
+ align-items: stretch;
618
+ overflow-x: auto;
619
+ height: auto;
620
+ grid-template-columns: none;
621
+ }
622
+ .kpi-grid.pool-health-grid .kpi-card {
623
+ flex: 1 1 0;
624
+ min-width: 96px;
625
+ display: flex;
626
+ flex-direction: row;
627
+ flex-wrap: nowrap;
628
+ align-items: baseline;
629
+ justify-content: flex-start;
630
+ gap: 8px;
631
+ padding: 8px 12px;
632
+ border-top: 0;
633
+ border-left: 1px solid var(--hairline);
634
+ }
635
+ .kpi-grid.pool-health-grid .kpi-card:first-child {
636
+ border-left: 0;
637
+ }
638
+ .kpi-grid.pool-health-grid .kpi-value {
639
+ font-size: 18px;
640
+ line-height: 1.1;
641
+ }
642
+ .kpi-grid.pool-health-grid .kpi-label {
643
+ margin: 0;
644
+ font-size: 11px;
645
+ font-weight: 650;
646
+ color: var(--muted);
647
+ white-space: nowrap;
381
648
  }
382
649
 
383
650
  .kpi-card {
384
651
  position: relative;
385
652
  min-width: 0;
386
- min-height: 84px;
387
- padding: 15px 18px 14px;
653
+ min-height: 0;
654
+ padding: 10px 12px 9px;
388
655
  border-left: 1px solid var(--hairline);
389
656
  }
390
657
 
@@ -392,23 +659,50 @@ td:first-child,
392
659
  border-left: 0;
393
660
  }
394
661
  .kpi-label {
395
- margin-bottom: 9px;
662
+ margin-bottom: 4px;
396
663
  color: var(--muted);
397
- font-size: 11px;
664
+ font-size: 10px;
398
665
  font-weight: 650;
399
666
  }
400
667
  .kpi-value-row {
401
668
  display: flex;
402
- align-items: baseline;
669
+ align-items: flex-start;
403
670
  gap: 6px;
404
671
  }
405
672
  .kpi-value {
406
673
  color: var(--ink);
407
- font-size: 26px;
674
+ font-size: 22px;
408
675
  font-weight: 500;
409
676
  line-height: 1;
410
677
  font-variant-numeric: tabular-nums;
411
678
  }
679
+ .kpi-card.kpi-highlight .kpi-value {
680
+ color: var(--orange-active);
681
+ }
682
+ .kpi-card.kpi-muted .kpi-value {
683
+ color: var(--muted);
684
+ }
685
+ .kpi-card.kpi-risk .kpi-value {
686
+ color: var(--amber);
687
+ }
688
+ .kpi-card.kpi-danger .kpi-value {
689
+ color: var(--red);
690
+ }
691
+ .kpi-value-with-link {
692
+ display: flex;
693
+ flex-direction: column;
694
+ align-items: flex-start;
695
+ gap: 2px;
696
+ }
697
+ .kpi-value-with-link .kpi-value-num {
698
+ font-variant-numeric: tabular-nums;
699
+ }
700
+ .kpi-value-with-link .inbox-link {
701
+ font-size: 10px;
702
+ font-weight: 650;
703
+ line-height: 1.2;
704
+ text-underline-offset: 2px;
705
+ }
412
706
 
413
707
  .kpi-help {
414
708
  display: inline-flex;
@@ -464,75 +758,110 @@ td:first-child,
464
758
  .dashboard-workspace,
465
759
  .dashboard-secondary {
466
760
  display: grid;
467
- gap: var(--space-4);
468
- align-items: stretch;
761
+ gap: var(--dashboard-gap);
762
+ align-items: start;
469
763
  }
470
764
 
471
765
  .dashboard-workspace {
472
- grid-template-columns: 1fr;
766
+ grid-template-columns: var(--dashboard-cols);
473
767
  }
474
768
  .dashboard-secondary {
475
- grid-template-columns: repeat(2, minmax(0, 1fr));
769
+ grid-template-columns: var(--dashboard-secondary-cols);
770
+ }
771
+ #dashboard-batches {
772
+ min-width: 0;
773
+ overflow-x: auto;
774
+ }
775
+ #dashboard-batches table {
776
+ width: 100%;
777
+ min-width: 0;
778
+ }
779
+ #dashboard-batches th,
780
+ #dashboard-batches td {
781
+ white-space: nowrap;
782
+ }
783
+ #dashboard-batches td:last-child {
784
+ white-space: normal;
785
+ min-width: 12rem;
786
+ }
787
+
788
+ .panel-primary,
789
+ .panel-risk {
790
+ min-width: 0;
476
791
  }
477
792
 
478
793
  .panel-risk {
479
794
  display: block;
480
- background: var(--canvas-soft);
795
+ background: var(--surface);
796
+ border-color: var(--hairline-strong);
797
+ box-shadow: var(--shadow-panel);
798
+ position: sticky;
799
+ top: 16px;
481
800
  }
482
801
 
802
+ /* Attention state stays on inner cards; outer shell matches active DAG panel. */
483
803
  .panel-risk-attention {
484
- border-color: color-mix(in srgb, var(--red) 50%, var(--hairline));
485
- background: #fff8f9;
804
+ border-color: var(--hairline-strong);
805
+ background: var(--surface);
486
806
  }
487
807
  .panel-risk .section-heading {
488
- margin: 0 0 var(--space-3);
808
+ margin: 0 0 var(--space-4);
489
809
  }
490
810
  .risk-blocks {
491
811
  display: grid;
492
- gap: var(--space-4);
812
+ gap: 10px;
493
813
  }
494
- .risk-block {
814
+ .risk-block,
815
+ .risk-block-dag,
816
+ .risk-block-worker {
495
817
  display: grid;
496
- grid-template-columns: minmax(120px, 0.25fr) minmax(0, 1fr);
818
+ grid-template-columns: minmax(0, 1fr) auto;
819
+ grid-template-areas:
820
+ "label total"
821
+ "summary total"
822
+ "link total";
497
823
  align-items: start;
498
- gap: var(--space-3);
499
- padding-top: var(--space-3);
500
- border-top: 1px solid var(--hairline);
501
- }
502
- .risk-block:first-child {
503
- padding-top: 0;
504
- border-top: 0;
824
+ column-gap: var(--space-3);
825
+ row-gap: 4px;
826
+ padding: 14px;
827
+ padding-left: 12px;
828
+ border: 1px solid color-mix(in srgb, var(--red) 35%, var(--hairline));
829
+ border-left: 3px solid var(--red);
830
+ border-radius: var(--radius-md);
831
+ background: #fff8f9;
505
832
  }
506
833
  .risk-block-label {
507
- color: var(--muted);
834
+ grid-area: label;
835
+ color: var(--ink);
508
836
  font-size: 11px;
509
837
  font-weight: 700;
510
838
  letter-spacing: 0.04em;
511
839
  text-transform: uppercase;
512
840
  }
513
- .risk-block-dag .risk-block-label {
514
- color: var(--ink);
515
- }
516
- .risk-block-worker .risk-block-label {
517
- color: var(--ink);
518
- }
519
841
  .risk-total {
842
+ grid-area: total;
520
843
  margin: 0;
521
- color: var(--amber);
844
+ color: var(--red);
522
845
  font-size: 32px;
523
846
  font-weight: 500;
524
847
  line-height: 1;
525
848
  font-variant-numeric: tabular-nums;
526
- }
527
- .panel-risk-attention .risk-total {
528
- color: var(--red);
849
+ align-self: center;
850
+ text-align: right;
851
+ min-width: 1.5ch;
529
852
  }
530
853
  .risk-summary {
854
+ grid-area: summary;
531
855
  margin: 0;
532
856
  color: var(--body);
533
857
  font-size: 12px;
534
858
  line-height: 1.6;
535
859
  }
860
+ .risk-block .risk-link {
861
+ grid-area: link;
862
+ justify-self: start;
863
+ margin-top: 6px;
864
+ }
536
865
  .panel-risk .risk-empty {
537
866
  margin: 0;
538
867
  }
@@ -611,10 +940,17 @@ td:first-child,
611
940
  border: 1px solid var(--hairline);
612
941
  border-radius: var(--radius-md);
613
942
  background: var(--canvas-soft);
943
+ border-left: 3px solid var(--hairline-strong);
944
+ padding-left: 12px;
614
945
  }
615
946
  .active-dag-card-running {
616
- border-left: 3px solid var(--orange);
617
- padding-left: 12px;
947
+ border-left-color: var(--orange);
948
+ background: #fffaf5;
949
+ }
950
+ .active-dag-card-attention {
951
+ border-left-color: var(--red);
952
+ border-color: color-mix(in srgb, var(--red) 35%, var(--hairline));
953
+ background: #fff8f9;
618
954
  }
619
955
  .active-dag-header {
620
956
  display: flex;
@@ -641,6 +977,49 @@ td:first-child,
641
977
  margin-top: 10px;
642
978
  }
643
979
 
980
+ .feature-decision-list {
981
+ display: grid;
982
+ gap: 8px;
983
+ }
984
+ .feature-decision-row {
985
+ display: grid;
986
+ grid-template-columns: minmax(120px, 0.9fr) minmax(88px, 0.55fr) minmax(0, 1.6fr) auto;
987
+ align-items: center;
988
+ gap: var(--space-3);
989
+ padding: 10px 12px;
990
+ border: 1px solid var(--hairline);
991
+ border-radius: var(--radius-md);
992
+ background: var(--surface);
993
+ cursor: pointer;
994
+ }
995
+ .feature-decision-row:hover {
996
+ border-color: var(--hairline-strong);
997
+ }
998
+ .feature-decision-id {
999
+ min-width: 0;
1000
+ font-size: 13px;
1001
+ font-weight: 700;
1002
+ overflow-wrap: anywhere;
1003
+ }
1004
+ .feature-decision-status {
1005
+ color: var(--body);
1006
+ font-size: 12px;
1007
+ }
1008
+ .feature-decision-next {
1009
+ min-width: 0;
1010
+ color: var(--muted);
1011
+ font-size: 12px;
1012
+ overflow: hidden;
1013
+ text-overflow: ellipsis;
1014
+ white-space: nowrap;
1015
+ }
1016
+ .feature-decision-open {
1017
+ color: var(--ink);
1018
+ font-size: 12px;
1019
+ font-weight: 700;
1020
+ white-space: nowrap;
1021
+ }
1022
+
644
1023
  .meta-grid {
645
1024
  display: grid;
646
1025
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
@@ -770,12 +1149,13 @@ tr.clickable:focus-within {
770
1149
  .dag-inspector {
771
1150
  position: fixed;
772
1151
  z-index: 40;
773
- top: 96px;
1152
+ /* Align with site-header top edge; same inset as right/bottom. */
1153
+ top: 24px;
774
1154
  right: 24px;
775
1155
  bottom: 24px;
776
1156
  display: grid;
777
1157
  grid-template-rows: auto minmax(0, 1fr);
778
- width: min(var(--dag-inspector-width, 440px), calc(100vw - 48px));
1158
+ width: min(var(--dag-inspector-width, 50vw), calc(100vw - 48px));
779
1159
  min-width: 0;
780
1160
  padding: 0;
781
1161
  overflow: hidden;
@@ -1252,6 +1632,160 @@ body.is-resizing-dag-graph {
1252
1632
  font-size: 11px;
1253
1633
  }
1254
1634
 
1635
+ .process-timeline-toolbar {
1636
+ display: flex;
1637
+ flex-wrap: wrap;
1638
+ gap: 8px;
1639
+ margin-bottom: var(--space-2);
1640
+ }
1641
+ .process-timeline-toggle {
1642
+ min-height: 28px;
1643
+ padding: 0 10px;
1644
+ border: 1px solid var(--hairline-strong);
1645
+ border-radius: var(--radius-sm);
1646
+ background: var(--surface);
1647
+ color: var(--body);
1648
+ font-size: 11px;
1649
+ font-weight: 600;
1650
+ cursor: pointer;
1651
+ }
1652
+ .process-timeline-toggle:hover,
1653
+ .process-timeline-toggle:focus-visible {
1654
+ border-color: var(--orange);
1655
+ color: var(--orange-active);
1656
+ outline: none;
1657
+ }
1658
+ .process-timeline-toggle[aria-pressed="true"] {
1659
+ border-color: color-mix(in srgb, var(--orange) 55%, var(--hairline));
1660
+ background: #fff5ed;
1661
+ color: var(--orange-active);
1662
+ }
1663
+ .process-timeline-body {
1664
+ min-width: 0;
1665
+ padding: 4px 0 8px var(--space-2);
1666
+ }
1667
+ .process-timeline-card {
1668
+ display: grid;
1669
+ gap: 6px;
1670
+ min-width: 0;
1671
+ }
1672
+ .process-timeline-details {
1673
+ min-width: 0;
1674
+ border: 1px solid var(--hairline);
1675
+ border-radius: var(--radius-sm);
1676
+ background: var(--surface);
1677
+ }
1678
+ .process-timeline-summary {
1679
+ display: flex;
1680
+ flex-wrap: wrap;
1681
+ align-items: center;
1682
+ justify-content: space-between;
1683
+ gap: 8px;
1684
+ padding: 8px 10px;
1685
+ cursor: pointer;
1686
+ list-style: none;
1687
+ color: var(--ink);
1688
+ font-size: 12px;
1689
+ font-weight: 650;
1690
+ }
1691
+ .process-timeline-summary::-webkit-details-marker {
1692
+ display: none;
1693
+ }
1694
+ .process-timeline-summary-title {
1695
+ min-width: 0;
1696
+ overflow-wrap: anywhere;
1697
+ }
1698
+ .process-timeline-summary-status {
1699
+ flex-shrink: 0;
1700
+ color: var(--muted);
1701
+ font-size: 11px;
1702
+ font-weight: 700;
1703
+ }
1704
+ .process-timeline-summary-status.status-succeeded {
1705
+ color: var(--green);
1706
+ }
1707
+ .process-timeline-summary-status.status-failed {
1708
+ color: var(--red);
1709
+ }
1710
+ .process-timeline-summary-status.status-pending {
1711
+ color: var(--orange);
1712
+ }
1713
+ .process-timeline-tool-card.is-error .process-timeline-details {
1714
+ border-color: color-mix(in srgb, var(--red) 45%, var(--hairline));
1715
+ background: color-mix(in srgb, var(--red) 6%, var(--surface));
1716
+ }
1717
+ .process-timeline-card-body {
1718
+ display: grid;
1719
+ gap: 6px;
1720
+ padding: 0 10px 10px;
1721
+ }
1722
+ .process-timeline-section-label {
1723
+ color: var(--muted);
1724
+ font-size: 11px;
1725
+ font-weight: 700;
1726
+ }
1727
+ .process-timeline-code,
1728
+ .process-timeline-thinking-body {
1729
+ margin: 0;
1730
+ padding: 8px 10px;
1731
+ overflow: auto;
1732
+ border-radius: var(--radius-sm);
1733
+ background: var(--canvas-soft);
1734
+ color: var(--body);
1735
+ font-family: "JetBrains Mono", "SFMono-Regular", Consolas, monospace;
1736
+ font-size: 11px;
1737
+ line-height: 1.45;
1738
+ white-space: pre-wrap;
1739
+ overflow-wrap: anywhere;
1740
+ }
1741
+ .process-timeline-more {
1742
+ margin-top: 2px;
1743
+ }
1744
+ .process-timeline-more > summary {
1745
+ cursor: pointer;
1746
+ color: var(--blue);
1747
+ font-size: 11px;
1748
+ font-weight: 650;
1749
+ }
1750
+ .process-timeline-thinking > summary {
1751
+ background: color-mix(in srgb, var(--lavender) 35%, var(--surface));
1752
+ }
1753
+ .process-timeline-turn-text {
1754
+ display: grid;
1755
+ gap: 6px;
1756
+ padding: 8px 10px;
1757
+ border: 1px solid var(--hairline);
1758
+ border-radius: var(--radius-sm);
1759
+ background: var(--surface);
1760
+ }
1761
+ .process-timeline-turn-text .markdown-output {
1762
+ font-size: 12px;
1763
+ }
1764
+ .process-timeline-tool-only-note {
1765
+ margin: 0;
1766
+ font-size: 12px;
1767
+ }
1768
+ .process-timeline-turn-tools {
1769
+ display: grid;
1770
+ gap: 4px;
1771
+ margin: 0;
1772
+ padding: 0 0 0 1.1em;
1773
+ color: var(--body);
1774
+ font-size: 12px;
1775
+ font-family: "JetBrains Mono", "SFMono-Regular", Consolas, monospace;
1776
+ overflow-wrap: anywhere;
1777
+ }
1778
+ .process-timeline-turn-tools li {
1779
+ padding: 2px 0;
1780
+ }
1781
+ .process-timeline-agent-end-note {
1782
+ margin: 0;
1783
+ font-size: 11px;
1784
+ }
1785
+ .process-timeline-item.is-error .process-timeline-dot {
1786
+ background: var(--red);
1787
+ }
1788
+
1255
1789
  .markdown-output {
1256
1790
  display: grid;
1257
1791
  gap: var(--space-3);
@@ -1290,6 +1824,10 @@ body.is-resizing-dag-graph {
1290
1824
  .markdown-output ul,
1291
1825
  .markdown-output ol {
1292
1826
  margin: 0;
1827
+ overflow-wrap: anywhere;
1828
+ }
1829
+ .markdown-output p {
1830
+ white-space: normal;
1293
1831
  }
1294
1832
  .markdown-output ul,
1295
1833
  .markdown-output ol {
@@ -1601,17 +2139,34 @@ body.is-resizing-dag-graph {
1601
2139
  }
1602
2140
 
1603
2141
  @media (max-width: 1320px) {
2142
+ .view-dashboard {
2143
+ --dashboard-cols: 1fr;
2144
+ }
1604
2145
  .kpi-grid {
1605
2146
  grid-template-columns: repeat(3, minmax(0, 1fr));
1606
2147
  }
2148
+ .kpi-grid.pool-health-grid {
2149
+ display: flex;
2150
+ flex-wrap: nowrap;
2151
+ grid-template-columns: none;
2152
+ }
1607
2153
  .kpi-card:nth-child(4) {
1608
2154
  border-left: 0;
1609
2155
  }
1610
2156
  .kpi-card:nth-child(n + 4) {
1611
2157
  border-top: 1px solid var(--hairline);
1612
2158
  }
1613
- .dashboard-workspace {
1614
- grid-template-columns: 1fr;
2159
+ .kpi-grid.pool-health-grid .kpi-card,
2160
+ .kpi-grid.pool-health-grid .kpi-card:nth-child(n),
2161
+ .kpi-grid.pool-health-grid .kpi-card:nth-child(n + 4) {
2162
+ border-top: 0;
2163
+ border-left: 1px solid var(--hairline);
2164
+ }
2165
+ .kpi-grid.pool-health-grid .kpi-card:first-child {
2166
+ border-left: 0;
2167
+ }
2168
+ .panel-risk {
2169
+ position: static;
1615
2170
  }
1616
2171
  .run-detail-workspace {
1617
2172
  grid-template-columns: minmax(200px, 0.45fr) minmax(0, 1fr);
@@ -1636,6 +2191,32 @@ body.is-resizing-dag-graph {
1636
2191
  .panel-artifacts {
1637
2192
  grid-column: auto;
1638
2193
  }
2194
+ .pool-workspace {
2195
+ grid-template-columns: 1fr;
2196
+ }
2197
+ .page-header,
2198
+ .pool-page-header,
2199
+ .dashboard-page-header {
2200
+ grid-template-columns: 1fr;
2201
+ }
2202
+ .repo-banner-inline {
2203
+ justify-self: start;
2204
+ max-width: none;
2205
+ }
2206
+ .repo-banner-path {
2207
+ max-width: none;
2208
+ white-space: normal;
2209
+ }
2210
+ .pool-toolbar {
2211
+ justify-items: start;
2212
+ }
2213
+ .pool-toolbar-actions {
2214
+ justify-content: flex-start;
2215
+ }
2216
+ .pool-toolbar .pool-updated-at {
2217
+ text-align: left;
2218
+ max-width: none;
2219
+ }
1639
2220
  }
1640
2221
 
1641
2222
  @media (max-width: 720px) {
@@ -1648,6 +2229,11 @@ body.is-resizing-dag-graph {
1648
2229
  .kpi-grid {
1649
2230
  grid-template-columns: repeat(2, minmax(0, 1fr));
1650
2231
  }
2232
+ .kpi-grid.pool-health-grid {
2233
+ display: flex;
2234
+ flex-wrap: nowrap;
2235
+ grid-template-columns: none;
2236
+ }
1651
2237
  .kpi-card:nth-child(n) {
1652
2238
  border-top: 1px solid var(--hairline);
1653
2239
  border-left: 1px solid var(--hairline);
@@ -1659,8 +2245,17 @@ body.is-resizing-dag-graph {
1659
2245
  .kpi-card:nth-child(odd) {
1660
2246
  border-left: 0;
1661
2247
  }
2248
+ .kpi-grid.pool-health-grid .kpi-card,
2249
+ .kpi-grid.pool-health-grid .kpi-card:nth-child(n),
2250
+ .kpi-grid.pool-health-grid .kpi-card:nth-child(odd) {
2251
+ border-top: 0;
2252
+ border-left: 1px solid var(--hairline);
2253
+ }
2254
+ .kpi-grid.pool-health-grid .kpi-card:first-child {
2255
+ border-left: 0;
2256
+ }
1662
2257
  .dag-inspector {
1663
- top: 76px;
2258
+ top: 12px;
1664
2259
  right: 12px;
1665
2260
  bottom: 12px;
1666
2261
  width: calc(100vw - 24px);
@@ -1671,9 +2266,16 @@ body.is-resizing-dag-graph {
1671
2266
  .dashboard-secondary {
1672
2267
  grid-template-columns: 1fr;
1673
2268
  }
1674
- .risk-block {
2269
+ .feature-decision-row {
1675
2270
  grid-template-columns: 1fr;
1676
- gap: var(--space-2);
2271
+ gap: 4px;
2272
+ }
2273
+ .feature-decision-next {
2274
+ white-space: normal;
2275
+ }
2276
+ .risk-block {
2277
+ grid-template-columns: minmax(0, 1fr) auto;
2278
+ column-gap: var(--space-2);
1677
2279
  }
1678
2280
  .panel {
1679
2281
  padding: var(--space-4);