@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
@@ -0,0 +1,254 @@
1
+ # Key Concepts
2
+
3
+ **TL;DR**: Aesop runs cheap, fast delivery waves via a dispatch model (Haiku-first subagents + lean orchestrator), durable state (git-committed checkpoints), and security gates. This page introduces the concepts; links below go to deep-dive reference docs.
4
+
5
+ ---
6
+
7
+ ## The Wave Cycle
8
+
9
+ A **wave** is one complete delivery loop: rank backlog → dispatch parallel agents → verify & merge → audit & close. Each wave ships 3–8 tested features/fixes and feeds findings into the next wave's backlog.
10
+
11
+ **Wallclock**: 2–3 hours
12
+ **Cost**: ~$0.03–$0.05 per wave
13
+ **Outputs**: All PRs merged, all tests green
14
+
15
+ See [HOW-THE-LOOP-WORKS.md](HOW-THE-LOOP-WORKS.md) for a concrete walkthrough.
16
+
17
+ ---
18
+
19
+ ## Dispatch Model: Cheap Subagents + Lean Orchestrator
20
+
21
+ Aesop's superpower is **Haiku-first dispatch**: spawn 5–8 cheap Haiku subagents in parallel, not serial Opus.
22
+
23
+ ### The rule: Subagents are ALWAYS cheap tier
24
+
25
+ **Rule**: Every subagent defaults to Haiku (1/3 Sonnet cost, 1/5 Opus cost). The orchestrator runs on the main thread only, stays lean, and never spawns as a subagent.
26
+
27
+ **Why**: Haiku at scale (6–8 in parallel) costs ~25% of an all-Opus fleet while maintaining quality on scoped tasks. Running many in parallel is both faster (3x wall-clock) and cheaper (1/5 the cost per token).
28
+
29
+ **Exception**: Only upgrade to Sonnet/Opus if the task genuinely exceeds Haiku capability (rare for scoped domains) AND you've decomposed as far as possible AND you have explicit approval.
30
+
31
+ ### Cost model: Math
32
+
33
+ ```
34
+ All-Opus fleet: 5 agents × Opus cost = $0.15–0.20/wave
35
+ Aesop (1 Opus + 5 Haiku): 1 Opus + 5 Haiku = $0.03–0.05/wave
36
+
37
+ = 4–5x cheaper + 3x faster (parallelism)
38
+ ```
39
+
40
+ See [DISPATCH-MODEL.md](DISPATCH-MODEL.md) for patterns (fan-out, sequential, hierarchical) and detailed cost analysis.
41
+
42
+ ---
43
+
44
+ ## State & Checkpointing: Durable Across Wipes
45
+
46
+ Aesop commits **STATE.md** and **BUILDLOG.md** to git. They survive machine wipes, session restarts, and context loss.
47
+
48
+ ### STATE.md: Authoritative intent
49
+
50
+ - Current phase (e.g., "Phase 2: API integration")
51
+ - Locked decisions (tech choices, data models)
52
+ - Explicit NEXT STEPS (enumerated, owner assigned)
53
+ - Key file paths and data contracts
54
+
55
+ **Purpose**: On resume, read STATE.md to answer "where were we?" and "what's next?" without re-reading logs.
56
+
57
+ ### BUILDLOG.md: Append-only progress
58
+
59
+ - Timestamped work snapshots
60
+ - Status (green / yellow / blocked / pending decision)
61
+ - Next step or blocker
62
+ - **Append-only discipline**: never edit earlier entries (prevents corruption)
63
+
64
+ **Example**:
65
+ ```
66
+ [2026-07-12 14:00] Phase 1 complete: scaffolding + unit tests passing
67
+ [2026-07-12 15:30] API integration: 2 endpoints done, 1 blocked on schema review
68
+ [2026-07-12 16:00] Design approved; resume API endpoint 3 implementation
69
+ ```
70
+
71
+ **Log rotation**: When BUILDLOG.md exceeds ~200 lines or 20 KB, archive to `BUILDLOG-YYYY-MM.md` and keep only recent entries in the live file.
72
+
73
+ See [CHECKPOINTING.md](CHECKPOINTING.md) for recovery workflows, handoff patterns, and rotation details.
74
+
75
+ ---
76
+
77
+ ## Security Gates: Secret-Scan & Branch Discipline
78
+
79
+ Every push is gated by the pre-push hook, which enforces:
80
+
81
+ ### Branch discipline
82
+
83
+ - **Feature branches only**: Never push directly to `main` or `master`
84
+ - **Naming**: All branches must be `feature/*` or `fix/*`
85
+ - **Consequence**: Attempt to push to main is rejected locally
86
+
87
+ ### Secret scanning
88
+
89
+ - **Pre-push check**: `tools/secret_scan.py` scans staged files for detected credentials (API keys, tokens, passwords)
90
+ - **Blocks on detection**: Push fails if credentials are found
91
+ - **No bypass**: `--no-verify` skips the hook but is not recommended (use GitHub branch protection for real enforcement)
92
+
93
+ **Pair with GitHub branch protection**:
94
+ ```
95
+ Settings > Branches > main
96
+ ✓ Require pull request reviews
97
+ ✓ Require status checks to pass
98
+ ✓ Dismiss stale PR approvals
99
+ ✓ Restrict pushes to (Admins only)
100
+ ```
101
+
102
+ See [HOOK-INSTALL.md](HOOK-INSTALL.md) for setup and customization.
103
+
104
+ ---
105
+
106
+ ## Governance: Single-Writer Files & Heartbeat Protocol
107
+
108
+ Keep the system coherent: one writer per control file, one instance per standing loop, heartbeat protocol to detect stalls.
109
+
110
+ ### Single-writer enforcement
111
+
112
+ Some files must have exactly one writer:
113
+
114
+ - **MEMORY.md** — memory keeper only
115
+ - **STATE.md** — active orchestrator only
116
+ - **BUILDLOG.md** — append-only (anyone appends, no one edits earlier entries)
117
+ - **Other loops** → append requests to an inbox file, never edit control files directly
118
+
119
+ **Why**: Prevents race conditions, data corruption, and conflicting writes.
120
+
121
+ ### Heartbeat protocol
122
+
123
+ Standing loops (watchdog, monitor, memory keeper) must not run in duplicate. Before starting, each loop:
124
+
125
+ 1. Checks `~/.claude/loops/<loop-name>.heartbeat`
126
+ 2. If exists and recent (<5 min old), skips (another instance running)
127
+ 3. If missing or stale, creates heartbeat, runs loop, deletes heartbeat on exit
128
+
129
+ **Result**: Idempotent, collision-free loop execution.
130
+
131
+ See [GOVERNANCE.md](GOVERNANCE.md) for single-instance loops, inbox patterns, and AUTO/PROPOSE action tiers.
132
+
133
+ ---
134
+
135
+ ## Reliability Core: Inputs Always Produce Outputs
136
+
137
+ **Rule**: Every input (event, request, cycle) must produce output (brief/log/heartbeat/FAILED). The orchestrator never goes idle — it dispatches next work, extends roadmap, gathers signals, and always offers the user an idea for what to do next.
138
+
139
+ ### No silent hangs
140
+
141
+ - **Daemons emit heartbeats** every cycle (even on error)
142
+ - **Logs are append-only** with timestamps
143
+ - **Hung agents**: Watchdog detects stalls >200s and respawns (max 3 retries)
144
+ - **Orchestrator briefs user** while delegating to agents (never idle)
145
+
146
+ ### The pride bar
147
+
148
+ Never ship known-broken. **Done** means:
149
+
150
+ - Verified end-to-end (not just tests pass)
151
+ - Briefs cross-checked against reality
152
+ - Test artifacts cleaned
153
+ - Loose ends closed or explicitly logged
154
+ - Nothing known-broken shipped silently
155
+
156
+ If you'd hesitate to hand it over under your own name, keep going.
157
+
158
+ See [CARDINAL-RULES.md](CARDINAL-RULES.md) for the full 10 foundational principles.
159
+
160
+ ---
161
+
162
+ ## Observability & Cost Tracking
163
+
164
+ Every agent run is logged, every cost is tracked, every security event is triaged.
165
+
166
+ ### What's logged
167
+
168
+ - **Agent transcripts**: Each agent's reasoning and output
169
+ - **Fleet heartbeats**: Watchdog checks every 10–150s
170
+ - **Cost ledger**: Token spend per model, per agent, per wave
171
+ - **Security events**: Secret-scan detections, branch violations
172
+
173
+ ### Dashboard access
174
+
175
+ Open http://localhost:8770 (after `python ui/serve.py`):
176
+
177
+ - **Overview**: Fleet agents, recent events, security alerts
178
+ - **Work**: Task kanban (proposed → ranked → in-progress → done)
179
+ - **Activity**: Agent timeline, main-thread reasoning
180
+ - **Cost**: Token spend breakdown, per-day bar chart
181
+
182
+ ### Audit trail
183
+
184
+ Everything lives in git or durable checkpoints:
185
+
186
+ - **Commits**: Agent work lives in feature branches, merged PRs
187
+ - **STATE.md / BUILDLOG.md**: Phase progress and decisions
188
+ - **Logs**: `state/FLEET-BACKUP.log`, monitor outputs, cost ledger
189
+
190
+ ---
191
+
192
+ ## Reliability Guarantees
193
+
194
+ ### Orchestrator isolation
195
+
196
+ The orchestrator reads only:
197
+
198
+ - **CLAUDE.md** — Cardinal rules (prompt-cached, warm across turns)
199
+ - **STATE.md** — Current phase and NEXT STEPS
200
+ - **BUILDLOG.md** — Recent progress
201
+ - **MEMORY.md** — Team facts and learnings
202
+ - **Short git one-liners** — Recent commits, branch status
203
+
204
+ **Why**: Lean context (no re-reading full codebase) = cheaper decisions, faster wall-clock, warm prompt cache.
205
+
206
+ See [CARDINAL-RULES.md](CARDINAL-RULES.md#4-orchestrator-isolation-lean-context) for details.
207
+
208
+ ### Durable state
209
+
210
+ STATE.md + BUILDLOG.md survive:
211
+
212
+ - Machine wipes
213
+ - Session timeouts
214
+ - Context loss
215
+ - Network interruptions
216
+
217
+ On resume, read them and sync from git. Zero data loss.
218
+
219
+ See [RELIABILITY.md](RELIABILITY.md) for the full reliability core and failure scenarios.
220
+
221
+ ---
222
+
223
+ ## Reference Docs
224
+
225
+ **For adopters getting started**:
226
+ - [INSTALL.md](INSTALL.md) — Installation & setup
227
+ - [CONFIGURE.md](CONFIGURE.md) — Configuration (aesop.config.json)
228
+ - [FIRST-WAVE.md](FIRST-WAVE.md) — Running your first wave cycle
229
+
230
+ **For operational reference** (deep dives):
231
+ - [HOW-THE-LOOP-WORKS.md](HOW-THE-LOOP-WORKS.md) — Concrete walkthrough of one wave
232
+ - [DISPATCH-MODEL.md](DISPATCH-MODEL.md) — Cost analysis, dispatch patterns
233
+ - [CHECKPOINTING.md](CHECKPOINTING.md) — STATE.md/BUILDLOG.md lifecycle, recovery
234
+ - [CARDINAL-RULES.md](CARDINAL-RULES.md) — 10 foundational principles (subagent discipline, TDD, reliability, orchestrator isolation, etc.)
235
+ - [GOVERNANCE.md](GOVERNANCE.md) — Single-writer files, heartbeat protocol, AUTO/PROPOSE tiers
236
+ - [RELIABILITY.md](RELIABILITY.md) — Reliability core, inputs-always-outputs, pride bar
237
+ - [HOOK-INSTALL.md](HOOK-INSTALL.md) — Pre-push hook setup and customization
238
+
239
+ **For specific tasks**:
240
+ - [BEHAVIORAL-PR-REVIEW.md](BEHAVIORAL-PR-REVIEW.md) — Checklist for PRs that modify rules
241
+ - [FORENSICS.md](FORENSICS.md) — Reconstruct agent failures (git-bisectable debugging)
242
+ - [RESTORE.md](RESTORE.md) — Reconstitute Aesop on a new machine
243
+ - [PUBLISHING.md](PUBLISHING.md) — Release to npm with OIDC trusted publishing
244
+
245
+ ---
246
+
247
+ ## Next Steps
248
+
249
+ 1. **Set up your environment**: [INSTALL.md](INSTALL.md)
250
+ 2. **Configure Aesop**: [CONFIGURE.md](CONFIGURE.md)
251
+ 3. **Run your first wave**: [FIRST-WAVE.md](FIRST-WAVE.md)
252
+ 4. **Deep dive into concepts**: Use the reference docs above as needed
253
+
254
+ Happy orchestrating!
@@ -0,0 +1,256 @@
1
+ # Configuration
2
+
3
+ **TL;DR**: Edit `aesop.config.json` to tell Aesop which repos to watch, where your Claude Code brain lives, and which ports to use.
4
+
5
+ ---
6
+
7
+ ## aesop.config.json
8
+
9
+ After setup, you'll have an `aesop.config.json` in your harness root. This file tells Aesop about your environment.
10
+
11
+ ```json
12
+ {
13
+ "aesopRoot": "/home/user/aesop",
14
+ "braindRoot": "/home/user/.claude",
15
+ "repos": [
16
+ {
17
+ "path": "/home/user/my-api",
18
+ "name": "api-backend"
19
+ },
20
+ {
21
+ "path": "/home/user/my-frontend",
22
+ "name": "web-frontend"
23
+ }
24
+ ],
25
+ "dashboardPort": 8770,
26
+ "dashboardOrigin": "http://localhost:8770"
27
+ }
28
+ ```
29
+
30
+ ### Field Reference
31
+
32
+ #### `aesopRoot` (string, required)
33
+
34
+ Absolute path to this Aesop harness directory. Used by daemons to locate scripts and state files.
35
+
36
+ **Example**: `/home/user/aesop` or `C:\Users\user\aesop` (Windows)
37
+
38
+ **Default**: Set automatically during `npx` scaffold.
39
+
40
+ ---
41
+
42
+ #### `braindRoot` (string, required)
43
+
44
+ Absolute path to your Claude Code home directory. This is where skills (`.claude/skills/`) and memory (`.claude/MEMORY.md`) live.
45
+
46
+ **Example**: `/home/user/.claude`
47
+
48
+ **Typical value**: `~/.claude` expanded to your home directory.
49
+
50
+ **Why it matters**: The `/power` skill primes the orchestrator brain from this root. Aesop loads CLAUDE.md rules, MEMORY.md facts, and skills from here.
51
+
52
+ ---
53
+
54
+ #### `repos` (array of objects, required)
55
+
56
+ List of repositories Aesop should watch and monitor.
57
+
58
+ Each repo object has:
59
+
60
+ - **`path`** (string): Absolute path to the repository root
61
+ - **`name`** (string): Short human-readable name (used in logs, dashboards, status)
62
+
63
+ **Example**:
64
+ ```json
65
+ "repos": [
66
+ {
67
+ "path": "/home/user/tr-sample-tracker",
68
+ "name": "tracker"
69
+ },
70
+ {
71
+ "path": "/home/user/my-api",
72
+ "name": "api"
73
+ }
74
+ ]
75
+ ```
76
+
77
+ **Why multiple repos?** Aesop can orchestrate work across your entire codebase — microservices, monorepos, or a suite of related projects. Each repo is monitored independently, but the orchestrator sees all of them.
78
+
79
+ ---
80
+
81
+ #### `dashboardPort` (number, default: 8770)
82
+
83
+ HTTP port for the web dashboard. The dashboard runs a Python HTTP server on this port.
84
+
85
+ **Example**: `8770`, `9000`, or any free port.
86
+
87
+ **To verify the port is free**:
88
+ ```bash
89
+ # On macOS/Linux
90
+ lsof -i :8770
91
+
92
+ # On Windows (PowerShell)
93
+ Get-NetTCPConnection -LocalPort 8770
94
+ ```
95
+
96
+ If the port is in use, pick a different one or kill the process using it.
97
+
98
+ ---
99
+
100
+ #### `dashboardOrigin` (string, default: http://localhost:8770)
101
+
102
+ The origin (scheme + host + port) for the dashboard. Used for CORS validation and CSRF protection.
103
+
104
+ **Example**:
105
+ - Local development: `http://localhost:8770`
106
+ - Remote machine: `http://192.168.1.100:8770`
107
+ - Behind a proxy: `https://aesop.example.com`
108
+
109
+ **Why it matters**: The dashboard validates incoming requests against this origin to prevent HTTP header injection attacks. If your CORS origin changes (e.g., you expose the dashboard publicly), update this.
110
+
111
+ ---
112
+
113
+ ## Example Configurations
114
+
115
+ ### Single repo, local development
116
+
117
+ ```json
118
+ {
119
+ "aesopRoot": "/home/user/aesop",
120
+ "braindRoot": "/home/user/.claude",
121
+ "repos": [
122
+ {
123
+ "path": "/home/user/my-app",
124
+ "name": "my-app"
125
+ }
126
+ ],
127
+ "dashboardPort": 8770,
128
+ "dashboardOrigin": "http://localhost:8770"
129
+ }
130
+ ```
131
+
132
+ ### Microservices architecture
133
+
134
+ ```json
135
+ {
136
+ "aesopRoot": "/home/user/aesop",
137
+ "braindRoot": "/home/user/.claude",
138
+ "repos": [
139
+ {
140
+ "path": "/home/user/services/auth",
141
+ "name": "auth-service"
142
+ },
143
+ {
144
+ "path": "/home/user/services/api",
145
+ "name": "api-gateway"
146
+ },
147
+ {
148
+ "path": "/home/user/services/data",
149
+ "name": "data-service"
150
+ },
151
+ {
152
+ "path": "/home/user/infra",
153
+ "name": "infrastructure"
154
+ }
155
+ ],
156
+ "dashboardPort": 8770,
157
+ "dashboardOrigin": "http://localhost:8770"
158
+ }
159
+ ```
160
+
161
+ ### Windows paths
162
+
163
+ ```json
164
+ {
165
+ "aesopRoot": "C:\\Users\\user\\aesop",
166
+ "braindRoot": "C:\\Users\\user\\.claude",
167
+ "repos": [
168
+ {
169
+ "path": "C:\\Users\\user\\projects\\my-api",
170
+ "name": "api"
171
+ }
172
+ ],
173
+ "dashboardPort": 8770,
174
+ "dashboardOrigin": "http://localhost:8770"
175
+ }
176
+ ```
177
+
178
+ ---
179
+
180
+ ## Security Notes
181
+
182
+ ### git-ignore aesop.config.json
183
+
184
+ **Never commit `aesop.config.json` to git.** It may contain local paths, private repo paths, or other local configuration.
185
+
186
+ Add to `.gitignore`:
187
+ ```
188
+ aesop.config.json
189
+ ```
190
+
191
+ Commit `aesop.config.example.json` instead, with safe default values.
192
+
193
+ ### Keep secrets out of the config
194
+
195
+ Aesop credentials (GitHub tokens, API keys) should never go in `aesop.config.json`. Instead:
196
+
197
+ 1. Set them as environment variables
198
+ 2. Use GitHub Actions secrets for CI/CD
199
+ 3. Store them in your `~/.claude/` private brain (which is git-ignored)
200
+
201
+ ---
202
+
203
+ ## Environment Variables
204
+
205
+ You can override config values via environment variables (optional):
206
+
207
+ ```bash
208
+ # Override the Aesop root
209
+ export AESOP_ROOT=/path/to/aesop
210
+
211
+ # Override the Claude Code home
212
+ export CLAUDE_CODE_HOME=/path/to/.claude
213
+
214
+ # Enable debug logging in daemons
215
+ export DEBUG=1
216
+ ```
217
+
218
+ If set, these override the values in `aesop.config.json`.
219
+
220
+ ---
221
+
222
+ ## Validating Your Configuration
223
+
224
+ After editing `aesop.config.json`, validate it:
225
+
226
+ ```bash
227
+ # Check JSON syntax
228
+ node -e "console.log(JSON.parse(require('fs').readFileSync('aesop.config.json')))"
229
+
230
+ # Run the watchdog once to verify setup
231
+ bash daemons/run-watchdog.sh --once
232
+ ```
233
+
234
+ Expected output:
235
+ ```
236
+ [watchdog] backing up fleet state...
237
+ [watchdog] scanning for secrets...
238
+ [watchdog] drift check: (files checked) ✓
239
+ [watchdog] all clear
240
+ ```
241
+
242
+ If you see errors, check:
243
+ - All paths exist and are accessible
244
+ - JSON syntax is valid (no trailing commas)
245
+ - Git is initialized in all listed repos
246
+
247
+ ---
248
+
249
+ ## Next Steps
250
+
251
+ 1. **Read [FIRST-WAVE.md](FIRST-WAVE.md)** — Run your first `/power` → `/buildsystem` cycle
252
+ 2. **Review [CONCEPTS.md](CONCEPTS.md)** — Understand the dispatch model
253
+ 3. **Launch the dashboard** — `python ui/serve.py` (verify it loads)
254
+ 4. **Join the orchestration** — Type `/power` in Claude Code to prime your brain, then `/buildsystem` to start a wave
255
+
256
+ For operational governance (heartbeat protocol, single-writer files, etc.), see [GOVERNANCE.md](GOVERNANCE.md).