geneseed 3.3.0 → 3.5.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 (231) hide show
  1. package/CHANGELOG.md +323 -0
  2. package/DESIGN.md +11 -14
  3. package/QUICKSTART.md +3 -1
  4. package/README.md +53 -44
  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 +28 -26
  9. package/adapters/opencode/GLOBAL-HARNESS-SPEC.md +1 -1
  10. package/adapters/opencode/README.md +8 -4
  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 -27
  20. package/docs/token-footprint.md +52 -26
  21. package/docs/web/agents.md +1 -1
  22. package/docs/web/claude-hooks.md +3 -2
  23. package/docs/web/collaboration.md +2 -2
  24. package/docs/web/first-session.md +2 -2
  25. package/docs/web/footprint.md +2 -2
  26. package/docs/web/harnesses.md +1 -1
  27. package/docs/web/model.md +1 -1
  28. package/docs/web/plugin-workflow.md +1 -0
  29. package/docs/web/rules.md +3 -3
  30. package/docs/web/setup-choices.md +2 -2
  31. package/docs/web/skills.md +1 -1
  32. package/docs/web/themes-author.md +1 -1
  33. package/docs/web-ui.md +18 -10
  34. package/harness.config.json +1 -1
  35. package/js/README.md +6 -5
  36. package/js/build/driver.mjs +1191 -0
  37. package/js/build/emit-claude.mjs +17 -10
  38. package/js/build/emit-common.mjs +4 -4
  39. package/js/build/generate.mjs +1 -1
  40. package/js/build/render.mjs +48 -44
  41. package/js/build/stubs.mjs +1 -1
  42. package/js/build/themes.mjs +4 -4
  43. package/js/build/version.mjs +12 -0
  44. package/js/cli-table.json +21 -6
  45. package/js/hosts/hooks.mjs +89 -74
  46. package/js/hosts/hosts.mjs +19 -2
  47. package/js/hosts/mcp.mjs +14 -20
  48. package/js/hosts/native.mjs +85 -25
  49. package/js/hosts/opencode.mjs +14 -0
  50. package/js/hosts/settings.mjs +52 -104
  51. package/js/inspect/checks-authoring.mjs +117 -3
  52. package/js/inspect/diff.mjs +1 -1
  53. package/js/inspect/doctor.mjs +1 -1
  54. package/js/inspect/excludes.mjs +1 -1
  55. package/js/inspect/inventory.mjs +12 -7
  56. package/js/inspect/scan.mjs +3 -14
  57. package/js/inspect/status.mjs +2 -2
  58. package/js/inspect/validate.mjs +1 -1
  59. package/js/lib/fs.mjs +23 -8
  60. package/js/lib/json.mjs +7 -1
  61. package/js/lib/proc.mjs +6 -4
  62. package/js/maintain/migrate.mjs +1 -1
  63. package/js/maintain/setup.mjs +1 -1
  64. package/js/maintain/uninstall.mjs +17 -15
  65. package/js/ui/cli.mjs +19 -0
  66. package/js/ui/menu.mjs +1 -1
  67. package/js/web/actions.mjs +4 -4
  68. package/js/web/activity.mjs +4 -4
  69. package/js/web/api.mjs +14 -11
  70. package/js/web/daemon.mjs +1 -1
  71. package/js/web/docs.mjs +12 -12
  72. package/js/web/handler.mjs +12 -5
  73. package/js/web/jobs.mjs +1 -1
  74. package/package.json +1 -1
  75. package/registry.json +86 -79
  76. package/src/AGENT.md.tmpl +83 -48
  77. package/src/agents/architect.md +4 -1
  78. package/src/agents/developer.md +2 -2
  79. package/src/agents/explorer.md +2 -0
  80. package/src/agents/operator.md +13 -0
  81. package/src/agents/pragmatist.md +12 -0
  82. package/src/agents/researcher.md +72 -0
  83. package/src/agents/reviewer.md +5 -2
  84. package/src/agents/security.md +7 -1
  85. package/src/agents/skeptic.md +2 -1
  86. package/src/agents/tester.md +5 -1
  87. package/src/agents/user-advocate.md +13 -0
  88. package/src/doctrines/README.md +26 -3
  89. package/src/doctrines/craft.md +78 -5
  90. package/src/doctrines/ops.md +62 -0
  91. package/src/doctrines/process.md +91 -4
  92. package/src/doctrines/rigor.md +41 -1
  93. package/src/laws/universal.md +27 -21
  94. package/src/memory/README.md +4 -2
  95. package/src/modes/foreman.md +5 -5
  96. package/src/notebook/README.md +2 -1
  97. package/src/ontology/universal.md +71 -67
  98. package/src/postures/peer.md +3 -0
  99. package/src/skills/_self-improvement.md +19 -0
  100. package/src/skills/_template.md +1 -12
  101. package/src/skills/brainstorm.md +37 -19
  102. package/src/skills/bruno-collection-generator.md +2 -13
  103. package/src/skills/bruno-test-writer.md +3 -14
  104. package/src/skills/ci-fix.md +49 -0
  105. package/src/skills/codebase-design.md +1 -12
  106. package/src/skills/commit.md +1 -12
  107. package/src/skills/consolidate-memory.md +50 -0
  108. package/src/skills/council.md +1 -12
  109. package/src/skills/daydream/LICENSE +21 -0
  110. package/src/skills/daydream/VENDOR.md +3 -1
  111. package/src/skills/debug.md +1 -12
  112. package/src/skills/deps-audit.md +46 -0
  113. package/src/skills/develop.md +38 -20
  114. package/src/skills/document-project.md +1 -12
  115. package/src/skills/domain-modeling.md +1 -12
  116. package/src/skills/forge-mcp.md +1 -12
  117. package/src/skills/fresh-eyes.md +1 -12
  118. package/src/skills/frontend-design.md +1 -12
  119. package/src/skills/geneseed-code-review.md +7 -14
  120. package/src/skills/geneseed.md +1 -12
  121. package/src/skills/git-archaeology.md +1 -12
  122. package/src/skills/git-rescue.md +1 -12
  123. package/src/skills/handoff.md +1 -12
  124. package/src/skills/herdr.md +1 -12
  125. package/src/skills/ingest.md +1 -12
  126. package/src/skills/migrate.md +1 -12
  127. package/src/skills/opencode-theme.md +1 -12
  128. package/src/skills/parallel-agents.md +4 -15
  129. package/src/skills/pipeline.md +6 -17
  130. package/src/skills/plan.md +1 -12
  131. package/src/skills/ponytail.md +1 -12
  132. package/src/skills/profile.md +1 -12
  133. package/src/skills/prose.md +1 -12
  134. package/src/skills/prototype.md +1 -12
  135. package/src/skills/quiz.md +43 -0
  136. package/src/skills/react-view-transitions/VENDOR.md +7 -1
  137. package/src/skills/refactor.md +1 -12
  138. package/src/skills/release.md +1 -12
  139. package/src/skills/repo-map.md +1 -12
  140. package/src/skills/research.md +5 -13
  141. package/src/skills/review-response.md +1 -12
  142. package/src/skills/roast-me.md +1 -12
  143. package/src/skills/rule.md +1 -12
  144. package/src/skills/security-audit.md +51 -0
  145. package/src/skills/ship.md +1 -12
  146. package/src/skills/skill-forge.md +59 -0
  147. package/src/skills/teach.md +50 -0
  148. package/src/skills/tickets.md +1 -12
  149. package/src/skills/wayfinder.md +1 -12
  150. package/src/skills/wiki.md +1 -12
  151. package/src/skills/workflow.md +82 -26
  152. package/src/skills/worktree.md +52 -0
  153. package/themes/_TEMPLATE.json +15 -12
  154. package/themes/biker.json +14 -11
  155. package/themes/commentator.json +14 -11
  156. package/themes/cyberpunk.json +14 -11
  157. package/themes/gamer.json +14 -11
  158. package/themes/imperial.json +14 -11
  159. package/themes/joker.json +14 -11
  160. package/themes/marvin.json +14 -11
  161. package/themes/mean.json +14 -11
  162. package/themes/military.json +14 -11
  163. package/themes/neutral.json +15 -12
  164. package/themes/opencode/README.md +2 -2
  165. package/themes/pirate.json +14 -11
  166. package/themes/sports.json +14 -11
  167. package/themes/verstappen.json +14 -11
  168. package/themes/wizard.json +14 -11
  169. package/web/dist/assets/Activity-Flgf4kHy.js +1 -0
  170. package/web/dist/assets/ActivityDetail-DIpr85nh.js +1 -0
  171. package/web/dist/assets/CatalogRow-CjyLjaLb.js +1 -0
  172. package/web/dist/assets/Diff-Deisdha8.js +2 -0
  173. package/web/dist/assets/Docs-DGUdY4l4.js +2 -0
  174. package/web/dist/assets/Doctor-F74lJ69P.js +1 -0
  175. package/web/dist/assets/FilterInput-BakJLvaV.js +1 -0
  176. package/web/dist/assets/GreenhouseView-D072lBiD.js +2 -0
  177. package/web/dist/assets/Harness-DNRP2Va7.js +1 -0
  178. package/web/dist/assets/JournalView-DWFqZ0Iw.js +1 -0
  179. package/web/dist/assets/Laws-BN6g3HU7.js +3 -0
  180. package/web/dist/assets/Library-CDOv4emM.js +1 -0
  181. package/web/dist/assets/Markdown-BQAvN8xx.js +38 -0
  182. package/web/dist/assets/OperatorHudView-CwNIUVX8.js +2 -0
  183. package/web/dist/assets/Profile-CpP9BTne.js +1 -0
  184. package/web/dist/assets/Rules-DFXsUCB7.js +1 -0
  185. package/web/dist/assets/Settings-BqZVUtJ5.js +1 -0
  186. package/web/dist/assets/Skills-Cu6kBgfF.js +1 -0
  187. package/web/dist/assets/StatusBadge-Cg6j-NJL.js +1 -0
  188. package/web/dist/assets/activity-iWaWVtsR.js +1 -0
  189. package/web/dist/assets/drawable-BgfrEBer.js +1 -0
  190. package/web/dist/assets/index-CAqrWhKl.js +2 -0
  191. package/web/dist/assets/index-Ruh93A3A.css +1 -0
  192. package/web/dist/assets/jobBuckets-Dbq8ZlWW.js +1 -0
  193. package/web/dist/assets/lawCats-BLgxl151.js +1 -0
  194. package/web/dist/assets/react-DbkvxWG5.js +8 -0
  195. package/web/dist/assets/rolldown-runtime-CbXtAM7H.js +1 -0
  196. package/web/dist/index.html +4 -3
  197. package/web/src/pages/Laws.jsx +22 -8
  198. package/src/skills/clarify.md +0 -28
  199. package/src/skills/crash-course.md +0 -29
  200. package/src/skills/decode.md +0 -29
  201. package/src/skills/drill.md +0 -29
  202. package/src/skills/feynman.md +0 -27
  203. package/src/skills/gap-detector.md +0 -27
  204. package/src/skills/learning-path.md +0 -27
  205. package/src/skills/react-view-transitions/README.md +0 -42
  206. package/src/skills/tdd.md +0 -31
  207. package/web/dist/assets/Activity-BfVcLrda.js +0 -1
  208. package/web/dist/assets/ActivityDetail-CQXccGPl.js +0 -1
  209. package/web/dist/assets/CatalogRow-DALEQImZ.js +0 -1
  210. package/web/dist/assets/Diff-BIjxXx46.js +0 -5
  211. package/web/dist/assets/Doctor-CJLbgsrw.js +0 -1
  212. package/web/dist/assets/FilterInput-CkUCk_lY.js +0 -1
  213. package/web/dist/assets/GreenhouseView-DfC5IILJ.js +0 -2
  214. package/web/dist/assets/Harness-Dm5CCU-v.js +0 -1
  215. package/web/dist/assets/JournalView-Cpu2eI4s.js +0 -1
  216. package/web/dist/assets/Laws-DDDVFuQz.js +0 -3
  217. package/web/dist/assets/Library-Dao3T9na.js +0 -1
  218. package/web/dist/assets/Markdown-C__nuWX5.js +0 -46
  219. package/web/dist/assets/OperatorHudView-DEpCtAjP.js +0 -2
  220. package/web/dist/assets/Profile-BlXtUlh2.js +0 -1
  221. package/web/dist/assets/Rules-DIre6gxR.js +0 -1
  222. package/web/dist/assets/Skills-rY13ZPhM.js +0 -1
  223. package/web/dist/assets/StatusBadge-wW_RS_my.js +0 -1
  224. package/web/dist/assets/activity-DpYPKNrA.js +0 -1
  225. package/web/dist/assets/index-BEZvPvpF.js +0 -1
  226. package/web/dist/assets/index-DNQE5ydy.js +0 -10
  227. package/web/dist/assets/index-DzdQjvM1.css +0 -1
  228. package/web/dist/assets/index-PmQGRS1X.js +0 -2
  229. package/web/dist/assets/jobBuckets-DfTUJUxR.js +0 -1
  230. package/web/dist/assets/lawCats-DUS9UTH4.js +0 -1
  231. package/web/dist/assets/react-DOpiTn5v.js +0 -32
package/CHANGELOG.md CHANGED
@@ -10,6 +10,329 @@ label. For the capability ↔ spec map, see [SHIPPED.md](SHIPPED.md).
10
10
 
11
11
  _Nothing yet._
12
12
 
13
+ ## [3.5.0] — 2026-09-25
14
+
15
+ **Upgrading:** re-emit (or `geneseed rebuild-all`) after installing. Copilot installs need it most:
16
+ the re-emit replaces the legacy `toolCall` hook, which Copilot no longer fires, with the gates
17
+ listed under *Fixed — hosts and core*.
18
+
19
+ ### Added — web console motion
20
+
21
+ - **The dashboard moves where motion carries meaning** (anime.js 4, bundled into `web/dist` like
22
+ React; the Node package stays zero-dependency). The germination ring's arc, bezel ticks and
23
+ percentage now run off one tween instead of an arc transition under a number that had already
24
+ jumped. KPI, genome and run counters count up, and count from the old value on a refresh, so a
25
+ change is seen moving. The Greenhouse donuts sweep clockwise, each arc taking its share of the
26
+ time. The Journal lens's constitution map enters hub, spokes, tiers, then governed nodes, once
27
+ per page load and only when scrolled into view. The toast and confirm dialog enter via CSS
28
+ `@starting-style`. Every JS animation checks `prefers-reduced-motion` (the global CSS rule cannot
29
+ reach inline styles) and completes on a timer where rAF never fires. Shell bundle +13 KB gzip.
30
+ - **Motion as feedback across the console.** The console strip carries a scanning bar while a
31
+ job runs and flashes green or red when a watched job ends; a successful build sways the rail's
32
+ sprout. The rail's active-page highlight and every segmented control's pill are now one element
33
+ that glides to the new selection. Dashboard tabs settle in; Doctor's checks rise in one after
34
+ another with their status dots popping; law, rule, check, manifest and MCP panels grow open;
35
+ live Activity sessions slide into place on each poll (FLIP); search results cascade in once and
36
+ mark the matched text. A flavour swap crossfades through the View Transitions API.
37
+
38
+ ### Added — constitution
39
+
40
+ - **Process 8, one writer per file.** When several agents share code — sub-agents, a pipeline
41
+ crew, a workflow fan-out, another session in the same checkout — each file has one writer at a
42
+ time: every unit gets a write set, overlaps run in sequence or get one owner, shared append
43
+ files (registries, lockfiles, generated bundles) stay with the integrator, reviewers never edit,
44
+ and a change you did not make is merged or stops you, never overwritten. Borrowed from Orca's
45
+ task-spec contract (ownership + acceptance) and Claude Workflow's per-agent worktree isolation.
46
+ `parallel-agents`, `pipeline` and `workflow` carry the write set in their handoff envelopes and
47
+ check changed files against it on the way back; `workflow` lists Orca as a coordination host.
48
+ The `full` carrier ceiling moves 55_500 → 57_000 for the rule's text; `lean` does not move.
49
+ - **OpenCode workflows take `isolation: "worktree"`**, like Claude Code's Workflow: each such
50
+ agent runs on its own branch and worktree; an unchanged one is released, a changed one is kept,
51
+ and the summary names every kept branch and every file two agents changed (`rt.overlaps()`).
52
+ Nothing is merged for you, and without git the agent fails rather than run in the shared tree.
53
+ - **Ops 7, serialize against a rationed resource.** A rate-limited API, a quota or a single
54
+ gateway is called in sequence, never fanned out: budget the quota across its callers before any
55
+ parallelism, back off on refusal within a retry cap set first, and treat a refusal that repeats
56
+ unchanged as a hard limit to report, never a batch to re-send. It names the calls process 3's
57
+ "batch independent calls" must not batch.
58
+ - **Craft 7, one writer per value.** A value held by hand in several places — a version, a count,
59
+ a name, a threshold — gets one home as its sole writer; every other copy is derived from it or
60
+ gated against it, the homes are counted before the gate is trusted, and a tool that updates one
61
+ home is not trusted to have updated the rest. Distinct from process 8, which gives a *file* one
62
+ writer across agents; this gives a *value* one writer across files.
63
+ The carrier ceilings move `full` 57_500 → 59_500 and `lean` 38_900 → 39_500 for the two rules.
64
+
65
+ ### Added — doctor
66
+
67
+ - **A `leanBlockProblems` doctor arm** over `src/laws/universal.md` and every pack: exactly one
68
+ `LEAN` block per rule, neither half blank. `resolveLean` is a replace over a marker pair and
69
+ therefore a no-op on markerless text, so a rule that lost its block would inline its full
70
+ body at the default footprint in silence, with every other gate in the tree green. Nothing
71
+ in `js/inspect/` read a LEAN marker before this — not for the packs, and not for the laws.
72
+
73
+ ### Changed — tests and maintainer docs
74
+
75
+ - **CLI-matrix faults are edits of the real file, not copies of it.** Six `doctor` cells held
76
+ whole copies of `Laws.jsx`, `cyberpunk.json` and `registry.json` to change one line each; every
77
+ new rule, theme key or spec had to be carried into them by hand, and the `Laws.jsx` copies had
78
+ already drifted from the real file. A fault may now be `{ "edit": [[find, replace]] }`, applied
79
+ to the copied checkout; a `find` that does not match exactly once fails the cell.
80
+ - **`docs/extending.md` lists the seven CI commands** (`golden --cli` was missing), names the
81
+ craft-specific fixtures §2a skipped, and drops typed figures that had gone stale (the ceiling
82
+ headroom, a line number). `DESIGN.md` and §2c now say `I..XI` / `LEX_I..LEX_XI`, and the claim
83
+ that `LEX_I` is frozen in a recording is gone — the recordings were retired.
84
+
85
+ ### Changed — toolchain
86
+
87
+ - **Web console toolchain on current majors** (dev-only; React stays 18): vite 5 → 8, vitest
88
+ 2 → 5, jsdom 24 → 29, `@vitejs/plugin-react` 4 → 6, eslint / `@eslint/js` 9 → 10 and globals
89
+ 15 → 17 (the root's majors), `eslint-plugin-react-hooks` 5 → 7. `npm audit` in `web/`: 12
90
+ dev-only advisories (1 critical, in vitest 2) → 0. The React-Compiler rules that v7 brings
91
+ flagged setState-in-effect prop resets in five places; they now adjust state during render,
92
+ so a fresh payload never paints once with the previous one's selection. `web/dist` rebuilt
93
+ (gzip js+css ~144.6 → ~142.0 KB).
94
+ - **Vendored skills carry their license text.** `daydream` now ships upstream's MIT `LICENSE`.
95
+ `react-view-transitions` has none to copy — upstream declares MIT in its README only, which
96
+ its `VENDOR.md` now says. Its upstream repo `README.md` is no longer copied into every install;
97
+ its `AGENTS.md` stays, because the skill's `SKILL.md` points the agent at it.
98
+
99
+ ### Changed — architecture
100
+
101
+ - **The generator driver lives in `js/build/driver.mjs`.** Flag parsing, the nine emit targets
102
+ and the per-host emit orchestration were in `bin/build-driver.mjs`, so nine `js/` modules
103
+ (setup, migrate, doctor, diff, validate, uninstall, generate, the web actions) imported upward
104
+ from a binary. `bin/build-driver.mjs` is now a three-line entry. The unreachable `PORTED`
105
+ refusal (it equalled `EMITS`, which the parser already enforces) is gone, and the driver asks
106
+ `hostCatalogsNatively` instead of keeping its own copy of that table.
107
+
108
+ ### Changed — code cleanup
109
+
110
+ - 24 exports nothing imported are module-private now; `GATE_LEDGER` has one owner
111
+ (`js/hosts/hosts.mjs`) instead of a hard-coded copy in `status`; `hooks.mjs` imports
112
+ `resolvePath` instead of keeping a third copy; `within` has one owner (`js/lib/paths.mjs`).
113
+ - Docblocks that contradicted the code are corrected: the hide-window rule for inheriting
114
+ spawns, the JSONC trailing-comma pass (it is string-aware), the deleted `emit.mjs`, and two
115
+ package-manifest reasons (a false "js/web/docs.mjs serves ROOT/docs", hand-typed sizes).
116
+
117
+ ### Changed — the Ethos (#130)
118
+
119
+ - **The Pact is three ranked laws**, in Asimov's shape: protect the user first, serve their
120
+ intent second where it does not break the first, keep the agent's own honesty third. The
121
+ user now includes whoever maintains the code after the session — code its next reader cannot
122
+ follow is harm, like a false claim.
123
+ - **A coding evidence ladder.** Evidence grades the rungs a coding agent stands on: a green test
124
+ is a claim about the test, a clean type check a claim about the types. The absence and
125
+ truncation passage moved out — Law III already carries it.
126
+ - **The irreversible set is named.** Decisions lists the acts version control cannot undo — a
127
+ push to a shared branch, a schema or data migration, a deletion of data or history, a
128
+ published release, a secret, a call that reaches an external service or person; every other
129
+ edit runs freely.
130
+
131
+ ### Changed — footprint (#129)
132
+
133
+ - **The root file is paid once.** The context hook and the OpenCode plugin no longer re-inject
134
+ the root file the host already loads natively (`CLAUDE.md`, `AGENTS.md`, `AGENT.md`) — about
135
+ 8k tokens per session. The 16 KB/file, 48 KB/session eager budget the docs promised is now
136
+ enforced by the hook too, cutting at a line break with a marker.
137
+ - **Shorter skill descriptions**: purpose plus the first trigger sentence, capped at 320
138
+ characters (was 900).
139
+ - **Authored lean halves for AGENT.md §5–§10**, the tool-agnostic paragraph and the
140
+ readiness-sigil paragraph.
141
+ - **The native-catalogue flag is per kind** (`{ skills, agents }`): Bob keeps the §3 Agents
142
+ table and drops the §4 Skills table it already catalogues natively.
143
+
144
+ ### Changed — review output (#127)
145
+
146
+ - **Review findings are Conventional Comments** in `geneseed-code-review` and the `reviewer`
147
+ agent — `issue (blocking): file:line — …` — so a line pastes into an MR comment and the
148
+ verdict follows from the decorations. Process 7's D/O/F/R/Q/A codes are unchanged.
149
+
150
+ ### Changed — docs
151
+
152
+ - **The README leads with the engineering pitch** — enforced laws, one source for five hosts,
153
+ measured costs — above an animated demo (`docs/assets/demo.svg`); `CONTRIBUTING.md` points
154
+ GitHub at the contributing notes (#126).
155
+ - **Docs sweep**: five hook verbs (not four) wherever they are counted; the README's rail table,
156
+ laws row (nine in force, IX and XI retired), layout tree and test command match the tree;
157
+ dead links to `docs/limits.md`, `docs/specs/` and root-relative paths in
158
+ `docs/design-history.md` fixed; Copilot's hooks described where docs said it had none;
159
+ `GENESEED_STACK_GLOBAL` documented; bare `geneseed` described the same way everywhere.
160
+ - **The skills badge counts folder skills** (`daydream`, `react-view-transitions`,
161
+ `token-report`): doctor's count and README-list gates now read every skill that ships, not
162
+ only the flat `src/skills/*.md` ones.
163
+
164
+ ### Changed — performance
165
+
166
+ - **Rendering reads each source file once per operation, and hashes the source tree once.**
167
+ `doctor` re-read the same partials again and again (91% of its reads were repeats) and every
168
+ emit re-hashed the whole tree for the fingerprint. Measured A/B under the same load: one emit
169
+ ~324 → ~222 ms, `doctor --theme neutral` ~2.45 → ~1.63 s, `doctor --all` (which gates every
170
+ `geneseed update`) roughly halved. Both caches live on the per-operation `cfg`, not the
171
+ process — the web daemon renders in-process for days and must see an edited source.
172
+
173
+ ### Changed — tests and CI
174
+
175
+ - **`golden.mjs --jobs` works.** It was parsed and ignored; cells now fan out over `--shard`
176
+ children — the 261-cell run goes from ~74 s to ~16 s.
177
+ - **`golden.mjs --cli`** runs the CLI/hook matrix (317 cells) against the expectations written in
178
+ each cell, in CI. Nothing had run them since the corpus replayer was retired; 27 had drifted.
179
+ Six doctor cells planted months-old whole-file copies — re-based onto today's files, keeping
180
+ exactly their fault. The rest followed deliberate changes (the status box's wider label
181
+ column, `harness` → `geneseed`, gates that fail closed, the root file no longer re-injected),
182
+ and three messages still said `harness` — fixed.
183
+ - **Release hardening**: actions pinned to commit SHAs; npm pinned to 11 (not `latest`) in both
184
+ the release and its CI mirror; publish runs from `main` or a `v*` tag only, and refuses a
185
+ commit CI has not passed. CI: read-only token, pushes to `main` only (PRs no longer run
186
+ twice), superseded runs cancelled, Node 24 on Linux beside 22, the test-count floor computed
187
+ from the written tests (it was a fixed 500 against 1100), and the no-interpreter package job
188
+ fails when the web daemon never reports ready. A weekly workflow runs the full mutation
189
+ matrix.
190
+ - The 30-second fetch-timeout test has its own file, so it overlaps the rest of the suite.
191
+
192
+ ### Changed — the constitution
193
+
194
+ - **Law IV**: a durable authorization the user gave counts, alongside per-act confirmation (the
195
+ full text said "never a standing yes, unless already durably authorized", the lean text
196
+ dropped the exception). And "deletion" narrows to *deletion of what version control cannot
197
+ restore*, matching the Ontology's named irreversible set (#130): an edit or delete git can
198
+ undo runs freely.
199
+ - **Law V**: inside a loop with a stated bound (fix until green, at most N rounds), the expected
200
+ failure is the loop's input and the bound is the stop — a red test in a debug loop no longer
201
+ reads as a violation.
202
+ - **Law X**: echo the inferred goal back when a request admits readings that would lead to
203
+ different work — not for every request, which contradicted the Expert and Peer postures.
204
+ - **Law I (lean)** keeps secrets out of logs and output again; **rigor 3 (lean)** keeps "stop
205
+ rather than ship untested behaviour in silence (Law VIII)".
206
+ - **Memory is written through the rule skill** (process 1) everywhere — AGENT.md §6 and §7, the
207
+ memory and notebook READMEs told the agent to write it on its own. The `learn` hook is the
208
+ one automatic writer, named as such.
209
+ - **Pipelines: the parent owns the commit.** A crew hands back its worktree uncommitted with its
210
+ proof; the parent re-runs the proof itself, shows the user, and commits and merges once the
211
+ user accepts. Foreman merged on the crew's own logs, and the developer spec named a tester
212
+ commit that never happened.
213
+ - The bruno skills cited retired Laws IX and XI (now IV and III); **doctor now refuses a
214
+ citation of any retired law**, read off the canon. Themes title IX and XI "(retired)"; the
215
+ dead `EPI_PACT` key is gone. Prose outside the catalogue blocks no longer points at a table
216
+ the Claude emit does not render.
217
+
218
+ ### Changed — doctrine lean forms (#128)
219
+
220
+ - **Doctrine rules inline an authored lean form.** All 24 rules across the four packs now
221
+ carry a `LEAN` block with both halves written by hand, the way the invariants and the
222
+ Ontology already did; `doctrinesBody` picks the half through `resolveLean` and the
223
+ first-sentence cut (`terseBlocks`) is gone. It was cutting eleven of the 24 rules down to a
224
+ maxim with no verb an agent could act on — *Make actions safe to run twice.*, *Change as
225
+ little as the task requires.*, and eight words of process 5's 213-word consent protocol.
226
+ The Doctrines section grows 4,096 → 9,635 characters at `lean` on neutral, which is the
227
+ point of the change rather than a cost of it; `CEILING.lean` moves 37,500 → 41,300 and
228
+ `CEILING.full` does not move, because not one full half was edited.
229
+ - **`doctrines/` ships at full text under both footprints,** joining `laws/` and `ontology/`
230
+ in `renderAll`'s on-disk exemption. It shipped whole before only because a pack file had no
231
+ markers for `resolveLean` to act on — by accident, where the Doctrines section's own pointer
232
+ promises it by contract.
233
+
234
+ ### Fixed — blank web console on a non-canonical checkout path
235
+
236
+ - **`geneseed web` served a blank page when the checkout was reached by a path that is not its
237
+ real one** (a symlink, a Windows junction, a `subst` or mapped drive, an 8.3 short name). The
238
+ static route realpathed each requested file but compared it against an unresolved `web/dist`,
239
+ so every asset failed the "under dist" check and was answered with `index.html` at `text/html`;
240
+ the browser refused the module script and nothing was logged. `dist` is now resolved once in
241
+ `makeHandler`, and `tests/unit/web_server.test.mjs` serves an asset through a linked `dist`.
242
+
243
+ ### Fixed — web console
244
+
245
+ - **A failed first load no longer hangs on the splash.** The boot splash waited on the overview
246
+ and the error toast rendered beneath it; a failure now lifts the splash and the dashboard shows
247
+ the error with a Retry.
248
+ - **Search stays current**: the Spotlight index is dropped on every data revision (a build, a
249
+ deleted fact, an install switch) and on a docs-host change. MCP results open the Harness page,
250
+ where MCP wiring lives, not Settings.
251
+ - **A refused Profile save keeps your draft** (it was replaced by the disk copy), the next Save
252
+ carries the new fingerprint, and leaving with unsaved edits asks first.
253
+ - Blocked `sessionStorage` no longer stops the app mounting.
254
+ - **Contrast**: `--text-3` clears WCAG AA (4.5:1) against its background and surface in every
255
+ skin — 19 of them were below it, the default dark skin at 3.9:1.
256
+ - **Keyboard**: voice picks are buttons (Esc closes the list), and the dashboard's section rows
257
+ carry a real link.
258
+ - The Docs host follows the deployed install when nothing is stored (Bob and Copilot read the
259
+ Claude Code pages). The unused `d3-force` dependency is gone; `docs/web-ui.md` describes the
260
+ rail as it is (no Specs view).
261
+
262
+ ### Fixed — hosts and core
263
+
264
+ - **Copilot's hooks match Copilot's current schema.** The global emit wired a single-object
265
+ `toolCall` hook answered with `{"block": true}`; Copilot no longer has that event, so no
266
+ Copilot gate ever ran. It now adds array entries to `sessionStart`, `preToolUse`
267
+ (`tool-gate --host copilot`, answering a top-level `permissionDecision: "ask"` — every rule
268
+ asks, as on Claude Code), and `agentStop` + `preCompact` (`learn`, from `transcriptPath`).
269
+ `toolArgs` is read as an object or a JSON string. The claim moves to `settings_hooks`, so one
270
+ merge serves Claude, Bob and Copilot; a re-emit (or reactivate) unwires the legacy claims.
271
+ - **Bob global hooks name the install, not the settings folder.** `--root`/`--memory` came from
272
+ the nested settings file's parent (`~/.bob/settings`): memory was learned where nothing read
273
+ it, excludes were missed, and a global install never stood down for a project one.
274
+ - **Claude keeps Law IV with process 5 off.** `--doctrines` without `process` (or
275
+ `--exclude-rules process.5`) dropped the whole git-gate group, and the destructive-git check
276
+ went with it — on Claude only. The group now stays with `--no-consent`, which skips only the
277
+ commit/push ask.
278
+ - **Bob MCP servers go where Bob reads them**: `.bob/mcp.json` / `~/.bob/settings/mcp.json`,
279
+ not `settings.json`.
280
+ - **OpenCode asks on the same destructive git verbs as the other hosts** (`reset --hard`,
281
+ `clean -f`, `branch -D`, `checkout --`), which it only logged before.
282
+ - **`agents/_template.md` no longer ships** into an install's agents folder, where hosts
283
+ loaded it as a phantom `_template` agent. A Bob project emit's `.bob/.gitignore` now lists
284
+ the machine-specific `settings.json`.
285
+ - **`isDict` no longer says yes to a number.** `parseJson` wraps numbers, and the wrapper passed
286
+ the object check — `"permission": 5` in an `opencode.json` read as a dict the merge wrote its
287
+ git gate into, then serialised back as `5`. `mcp.mjs` and `native.mjs` drop their own copies.
288
+ - **One malformed `wiki.jsonc` no longer fails `/api/status`**: an `entries` that is not a list
289
+ is skipped instead of throwing.
290
+ - **`geneseed --help` lists the commands** (it died asking for a verb), and a bare `geneseed`
291
+ from an npm install runs `home` as both launchers already did.
292
+ - **`.gitignore`**: `notebook/` is anchored to the root — unanchored, it also ignored new files
293
+ under `src/notebook/`. `.claude/worktrees/` and `.claude/settings.local.json` are ignored for
294
+ every clone, not only through the maintainer's global excludes.
295
+
296
+ ## [3.4.0] — 2026-09-06
297
+
298
+ ### Added
299
+
300
+ - **Six skills.** `security-audit` (the `security` agent finally has a caller — trust
301
+ boundaries, the classic classes, secrets, the supply chain, a ship / fix / block verdict),
302
+ `skill-forge` (author, sharpen, merge or retire a skill, with every satellite the host or
303
+ the source repo demands), `worktree` (isolate a task in its own tree from a clean base —
304
+ the first move when `git status` shows changes you did not make), `ci-fix` (a red CI run
305
+ reproduced under CI's conditions and fixed at the cause), `deps-audit` (a risk-ordered
306
+ upgrade plan for `migrate` to execute, installing nothing) and `consolidate-memory`
307
+ (the memory set verified against the live repo, merged, retired, re-indexed).
308
+ - **A `harness` skill class** for the skills about the agent's own apparatus — wiki,
309
+ geneseed, rule, profile, herdr, skill-forge, consolidate-memory — which sat under
310
+ `understand` before and made that class a grab-bag. The web console's Skills view
311
+ grows the chip.
312
+
313
+ ### Changed
314
+
315
+ - **A skill's emitted `description:` is now purpose + trigger.** Claude Code and Bob
316
+ match a task against that one line before loading a skill; it used to carry only what
317
+ the skill does, never when. `skillDescription()` appends `Use when: <the Trigger
318
+ paragraph>`, links reduced to text, capped at 900 chars at a sentence boundary.
319
+ - **The Self-improvement footer is one file.** `src/skills/_self-improvement.md` is
320
+ INCLUDEd by every flat skill and the template, with a four-line LEAN half; fifty
321
+ byte-identical copies are gone.
322
+ - **Merges, keeping the best of each:** `tdd` folded into `develop` (seams first, the
323
+ failing test seen to fail for the right reason, an explicit exit to ship or handoff);
324
+ `clarify` folded into `brainstorm` (charitable reading, the key-decision ledger echoed
325
+ back under Law X, then design only when there is something to design, and a routed
326
+ exit); the six learning skills folded into `teach` (crash course, decode, path) and
327
+ `quiz` (drill, feynman, gap check), both user-only. The skill count stays at 49.
328
+ - **`workflow` refined per host:** OpenCode's saved scripts versus Claude Code's native
329
+ tool (inline or `.claude/workflows/`, and only once the user has opted in), Bob and
330
+ Copilot falling back to `parallel-agents`; pick saved over inline, pass the task as
331
+ `args` so a run stays a pure function of its inputs, resume a failed run rather than
332
+ rerun it, and carry the conclusion yourself.
333
+ - **`registry.json`** stamps `last_verified: 2026-09-06` on every approved skill; the six
334
+ new ones enter as `experimental`.
335
+
13
336
  ## [3.3.0] — 2026-09-06
14
337
 
15
338
  The host-gap release: every host now gets the hook surface its runtime actually
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