@matt82198/aesop 0.1.0-beta.4 → 0.1.0-rc.1

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 (134) hide show
  1. package/CHANGELOG.md +187 -5
  2. package/LICENSE +66 -21
  3. package/README.md +143 -23
  4. package/aesop.config.example.json +14 -1
  5. package/bin/CLAUDE.md +42 -5
  6. package/bin/cli.js +479 -95
  7. package/daemons/CLAUDE.md +5 -2
  8. package/daemons/backup-fleet.sh +209 -51
  9. package/daemons/run-watchdog.sh +211 -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/RELEASING.md +159 -0
  19. package/docs/archive/README.md +3 -0
  20. package/docs/{spikes → archive/spikes}/tiered-cognition/README.md +1 -3
  21. package/docs/autonomous-swe.md +149 -0
  22. package/docs/case-study-portfolio.md +61 -0
  23. package/docs/reproduce.md +121 -0
  24. package/docs/self-stats-data.json +11 -0
  25. package/docs/templates/FLEET-OPS-ANALYSIS.example.md +27 -0
  26. package/docs/templates/FLEET-OPS-RECOMMENDATIONS.example.md +24 -0
  27. package/docs/templates/PROPOSALS-LOG.example.md +64 -0
  28. package/hooks/CLAUDE.md +51 -0
  29. package/hooks/install-waveguard.sh +68 -0
  30. package/hooks/pre-commit-waveguard.sh +26 -0
  31. package/hooks/pre-push-policy.sh +253 -15
  32. package/mcp/CLAUDE.md +213 -0
  33. package/mcp/package.json +26 -0
  34. package/mcp/server.mjs +543 -0
  35. package/monitor/CHARTER.md +76 -110
  36. package/monitor/CLAUDE.md +3 -3
  37. package/monitor/collect-signals.mjs +218 -20
  38. package/package.json +17 -6
  39. package/scan/CLAUDE.md +30 -0
  40. package/scan/fleet-scan.example.mjs +292 -0
  41. package/skills/CLAUDE.md +1 -0
  42. package/skills/healthcheck/SKILL.md +44 -0
  43. package/state_store/CLAUDE.md +39 -0
  44. package/state_store/__init__.py +24 -0
  45. package/state_store/api.py +35 -0
  46. package/state_store/export.py +19 -0
  47. package/state_store/ingest.py +41 -0
  48. package/state_store/projections.py +126 -0
  49. package/state_store/store.py +197 -0
  50. package/tools/CLAUDE.md +37 -149
  51. package/tools/alert_bridge.py +453 -0
  52. package/tools/bench_runner.py +438 -0
  53. package/tools/buildlog.py +4 -7
  54. package/tools/ci_merge_wait.py +308 -14
  55. package/tools/common.py +62 -0
  56. package/tools/cost_ceiling.py +191 -0
  57. package/tools/dash.js +102 -0
  58. package/tools/doctor.js +220 -0
  59. package/tools/fleet_ledger.py +189 -17
  60. package/tools/fleet_prompt_extractor.py +134 -0
  61. package/tools/halt.py +172 -0
  62. package/tools/healthcheck.py +299 -0
  63. package/tools/heartbeat.py +4 -7
  64. package/tools/metrics_gate.py +8 -2
  65. package/tools/orchestrator_status.py +4 -9
  66. package/tools/reconcile.py +277 -0
  67. package/tools/rotate_logs.py +152 -62
  68. package/tools/scanner_selftest.py +28 -3
  69. package/tools/secret_scan.py +367 -91
  70. package/tools/self_stats.py +797 -0
  71. package/tools/session_usage_summary.py +198 -0
  72. package/tools/status.js +187 -0
  73. package/tools/svg_to_png.mjs +50 -0
  74. package/tools/transcript_replay.py +236 -0
  75. package/tools/transcript_timeline.py +184 -0
  76. package/tools/verify_agent_inspector.py +289 -0
  77. package/tools/verify_dash.py +361 -542
  78. package/tools/verify_prboard.py +344 -0
  79. package/tools/verify_submit_encoding.py +12 -4
  80. package/tools/watch.js +49 -0
  81. package/ui/CLAUDE.md +59 -41
  82. package/ui/agents.py +337 -34
  83. package/ui/api/submit.py +44 -5
  84. package/ui/api/tracker.py +15 -7
  85. package/ui/collectors.py +294 -52
  86. package/ui/config.py +31 -2
  87. package/ui/cost.py +355 -0
  88. package/ui/csrf.py +9 -4
  89. package/ui/handler.py +450 -12
  90. package/ui/render.py +26 -6
  91. package/ui/sse.py +114 -13
  92. package/ui/wave_prs.py +230 -0
  93. package/ui/web/dist/assets/index-0qQYnvMC.js +9 -0
  94. package/ui/web/dist/assets/index-BdIlFieV.css +1 -0
  95. package/ui/web/dist/index.html +14 -0
  96. package/monitor/.signal-state.json +0 -3
  97. package/monitor/ACTIONS.log +0 -1
  98. package/monitor/BRIEF.md +0 -24
  99. package/monitor/SIGNALS.json +0 -54
  100. package/tools/__pycache__/buildlog.cpython-314.pyc +0 -0
  101. package/tools/__pycache__/ci_merge_wait.cpython-314.pyc +0 -0
  102. package/tools/__pycache__/ensure_state.cpython-314.pyc +0 -0
  103. package/tools/__pycache__/eod_sweep.cpython-314.pyc +0 -0
  104. package/tools/__pycache__/fleet_ledger.cpython-314.pyc +0 -0
  105. package/tools/__pycache__/heartbeat.cpython-314.pyc +0 -0
  106. package/tools/__pycache__/inbox_drain.cpython-314.pyc +0 -0
  107. package/tools/__pycache__/launch_tui.cpython-314.pyc +0 -0
  108. package/tools/__pycache__/orchestrator_status.cpython-314.pyc +0 -0
  109. package/tools/__pycache__/power_selftest.cpython-314.pyc +0 -0
  110. package/tools/__pycache__/prepublish_scan.cpython-314.pyc +0 -0
  111. package/tools/__pycache__/rotate_logs.cpython-314.pyc +0 -0
  112. package/tools/__pycache__/scanner_selftest.cpython-314.pyc +0 -0
  113. package/tools/__pycache__/secret_scan.cpython-314.pyc +0 -0
  114. package/tools/__pycache__/stall_check.cpython-314.pyc +0 -0
  115. package/tools/__pycache__/verify_dash.cpython-314.pyc +0 -0
  116. package/tools/__pycache__/verify_submit_encoding.cpython-314.pyc +0 -0
  117. package/ui/__pycache__/agents.cpython-314.pyc +0 -0
  118. package/ui/__pycache__/collectors.cpython-314.pyc +0 -0
  119. package/ui/__pycache__/config.cpython-314.pyc +0 -0
  120. package/ui/__pycache__/csrf.cpython-314.pyc +0 -0
  121. package/ui/__pycache__/handler.cpython-314.pyc +0 -0
  122. package/ui/__pycache__/render.cpython-314.pyc +0 -0
  123. package/ui/__pycache__/serve.cpython-314.pyc +0 -0
  124. package/ui/__pycache__/sse.cpython-314.pyc +0 -0
  125. package/ui/api/__pycache__/__init__.cpython-314.pyc +0 -0
  126. package/ui/api/__pycache__/submit.cpython-314.pyc +0 -0
  127. package/ui/api/__pycache__/tracker.cpython-314.pyc +0 -0
  128. package/ui/templates/dashboard.html +0 -1202
  129. /package/docs/{spikes → archive/spikes}/tiered-cognition/ACTIVATION.md +0 -0
  130. /package/docs/{spikes → archive/spikes}/tiered-cognition/DESIGN.md +0 -0
  131. /package/docs/{spikes → archive/spikes}/tiered-cognition/FINDINGS.md +0 -0
  132. /package/docs/{spikes → archive/spikes}/tiered-cognition/aesop-cognition.example.md +0 -0
  133. /package/docs/{spikes → archive/spikes}/tiered-cognition/force-model-policy.merged.mjs +0 -0
  134. /package/docs/{spikes → archive/spikes}/tiered-cognition/strip-tools-hook.mjs +0 -0
package/CHANGELOG.md CHANGED
@@ -5,6 +5,182 @@ All notable changes to Aesop are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [Unreleased]
9
+
10
+ ## [0.1.0-rc.1] - 2026-07-17
11
+
12
+ First release candidate. The dispatch-model claims are now backed by measurement, the
13
+ kill-switch and cost-ceiling are wired into the live dispatch path and proven, and the npm
14
+ package ships slim and reproducible from a clean clone.
15
+
16
+ ### Added
17
+ - **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).
18
+ - **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.
19
+ - **Cost-ceiling guardrail** (wave.27): Per-wave spend ceiling halts dispatch when the configured budget is exceeded.
20
+ - **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.
21
+ - **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.
22
+ - **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.
23
+ - **Wave PR Board** (wave.31): Dashboard view aggregating per-wave PR status for at-a-glance merge-train visibility (browser-proven).
24
+ - **Agent Inspector** (wave.31): Drill-down dashboard view exposing individual agent transcripts, cost, and lifecycle (browser-proven).
25
+
26
+ ### Changed
27
+ - **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.
28
+ - **Adversarially-verified audits** (wave.25): Full audits now verify Haiku-reported findings before scheduling fixes.
29
+ - **Tracker reconciliation at wave open** (wave.29): Wave startup reconciles the tracker against shipped work so already-done items are not re-dispatched.
30
+
31
+ ### Fixed
32
+ - **CI docs-only deadlock** (wave.30): Broke a docs-gate deadlock that could mask HEAD failures in the CI pipeline.
33
+ - **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).
34
+
35
+ ### Tests
36
+ - **Waveguard regression test** (#165): Added Test 7 to prove worktree commits pass while primary tree writes remain blocked by waveguard (wave-24 regression).
37
+
38
+ ## [0.1.0-wave.23] - 2026-07-15
39
+
40
+ ### Added
41
+ - **Adopter-focused documentation restructure** (#164): Reorganized docs into adopter journey with architecture diagram (Mermaid) to improve onboarding clarity.
42
+ - **Runtime CLI subcommands** (#164): Added `aesop watch`, `aesop dash`, and `aesop status` to CLI for real-time fleet monitoring.
43
+ - **Pre-commit waveguard hook** (#164): New write-guard hook prevents stray primary-tree writes during active wave builds; blocks commits outside worktrees.
44
+
45
+ ### Fixed
46
+ - **Tracker projection snapshotting** (#164): Fixed O(n²) replay latency in tracker-snapshotting by caching projection state (wave-19 P2).
47
+ - **Log rotation race condition** (#164): Made `rotate_logs` atomic to prevent concurrent write race when logs exceed size limits.
48
+ - **Dashboard transcript cache** (#164): Optimized `dash-extra.mjs` by caching transcript metadata (path, size, mtime) to reduce redundant reads.
49
+ - **Monitor signal deduplication** (#164): Eliminated double-read of SECURITY-ALERTS.log in monitor signal collector to reduce noise.
50
+
51
+ ### Documentation
52
+ - **Architecture diagram** (#164): Added Mermaid diagram showing fleet machinery layers (orchestrator → monitor → daemons → state).
53
+ - **Adopter journey** (#164): Restructured README and docs to guide new adopters through setup → operations → troubleshooting workflows.
54
+
55
+ ## [0.1.0-wave.22] - 2026-07-15
56
+
57
+ ### Added
58
+ - **GitHub docs overhaul** (#163): Complete README rewrite with "Why Aesop?" problem statement and architectural overview for discoverability.
59
+ - **Aesop doctor preflight** (#163): New `aesop doctor` subcommand validates configuration, hooks, and state-store health before running waves.
60
+ - **Self-building stats automation** (#163): Extended `self_stats.py` to regenerate `stats.json` and detect README stats drift; auto-regenerate in CI.
61
+ - **TypeScript type safety** (#163): Added `tsc --noEmit` CI gate to catch UI type errors before merge.
62
+
63
+ ### Changed
64
+ - **Stats drift enforcement** (#163): README stats block now auto-reconciled by CI; stale stats block push gate enforces freshness.
65
+
66
+ ### Fixed
67
+ - **TypeScript compiler warnings** (#163): Resolved unused variable and type mismatch warnings in UI layer.
68
+
69
+ ### Documentation
70
+ - **README landing rewrite** (#163): Replaced generic boilerplate with concrete "Why Aesop exists" section explaining multi-agent durability and cost optimization.
71
+ - **CHANGELOG reconciliation** (#163): Added missing wave 16-20 dated entries and reorganized unreleased backlog to reflect actual shipped state.
72
+
73
+ ## [0.1.0-wave.21] - 2026-07-15
74
+
75
+ ### Added
76
+ - **CI performance optimization** (#161): Implemented path-based build filters to skip CI on docs-only changes; added Python test parallelization for faster feedback.
77
+ - **Fleet ledger instrumentation** (#161): Added phase and wave tagging to cost ledger for better fleet operations analytics and wave closure reporting.
78
+
79
+ ### Changed
80
+ - **CI trigger-level filtering** (#161): Removed `paths-ignore` from trigger layer (was silently blocking required checks) and moved filtering to job level for correctness.
81
+
82
+ ### Fixed
83
+ - **Python test parallelization** (#161): Parallel test runner now properly isolates test fixtures and state to prevent race conditions.
84
+
85
+ ### Documentation
86
+ - **CI filtering best practices** (#161): Documented correct pattern for docs-only CI bypass (job-level, not trigger-level, to preserve required-check semantics).
87
+
88
+ ## [0.1.0-wave.20] - 2026-07-15
89
+
90
+ ### Added
91
+ - **Fail-closed push gate** (#160): Secret-scan gate now blocks pushes on timeout, preventing silent failures that allow commits to bypass scanning.
92
+ - **UI liveness improvements** (#160): Enhanced SSE cost collection and HealthHeader status display with better timeout handling.
93
+ - **CI state classification** (#160): Improved `ci_merge_wait` handling to distinguish real CI status (success/failure) from temporary waits.
94
+ - **Daemon portability fixes** (#160): Fixed `backup-fleet` and `run-watchdog` for Linux CI environments (path handling, process detection).
95
+ - **Host normalization** (#160): Added consistent URL normalization in UI handler and monitor collectors to reduce false positives.
96
+ - **Monitor cursor improvements** (#160): Enhanced monitor signal collection with better state tracking and recovery.
97
+
98
+ ### Documentation
99
+ - **Currency updates** (#160): README and docs refresh for wave 20 machinery improvements.
100
+
101
+ ### Fixed
102
+ - **UI handler robustness** (#160): Improved error handling in SSE cost collection and API state rendering.
103
+ - **Test harness** (#160): Additional coverage for CI merge state handling and daemon portability.
104
+
105
+ ## [0.1.0-wave.19] - 2026-07-15
106
+
107
+ ### Added
108
+ - **Secret-scan range push gate** (#165): Enhanced push hook with per-range verification to block partial/corrupted scans and prevent silent gate bypasses.
109
+ - **Host-header guard** (#163): HTTP host validation in UI handler to prevent header injection attacks.
110
+ - **CI merge classification** (#162): `ci_merge_wait` now distinguishes real CI status (success/failure) vs temporary waits, improving integration reliability.
111
+ - **Scaffolder manifest completeness** (#161): All 10 template directories (state_store, skills, mcp, scan) verified in npm package; consistent onboarding experience.
112
+ - **UI collector efficiency** (#164): Optimized agent and cost data collection for better freshness and reduced polling overhead; improved SSE contract.
113
+ - **Stall-check test rewrite** (#160): Migrated bare test functions to unittest.TestCase for CI compatibility and better failure reporting.
114
+ - **npm publish OIDC diagnostics** (#158): Self-diagnosing workflow for OIDC token generation and npm publish reliability.
115
+
116
+ ## [0.1.0-wave.18] - 2026-07-15
117
+
118
+ ### Added
119
+ - **Comprehensive audit fixes**: 8-lens security, correctness, a11y, density, shippability, docs, and tools audit with 13 targeted fixes.
120
+ - **Watchdog robustness** (#155): Improved `backup-fleet` and `run-watchdog` daemon stability with better error handling and signal detection.
121
+ - **Pre-push policy hardening** (#155): Enhanced branch protection and secret-scan enforcement in hook execution.
122
+ - **Config management** (#155): Improved aesop.config.json parsing and CLI handling for reliability.
123
+ - **State store hardening** (#155): Fixed concurrency edge cases, improved error recovery, and validated persistence.
124
+
125
+ ### Fixed
126
+ - **Security gates** (#155): Fixed secret-scan coverage gaps (node_modules, dynamic content); improved push hook reliability.
127
+ - **a11y and UI hardening** (#155): Fixed contrast, keyboard navigation, and state-update timing issues.
128
+ - **Test infrastructure** (#155): Added comprehensive test coverage for daemons, state store, SSE reliability, UI hardening, and tools.
129
+
130
+ ## [0.1.0-wave.17] - 2026-07-15
131
+
132
+ ### Added
133
+ - **Fleet-ops templates** (#153): Example documents for fleet analysis, recommendations, and proposal tracking to guide operations workflows.
134
+ - **Tools suite expansion** (#153): New Python and Node tools for fleet operations:
135
+ - `transcript_replay.py`: Replay agent transcripts with event timing
136
+ - `transcript_timeline.py`: Extract and visualize agent activity timelines
137
+ - `fleet_prompt_extractor.py`: Extract and categorize fleet prompts for analysis
138
+ - `svg_to_png.mjs`: Convert SVG charts to PNG for documentation
139
+ - `session_usage_summary.py`: Aggregate session token usage across fleet
140
+ - **CI merge wait improvements** (#153): Enhanced `ci_merge_wait` detection with better status classification.
141
+ - **Machinery port** (#153): Completed isolation violation detector, health checks, and signal collection for orchestration monitor.
142
+ - **Shippability fixes** (#153): Fixed daemon portability and improved bootstrap process.
143
+
144
+ ### Documentation
145
+ - **Fleet-ops guidance** (#153): Added templates and examples for monitoring, analysis, and recommendations workflows.
146
+
147
+ ## [0.1.0-wave.16] - 2026-07-15
148
+
149
+ ### Added
150
+ - **Isolation-violation detector** (#152): Monitor now detects and reports when worktrees modify shared state (repository contamination checker).
151
+ - **Monitor signal collection** (#152): Enhanced `collect-signals.mjs` with isolation detection and improved signal accuracy.
152
+
153
+ ### Documentation
154
+ - **CLAUDE.md minimization** (#151): Streamlined domain-specific documentation; archived cancelled tiered-cognition spike; improved maintainability.
155
+ - **Domain map refinement** (#151): Clarified tool, test, and UI layer responsibilities and ownership.
156
+
157
+ ## [0.1.0-beta.5] - 2026-07-15
158
+
159
+ ### Added (Wave-15)
160
+ - **State-Sourced State Layer** (#134, #135): Event-sourced SQLite WAL backing store with projections; tracker.json re-rendered as export for git integration; dual-path mutations via StateAPI.
161
+ - **Self-Building Stats** (#130): `tools/self_stats.py` computes verified repository metrics (merged PRs, commits, waves, files, coauthors) live from git; README stats block auto-populated via CI drift gate.
162
+ - **MCP Fleet Server** (#121): Read-only MCP server exposing fleet status, agents, tracker, costs for external Claude integrations.
163
+ - **Alert Webhook Bridge** (#120): Incoming HTTP webhook relay to monitor alerts; configurable signing + filtering.
164
+ - **Onboarding Wizard** (#127): Interactive CLI scaffolder with guided config, hook setup, repo discovery.
165
+ - **Healthcheck Skill** (#126): Liveness probe skill for orchestrator health; integrated into monitor signal collection.
166
+ - **Symlink/Junction Coverage** (#125): Test coverage for path-traversal guards; validates symlink/junction rejection in backup and UI handlers.
167
+
168
+ ### Changed (Wave-15)
169
+ - **Agent Detail Rendering** (#128): Transcript lookup fixed for parallel agent teams; handles multi-file agent logs.
170
+ - **CI Cascade** (#122, #131, #132, #133): Tools-index alert bridge integration; SSE transcript fixture isolation; favicon verification; node_modules secret-scan gate.
171
+
172
+ ### Fixed (Wave-15)
173
+ - **Socket Race** (#129): stderr noise from concurrent SSE keepalive; added locking around socket writes.
174
+ - **State Store Concurrency Seams** (#138): Inbox-drain deduplication, render-failure recovery, migration guard.
175
+ - **CSRF HTTPS Origins** (#137): Accept https loopback origins in CSRF validation.
176
+ - **CI/Daemon Machinery** (#136): Dist-freshness gate enforcement; watchdog script-relative path fix.
177
+ - **Dashboard UX Hardening** (#141): Stale-data timestamps, empty states, lane badges, a11y improvements.
178
+
179
+ ### Documentation (Wave-15)
180
+ - **RELEASING.md** (#140): Release process documentation; npm publish and CI merge procedures.
181
+ - **Currency Sweep** (#140): CHANGELOG #113–#135 documentation; README state_store and stats updates; CLAUDE.md drift correction; beta.5 preparation.
182
+ - **Portfolio Case Study** (#139): Matt Culliton personal portfolio documentation; agent-fleet-built showcase.
183
+
8
184
  ## [0.1.0-beta.4] - 2026-07-14
9
185
 
10
186
  ### Added (Wave-13)
@@ -15,13 +191,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
15
191
  - Test/CI wiring: doc-drift and domain-map test verification.
16
192
  - Machinery gates: secret-scan enforcement, pre-push hook gating.
17
193
 
18
- ## [Unreleased]
194
+ ### Added (Wave-14)
195
+ - **Dashboard Rewrite**: Complete React 18 + Vite + TypeScript redesign with 4 hash-routed views (Overview, Work, Activity, Cost), sticky health header, live SSE updates, light/dark theming with WCAG AA contrast, keyboard navigation, and `aria-live` regions.
196
+ - **Frontend Architecture**: Zero runtime dependencies beyond React/React-dom; Vite dev server with API proxy; committed `dist/` serves as authoritative build with content-hashed assets and immutable cache headers.
197
+ - **Backend Additions**: `/api/state` consolidated first-paint snapshot (one round trip), `/api/session` for Vite dev server CSRF fallback, `/api/cost` cost/scorecard collector from `OUTCOMES-LEDGER.md` with optional pricing map and per-model/per-day aggregates.
198
+ - **Cost Analytics**: Per-model token totals, per-day bar chart (pure SVG), verdict scorecard (success/failure/hung rates), configurable pricing estimates from `aesop.config.json`.
199
+ - **Testing Infrastructure**: Vitest + Testing Library component tests, rewritten `tools/verify_dash.py` (Playwright) with data-testid-based assertions, CI drift gate for committed dist, a11y/theme verification in CI.
19
200
 
20
- ### Added
21
- - **Stall Detection** (wave-12): `tools/stall_check.py` silent-hang detection for the agent watchdog.
22
- - **CI-Gated Merge Helper** (wave-12): `tools/ci_merge_wait.py` awaits CI success before merge.
201
+ ### Changed (Wave-14)
202
+ - **Dashboard Cutover**: `ui/templates/dashboard.html` deleted; `ui/handler.py` serve_html now returns hard 500 if dist missing (no fallback).
203
+ - **Render Module**: `render.py` requires `template_path` parameter (no legacy default); raises TypeError if called without it.
204
+ - **API Contract**: SSE emits 6 sections (added `cost`); `/api/state` returns consolidated snapshot for optimal first paint.
23
205
 
24
- ### Fixed
206
+ ### Fixed (Wave-14)
25
207
  - **Wave-12 Stability**: Swallowed failures now loud; `sse.reset_state()` locked for concurrent test isolation; tracker writes in tempdir; symlink/path-injection guards in rotate-logs.
26
208
  - **Wave-11 Security**: Dangling symlink inbox rejection; real handler exercise over HTTP; staged merge tier + model policy hook.
27
209
 
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/rc" 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-rc.1**, that loop has carried the project to an installable, tested, audited, and benchmarked release candidate—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 is at its first release candidate. Install the `@rc` tag for the latest prerelease (v0.1.0-rc.1); the `@beta` tag remains available for earlier prereleases.
31
74
 
32
75
  ### Quickest path: npx scaffold
33
76
 
34
77
  ```bash
35
- npx @matt82198/aesop@beta my-fleet \
78
+ npx @matt82198/aesop@rc my-fleet \
36
79
  --name "my-api" \
37
80
  --repos "/path/to/repo1,/path/to/repo2"
38
81
  cd my-fleet
@@ -46,6 +89,8 @@ python ui/serve.py
46
89
 
47
90
  Pre-push hook auto-installed. See [docs/HOOK-INSTALL.md](./docs/HOOK-INSTALL.md) for branch protection pairing.
48
91
 
92
+ **State Store**: Aesop uses an event-sourced SQLite WAL backing store (`state_store/`) for durable state persistence. The `tracker.json` file is automatically re-rendered as an export for git-friendly checkpointing. Mutations follow a dual-path model: append new events via the StateAPI, then rendered exports for external consumption.
93
+
49
94
  ### Or: git clone for hacking
50
95
 
51
96
  ```bash
@@ -68,7 +113,7 @@ orchestrator (via Claude Code) Reads backlog, dispatches Haiku subagents in par
68
113
 
69
114
  parallel Haiku fleet Tiny, scoped domains (tests, build, review, docs, etc.)
70
115
 
71
- watchdog verifies & merges GREEN push to main
116
+ watchdog backs up & gates Heartbeat, secret-scan, push to backup branch; merging is orchestrator/human-driven
72
117
 
73
118
  monitor/collect-signals.mjs Audits orchestration health, feeds next wave's backlog
74
119
 
@@ -77,16 +122,40 @@ STATE.md + BUILDLOG.md Git-committed, survives machine wipes
77
122
 
78
123
  See [docs/DISPATCH-MODEL.md](./docs/DISPATCH-MODEL.md) for cost analysis and parallel patterns.
79
124
 
125
+ <!-- STATS:START -->
126
+
127
+ ## Aesop builds itself
128
+
129
+ Aesop is built entirely by its own `/buildsystem` wave cycle—running parallel Haiku fleets across ranked backlog items, verifying merges, auditing orchestration health. These stats are the receipts: all numbers computed LIVE from git, verified by anyone who clones.
130
+
131
+ | Metric | Value |
132
+ | --- | --- |
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 -->
142
+
143
+
144
+ ## Recommended Agents
145
+
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.
147
+
80
148
  ## Use with Claude Code
81
149
 
82
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:
83
151
 
84
152
  ```bash
85
- # Copy the /power skill
153
+ # Copy the /power skill and optional /healthcheck skill
86
154
  cp -r skills/power/ ~/.claude/skills/power/
155
+ cp -r skills/healthcheck/ ~/.claude/skills/healthcheck/
87
156
  ```
88
157
 
89
- 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.
90
159
 
91
160
  ## Core Principles
92
161
 
@@ -126,7 +195,38 @@ Settings > Branches > main
126
195
  ✓ Restrict pushes to (Admins only)
127
196
  ```
128
197
 
129
- 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.
199
+
200
+ ## Dashboard (Wave-14 Rewrite)
201
+
202
+ The dashboard is a **React 18 + Vite + TypeScript** single-page app with four hash-routed views:
203
+
204
+ ### Viewing the Dashboard
205
+ ```bash
206
+ python ui/serve.py
207
+ ```
208
+ Opens `http://localhost:8770` — live fleet health, security alerts, work-item kanban, cost analytics.
209
+
210
+ ### Architecture
211
+ - **Backend**: Python stdlib HTTP server (`ui/handler.py`) serves the built React app + JSON/SSE APIs (`/api/state`, `/api/cost`, `/events`).
212
+ - **Frontend**: `ui/web/` (React app) is built to `dist/` (committed to git) and served as static files by the Python server.
213
+ - **CSRF protection**: Token injected into `dist/index.html` via sentinel substitution; mutations gated by `/submit` and `/api/tracker` endpoints.
214
+
215
+ ### Development
216
+ ```bash
217
+ cd ui/web
218
+ npm install
219
+ npm run dev # Vite dev server with API proxy to http://localhost:8770
220
+ npm run build # Build to dist/ (commit the dist/)
221
+ ```
222
+
223
+ The dev server proxies `/data`, `/api`, `/events`, `/agent`, `/submit` to the Python backend on :8770, so the frontend can develop against live APIs.
224
+
225
+ ### Views
226
+ - **Overview**: Fleet agents, security alerts, recent events.
227
+ - **Work** (`#/work`): Tracker kanban (4 lanes: proposed/ranked/in-progress/done), audit backlog progress.
228
+ - **Activity** (`#/activity`): Agent timeline, main-thread message tail (live reasoning).
229
+ - **Cost** (`#/cost`): Per-model spend/tokens, per-day bar chart, verdict scorecard (success/failure rates).
130
230
 
131
231
  ## Extending Aesop
132
232
 
@@ -134,7 +234,7 @@ Private brain (`~/.claude`) is never committed to this repo. Keep `aesop.config.
134
234
 
135
235
  **Custom watchdog hooks**: Edit `daemons/backup-fleet.sh` to run linters, integrate with your CI, or customize secret-scan logic.
136
236
 
137
- **Dashboard panels**: Edit `ui/serve.py` or `dash/watchdog-gui.sh` to surface your metrics.
237
+ **Dashboard components**: Add React components in `ui/web/src/components/` or new views in `ui/web/src/views/`. Rebuild and commit `dist/`.
138
238
 
139
239
  ## Troubleshooting
140
240
 
@@ -145,27 +245,47 @@ Private brain (`~/.claude`) is never committed to this repo. Keep `aesop.config.
145
245
  | Secret-scan blocks push | Add suppression to `tools/secret_scan.py`; no auto-bypass (by design) |
146
246
  | Monitor doesn't start | Verify Node.js on PATH; check `monitor/BRIEF.md` for logs |
147
247
 
148
- For deeper docs, see `docs/`:
149
- - `CARDINAL-RULES.md` — full 10 principles
150
- - `DISPATCH-MODEL.md` cost analysis and patterns
151
- - `CHECKPOINTING.md`how STATE.md + BUILDLOG.md survive wipes
152
- - `GOVERNANCE.md`AUTO/PROPOSE tiers
153
-
154
- 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.
155
274
 
156
275
  ## Contributing
157
276
 
158
- 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**:
159
278
 
160
- 1. Fork and create a `feature/*` branch.
161
- 2. Write failing tests first (TDD).
162
- 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.
163
281
 
164
- 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.
165
283
 
166
284
  ## License
167
285
 
168
- 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.
169
289
 
170
290
  ## References
171
291
 
@@ -6,7 +6,7 @@
6
6
  "scripts_root": "Override via SCRIPTS_ROOT env var or config; default: {aesop_root}/../scripts",
7
7
  "temp_root": "Override via TEMP_ROOT env var or config; default: system temp + /claude",
8
8
  "state_root": "Override via AESOP_STATE_ROOT env var or config; default: {aesop_root}/state",
9
- "fleet_root": "Override via AESOP_FLEET_ROOT env var or config; default: $HOME (security: validate clone targets remain under this root)",
9
+ "fleet_root": "Override via AESOP_FLEET_ROOT env var or config; default: $HOME. SECURITY: all repository clone targets must remain under fleet_root to prevent credential harvesting across account boundaries. The monitor validates clone targets on each cycle and surfaces violations as HIGH alerts.",
10
10
  "transcripts_root": "Override via AESOP_TRANSCRIPTS_ROOT env var or config; default: ~/.claude/projects"
11
11
  },
12
12
  "brain_root": "~/.claude",
@@ -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": [
@@ -44,5 +45,17 @@
44
45
  },
45
46
  "cardinal_rules": {
46
47
  "subagent_model": "haiku"
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
+ },
54
+ "alerts": {
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).",
56
+ "webhook_url": null,
57
+ "provider": "slack",
58
+ "min_severity": "HIGH",
59
+ "heartbeat_stall_s": 600
47
60
  }
48
61
  }