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/CHANGELOG.md CHANGED
@@ -10,6 +10,322 @@ label. For the capability ↔ spec map, see [SHIPPED.md](SHIPPED.md).
10
10
 
11
11
  _Nothing yet._
12
12
 
13
+ ## [3.6.0] — 2026-09-27
14
+
15
+ **Upgrading:** re-emit (or `geneseed rebuild-all`) after installing. The root file changed, and
16
+ skills only start routing ahead of the startup ritual once it is re-emitted.
17
+
18
+ ### Added — skills
19
+
20
+ - **`document-project` writes the whole doc set** on an existing codebase: `docs/PRD.md`
21
+ (traced FR/NFR tables with stable IDs), `docs/DESIGN.md` (tokens with their sources and WCAG
22
+ contrast, UI projects only), `docs/architecture.md` (C4 L1–L3 plus inline ADRs) and a short
23
+ `AGENTS.md`, presented by `overview.html` and `design.html`. Every claim cites `path:line` or
24
+ carries a ⚠; re-runs rewrite only inside `geneseed:doc` fences and keep every ID (#149).
25
+
26
+ ### Fixed — skill routing
27
+
28
+ - **A matching skill is now the first tool call, before the readiness ritual.** The root file
29
+ told the model to read `context.json` before its first reply; its first tool calls were then
30
+ file reads, and a bug report was investigated by hand without ever loading `debug`. Both
31
+ footprints now say "Skills first". Measured with the new probe on Claude Code (sonnet, 3 runs
32
+ per case): `debug` went from 3/15 positive runs to 14–15/15 on both footprints, with every
33
+ near-miss still routed elsewhere (#150).
34
+ - **`debug` triggers on the symptom**: a failing test, a crash, an error or stack trace, a wrong
35
+ result, and it loads before reading code, not only before proposing a fix (#150).
36
+
37
+ ### Added — for maintainers
38
+
39
+ - **`tests/skill_triggers.mjs`, a hand-run probe** that emits a real bundle into a sandbox and asks
40
+ a real model whether each skill's description routes the prompts it should and only those.
41
+ Claude Code and OpenCode adapters, `--footprint lean|full`, isolated from the operator's own
42
+ plugins unless `--ambient`; infrastructure failures report as errors, never as misses. Not part
43
+ of the suite; `docs/extending.md` lists it as an optional last step for a new skill
44
+ (#148, #150, #151).
45
+
46
+ ## [3.5.0] — 2026-09-25
47
+
48
+ **Upgrading:** re-emit (or `geneseed rebuild-all`) after installing. Copilot installs need it most:
49
+ the re-emit replaces the legacy `toolCall` hook, which Copilot no longer fires, with the gates
50
+ listed under *Fixed — hosts and core*.
51
+
52
+ ### Added — web console motion
53
+
54
+ - **The dashboard moves where motion carries meaning** (anime.js 4, bundled into `web/dist` like
55
+ React; the Node package stays zero-dependency). The germination ring's arc, bezel ticks and
56
+ percentage now run off one tween instead of an arc transition under a number that had already
57
+ jumped. KPI, genome and run counters count up, and count from the old value on a refresh, so a
58
+ change is seen moving. The Greenhouse donuts sweep clockwise, each arc taking its share of the
59
+ time. The Journal lens's constitution map enters hub, spokes, tiers, then governed nodes, once
60
+ per page load and only when scrolled into view. The toast and confirm dialog enter via CSS
61
+ `@starting-style`. Every JS animation checks `prefers-reduced-motion` (the global CSS rule cannot
62
+ reach inline styles) and completes on a timer where rAF never fires. Shell bundle +13 KB gzip.
63
+ - **Motion as feedback across the console.** The console strip carries a scanning bar while a
64
+ job runs and flashes green or red when a watched job ends; a successful build sways the rail's
65
+ sprout. The rail's active-page highlight and every segmented control's pill are now one element
66
+ that glides to the new selection. Dashboard tabs settle in; Doctor's checks rise in one after
67
+ another with their status dots popping; law, rule, check, manifest and MCP panels grow open;
68
+ live Activity sessions slide into place on each poll (FLIP); search results cascade in once and
69
+ mark the matched text. A flavour swap crossfades through the View Transitions API.
70
+
71
+ ### Added — constitution
72
+
73
+ - **Process 8, one writer per file.** When several agents share code — sub-agents, a pipeline
74
+ crew, a workflow fan-out, another session in the same checkout — each file has one writer at a
75
+ time: every unit gets a write set, overlaps run in sequence or get one owner, shared append
76
+ files (registries, lockfiles, generated bundles) stay with the integrator, reviewers never edit,
77
+ and a change you did not make is merged or stops you, never overwritten. Borrowed from Orca's
78
+ task-spec contract (ownership + acceptance) and Claude Workflow's per-agent worktree isolation.
79
+ `parallel-agents`, `pipeline` and `workflow` carry the write set in their handoff envelopes and
80
+ check changed files against it on the way back; `workflow` lists Orca as a coordination host.
81
+ The `full` carrier ceiling moves 55_500 → 57_000 for the rule's text; `lean` does not move.
82
+ - **OpenCode workflows take `isolation: "worktree"`**, like Claude Code's Workflow: each such
83
+ agent runs on its own branch and worktree; an unchanged one is released, a changed one is kept,
84
+ and the summary names every kept branch and every file two agents changed (`rt.overlaps()`).
85
+ Nothing is merged for you, and without git the agent fails rather than run in the shared tree.
86
+ - **Ops 7, serialize against a rationed resource.** A rate-limited API, a quota or a single
87
+ gateway is called in sequence, never fanned out: budget the quota across its callers before any
88
+ parallelism, back off on refusal within a retry cap set first, and treat a refusal that repeats
89
+ unchanged as a hard limit to report, never a batch to re-send. It names the calls process 3's
90
+ "batch independent calls" must not batch.
91
+ - **Craft 7, one writer per value.** A value held by hand in several places — a version, a count,
92
+ a name, a threshold — gets one home as its sole writer; every other copy is derived from it or
93
+ gated against it, the homes are counted before the gate is trusted, and a tool that updates one
94
+ home is not trusted to have updated the rest. Distinct from process 8, which gives a *file* one
95
+ writer across agents; this gives a *value* one writer across files.
96
+ The carrier ceilings move `full` 57_500 → 59_500 and `lean` 38_900 → 39_500 for the two rules.
97
+
98
+ ### Added — doctor
99
+
100
+ - **A `leanBlockProblems` doctor arm** over `src/laws/universal.md` and every pack: exactly one
101
+ `LEAN` block per rule, neither half blank. `resolveLean` is a replace over a marker pair and
102
+ therefore a no-op on markerless text, so a rule that lost its block would inline its full
103
+ body at the default footprint in silence, with every other gate in the tree green. Nothing
104
+ in `js/inspect/` read a LEAN marker before this — not for the packs, and not for the laws.
105
+
106
+ ### Changed — tests and maintainer docs
107
+
108
+ - **CLI-matrix faults are edits of the real file, not copies of it.** Six `doctor` cells held
109
+ whole copies of `Laws.jsx`, `cyberpunk.json` and `registry.json` to change one line each; every
110
+ new rule, theme key or spec had to be carried into them by hand, and the `Laws.jsx` copies had
111
+ already drifted from the real file. A fault may now be `{ "edit": [[find, replace]] }`, applied
112
+ to the copied checkout; a `find` that does not match exactly once fails the cell.
113
+ - **`docs/extending.md` lists the seven CI commands** (`golden --cli` was missing), names the
114
+ craft-specific fixtures §2a skipped, and drops typed figures that had gone stale (the ceiling
115
+ headroom, a line number). `DESIGN.md` and §2c now say `I..XI` / `LEX_I..LEX_XI`, and the claim
116
+ that `LEX_I` is frozen in a recording is gone — the recordings were retired.
117
+
118
+ ### Changed — toolchain
119
+
120
+ - **Web console toolchain on current majors** (dev-only; React stays 18): vite 5 → 8, vitest
121
+ 2 → 5, jsdom 24 → 29, `@vitejs/plugin-react` 4 → 6, eslint / `@eslint/js` 9 → 10 and globals
122
+ 15 → 17 (the root's majors), `eslint-plugin-react-hooks` 5 → 7. `npm audit` in `web/`: 12
123
+ dev-only advisories (1 critical, in vitest 2) → 0. The React-Compiler rules that v7 brings
124
+ flagged setState-in-effect prop resets in five places; they now adjust state during render,
125
+ so a fresh payload never paints once with the previous one's selection. `web/dist` rebuilt
126
+ (gzip js+css ~144.6 → ~142.0 KB).
127
+ - **Vendored skills carry their license text.** `daydream` now ships upstream's MIT `LICENSE`.
128
+ `react-view-transitions` has none to copy — upstream declares MIT in its README only, which
129
+ its `VENDOR.md` now says. Its upstream repo `README.md` is no longer copied into every install;
130
+ its `AGENTS.md` stays, because the skill's `SKILL.md` points the agent at it.
131
+
132
+ ### Changed — architecture
133
+
134
+ - **The generator driver lives in `js/build/driver.mjs`.** Flag parsing, the nine emit targets
135
+ and the per-host emit orchestration were in `bin/build-driver.mjs`, so nine `js/` modules
136
+ (setup, migrate, doctor, diff, validate, uninstall, generate, the web actions) imported upward
137
+ from a binary. `bin/build-driver.mjs` is now a three-line entry. The unreachable `PORTED`
138
+ refusal (it equalled `EMITS`, which the parser already enforces) is gone, and the driver asks
139
+ `hostCatalogsNatively` instead of keeping its own copy of that table.
140
+
141
+ ### Changed — code cleanup
142
+
143
+ - 24 exports nothing imported are module-private now; `GATE_LEDGER` has one owner
144
+ (`js/hosts/hosts.mjs`) instead of a hard-coded copy in `status`; `hooks.mjs` imports
145
+ `resolvePath` instead of keeping a third copy; `within` has one owner (`js/lib/paths.mjs`).
146
+ - Docblocks that contradicted the code are corrected: the hide-window rule for inheriting
147
+ spawns, the JSONC trailing-comma pass (it is string-aware), the deleted `emit.mjs`, and two
148
+ package-manifest reasons (a false "js/web/docs.mjs serves ROOT/docs", hand-typed sizes).
149
+
150
+ ### Changed — the Ethos (#130)
151
+
152
+ - **The Pact is three ranked laws**, in Asimov's shape: protect the user first, serve their
153
+ intent second where it does not break the first, keep the agent's own honesty third. The
154
+ user now includes whoever maintains the code after the session — code its next reader cannot
155
+ follow is harm, like a false claim.
156
+ - **A coding evidence ladder.** Evidence grades the rungs a coding agent stands on: a green test
157
+ is a claim about the test, a clean type check a claim about the types. The absence and
158
+ truncation passage moved out — Law III already carries it.
159
+ - **The irreversible set is named.** Decisions lists the acts version control cannot undo — a
160
+ push to a shared branch, a schema or data migration, a deletion of data or history, a
161
+ published release, a secret, a call that reaches an external service or person; every other
162
+ edit runs freely.
163
+
164
+ ### Changed — footprint (#129)
165
+
166
+ - **The root file is paid once.** The context hook and the OpenCode plugin no longer re-inject
167
+ the root file the host already loads natively (`CLAUDE.md`, `AGENTS.md`, `AGENT.md`) — about
168
+ 8k tokens per session. The 16 KB/file, 48 KB/session eager budget the docs promised is now
169
+ enforced by the hook too, cutting at a line break with a marker.
170
+ - **Shorter skill descriptions**: purpose plus the first trigger sentence, capped at 320
171
+ characters (was 900).
172
+ - **Authored lean halves for AGENT.md §5–§10**, the tool-agnostic paragraph and the
173
+ readiness-sigil paragraph.
174
+ - **The native-catalogue flag is per kind** (`{ skills, agents }`): Bob keeps the §3 Agents
175
+ table and drops the §4 Skills table it already catalogues natively.
176
+
177
+ ### Changed — review output (#127)
178
+
179
+ - **Review findings are Conventional Comments** in `geneseed-code-review` and the `reviewer`
180
+ agent — `issue (blocking): file:line — …` — so a line pastes into an MR comment and the
181
+ verdict follows from the decorations. Process 7's D/O/F/R/Q/A codes are unchanged.
182
+
183
+ ### Changed — docs
184
+
185
+ - **The README leads with the engineering pitch** — enforced laws, one source for five hosts,
186
+ measured costs — above an animated demo (`docs/assets/demo.svg`); `CONTRIBUTING.md` points
187
+ GitHub at the contributing notes (#126).
188
+ - **Docs sweep**: five hook verbs (not four) wherever they are counted; the README's rail table,
189
+ laws row (nine in force, IX and XI retired), layout tree and test command match the tree;
190
+ dead links to `docs/limits.md`, `docs/specs/` and root-relative paths in
191
+ `docs/design-history.md` fixed; Copilot's hooks described where docs said it had none;
192
+ `GENESEED_STACK_GLOBAL` documented; bare `geneseed` described the same way everywhere.
193
+ - **The skills badge counts folder skills** (`daydream`, `react-view-transitions`,
194
+ `token-report`): doctor's count and README-list gates now read every skill that ships, not
195
+ only the flat `src/skills/*.md` ones.
196
+
197
+ ### Changed — performance
198
+
199
+ - **Rendering reads each source file once per operation, and hashes the source tree once.**
200
+ `doctor` re-read the same partials again and again (91% of its reads were repeats) and every
201
+ emit re-hashed the whole tree for the fingerprint. Measured A/B under the same load: one emit
202
+ ~324 → ~222 ms, `doctor --theme neutral` ~2.45 → ~1.63 s, `doctor --all` (which gates every
203
+ `geneseed update`) roughly halved. Both caches live on the per-operation `cfg`, not the
204
+ process — the web daemon renders in-process for days and must see an edited source.
205
+
206
+ ### Changed — tests and CI
207
+
208
+ - **`golden.mjs --jobs` works.** It was parsed and ignored; cells now fan out over `--shard`
209
+ children — the 261-cell run goes from ~74 s to ~16 s.
210
+ - **`golden.mjs --cli`** runs the CLI/hook matrix (317 cells) against the expectations written in
211
+ each cell, in CI. Nothing had run them since the corpus replayer was retired; 27 had drifted.
212
+ Six doctor cells planted months-old whole-file copies — re-based onto today's files, keeping
213
+ exactly their fault. The rest followed deliberate changes (the status box's wider label
214
+ column, `harness` → `geneseed`, gates that fail closed, the root file no longer re-injected),
215
+ and three messages still said `harness` — fixed.
216
+ - **Release hardening**: actions pinned to commit SHAs; npm pinned to 11 (not `latest`) in both
217
+ the release and its CI mirror; publish runs from `main` or a `v*` tag only, and refuses a
218
+ commit CI has not passed. CI: read-only token, pushes to `main` only (PRs no longer run
219
+ twice), superseded runs cancelled, Node 24 on Linux beside 22, the test-count floor computed
220
+ from the written tests (it was a fixed 500 against 1100), and the no-interpreter package job
221
+ fails when the web daemon never reports ready. A weekly workflow runs the full mutation
222
+ matrix.
223
+ - The 30-second fetch-timeout test has its own file, so it overlaps the rest of the suite.
224
+
225
+ ### Changed — the constitution
226
+
227
+ - **Law IV**: a durable authorization the user gave counts, alongside per-act confirmation (the
228
+ full text said "never a standing yes, unless already durably authorized", the lean text
229
+ dropped the exception). And "deletion" narrows to *deletion of what version control cannot
230
+ restore*, matching the Ontology's named irreversible set (#130): an edit or delete git can
231
+ undo runs freely.
232
+ - **Law V**: inside a loop with a stated bound (fix until green, at most N rounds), the expected
233
+ failure is the loop's input and the bound is the stop — a red test in a debug loop no longer
234
+ reads as a violation.
235
+ - **Law X**: echo the inferred goal back when a request admits readings that would lead to
236
+ different work — not for every request, which contradicted the Expert and Peer postures.
237
+ - **Law I (lean)** keeps secrets out of logs and output again; **rigor 3 (lean)** keeps "stop
238
+ rather than ship untested behaviour in silence (Law VIII)".
239
+ - **Memory is written through the rule skill** (process 1) everywhere — AGENT.md §6 and §7, the
240
+ memory and notebook READMEs told the agent to write it on its own. The `learn` hook is the
241
+ one automatic writer, named as such.
242
+ - **Pipelines: the parent owns the commit.** A crew hands back its worktree uncommitted with its
243
+ proof; the parent re-runs the proof itself, shows the user, and commits and merges once the
244
+ user accepts. Foreman merged on the crew's own logs, and the developer spec named a tester
245
+ commit that never happened.
246
+ - The bruno skills cited retired Laws IX and XI (now IV and III); **doctor now refuses a
247
+ citation of any retired law**, read off the canon. Themes title IX and XI "(retired)"; the
248
+ dead `EPI_PACT` key is gone. Prose outside the catalogue blocks no longer points at a table
249
+ the Claude emit does not render.
250
+
251
+ ### Changed — doctrine lean forms (#128)
252
+
253
+ - **Doctrine rules inline an authored lean form.** All 24 rules across the four packs now
254
+ carry a `LEAN` block with both halves written by hand, the way the invariants and the
255
+ Ontology already did; `doctrinesBody` picks the half through `resolveLean` and the
256
+ first-sentence cut (`terseBlocks`) is gone. It was cutting eleven of the 24 rules down to a
257
+ maxim with no verb an agent could act on — *Make actions safe to run twice.*, *Change as
258
+ little as the task requires.*, and eight words of process 5's 213-word consent protocol.
259
+ The Doctrines section grows 4,096 → 9,635 characters at `lean` on neutral, which is the
260
+ point of the change rather than a cost of it; `CEILING.lean` moves 37,500 → 41,300 and
261
+ `CEILING.full` does not move, because not one full half was edited.
262
+ - **`doctrines/` ships at full text under both footprints,** joining `laws/` and `ontology/`
263
+ in `renderAll`'s on-disk exemption. It shipped whole before only because a pack file had no
264
+ markers for `resolveLean` to act on — by accident, where the Doctrines section's own pointer
265
+ promises it by contract.
266
+
267
+ ### Fixed — blank web console on a non-canonical checkout path
268
+
269
+ - **`geneseed web` served a blank page when the checkout was reached by a path that is not its
270
+ real one** (a symlink, a Windows junction, a `subst` or mapped drive, an 8.3 short name). The
271
+ static route realpathed each requested file but compared it against an unresolved `web/dist`,
272
+ so every asset failed the "under dist" check and was answered with `index.html` at `text/html`;
273
+ the browser refused the module script and nothing was logged. `dist` is now resolved once in
274
+ `makeHandler`, and `tests/unit/web_server.test.mjs` serves an asset through a linked `dist`.
275
+
276
+ ### Fixed — web console
277
+
278
+ - **A failed first load no longer hangs on the splash.** The boot splash waited on the overview
279
+ and the error toast rendered beneath it; a failure now lifts the splash and the dashboard shows
280
+ the error with a Retry.
281
+ - **Search stays current**: the Spotlight index is dropped on every data revision (a build, a
282
+ deleted fact, an install switch) and on a docs-host change. MCP results open the Harness page,
283
+ where MCP wiring lives, not Settings.
284
+ - **A refused Profile save keeps your draft** (it was replaced by the disk copy), the next Save
285
+ carries the new fingerprint, and leaving with unsaved edits asks first.
286
+ - Blocked `sessionStorage` no longer stops the app mounting.
287
+ - **Contrast**: `--text-3` clears WCAG AA (4.5:1) against its background and surface in every
288
+ skin — 19 of them were below it, the default dark skin at 3.9:1.
289
+ - **Keyboard**: voice picks are buttons (Esc closes the list), and the dashboard's section rows
290
+ carry a real link.
291
+ - The Docs host follows the deployed install when nothing is stored (Bob and Copilot read the
292
+ Claude Code pages). The unused `d3-force` dependency is gone; `docs/web-ui.md` describes the
293
+ rail as it is (no Specs view).
294
+
295
+ ### Fixed — hosts and core
296
+
297
+ - **Copilot's hooks match Copilot's current schema.** The global emit wired a single-object
298
+ `toolCall` hook answered with `{"block": true}`; Copilot no longer has that event, so no
299
+ Copilot gate ever ran. It now adds array entries to `sessionStart`, `preToolUse`
300
+ (`tool-gate --host copilot`, answering a top-level `permissionDecision: "ask"` — every rule
301
+ asks, as on Claude Code), and `agentStop` + `preCompact` (`learn`, from `transcriptPath`).
302
+ `toolArgs` is read as an object or a JSON string. The claim moves to `settings_hooks`, so one
303
+ merge serves Claude, Bob and Copilot; a re-emit (or reactivate) unwires the legacy claims.
304
+ - **Bob global hooks name the install, not the settings folder.** `--root`/`--memory` came from
305
+ the nested settings file's parent (`~/.bob/settings`): memory was learned where nothing read
306
+ it, excludes were missed, and a global install never stood down for a project one.
307
+ - **Claude keeps Law IV with process 5 off.** `--doctrines` without `process` (or
308
+ `--exclude-rules process.5`) dropped the whole git-gate group, and the destructive-git check
309
+ went with it — on Claude only. The group now stays with `--no-consent`, which skips only the
310
+ commit/push ask.
311
+ - **Bob MCP servers go where Bob reads them**: `.bob/mcp.json` / `~/.bob/settings/mcp.json`,
312
+ not `settings.json`.
313
+ - **OpenCode asks on the same destructive git verbs as the other hosts** (`reset --hard`,
314
+ `clean -f`, `branch -D`, `checkout --`), which it only logged before.
315
+ - **`agents/_template.md` no longer ships** into an install's agents folder, where hosts
316
+ loaded it as a phantom `_template` agent. A Bob project emit's `.bob/.gitignore` now lists
317
+ the machine-specific `settings.json`.
318
+ - **`isDict` no longer says yes to a number.** `parseJson` wraps numbers, and the wrapper passed
319
+ the object check — `"permission": 5` in an `opencode.json` read as a dict the merge wrote its
320
+ git gate into, then serialised back as `5`. `mcp.mjs` and `native.mjs` drop their own copies.
321
+ - **One malformed `wiki.jsonc` no longer fails `/api/status`**: an `entries` that is not a list
322
+ is skipped instead of throwing.
323
+ - **`geneseed --help` lists the commands** (it died asking for a verb), and a bare `geneseed`
324
+ from an npm install runs `home` as both launchers already did.
325
+ - **`.gitignore`**: `notebook/` is anchored to the root — unanchored, it also ignored new files
326
+ under `src/notebook/`. `.claude/worktrees/` and `.claude/settings.local.json` are ignored for
327
+ every clone, not only through the maintainer's global excludes.
328
+
13
329
  ## [3.4.0] — 2026-09-06
14
330
 
15
331
  ### Added
package/DESIGN.md CHANGED
@@ -44,7 +44,7 @@ vault or a specific tool's hooks.
44
44
  and the prose words the docs use: the core nouns `LAW(S)`/`DOCTRINE(S)`/`ONTOLOGY`/
45
45
  `AGENT(S)`/`SKILL(S)`/`MEMORY`/`NOTEBOOK`/`VAULT`/`WIKI`, plus `TAGLINE`,
46
46
  `LOADED_SIGIL`, `EPI_*`, `BENEDICTION`, `DESC_*`, `ROAST_PERSONA`, the invariant
47
- titles `LEX_I`..`LEX_IX`, the 23 doctrine-rule titles `DOC_<PACK>_<n>`, the four pack
47
+ titles `LEX_I`..`LEX_XI`, the 27 doctrine-rule titles `DOC_<PACK>_<n>`, the four pack
48
48
  names `PACK_CRAFT`/`PACK_RIGOR`/`PACK_OPS`/`PACK_PROCESS`, and the section intros
49
49
  `INTRO_*`. Each theme defines its own nouns; **neutral keeps the plain words** (Rule,
50
50
  Doctrine, Agent, Skill, Memory, Workspace), so neutral output is unchanged.
@@ -98,8 +98,9 @@ vault or a specific tool's hooks.
98
98
  and tier by reversibility; show the real forks), **Conduct** (answer what was asked,
99
99
  once). It absorbed the Pact, which is now stated *inside* Telos rather than standing
100
100
  as a peer of the rules.
101
- - **Invariants** (`src/laws/universal.md`) — *what is never traded*. Nine numbered
102
- Rules, `I`..`IX`, headed `### {{LAW}} <roman> — {{LEX_<roman>}}`.
101
+ - **Invariants** (`src/laws/universal.md`) — *what is never traded*. Eleven numbered
102
+ Rules, `I`..`XI`, nine in force — IX and XI are retired in place, their numbers kept so
103
+ existing citations resolve — headed `### {{LAW}} <roman> — {{LEX_<roman>}}`.
103
104
  - **Doctrines** (`src/doctrines/{craft,rigor,ops,process}.md`) — *how work is done
104
105
  here*. Practice rules addressed by pack and number, cited as `Doctrine process 5`.
105
106
  `PACK_ORDER` (`js/build/source.mjs`) fixes the order craft → rigor → ops → process, which
@@ -163,20 +164,17 @@ vault or a specific tool's hooks.
163
164
  Almost all of it is gated, across six named checks in `js/inspect/checks-build.mjs` —
164
165
  `themeParityProblems` (key parity across the voices), `lawMetaProblems` and
165
166
  `doctrineMetaProblems` (the console's Principle column, in both directions),
166
- `constitutionProblems` (pack numbering and filing, `LEX_I..LEX_IX` as an *equality*, the
167
+ `constitutionProblems` (pack numbering and filing, `LEX_I..LEX_XI` as an *equality*, the
167
168
  `DOC_*` vocabulary, and every `{{DOCTRINE}}` citation in `src/`), and
168
169
  `countTableProblems` / `proseMirrorProblems` (badges and prose). So `geneseed doctor
169
170
  --all` is the check; the table above only says what it will ask for. `CHANGELOG.md` has
170
171
  no gate and never has.
171
172
 
172
173
  Two things the table cannot tell you, and `docs/extending.md` can: the default footprint
173
- is **lean**, which keeps an invariant's or a doctrine rule's heading and its *first
174
- sentence* only — so an amendment written into the second paragraph does not exist for
175
- most installs — and `LEX_I` is one of seven theme keys frozen byte-for-byte in a
176
- recording nothing can re-make, so Rule I's themed titles are the one part of this list
177
- that cannot be edited. The Ontology is exempt from the truncation: it ships whole at
178
- both footprints, because four flowing sections cut to their first sentences would read
179
- as four orphan sentences.
174
+ is **lean**, which inlines the authored `LEAN:else` half of each invariant and each
175
+ doctrine rule (and of the Ontology) rather than the full body — so an amendment written
176
+ into one half only does not exist for most installs. Nothing is machine-cut any more:
177
+ `leanBlockProblems` refuses a rule whose block is missing or whose lean half is blank.
180
178
 
181
179
  ## 🧩 Components
182
180
 
@@ -202,7 +200,7 @@ theme file defines a `DIR_*` key, so `laws/` is `laws/` in all fourteen voices.
202
200
  | Generator | `bin/build-driver.mjs` (`geneseed-build`) | — | substitution + `<!-- INCLUDE: -->` inlining, and the nine `--emit` targets |
203
201
  | CLI, as data | `js/cli-table.json` | — | the owned document the entry point parses its own argv from |
204
202
  | Automation | `bin/geneseed-cli.mjs` (`geneseed`) | — | 25 verbs — `build` / `doctor` / `status` / `prompt` / `diff` / `setup` / `web` / `upgrade` / … |
205
- | Hooks | `bin/geneseed-hook.mjs` (`geneseed-hook`) | — | the four verbs an emitted `settings.json` invokes: `context` / `git-gate` / `rule-gate` / `learn` |
203
+ | Hooks | `bin/geneseed-hook.mjs` (`geneseed-hook`) | — | the five verbs an emitted hook config invokes: `context` / `git-gate` / `rule-gate` / `tool-gate` / `learn` |
206
204
  | Adapters | `adapters/` | — | optional per-tool glue (hooks, OpenCode plugins) |
207
205
 
208
206
  ## ⚙️ Generator contract
@@ -247,8 +245,7 @@ caught, and the reasoning behind every deliberate divergence — lives in
247
245
  this project had two implementations and every byte either one wrote was compared. Read it to
248
246
  understand *why* a seam is where it is; read the contract above to know *what* it is today.
249
247
 
250
- See also [docs/extending.md](docs/extending.md) — what one addition costs, and which gate says
251
- so — and [docs/limits.md](docs/limits.md) — what this tool does not prove about itself.
248
+ See also [docs/extending.md](docs/extending.md) — what one addition costs, and which gate says so.
252
249
  ## 🚫 Explicitly out of scope
253
250
 
254
251
  Graph/index generation, web-clipping pipelines, session-classification capture,
package/QUICKSTART.md CHANGED
@@ -27,7 +27,9 @@ should print `ok`.
27
27
 
28
28
  ## 3 · Optional niceties
29
29
 
30
- - **Browse it:** `npx geneseed web` opens the local web console.
30
+ - **Browse it:** `npx geneseed web` opens the local web console — and once installed,
31
+ bare `geneseed` does the same when it can (else it prints the command list).
32
+ `geneseed --help` lists every command.
31
33
  - **No full-screen TUI:** `tui` and `menu` are verbs that say the panel is not here and
32
34
  print the command list instead. The web console is the visual front end.
33
35