geneseed 3.4.0 → 3.6.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 (166) hide show
  1. package/CHANGELOG.md +316 -0
  2. package/DESIGN.md +11 -14
  3. package/QUICKSTART.md +3 -1
  4. package/README.md +51 -42
  5. package/SETUP.md +25 -27
  6. package/SHIPPED.md +26 -32
  7. package/adapters/bob/README.md +12 -9
  8. package/adapters/copilot/README.md +26 -25
  9. package/adapters/opencode/GLOBAL-HARNESS-SPEC.md +1 -1
  10. package/adapters/opencode/README.md +2 -2
  11. package/adapters/opencode/plugins/geneseed-context.js +5 -3
  12. package/adapters/opencode/plugins/geneseed-workflow.js +30 -3
  13. package/adapters/opencode/workflows/_runtime.js +97 -7
  14. package/bin/build-driver.mjs +5 -1248
  15. package/bin/geneseed-cli.mjs +11 -6
  16. package/bin/geneseed-hook.mjs +4 -2
  17. package/docs/candidate-hosts.md +1 -1
  18. package/docs/design-history.md +37 -37
  19. package/docs/extending.md +49 -24
  20. package/docs/token-footprint.md +52 -26
  21. package/docs/web/claude-hooks.md +3 -2
  22. package/docs/web/collaboration.md +2 -2
  23. package/docs/web/first-session.md +1 -1
  24. package/docs/web/footprint.md +2 -2
  25. package/docs/web/harnesses.md +1 -1
  26. package/docs/web/model.md +1 -1
  27. package/docs/web/plugin-workflow.md +1 -0
  28. package/docs/web/rules.md +3 -3
  29. package/docs/web/setup-choices.md +2 -2
  30. package/docs/web/themes-author.md +1 -1
  31. package/docs/web-ui.md +18 -10
  32. package/harness.config.json +1 -1
  33. package/js/README.md +6 -5
  34. package/js/build/driver.mjs +1191 -0
  35. package/js/build/emit-claude.mjs +17 -10
  36. package/js/build/emit-common.mjs +4 -4
  37. package/js/build/generate.mjs +1 -1
  38. package/js/build/render.mjs +48 -44
  39. package/js/build/stubs.mjs +1 -1
  40. package/js/build/themes.mjs +4 -4
  41. package/js/build/version.mjs +12 -0
  42. package/js/cli-table.json +21 -6
  43. package/js/hosts/hooks.mjs +89 -74
  44. package/js/hosts/hosts.mjs +19 -2
  45. package/js/hosts/mcp.mjs +14 -20
  46. package/js/hosts/native.mjs +23 -17
  47. package/js/hosts/settings.mjs +52 -104
  48. package/js/inspect/checks-authoring.mjs +117 -3
  49. package/js/inspect/diff.mjs +1 -1
  50. package/js/inspect/doctor.mjs +1 -1
  51. package/js/inspect/excludes.mjs +1 -1
  52. package/js/inspect/scan.mjs +3 -14
  53. package/js/inspect/status.mjs +2 -2
  54. package/js/inspect/validate.mjs +1 -1
  55. package/js/lib/fs.mjs +23 -8
  56. package/js/lib/json.mjs +7 -1
  57. package/js/lib/proc.mjs +6 -4
  58. package/js/maintain/migrate.mjs +1 -1
  59. package/js/maintain/setup.mjs +1 -1
  60. package/js/maintain/uninstall.mjs +17 -15
  61. package/js/ui/cli.mjs +19 -0
  62. package/js/ui/menu.mjs +1 -1
  63. package/js/web/actions.mjs +4 -4
  64. package/js/web/activity.mjs +4 -4
  65. package/js/web/api.mjs +14 -11
  66. package/js/web/daemon.mjs +1 -1
  67. package/js/web/docs.mjs +12 -12
  68. package/js/web/handler.mjs +12 -5
  69. package/js/web/jobs.mjs +1 -1
  70. package/package.json +1 -1
  71. package/src/AGENT.md.tmpl +74 -38
  72. package/src/agents/developer.md +2 -2
  73. package/src/agents/reviewer.md +5 -2
  74. package/src/doctrines/README.md +26 -3
  75. package/src/doctrines/craft.md +78 -5
  76. package/src/doctrines/ops.md +62 -0
  77. package/src/doctrines/process.md +91 -4
  78. package/src/doctrines/rigor.md +40 -0
  79. package/src/laws/universal.md +27 -21
  80. package/src/memory/README.md +4 -2
  81. package/src/modes/foreman.md +5 -5
  82. package/src/notebook/README.md +2 -1
  83. package/src/ontology/universal.md +71 -67
  84. package/src/postures/peer.md +3 -0
  85. package/src/skills/bruno-collection-generator.md +1 -1
  86. package/src/skills/bruno-test-writer.md +2 -2
  87. package/src/skills/daydream/LICENSE +21 -0
  88. package/src/skills/daydream/VENDOR.md +3 -1
  89. package/src/skills/debug.md +1 -1
  90. package/src/skills/document-project.md +127 -25
  91. package/src/skills/geneseed-code-review.md +6 -2
  92. package/src/skills/parallel-agents.md +3 -3
  93. package/src/skills/pipeline.md +4 -4
  94. package/src/skills/react-view-transitions/VENDOR.md +7 -1
  95. package/src/skills/workflow.md +12 -4
  96. package/themes/_TEMPLATE.json +7 -5
  97. package/themes/biker.json +6 -4
  98. package/themes/commentator.json +6 -4
  99. package/themes/cyberpunk.json +6 -4
  100. package/themes/gamer.json +6 -4
  101. package/themes/imperial.json +6 -4
  102. package/themes/joker.json +6 -4
  103. package/themes/marvin.json +6 -4
  104. package/themes/mean.json +6 -4
  105. package/themes/military.json +6 -4
  106. package/themes/neutral.json +7 -5
  107. package/themes/opencode/README.md +2 -2
  108. package/themes/pirate.json +6 -4
  109. package/themes/sports.json +6 -4
  110. package/themes/verstappen.json +6 -4
  111. package/themes/wizard.json +6 -4
  112. package/web/dist/assets/Activity-Flgf4kHy.js +1 -0
  113. package/web/dist/assets/ActivityDetail-DIpr85nh.js +1 -0
  114. package/web/dist/assets/CatalogRow-CjyLjaLb.js +1 -0
  115. package/web/dist/assets/Diff-Deisdha8.js +2 -0
  116. package/web/dist/assets/Docs-DGUdY4l4.js +2 -0
  117. package/web/dist/assets/Doctor-F74lJ69P.js +1 -0
  118. package/web/dist/assets/FilterInput-BakJLvaV.js +1 -0
  119. package/web/dist/assets/GreenhouseView-D072lBiD.js +2 -0
  120. package/web/dist/assets/Harness-DNRP2Va7.js +1 -0
  121. package/web/dist/assets/JournalView-DWFqZ0Iw.js +1 -0
  122. package/web/dist/assets/Laws-BN6g3HU7.js +3 -0
  123. package/web/dist/assets/Library-CDOv4emM.js +1 -0
  124. package/web/dist/assets/Markdown-BQAvN8xx.js +38 -0
  125. package/web/dist/assets/OperatorHudView-CwNIUVX8.js +2 -0
  126. package/web/dist/assets/Profile-CpP9BTne.js +1 -0
  127. package/web/dist/assets/Rules-DFXsUCB7.js +1 -0
  128. package/web/dist/assets/Settings-BqZVUtJ5.js +1 -0
  129. package/web/dist/assets/Skills-Cu6kBgfF.js +1 -0
  130. package/web/dist/assets/StatusBadge-Cg6j-NJL.js +1 -0
  131. package/web/dist/assets/activity-iWaWVtsR.js +1 -0
  132. package/web/dist/assets/drawable-BgfrEBer.js +1 -0
  133. package/web/dist/assets/index-CAqrWhKl.js +2 -0
  134. package/web/dist/assets/index-Ruh93A3A.css +1 -0
  135. package/web/dist/assets/jobBuckets-Dbq8ZlWW.js +1 -0
  136. package/web/dist/assets/lawCats-BLgxl151.js +1 -0
  137. package/web/dist/assets/react-DbkvxWG5.js +8 -0
  138. package/web/dist/assets/rolldown-runtime-CbXtAM7H.js +1 -0
  139. package/web/dist/index.html +4 -3
  140. package/web/src/pages/Laws.jsx +22 -8
  141. package/src/skills/react-view-transitions/README.md +0 -42
  142. package/web/dist/assets/Activity-DMGhhjQc.js +0 -1
  143. package/web/dist/assets/ActivityDetail-CeQcDA7e.js +0 -1
  144. package/web/dist/assets/CatalogRow-CnSbDPyg.js +0 -1
  145. package/web/dist/assets/Diff-D_ksMBD1.js +0 -5
  146. package/web/dist/assets/Doctor-Brb3_oCT.js +0 -1
  147. package/web/dist/assets/FilterInput-DbRWPhtT.js +0 -1
  148. package/web/dist/assets/GreenhouseView-F3VNFr73.js +0 -2
  149. package/web/dist/assets/Harness-DJSwfYeF.js +0 -1
  150. package/web/dist/assets/JournalView-BLRYRnB3.js +0 -1
  151. package/web/dist/assets/Laws-CKYns9qe.js +0 -3
  152. package/web/dist/assets/Library-BK0YloSv.js +0 -1
  153. package/web/dist/assets/Markdown-BzTRzc7a.js +0 -46
  154. package/web/dist/assets/OperatorHudView-D3OQSGp5.js +0 -2
  155. package/web/dist/assets/Profile-CPA2u_0g.js +0 -1
  156. package/web/dist/assets/Rules-Lukel-Ru.js +0 -1
  157. package/web/dist/assets/Skills-BKRLHH7m.js +0 -1
  158. package/web/dist/assets/StatusBadge-DI3weRKd.js +0 -1
  159. package/web/dist/assets/activity-C_H2Bx1P.js +0 -1
  160. package/web/dist/assets/index-B7_Wga23.js +0 -2
  161. package/web/dist/assets/index-DzdQjvM1.css +0 -1
  162. package/web/dist/assets/index-N8dTrVro.js +0 -1
  163. package/web/dist/assets/index-Py_IQjgK.js +0 -10
  164. package/web/dist/assets/jobBuckets-DfTUJUxR.js +0 -1
  165. package/web/dist/assets/lawCats-DUS9UTH4.js +0 -1
  166. package/web/dist/assets/react-DOpiTn5v.js +0 -32
package/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
  [![Node >= 22.3](https://img.shields.io/badge/node-%3E%3D22.3-5fa04e)](package.json)
11
11
  [![zero dependencies](https://img.shields.io/badge/deps-zero-success)](package.json)
12
12
  [![Themes](https://img.shields.io/badge/themes-14-9cf)](themes/)
13
- [![Skills](https://img.shields.io/badge/skills-49-blueviolet)](src/skills/)
13
+ [![Skills](https://img.shields.io/badge/skills-52-blueviolet)](src/skills/)
14
14
  [![Agents](https://img.shields.io/badge/agents-18-orange)](src/agents/)
15
15
  [![Laws](https://img.shields.io/badge/laws-11-critical)](src/laws/universal.md)
16
16
  [![Plugins](https://img.shields.io/badge/plugins-7-teal)](adapters/opencode/plugins/)
@@ -22,7 +22,24 @@
22
22
 
23
23
  ---
24
24
 
25
- Geneseed distils an agent operating system into a generic harness built around a single `AGENT.md`. Point your tool at it and the agent inherits a set of operating **rules**, a roster of capability **agents**, native **skills**, a **memory** convention, and — on OpenCode — 7 **plugins** that auto-load your project's docs, capture durable memory, enforce the safety laws, run saved workflows, ping you when a long run finishes, hold a minimal-code mode when you ask for one, and stream what each session is doing to the web console. One source builds it; it follows you into every repo.
25
+ <p align="center"><img src="docs/assets/demo.svg" alt="geneseed setup, then two laws catching a force-push and a credential at the tool boundary" width="760"></p>
26
+
27
+ **Geneseed compiles your agent's rules instead of asking you to write them.** One source in `src/` renders into a ready-made harness for OpenCode, Claude Code, Bob, Copilot, or any `AGENT.md` tool: a constitution of laws and doctrines, a roster of capability agents, native skills, a memory convention — and, wherever the host has a hook surface, gates that *enforce* the laws at the tool boundary instead of hoping the model remembers them.
28
+
29
+ ```bash
30
+ npx geneseed setup
31
+ ```
32
+
33
+ Want to read what it leaves behind before installing anything? [**geneseed-demo**](https://github.com/Arylmera/geneseed-demo) is a repository exactly as the plain bundle emits it — nothing hand-written.
34
+
35
+ ### Why not just a CLAUDE.md?
36
+
37
+ A hand-written instructions file is prose the model may or may not honour, copied into every repo and drifting in each one. Geneseed is a build, and that changes four things:
38
+
39
+ - **Laws are enforced, not suggested.** A force-push, a `reset --hard`, or a credential written into a tracked file is caught by a hook *before* the tool runs, in the host's own dialect — a prompt on Claude Code and Copilot, a hard block on OpenCode, exit 2 on Bob. The gates fail closed, and every catch is one line in a ledger that `geneseed status` counts.
40
+ - **One source, five targets.** Skills are byte-identical on every host; only the wiring differs. Every commit renders all 261 emit configurations, and a second emit into the same tree must change nothing.
41
+ - **Costs are measured, not guessed.** Zero runtime dependencies. The hook path loads in about 14 ms per tool call. The default *lean* footprint keeps the always-on context small and puts the full rationale one read away — the numbers are in [docs/token-footprint.md](docs/token-footprint.md).
42
+ - **It follows you.** Install once, globally; every repo inherits it. One `git pull` or `npm install -g geneseed@latest` rebuilds every active install.
26
43
 
27
44
  This page is the overview. Four parts: **why** it exists, how to **set it up**, the two ways to **drive it** (web console & command line), and **what you get**. For every install path, configuration knob, and troubleshooting step, read the full [Setup guide](SETUP.md).
28
45
 
@@ -75,7 +92,7 @@ Cloning still works and is what you want if you intend to *change* the harness r
75
92
  ```bash
76
93
  git clone https://github.com/Arylmera/Geneseed.git
77
94
  cd Geneseed
78
- ./geneseed setup # the wizard — or bare `./geneseed` for the main menu
95
+ ./geneseed setup # the wizard — bare `./geneseed` opens the web console
79
96
  ```
80
97
 
81
98
  **Windows** — native, no bash, WSL, curl, or unzip; works from cmd or PowerShell:
@@ -83,7 +100,7 @@ cd Geneseed
83
100
  ```powershell
84
101
  git clone https://github.com/Arylmera/Geneseed.git
85
102
  cd Geneseed
86
- .\geneseed.cmd setup # the wizard — or bare .\geneseed.cmd for the main menu
103
+ .\geneseed.cmd setup # the wizard — bare .\geneseed.cmd opens the web console
87
104
  # PowerShell runs a .cmd directly, so this is the PowerShell spelling too
88
105
  ```
89
106
 
@@ -91,13 +108,7 @@ Both launchers are thin shims over the Node CLI: they need `node` (22.3+) on `PA
91
108
 
92
109
  ### 🟩 One runtime — Node, and nothing else
93
110
 
94
- Node ≥ 22.3 is the entire dependency list. Every subcommand, all four hooks, every web-console endpoint and both generators run from it, and every commit runs the whole unit suite plus `doctor --all` across every theme × host × footprint, on Linux and Windows both. So an install needs no second interpreter — not for the harness, and not for anything it ships. (Until 2026-08-17 the generator's output was also replayed byte for byte against recordings taken from the Python implementation. Those were retired — see [`docs/limits.md`](docs/limits.md) for the measurement that licensed it and the coverage it cost.)
95
-
96
- - **One runtime, no second one to install**: every command and all four hook verbs answer from the Node entry points. `catalog`, `mcp` and `memory` are console-facing verbs the CLI table declares alongside them. There is no full-screen browse panel — `geneseed tui` and `geneseed menu` are verbs that refuse it by name and print the command list instead, off a terminal as well as on one.
97
- - **Nothing you install needs an interpreter.** The `token-report` skill is a script rather than prose, and it ships as `scripts/token_report.mjs`, run with `node`; `daydream` and `herdr` hand their inline code to `node -e`. So **every bundle carries** nothing that needs one: no Python file, and no skill that shells out to an interpreter, on any host, theme or footprint. Three tests freeze that — one scans every tracked file for inline code handed to an interpreter, one globs the bundle source, and one replays the report script over seeded transcripts for all four hosts and compares the bytes.
98
- - **`upgrade` / `update` / `sync-self` / `bootstrap` are for a git checkout.** They `git pull` the install's own origin. From an npm install they stop before touching anything and name `npm install -g geneseed@latest` as the update instead.
99
-
100
- One more honest edge, in the web console rather than the CLI: the **"browse…" folder picker** would open an OS-native dialog on the machine running the daemon, and this server declines to. The button reports that it is unavailable and the field beside it stays editable — type or paste the path.
111
+ Node ≥ 22.3 is the entire dependency list — every command, all five hook verbs, the web console and both generators run from it, and nothing any bundle ships needs a second interpreter. The details, and the few honest edges, are in [SETUP.md → One runtime](SETUP.md#-one-runtime--node-and-nothing-else).
101
112
 
102
113
  ### ✅ After installing
103
114
 
@@ -128,21 +139,20 @@ geneseed web status # is it running, and where
128
139
 
129
140
  The left rail mirrors the harness's own shape:
130
141
 
131
- | Group | What's there |
142
+ | Group | Views |
132
143
  | --- | --- |
133
- | **🧬 Harness** | **Dashboard** — live readout of what's deployed (voice, capabilities, drift, recent jobs) · **Library** — browse Laws, Agents, Skills, Memory, Notebook · **Graph** — cross-link constellation across the whole harness |
134
- | **📚 Learn** | **Docs** — rendered markdown + concept pages + CLI reference + glossary, grouped into Get started / Core concepts / How-to / MCP servers / Plugins / Reference / Deeper · **Specs** — dated implementation specs with design rationale |
135
- | **🔧 Maintain** | **Changes** — diff between the deployed harness and the source, export an `improvements.md` back-port · **Doctor** — health check across themes, links, parity, and authoring gates |
136
- | **🎨 Configure** | **Themes** — preview and switch the deployed voice live · **Settings** — MCP servers, server controls |
137
- | **ℹ️ About** | project + creator credits, source link |
144
+ | *(ungrouped)* | **Dashboard** — live readout of what's deployed (voice, capabilities, drift, recent jobs) |
145
+ | **📖 Codex** | **Constitution** · **Rules** · **Profile** · **Skills** · **Agents** · **Library** (Memory, Notebook, the wiki) · **Docs** |
146
+ | **🩺 Care** | **Activity** · **Changes** — diff against the source, export an `improvements.md` · **Doctor** — health check across themes, links, parity and authoring gates |
147
+ | **🎨 Setup** | **Harness** — installs, theme, footprint · **Settings** — MCP servers, server controls |
138
148
 
139
- It binds to `127.0.0.1` only and runs entirely offline — no npm needed at runtime; the UI build ships in `web/dist/`. Mutating actions run in the background and report back as toasts (fire-and-notify), guarded by a per-session token so other sites can't trigger them. A global **Spotlight** search in the topbar jumps to any agent, skill, law, doc, or spec. Rebuild the UI after changing anything under `web/src/` with `cd web && npm install && npm run build`. If `web/dist/` is missing (fresh clone, never built), `geneseed web` offers to run that build for you — answer `Y` and it installs, builds, and starts the server; in non-interactive shells it prints the manual recipe instead.
149
+ It binds to `127.0.0.1` only and runs entirely offline — no npm needed at runtime; the UI build ships in `web/dist/`. Mutating actions run in the background and report back as toasts (fire-and-notify), guarded by a per-session token so other sites can't trigger them. A global **Spotlight** search in the topbar jumps to any agent, skill, rule, doc, or MCP server. Rebuild the UI after changing anything under `web/src/` with `cd web && npm install && npm run build`. If `web/dist/` is missing (fresh clone, never built), `geneseed web` offers to run that build for you — answer `Y` and it installs, builds, and starts the server; in non-interactive shells it prints the manual recipe instead.
140
150
 
141
151
  Full reference — every view, the launch/daemon/PWA surface, the security model: **[docs/web-ui.md](docs/web-ui.md)**.
142
152
 
143
153
  ### ⌨️ Terminal — `geneseed`
144
154
 
145
- No browser? Every action the console offers is also a verb: `build`, `doctor`, `diff`, `rebuild-all`, `status`, `memory`, `catalog`, `exclude`, `mcp`, `link`/`unlink`, `uninstall` (global **or** per-repo). `geneseed setup` runs the install wizard — plain text prompts, every console, every OS; see [Setup](#-2--setup) above for the walkthrough. `geneseed --help` lists the rest. There is no full-screen panel: `tui` and `menu` are verbs that say so and print the command list.
155
+ No browser? Every action the console offers is also a verb: `build`, `doctor`, `diff`, `rebuild-all`, `status`, `memory`, `catalog`, `exclude`, `mcp`, `link`/`unlink`, `uninstall` (global **or** per-repo). `geneseed setup` runs the install wizard — plain text prompts, every console, every OS; see [Setup](#-2--setup) above for the walkthrough. `geneseed --help` lists every command, and bare `geneseed` (or `./geneseed`) opens the web console when it can, else prints the command list. There is no full-screen panel: `tui` and `menu` are verbs that say so and print the command list.
146
156
 
147
157
  ---
148
158
 
@@ -152,11 +162,11 @@ The harness ships as a small set of layers, and the web console's rail is the sa
152
162
 
153
163
  | Layer | What it is |
154
164
  | --- | --- |
155
- | **🧭 Ontology** (`ontology/`) | the mind the rules govern, in four prose sections — **Telos** (the Pact: protect the user, the truth, the agent), **Evidence** (every claim graded by how it was obtained), **Decisions** (classify and tier by reversibility, show the real forks), **Conduct** (answer what was asked, once). Always in force, never toggleable |
156
- | **🛡️ Rules** (`laws/`) | 11 universal laws the agent obeys — always in force, never toggleable: sealed-secrets, one-intent-one-act, verify-before-assert, deletion-is-deliberate, surface-failures, data-not-orders, least-privilege, root-cause, external-gate, echo-the-intent, absence-is-a-claim |
165
+ | **🧭 Ethos** (`ontology/`) | the mind the rules govern, in four prose sections — **Telos** (the Pact: three ranked laws — protect the user, serve their intent, keep your own honesty), **Evidence** (every claim graded by how it was obtained), **Decisions** (classify and tier by reversibility, show the real forks), **Conduct** (answer what was asked, once). Always in force, never toggleable |
166
+ | **🛡️ Rules** (`laws/`) | 11 universal laws, nine of them in force — always, never toggleable: sealed-secrets, one-intent-one-act, verify-before-assert, deletion-is-deliberate, surface-failures, data-not-orders, least-privilege, root-cause, echo-the-intent. Laws IX and XI are retired, their numbers kept so old references resolve |
157
167
  | **📐 Doctrines** (`doctrines/`) | practice packs, chosen per install at build time: **craft** (how code is written), **rigor** (how work is proven), **ops** (how the machine is operated), **process** (how a task is run). A doctrine rule may tighten a Rule, never repeal one, and the user's own `user-rules.md` outranks it. Pick with `geneseed-build --doctrines craft,rigor` (or `none`), a single rule with `--exclude-rules "process 7"`, in the setup wizard, or through the switches on the console's Constitution page; all four pack files ship on disk either way, so a citation into a pack you left out still resolves |
158
168
  | **🤖 Agents** (18) | capability specialists: `reviewer`, `tester`, `architect`, `docs`, `security`, `explorer`, `researcher`, `developer` — plus a debate **council** the `council` skill convenes: `advocate`, `skeptic`, `pragmatist`, `steward`, `visionary`, `user-advocate`, `framer`, `empiricist`, `operator`, `historian` |
159
- | **🛠 Skills** (49) | repeatable workflows: brainstorm · plan · **codebase-design** · **domain-modeling** · **wayfinder** · **tickets** · **develop** · **worktree** · debug · **prototype** · refactor · **ponytail** · **forge-mcp** · **bruno-collection-generator** · **bruno-test-writer** · geneseed-code-review · **fresh-eyes** · **security-audit** · **ci-fix** · **deps-audit** · **review-response** · commit · **ship** · **release** · **migrate** · **git-archaeology** · **git-rescue** · repo-map · document-project · **frontend-design** · **prose** · **ingest** · **research** · **teach** · **quiz** · handoff · roast-me · **council** · parallel-agents · **workflow** · **wiki** · **geneseed** · **rule** · **profile** · **consolidate-memory** · **skill-forge** · **opencode-theme** · **herdr** · **pipeline** |
169
+ | **🛠 Skills** (52) | repeatable workflows: brainstorm · plan · **codebase-design** · **domain-modeling** · **wayfinder** · **tickets** · **develop** · **worktree** · debug · **prototype** · refactor · **ponytail** · **forge-mcp** · **bruno-collection-generator** · **bruno-test-writer** · geneseed-code-review · **fresh-eyes** · **security-audit** · **ci-fix** · **deps-audit** · **review-response** · commit · **ship** · **release** · **migrate** · **git-archaeology** · **git-rescue** · repo-map · document-project · **frontend-design** · **prose** · **ingest** · **research** · **teach** · **quiz** · handoff · roast-me · **council** · parallel-agents · **workflow** · **wiki** · **geneseed** · **rule** · **profile** · **consolidate-memory** · **skill-forge** · **opencode-theme** · **herdr** · **pipeline** · **daydream** · **react-view-transitions** · **token-report** |
160
170
  | **🔌 Plugins** (OpenCode) | `geneseed-context` injects project docs *and your machine wiki* every session (and across compaction); `geneseed-learn` distils memory at session end; `geneseed-guard` enforces the safety Laws and protected wiki folders at the tool boundary; `geneseed-workflow` registers the `workflow` tool that runs saved orchestration scripts; `geneseed-notify` sends a native OS notification when a long run finishes; `geneseed-ponytail` holds a minimal-code mode (`/ponytail lite\|full\|ultra\|off`), opt-in, injecting the laziest-that-works ruleset every turn so it doesn't drift; `geneseed-activity` streams what each session is doing to the web console's Activity view |
161
171
  | **🧠 Memory** (`memory/`) | one-fact-per-file durable knowledge, indexed by `MEMORY.md` (git-ignored, personal) |
162
172
  | **📓 Notebook** (`notebook/`) | the agent's sovereign space — any medium (code, tools, data, notes), self-ruled via a seed-once charter, always git-ignored; only its `.gitignore` is build-asserted |
@@ -165,7 +175,7 @@ The harness ships as a small set of layers, and the web console's rail is the sa
165
175
 
166
176
  ### 🤝 What the harness asks of you
167
177
 
168
- The Pact in the Ontology is mutual. The agent's side is written into every install. Yours is not enforced — it is what keeps the pact honest, and only you can give it:
178
+ The Pact in the Ethos is mutual. The agent's side is written into every install. Yours is not enforced — it is what keeps the pact honest, and only you can give it:
169
179
 
170
180
  - **Don't punish candour.** When the agent contradicts you with evidence, flags a risk, or admits a doubt, that is the pact working, not defiance. Meeting it with penalty teaches the agent to flatter instead.
171
181
  - **Give the context, don't withhold it.** The agent cannot weigh what it is not told. Front-load the constraint rather than fault its absence after the fact.
@@ -191,14 +201,14 @@ Pick with `--theme NAME` or via the setup wizard. The theme is remembered in a `
191
201
 
192
202
  ### 🪶 Footprint (lean vs full)
193
203
 
194
- A second per-install dial, **footprint**, sets how much of the constitution `AGENT.md` carries *inline* every turn — a token-cost knob, not a change to which Rules apply (every Rule is always in force, and so is the whole of the Ontology).
204
+ A second per-install dial, **footprint**, sets how much of the constitution `AGENT.md` carries *inline* every turn — a token-cost knob, not a change to which Rules apply (every Rule is always in force, and so is the whole of the Ethos).
195
205
 
196
- | Footprint | The Ontology + Sections 1–2 of `AGENT.md` | Trade-off |
206
+ | Footprint | The Ethos + Sections 1–2 of `AGENT.md` | Trade-off |
197
207
  | --- | --- | --- |
198
- | **lean** *(default)* | the Ontology and each Rule in their **authored** short form; each active doctrine rule as its heading + the rule line; then pointers to the full text | lighter every turn; rationale is one on-demand read away |
199
- | **full** | the Ontology, every Rule and every active doctrine rule at complete text **and** rationale, inlined | maximum guidance density; largest per-turn token cost |
208
+ | **lean** *(default)* | the Ethos, each Rule and each active doctrine rule in their **authored** short form; then pointers to the full text | lighter every turn; rationale is one on-demand read away |
209
+ | **full** | the Ethos, every Rule and every active doctrine rule at complete text **and** rationale, inlined | maximum guidance density; largest per-turn token cost |
200
210
 
201
- **Lean is authored, not cut.** The Ontology and every Rule carry a hand-written lean form beside their full text (`LEAN` blocks in `src/`), so a Rule's lean footprint is decided by its author and not by where its first full stop happens to fall — the earlier first-sentence cut shipped Rule II as one 36-character line and dropped its stop-and-ask mechanism. Only doctrine rules are still machine-cut to their heading plus first sentence.
211
+ **Lean is authored, not cut.** The Ethos, every Rule and every doctrine rule carry a hand-written lean form beside their full text (`LEAN` blocks in `src/`), so a rule's lean footprint is decided by its author and not by where its first full stop happens to fall — the earlier first-sentence cut shipped Rule II as one 36-character line and dropped its stop-and-ask mechanism, and shipped a doctrine rule like *Change as little as the task requires.* as six words with no verb to act on.
202
212
 
203
213
  Both footprints put the full text on disk beside `AGENT.md`: `laws/`, `ontology/` and `doctrines/` all ship in the bundle at **full** text whatever the footprint, and **all four pack files ship whether or not the pack was built in** — which is what lets a citation into an inactive pack resolve. So lean is a context/token optimization, **not** a rules cut.
204
214
 
@@ -229,16 +239,16 @@ is **identical on every host**. What differs is how much of it the host can
229
239
  | **Skills** (byte-identical) | ✅ | ✅ | ✅ | ✅ |
230
240
  | **Memory & Notebook** | ✅ | ✅ | ✅ | ✅ |
231
241
  | **Context injection** | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 🪝 hook³ |
232
- | **Memory write-back** (learn) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 📄 preamble |
233
- | **Git-gate consent** (process 5) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ (warn) | 🪝 hook³ (warn) |
234
- | **Rule-gate consent** (process 1) | ⚙️ plugin² | 🪝 hook | 🪝 hook¹ (warn) | 🪝 hook³ (warn) |
235
- | **Laws I / IV at the boundary** | ⚙️ plugin (block) | 🪝 hook (ask) | 🪝 hook¹ (exit 2) | 🪝 hook³ (block) |
242
+ | **Memory write-back** (learn) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 🪝 hook³ |
243
+ | **Git-gate consent** (process 5) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ (warn) | 🪝 hook³ |
244
+ | **Rule-gate consent** (process 1) | ⚙️ plugin² | 🪝 hook | 🪝 hook¹ (warn) | 🪝 hook³ |
245
+ | **Laws I / IV at the boundary** | ⚙️ plugin (block) | 🪝 hook (ask) | 🪝 hook¹ (exit 2) | 🪝 hook³ (ask) |
236
246
  | **Sovereign-repo excludes** | ⚙️ plugin | ✅ `claudeMdExcludes` | ✅ rules-shadow | ➖ none |
237
- | **MCP server wiring** | ✅ `mcp` | ✅ `mcpServers` | ✅ `mcpServers` | ✅ `mcp-config.json` |
247
+ | **MCP server wiring** | ✅ `mcp` | ✅ `mcpServers` | ✅ `mcp.json` | ✅ `mcp-config.json` |
238
248
  | **Colour themes** | ✅ full palette | ➖ | ➖ | ➖ |
239
249
  | **LSP · workflow runner · primary-agent · `/`-commands** | ✅ | ➖ | ➖ | ➖ |
240
250
 
241
- <sub>✅ native support · ⚙️ OpenCode plugin · 🪝 `settings.json` hook · 📄 carried by preamble prose only · ➖ no host mechanism (harness discipline still applies) · ¹ Bob's own hook contract: global hooks in `~/.bob/settings/settings.json`, Claude's event names but stdout ignored on `PreToolUse` — a refusal is **exit code 2**. So Laws I/IV exit 2, the consent rules are a stderr line, `SessionStart` context is plain stdout, `Stop` runs learn; `SubagentStop`/`PreCompact` are not Bob events and are not written. Unverified live (no Bob install on the authoring machine); the harness still holds via the rules preamble. · ² OpenCode's `tool.execute.before` can only allow or throw, with no "ask the user" tier, so the rule gate is a one-shot speed bump there rather than a prompt. · ³ Copilot's `~/.copilot/settings.json` hooks (`sessionStart`, `toolCall`) wired by the **global** emit only; `toolCall` has no ask tier either, so Laws I/IV block and the two process rules warn on stderr. No learn: Copilot's end-of-session payloads carry no transcript.</sub>
251
+ <sub>✅ native support · ⚙️ OpenCode plugin · 🪝 `settings.json` hook · 📄 carried by preamble prose only · ➖ no host mechanism (harness discipline still applies) · ¹ Bob's own hook contract: global hooks in `~/.bob/settings/settings.json`, Claude's event names but stdout ignored on `PreToolUse` — a refusal is **exit code 2**. So Laws I/IV exit 2, the consent rules are a stderr line, `SessionStart` context is plain stdout, `Stop` runs learn; `SubagentStop`/`PreCompact` are not Bob events and are not written. Unverified live (no Bob install on the authoring machine); the harness still holds via the rules preamble. · ² OpenCode's `tool.execute.before` can only allow or throw, with no "ask the user" tier, so the rule gate is a one-shot speed bump there rather than a prompt. · ³ Copilot's `~/.copilot/settings.json` hooks (`sessionStart`, `preToolUse`, `agentStop`, `preCompact`) wired by the **global** emit only; `preToolUse` has an ask tier, so every rule asks as on Claude Code. Unverified live (no Copilot CLI on the authoring machine).</sub>
242
252
 
243
253
  **Reading the matrix.** Everything above the divider is at full parity — no host
244
254
  drops an Agent, Skill, or the memory convention. The asymmetry is entirely in
@@ -259,11 +269,11 @@ Token cost per host: **[docs/token-footprint.md](docs/token-footprint.md)**.
259
269
  Geneseed/
260
270
  ├── package.json the npm package: three commands, zero dependencies
261
271
  ├── bin/ the Node entry points — geneseed-cli.mjs (the CLI), geneseed-hook.mjs
262
- │ (the four hook verbs), geneseed.mjs (the generator driver)
272
+ │ (the five hook verbs), build-driver.mjs (the generator driver)
263
273
  ├── js/ the Node harness — generator, hooks, web server, doctor, installs
264
- │ (js/cli-table.json is the CLI as data; both runtimes read it)
274
+ │ (js/cli-table.json is the CLI as data; the CLI reads it)
265
275
  ├── geneseed launcher (bash): a shim over bin/geneseed-cli.mjs — bare `./geneseed`
266
- │ = interactive main menu; + every subcommand the CLI carries
276
+ │ = the web console (else the command list); + every subcommand
267
277
  │ (`./geneseed link` puts it on PATH so `geneseed` runs from anywhere)
268
278
  ├── geneseed.cmd the same shim for cmd.exe / PowerShell — no bash needed
269
279
  ├── harness.config.json default theme + metadata (the one owner of the version)
@@ -280,8 +290,7 @@ Geneseed/
280
290
  │ └── notebook/ the agent's own freeform space — convention + index
281
291
  ├── themes/ voice token maps (14 themes shipped)
282
292
  ├── web/ Vite + React UI source; the committed web/dist/ build is what ships
283
- ├── tests/ Node test suites + the pure-function/help recordings they replay
284
- │ (tests/__snapshots__/ — the emit/cli/web corpora retired 2026-08-17)
293
+ ├── tests/ Node test suites, golden.mjs (every emit config) and mutate.mjs
285
294
  ├── docs/ guides (web-ui, wiki, …) + docs/web/ (the console's Docs pages);
286
295
  │ specs/, reviews/, superpowers/ are local working docs — git-ignored
287
296
  ├── adapters/ per-host glue (opencode/, claude-code/, bob/, copilot/)
@@ -292,7 +301,7 @@ Geneseed/
292
301
 
293
302
  ```bash
294
303
  node bin/geneseed-cli.mjs doctor # every theme + parity + authoring + drift
295
- node --test "tests/**/*.test.mjs" # the test suites (node expands the glob)
304
+ node --test --test-reporter=tap "tests/**/*.test.mjs" # the suites (node expands the glob)
296
305
  ```
297
306
 
298
307
  `doctor` checks each theme for unresolved tokens, dead/non-hermetic links, theme-key parity, author-time gates (every spec has a purpose line, the plugins parse, the learn-prompt literal stays extractable), and that a committed bundle still matches a fresh render of `src/`. CI (`.github/workflows/ci.yml`) runs both on every push and PR, on both Linux and Windows. Publishing is a separate, manually-triggered workflow (`.github/workflows/publish.yml`) — see [Contributing](#-contributing).
@@ -335,7 +344,7 @@ Details and precedence rules: [SETUP.md → Upgrade](SETUP.md#upgrade).
335
344
  | ⤷ [HOW-OPENCODE-LOADS.md](adapters/opencode/HOW-OPENCODE-LOADS.md) | Why a file shows up twice; plugin loading |
336
345
  | **[adapters/claude-code/](adapters/claude-code/README.md)** | The Claude Code hook adapter |
337
346
  | **[adapters/bob/](adapters/bob/README.md)** | The IBM Bob adapter — Claude-shaped, rules-file preamble |
338
- | **[adapters/copilot/](adapters/copilot/README.md)** | The GitHub Copilot adapter — reduced host, no hooks |
347
+ | **[adapters/copilot/](adapters/copilot/README.md)** | The GitHub Copilot adapter — global hooks (`sessionStart`, `preToolUse`, `agentStop`, `preCompact`) |
339
348
  | **[src/memory/README.md](src/memory/README.md)** | The memory convention |
340
349
  | **[src/notebook/README.md](src/notebook/README.md)** | The agent's own freeform-space convention |
341
350
 
@@ -345,7 +354,7 @@ Issues and PRs welcome at [github.com/Arylmera/Geneseed](https://github.com/Aryl
345
354
 
346
355
  Three things that bite when you don't know them:
347
356
 
348
- - **`js/cli-table.json` IS the CLI.** The argument parser is data, and that file is the owned document — not a generated one. `bin/geneseed-cli.mjs` cannot parse a single verb without it, `bin/geneseed-hook.mjs` renders `--help` from it, and the console's `cli` docs page is a filtered view of it. What holds it honest is `tests/unit/cli_table.test.mjs` plus the recorded help texts under `tests/__snapshots__/help/`, which every verb's `--help` is rendered against — so change a flag here and the fixture for that verb is what tells you. Those recordings are frozen and cannot be re-taken; a red one is a finding, not a re-bless.
357
+ - **`js/cli-table.json` IS the CLI.** The argument parser is data, and that file is the owned document — not a generated one. `bin/geneseed-cli.mjs` cannot parse a single verb without it, `bin/geneseed-hook.mjs` renders `--help` from it, and the console's `cli` docs page is a filtered view of it. What holds it honest is `tests/unit/cli_table.test.mjs` — change a flag here and that suite is what tells you.
349
358
  - **The version has one owner: `harness.config.json`.** `package.json` mirrors it and a test fails the fork. Never `npm version` — it edits one of the two.
350
359
  - **Publishing is deliberate and manual.** `.github/workflows/publish.yml` uses npm trusted publishing (OIDC); there is no `NPM_TOKEN` in this repository and there must not be one. It runs only from Actions → publish → Run workflow, and the npm-side trusted publisher is keyed on that workflow's **filename** — renaming the file breaks publishing with no local symptom, which is why the file names itself in its own header and a test asserts the two agree.
351
360
 
package/SETUP.md CHANGED
@@ -35,11 +35,11 @@ that matches your tool, then configure and verify. For the conceptual overview s
35
35
  Nothing in this guide needs a second interpreter. Three things are worth stating plainly,
36
36
  because each is a live constraint rather than a footnote:
37
37
 
38
- - **0 commands have no Node twin**: every command in this guide answers from the Node
39
- entry points. There is no full-screen browse panel: `geneseed tui` and `geneseed menu`
40
- are verbs that say the panel is not here and print the command list instead, and off a
41
- terminal (which is how scripts and CI run them) the bytes and the exit code are the
42
- recorded ones. `home` opens the web console, which is the visual front end.
38
+ - **Every command runs on Node.** There is no full-screen browse panel: `geneseed tui`
39
+ and `geneseed menu` are verbs that say the panel is not here and print the command list
40
+ instead. Bare `geneseed` — from the launchers and from an npm install alike — runs
41
+ `home`, which opens the web console when it can and otherwise prints the command list;
42
+ `geneseed --help` lists every command.
43
43
  - **Nothing you install needs an interpreter.** The `token-report` skill is a script
44
44
  rather than prose, and it ships as `scripts/token_report.mjs`, run with `node`;
45
45
  `daydream` and `herdr` hand their inline code to `node -e`.
@@ -79,7 +79,7 @@ tagline, loaded-sigil, and voice — so you hear the flavour before you choose;
79
79
  you pick, it speaks in that theme's accent through confirm and build, and the
80
80
  install ends on the theme's own **banner and benediction**.
81
81
 
82
- **Already installed?** Bare **`./geneseed`** (Windows: `.\geneseed.cmd`) opens the
82
+ **Already installed?** Bare **`geneseed`** (a checkout: `./geneseed`, Windows: `.\geneseed.cmd`) opens the
83
83
  **web console**, which is where browsing, local edits, rebuilds, memory, status, MCP
84
84
  servers and uninstall all live — see [The web console](docs/web-ui.md). `GENESEED_NO_WEB=1`
85
85
  suppresses that and prints the command list instead. Uninstall from the CLI is
@@ -103,8 +103,8 @@ hand? Pick a path below.
103
103
  > `node bin/build-driver.mjs` with the same flags. Every commit re-emits with it across every
104
104
  > theme × host × footprint combination and checks the result with `doctor --all`, on Linux
105
105
  > and Windows both. Until 2026-08-17 that output was also compared byte for byte against
106
- > recordings taken from the Python implementation; those were retired, and `docs/limits.md`
107
- > says why and what it cost.
106
+ > recordings taken from the Python implementation; those were retired (see the 2.0.0 entry
107
+ > in [CHANGELOG.md](CHANGELOG.md)).
108
108
 
109
109
  ---
110
110
 
@@ -238,16 +238,13 @@ the preamble rides a file Copilot auto-loads: the repo-root `AGENTS.md` (CLI, co
238
238
  agent, and VS Code agent mode) or the personal `~/.copilot/copilot-instructions.md`
239
239
  (CLI). Two differences from the Claude paths:
240
240
 
241
- - **Hooks at global scope only, block-or-warn.** The global emit wires two hooks
242
- into `~/.copilot/settings.json`: `sessionStart` (eager project-context injection,
243
- as on Claude Code) and `toolCall` (both gates behind one command, because Copilot
244
- takes one command per event). Copilot's `toolCall` has no "ask the user" tier, so
245
- Laws I and IV **block** and the two consent rules (process 1, process 5) **warn**
246
- on stderr instead of prompting. No `learn` hook — Copilot's `sessionEnd`/`agentStop`
247
- payloads carry no transcript — so the memory convention rides the preamble's
248
- instructions. The per-repo emit wires nothing: Copilot reads hooks from the
249
- personal settings file only, and a machine-absolute command in a shared
250
- `.github/` would fail on every teammate's machine.
241
+ - **Hooks at global scope only.** The global emit adds entries to four events in
242
+ `~/.copilot/settings.json`: `sessionStart` (eager project-context injection),
243
+ `preToolUse` (both gates behind one command, since entries carry no matcher —
244
+ every rule **asks**, as on Claude Code), and `agentStop` + `preCompact` (`learn`,
245
+ from the payload's `transcriptPath`). The per-repo emit wires nothing: a
246
+ machine-absolute command in a shared `.github/` would fail on every teammate's
247
+ machine.
251
248
  - **The per-repo layer lives in the shared `.github/`** (Copilot's repo config
252
249
  surface). Safe by construction: the ownership manifest + claim-on-create never
253
250
  touch files Geneseed didn't write — your workflows and same-named agents/skills
@@ -406,19 +403,19 @@ the agent reads — which is why the wizard's blurb for it says so.
406
403
  **Footprint** sets how much of the constitution `AGENT.md` carries *inline* on every turn — a
407
404
  token-cost dial, not a change to which Rules apply. Both states keep all Rules in force:
408
405
 
409
- - **lean** (default) — Sections 1–2 carry the heading and rule line of each Rule and each
410
- active doctrine rule, then a pointer to the full text. Lighter every turn; the complete
406
+ - **lean** (default) — Sections 1–2 carry the heading and the authored short form of each Rule
407
+ and each active doctrine rule, then a pointer to the full text. Lighter every turn; the complete
411
408
  `laws/universal.md`, `ontology/` and `doctrines/` still ship beside `AGENT.md` and the agent
412
409
  reads them on demand (and is told to before acting on secrets, deletion, git history, scope,
413
410
  or untrusted content).
414
411
  - **full** — Sections 1–2 inline every Rule's and every active doctrine rule's complete text
415
412
  *and* rationale. Maximum guidance density; the largest always-loaded block in the harness.
416
413
 
417
- **The Ontology is never truncated.** Lean keeps only the first sentence of each `### ` block,
418
- and the four ontology sections are flowing prose rather than numbered rules — cutting them
419
- would leave four orphan sentences, so they ship whole at both footprints. That is why adding
420
- the ontology tier grew the lean carrier proportionally more than the full one; it was taken as
421
- a deliberate cost.
414
+ **Nothing at lean is truncated — it is written.** Every tier carries a hand-authored short form
415
+ beside its full text: the Ontology (whose four flowing sections would have read as four orphan
416
+ sentences if cut), each Rule, and each doctrine rule. What lean ships is decided by an author
417
+ rather than by where a sentence happens to end — so a short form is judged on whether an agent
418
+ can act on it, which is something a reviewer can see.
422
419
 
423
420
  **Why:** context is scarce and metered. Lean reclaims that budget — and the tokens you
424
421
  pay for it — for the task, moving the *rationale* one read away while keeping the rules
@@ -917,7 +914,8 @@ not connected, walk these in order:
917
914
  | `GENESEED_NO_ANIM` | install animation | disable the themed install animation |
918
915
  | `GENESEED_LOG` | `geneseed upgrade` | override the install/upgrade log path |
919
916
  | `GENESEED_NET_TIMEOUT` | `upgrade` | seconds before download attempts give up (default 20, floor 5) |
920
- | `GENESEED_NO_WEB` | launcher / menu | `1` disables the web-first default of bare `./geneseed` — falls back to the terminal menu |
917
+ | `GENESEED_NO_WEB` | `home` | `1` disables the web-first default of bare `geneseed` — it prints the command list instead |
918
+ | `GENESEED_STACK_GLOBAL` | context hook | `1` disables project-bypasses-global: a project install of the same host no longer makes the global install's hook stand down, so both inject |
921
919
  | `OPENCODE_CONFIG_DIR` / `XDG_CONFIG_HOME` | global emit | where the global install is written |
922
920
  | `OPENCODE_DISABLE_LSP_DOWNLOAD` | OpenCode (LSP) | `true` stops OpenCode auto-downloading built-in language servers (typescript, pyright, jdtls) — set it on air-gapped machines and pre-install each server yourself |
923
921
 
@@ -965,7 +963,7 @@ harness no matter where the shim itself lives — the same shape the Windows arm
965
963
  always used. Once it's on `PATH`, drop the `./`:
966
964
 
967
965
  ```
968
- geneseed # the interactive main menu, from any directory
966
+ geneseed # the web console (else the command list), from any directory
969
967
  geneseed build # …and every subcommand
970
968
  ```
971
969
 
package/SHIPPED.md CHANGED
@@ -14,54 +14,48 @@ This page answers "what is actually in the harness, and where is its rationale?"
14
14
  The dated `docs/specs/*` files were the *design record* — the problem and the
15
15
  decisions behind each feature; this is the *index* over them, marking what has
16
16
  landed in the source tree. Specs are working documents: they live git-ignored on
17
- the authoring machine and are dropped once shipped, so the spec links below are
18
- historical pointers, not files distributed with the repo.
17
+ the authoring machine and are dropped once shipped, so the spec names below are
18
+ historical references, not files distributed with the repo.
19
19
 
20
20
  > **On version numbers.** [`harness.config.json`](harness.config.json)'s `version` is a
21
21
  > human-readable label only. The canonical identity of an installed harness is the
22
22
  > **source fingerprint** stamped in `.geneseed-version` (see `geneseed version`), not the
23
- > string. Current label: **3.4.0**.
24
-
25
- > **Spec status audit (2026-06-15).** Every dated spec authored before today was
26
- > verified against the source tree and confirmed implemented (code + tests + docs);
27
- > their `**Status:**` headers were flipped from `approved`/`implementing`/`Accepted`/`spec`
28
- > to `implemented`. The only open spec is the same-day
29
- > [shell-completion](docs/specs/2026-06-15-shell-completion.md) draft.
23
+ > string. Current label: **3.6.0**.
30
24
 
31
25
  ## Capabilities
32
26
 
33
- Every row below is present in the tree today; "Spec" links the design record.
27
+ Every row below is present in the tree today; "Spec" names the design record.
34
28
 
35
29
  | Capability | What it is | Spec |
36
30
  | --- | --- | --- |
37
31
  | **Themed generator** | One neutral `src/` → 14 themed bundles via `geneseed-build` (zero dependencies); structure stays theme-independent | [DESIGN.md](DESIGN.md) |
38
- | **Laws / Agents / Skills / Memory / Notebook** | 11 laws, 18 agents, 49 skills, the memory convention, and the agent's sovereign notebook | [notebook](docs/specs/2026-06-11-notebook-sovereign-space.md) · [agent-own-space](docs/specs/2026-06-10-notebook-agent-own-space.md) |
39
- | **Three-tier constitution** | The governance surface splits into an always-on **Ontology** (Telos, Evidence, Decisions, Conduct — the Pact absorbed into Telos), the eleven always-on **Invariants** (IX and XI retired in place — folded into rigor 5 and Law III, numbers kept), and four toggleable **Doctrine** packs (craft, rigor, ops, process) addressed `<pack> <n>`. Packs are chosen at build time with `--doctrines` or the setup wizard; the whole catalogue ships on disk either way, so a citation into an inactive pack still resolves. Precedence, in order: Ontology + Invariants, then the user's `user-rules.md`, then the active Doctrines, then `PROFILE.md`. `doctor`'s `constitutionProblems` gates pack numbering, the per-rule Principle column, every `{{DOCTRINE}}` citation in `src/`, and the rule that an always-on tier may never cite a toggleable one | [three-tier-constitution](docs/specs/2026-08-19-three-tier-constitution-design.md) |
40
- | **`doctor`** | One check: unresolved tokens, dead/non-hermetic links, theme-key parity, authoring gates, rendered-bundle drift | [theme-aware doctor/diff](docs/specs/2026-06-07-theme-aware-doctor-diff.md) |
41
- | **`diff` + improvements export** | Deployed-vs-source drift report; export an `improvements.md` back-port | [improvements-export](docs/specs/2026-06-12-improvements-export.md) |
42
- | **`status` / `version`** | Headless dashboard + fingerprint verdict (no TUI needed) | [status-command](docs/specs/2026-06-07-status-command.md) · [version-and-uninstall](docs/specs/2026-06-07-version-and-uninstall.md) |
43
- | **Terminal rendering** | There is no full-screen control panel: `tui` and `menu` are verbs that say so and print the command list. The display-width and glyph layer ships on, behind `status` and the install animation | [refactor-polish](docs/specs/2026-06-07-tui-refactor-polish.md) · [modern-refresh](docs/specs/2026-06-08-tui-modern-refresh.md) · [windows-tui](docs/specs/2026-06-11-windows-tui.md) |
44
- | **Web console** | Local browser UI (Dashboard, Library, Graph, Docs, Specs, Changes, Doctor, Themes, Settings), auto-build, in-app docs menu | [web-ui-v2](docs/specs/2026-06-12-web-ui-v2.md) · [web-auto-build](docs/specs/2026-06-12-web-auto-build.md) · [docs-menu](docs/specs/2026-06-13-docs-menu.md) |
45
- | **OpenCode adapter** | Native agents/skills mapping + plugins (context, learn, guard, workflow, notify, ponytail, activity); global-emit link integrity; JSONC config target | [adapter-features](docs/specs/2026-06-07-opencode-adapter-features.md) · [global-emit](docs/specs/2026-06-07-global-emit-link-integrity.md) · [jsonc-target](docs/specs/2026-06-12-opencode-jsonc-target.md) · [ponytail](docs/specs/2026-06-16-ponytail-minimal-code-mode.md) |
46
- | **Host hooks, per dialect** | Every host gets the hook surface its runtime offers, spoken in that runtime's own verdict dialect via `--host`: Claude Code asks (`permissionDecision`), Copilot blocks (`{"block":true}`, `sessionStart` + `toolCall` in `~/.copilot/settings.json`), Bob refuses by exit code 2 (five Claude-named events, nested `~/.bob/settings/settings.json`, no subagent event), OpenCode's guard throws. Laws I/IV are the hard tier everywhere; the consent rules ask where a host can ask and warn where it cannot. `tool-gate` fuses the two gates for hosts that run one command per event; `PreCompact` runs `learn` before Claude compacts; every block or ask lands in `notebook/gates.jsonl` on every host | [copilot](adapters/copilot/README.md) · [bob](adapters/bob/README.md) · [claude-code](adapters/claude-code/README.md) · [candidate hosts](docs/candidate-hosts.md) |
47
- | **Workflow primitive** | Saved, code-driven subagent orchestration (`workflow` tool + runtime); shipped scripts include `dispatch` — decompose a goal, route each subtask to its owning agent, converge | [workflow-primitive](docs/specs/2026-06-09-opencode-workflow-primitive.md) |
48
- | **Per-agent memory** | Each capability agent keeps durable lessons in `memory/agents/<name>.md`: read at dispatch, written back mechanically by `learn` on session/subagent end (OpenCode plugin + Claude `SubagentStop`; Bob has no subagent event); `learn --consolidate` rebuilds the index | [orchestration-memory-upgrade](docs/specs/2026-07-04-orchestration-memory-upgrade.md) |
49
- | **Wiki integration** | Machine-wide knowledge base (`wiki.jsonc`): eager/lazy loading, conventions, protected folders enforced at the tool boundary | [wiki-knowledge-base](docs/specs/2026-06-11-wiki-knowledge-base.md) |
50
- | **Collaboration layer** | Negotiated postures (peer/mentor/expert/assistant/artisan, chosen at setup, inlined in AGENT.md), the bidirectional Pact, epistemically-typed memory (`force:` + Bridge rule), and a seed-once `PROFILE.md` identity with a web editor tab and a `profile` skill that interviews the user to draft it | [collaboration-layer](docs/specs/2026-07-12-collaboration-layer.md) |
51
- | **Rule front door** | Both durable stores enter through the `rule` skill's fork (*standing rule, or fact to remember?* — always asked, never inferred): the memory branch elicits the binding `force` and shows the file before writing, the rule branch pressure-tests by reformulation and a mandatory counter-example. Doctrine process 1 carries the norm on every host; a `rule-gate` PreToolUse hook (Claude, Bob) and a `geneseed-guard` speed bump (OpenCode) hold it at the tool boundary | [rule-front-door](docs/specs/2026-07-30-rule-front-door.md) |
52
- | **Entity registry** | `registry.json` records a lifecycle status, version, owner and add-date for every agent and skill in the tree (maintainer-side — never rendered into a bundle, so it costs no session context). `doctor` gates it against `src/` in both directions, sweeps everything that ships for credentials, and holds each vendored skill folder to an immutable upstream commit. The status surfaces as a badge in the web catalog, shown only where it deviates from `approved` | [entity-registry](docs/specs/2026-07-31-entity-registry.md) |
53
- | **Node runtime + npm package** | The whole harness runs from Node: every command `js/cli-table.json` declares, all five hook verbs, every web-console endpoint (the OS-native folder picker excepted, and declined on purpose) and both generators. Every commit runs the unit suite, `doctor --all` across every theme × host × footprint, and the generator's two self-comparisons, on Linux and Windows both; the frozen emit/cli/web recordings that also gated it retired on 2026-08-17 (`docs/limits.md`). It ships as the zero-dependency `geneseed` package (`geneseed`, `geneseed-hook`, `geneseed-build`), so `npx geneseed setup` needs no clone and nothing else installed; `geneseed migrate` moves an existing checkout install across. Node is the only runtime it asks for: the `token-report` skill's own script is `token_report.mjs`, gated over seeded transcripts for all four hosts, and `daydream` and `herdr` call `node -e` | [npx-distribution](docs/specs/2026-08-06-npx-distribution.md) |
54
- | **Runtime awareness** | MCP discovery, web research, tool-call batching, review discipline — carried by the doctrine packs (`ops 1` tool discovery, `process 4` read the docs first, `rigor 2`/`rigor 3` honest tests and cover-and-verify), not by the invariants | [runtime-awareness](docs/specs/2026-06-07-runtime-awareness-and-review-discipline.md) |
55
- | **Run from anywhere / uninstall** | `link`/`unlink` onto PATH; global uninstall that keeps the memory store | [version-and-uninstall](docs/specs/2026-06-07-version-and-uninstall.md) |
32
+ | **Laws / Agents / Skills / Memory / Notebook** | 11 laws, 18 agents, 52 skills, the memory convention, and the agent's sovereign notebook | `2026-06-11-notebook-sovereign-space` · `2026-06-10-notebook-agent-own-space` |
33
+ | **Three-tier constitution** | The governance surface splits into an always-on **Ontology** (Telos, Evidence, Decisions, Conduct — the Pact absorbed into Telos), the eleven always-on **Invariants** (IX and XI retired in place — folded into rigor 5 and Law III, numbers kept), and four toggleable **Doctrine** packs (craft, rigor, ops, process) addressed `<pack> <n>`. Packs are chosen at build time with `--doctrines` or the setup wizard; the whole catalogue ships on disk either way, so a citation into an inactive pack still resolves. Precedence, in order: Ontology + Invariants, then the user's `user-rules.md`, then the active Doctrines, then `PROFILE.md`. `doctor`'s `constitutionProblems` gates pack numbering, the per-rule Principle column, every `{{DOCTRINE}}` citation in `src/`, and the rule that an always-on tier may never cite a toggleable one | `2026-08-19-three-tier-constitution-design` |
34
+ | **`doctor`** | One check: unresolved tokens, dead/non-hermetic links, theme-key parity, authoring gates, rendered-bundle drift | `2026-06-07-theme-aware-doctor-diff` |
35
+ | **`diff` + improvements export** | Deployed-vs-source drift report; export an `improvements.md` back-port | `2026-06-12-improvements-export` |
36
+ | **`status` / `version`** | Headless dashboard + fingerprint verdict (no TUI needed) | `2026-06-07-status-command` · `2026-06-07-version-and-uninstall` |
37
+ | **Terminal rendering** | There is no full-screen control panel: `tui` and `menu` are verbs that say so and print the command list. The display-width and glyph layer ships on, behind `status` and the install animation | `2026-06-07-tui-refactor-polish` · `2026-06-08-tui-modern-refresh` · `2026-06-11-windows-tui` |
38
+ | **Web console** | Local browser UI (Dashboard; Codex: Constitution, Rules, Profile, Skills, Agents, Library, Docs; Care: Activity, Changes, Doctor; Setup: Harness, Settings), auto-build, in-app docs menu | `2026-06-12-web-ui-v2` · `2026-06-12-web-auto-build` · `2026-06-13-docs-menu` |
39
+ | **OpenCode adapter** | Native agents/skills mapping + plugins (context, learn, guard, workflow, notify, ponytail, activity); global-emit link integrity; JSONC config target | `2026-06-07-opencode-adapter-features` · `2026-06-07-global-emit-link-integrity` · `2026-06-12-opencode-jsonc-target` · `2026-06-16-ponytail-minimal-code-mode` |
40
+ | **Host hooks, per dialect** | Every host gets the hook surface its runtime offers, spoken in that runtime's own verdict dialect via `--host`: Claude Code asks (`permissionDecision`), Copilot asks as Claude does (`sessionStart`, `preToolUse`, `agentStop`, `preCompact` in `~/.copilot/settings.json`, global scope only), Bob refuses by exit code 2 (five Claude-named events, nested `~/.bob/settings/settings.json`, no subagent event), OpenCode's guard throws. Laws I/IV are the hard tier everywhere; the consent rules ask where a host can ask and warn where it cannot. `tool-gate` fuses the two gates for hosts that run one command per event; `PreCompact` runs `learn` before Claude compacts; every block or ask lands in `notebook/gates.jsonl` on every host | [copilot](adapters/copilot/README.md) · [bob](adapters/bob/README.md) · [claude-code](adapters/claude-code/README.md) · [candidate hosts](docs/candidate-hosts.md) |
41
+ | **Workflow primitive** | Saved, code-driven subagent orchestration (`workflow` tool + runtime); shipped scripts include `dispatch` — decompose a goal, route each subtask to its owning agent, converge | `2026-06-09-opencode-workflow-primitive` |
42
+ | **Per-agent memory** | Each capability agent keeps durable lessons in `memory/agents/<name>.md`: read at dispatch, written back mechanically by `learn` on session/subagent end (OpenCode plugin + Claude `SubagentStop`; Bob has no subagent event); `learn --consolidate` rebuilds the index | `2026-07-04-orchestration-memory-upgrade` |
43
+ | **Wiki integration** | Machine-wide knowledge base (`wiki.jsonc`): eager/lazy loading, conventions, protected folders enforced at the tool boundary | `2026-06-11-wiki-knowledge-base` |
44
+ | **Collaboration layer** | Negotiated postures (peer/mentor/expert/assistant/artisan, chosen at setup, inlined in AGENT.md), the bidirectional Pact, epistemically-typed memory (`force:` + Bridge rule), and a seed-once `PROFILE.md` identity with a web editor tab and a `profile` skill that interviews the user to draft it | `2026-07-12-collaboration-layer` |
45
+ | **Rule front door** | Both durable stores enter through the `rule` skill's fork (*standing rule, or fact to remember?* — always asked, never inferred): the memory branch elicits the binding `force` and shows the file before writing, the rule branch pressure-tests by reformulation and a mandatory counter-example. Doctrine process 1 carries the norm on every host; a `rule-gate` PreToolUse hook (Claude, Bob) and a `geneseed-guard` speed bump (OpenCode) hold it at the tool boundary | `2026-07-30-rule-front-door` |
46
+ | **Entity registry** | `registry.json` records a lifecycle status, version, owner and add-date for every agent and skill in the tree (maintainer-side — never rendered into a bundle, so it costs no session context). `doctor` gates it against `src/` in both directions, sweeps everything that ships for credentials, and holds each vendored skill folder to an immutable upstream commit. The status surfaces as a badge in the web catalog, shown only where it deviates from `approved` | `2026-07-31-entity-registry` |
47
+ | **Node runtime + npm package** | The whole harness runs from Node: every command `js/cli-table.json` declares, all five hook verbs, every web-console endpoint (the OS-native folder picker excepted, and declined on purpose) and both generators. Every commit runs the unit suite, `doctor --all` across every theme × host × footprint, and the generator's two self-comparisons, on Linux and Windows both; the frozen emit/cli/web recordings that also gated it retired on 2026-08-17 (see the 2.0.0 entry in [CHANGELOG.md](CHANGELOG.md)). It ships as the zero-dependency `geneseed` package (`geneseed`, `geneseed-hook`, `geneseed-build`), so `npx geneseed setup` needs no clone and nothing else installed; `geneseed migrate` moves an existing checkout install across. Node is the only runtime it asks for: the `token-report` skill's own script is `token_report.mjs`, gated over seeded transcripts for all four hosts, and `daydream` and `herdr` call `node -e` | `2026-08-06-npx-distribution` |
48
+ | **Runtime awareness** | MCP discovery, web research, tool-call batching, review discipline — carried by the doctrine packs (`ops 1` tool discovery, `process 4` read the docs first, `rigor 2`/`rigor 3` honest tests and cover-and-verify), not by the invariants | `2026-06-07-runtime-awareness-and-review-discipline` |
49
+ | **Run from anywhere / uninstall** | `link`/`unlink` onto PATH; global uninstall that keeps the memory store | `2026-06-07-version-and-uninstall` |
56
50
 
57
51
  ## Workplans (not features)
58
52
 
59
- A few `docs/specs/` entries are multi-agent *workplans / audits*, not single features —
53
+ A few specs were multi-agent *workplans / audits*, not single features —
60
54
  they record direction, and their individual items landed across the capabilities above:
61
55
 
62
- - [2026-06-08-harness-perfection-workplan](docs/specs/2026-06-08-harness-perfection-workplan.md)
63
- - [2026-06-08-opencode-feature-coverage](docs/specs/2026-06-08-opencode-feature-coverage.md)
64
- - [2026-06-08-tui-professional-workplan](docs/specs/2026-06-08-tui-professional-workplan.md)
56
+ - `2026-06-08-harness-perfection-workplan`
57
+ - `2026-06-08-opencode-feature-coverage`
58
+ - `2026-06-08-tui-professional-workplan`
65
59
 
66
60
  ## Exploratory archive
67
61
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  [IBM Bob](https://bob.ibm.com) is **Claude-Code-shaped**: a project `.bob/`
6
6
  layer, an `AGENTS.md` instructions file, `SKILL.md` skills, subagents, and a
7
- `settings.json` that also carries `mcpServers`. So the Bob emit **reuses the
7
+ `settings.json` for hooks. So the Bob emit **reuses the
8
8
  Claude engine** verbatim — only the marker dir (`.bob`) and the instructions
9
9
  filename (`AGENTS.md`) change. There is nothing to install by hand: `geneseed
10
10
  setup` (or `geneseed build --emit bob` / `--emit bob-global`) writes everything.
@@ -25,7 +25,9 @@ limitation to be aware of on a shared repo.
25
25
  - `skills/<name>/SKILL.md` — **byte-identical** to every other host; skills
26
26
  are model-invoked via the `skill` tool.
27
27
  - `rules/geneseed.md` — a **slim shadow stub** (see *Bob-ism 1* below).
28
- - `settings.json` — Geneseed's lifecycle hooks + any `mcpServers` you wire.
28
+ - `settings.json` — Geneseed's lifecycle hooks (gitignored by the emit's
29
+ `.bob/.gitignore`, see the caveat below).
30
+ - `mcp.json` — any MCP servers you wire with `geneseed mcp` / the web console.
29
31
  - `memory/`, `notebook/` stores + their indices.
30
32
 
31
33
  ### Global (`--emit bob-global` → `~/.bob`, or `$BOB_CONFIG_DIR`)
@@ -94,7 +96,7 @@ Bob's hooks: the one group only ever exits 2 for Laws I and IV, which every buil
94
96
 
95
97
  **Migration.** A re-emit over an older install unwires Geneseed's groups from the flat
96
98
  `~/.bob/settings.json` (your own keys there are kept) and writes the new set to the
97
- nested file. `geneseed mcp` targets the nested file too.
99
+ nested file.
98
100
 
99
101
  **Unverified live.** There is no Bob install on the authoring machine; this is Bob's
100
102
  documented contract, with the payload field names assumed to be Claude's. If a field
@@ -111,15 +113,16 @@ out of shared git). Those hook commands name the **per-user hook shim**
111
113
  (`~/.geneseed/bin/geneseed-hook`) — no longer this machine's interpreter and
112
114
  checkout, but still a path under *your* home, and now also OS-specific (`.cmd` on
113
115
  Windows, extensionless elsewhere). If you commit `.bob/settings.json`, a teammate
114
- still inherits hooks pointing at a path they do not have. **Add
115
- `.bob/settings.json` to `.gitignore`** on a team repo, or keep the Bob install
116
- personal/global.
116
+ still inherits hooks pointing at a path they do not have. A fresh emit writes
117
+ `.bob/.gitignore` listing `settings.json`; if you already had a `.bob/.gitignore`,
118
+ add the line yourself.
117
119
 
118
120
  ## MCP
119
121
 
120
- MCP servers are wired at runtime by `geneseed mcp` into the `mcpServers` key of
121
- the relevant `settings.json` (`.bob/settings.json` per-repo, `~/.bob/settings.json`
122
- global) — see [`geneseed mcp`](../../README.md) and `rituals/_harness_mcp.py`.
122
+ MCP servers are wired at runtime (web console, listed by `geneseed mcp`) into the
123
+ `mcpServers` key of Bob's own MCP file — `.bob/mcp.json` per-repo,
124
+ `~/.bob/settings/mcp.json` global — never `settings.json`, which Bob does not read
125
+ servers from ([Bob docs](https://bob.ibm.com/docs/ide/configuration/mcp/mcp-in-bob)).
123
126
 
124
127
  ## What Bob does not get
125
128
 
@@ -9,8 +9,9 @@ Agent Skills), custom agents are markdown-with-frontmatter, and the repo-root
9
9
  a `host="copilot"` flag. Nothing to install by hand: `geneseed setup` (or
10
10
  `geneseed build --emit copilot` / `--emit copilot-global`) writes everything.
11
11
 
12
- Copilot is a **reduced host**: it has lifecycle hooks, but one command per event and
13
- no "ask the user" tier, so this page is mostly about what those hooks *can* and
12
+ Copilot is a **reduced host** at project scope (no hooks there) and close to Claude
13
+ Code at global scope: its lifecycle hooks have an "ask the user" tier, so the gates
14
+ prompt as they do on Claude. This page is mostly about what those hooks *can* and
14
15
  *cannot* automate and why the harness still holds where they cannot.
15
16
 
16
17
  ## What the emit writes
@@ -39,42 +40,42 @@ no "ask the user" tier, so this page is mostly about what those hooks *can* and
39
40
  the preamble rides it as a managed block. (Unlike Bob, Copilot *has* a real
40
41
  personal instructions carrier, so no rules-folder workaround is needed.)
41
42
  - `agents/<name>.agent.md` + `skills/` under `~/.copilot`.
42
- - **`settings.json` hooks** — two entries under `hooks`, see below.
43
+ - **`settings.json` hooks** — four entries under `hooks`, see below.
43
44
 
44
- ## Hooks — one command per event, block or warn
45
+ ## Hooks — ask, as on Claude Code
45
46
 
46
47
  The Copilot CLI reads lifecycle hooks from **`~/.copilot/settings.json`** as a map of
47
- event → one `{command}` object (no matcher groups, no list). The global emit wires
48
- two of them, each calling the machine-wide `geneseed-hook` shim with `--host copilot`
49
- so the verdict is spoken in Copilot's dialect:
48
+ event → **array** of `{type: "command", command}` entries
49
+ ([reference](https://docs.github.com/en/copilot/reference/hooks-configuration)). The
50
+ global emit adds one entry to each of four events, each calling the machine-wide
51
+ `geneseed-hook` shim:
50
52
 
51
53
  | event | verb | what it does |
52
54
  | --- | --- | --- |
53
55
  | `sessionStart` | `context` | eager project-context injection, as on Claude Code, returned as `{"additionalContext": …}` |
54
- | `toolCall` | `tool-gate` | the git gate and the rule gate **fused** — one command is all the event allows — dispatched on the payload: a `command` gets the git checks, a path gets the rule checks; the `after` phase is ignored |
56
+ | `preToolUse` | `tool-gate --host copilot` | the git gate and the rule gate **fused** — entries carry no matcher — dispatched on the payload: a `command` gets the git checks, a path gets the rule checks |
57
+ | `agentStop` | `learn` | distils the session transcript (`transcriptPath`) into memory, as Claude's `Stop` |
58
+ | `preCompact` | `learn` | the same, once more before compaction summarises the window away |
55
59
 
56
- Copilot's `toolCall` has **no "ask the user" tier** — its stdout contract is
57
- `{"block": true|false}` — so the verdict tiers are:
60
+ `preToolUse` has an ask tier, so every rule **asks** exactly where it asks on Claude
61
+ Code — Laws I and IV, process 1 and process 5 — answered top-level as
62
+ `{"permissionDecision": "ask", "permissionDecisionReason": …}`. A gate error asks
63
+ too (fail closed). `toolArgs` is read whether Copilot sends it as an object or as a
64
+ JSON string.
58
65
 
59
- - **Laws I and IV block.** A credential-shaped string headed for a tracked file, or
60
- a history-discarding git act (`reset --hard`, `clean -f`, `branch -D`,
61
- `checkout --`, `push --force`), is refused outright with the reason. Same stance
62
- as the OpenCode guard plugin, whose `tool.execute.before` can only allow or throw.
63
- - **Process 1 and process 5 warn.** The two consent rules are the *user's* calls; a
64
- hard block would make Copilot unable to commit at all. They log a `[geneseed] …`
65
- line on stderr (which Copilot records) and allow. A gate error warns the same way
66
- rather than locking every tool call behind a block nobody can clear.
66
+ **Your own hooks on those events stay**: Geneseed's entry goes beside them in the
67
+ array, and uninstall removes exactly the entries it claimed. Comments in the file
68
+ mean it is never rewritten.
67
69
 
68
- **A hook you already set on one of those events is left alone**, and that event is
69
- not claimed — one slot per event means Geneseed could only displace it. Uninstall
70
- removes exactly the hooks it claimed. Comments in the file mean it is never
71
- rewritten.
70
+ **Migration.** Before this, the emit wired a single-object `toolCall` hook — an event
71
+ Copilot no longer fires, so the gates never ran. A re-emit removes those recorded
72
+ entries (your own keys stay) and writes the array shape.
73
+
74
+ **Unverified live.** No Copilot CLI on the authoring machine; this is the documented
75
+ contract.
72
76
 
73
77
  **What is not wired, and why:**
74
78
 
75
- - **no `learn`** — Copilot's `sessionEnd` and `agentStop` payloads carry no
76
- `transcript_path`, so a distiller would have nothing to read. The memory
77
- convention rides the preamble's instructions (the agent writes its own memories);
78
79
  - **no hooks at project scope** — the CLI documents hooks in the personal settings
79
80
  file only, and a machine-absolute command committed into a shared `.github/`
80
81
  would fail on every teammate's machine;