@matt82198/aesop 0.1.0 → 0.2.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 (114) hide show
  1. package/CHANGELOG.md +89 -2
  2. package/README.md +63 -12
  3. package/bin/cli.js +164 -41
  4. package/daemons/run-watchdog.sh +16 -4
  5. package/daemons/selfheal.sh +231 -0
  6. package/docs/ANY-REPO.md +427 -0
  7. package/docs/CONTRIBUTING.md +72 -0
  8. package/docs/DEMO.md +334 -0
  9. package/docs/INSTALL.md +70 -1
  10. package/docs/QUICKSTART.md +80 -0
  11. package/docs/README.md +33 -3
  12. package/docs/TEAM-STATE.md +540 -0
  13. package/driver/CLAUDE.md +148 -0
  14. package/driver/README.md +383 -0
  15. package/driver/aesop.config.example.json +80 -0
  16. package/driver/agent_driver.py +355 -0
  17. package/driver/backend_config.py +253 -0
  18. package/driver/claude_code_driver.py +198 -0
  19. package/driver/codex_driver.py +626 -0
  20. package/driver/openai_compatible_driver.py +249 -0
  21. package/driver/openai_transport.py +146 -0
  22. package/driver/verification_policy.py +75 -0
  23. package/driver/wave_bridge.py +246 -0
  24. package/driver/wave_loop.py +1041 -0
  25. package/hooks/pre-push-policy.sh +109 -28
  26. package/mcp/server.mjs +320 -4
  27. package/package.json +23 -15
  28. package/skills/CLAUDE.md +132 -2
  29. package/skills/buildsystem/SKILL.md +330 -0
  30. package/skills/buildsystem/wave-flat-dispatch.template.mjs +658 -0
  31. package/skills/fleet/SKILL.md +113 -0
  32. package/skills/power/SKILL.md +246 -131
  33. package/state_store/__init__.py +2 -1
  34. package/state_store/api.py +19 -4
  35. package/state_store/coordination.py +209 -0
  36. package/state_store/identity.py +51 -0
  37. package/state_store/store.py +185 -73
  38. package/templates/wave-presets/data.json +65 -0
  39. package/templates/wave-presets/library.json +65 -0
  40. package/templates/wave-presets/saas.json +64 -0
  41. package/tools/audit_report.py +388 -0
  42. package/tools/bench_runner.py +100 -3
  43. package/tools/ci_merge_wait.py +256 -35
  44. package/tools/ci_workflow_lint.py +430 -0
  45. package/tools/claudemd_drift.py +394 -0
  46. package/tools/claudemd_lint.py +359 -0
  47. package/tools/common.py +39 -3
  48. package/tools/cost_ceiling.py +63 -31
  49. package/tools/cost_econ.py +480 -0
  50. package/tools/defect_escape.py +252 -0
  51. package/tools/doctor.js +1 -1
  52. package/tools/eod_sweep.py +58 -0
  53. package/tools/fleet.js +260 -0
  54. package/tools/fleet_ledger.py +209 -7
  55. package/tools/git_identity_check.py +315 -0
  56. package/tools/health-score.js +40 -0
  57. package/tools/health_score.py +361 -0
  58. package/tools/metrics_gate.py +13 -4
  59. package/tools/mutation_test.py +401 -0
  60. package/tools/portability_check.py +206 -0
  61. package/tools/reconcile.py +7 -4
  62. package/tools/secret_scan.py +137 -50
  63. package/tools/self_stats.py +20 -0
  64. package/tools/transcript_digest.py +380 -0
  65. package/tools/verify_activity_filter.py +437 -0
  66. package/tools/verify_agent_inspector.py +2 -0
  67. package/tools/verify_dash.py +2 -0
  68. package/tools/verify_dispatch_panel.py +301 -0
  69. package/tools/verify_failure_drilldown.py +188 -0
  70. package/tools/verify_prboard.py +2 -0
  71. package/tools/verify_scorecards.py +281 -0
  72. package/tools/verify_submit_encoding.py +2 -0
  73. package/tools/verify_ui_trio.py +409 -0
  74. package/tools/verify_wave_telemetry.py +268 -0
  75. package/tools/wave_backlog_analyzer.py +490 -0
  76. package/tools/wave_ledger_hook.py +150 -0
  77. package/tools/wave_preflight.py +512 -0
  78. package/tools/wave_resume.py +215 -0
  79. package/tools/wave_templates.py +215 -0
  80. package/ui/agents.py +68 -14
  81. package/ui/collectors.py +0 -55
  82. package/ui/config.py +7 -2
  83. package/ui/cost.py +231 -12
  84. package/ui/handler.py +183 -0
  85. package/ui/quality_scorecard.py +232 -0
  86. package/ui/wave_audit_tail.py +213 -0
  87. package/ui/wave_dispatch.py +280 -0
  88. package/ui/wave_failure.py +288 -0
  89. package/ui/wave_gantt.py +152 -0
  90. package/ui/wave_reasoning_tail.py +176 -0
  91. package/ui/wave_telemetry.py +377 -0
  92. package/ui/web/dist/assets/index-BGbgw2Nh.js +9 -0
  93. package/ui/web/dist/assets/index-DqZLgwNg.css +1 -0
  94. package/ui/web/dist/index.html +2 -2
  95. package/bin/CLAUDE.md +0 -76
  96. package/daemons/CLAUDE.md +0 -36
  97. package/dash/CLAUDE.md +0 -32
  98. package/docs/archive/README.md +0 -3
  99. package/docs/archive/spikes/tiered-cognition/ACTIVATION.md +0 -125
  100. package/docs/archive/spikes/tiered-cognition/DESIGN.md +0 -287
  101. package/docs/archive/spikes/tiered-cognition/FINDINGS.md +0 -113
  102. package/docs/archive/spikes/tiered-cognition/README.md +0 -27
  103. package/docs/archive/spikes/tiered-cognition/aesop-cognition.example.md +0 -32
  104. package/docs/archive/spikes/tiered-cognition/force-model-policy.merged.mjs +0 -673
  105. package/docs/archive/spikes/tiered-cognition/strip-tools-hook.mjs +0 -434
  106. package/hooks/CLAUDE.md +0 -89
  107. package/mcp/CLAUDE.md +0 -213
  108. package/monitor/CLAUDE.md +0 -40
  109. package/scan/CLAUDE.md +0 -30
  110. package/state_store/CLAUDE.md +0 -39
  111. package/tools/CLAUDE.md +0 -79
  112. package/ui/CLAUDE.md +0 -127
  113. package/ui/web/dist/assets/index-0qQYnvMC.js +0 -9
  114. package/ui/web/dist/assets/index-BdIlFieV.css +0 -1
@@ -0,0 +1 @@
1
+ .health-header{z-index:100;background:var(--color-surface);border-bottom:1px solid var(--color-border);padding:var(--space-3) var(--space-5);position:sticky;top:0}.health-header__cells{gap:var(--space-4);max-width:var(--content-max-width);flex-wrap:wrap;align-items:center;margin:0 auto;display:flex}.health-header__cell{align-items:flex-start;gap:var(--space-2);padding:var(--space-2) var(--space-3);background:var(--color-bg-subtle);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);font-size:var(--font-size-sm);cursor:pointer;transition:background-color var(--transition-fast), border-color var(--transition-fast), box-shadow var(--transition-fast);flex-direction:column;display:flex}.health-header__cell:hover{background:var(--color-bg-inset);border-color:var(--color-border)}.health-header__cell:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}.health-header__label{font-size:var(--font-size-xs);color:var(--color-text-muted);font-weight:var(--font-weight-medium);text-transform:uppercase;letter-spacing:.05em}.health-header__status{font-family:var(--font-mono);font-size:var(--font-size-sm);font-weight:var(--font-weight-bold);color:var(--color-text)}.health-header__count{font-family:var(--font-mono);font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-accent)}.health-header__badge{padding:var(--space-1) var(--space-2);background:var(--color-status-warn-bg);color:var(--color-status-warn);border-radius:var(--radius-sm);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);display:inline-block}.health-header__icon{font-size:var(--font-size-lg);line-height:1}.health-header__cell--sse{cursor:default}.health-header__cell--sse:hover{background:var(--color-bg-subtle);border-color:var(--color-border-subtle)}.health-header__cell--timestamp{cursor:default}.health-header__cell--timestamp:hover{background:var(--color-bg-subtle);border-color:var(--color-border-subtle)}.health-header__cell--stale,.health-header__cell--stale:hover{background:var(--color-status-warn-bg);border-color:var(--color-status-warn)}.health-header__cell--theme,.health-header__cell--refresh{margin-left:auto}@media (width<=768px){.health-header{padding:var(--space-2) var(--space-3)}.health-header__cells{gap:var(--space-3)}.health-header__cell{padding:var(--space-2);font-size:var(--font-size-xs)}.health-header__count{font-size:var(--font-size-md)}}.health-header__data-wrapper{gap:var(--space-2);flex-direction:column;display:flex}.health-header__warning-strip{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);background:var(--color-status-warn-bg);border:1px solid var(--color-status-warn);border-radius:var(--radius-md);color:var(--color-status-warn);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);animation:1.5s ease-in-out infinite pulse-warning;display:flex}.health-header__warning-icon{font-size:var(--font-size-sm);flex-shrink:0;display:inline-block}.health-header__warning-text{font-family:var(--font-mono);font-size:var(--font-size-xs)}@keyframes pulse-warning{0%,to{opacity:1}50%{opacity:.7}}@media (prefers-reduced-motion:reduce){.health-header__cell{transition:none}.health-header__warning-strip{animation:none}}.agent-row{border-bottom:1px solid var(--color-border-subtle);padding:var(--space-3) 0;list-style:none}.agent-row:last-child{border-bottom:none}.agent-row__inspect{padding:var(--space-1) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-sm);color:var(--color-text);cursor:pointer;font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);white-space:nowrap;background:0 0;margin-left:auto}.agent-row__inspect:hover{background:var(--color-bg-subtle)}.agent-row__inspect:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}.agent-row__toggle{width:var(--space-5);height:var(--space-5);margin-right:var(--space-2);cursor:pointer;color:var(--color-text-muted);transition:color var(--transition-fast);background:0 0;border:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.agent-row__toggle:hover{color:var(--color-accent)}.agent-row__toggle:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px;border-radius:var(--radius-sm)}.agent-row__toggle-icon{font-size:var(--font-size-xs);line-height:1;display:inline-block}.agent-row__header{align-items:center;gap:var(--space-3);font-size:var(--font-size-sm);line-height:var(--line-height-normal);display:flex}.agent-row__status-icon{font-size:var(--font-size-lg);flex-shrink:0;display:inline-block}.agent-row__id{font-family:var(--font-mono);font-weight:var(--font-weight-bold);color:var(--color-accent);flex-shrink:0;min-width:100px}.agent-row__age{font-family:var(--font-mono);font-size:var(--font-size-xs);color:var(--color-text-muted);flex-shrink:0;min-width:50px}.agent-row__hint{color:var(--color-text);word-break:break-word;flex-grow:1}.agent-row__detail{margin-top:var(--space-3);margin-left:calc(var(--space-5) + var(--space-2));padding:var(--space-3);background:var(--color-bg-subtle);border-left:2px solid var(--color-accent);border-radius:var(--radius-md);animation:.15s expand-in}@keyframes expand-in{0%{opacity:0;max-height:0}to{opacity:1;max-height:100vh}}@media (prefers-reduced-motion:reduce){.agent-row__detail{animation:none}}.agent-row__detail-row{gap:var(--space-3);margin-bottom:var(--space-2);font-size:var(--font-size-sm);line-height:var(--line-height-normal);grid-template-columns:120px 1fr;align-items:baseline;display:grid}.agent-row__detail-label{font-weight:var(--font-weight-bold);color:var(--color-text-muted);text-align:right}.agent-row__detail-value{color:var(--color-text);font-family:var(--font-mono);word-break:break-word}.agent-row__prompt{margin-top:var(--space-4);padding-top:var(--space-3);border-top:1px solid var(--color-border-subtle)}.agent-row__prompt-label{margin-bottom:var(--space-2);font-weight:var(--font-weight-bold);color:var(--color-text-muted);font-size:var(--font-size-xs);text-transform:uppercase;letter-spacing:.05em;display:block}.agent-row__prompt-text{background:var(--color-bg-inset);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);font-size:var(--font-size-xs);line-height:var(--line-height-normal);color:var(--color-text);font-family:var(--font-mono);white-space:pre-wrap;word-break:break-word;max-height:300px;margin:0;overflow-y:auto}.agent-row__prompt-loading,.agent-row__prompt-error{background:var(--color-bg-inset);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);font-family:var(--font-mono);font-size:var(--font-size-sm)}.agent-row__prompt-loading{color:var(--color-text-muted)}.agent-row__prompt-error{color:var(--color-status-error)}@media (width<=768px){.agent-row__detail-row{gap:var(--space-2);grid-template-columns:1fr}.agent-row__detail-label{text-align:left;font-weight:var(--font-weight-bold)}}.agent-inspector-backdrop{z-index:1000;background:#00000073;justify-content:flex-end;display:flex;position:fixed;inset:0}.agent-inspector{background:var(--color-surface);border-left:1px solid var(--color-border);width:min(560px,100%);max-width:100%;height:100%;box-shadow:var(--shadow-md);padding:var(--space-5);gap:var(--space-4);flex-direction:column;display:flex;overflow-y:auto}.agent-inspector__head{justify-content:space-between;align-items:center;gap:var(--space-3);display:flex}.agent-inspector__title{font-size:var(--font-size-xl);color:var(--color-text);margin:0}.agent-inspector__close{border:1px solid var(--color-border);border-radius:var(--radius-sm);width:2rem;height:2rem;color:var(--color-text);cursor:pointer;font-size:var(--font-size-md);background:0 0;justify-content:center;align-items:center;padding:0;line-height:1;display:inline-flex}.agent-inspector__close:hover{background:var(--color-bg-subtle)}.agent-inspector__close:focus-visible,.agent-inspector__transcript a:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}.agent-inspector__meta{gap:var(--space-2);margin:0;display:grid}.agent-inspector__meta-row{gap:var(--space-3);font-size:var(--font-size-sm);grid-template-columns:8rem 1fr;align-items:baseline;display:grid}.agent-inspector__meta-row dt{color:var(--color-text-muted);font-weight:var(--font-weight-medium);margin:0}.agent-inspector__meta-row dd{color:var(--color-text);word-break:break-word;margin:0}.agent-inspector__mono{font-family:var(--font-mono);font-size:var(--font-size-xs)}.agent-inspector__status{align-items:center;gap:var(--space-1);font-weight:var(--font-weight-medium);display:inline-flex}.agent-inspector__status-icon{font-size:.9em}.agent-inspector__section h3{margin:0 0 var(--space-2);font-size:var(--font-size-md);color:var(--color-text)}.agent-inspector__truncated{color:var(--color-text-muted);font-size:var(--font-size-xs);font-weight:400}.agent-inspector__prompt{padding:var(--space-3);background:var(--color-bg-inset);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);color:var(--color-text);font-family:var(--font-mono);font-size:var(--font-size-xs);line-height:var(--line-height-normal);white-space:pre-wrap;word-break:break-word;max-height:12rem;margin:0;overflow-y:auto}.agent-inspector__callout{padding:var(--space-3);border-left:4px solid var(--color-accent);border-radius:var(--radius-md);background:var(--color-bg-subtle);color:var(--color-text);font-size:var(--font-size-sm)}.agent-inspector__callout--error{border-left-color:var(--color-status-error);background:var(--color-status-error-bg)}.agent-inspector__transcript{gap:var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface);padding:0;padding:var(--space-3);flex-direction:column;max-height:24rem;margin:0;list-style:none;display:flex;overflow-y:auto}.agent-inspector__tail-entry{gap:var(--space-3);padding-bottom:var(--space-2);border-bottom:1px solid var(--color-border-subtle);grid-template-columns:6rem 1fr;align-items:start;display:grid}.agent-inspector__tail-entry:last-child{border-bottom:none;padding-bottom:0}.agent-inspector__tail-type{font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);text-transform:uppercase;letter-spacing:.03em;color:var(--color-text-muted);white-space:nowrap}.agent-inspector__tail-type--user{color:var(--color-accent)}.agent-inspector__tail-type--assistant{color:var(--color-text)}.agent-inspector__tail-text{font-family:var(--font-mono);font-size:var(--font-size-xs);line-height:var(--line-height-normal);color:var(--color-text);white-space:pre-wrap;word-break:break-word;margin:0}@media (width<=768px){.agent-inspector{width:100%;padding:var(--space-4)}.agent-inspector__meta-row,.agent-inspector__tail-entry{gap:var(--space-1);grid-template-columns:1fr}}.agents-panel{min-width:0;padding:var(--space-5);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);flex:1}.agents-panel h2{margin:0 0 var(--space-4) 0;font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-text)}.agents-panel__summaries{gap:var(--space-3);margin-bottom:var(--space-4);padding:var(--space-3);background:var(--color-bg-subtle);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);grid-template-columns:repeat(auto-fill,minmax(200px,1fr));display:grid}.agent-summary{align-items:center;gap:var(--space-2);padding:var(--space-2);background:var(--color-surface);border:1px solid var(--color-border-subtle);border-radius:var(--radius-sm);font-size:var(--font-size-sm);display:flex}.agent-summary__project{font-weight:var(--font-weight-medium);color:var(--color-text);flex:none;min-width:fit-content}.agent-summary__status{padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);text-transform:uppercase;white-space:nowrap;flex:none}.agent-summary__status--running{background:var(--color-status-ok-bg);color:var(--color-status-ok)}.agent-summary__status--idle{background:var(--color-status-info-bg);color:var(--color-status-info)}.agent-summary__status--SUSPICIOUS,.agent-summary__status--HIGH{background:var(--color-status-error-bg);color:var(--color-status-error)}.agent-summary__status--MED,.agent-summary__status--DRIFT{background:var(--color-status-warn-bg);color:var(--color-status-warn)}.agent-summary__runtime{text-align:right;font-family:var(--font-mono);color:var(--color-text-muted);flex:1;min-width:fit-content}.agents-panel__list{margin:0;margin-top:var(--space-4);padding:0;list-style:none}@media (width<=768px){.agents-panel{padding:var(--space-3)}.agents-panel h2{font-size:var(--font-size-md)}}.alerts-panel{min-width:0;padding:var(--space-5);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);flex:1}.alerts-panel h2{margin:0 0 var(--space-4) 0;font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-text)}.alerts-panel__list{gap:var(--space-3);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.alerts-panel__item{gap:var(--space-3);padding:var(--space-3);background:var(--color-bg-subtle);border-left:4px solid var(--color-border);border-radius:var(--radius-md);font-size:var(--font-size-sm);line-height:var(--line-height-normal);word-break:break-word;align-items:flex-start;display:flex}.alerts-panel__item[data-severity=error]{background:var(--color-status-error-bg)}.alerts-panel__item[data-severity=warn]{background:var(--color-status-warn-bg)}.alerts-panel__item[data-severity=info]{background:var(--color-status-info-bg)}.alerts-panel__severity{min-width:60px;padding:var(--space-1) var(--space-2);font-weight:var(--font-weight-bold);font-size:var(--font-size-xs);text-transform:uppercase;letter-spacing:.05em;border-radius:var(--radius-sm);background:#0000000d;border:1.5px solid;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}@media (prefers-color-scheme:dark){.alerts-panel__severity{background:#ffffff1a}}.alerts-panel__text{color:var(--color-text);font-family:var(--font-mono);font-size:var(--font-size-xs);flex-grow:1}@media (width<=768px){.alerts-panel{padding:var(--space-3)}.alerts-panel h2{font-size:var(--font-size-md)}.alerts-panel__item{padding:var(--space-2);gap:var(--space-2)}}.events-feed{min-width:0;padding:var(--space-5);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);flex:1}.events-feed h2{margin:0 0 var(--space-4) 0;font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-text)}.events-feed__list{gap:var(--space-2);background:linear-gradient(to bottom, var(--color-surface) 0%, var(--color-surface) 85%, #0000000d 100%);flex-direction:column;max-height:300px;margin:0;padding:0;list-style:none;display:flex;position:relative;overflow-y:auto}.events-feed__item{padding:var(--space-2) var(--space-3);background:var(--color-bg-inset);border:1px solid var(--color-border-subtle);border-radius:var(--radius-sm);font-size:var(--font-size-xs);line-height:var(--line-height-normal);color:var(--color-text-muted)}.events-feed__item code{font-family:var(--font-mono);color:var(--color-text);word-break:break-word}.empty-state{padding:var(--space-2) var(--space-3);text-align:center;color:var(--color-text-muted);font-size:var(--font-size-sm);background:var(--color-bg-inset);border-radius:var(--radius-sm);width:fit-content;margin:0 auto;display:inline-block}@media (width<=768px){.events-feed{padding:var(--space-3)}.events-feed h2{font-size:var(--font-size-md)}.events-feed__list{max-height:200px}.events-feed__item{padding:var(--space-2);font-size:var(--font-size-xs)}}.repos-panel{min-width:0;padding:var(--space-5);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);flex:1}.repos-panel h2{margin:0 0 var(--space-4) 0;font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-text)}.repos-panel__list{gap:var(--space-3);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.repos-panel__item{justify-content:space-between;align-items:center;gap:var(--space-3);padding:var(--space-3);background:var(--color-bg-subtle);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);font-size:var(--font-size-sm);display:flex}.repos-panel__item[data-severity=ok]{background:var(--color-status-ok-bg);border-color:var(--color-status-ok)}.repos-panel__item[data-severity=warn]{background:var(--color-status-warn-bg);border-color:var(--color-status-warn)}.repos-panel__item[data-severity=error]{background:var(--color-status-error-bg);border-color:var(--color-status-error)}.repos-panel__name{font-weight:var(--font-weight-bold);color:var(--color-text);font-family:var(--font-mono)}.repos-panel__state{font-family:var(--font-mono);font-size:var(--font-size-xs);text-align:right}.empty-state{padding:var(--space-4);text-align:center;color:var(--color-text-muted);font-size:var(--font-size-sm)}@media (width<=768px){.repos-panel{padding:var(--space-3)}.repos-panel h2{font-size:var(--font-size-md)}.repos-panel__item{padding:var(--space-2);flex-direction:column;align-items:flex-start}.repos-panel__state{text-align:left}}.inbox-form{padding:var(--space-5);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md)}.inbox-form h2{margin:0 0 var(--space-4) 0;font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-text)}.inbox-form__form{gap:var(--space-3);flex-direction:column;display:flex}.inbox-form__group{gap:var(--space-2);align-items:stretch;display:flex}.inbox-form__input{min-width:0;padding:var(--space-3) var(--space-4);background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-md);font-size:var(--font-size-sm);font-family:var(--font-sans);color:var(--color-text);line-height:var(--line-height-normal);transition:border-color var(--transition-fast), box-shadow var(--transition-fast);flex:1}.inbox-form__input:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px;border-color:var(--color-accent)}.inbox-form__input::placeholder{color:var(--color-text-muted)}.inbox-form__input:disabled{opacity:.6;cursor:not-allowed}.inbox-form__submit{padding:var(--space-3) var(--space-5);background:var(--color-accent);color:var(--color-text-inverse);border-radius:var(--radius-md);font-size:var(--font-size-sm);font-weight:var(--font-weight-bold);cursor:pointer;transition:background-color var(--transition-fast);border:none}.inbox-form__submit:hover:not(:disabled){background:var(--color-accent-emphasis)}.inbox-form__submit:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}.inbox-form__submit:disabled{opacity:.5;cursor:not-allowed}.inbox-form__error{padding:var(--space-3);background:var(--color-status-error-bg);color:var(--color-status-error);border-left:4px solid var(--color-status-error);border-radius:var(--radius-md);font-size:var(--font-size-sm)}.inbox-form__success{padding:var(--space-3);background:var(--color-status-ok-bg);color:var(--color-status-ok);border-left:4px solid var(--color-status-ok);border-radius:var(--radius-md);font-size:var(--font-size-sm)}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}@media (width<=768px){.inbox-form{padding:var(--space-3)}.inbox-form h2{font-size:var(--font-size-md)}.inbox-form__group{flex-direction:column}.inbox-form__submit{width:100%}}@media (prefers-reduced-motion:reduce){.inbox-form__input,.inbox-form__submit{transition:none}}.wave-telemetry-progress{border:1px solid var(--color-border-secondary);background:var(--color-surface-secondary);border-radius:8px;padding:1.5rem}.wave-progress-header{justify-content:space-between;align-items:center;margin-bottom:1.5rem;display:flex}.wave-progress-header h3{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary);margin:0;font-size:.875rem;font-weight:500}.wave-progress-badge{background:var(--color-accent-secondary);color:var(--color-text-on-accent);text-transform:uppercase;border-radius:4px;padding:.25rem .75rem;font-size:.875rem;font-weight:600}.wave-progress-content{flex-direction:column;gap:1rem;display:flex}.wave-progress-phase,.wave-progress-blocker{flex-direction:column;gap:.25rem;display:flex}.phase-label,.blocker-label{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary);font-size:.75rem;font-weight:600}.phase-value,.blocker-value{color:var(--color-text-primary);word-break:break-word;font-size:1rem;font-weight:500}.wave-progress-error{color:var(--color-severity-error);margin:0;font-size:.875rem}@media (prefers-color-scheme:dark){.wave-telemetry-progress{--color-surface-secondary:#1a1a1a;--color-border-secondary:#333;--color-text-secondary:#999;--color-text-primary:#fff;--color-accent-secondary:#444;--color-text-on-accent:#ccc;--color-severity-error:#ff6b6b}}@media (prefers-color-scheme:light){.wave-telemetry-progress{--color-surface-secondary:#f5f5f5;--color-border-secondary:#d0d0d0;--color-text-secondary:#666;--color-text-primary:#000;--color-accent-secondary:#e0e0e0;--color-text-on-accent:#333;--color-severity-error:#d32f2f}}.overview{gap:var(--space-4);padding:var(--space-6);max-width:var(--content-max-width);flex-direction:column;width:100%;margin:0 auto;display:flex}.overview__section{gap:var(--space-5);display:flex}.overview__section--full{width:100%}.overview__section--row{gap:var(--space-5);grid-template-columns:repeat(3,1fr);display:grid}@media (width<=1200px){.overview__section--row{grid-template-columns:repeat(2,1fr)}}@media (width<=768px){.overview{gap:var(--space-4);padding:var(--space-4)}.overview__section{gap:var(--space-3)}.overview__section--row{grid-template-columns:1fr}}@media (prefers-reduced-motion:reduce){.overview{scroll-behavior:auto}}.wave-telemetry-cost{border:1px solid var(--color-border-secondary);background:var(--color-surface-secondary);border-radius:8px;padding:1.5rem}.cost-header{margin-bottom:1.5rem}.cost-header h3{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary);margin:0;font-size:.875rem;font-weight:500}.cost-grid{grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:1rem;display:grid}.cost-tile{background:var(--color-surface-primary);border:1px solid var(--color-border-primary);border-radius:6px;flex-direction:column;gap:.5rem;padding:1rem;display:flex}.cost-tile--tokens{--tile-accent:var(--color-blue-500)}.cost-tile--model{--tile-accent:var(--color-green-500)}.cost-tile--okrate{--tile-accent:var(--color-amber-500)}.cost-tile--burnrate{--tile-accent:var(--color-purple-500)}.cost-tile--projection{--tile-accent:var(--color-cyan-500)}.tile-label{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary);font-size:.75rem;font-weight:600}.tile-value{color:var(--tile-accent,var(--color-text-primary));font-size:1.25rem;font-weight:700;line-height:1}.tile-unit{color:var(--color-text-secondary);font-size:.75rem}.cost-content{justify-content:center;align-items:center;min-height:100px;display:flex}.cost-content p{color:var(--color-text-secondary);margin:0;font-size:.875rem}.cost-error{color:var(--color-severity-error)!important}.wave-telemetry-cost--alert{border-color:var(--color-severity-error);background:var(--color-surface-alert)}.cost-alert-badge{background:var(--color-severity-error);color:#fff;text-transform:uppercase;letter-spacing:.05em;border-radius:4px;padding:.25rem .75rem;font-size:.75rem;font-weight:600}.cost-ceiling-warning{border-left:3px solid var(--color-severity-error);color:var(--color-severity-error);background:#ff6b6b1a;border-radius:4px;margin-bottom:1rem;padding:.75rem;font-size:.875rem;font-weight:500}@media (prefers-color-scheme:dark){.wave-telemetry-cost{--color-surface-secondary:#1a1a1a;--color-surface-primary:#0a0a0a;--color-surface-alert:#2a1515;--color-border-secondary:#333;--color-border-primary:#222;--color-text-secondary:#999;--color-text-primary:#fff;--color-blue-500:#4a9eff;--color-green-500:#4caf50;--color-amber-500:#ffa726;--color-purple-500:#b47ff0;--color-cyan-500:#4dd9ff;--color-severity-error:#ff6b6b}}@media (prefers-color-scheme:light){.wave-telemetry-cost{--color-surface-secondary:#f5f5f5;--color-surface-primary:#fff;--color-surface-alert:#fff3f0;--color-border-secondary:#d0d0d0;--color-border-primary:#e0e0e0;--color-text-secondary:#666;--color-text-primary:#000;--color-blue-500:#1976d2;--color-green-500:#388e3c;--color-amber-500:#f57c00;--color-purple-500:#7b1fa2;--color-cyan-500:#0097a7;--color-severity-error:#d32f2f}}.quality-scorecards{padding:var(--space-4);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface);gap:var(--space-5);flex-direction:column;display:flex}.quality-scorecards--loading,.quality-scorecards--empty{color:var(--color-text-muted);text-align:center;padding:var(--space-5);justify-content:center;align-items:center;min-height:200px;display:flex}.quality-section{gap:var(--space-3);flex-direction:column;display:flex}.quality-section h4{font-size:var(--font-size-md);font-weight:var(--font-weight-medium);color:var(--color-text);margin:0}.quality-table{border-collapse:collapse;width:100%;font-size:var(--font-size-sm);background:var(--color-bg-subtle);border:1px solid var(--color-border-subtle);border-radius:var(--radius-sm);overflow:hidden}.quality-table thead{background:var(--color-bg-muted)}.quality-table th{padding:var(--space-2) var(--space-3);text-align:left;font-weight:var(--font-weight-medium);color:var(--color-text-muted);border-bottom:1px solid var(--color-border-subtle)}.quality-table tbody tr{border-bottom:1px solid var(--color-border-subtle);transition:background-color .15s ease-out}.quality-table tbody tr:hover{background:var(--color-bg-hover)}.quality-table td{padding:var(--space-2) var(--space-3)}.cell-specialty{font-weight:var(--font-weight-medium)}.cell-numeric{text-align:center}.cell-metric{align-items:center;gap:var(--space-2);display:flex}.metric{font-weight:var(--font-weight-bold);font-size:var(--font-size-md)}.metric-detail{font-size:var(--font-size-xs);color:var(--color-text-muted)}.quality-row--ok .cell-specialty,.quality-row--ok .metric{color:var(--color-status-ok)}.quality-row--warn .cell-specialty,.quality-row--warn .metric{color:var(--color-status-warn)}.quality-row--error .cell-specialty,.quality-row--error .metric{color:var(--color-status-error)}.quality-ranking{gap:var(--space-2);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.ranking-item{gap:var(--space-3);padding:var(--space-2) var(--space-3);border:1px solid var(--color-border-subtle);border-radius:var(--radius-sm);background:var(--color-bg-subtle);font-size:var(--font-size-sm);grid-template-columns:2rem 1fr auto;align-items:center;display:grid}.ranking-place{font-weight:var(--font-weight-bold);color:var(--color-text-muted);text-align:center}.ranking-specialty{font-weight:var(--font-weight-medium);color:var(--color-text)}.ranking-metric{font-weight:var(--font-weight-medium);color:var(--color-text);text-align:right}.quality-footer{border-top:1px solid var(--color-border-subtle);padding-top:var(--space-3)}.quality-footer small{color:var(--color-text-muted);font-size:var(--font-size-xs)}@media (width<=768px){.quality-table{font-size:var(--font-size-xs)}.quality-table th,.quality-table td{padding:var(--space-2)}.ranking-item{gap:var(--space-2);padding:var(--space-2);grid-template-columns:1.5rem 1fr auto}}.work-view{padding:var(--space-4)}.work-container{gap:var(--space-6);max-width:var(--content-max-width);grid-template-columns:1fr 300px;margin:0 auto;display:grid}@media (width<=1200px){.work-container{grid-template-columns:1fr}.work-sidebar{order:2}}.board-header{margin-bottom:var(--space-4);justify-content:space-between;align-items:center;display:flex}.board-header h2{font-size:var(--font-size-lg);font-weight:var(--font-weight-bold)}.add-item-button{padding:var(--space-2) var(--space-3);background:var(--color-accent);color:var(--color-text-inverse);border-radius:var(--radius-sm);font-weight:var(--font-weight-medium);cursor:pointer;transition:background-color var(--transition-normal);border:none}.add-item-button:hover{background:var(--color-accent-emphasis)}.add-item-button:disabled{opacity:.5;cursor:not-allowed}.form-container{background:var(--color-bg-subtle);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-4);margin-bottom:var(--space-4)}.tracker-form{gap:var(--space-3);flex-direction:column;display:flex}.form-group{gap:var(--space-1);flex-direction:column;display:flex}.form-group label{font-weight:var(--font-weight-medium);font-size:var(--font-size-sm);color:var(--color-text)}.form-group input,.form-group select,.form-group textarea{padding:var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-surface);color:var(--color-text);font-size:var(--font-size-sm)}.form-group input:focus,.form-group select:focus,.form-group textarea:focus{border-color:var(--color-accent)}.form-group input:disabled,.form-group select:disabled,.form-group textarea:disabled{opacity:.6;cursor:not-allowed}.tracker-form button{padding:var(--space-2) var(--space-3);background:var(--color-accent);color:var(--color-text-inverse);border-radius:var(--radius-sm);font-weight:var(--font-weight-medium);cursor:pointer;transition:background-color var(--transition-normal);border:none}.tracker-form button:hover:not(:disabled){background:var(--color-accent-emphasis)}.tracker-form button:disabled{opacity:.5;cursor:not-allowed}.form-error{padding:var(--space-2) var(--space-3);background:var(--color-status-error-bg);color:var(--color-status-error);border-radius:var(--radius-sm);border-left:3px solid var(--color-status-error)}.form-success{padding:var(--space-2) var(--space-3);background:var(--color-status-ok-bg);color:var(--color-status-ok);border-radius:var(--radius-sm);border-left:3px solid var(--color-status-ok)}.tracker-board{gap:var(--space-4);flex-direction:column;display:flex}.lanes-container{gap:var(--space-3);grid-template-columns:repeat(4,1fr);display:grid}@media (width<=1600px){.lanes-container{grid-template-columns:repeat(2,1fr)}}@media (width<=768px){.lanes-container{grid-template-columns:1fr}}.tracker-lane{background:var(--color-bg-subtle);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);min-height:300px}.lane-header{margin-bottom:var(--space-3);font-size:var(--font-size-md);font-weight:var(--font-weight-bold);justify-content:space-between;align-items:center;display:flex}.lane-count{padding:var(--space-1) var(--space-2);background:var(--color-accent);color:var(--color-text-inverse);border-radius:var(--radius-sm);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);display:inline-block}.lane-badge{padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);white-space:nowrap;display:inline-block}.lane-badge--active{background:var(--color-accent);color:var(--color-text-inverse)}.lane-badge--empty{background:var(--color-bg-inset);color:var(--color-text-muted)}.lane-content{gap:var(--space-2);flex-direction:column;max-height:600px;display:flex;overflow-y:auto}.lane-empty{text-align:center;color:var(--color-text-muted);padding:var(--space-4);font-style:italic}.tracker-card{background:var(--color-surface);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);padding:var(--space-3);box-shadow:var(--shadow-sm);transition:box-shadow var(--transition-normal)}.tracker-card:hover{box-shadow:var(--shadow-md)}.tracker-card-header{justify-content:space-between;align-items:flex-start;gap:var(--space-2);margin-bottom:var(--space-2);display:flex}.tracker-card-title-row{align-items:flex-start;gap:var(--space-2);flex:1;display:flex}.priority-chip{padding:var(--space-1) var(--space-2);color:var(--color-text-inverse);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);border-radius:var(--radius-sm);white-space:nowrap;flex-shrink:0;display:inline-block}.tracker-card-title{font-size:var(--font-size-md);font-weight:var(--font-weight-medium);line-height:var(--line-height-tight);margin:0}.expand-button{padding:var(--space-1);cursor:pointer;color:var(--color-text-muted);font-size:var(--font-size-sm);background:0 0;border:none}.expand-button:hover{color:var(--color-text)}.tracker-card-tags{gap:var(--space-1);margin-bottom:var(--space-2);flex-wrap:wrap;display:flex}.tag{padding:var(--space-1) var(--space-2);background:var(--color-bg-inset);border:1px solid var(--color-border);border-radius:var(--radius-sm);font-size:var(--font-size-xs);color:var(--color-text-muted);display:inline-block}.tracker-card-details{background:var(--color-bg-inset);border-top:1px solid var(--color-border);margin:var(--space-2) 0;padding:var(--space-2) 0}.detail-section{padding:var(--space-2) 0;border-bottom:1px solid var(--color-border-subtle)}.detail-section:last-child{border-bottom:none}.detail-label{font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);color:var(--color-text-muted);text-transform:uppercase;margin-bottom:var(--space-1);display:block}.detail-section p,.detail-section time,.detail-section a,.detail-section code{font-size:var(--font-size-sm);color:var(--color-text)}.detail-section a{word-break:break-all}.pr-link-inert{padding:var(--space-1) var(--space-2);background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:var(--font-size-xs);color:var(--color-status-error);word-break:break-all;white-space:pre-wrap;display:block}.tracker-card-actions{gap:var(--space-1);margin-top:var(--space-2);display:flex}.tracker-card-actions button{padding:var(--space-1) var(--space-2);background:var(--color-accent);color:var(--color-text-inverse);border-radius:var(--radius-sm);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);cursor:pointer;transition:background-color var(--transition-normal);border:none;flex:1}.tracker-card-actions button:hover:not(:disabled){background:var(--color-accent-emphasis)}.tracker-card-actions button:disabled{opacity:.5;cursor:not-allowed}.card-error{padding:var(--space-2);background:var(--color-status-error-bg);color:var(--color-status-error);border-radius:var(--radius-sm);border-left:3px solid var(--color-status-error);margin-top:var(--space-2);font-size:var(--font-size-sm)}.archived-summary{background:var(--color-bg-subtle);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);margin-top:var(--space-4)}.archived-summary h3{font-size:var(--font-size-md);font-weight:var(--font-weight-bold);margin-bottom:var(--space-2)}.archived-list{gap:var(--space-1);flex-direction:column;max-height:200px;list-style:none;display:flex;overflow-y:auto}.archived-item{gap:var(--space-2);padding:var(--space-2);background:var(--color-surface);border-radius:var(--radius-sm);font-size:var(--font-size-sm);align-items:center;display:flex}.archived-title{color:var(--color-text-muted);flex:1;text-decoration:line-through}.archived-priority{padding:var(--space-1) var(--space-2);background:var(--color-bg-inset);border-radius:var(--radius-sm);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);color:var(--color-text-muted)}.backlog-panel{background:var(--color-bg-subtle);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);top:calc(var(--header-height) + var(--space-3));position:sticky}.backlog-panel h3{font-size:var(--font-size-md);font-weight:var(--font-weight-bold);margin-bottom:var(--space-3)}.empty-state{color:var(--color-text-muted);text-align:center;padding:var(--space-3);font-style:italic}.backlog-tier{margin-bottom:var(--space-3)}.tier-header{margin-bottom:var(--space-2);justify-content:space-between;align-items:center;display:flex}.tier-header h4{font-size:var(--font-size-sm);font-weight:var(--font-weight-bold);margin:0}.tier-counts{font-size:var(--font-size-xs);color:var(--color-text-muted)}.tier-progress-bar{background:var(--color-bg-inset);border-radius:var(--radius-sm);height:6px;margin-bottom:var(--space-2);display:flex;overflow:hidden}.progress-segment{height:100%;transition:width var(--transition-normal);flex:none}.progress-segment.done{background:var(--color-status-ok)}.progress-segment.inflight{background:var(--color-status-warn)}.progress-segment.todo{background:var(--color-status-neutral)}.tier-items-list{gap:var(--space-1);flex-direction:column;max-height:250px;display:flex;position:relative;overflow-y:auto}.tier-items-list:after{background:linear-gradient(to bottom, transparent, var(--color-bg-subtle));pointer-events:none;height:20px;position:absolute;bottom:0;left:0;right:0}.backlog-item{gap:var(--space-2);padding:var(--space-1) var(--space-2);font-size:var(--font-size-xs);background:var(--color-surface);border-radius:var(--radius-sm);word-break:break-word;align-items:flex-start;display:flex}.item-status{font-size:var(--font-size-sm);flex-shrink:0}.item-tag{font-weight:var(--font-weight-bold);color:var(--color-accent);flex-shrink:0;min-width:fit-content}.item-title{color:var(--color-text);flex:1}._container_1pt1h_5{border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg-subtle);padding:var(--space-4)}._title_1pt1h_12{margin:0 0 var(--space-4) 0;font-size:var(--font-size-md);font-weight:var(--font-weight-medium);color:var(--color-text)}._timelineContent_1pt1h_19{gap:var(--space-4);flex-direction:column;display:flex}._row_1pt1h_25{gap:var(--space-3);grid-template-columns:160px 1fr 80px;align-items:center;display:grid}._rowLabel_1pt1h_32{gap:var(--space-1);font-size:var(--font-size-sm);flex-direction:column;display:flex;overflow:hidden}._agentId_1pt1h_40{font-family:var(--font-mono);font-weight:var(--font-weight-bold);color:var(--color-text);word-break:break-all}._agentStatus_1pt1h_47{font-size:var(--font-size-xs);color:var(--color-text-muted);text-transform:uppercase}._barContainer_1pt1h_53{background:var(--color-bg);border:1px solid var(--color-border-subtle);border-radius:var(--radius-sm);height:24px;position:relative;overflow:visible}._bar_1pt1h_53{border-radius:var(--radius-sm);height:100%;transition:width var(--transition-normal);min-width:5%;max-width:100%;padding-right:var(--space-2);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);color:var(--color-text-inverse);white-space:nowrap;justify-content:flex-end;align-items:center;display:flex;overflow:hidden}._status-ok_1pt1h_80{background:var(--color-status-ok)}._status-info_1pt1h_84{background:var(--color-status-info)}._status-warn_1pt1h_88{background:var(--color-status-warn)}._status-error_1pt1h_92{background:var(--color-status-error)}._status-neutral_1pt1h_96{background:var(--color-status-neutral)}._rowDuration_1pt1h_100{text-align:right;font-size:var(--font-size-sm);font-family:var(--font-mono);color:var(--color-text-muted);min-width:60px}._footer_1pt1h_108{margin-top:var(--space-4);padding-top:var(--space-4);border-top:1px solid var(--color-border-subtle);font-size:var(--font-size-xs);color:var(--color-text-muted)}._legend_1pt1h_116{line-height:var(--line-height-normal);display:inline-block}@media (width<=768px){._row_1pt1h_25{gap:var(--space-2);grid-template-columns:1fr}._rowLabel_1pt1h_32{gap:var(--space-2);flex-direction:row;align-items:baseline;display:flex}._barContainer_1pt1h_53{order:3;grid-column:1}._rowDuration_1pt1h_100{text-align:left;order:2}}@media (prefers-reduced-motion:reduce){._bar_1pt1h_53{transition:none}}._scaleLabels_1pt1h_154{pointer-events:none;height:18px;display:flex;position:absolute;top:-20px;left:0;right:0}._scaleTick_1pt1h_164{flex-direction:column;align-items:center;height:100%;display:flex;position:absolute}._scaleLabel_1pt1h_154{font-size:var(--font-size-xs);color:var(--color-text-muted);font-weight:var(--font-weight-normal);white-space:nowrap;text-transform:lowercase}._barLabel_1pt1h_181{font-size:var(--font-size-xs);color:var(--color-text-inverse);font-weight:var(--font-weight-bold);white-space:nowrap;margin-left:var(--space-1)}._container_jryat_5{border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg-subtle);flex-direction:column;height:100%;display:flex;overflow:hidden}._header_jryat_15{padding:var(--space-4);border-bottom:1px solid var(--color-border-subtle);background:var(--color-bg);justify-content:space-between;align-items:center;display:flex}._title_jryat_24{font-size:var(--font-size-md);font-weight:var(--font-weight-medium);color:var(--color-text);margin:0}._toggleButton_jryat_31{padding:var(--space-2) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-bg);color:var(--color-text-muted);font-size:var(--font-size-sm);cursor:pointer;transition:all var(--transition-fast)}._toggleButton_jryat_31:hover{background:var(--color-bg-inset);color:var(--color-text)}._toggleButton_jryat_31:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}._toggleButton_jryat_31[aria-pressed=true]{background:var(--color-status-ok-bg);color:var(--color-status-ok);border-color:var(--color-status-ok)}._messagesBox_jryat_58{padding:var(--space-4);gap:var(--space-3);scroll-behavior:smooth;flex-direction:column;flex:1;display:flex;overflow-y:auto}._emptyState_jryat_68{color:var(--color-text-muted);font-size:var(--font-size-sm);text-align:center;padding:var(--space-8) var(--space-4)}._message_jryat_58{padding:var(--space-3) var(--space-4);border-left:3px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-bg);font-size:var(--font-size-sm)}._role-user_jryat_84{border-left-color:var(--color-status-info);background:#0969da0a}._role-assistant_jryat_89{border-left-color:var(--color-status-ok);background:#1a7f370a}._role_jryat_84{font-weight:var(--font-weight-bold);text-transform:uppercase;font-size:var(--font-size-xs);margin-right:var(--space-2);display:inline-block}._role-user_jryat_84 ._role_jryat_84{color:var(--color-status-info)}._role-assistant_jryat_89 ._role_jryat_84{color:var(--color-status-ok)}._timestamp_jryat_110{color:var(--color-text-muted);font-size:var(--font-size-xs);font-family:var(--font-mono);margin-left:var(--space-2);display:inline-block}._text_jryat_118{margin-top:var(--space-2);color:var(--color-text);line-height:var(--line-height-normal);word-wrap:break-word;white-space:pre-wrap}._footer_jryat_126{padding:var(--space-2) var(--space-4);border-top:1px solid var(--color-border-subtle);background:var(--color-bg);text-align:right;font-size:var(--font-size-xs)}._footerTimestamp_jryat_134{color:var(--color-text-muted);font-family:var(--font-mono)}@media (prefers-reduced-motion:reduce){._messagesBox_jryat_58{scroll-behavior:auto}}._container_jdser_6{border:1px solid var(--color-border,#e0e0e0);background-color:var(--color-surface,#f9f9f9);border-radius:8px;margin:12px 0;padding:12px}@media (prefers-color-scheme:dark){._container_jdser_6{border-color:var(--color-border,#444);background-color:var(--color-surface,#1a1a1a)}}._header_jdser_21{border-bottom:1px solid var(--color-border,#e0e0e0);align-items:center;gap:12px;margin-bottom:12px;padding-bottom:8px;display:flex}@media (prefers-color-scheme:dark){._header_jdser_21{border-color:var(--color-border,#444)}}._title_jdser_36{color:var(--color-text,#333);margin:0;font-size:14px;font-weight:600}@media (prefers-color-scheme:dark){._title_jdser_36{color:var(--color-text,#ccc)}}._phase_jdser_49{color:var(--color-text-secondary,#666);font-size:12px;font-weight:500}@media (prefers-color-scheme:dark){._phase_jdser_49{color:var(--color-text-secondary,#999)}}._timestamp_jdser_61{color:var(--color-text-secondary,#999);margin-left:auto;font-size:11px}@media (prefers-color-scheme:dark){._timestamp_jdser_61{color:var(--color-text-secondary,#666)}}._agentsList_jdser_73{flex-direction:column;gap:8px;display:flex}._agentRow_jdser_79{background-color:var(--color-background,#fff);border:1px solid var(--color-border,#e0e0e0);border-radius:4px;align-items:center;gap:8px;padding:8px;font-size:12px;display:flex}@media (prefers-color-scheme:dark){._agentRow_jdser_79{background-color:var(--color-background,#222);border-color:var(--color-border,#333)}}._agentId_jdser_97{color:var(--color-text,#333);min-width:60px;font-family:monospace;font-weight:500}@media (prefers-color-scheme:dark){._agentId_jdser_97{color:var(--color-text,#ccc)}}._phaseBadge_jdser_110{text-transform:uppercase;letter-spacing:.5px;color:#fff;border-radius:3px;padding:2px 6px;font-size:11px;font-weight:600}._phase-blue_jdser_120{background-color:#2196f3}._phase-cyan_jdser_124{background-color:#00bcd4}._phase-green_jdser_128{background-color:#4caf50}._phase-orange_jdser_132{background-color:#ff9800}._phase-gray_jdser_136{background-color:#9e9e9e}._age_jdser_73{background-color:var(--color-border,#e0e0e0);color:var(--color-text,#333);text-align:center;border-radius:3px;min-width:40px;padding:2px 6px;font-weight:500}@media (prefers-color-scheme:dark){._age_jdser_73{background-color:var(--color-border,#333);color:var(--color-text,#ccc)}}._tokens_jdser_157{background-color:var(--color-border,#e0e0e0);color:var(--color-text,#333);text-align:center;border-radius:3px;min-width:60px;padding:2px 6px;font-weight:500}@media (prefers-color-scheme:dark){._tokens_jdser_157{background-color:var(--color-border,#333);color:var(--color-text,#ccc)}}._warnings_jdser_174{color:#d32f2f;margin-left:auto;font-size:11px;font-weight:500}@media (prefers-color-scheme:dark){._warnings_jdser_174{color:#ff6b6b}}._unavailable_jdser_187{text-align:center;color:var(--color-text-secondary,#999);padding:12px;font-size:13px;font-style:italic}@media (prefers-color-scheme:dark){._unavailable_jdser_187{color:var(--color-text-secondary,#666)}}._empty_jdser_201{text-align:center;color:var(--color-text-secondary,#999);padding:8px;font-size:12px}@media (prefers-color-scheme:dark){._empty_jdser_201{color:var(--color-text-secondary,#666)}}._container_ud6jd_5{gap:var(--space-6);flex-direction:column;height:100%;display:flex;overflow-y:auto}._section_ud6jd_13{flex-direction:column;flex:0 auto;min-height:200px;display:flex}._section_ud6jd_13:first-child{flex:0 40%}._section_ud6jd_13:last-child{flex:60%}._timelineHeader_ud6jd_28{gap:var(--space-3);margin-bottom:var(--space-4);flex-direction:column;display:flex}._timelineTitle_ud6jd_35{font-size:var(--font-size-lg);margin:0;font-weight:600}._filterControls_ud6jd_41{gap:var(--space-2);flex-wrap:wrap;display:flex}._filterButton_ud6jd_47{padding:var(--space-2) var(--space-4);border:1px solid var(--color-border);background:var(--color-bg-subtle);color:var(--color-text);cursor:pointer;font-size:var(--font-size-sm);border-radius:4px;font-weight:500;transition:all .2s}._filterButton_ud6jd_47:hover{background:var(--color-bg-inset);border-color:var(--color-border-subtle)}._filterButtonActive_ud6jd_64{background:var(--color-accent);border-color:var(--color-accent);color:var(--color-text-inverse)}._filterButtonActive_ud6jd_64:hover{background:var(--color-accent-emphasis);border-color:var(--color-accent-emphasis)}@media (width<=768px){._container_ud6jd_5{gap:var(--space-4)}._section_ud6jd_13:first-child{flex:0 auto;min-height:auto}._section_ud6jd_13:last-child{flex:auto;min-height:250px}._filterControls_ud6jd_41{gap:var(--space-1)}._filterButton_ud6jd_47{padding:var(--space-1) var(--space-2);font-size:var(--font-size-xs)}}.cost-table-wrapper{border-radius:var(--radius-md);overflow-x:auto}.cost-table{border-collapse:collapse;width:100%;font-size:var(--font-size-sm);background:var(--color-surface)}.cost-table caption{text-align:left;padding:var(--space-2);font-size:var(--font-size-sm);color:var(--color-text-muted);caption-side:top}.cost-table thead{background:var(--color-bg-inset);border-bottom:2px solid var(--color-border)}.cost-table th{padding:var(--space-2) var(--space-3);text-align:left;font-weight:var(--font-weight-bold);color:var(--color-text)}.cost-table th.col-numeric{text-align:right}.cost-table tbody tr{border-bottom:1px solid var(--color-border-subtle)}.cost-table tbody tr:hover{background:var(--color-bg-subtle)}.cost-table td{padding:var(--space-2) var(--space-3);text-align:left;color:var(--color-text)}.cost-table td.col-numeric{text-align:right;font-family:var(--font-mono)}.cost-table .model-name{font-weight:var(--font-weight-medium);font-family:var(--font-mono);font-size:var(--font-size-xs);word-break:break-word;max-width:180px}.cost-table .verdict-failed{color:var(--color-status-error)}.cost-table .verdict-empty{color:var(--color-status-warn)}.cost-table .verdict-hung{color:var(--color-status-error)}.cost-table .col-total{font-weight:var(--font-weight-bold)}@media (width<=640px){.cost-table .verdict-col-header,.cost-table .verdict-cell{display:none}}@media (width<=768px){.cost-table{font-size:var(--font-size-xs)}.cost-table th,.cost-table td{padding:var(--space-1) var(--space-2)}.cost-table .model-name{max-width:100px}}.chart-container{border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface);flex-direction:column;display:flex;overflow:hidden}.chart-empty{min-height:250px;padding:var(--space-6);text-align:center;flex-direction:column;justify-content:center;align-items:center;display:flex}.chart-empty-message{margin:0 0 var(--space-2) 0;font-size:var(--font-size-md);font-weight:var(--font-weight-medium);color:var(--color-text)}.chart-empty-hint{font-size:var(--font-size-sm);color:var(--color-text-muted);margin:0}.cost-chart-svg{max-width:100%;height:auto;display:block;overflow:visible}.chart-footer{padding:var(--space-2) var(--space-4);border-top:1px solid var(--color-border-subtle);background:var(--color-bg);text-align:right;font-size:var(--font-size-xs)}.chart-footer-timestamp{color:var(--color-text-muted);font-family:var(--font-mono)}.chart-axis{stroke:var(--color-border);stroke-width:2px}.chart-label-x,.chart-label-y{fill:var(--color-text-muted);font-size:12px;font-family:var(--font-sans)}.bar-segment{stroke:var(--color-border-subtle);stroke-width:.5px;transition:opacity var(--transition-fast);cursor:pointer}.bar-segment:hover{opacity:.8}.bar-input{fill:var(--color-status-info)}.bar-output{fill:var(--color-accent)}.chart-legend{font-size:12px}.legend-text{fill:var(--color-text-muted);font-family:var(--font-sans);font-size:12px}@media (width<=768px){.cost-chart-svg{width:100%}.chart-label-x,.chart-label-y,.legend-text{font-size:10px}}.scorecard{padding:var(--space-5);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface)}.scorecard-header{margin-bottom:var(--space-4)}.scorecard-header h3{margin:0 0 var(--space-2) 0;font-size:var(--font-size-lg);font-weight:var(--font-weight-medium);color:var(--color-text)}.scorecard-total{font-size:var(--font-size-sm);color:var(--color-text-muted)}.scorecard-tiles{gap:var(--space-3);margin-bottom:var(--space-4);grid-template-columns:repeat(auto-fit,minmax(120px,1fr));display:grid}.scorecard-tile{padding:var(--space-3);border-radius:var(--radius-md);text-align:center;border:1px solid var(--color-border);background:var(--color-bg-subtle)}.tile-label{font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);margin-bottom:var(--space-1)}.tile-percent{font-size:var(--font-size-xl);font-weight:var(--font-weight-bold);margin-bottom:var(--space-1)}.tile-count{font-size:var(--font-size-xs);color:var(--color-text-muted)}.scorecard-tile--ok{border-color:var(--color-status-ok);background:var(--color-status-ok-bg)}.scorecard-tile--ok .tile-label,.scorecard-tile--ok .tile-percent{color:var(--color-status-ok)}.scorecard-tile--error{border-color:var(--color-status-error);background:var(--color-status-error-bg)}.scorecard-tile--error .tile-label,.scorecard-tile--error .tile-percent{color:var(--color-status-error)}.scorecard-tile--warn{border-color:var(--color-status-warn);background:var(--color-status-warn-bg)}.scorecard-tile--warn .tile-label,.scorecard-tile--warn .tile-percent{color:var(--color-status-warn)}.scorecard-tile--neutral{border-color:var(--color-status-neutral)}.scorecard-tile--neutral .tile-label,.scorecard-tile--neutral .tile-percent{color:var(--color-status-neutral)}.scorecard-footer{border-top:1px solid var(--color-border-subtle);padding-top:var(--space-3)}.scorecard-footer small{color:var(--color-text-muted);font-size:var(--font-size-xs)}.weekly-cost-wrapper{width:100%;overflow-x:auto}.weekly-cost-empty{padding:var(--space-5);text-align:center;color:var(--color-text-muted);background-color:var(--color-bg-inset);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md)}.weekly-cost-empty .empty-message{font-size:var(--font-size-sm);margin:0}.weekly-cost-table{border-collapse:collapse;width:100%;font-size:var(--font-size-sm)}.weekly-cost-table caption{text-align:left;padding:var(--space-3) 0 var(--space-2) 0;font-size:var(--font-size-xs);color:var(--color-text-muted)}.weekly-cost-table thead th{background-color:var(--color-bg-subtle);border:1px solid var(--color-border-subtle);padding:var(--space-3);text-align:left;font-weight:var(--font-weight-bold);color:var(--color-text)}.weekly-cost-table thead th.col-numeric{text-align:right}.weekly-cost-table tbody td{border:1px solid var(--color-border-subtle);padding:var(--space-3);background-color:var(--color-surface)}.weekly-cost-table tbody tr:nth-child(odd) td{background-color:var(--color-bg-inset)}.weekly-cost-table tbody td.week-label{font-weight:var(--font-weight-medium);color:var(--color-text)}.weekly-cost-table tbody td.col-numeric{text-align:right;font-family:var(--font-mono);color:var(--color-text-muted)}@media (prefers-reduced-motion:no-preference){.weekly-cost-table tbody tr{transition:background-color var(--transition-fast)}.weekly-cost-table tbody tr:hover td{background-color:var(--color-bg-subtle)}}.verdict-cost-wrapper{width:100%}.verdict-cost-empty{padding:var(--space-5);text-align:center;color:var(--color-text-muted);background-color:var(--color-bg-inset);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md)}.verdict-cost-empty .empty-message{font-size:var(--font-size-sm);margin:0}.verdict-cost-grid{gap:var(--space-4);margin-bottom:var(--space-4);grid-template-columns:repeat(auto-fit,minmax(200px,1fr));display:grid}.verdict-cost-tile{padding:var(--space-4);border:2px solid var(--color-border);border-radius:var(--radius-md);background-color:var(--color-bg-subtle);transition:all var(--transition-normal)}.verdict-cost-tile:hover:not(.verdict-tile--disabled){border-color:var(--color-accent);background-color:var(--color-surface);box-shadow:var(--shadow-md)}.verdict-tile--ok{border-left:4px solid var(--color-status-ok)}.verdict-tile--failed{border-left:4px solid var(--color-status-error)}.verdict-tile--empty{border-left:4px solid var(--color-status-warn)}.verdict-tile--hung{border-left:4px solid var(--color-status-neutral)}.verdict-tile--disabled{opacity:.5;background-color:var(--color-bg-inset);border-color:var(--color-border-subtle);cursor:not-allowed}.verdict-cost-tile .tile-label{font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.5px;margin-bottom:var(--space-2)}.verdict-cost-tile .tile-value{font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-text);margin-bottom:var(--space-2);align-items:baseline;gap:var(--space-2);display:flex}.verdict-cost-tile .tile-unit{font-size:var(--font-size-xs);color:var(--color-text-muted);font-weight:var(--font-weight-normal)}.verdict-cost-tile .tile-disabled{color:var(--color-text-muted);font-size:var(--font-size-xl);line-height:1}.verdict-cost-tile .tile-meta{font-size:var(--font-size-xs);color:var(--color-text-muted)}.verdict-cost-note{padding:var(--space-3);background-color:var(--color-bg-inset);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);border-left:3px solid var(--color-status-info)}.verdict-cost-note p{font-size:var(--font-size-xs);color:var(--color-text-muted);line-height:var(--line-height-normal);margin:0}.model-mix-wrapper{width:100%}.model-mix-empty{padding:var(--space-5);text-align:center;color:var(--color-text-muted);background-color:var(--color-bg-inset);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md)}.model-mix-empty .chart-empty-message{font-size:var(--font-size-sm);margin:0}.model-mix-chart-svg{width:100%;max-width:800px;height:auto;margin:0 auto;display:block}.model-mix-chart-svg .chart-axis{stroke:var(--color-border);stroke-width:1.5px}.model-mix-chart-svg .chart-label-x,.model-mix-chart-svg .chart-label-y{font-size:12px;font-family:var(--font-sans);fill:var(--color-text-muted)}.model-mix-chart-svg .chart-label-x{text-anchor:middle}.model-mix-chart-svg .bar-segment{stroke:var(--color-bg);stroke-width:1px;opacity:.9;transition:opacity .15s}.model-mix-chart-svg .bar-segment:hover{opacity:1;stroke-width:1.5px;filter:brightness(1.1)}.model-mix-chart-svg .bar-segment:hover title{display:block}.model-mix-chart-svg .chart-legend{font-family:var(--font-sans)}.model-mix-chart-svg .legend-text{fill:var(--color-text-muted);font-size:11px}.model-mix-wrapper .model-mix-note{margin-top:var(--space-4);padding:var(--space-3);background-color:var(--color-bg-inset);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md)}.model-mix-note p{font-size:var(--font-size-xs);color:var(--color-text-muted);line-height:var(--line-height-normal);margin:0}@media (width<=600px){.model-mix-chart-svg{min-height:200px}.model-mix-chart-svg .chart-label-x{font-size:10px}.model-mix-chart-svg .legend-text{font-size:9px}}.view-cost{padding:var(--space-5);max-width:var(--content-max-width)}.view-cost h2{margin-top:0;margin-bottom:var(--space-5);font-size:var(--font-size-xl);color:var(--color-text)}.view-cost h3{font-size:var(--font-size-lg);color:var(--color-text);margin-top:var(--space-5);margin-bottom:var(--space-3)}.cost-callout{padding:var(--space-4);border-left:4px solid var(--color-accent);border-radius:var(--radius-md);background:var(--color-bg-subtle);margin-bottom:var(--space-5)}.cost-callout h3{margin-top:0;margin-bottom:var(--space-2);font-size:var(--font-size-md)}.cost-callout p{color:var(--color-text);font-size:var(--font-size-sm);line-height:var(--line-height-normal);margin:0}.cost-callout code{background:var(--color-bg-inset);font-family:var(--font-mono);border-radius:3px;padding:.2em .4em;font-size:.9em}.cost-callout--info{border-left-color:var(--color-status-info)}.cost-layout{gap:var(--space-5);display:grid}.cost-section{border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-4);background:var(--color-surface)}.cost-section h3{margin-top:0;margin-bottom:var(--space-3)}@media (width<=768px){.view-cost{padding:var(--space-3)}.cost-layout{gap:var(--space-4)}.cost-section{padding:var(--space-3)}}.failure-drilldown{flex-direction:column;gap:.5rem;display:flex}.failure-drilldown-toggle{border:1px solid var(--color-border,#ccc);cursor:pointer;font-family:inherit;font-size:inherit;text-align:left;background:0 0;border-radius:4px;padding:.5rem;transition:background-color .2s}.failure-drilldown-toggle:hover{background-color:var(--color-bg-hover,#f5f5f5)}.failure-drilldown-toggle:active{background-color:var(--color-bg-active,#e8e8e8)}@media (prefers-color-scheme:dark){.failure-drilldown-toggle:hover{background-color:#2a2a2a}.failure-drilldown-toggle:active{background-color:#333}}.failure-drilldown-content{background-color:var(--color-bg-secondary,#f9f9f9);border:1px solid var(--color-border,#ccc);border-radius:4px;flex-direction:column;gap:1rem;padding:1rem;display:flex}@media (prefers-color-scheme:dark){.failure-drilldown-content{background-color:#1a1a1a;border-color:#444}}.failure-drilldown-loading,.failure-drilldown-error,.failure-drilldown-unavailable,.failure-drilldown-empty{border-radius:4px;padding:1rem;font-size:.95rem}.failure-drilldown-loading{color:var(--color-text-secondary,#666);background-color:#0000}.failure-drilldown-error{color:#c41e3a;background-color:#fef5f5;border:1px solid #c41e3a;flex-direction:column;gap:.5rem;display:flex}@media (prefers-color-scheme:dark){.failure-drilldown-error{background-color:#2a1a1a;border-color:#8b2e2e}}.failure-drilldown-error button{color:#fff;cursor:pointer;background:#c41e3a;border:none;border-radius:4px;align-self:flex-start;padding:.5rem 1rem;font-size:.9rem}.failure-drilldown-error button:hover{background:#a01830}.failure-drilldown-unavailable{color:var(--color-text,#333);background-color:#fffaef;border:1px solid #f0ad4e}@media (prefers-color-scheme:dark){.failure-drilldown-unavailable{background-color:#2a1f00;border-color:#8b6f00}}.failure-drilldown-empty{color:var(--color-text-secondary,#666);background-color:#0000;font-style:italic}.failure-run{border-left:4px solid var(--color-border,#ccc);background-color:#0000;border-radius:2px;flex-direction:column;gap:.75rem;padding:1rem;display:flex}.failure-run-header{flex-wrap:wrap;align-items:center;gap:1rem;display:flex}.failure-run-conclusion{color:var(--color-text,#333);align-items:center;gap:.25rem;font-weight:600;display:flex}.failure-run-icon{font-size:1.2em;display:inline-block}.failure-run-name{color:var(--color-text,#333);font-family:monospace;font-size:.9rem}.failure-run-link{color:#06c;font-size:.9rem;text-decoration:none}.failure-run-link:hover{text-decoration:underline}@media (prefers-color-scheme:dark){.failure-run-link{color:#66b3ff}}.failure-run-meta{color:var(--color-text-secondary,#666);font-size:.85rem}.failure-run-meta code{background-color:var(--color-code-bg,#f0f0f0);border-radius:2px;padding:2px 4px;font-family:monospace;font-size:.85em}@media (prefers-color-scheme:dark){.failure-run-meta code{background-color:#2a2a2a}}.failure-jobs{flex-direction:column;gap:.5rem;display:flex}.failure-jobs-summary{color:var(--color-text,#333);padding:.5rem 0;font-weight:500}.failure-jobs-failing{color:#c41e3a}.failure-jobs-all-passing{color:#2ecc71}.failure-jobs-empty{color:var(--color-text-secondary,#666);text-align:center;padding:1rem;font-style:italic}.failure-jobs-list{flex-direction:column;gap:.5rem;display:flex}.failure-job{border:1px solid var(--color-border,#ddd);border-radius:4px;flex-direction:column;gap:.5rem;display:flex;overflow:hidden}.failure-job-summary{background:var(--color-bg-secondary,#fafafa);cursor:pointer;text-align:left;font-family:inherit;font-size:inherit;color:var(--color-text,#333);border:none;align-items:center;gap:.75rem;padding:.75rem;transition:background-color .15s;display:flex}.failure-job-summary:hover{background-color:var(--color-bg-hover,#f0f0f0)}.failure-job-summary:active{background-color:var(--color-bg-active,#e8e8e8)}@media (prefers-color-scheme:dark){.failure-job-summary{background:#2a2a2a}.failure-job-summary:hover{background-color:#333}.failure-job-summary:active{background-color:#3a3a3a}}.failure-job-summary.failure-job-failing{background-color:#fef5f5;border-left:4px solid #c41e3a}@media (prefers-color-scheme:dark){.failure-job-summary.failure-job-failing{background-color:#2a1a1a;border-left-color:#8b2e2e}}.failure-job-icon{width:1em;color:var(--color-text-secondary,#666);justify-content:center;align-items:center;font-size:.9em;display:inline-flex}.failure-job-status{flex:none;align-items:center;gap:.25rem;font-weight:500;display:flex}.failure-job-conclusion-icon{font-size:1em;display:inline-block}.failure-job-name{color:var(--color-text,#333);text-overflow:ellipsis;flex:auto;min-width:0;font-family:monospace;font-size:.9rem;overflow:hidden}.failure-job-link{color:#06c;white-space:nowrap;flex:none;font-size:.85rem;text-decoration:none}.failure-job-link:hover{text-decoration:underline}@media (prefers-color-scheme:dark){.failure-job-link{color:#66b3ff}}.failure-job-details{border-top:1px solid var(--color-border,#ddd);background-color:#0000;flex-direction:column;gap:.5rem;padding:.75rem;display:flex}@media (prefers-color-scheme:dark){.failure-job-details{border-top-color:#444}}.failure-job-meta{color:var(--color-text-secondary,#666);font-size:.85rem}.failure-job-meta code{background-color:var(--color-code-bg,#f0f0f0);border-radius:2px;padding:2px 4px;font-family:monospace;font-size:.85em}@media (prefers-color-scheme:dark){.failure-job-meta code{background-color:#1a1a1a}}.failure-job-meta a{color:#06c;text-decoration:none}.failure-job-meta a:hover{text-decoration:underline}@media (prefers-color-scheme:dark){.failure-job-meta a{color:#66b3ff}}.failure-job-log{color:#333;background-color:#f5f5f5;border:1px solid #ddd;border-radius:2px;max-height:300px;margin:0;padding:.75rem;font-family:Courier New,Courier,monospace;font-size:.8rem;line-height:1.4;overflow:auto}@media (prefers-color-scheme:dark){.failure-job-log{color:#ccc;background-color:#1a1a1a;border-color:#444}}.failure-job-log-unavailable{color:var(--color-text,#333);background-color:#fffaef;border:1px solid #f0ad4e;border-radius:2px;padding:.75rem;font-size:.9rem}@media (prefers-color-scheme:dark){.failure-job-log-unavailable{background-color:#2a1f00;border-color:#8b6f00}}.view-prboard{padding:var(--space-5);max-width:var(--content-max-width)}.prboard-head{justify-content:space-between;align-items:center;gap:var(--space-3);margin-bottom:var(--space-5);display:flex}.view-prboard h2{font-size:var(--font-size-xl);color:var(--color-text);margin:0}.view-prboard h3{margin-top:0;margin-bottom:var(--space-2);font-size:var(--font-size-md);color:var(--color-text)}.prboard-refresh{padding:var(--space-1) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-sm);color:var(--color-text);cursor:pointer;font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);background:0 0}.prboard-refresh:hover{background:var(--color-bg-subtle)}.prboard-refresh:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}.prboard-callout{padding:var(--space-4);border-left:4px solid var(--color-accent);border-radius:var(--radius-md);background:var(--color-bg-subtle);margin-bottom:var(--space-5);color:var(--color-text);font-size:var(--font-size-sm);line-height:var(--line-height-normal)}.prboard-callout p{margin:var(--space-2) 0 0}.prboard-callout code{background:var(--color-bg-inset);font-family:var(--font-mono);border-radius:3px;padding:.2em .4em;font-size:.9em}.prboard-callout--info{border-left-color:var(--color-status-info)}.prboard-callout--warn{border-left-color:var(--color-status-warn)}.prboard-callout--error{border-left-color:var(--color-status-error);background:var(--color-status-error-bg)}.prboard-filter{padding:var(--space-3) var(--space-4);border:1px solid var(--color-border);border-radius:var(--radius-md) var(--radius-md) 0 0;background:var(--color-surface);border-bottom:none}.prboard-toggle-label{align-items:center;gap:var(--space-2);font-size:var(--font-size-sm);color:var(--color-text);cursor:pointer;-webkit-user-select:none;user-select:none;display:flex}.prboard-toggle-input{cursor:pointer;flex-shrink:0}.prboard-toggle-input:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}.prboard-table-wrapper{border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface);overflow-x:auto}.prboard-table{border-collapse:collapse;width:100%;font-size:var(--font-size-sm)}.prboard-table caption{text-align:left;padding:var(--space-3) var(--space-4);color:var(--color-text-muted);font-size:var(--font-size-xs)}.prboard-table th{text-align:left;padding:var(--space-2) var(--space-4);border-bottom:2px solid var(--color-border);color:var(--color-text-muted);font-weight:var(--font-weight-bold);white-space:nowrap}.prboard-table td{padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--color-border-subtle);color:var(--color-text);vertical-align:top}.prboard-table tbody tr:last-child td{border-bottom:none}.prboard-num{font-variant-numeric:tabular-nums;white-space:nowrap;font-weight:var(--font-weight-medium)}.prboard-branch-tag{border-radius:var(--radius-sm);background:var(--color-bg-inset);color:var(--color-text-muted);font-size:var(--font-size-xs);text-transform:uppercase;letter-spacing:.03em;padding:.1em .5em;display:inline-block}.prboard-title a{color:var(--color-accent);font-weight:var(--font-weight-medium);text-decoration:none}.prboard-title a:hover{text-decoration:underline}.prboard-title a:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px;border-radius:var(--radius-sm)}.prboard-draft-badge{color:var(--color-text-muted);font-size:var(--font-size-xs)}.prboard-branchcol code{font-family:var(--font-mono);font-size:var(--font-size-xs);color:var(--color-text-muted);word-break:break-all}.prboard-status{align-items:center;gap:var(--space-1);white-space:nowrap;font-weight:var(--font-weight-medium);display:inline-flex}.prboard-status-icon{font-size:.9em}.prboard-agecol{color:var(--color-text-muted);white-space:nowrap}.prboard-blocker{color:var(--color-status-warn)}@media (width<=768px){.view-prboard{padding:var(--space-3)}.prboard-table th,.prboard-table td{padding:var(--space-2) var(--space-3)}}:root{--color-bg:#fff;--color-bg-subtle:#f6f8fa;--color-bg-inset:#eff2f5;--color-surface:#fff;--color-border:#d0d7de;--color-border-subtle:#e4e8ec;--color-text:#1f2328;--color-text-muted:#59636e;--color-text-inverse:#fff;--color-accent:#0969da;--color-accent-emphasis:#0550ae;--color-status-ok:#1a7f37;--color-status-warn:#9a6700;--color-status-error:#cf222e;--color-status-info:#0969da;--color-status-neutral:#59636e;--color-status-ok-bg:#dafbe1;--color-status-warn-bg:#fff8c5;--color-status-error-bg:#ffebe9;--color-status-info-bg:#ddf4ff;--color-focus-ring:#0969da;--space-1:.25rem;--space-2:.5rem;--space-3:.75rem;--space-4:1rem;--space-5:1.5rem;--space-6:2rem;--space-7:3rem;--font-sans:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--font-mono:ui-monospace, SFMono-Regular, "Cascadia Mono", Consolas, "Liberation Mono", Menlo, monospace;--font-size-xs:.75rem;--font-size-sm:.875rem;--font-size-md:1rem;--font-size-lg:1.125rem;--font-size-xl:1.375rem;--line-height-tight:1.25;--line-height-normal:1.5;--font-weight-normal:400;--font-weight-medium:500;--font-weight-bold:600;--radius-sm:4px;--radius-md:6px;--radius-lg:10px;--shadow-sm:0 1px 2px #1f232814;--shadow-md:0 3px 8px #1f23281f;--header-height:3rem;--content-max-width:90rem;--transition-fast:.12s ease;--transition-normal:.2s ease;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}.text-status-ok{color:var(--color-status-ok)}.text-status-warn{color:var(--color-status-warn)}.text-status-error{color:var(--color-status-error)}.text-status-info{color:var(--color-status-info)}.text-status-neutral{color:var(--color-status-neutral)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--color-bg:#0d1117;--color-bg-subtle:#161b22;--color-bg-inset:#010409;--color-surface:#161b22;--color-border:#30363d;--color-border-subtle:#21262d;--color-text:#e6edf3;--color-text-muted:#9198a1;--color-text-inverse:#0d1117;--color-accent:#4493f8;--color-accent-emphasis:#79b8ff;--color-status-ok:#3fb950;--color-status-warn:#d29922;--color-status-error:#f85149;--color-status-info:#58a6ff;--color-status-neutral:#9198a1;--color-status-ok-bg:#12261e;--color-status-warn-bg:#3d3a1f;--color-status-error-bg:#4a2028;--color-status-info-bg:#121d2f;--color-focus-ring:#58a6ff;--shadow-sm:0 1px 2px #01040999;--shadow-md:0 3px 8px #010409b3;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}}:root[data-theme=dark]{--color-bg:#0d1117;--color-bg-subtle:#161b22;--color-bg-inset:#010409;--color-surface:#161b22;--color-border:#30363d;--color-border-subtle:#21262d;--color-text:#e6edf3;--color-text-muted:#9198a1;--color-text-inverse:#0d1117;--color-accent:#4493f8;--color-accent-emphasis:#79b8ff;--color-status-ok:#3fb950;--color-status-warn:#d29922;--color-status-error:#f85149;--color-status-info:#58a6ff;--color-status-neutral:#9198a1;--color-status-ok-bg:#12261e;--color-status-warn-bg:#3d3a1f;--color-status-error-bg:#4a2028;--color-status-info-bg:#121d2f;--color-focus-ring:#58a6ff;--shadow-sm:0 1px 2px #01040999;--shadow-md:0 3px 8px #010409b3;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*,:before,:after{box-sizing:border-box;margin:0;padding:0}html{-webkit-text-size-adjust:100%}body{font-family:var(--font-sans);font-size:var(--font-size-md);line-height:var(--line-height-normal);color:var(--color-text);background:var(--color-bg)}img,svg{max-width:100%;display:block}button,input,select,textarea{font:inherit;color:inherit}a{color:var(--color-accent)}:focus{outline:none}:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px;border-radius:var(--radius-sm)}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}.app-header{z-index:100;align-items:center;gap:var(--space-3);min-height:var(--header-height);padding:0 var(--space-4);background:var(--color-bg-subtle);border-bottom:1px solid var(--color-border);display:flex;position:sticky;top:0}.app-title{font-size:var(--font-size-md);font-weight:var(--font-weight-bold);white-space:nowrap}.app-nav{gap:var(--space-1);display:flex}.app-nav a{padding:var(--space-2) var(--space-3);color:var(--color-text-muted);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);border-bottom:2px solid #0000;text-decoration:none;display:inline-block}.app-nav a[aria-current=page]{color:var(--color-text);border-bottom-color:var(--color-accent)}.app-nav a:hover{color:var(--color-text)}.app-main{max-width:var(--content-max-width);padding:var(--space-4);margin:0 auto}.view-placeholder{padding:var(--space-6);border:1px dashed var(--color-border);border-radius:var(--radius-md);color:var(--color-text-muted);text-align:center}.theme-toggle{padding:var(--space-1) var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-sm);cursor:pointer;font-size:var(--font-size-sm);color:var(--color-text-muted);background:0 0;margin-left:auto}.theme-toggle:hover{color:var(--color-text);background:var(--color-bg-inset)}.sse-status{font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);white-space:nowrap}.sse-status[data-status=live]{color:var(--color-status-ok);background:var(--color-status-ok-bg)}.sse-status[data-status=reconnecting]{color:var(--color-status-warn);background:var(--color-status-warn-bg)}.sse-status[data-status=error]{color:var(--color-status-error);background:var(--color-status-error-bg)}
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>Aesop Fleet Dashboard</title>
7
7
  <script>window.__AESOP_CSRF_TOKEN__ = __AESOP_CSRF_SENTINEL__;</script>
8
- <script type="module" crossorigin src="/assets/index-0qQYnvMC.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-BdIlFieV.css">
8
+ <script type="module" crossorigin src="/assets/index-BGbgw2Nh.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-DqZLgwNg.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
package/bin/CLAUDE.md DELETED
@@ -1,76 +0,0 @@
1
- # bin/ — CLI scaffolder
2
-
3
- **Purpose**: Node.js CLI entry point that clones the aesop orchestration template into a target directory with idempotent validation, plus an interactive onboarding wizard for new adopters.
4
-
5
- ## Invocation
6
-
7
- - **npm registry**: `npx @matt82198/aesop [target-dir]` (default: `aesop-fleet`)
8
- - **Local dev**: `node bin/cli.js [target-dir]`
9
- - **Help**: `npx @matt82198/aesop --help` or `-h`
10
- - **Interactive wizard**: `npx @matt82198/aesop wizard` (on a TTY, prompts; with `--yes`, uses defaults)
11
-
12
- ## Runtime subcommands
13
-
14
- cli.js dispatches runtime management subcommands to `tools/{subcommand}.js`:
15
-
16
- - **`aesop doctor`** (or `node bin/cli.js doctor`) — Preflight readiness check; validates Node.js, Python, git, config, directories, hooks, and dashboard port availability.
17
- - **`aesop watch`** (or `node bin/cli.js watch`) — Launch the watchdog daemon; spawns `daemons/run-watchdog.sh` for continuous fleet monitoring.
18
- - **`aesop dash`** (or `node bin/cli.js dash`) — Launch the web dashboard; spawns `python ui/serve.py` to serve realtime fleet status at localhost:8770 (default).
19
- - **`aesop status`** (or `node bin/cli.js status`) — One-shot fleet status snapshot; displays heartbeats, dashboard port, and git branch status.
20
-
21
- ## What gets copied
22
-
23
- Files in `filesToCopy` array (cli.js lines 239–256):
24
- - **Directories**: `daemons/`, `dash/`, `monitor/`, `tools/`, `ui/`, `docs/`, `state_store/`, `skills/`, `mcp/`, `scan/`, `hooks/`
25
- - **Files**: `aesop.config.example.json`, `README.md`, `LICENSE`, `CHANGELOG.md`, `CLAUDE-TEMPLATE.md`
26
- - **Brain templates** (in docs/): `MEMORY-TEMPLATE.md` (via docs/ directory copy)
27
-
28
- ## What does NOT get copied
29
-
30
- - `aesop.config.json` (users must `cp aesop.config.example.json` and edit)
31
- - `state/` (runtime durable state, git-ignored, created by daemons)
32
- - `.git/`, `node_modules/`, build artifacts
33
-
34
- ## Post-scaffold guidance
35
-
36
- Scaffolder prints steps for users:
37
- 1. `cd target-dir && cp aesop.config.example.json aesop.config.json`
38
- 2. Edit config with paths and repos
39
- 3. Initialize brain: `cp CLAUDE-TEMPLATE.md ~/.claude/CLAUDE.md` (edit)
40
- 4. Initialize memory: `cp docs/MEMORY-TEMPLATE.md ~/.claude/MEMORY.md` (edit)
41
- 5. Test daemon: `bash daemons/run-watchdog.sh --once`
42
- 6. Launch dashboard: `python ui/serve.py`
43
-
44
- ## Interactive wizard (`aesop wizard`)
45
-
46
- The wizard mode provides an interactive onboarding flow for new adopters, guiding them through fleet setup in ~60 seconds:
47
-
48
- 1. **Trigger**: `npx @matt82198/aesop wizard` on a TTY (interactive terminal)
49
- 2. **Questions** (all have sensible defaults, press Enter-Enter-Enter to skip):
50
- - Project name (default: "my-fleet")
51
- - Repos to watch (auto-discovers git repos under `~`, offers choices)
52
- - Dashboard port (default: 8770, validates 1–65535)
53
- - Brain root directory (default: `~/.claude`)
54
- 3. **Output**:
55
- - Scaffolds template files
56
- - Generates CLAUDE.md (substituted with project name)
57
- - Generates aesop.config.json (with discovered repos)
58
- - Prints "next 3 commands" epilogue
59
- - Offers to run `watchdog --once` smoke test immediately
60
- 4. **Non-interactive mode** (`--yes` flag or non-TTY stdin): Uses defaults, zero prompts (CI-safe)
61
-
62
- ### Wizard implementation details
63
-
64
- - **Repo discovery** (`discoverRepos`): Scans `~` for `.git` directories at first level (non-recursive)
65
- - **Port validation** (`validatePort`): Rejects invalid ports, accepts 1–65535
66
- - **Portable paths**: All config paths use `~` form (`~/.claude`, `~/scripts`, etc.) for cross-platform compatibility
67
- - **Defaults**: Every prompt has a default so users can skip it (press Enter)
68
- - **Non-destructive**: Never overwrites existing `aesop.config.json` without user confirmation
69
-
70
- ## Invariants & gotchas
71
-
72
- - **Idempotent on empty targets**: Fails if `targetDir` exists and is non-empty (non-destructive). Safe to retry.
73
- - **Adding shipped files**: Any new file/dir added to `filesToCopy` array must also be added to `package.json` `files` array (lines 9–27 in package.json) so npm publish includes it.
74
- - **No machine-specific paths**: Use relative paths only; `__dirname` and `path.join()` handle cross-platform resolution.
75
- - **Wizard prompts are async**: Main execution is wrapped in async IIFE to support readline prompts
76
- - **Help text accuracy**: If invocation steps or output paths change, update help text
package/daemons/CLAUDE.md DELETED
@@ -1,36 +0,0 @@
1
- # daemons/ — Watchdog daemon
2
-
3
- **Purpose**: Long-running backup and secret-scan daemon for fleet-wide repo safety.
4
-
5
- ## Files
6
-
7
- - **run-watchdog.sh** (1.7K): Interactive daemon supervisor; spawns backup-fleet.sh every 150s, maintains heartbeat guard (200s dedupe window), logs to FLEET-BACKUP.log. Calls tools/alert_bridge.py --scan after each cycle to post HIGH/CRITICAL alerts to Slack/Discord (opt-in). Traps INT/TERM cleanly.
8
- - **backup-fleet.sh** (5K): Core backup worker; discovers repos (~/.*, ~/*, ~/dev/*), stashes uncommitted work to backup/* branches, pushes unpushed commits, scans tracked files for secrets. Blocks push if secret-scan fails (marks BLOCKED state).
9
-
10
- ## Contracts
11
-
12
- **Env vars consumed**: `AESOP_ROOT` (defaults to `.`) — root of project; prepends to all state/ and tools/ paths.
13
-
14
- **State files written** (git-ignored):
15
- - `$AESOP_ROOT/state/.watchdog-heartbeat` — epoch seconds; dedupe guard (200s window).
16
- - `$AESOP_ROOT/state/.watchdog-repos.json` — per-cycle snapshot: [{repo, state: CLEAN|PUSHED|SNAPSHOTTED|BLOCKED, age}].
17
- - `$AESOP_ROOT/state/FLEET-BACKUP.log` — append-only; cycle start/end, repo statuses, secret-scan blocks.
18
- - `$AESOP_ROOT/state/SECURITY-ALERTS.log` — append-only; security alerts (read by alert_bridge.py to post to webhooks).
19
- - `$AESOP_ROOT/state/.alert-bridge-cursor` — line number of last sent alert (ensures idempotent alert dispatch).
20
-
21
- **Exit behaviors**: run-watchdog exits 0 always (trap handles clean shutdown). backup-fleet exits 0 even on secret-scan block (marks repo BLOCKED, continues).
22
-
23
- **Cadence**: 150s cycle; heartbeat dedupe within 200s.
24
-
25
- ## Invariants & Gotchas
26
-
27
- 1. **Single-instance guard (atomic lock)**: run-watchdog.sh uses atomic mkdir-based lockfile (`.watchdog-lock/`) to prevent concurrent daemons.
28
- - Atomic acquire: `mkdir $LOCK_DIR` is guaranteed atomic on POSIX systems (returns 0 only to first caller).
29
- - Stale-lock recovery: Crashed holder won't wedge daemon forever; lock older than 300s is reclaimed atomically.
30
- - Guards both daemon mode and `--once` mode (no bypass).
31
- 2. **Testing override**: Set `AESOP_WATCHDOG_CYCLE_CMD` env var to replace backup-fleet.sh invocation (allows tests to use mock cycle without running real backup).
32
- 3. **CRLF-safe, no line continuations**: Use POSIX-safe heredocs; never add `\` for line wrap.
33
- 4. **Secret-scan gate**: `scan_tracked_files()` calls `$AESOP_ROOT/tools/secret_scan.py` on tracked modifications and untracked files; non-0 exit blocks push, marks repo BLOCKED.
34
- 5. **Append-only logs**: FLEET-BACKUP.log only grows; rotate via tools/rotate_logs.py.
35
- 6. **Path dedup via realpath**: Avoids processing symlinked repos or dot-dir aliases twice.
36
- 7. **Alert Bridge integration** (NEW wave-14): After each backup-fleet.sh cycle, run-watchdog.sh calls `python $AESOP_ROOT/tools/alert_bridge.py --scan || true` to post HIGH/CRITICAL security alerts and heartbeat staleness to Slack/Discord. No-op if webhook_url null/absent in aesop.config.json (feature opt-in). Uses cursor file for idempotent dispatch (no re-sends). See tools/alert_bridge.py for details.
package/dash/CLAUDE.md DELETED
@@ -1,32 +0,0 @@
1
- # dash/ — Dashboard TUI
2
-
3
- **Purpose**: Real-time TUI fleet monitoring — watchdog daemon + agent activity display.
4
-
5
- ## Files
6
-
7
- - **watchdog-gui.sh** — Read-only terminal UI (4s refresh, double-buffered, no flicker). Displays daemon status, backed-up repos, heartbeats, recent events. Launch in own window; never inside tool shell. CRLF-safe (no line continuations).
8
- - **dash-extra.mjs** — Node.js agent activity detector. Scans AESOP_TRANSCRIPTS_ROOT for agent-*.jsonl files (last 12 min). TUI output by default; --json for web endpoints. Requires node on PATH (unavailable fallback if missing).
9
-
10
- ## State contracts
11
-
12
- **watchdog-gui.sh reads** (heartbeat staleness thresholds applied):
13
- - `state/.watchdog-heartbeat` (epoch, threshold: 300s for watchdog)
14
- - `state/FLEET-BACKUP.log` (append-only, tail 3 lines)
15
- - `state/SECURITY-ALERTS.log` (counts HIGH/MED, grep filtering RESOLVED-FP)
16
- - `state/.watchdog-repos.json` (jq-parsed, status per repo)
17
- - `state/.heartbeats/*` (epoch, per-agent thresholds: 3600s monitor, 300s watchdog, 1800s default)
18
-
19
- **dash-extra.mjs reads**:
20
- - `~/.claude/projects/**/ agent-*.jsonl` (modified time, <12min filter, top 8 recent)
21
- - `state/SECURITY-ALERTS.log` (severity classification: HIGH/MED/DRIFT)
22
-
23
- **Refresh cadence**:
24
- - watchdog-gui.sh: 4s loop (infinite, Ctrl-C to exit)
25
- - dash-extra.mjs: called on-demand (no built-in loop)
26
-
27
- ## Invariants & TUI conventions
28
-
29
- - **Never modify fleet state** — both tools are read-only dashboards.
30
- - **Infinite loop design** — watchdog-gui.sh runs forever; launch in dedicated terminal window, never inside tool shells.
31
- - **CRLF-safe** — no bash line continuations; portable POSIX.
32
- - **Node optional** — dash-extra.mjs gracefully prints "unavailable" if node missing; doesn't fail watchdog-gui.sh.
@@ -1,3 +0,0 @@
1
- # Archived Spike Investigations
2
-
3
- Spike investigations that were cancelled or superseded; kept for reference and historical context.
@@ -1,125 +0,0 @@
1
- # ACTIVATION runbook — force-model-policy.merged.mjs
2
-
3
- Swap the staged merged hook in for the live model-policy hook. **Do not run
4
- this casually** — the live hook governs every subagent dispatch in every
5
- session. Perform the swap between waves, not mid-fleet.
6
-
7
- Paths used below:
8
-
9
- - LIVE hook: `C:\Users\matt8\.claude\hooks\force-haiku-subagents.mjs`
10
- - STAGED file: `<aesop>\docs\spikes\tiered-cognition\force-model-policy.merged.mjs`
11
- - Shim agent def: `<aesop>\docs\spikes\tiered-cognition\aesop-cognition.example.md`
12
-
13
- ## Phase A activation (recommended first step)
14
-
15
- Default behavior after the swap: model policy identical to today, plus
16
- opus/fable-frontmatter dispatches rewritten to the message-only
17
- `aesop-cognition` shim. Sonnet specialists untouched (no prompt loss —
18
- FINDINGS.md condition 3 deferred). Layer 2 stays dormant.
19
-
20
- 1. **Install the shim agent definition** (the merged hook rewrites cognition
21
- dispatches to `subagent_type: aesop-cognition`; without the definition
22
- those dispatches would fail):
23
-
24
- ```powershell
25
- Copy-Item <aesop>\docs\spikes\tiered-cognition\aesop-cognition.example.md `
26
- C:\Users\matt8\.claude\agents\aesop-cognition.md
27
- ```
28
-
29
- Then edit the copied file's `description:` to remove the "NOT INSTALLED"
30
- sentence. Keep `tools: Agent, SendMessage, TaskStop, Monitor` and do NOT
31
- add a `model:` line (the hook passes the effective model explicitly).
32
-
33
- 2. **Back up the live hook** (timestamped, same directory):
34
-
35
- ```powershell
36
- Copy-Item C:\Users\matt8\.claude\hooks\force-haiku-subagents.mjs `
37
- C:\Users\matt8\.claude\hooks\force-haiku-subagents.mjs.bak-$(Get-Date -Format yyyyMMdd-HHmmss)
38
- ```
39
-
40
- 3. **Verify the staged file before copying** (must print `SELF-TEST: ALL PASS`,
41
- exit 0):
42
-
43
- ```powershell
44
- node --check <aesop>\docs\spikes\tiered-cognition\force-model-policy.merged.mjs
45
- node <aesop>\docs\spikes\tiered-cognition\force-model-policy.merged.mjs --self-test
46
- ```
47
-
48
- 4. **Copy over the live hook, keeping the live FILENAME** so settings.json
49
- needs no edit:
50
-
51
- ```powershell
52
- Copy-Item <aesop>\docs\spikes\tiered-cognition\force-model-policy.merged.mjs `
53
- C:\Users\matt8\.claude\hooks\force-haiku-subagents.mjs -Force
54
- ```
55
-
56
- 5. **Verify the settings matcher is unchanged and correct.** In
57
- `C:\Users\matt8\.claude\settings.json` the `hooks.PreToolUse` entry with
58
- matcher `Agent|Task` must point at
59
- `~/.claude/hooks/force-haiku-subagents.mjs` (node command). Do NOT add any
60
- other hook on that matcher — this file must remain the ONLY `updatedInput`
61
- owner for `Agent|Task`; wiring a second rewriting hook there reintroduces
62
- the exact collision this merge exists to fix.
63
-
64
- 6. **Re-run the self-test on the installed copy** (proves the copy is intact):
65
-
66
- ```powershell
67
- node C:\Users\matt8\.claude\hooks\force-haiku-subagents.mjs --self-test
68
- ```
69
-
70
- 7. **Restart.** Claude Code snapshots hook config at session start — running
71
- sessions keep the old hook until restarted. Restart the orchestrator
72
- session and any long-lived fleet sessions/daemons that dispatch subagents.
73
-
74
- 8. **Smoke-check in a fresh session:** dispatch a generic Haiku agent (expect
75
- pass/route-to-haiku, no shim), a `bash-pro` (expect claude-sonnet-5, no
76
- shim), and — if any opus/fable-frontmatter agent def is installed — one of
77
- those (expect the `⛓ … tools stripped via 'aesop-cognition' shim` system
78
- message). Confirm escape uses append to
79
- `state/MODEL-POLICY-ESCAPES.log` / `state/TIER-POLICY-ESCAPES.log`.
80
-
81
- ## Phase B (later, deliberate)
82
-
83
- Set `TIER_STRIP_SCOPE=all` in the environment Claude Code launches from to
84
- extend the shim to sonnet specialists — ONLY after per-specialist cognition
85
- variants exist (FINDINGS.md condition 3), otherwise specialist system prompts
86
- are lost to the generic shim. `TIER_STRIP_SCOPE=off` reduces the hook to pure
87
- live-hook model-policy behavior (useful as a soft rollback).
88
-
89
- ## Phase C — arming Layer 2 (call-time backstop; later, deliberate)
90
-
91
- Dormant until BOTH of these are true:
92
-
93
- 1. `TIER_ENFORCE=1` in the environment.
94
- 2. settings.json gains a second `PreToolUse` entry running this same hook file
95
- with a matcher covering the denied tools, e.g.
96
- `Read|Write|Edit|MultiEdit|NotebookEdit|Bash|PowerShell|Glob|Grep|WebFetch|WebSearch|Skill|Artifact`.
97
- (That entry never emits `updatedInput` — deny/allow only — so the
98
- single-owner rule is preserved.)
99
-
100
- Before arming: validate transcript sniffing on real sidechain transcripts and
101
- decide the main-thread carve-out (FINDINGS.md condition 2 / risk 4).
102
-
103
- ## Rollback
104
-
105
- 1. Restore the newest backup:
106
-
107
- ```powershell
108
- Copy-Item C:\Users\matt8\.claude\hooks\force-haiku-subagents.mjs.bak-<TS> `
109
- C:\Users\matt8\.claude\hooks\force-haiku-subagents.mjs -Force
110
- ```
111
-
112
- 2. Optionally remove `C:\Users\matt8\.claude\agents\aesop-cognition.md`
113
- (harmless to leave installed; nothing routes to it without the merged hook).
114
- 3. Unset `TIER_ENFORCE` / `TIER_STRIP_SCOPE` if set; remove any Layer-2
115
- matcher added in Phase C.
116
- 4. Restart running sessions (same snapshot rule as step 7 above).
117
-
118
- ## Env knobs (merged hook)
119
-
120
- | Var | Default | Effect |
121
- |---|---|---|
122
- | `FORCE_ALL_HAIKU=1` | off | Every dispatch → haiku (bash-pro excepted) — unchanged from live hook |
123
- | `TIER_STRIP_SCOPE` | `opus-fable` | `opus-fable` (Phase A) / `all` (Phase B) / `off` (model policy only) |
124
- | `TIER_ENFORCE=1` | off | Arms the Layer-2 call-time backstop (needs the Phase C matcher too) |
125
- | `AESOP_ROOT` | `~/aesop` | Root for `state/*-ESCAPES.log` audit logs |