@matt82198/aesop 0.1.0-beta.5 → 0.1.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 (198) hide show
  1. package/CHANGELOG.md +158 -5
  2. package/LICENSE +66 -21
  3. package/README.md +97 -33
  4. package/aesop.config.example.json +6 -0
  5. package/bin/CLAUDE.md +12 -3
  6. package/bin/cli.js +211 -40
  7. package/daemons/CLAUDE.md +1 -1
  8. package/daemons/backup-fleet.sh +209 -51
  9. package/daemons/run-watchdog.sh +208 -62
  10. package/dash/dash-extra.mjs +73 -4
  11. package/dash/watchdog-gui.sh +41 -35
  12. package/docs/ARCHITECTURE.md +296 -0
  13. package/docs/CONCEPTS.md +254 -0
  14. package/docs/CONFIGURE.md +256 -0
  15. package/docs/FIRST-WAVE.md +276 -0
  16. package/docs/INSTALL.md +224 -0
  17. package/docs/README.md +176 -27
  18. package/docs/autonomous-swe.md +149 -0
  19. package/docs/reproduce.md +121 -0
  20. package/hooks/CLAUDE.md +28 -0
  21. package/hooks/install-waveguard.sh +68 -0
  22. package/hooks/pre-commit-waveguard.sh +26 -0
  23. package/hooks/pre-push-policy.sh +253 -15
  24. package/monitor/CLAUDE.md +3 -3
  25. package/monitor/collect-signals.mjs +133 -20
  26. package/package.json +15 -7
  27. package/scan/CLAUDE.md +30 -0
  28. package/skills/CLAUDE.md +1 -0
  29. package/state_store/ingest.py +18 -1
  30. package/state_store/projections.py +78 -4
  31. package/state_store/store.py +102 -7
  32. package/tools/CLAUDE.md +25 -18
  33. package/tools/alert_bridge.py +14 -10
  34. package/tools/bench_runner.py +438 -0
  35. package/tools/buildlog.py +4 -7
  36. package/tools/ci_merge_wait.py +215 -34
  37. package/tools/common.py +62 -0
  38. package/tools/cost_ceiling.py +191 -0
  39. package/tools/dash.js +102 -0
  40. package/tools/doctor.js +220 -0
  41. package/tools/fleet_ledger.py +189 -17
  42. package/tools/halt.py +172 -0
  43. package/tools/healthcheck.py +24 -21
  44. package/tools/heartbeat.py +4 -7
  45. package/tools/metrics_gate.py +8 -2
  46. package/tools/orchestrator_status.py +4 -9
  47. package/tools/reconcile.py +277 -0
  48. package/tools/rotate_logs.py +152 -62
  49. package/tools/scanner_selftest.py +28 -3
  50. package/tools/secret_scan.py +359 -90
  51. package/tools/self_stats.py +292 -4
  52. package/tools/status.js +187 -0
  53. package/tools/verify_agent_inspector.py +289 -0
  54. package/tools/verify_prboard.py +344 -0
  55. package/tools/watch.js +49 -0
  56. package/ui/CLAUDE.md +2 -0
  57. package/ui/agents.py +332 -33
  58. package/ui/api/tracker.py +15 -7
  59. package/ui/collectors.py +125 -32
  60. package/ui/config.py +22 -2
  61. package/ui/cost.py +98 -3
  62. package/ui/csrf.py +2 -1
  63. package/ui/handler.py +209 -21
  64. package/ui/sse.py +102 -16
  65. package/ui/wave_prs.py +230 -0
  66. package/ui/web/dist/assets/index-0qQYnvMC.js +9 -0
  67. package/ui/web/dist/assets/index-BdIlFieV.css +1 -0
  68. package/ui/web/dist/index.html +2 -2
  69. package/monitor/.signal-state.json +0 -3
  70. package/monitor/ACTIONS.log +0 -1
  71. package/monitor/BRIEF.md +0 -24
  72. package/monitor/SIGNALS.json +0 -54
  73. package/state_store/__pycache__/__init__.cpython-314.pyc +0 -0
  74. package/state_store/__pycache__/api.cpython-314.pyc +0 -0
  75. package/state_store/__pycache__/export.cpython-314.pyc +0 -0
  76. package/state_store/__pycache__/ingest.cpython-314.pyc +0 -0
  77. package/state_store/__pycache__/projections.cpython-314.pyc +0 -0
  78. package/state_store/__pycache__/store.cpython-314.pyc +0 -0
  79. package/tools/__pycache__/alert_bridge.cpython-314.pyc +0 -0
  80. package/tools/__pycache__/buildlog.cpython-314.pyc +0 -0
  81. package/tools/__pycache__/ci_merge_wait.cpython-314.pyc +0 -0
  82. package/tools/__pycache__/ensure_state.cpython-314.pyc +0 -0
  83. package/tools/__pycache__/eod_sweep.cpython-314.pyc +0 -0
  84. package/tools/__pycache__/fleet_ledger.cpython-314.pyc +0 -0
  85. package/tools/__pycache__/fleet_prompt_extractor.cpython-314.pyc +0 -0
  86. package/tools/__pycache__/healthcheck.cpython-314.pyc +0 -0
  87. package/tools/__pycache__/heartbeat.cpython-314.pyc +0 -0
  88. package/tools/__pycache__/inbox_drain.cpython-314.pyc +0 -0
  89. package/tools/__pycache__/launch_tui.cpython-314.pyc +0 -0
  90. package/tools/__pycache__/metrics_gate.cpython-314.pyc +0 -0
  91. package/tools/__pycache__/orchestrator_status.cpython-314.pyc +0 -0
  92. package/tools/__pycache__/power_selftest.cpython-314.pyc +0 -0
  93. package/tools/__pycache__/prepublish_scan.cpython-314.pyc +0 -0
  94. package/tools/__pycache__/rotate_logs.cpython-314.pyc +0 -0
  95. package/tools/__pycache__/scanner_selftest.cpython-314.pyc +0 -0
  96. package/tools/__pycache__/secret_scan.cpython-314.pyc +0 -0
  97. package/tools/__pycache__/self_stats.cpython-314.pyc +0 -0
  98. package/tools/__pycache__/session_usage_summary.cpython-314.pyc +0 -0
  99. package/tools/__pycache__/stall_check.cpython-314.pyc +0 -0
  100. package/tools/__pycache__/transcript_replay.cpython-314.pyc +0 -0
  101. package/tools/__pycache__/transcript_timeline.cpython-314.pyc +0 -0
  102. package/tools/__pycache__/verify_dash.cpython-314.pyc +0 -0
  103. package/tools/__pycache__/verify_submit_encoding.cpython-314.pyc +0 -0
  104. package/ui/__pycache__/agents.cpython-314.pyc +0 -0
  105. package/ui/__pycache__/collectors.cpython-314.pyc +0 -0
  106. package/ui/__pycache__/config.cpython-314.pyc +0 -0
  107. package/ui/__pycache__/cost.cpython-314.pyc +0 -0
  108. package/ui/__pycache__/csrf.cpython-314.pyc +0 -0
  109. package/ui/__pycache__/handler.cpython-314.pyc +0 -0
  110. package/ui/__pycache__/render.cpython-314.pyc +0 -0
  111. package/ui/__pycache__/serve.cpython-314.pyc +0 -0
  112. package/ui/__pycache__/sse.cpython-314.pyc +0 -0
  113. package/ui/api/__pycache__/__init__.cpython-314.pyc +0 -0
  114. package/ui/api/__pycache__/submit.cpython-314.pyc +0 -0
  115. package/ui/api/__pycache__/tracker.cpython-314.pyc +0 -0
  116. package/ui/web/.gitattributes +0 -13
  117. package/ui/web/dist/assets/index-2LZDQirC.js +0 -9
  118. package/ui/web/dist/assets/index-D4M1qyOv.css +0 -1
  119. package/ui/web/index.html +0 -13
  120. package/ui/web/package-lock.json +0 -2225
  121. package/ui/web/package.json +0 -26
  122. package/ui/web/src/App.test.tsx +0 -74
  123. package/ui/web/src/App.tsx +0 -142
  124. package/ui/web/src/CONTRIBUTING-UI.md +0 -49
  125. package/ui/web/src/components/AgentRow.css +0 -187
  126. package/ui/web/src/components/AgentRow.test.tsx +0 -209
  127. package/ui/web/src/components/AgentRow.tsx +0 -207
  128. package/ui/web/src/components/AgentsPanel.css +0 -108
  129. package/ui/web/src/components/AgentsPanel.test.tsx +0 -41
  130. package/ui/web/src/components/AgentsPanel.tsx +0 -58
  131. package/ui/web/src/components/AlertsPanel.css +0 -88
  132. package/ui/web/src/components/AlertsPanel.test.tsx +0 -51
  133. package/ui/web/src/components/AlertsPanel.tsx +0 -67
  134. package/ui/web/src/components/BacklogPanel.test.tsx +0 -126
  135. package/ui/web/src/components/BacklogPanel.tsx +0 -122
  136. package/ui/web/src/components/CostChart.css +0 -110
  137. package/ui/web/src/components/CostChart.test.tsx +0 -144
  138. package/ui/web/src/components/CostChart.tsx +0 -152
  139. package/ui/web/src/components/CostTable.css +0 -93
  140. package/ui/web/src/components/CostTable.test.tsx +0 -165
  141. package/ui/web/src/components/CostTable.tsx +0 -94
  142. package/ui/web/src/components/EventsFeed.css +0 -68
  143. package/ui/web/src/components/EventsFeed.test.tsx +0 -36
  144. package/ui/web/src/components/EventsFeed.tsx +0 -31
  145. package/ui/web/src/components/HealthHeader.css +0 -137
  146. package/ui/web/src/components/HealthHeader.test.tsx +0 -278
  147. package/ui/web/src/components/HealthHeader.tsx +0 -281
  148. package/ui/web/src/components/InboxForm.css +0 -135
  149. package/ui/web/src/components/InboxForm.test.tsx +0 -208
  150. package/ui/web/src/components/InboxForm.tsx +0 -116
  151. package/ui/web/src/components/MessagesTail.module.css +0 -144
  152. package/ui/web/src/components/MessagesTail.test.tsx +0 -176
  153. package/ui/web/src/components/MessagesTail.tsx +0 -94
  154. package/ui/web/src/components/ReposPanel.css +0 -90
  155. package/ui/web/src/components/ReposPanel.test.tsx +0 -45
  156. package/ui/web/src/components/ReposPanel.tsx +0 -67
  157. package/ui/web/src/components/Scorecard.css +0 -106
  158. package/ui/web/src/components/Scorecard.test.tsx +0 -117
  159. package/ui/web/src/components/Scorecard.tsx +0 -85
  160. package/ui/web/src/components/Timeline.module.css +0 -151
  161. package/ui/web/src/components/Timeline.test.tsx +0 -215
  162. package/ui/web/src/components/Timeline.tsx +0 -99
  163. package/ui/web/src/components/TrackerBoard.test.tsx +0 -121
  164. package/ui/web/src/components/TrackerBoard.tsx +0 -107
  165. package/ui/web/src/components/TrackerCard.test.tsx +0 -180
  166. package/ui/web/src/components/TrackerCard.tsx +0 -160
  167. package/ui/web/src/components/TrackerForm.test.tsx +0 -189
  168. package/ui/web/src/components/TrackerForm.tsx +0 -144
  169. package/ui/web/src/lib/api.ts +0 -218
  170. package/ui/web/src/lib/format.test.ts +0 -89
  171. package/ui/web/src/lib/format.ts +0 -103
  172. package/ui/web/src/lib/sanitizeUrl.test.ts +0 -84
  173. package/ui/web/src/lib/sanitizeUrl.ts +0 -38
  174. package/ui/web/src/lib/types.ts +0 -230
  175. package/ui/web/src/lib/useHashRoute.test.ts +0 -60
  176. package/ui/web/src/lib/useHashRoute.ts +0 -23
  177. package/ui/web/src/lib/useSSE.ts +0 -175
  178. package/ui/web/src/main.tsx +0 -10
  179. package/ui/web/src/styles/global.css +0 -179
  180. package/ui/web/src/styles/theme.css +0 -184
  181. package/ui/web/src/styles/work.css +0 -572
  182. package/ui/web/src/test/fixtures.ts +0 -385
  183. package/ui/web/src/test/setup.ts +0 -49
  184. package/ui/web/src/views/Activity.module.css +0 -43
  185. package/ui/web/src/views/Activity.test.tsx +0 -89
  186. package/ui/web/src/views/Activity.tsx +0 -31
  187. package/ui/web/src/views/Cost.css +0 -87
  188. package/ui/web/src/views/Cost.test.tsx +0 -142
  189. package/ui/web/src/views/Cost.tsx +0 -54
  190. package/ui/web/src/views/Overview.css +0 -51
  191. package/ui/web/src/views/Overview.test.tsx +0 -76
  192. package/ui/web/src/views/Overview.tsx +0 -46
  193. package/ui/web/src/views/Work.test.tsx +0 -82
  194. package/ui/web/src/views/Work.tsx +0 -79
  195. package/ui/web/src/vite-env.d.ts +0 -10
  196. package/ui/web/tsconfig.json +0 -22
  197. package/ui/web/vite.config.ts +0 -25
  198. package/ui/web/vitest.config.ts +0 -12
package/CHANGELOG.md CHANGED
@@ -7,11 +7,164 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
- ### Added (Wave-16/17 in-flight)
11
- - CLAUDE.md minimization and domain map refinements (PR #151).
12
- - Isolation detector and machinery/scripts port (PR #150).
13
- - MCP server and scan/ directory shipping in npm package.
14
- - README stats refresh and agent-catalog reference.
10
+ ## [0.1.0] - 2026-07-17
11
+
12
+ First stable release. This is the graduation of `0.1.0-rc.1` to a stable version with the
13
+ same feature set no code changes beyond the version/documentation promotion. It publishes to
14
+ npm under the `latest` dist-tag. Highlights carried from rc.1: verified Opus audit (0
15
+ hallucinated findings), kill-switch wired into the live dispatch path, cost-ceiling guardrail,
16
+ a measured held-out benchmark (39 judgment tasks, Haiku on par with Opus at ~1/3 the cost),
17
+ the state-reconcile primitive, browser-proven dashboard views (Wave PR Board + Agent
18
+ Inspector), a source-available license, and a slim, reproducible ~409 kB npm package. See the
19
+ [0.1.0-rc.1] entry below for the full itemized list, and RELEASE-NOTES.md for the honest-limits
20
+ account (small-N benchmark, cost-ceiling not yet tied to live token spend, local-first).
21
+
22
+ ## [0.1.0-rc.1] - 2026-07-17
23
+
24
+ First release candidate. The dispatch-model claims are now backed by measurement, the
25
+ kill-switch and cost-ceiling are wired into the live dispatch path and proven, and the npm
26
+ package ships slim and reproducible from a clean clone.
27
+
28
+ ### Added
29
+ - **Verified Opus audit** (wave.26): Full release audit run with adversarial verification — 0 hallucinated findings, closing out the all-Haiku severity-inflation risk (wave-24: 4 reported P0s, 0 real).
30
+ - **Kill-switch wired into dispatch** (wave.27): Fleet-wide halt control is now wired into the dispatch path and proven end-to-end — an operator can stop all agents from a single signal.
31
+ - **Cost-ceiling guardrail** (wave.27): Per-wave spend ceiling halts dispatch when the configured budget is exceeded.
32
+ - **Held-out benchmark measured** (wave.28): Real offline benchmark scorer (`tools/bench_runner.py`) over a held-out ground-truth set of 39 judgment tasks — Haiku scores on par with Opus at roughly 1/3 the cost, replacing the previously illustrative numbers.
33
+ - **State-reconcile primitive** (wave.29): A reconcile primitive compares tracker state against shipped work so already-done items are not re-dispatched at wave open.
34
+ - **Reproduce-from-clean-clone CI** (wave.30): CI job builds and validates the package from a fresh clone, proving the tarball is reproducible and self-contained.
35
+ - **Wave PR Board** (wave.31): Dashboard view aggregating per-wave PR status for at-a-glance merge-train visibility (browser-proven).
36
+ - **Agent Inspector** (wave.31): Drill-down dashboard view exposing individual agent transcripts, cost, and lifecycle (browser-proven).
37
+
38
+ ### Changed
39
+ - **npm package slimmed** (wave.30): Package trimmed to ~400 kB by excluding UI source and node_modules; only built artifacts (`ui/web/dist/`), Python, tools, and docs ship.
40
+ - **Adversarially-verified audits** (wave.25): Full audits now verify Haiku-reported findings before scheduling fixes.
41
+ - **Tracker reconciliation at wave open** (wave.29): Wave startup reconciles the tracker against shipped work so already-done items are not re-dispatched.
42
+
43
+ ### Fixed
44
+ - **CI docs-only deadlock** (wave.30): Broke a docs-gate deadlock that could mask HEAD failures in the CI pipeline.
45
+ - **Waveguard worktree marker resolution** (#165): Fixed pre-commit hook to resolve marker to current worktree instead of hardcoded primary tree path (wave-24 fleet-block incident).
46
+
47
+ ### Tests
48
+ - **Waveguard regression test** (#165): Added Test 7 to prove worktree commits pass while primary tree writes remain blocked by waveguard (wave-24 regression).
49
+
50
+ ## [0.1.0-wave.23] - 2026-07-15
51
+
52
+ ### Added
53
+ - **Adopter-focused documentation restructure** (#164): Reorganized docs into adopter journey with architecture diagram (Mermaid) to improve onboarding clarity.
54
+ - **Runtime CLI subcommands** (#164): Added `aesop watch`, `aesop dash`, and `aesop status` to CLI for real-time fleet monitoring.
55
+ - **Pre-commit waveguard hook** (#164): New write-guard hook prevents stray primary-tree writes during active wave builds; blocks commits outside worktrees.
56
+
57
+ ### Fixed
58
+ - **Tracker projection snapshotting** (#164): Fixed O(n²) replay latency in tracker-snapshotting by caching projection state (wave-19 P2).
59
+ - **Log rotation race condition** (#164): Made `rotate_logs` atomic to prevent concurrent write race when logs exceed size limits.
60
+ - **Dashboard transcript cache** (#164): Optimized `dash-extra.mjs` by caching transcript metadata (path, size, mtime) to reduce redundant reads.
61
+ - **Monitor signal deduplication** (#164): Eliminated double-read of SECURITY-ALERTS.log in monitor signal collector to reduce noise.
62
+
63
+ ### Documentation
64
+ - **Architecture diagram** (#164): Added Mermaid diagram showing fleet machinery layers (orchestrator → monitor → daemons → state).
65
+ - **Adopter journey** (#164): Restructured README and docs to guide new adopters through setup → operations → troubleshooting workflows.
66
+
67
+ ## [0.1.0-wave.22] - 2026-07-15
68
+
69
+ ### Added
70
+ - **GitHub docs overhaul** (#163): Complete README rewrite with "Why Aesop?" problem statement and architectural overview for discoverability.
71
+ - **Aesop doctor preflight** (#163): New `aesop doctor` subcommand validates configuration, hooks, and state-store health before running waves.
72
+ - **Self-building stats automation** (#163): Extended `self_stats.py` to regenerate `stats.json` and detect README stats drift; auto-regenerate in CI.
73
+ - **TypeScript type safety** (#163): Added `tsc --noEmit` CI gate to catch UI type errors before merge.
74
+
75
+ ### Changed
76
+ - **Stats drift enforcement** (#163): README stats block now auto-reconciled by CI; stale stats block push gate enforces freshness.
77
+
78
+ ### Fixed
79
+ - **TypeScript compiler warnings** (#163): Resolved unused variable and type mismatch warnings in UI layer.
80
+
81
+ ### Documentation
82
+ - **README landing rewrite** (#163): Replaced generic boilerplate with concrete "Why Aesop exists" section explaining multi-agent durability and cost optimization.
83
+ - **CHANGELOG reconciliation** (#163): Added missing wave 16-20 dated entries and reorganized unreleased backlog to reflect actual shipped state.
84
+
85
+ ## [0.1.0-wave.21] - 2026-07-15
86
+
87
+ ### Added
88
+ - **CI performance optimization** (#161): Implemented path-based build filters to skip CI on docs-only changes; added Python test parallelization for faster feedback.
89
+ - **Fleet ledger instrumentation** (#161): Added phase and wave tagging to cost ledger for better fleet operations analytics and wave closure reporting.
90
+
91
+ ### Changed
92
+ - **CI trigger-level filtering** (#161): Removed `paths-ignore` from trigger layer (was silently blocking required checks) and moved filtering to job level for correctness.
93
+
94
+ ### Fixed
95
+ - **Python test parallelization** (#161): Parallel test runner now properly isolates test fixtures and state to prevent race conditions.
96
+
97
+ ### Documentation
98
+ - **CI filtering best practices** (#161): Documented correct pattern for docs-only CI bypass (job-level, not trigger-level, to preserve required-check semantics).
99
+
100
+ ## [0.1.0-wave.20] - 2026-07-15
101
+
102
+ ### Added
103
+ - **Fail-closed push gate** (#160): Secret-scan gate now blocks pushes on timeout, preventing silent failures that allow commits to bypass scanning.
104
+ - **UI liveness improvements** (#160): Enhanced SSE cost collection and HealthHeader status display with better timeout handling.
105
+ - **CI state classification** (#160): Improved `ci_merge_wait` handling to distinguish real CI status (success/failure) from temporary waits.
106
+ - **Daemon portability fixes** (#160): Fixed `backup-fleet` and `run-watchdog` for Linux CI environments (path handling, process detection).
107
+ - **Host normalization** (#160): Added consistent URL normalization in UI handler and monitor collectors to reduce false positives.
108
+ - **Monitor cursor improvements** (#160): Enhanced monitor signal collection with better state tracking and recovery.
109
+
110
+ ### Documentation
111
+ - **Currency updates** (#160): README and docs refresh for wave 20 machinery improvements.
112
+
113
+ ### Fixed
114
+ - **UI handler robustness** (#160): Improved error handling in SSE cost collection and API state rendering.
115
+ - **Test harness** (#160): Additional coverage for CI merge state handling and daemon portability.
116
+
117
+ ## [0.1.0-wave.19] - 2026-07-15
118
+
119
+ ### Added
120
+ - **Secret-scan range push gate** (#165): Enhanced push hook with per-range verification to block partial/corrupted scans and prevent silent gate bypasses.
121
+ - **Host-header guard** (#163): HTTP host validation in UI handler to prevent header injection attacks.
122
+ - **CI merge classification** (#162): `ci_merge_wait` now distinguishes real CI status (success/failure) vs temporary waits, improving integration reliability.
123
+ - **Scaffolder manifest completeness** (#161): All 10 template directories (state_store, skills, mcp, scan) verified in npm package; consistent onboarding experience.
124
+ - **UI collector efficiency** (#164): Optimized agent and cost data collection for better freshness and reduced polling overhead; improved SSE contract.
125
+ - **Stall-check test rewrite** (#160): Migrated bare test functions to unittest.TestCase for CI compatibility and better failure reporting.
126
+ - **npm publish OIDC diagnostics** (#158): Self-diagnosing workflow for OIDC token generation and npm publish reliability.
127
+
128
+ ## [0.1.0-wave.18] - 2026-07-15
129
+
130
+ ### Added
131
+ - **Comprehensive audit fixes**: 8-lens security, correctness, a11y, density, shippability, docs, and tools audit with 13 targeted fixes.
132
+ - **Watchdog robustness** (#155): Improved `backup-fleet` and `run-watchdog` daemon stability with better error handling and signal detection.
133
+ - **Pre-push policy hardening** (#155): Enhanced branch protection and secret-scan enforcement in hook execution.
134
+ - **Config management** (#155): Improved aesop.config.json parsing and CLI handling for reliability.
135
+ - **State store hardening** (#155): Fixed concurrency edge cases, improved error recovery, and validated persistence.
136
+
137
+ ### Fixed
138
+ - **Security gates** (#155): Fixed secret-scan coverage gaps (node_modules, dynamic content); improved push hook reliability.
139
+ - **a11y and UI hardening** (#155): Fixed contrast, keyboard navigation, and state-update timing issues.
140
+ - **Test infrastructure** (#155): Added comprehensive test coverage for daemons, state store, SSE reliability, UI hardening, and tools.
141
+
142
+ ## [0.1.0-wave.17] - 2026-07-15
143
+
144
+ ### Added
145
+ - **Fleet-ops templates** (#153): Example documents for fleet analysis, recommendations, and proposal tracking to guide operations workflows.
146
+ - **Tools suite expansion** (#153): New Python and Node tools for fleet operations:
147
+ - `transcript_replay.py`: Replay agent transcripts with event timing
148
+ - `transcript_timeline.py`: Extract and visualize agent activity timelines
149
+ - `fleet_prompt_extractor.py`: Extract and categorize fleet prompts for analysis
150
+ - `svg_to_png.mjs`: Convert SVG charts to PNG for documentation
151
+ - `session_usage_summary.py`: Aggregate session token usage across fleet
152
+ - **CI merge wait improvements** (#153): Enhanced `ci_merge_wait` detection with better status classification.
153
+ - **Machinery port** (#153): Completed isolation violation detector, health checks, and signal collection for orchestration monitor.
154
+ - **Shippability fixes** (#153): Fixed daemon portability and improved bootstrap process.
155
+
156
+ ### Documentation
157
+ - **Fleet-ops guidance** (#153): Added templates and examples for monitoring, analysis, and recommendations workflows.
158
+
159
+ ## [0.1.0-wave.16] - 2026-07-15
160
+
161
+ ### Added
162
+ - **Isolation-violation detector** (#152): Monitor now detects and reports when worktrees modify shared state (repository contamination checker).
163
+ - **Monitor signal collection** (#152): Enhanced `collect-signals.mjs` with isolation detection and improved signal accuracy.
164
+
165
+ ### Documentation
166
+ - **CLAUDE.md minimization** (#151): Streamlined domain-specific documentation; archived cancelled tiered-cognition spike; improved maintainability.
167
+ - **Domain map refinement** (#151): Clarified tool, test, and UI layer responsibilities and ownership.
15
168
 
16
169
  ## [0.1.0-beta.5] - 2026-07-15
17
170
 
package/LICENSE CHANGED
@@ -1,21 +1,66 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Matt Culliton
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ Copyright 2026 Matt Culliton
2
+
3
+ Licensed under the PolyForm Strict License 1.0.0.
4
+ The full license text follows.
5
+
6
+ ---
7
+
8
+ # PolyForm Strict License 1.0.0
9
+
10
+ <https://polyformproject.org/licenses/strict/1.0.0>
11
+
12
+ ## Acceptance
13
+
14
+ In order to get any license under these terms, you must agree to them as both strict obligations and conditions to all your licenses.
15
+
16
+ ## Copyright License
17
+
18
+ The licensor grants you a copyright license for the software to do everything you might do with the software that would otherwise infringe the licensor's copyright in it for any permitted purpose, other than distributing the software or making changes or new works based on the software.
19
+
20
+ ## Patent License
21
+
22
+ The licensor grants you a patent license for the software that covers patent claims the licensor can license, or becomes able to license, that you would infringe by using the software.
23
+
24
+ ## Noncommercial Purposes
25
+
26
+ Any noncommercial purpose is a permitted purpose.
27
+
28
+ ## Personal Uses
29
+
30
+ Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, is use for a permitted purpose.
31
+
32
+ ## Noncommercial Organizations
33
+
34
+ Use by any charitable organization, educational institution, public research organization, public safety or health organization, environmental protection organization, or government institution is use for a permitted purpose regardless of the source of funding or obligations resulting from the funding.
35
+
36
+ ## Fair Use
37
+
38
+ You may have "fair use" rights for the software under the law. These terms do not limit them.
39
+
40
+ ## No Other Rights
41
+
42
+ These terms do not allow you to sublicense or transfer any of your licenses to anyone else, or prevent the licensor from granting licenses to anyone else. These terms do not imply any other licenses.
43
+
44
+ ## Patent Defense
45
+
46
+ If you make any written claim that the software infringes or contributes to infringement of any patent, your patent license for the software granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company.
47
+
48
+ ## Violations
49
+
50
+ The first time you are notified in writing that you have violated any of these terms, or done anything with the software not covered by your licenses, your licenses can nonetheless continue if you come into full compliance with these terms, and take practical steps to correct past violations, within 32 days of receiving notice. Otherwise, all your licenses end immediately.
51
+
52
+ ## No Liability
53
+
54
+ ***As far as the law allows, the software comes as is, without any warranty or condition, and the licensor will not be liable to you for any damages arising out of these terms or the use or nature of the software, under any kind of legal claim.***
55
+
56
+ ## Definitions
57
+
58
+ The **licensor** is the individual or entity offering these terms, and the **software** is the software the licensor makes available under these terms.
59
+
60
+ **You** refers to the individual or entity agreeing to these terms.
61
+
62
+ **Your company** is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all organizations that have control over, are under the control of, or are under common control with that organization. **Control** means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect.
63
+
64
+ **Your licenses** are all the licenses granted to you for the software under these terms.
65
+
66
+ **Use** means anything you do with the software requiring one of your licenses.
package/README.md CHANGED
@@ -7,15 +7,56 @@
7
7
  </p>
8
8
 
9
9
  <p align="center">
10
- <a href="https://www.npmjs.com/package/@matt82198/aesop"><img src="https://img.shields.io/npm/v/@matt82198/aesop/beta" alt="npm"></a>
11
- <a href="LICENSE"><img src="https://img.shields.io/npm/l/@matt82198/aesop" alt="license"></a>
12
10
  <a href="https://github.com/matt82198/aesop/actions/workflows/ci.yml"><img src="https://github.com/matt82198/aesop/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
11
+ <a href="https://www.npmjs.com/package/@matt82198/aesop"><img src="https://img.shields.io/npm/v/@matt82198/aesop" alt="npm"></a>
12
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-PolyForm%20Strict%201.0.0-orange.svg" alt="License: PolyForm Strict 1.0.0 (source-available)"></a>
13
13
  </p>
14
14
 
15
- **Aesop** is an open-source orchestration harness for Claude Code that builds itself. It runs a `/buildsystem` wave cycle—ranking a backlog, fanning out parallel Haiku agents (1/3 the cost of Opus), watchdogging them, verifying merges, then feeding the next wave via audit + ideation + fleet-ops monitoring. **This repo's own PRs are built by Aesop's own loop.** Dogfooding, not doctrine.
15
+ **Aesop** is a source-available orchestration harness for Claude Code that builds itself. It runs a `/buildsystem` wave cycle—ranking a backlog, fanning out parallel Haiku agents (1/3 the cost of Sonnet, 1/5 the cost of Opus), watchdogging them, verifying merges, then feeding the next wave via audit + ideation + fleet-ops monitoring. **This repo's own PRs are built by Aesop's own loop.** Dogfooding, not doctrine.
16
+
17
+ As of **0.1.0**, that loop has carried the project to an installable, tested, audited, and benchmarked stable release—the fleet running the wave loop on its own, under a human who sets goals and owns the outward gates. The claims below are backed by committed artifacts you can check, not adjectives. See [Milestone: it shipped itself](#milestone-it-shipped-itself-010-rc1).
16
18
 
17
19
  What you get: **cost-optimized multi-agent dispatch** (Haiku-first subagents, lean orchestrator), **durable state** (git-committed checkpoints survive wipes), **observable machinery** (every agent run logged, every cost tracked), **live dashboard** (real-time fleet health at http://localhost:8770), and **security gates** (secret-scan blocks pushes, CI validates each merge).
18
20
 
21
+ ## Milestone: it shipped itself (0.1.0-rc.1)
22
+
23
+ Aesop reached its first release candidate by running its own wave loop—**audit → parallel build → verify → merge-train**—across the backlog that produced it. This is the version where the load-bearing claims stopped being illustrations and became measurements. The word "autonomous" has a precise, deliberately narrow meaning here.
24
+
25
+ **What "autonomous" means here (and what it doesn't).** The *fleet* autonomously runs the wave loop: it ranks work, dispatches parallel Haiku workers on file-disjoint domains, verifies merges, and feeds the next wave from a closing audit. A *human* sets the goals and owns every outward gate—npm publish, tagged releases, and history rewrites all stay human-approved. It is a supervised loop, not an unsupervised agent, and not AGI. The true model-dispatch core runs inside the Claude Code harness, which lives outside this repo; what ships here is the harness around it—orchestration, guardrails, dashboard, and tooling.
26
+
27
+ The differentiator is not "an AI wrote code." It's that the credibility and safety claims come with receipts:
28
+
29
+ | Claim | Evidence (committed, checkable) | Honest caveat |
30
+ | --- | --- | --- |
31
+ | **Haiku is good enough for fleet judgment** | Across 39 held-out judgment tasks, Haiku scored **39/39** vs Opus **38/39** at ~1/3 the per-token cost — measured by a plain-Python scorer with no model in the grading loop. See [`bench/results/`](./bench/results/). | Curated set, **not** sampled from real fleet transcripts (N=39). The benchmark found *no* task where Opus beats Haiku — so it proves sufficiency for these shapes, not parity at the reasoning frontier. |
32
+ | **Audits don't hallucinate findings** | A full release audit was run with adversarial verification of every finding: **0 hallucinated issues**, closing the prior all-Haiku severity-inflation risk. | An internal audit, not a third-party one. |
33
+ | **Kill-switch actually stops the fleet** | The fleet-wide halt is wired into the live dispatch path and proven end-to-end — one signal **aborted a real wave with zero workers spawned**. See [`tools/halt.py`](./tools/halt.py). | Operator-triggered; it is a manual brake, not an autonomous safety monitor. |
34
+ | **A cost ceiling brakes runaway spend** | Dispatch halts when a per-wave budget is exceeded. See [`tools/cost_ceiling.py`](./tools/cost_ceiling.py). | A brake on a *configured* ceiling, **not yet tied to live token spend**. |
35
+ | **The package installs and reproduces** | A **~409 kB** npm tarball (measured via `npm pack`) builds and validates from a fresh clone in CI. See [docs/reproduce.md](./docs/reproduce.md). | UI browser-proofs (Playwright) and real-model runs need local setup / API keys; they don't run in the offline reproduce job. |
36
+
37
+ **Nobody outside this project has reproduced these results yet.** The evidence is committed so a skeptical reader can check it — that transparency is the point, not a substitute for independent replication. For the full, unhedged account of what is and isn't proven, read [docs/autonomous-swe.md](./docs/autonomous-swe.md) and the ["Honest limits" section of the release notes](./RELEASE-NOTES.md#honest-limits).
38
+
39
+ ## Why Aesop?
40
+
41
+ Multi-agent AI fleets hit a wall: all-Opus orchestrators cost $10k+ per wave, and machine crashes lose state—losing work and context on restart. Aesop solves both: **Haiku-first** dispatch cuts costs to 1/3 of Opus, and **git-committed state** (STATE.md, BUILDLOG.md) survives machine wipes with zero data loss. See the wave cycle below: ranked backlog → parallel worktree-isolated fleet → merge train → checkpoint → audit feeds next wave.
42
+
43
+ ```
44
+ ranked backlog
45
+
46
+ parallel haiku fleet (worktree-isolated)
47
+ [test] [build] [docs] [ui] [review] ...
48
+
49
+ integration-branch merge train
50
+
51
+ checkpoint (STATE.md + BUILDLOG.md)
52
+
53
+ audit + fleet-ops monitoring
54
+
55
+ (feeds next wave's backlog)
56
+ ```
57
+
58
+ (See [assets/wave-cycle-diagram.txt](./assets/wave-cycle-diagram.txt) for the cycle reference.)
59
+
19
60
  ## What You Get
20
61
 
21
62
  - **Parallel Haiku fleets** — Cheap, scoped subagents dispatch in parallel; orchestrator stays lean on main thread.
@@ -24,15 +65,17 @@ What you get: **cost-optimized multi-agent dispatch** (Haiku-first subagents, le
24
65
  - **Self-healing watchdog** — Runs every 150s: backs up work, scans for secrets, detects drift, restores on reboot.
25
66
  - **Live web dashboard** — Real-time fleet health, security alerts, work-item kanban at `http://localhost:8770`.
26
67
  - **Secret-scan gates** — Pre-push hook blocks leaks; audit trail logged. Pair with GitHub branch protection for enforcement.
68
+ - **Read-only MCP Fleet Server** — Expose fleet status, active agents, work items, and cost metrics to Claude Code (fleet_status, fleet_agents, fleet_tracker, fleet_cost tools). See [mcp/CLAUDE.md](./mcp/CLAUDE.md) for setup.
69
+ - **Self-diagnosing npm publish** — OIDC token generation and publish reliability verified on each release; workflow surfaces diagnostics inline.
27
70
 
28
71
  ## Get Started (3 steps, 5 min)
29
72
 
30
- **Note:** Aesop is in beta. Install the `@beta` tag for the latest prerelease (0.1.0-beta.1+).
73
+ **Note:** Aesop's first stable release is `0.1.0`, published to npm under the `latest` tag a plain `npx @matt82198/aesop` or `npm install @matt82198/aesop` pulls it. Earlier prereleases remain available under the `@rc` and `@beta` tags.
31
74
 
32
75
  ### Quickest path: npx scaffold
33
76
 
34
77
  ```bash
35
- npx @matt82198/aesop@beta my-fleet \
78
+ npx @matt82198/aesop my-fleet \
36
79
  --name "my-api" \
37
80
  --repos "/path/to/repo1,/path/to/repo2"
38
81
  cd my-fleet
@@ -70,7 +113,7 @@ orchestrator (via Claude Code) Reads backlog, dispatches Haiku subagents in par
70
113
 
71
114
  parallel Haiku fleet Tiny, scoped domains (tests, build, review, docs, etc.)
72
115
 
73
- watchdog verifies & merges GREEN push to main
116
+ watchdog backs up & gates Heartbeat, secret-scan, push to backup branch; merging is orchestrator/human-driven
74
117
 
75
118
  monitor/collect-signals.mjs Audits orchestration health, feeds next wave's backlog
76
119
 
@@ -79,7 +122,7 @@ STATE.md + BUILDLOG.md Git-committed, survives machine wipes
79
122
 
80
123
  See [docs/DISPATCH-MODEL.md](./docs/DISPATCH-MODEL.md) for cost analysis and parallel patterns.
81
124
 
82
- <!-- SELF-STATS:START -->
125
+ <!-- STATS:START -->
83
126
 
84
127
  ## Aesop builds itself
85
128
 
@@ -87,30 +130,32 @@ Aesop is built entirely by its own `/buildsystem` wave cycle—running parallel
87
130
 
88
131
  | Metric | Value |
89
132
  | --- | --- |
90
- | Merged PRs | 141 <!-- metrics-verified: self_stats.py (git log) --> |
91
- | Total Commits | 377 <!-- metrics-verified: self_stats.py (git log) --> |
92
- | Project Age | 3 days <!-- metrics-verified: self_stats.py (git log) --> |
93
- | Waves | 15 <!-- metrics-verified: self_stats.py (git log) --> |
94
- | Insertions + Deletions | 70,439 <!-- metrics-verified: self_stats.py (git log) --> |
95
- | Files Tracked | 257 <!-- metrics-verified: self_stats.py (git log) --> |
96
- | Distinct Co-authors | 7 <!-- metrics-verified: self_stats.py (git log) --> |
133
+ | Merged PRs | 170 <!-- metrics-verified: self_stats.py (git log) --> |
134
+ | Total Commits | 556 <!-- metrics-verified: self_stats.py (git log) --> |
135
+ | Project Age | 5 days <!-- metrics-verified: self_stats.py (git log) --> |
136
+ | Waves | 30 <!-- metrics-verified: self_stats.py (git log) --> |
137
+ | Insertions + Deletions | 96,065 <!-- metrics-verified: self_stats.py (git log) --> |
138
+ | Files Tracked | 336 <!-- metrics-verified: self_stats.py (git log) --> |
139
+ | Distinct Co-authors | 9 <!-- metrics-verified: self_stats.py (git log) --> |
140
+
141
+ <!-- STATS:END -->
97
142
 
98
- <!-- SELF-STATS:END -->
99
143
 
100
144
  ## Recommended Agents
101
145
 
102
- Aesop pairs well with the open-source [Claude specialized-agent catalog](https://github.com/anthropics/claude-code/tree/main/agents) — a library of ~130 domain-specific agents (TDD orchestrators, security reviewers, performance engineers, etc.). For optimal results, install agents from the upstream source and pair them with Aesop's cost-optimized Haiku dispatch. This is optional; Aesop works standalone with general-purpose Claude Code agents.
146
+ Aesop pairs well with the open-source catalog of ~130 community-authored specialized agent definitions (TDD orchestrators, security reviewers, performance engineers, etc.). For optimal results, install agents from the upstream source and pair them with Aesop's cost-optimized Haiku dispatch. This is optional; Aesop works standalone with general-purpose Claude Code agents.
103
147
 
104
148
  ## Use with Claude Code
105
149
 
106
150
  If you're using **Claude Code**, invoke `/power` at the start of each session. It loads your orchestrator brain (cardinal rules, domain map, team memory, system state) and outputs a health brief. Setup once:
107
151
 
108
152
  ```bash
109
- # Copy the /power skill
153
+ # Copy the /power skill and optional /healthcheck skill
110
154
  cp -r skills/power/ ~/.claude/skills/power/
155
+ cp -r skills/healthcheck/ ~/.claude/skills/healthcheck/
111
156
  ```
112
157
 
113
- Then in Claude Code, type `/power` or `/buildsystem` to start a wave cycle. See [skills/power/SKILL.md](./skills/power/SKILL.md) for details.
158
+ Then in Claude Code, type `/power` or `/buildsystem` to start a wave cycle. Use `/healthcheck` to audit fleet machinery health before running waves. See [skills/power/SKILL.md](./skills/power/SKILL.md) and [skills/healthcheck/SKILL.md](./skills/healthcheck/SKILL.md) for details.
114
159
 
115
160
  ## Core Principles
116
161
 
@@ -150,7 +195,7 @@ Settings > Branches > main
150
195
  ✓ Restrict pushes to (Admins only)
151
196
  ```
152
197
 
153
- Private brain (`~/.claude`) is never committed to this repo. Keep `aesop.config.json` git-ignored. Implement `tools/secret_scan.py` with your security rules. See [docs/HOOK-INSTALL.md](./docs/HOOK-INSTALL.md) for setup.
198
+ **Host-header validation** in the dashboard UI handler prevents HTTP header injection attacks; all requests are validated against the configured origin. Private brain (`~/.claude`) is never committed to this repo. Keep `aesop.config.json` git-ignored. Implement `tools/secret_scan.py` with your security rules. See [docs/HOOK-INSTALL.md](./docs/HOOK-INSTALL.md) for setup.
154
199
 
155
200
  ## Dashboard (Wave-14 Rewrite)
156
201
 
@@ -200,28 +245,47 @@ The dev server proxies `/data`, `/api`, `/events`, `/agent`, `/submit` to the Py
200
245
  | Secret-scan blocks push | Add suppression to `tools/secret_scan.py`; no auto-bypass (by design) |
201
246
  | Monitor doesn't start | Verify Node.js on PATH; check `monitor/BRIEF.md` for logs |
202
247
 
203
- For deeper docs, see `docs/`:
204
- - `CARDINAL-RULES.md` — full 10 principles
205
- - `DISPATCH-MODEL.md` cost analysis and patterns
206
- - `CHECKPOINTING.md`how STATE.md + BUILDLOG.md survive wipes
207
- - `GOVERNANCE.md`AUTO/PROPOSE tiers
208
- - `case-study-portfolio.md`How Aesop built its own portfolio site; full audit trail and cost breakdown
209
-
210
- See [CHANGELOG.md](./CHANGELOG.md) for release notes.
248
+ ## Documentation
249
+
250
+ **Adopter journey** (start here):
251
+ - [docs/INSTALL.md](./docs/INSTALL.md)Install Aesop and verify setup
252
+ - [docs/CONFIGURE.md](./docs/CONFIGURE.md)Configure repos, ports, and brain root
253
+ - [docs/FIRST-WAVE.md](./docs/FIRST-WAVE.md)Run your first `/power` `/buildsystem` cycle
254
+ - [docs/CONCEPTS.md](./docs/CONCEPTS.md) — Key concepts (dispatch, state, security, governance) with links to deep dives
255
+ - [docs/ARCHITECTURE.md](./docs/ARCHITECTURE.md) System architecture diagram and components
256
+
257
+ **Operational reference**:
258
+ - [docs/HOW-THE-LOOP-WORKS.md](./docs/HOW-THE-LOOP-WORKS.md) — Concrete walkthrough of one wave cycle
259
+ - [docs/DISPATCH-MODEL.md](./docs/DISPATCH-MODEL.md) — Cost analysis, dispatch patterns, scaling
260
+ - [docs/CHECKPOINTING.md](./docs/CHECKPOINTING.md) — STATE.md + BUILDLOG.md lifecycle, recovery on wipe
261
+ - [docs/CARDINAL-RULES.md](./docs/CARDINAL-RULES.md) — 10 foundational principles
262
+ - [docs/GOVERNANCE.md](./docs/GOVERNANCE.md) — Single-writer files, heartbeat protocol, AUTO/PROPOSE tiers
263
+ - [docs/RELIABILITY.md](./docs/RELIABILITY.md) — Reliability guarantees, pride bar, inputs-always-outputs
264
+ - [docs/HOOK-INSTALL.md](./docs/HOOK-INSTALL.md) — Secret-scan and branch protection setup
265
+
266
+ **For specific tasks**:
267
+ - [docs/FORENSICS.md](./docs/FORENSICS.md) — Debug agent failures (git-bisectable)
268
+ - [docs/RESTORE.md](./docs/RESTORE.md) — Reconstitute Aesop on a new machine
269
+ - [docs/PUBLISHING.md](./docs/PUBLISHING.md) — Release Aesop to npm
270
+ - [docs/autonomous-swe.md](./docs/autonomous-swe.md) — The 0.1.0-rc.1 milestone told honestly: what "autonomous SWE" means here, the evidence behind each claim, and the limits the project owns
271
+ - [docs/case-study-portfolio.md](./docs/case-study-portfolio.md) — How Aesop built its own portfolio site; full audit trail and cost breakdown
272
+
273
+ See [CHANGELOG.md](./CHANGELOG.md) and [RELEASE-NOTES.md](./RELEASE-NOTES.md) for release notes.
211
274
 
212
275
  ## Contributing
213
276
 
214
- Aesop welcomes improvements. The repo uses its own `/buildsystem` loop for developmentPRs from `feature/*` branches are built, tested, and merged by Aesop itself. To contribute:
277
+ Aesop is **source-available** under the PolyForm Strict License 1.0.0, which does not permit modification or redistributionso outside code patches can't be accepted as merged contributions. That said, **feedback is genuinely welcome**:
215
278
 
216
- 1. Fork and create a `feature/*` branch.
217
- 2. Write failing tests first (TDD).
218
- 3. Open a PR; Aesop's wave cycle will verify and merge.
279
+ - **Issues and bug reports** tell us what's broken or confusing.
280
+ - **Discussion and ideas** feature requests, design critiques, use-case questions.
219
281
 
220
- Maintain the core principles: **Haiku-first** subagents, **lean** orchestrator, **durable** state, **observable** machinery.
282
+ The repo develops itself via its own `/buildsystem` loop; code changes are made by the maintainer at their discretion, or by prior arrangement. See [CONTRIBUTING.md](./CONTRIBUTING.md) for details.
221
283
 
222
284
  ## License
223
285
 
224
- MIT. See `LICENSE`.
286
+ **Source-available** under the [PolyForm Strict License 1.0.0](./LICENSE). You may read, run, and use the software for any permitted purpose, but **modification and redistribution are not permitted**. See [`LICENSE`](./LICENSE) for the full terms and the definition of permitted (noncommercial and personal) purposes.
287
+
288
+ Copyright 2026 Matt Culliton.
225
289
 
226
290
  ## References
227
291
 
@@ -14,6 +14,7 @@
14
14
  "temp_root": "~/.aesop-temp",
15
15
  "_temp_root_notes": "Portable path for temporary aesop files. ~ expands to home directory on both Windows and POSIX. Alternatively, on Windows set to %TEMP%/aesop, on POSIX set to /tmp/aesop. Config loaders expand ~ at runtime.",
16
16
  "state_root": "./state",
17
+ "_fleet_root_note": "SECURITY BOUNDARY: all repository clone targets must remain under fleet_root to prevent credential harvesting across account boundaries. The monitor validates clone targets on each cycle. Defaults to home directory if not specified.",
17
18
  "fleet_root": "/path/to/fleet",
18
19
  "transcripts_root": "~/.claude/projects",
19
20
  "repos": [
@@ -45,6 +46,11 @@
45
46
  "cardinal_rules": {
46
47
  "subagent_model": "haiku"
47
48
  },
49
+ "limits": {
50
+ "_comment": "Cost ceiling / kill switch (tools/cost_ceiling.py, tools/halt.py). null disables a given ceiling (feature opt-in). When spend meets or exceeds a configured ceiling, cost_ceiling.py trips tools/halt.py's .HALT sentinel, which daemons/run-watchdog.sh checks at the top of every cycle and refuses to do work (no backup, no push, no scan) until cleared via 'python tools/halt.py --clear'.",
51
+ "max_wave_tokens": null,
52
+ "max_daily_tokens": null
53
+ },
48
54
  "alerts": {
49
55
  "_comment": "Slack/Discord webhook integration for fleet alerts. webhook_url: null (default) disables alerts (feature opt-in). SETUP: (1) Slack: Create an app at https://api.slack.com/apps, enable 'Incoming Webhooks', add a new webhook to your channel, copy the Webhook URL. (2) Discord: In your Discord server, go to Server Settings > Integrations > Webhooks, create a webhook, copy its URL. SECURITY: NEVER commit a real webhook URL to version control — retrieve at runtime via environment variable AESOP_ALERTS_WEBHOOK_URL or load from a .env.local file. Provider: 'slack' (block-kit format) or 'discord' (embed format). min_severity: filter by HIGH/CRITICAL/etc. heartbeat_stall_s: alert if watchdog heartbeat older than N seconds (null = skip).",
50
56
  "webhook_url": null,
package/bin/CLAUDE.md CHANGED
@@ -9,10 +9,19 @@
9
9
  - **Help**: `npx @matt82198/aesop --help` or `-h`
10
10
  - **Interactive wizard**: `npx @matt82198/aesop wizard` (on a TTY, prompts; with `--yes`, uses defaults)
11
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
+
12
21
  ## What gets copied
13
22
 
14
- Files in `filesToCopy` array (cli.js line 5769):
15
- - **Directories**: `daemons/`, `dash/`, `monitor/`, `tools/`, `ui/`, `docs/`
23
+ Files in `filesToCopy` array (cli.js lines 239256):
24
+ - **Directories**: `daemons/`, `dash/`, `monitor/`, `tools/`, `ui/`, `docs/`, `state_store/`, `skills/`, `mcp/`, `scan/`, `hooks/`
16
25
  - **Files**: `aesop.config.example.json`, `README.md`, `LICENSE`, `CHANGELOG.md`, `CLAUDE-TEMPLATE.md`
17
26
  - **Brain templates** (in docs/): `MEMORY-TEMPLATE.md` (via docs/ directory copy)
18
27
 
@@ -61,7 +70,7 @@ The wizard mode provides an interactive onboarding flow for new adopters, guidin
61
70
  ## Invariants & gotchas
62
71
 
63
72
  - **Idempotent on empty targets**: Fails if `targetDir` exists and is non-empty (non-destructive). Safe to retry.
64
- - **Adding shipped files**: Any new file/dir added to `filesToCopy` array must also be added to `package.json` `files` array (lines 9–21 in package.json) so npm publish includes it.
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.
65
74
  - **No machine-specific paths**: Use relative paths only; `__dirname` and `path.join()` handle cross-platform resolution.
66
75
  - **Wizard prompts are async**: Main execution is wrapped in async IIFE to support readline prompts
67
76
  - **Help text accuracy**: If invocation steps or output paths change, update help text