geneseed 3.8.0 → 3.10.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 (229) hide show
  1. package/CHANGELOG.md +71 -1
  2. package/DESIGN.md +13 -10
  3. package/QUICKSTART.md +1 -1
  4. package/README.md +31 -32
  5. package/SETUP.md +7 -42
  6. package/SHIPPED.md +4 -4
  7. package/adapters/bob/README.md +17 -1
  8. package/adapters/openclaude/README.md +1 -1
  9. package/adapters/opencode/GLOBAL-HARNESS-SPEC.md +1 -1
  10. package/adapters/opencode/README.md +3 -3
  11. package/adapters/opencode/plugins/geneseed-context.js +78 -8
  12. package/adapters/opencode/plugins/geneseed-guard.js +9 -9
  13. package/adapters/opencode/plugins/geneseed-workflow.js +1 -1
  14. package/adapters/opencode/workflows/_runtime.js +2 -2
  15. package/adapters/opencode/workflows/dispatch.js +1 -1
  16. package/bin/geneseed-hook.mjs +1 -1
  17. package/docs/candidate-hosts.md +12 -5
  18. package/docs/extending.md +72 -40
  19. package/docs/token-footprint.md +26 -21
  20. package/docs/web/claude-hooks.md +1 -1
  21. package/docs/web/collaboration.md +1 -1
  22. package/docs/web/exclusions.md +0 -1
  23. package/docs/web/footprint.md +1 -1
  24. package/docs/web/harnesses.md +14 -14
  25. package/docs/web/install-quick.md +1 -1
  26. package/docs/web/plugin-guard.md +2 -2
  27. package/docs/web/rules.md +1 -1
  28. package/docs/web/themes-author.md +2 -2
  29. package/docs/web-ui.md +2 -2
  30. package/harness.config.json +1 -1
  31. package/js/README.md +8 -7
  32. package/js/build/driver.mjs +26 -95
  33. package/js/build/emit-claude.mjs +76 -81
  34. package/js/build/generate.mjs +0 -1
  35. package/js/build/render.mjs +10 -3
  36. package/js/build/source.mjs +105 -1
  37. package/js/build/stubs.mjs +25 -4
  38. package/js/cli-table.json +8 -8
  39. package/js/hosts/hooks.mjs +91 -59
  40. package/js/hosts/hosts.mjs +5 -21
  41. package/js/hosts/installs.mjs +4 -6
  42. package/js/hosts/mcp.mjs +3 -13
  43. package/js/hosts/native.mjs +28 -51
  44. package/js/hosts/opencode.mjs +1 -1
  45. package/js/hosts/settings.mjs +4 -78
  46. package/js/inspect/checks-authoring.mjs +153 -117
  47. package/js/inspect/checks-repo.mjs +45 -1
  48. package/js/inspect/diff.mjs +11 -3
  49. package/js/inspect/doctor.mjs +3 -3
  50. package/js/inspect/excludes.mjs +0 -4
  51. package/js/inspect/inventory.mjs +1 -2
  52. package/js/inspect/status.mjs +4 -4
  53. package/js/maintain/migrate.mjs +5 -5
  54. package/js/maintain/setup.mjs +3 -5
  55. package/js/maintain/uninstall.mjs +8 -42
  56. package/js/ui/tui.mjs +1 -1
  57. package/js/web/actions.mjs +4 -5
  58. package/js/web/api.mjs +10 -5
  59. package/package.json +1 -2
  60. package/registry.json +7 -0
  61. package/src/AGENT.md.tmpl +86 -65
  62. package/src/agents/_template.md +3 -3
  63. package/src/agents/advocate.md +3 -3
  64. package/src/agents/architect.md +3 -3
  65. package/src/agents/developer.md +4 -4
  66. package/src/agents/docs.md +3 -3
  67. package/src/agents/empiricist.md +4 -4
  68. package/src/agents/explorer.md +4 -4
  69. package/src/agents/framer.md +3 -3
  70. package/src/agents/historian.md +3 -3
  71. package/src/agents/operator.md +3 -3
  72. package/src/agents/pragmatist.md +3 -3
  73. package/src/agents/researcher.md +7 -7
  74. package/src/agents/reviewer.md +3 -3
  75. package/src/agents/security.md +3 -3
  76. package/src/agents/skeptic.md +3 -3
  77. package/src/agents/steward.md +3 -3
  78. package/src/agents/tester.md +3 -3
  79. package/src/agents/user-advocate.md +3 -3
  80. package/src/agents/visionary.md +3 -3
  81. package/src/doctrines/README.md +4 -3
  82. package/src/doctrines/comms.md +4 -4
  83. package/src/doctrines/craft.md +20 -20
  84. package/src/doctrines/ops.md +19 -19
  85. package/src/doctrines/process.md +20 -20
  86. package/src/doctrines/rigor.md +22 -22
  87. package/src/laws/universal.md +26 -44
  88. package/src/memory/README.md +3 -3
  89. package/src/modes/foreman.md +1 -1
  90. package/src/notebook/README.md +1 -1
  91. package/src/ontology/universal.md +8 -10
  92. package/src/postures/artisan.md +2 -2
  93. package/src/skills/_self-improvement.md +4 -4
  94. package/src/skills/_template.md +1 -1
  95. package/src/skills/brainstorm.md +3 -3
  96. package/src/skills/bruno-collection-generator.md +6 -6
  97. package/src/skills/bruno-test-writer.md +5 -5
  98. package/src/skills/ci-fix.md +4 -4
  99. package/src/skills/commit.md +11 -10
  100. package/src/skills/consolidate-memory.md +4 -4
  101. package/src/skills/council.md +2 -2
  102. package/src/skills/daydream/SKILL.md +10 -3
  103. package/src/skills/daydream/VENDOR.md +10 -2
  104. package/src/skills/daydream/instructions.md +2 -2
  105. package/src/skills/debug.md +4 -4
  106. package/src/skills/deps-audit.md +3 -3
  107. package/src/skills/develop.md +7 -7
  108. package/src/skills/document-project.md +6 -6
  109. package/src/skills/explain-changes/SKILL.md +69 -0
  110. package/src/skills/explain-changes/VENDOR.md +20 -0
  111. package/src/skills/explain-changes/scripts/render_changes.mjs +558 -0
  112. package/src/skills/forge-mcp.md +4 -4
  113. package/src/skills/fresh-eyes.md +4 -4
  114. package/src/skills/frontend-design.md +1 -1
  115. package/src/skills/geneseed.md +4 -4
  116. package/src/skills/git-archaeology.md +5 -5
  117. package/src/skills/git-rescue.md +7 -7
  118. package/src/skills/handoff.md +3 -3
  119. package/src/skills/ingest.md +5 -5
  120. package/src/skills/migrate.md +8 -8
  121. package/src/skills/parallel-agents.md +2 -2
  122. package/src/skills/pipeline.md +2 -2
  123. package/src/skills/plan.md +3 -3
  124. package/src/skills/ponytail.md +2 -2
  125. package/src/skills/profile.md +2 -2
  126. package/src/skills/prose.md +1 -1
  127. package/src/skills/prototype.md +1 -1
  128. package/src/skills/react-view-transitions/SKILL.md +1 -1
  129. package/src/skills/react-view-transitions/VENDOR.md +7 -2
  130. package/src/skills/refactor.md +3 -3
  131. package/src/skills/release.md +5 -5
  132. package/src/skills/repo-map.md +4 -4
  133. package/src/skills/research.md +9 -9
  134. package/src/skills/review-response.md +4 -4
  135. package/src/skills/rule.md +3 -3
  136. package/src/skills/security-audit.md +5 -5
  137. package/src/skills/ship.md +5 -5
  138. package/src/skills/skill-forge.md +4 -4
  139. package/src/skills/token-report/SKILL.md +2 -3
  140. package/src/skills/token-report/VENDOR.md +2 -3
  141. package/src/skills/token-report/scripts/token_report.mjs +7 -121
  142. package/src/skills/wiki.md +5 -5
  143. package/src/skills/workflow.md +3 -4
  144. package/src/skills/worktree.md +4 -4
  145. package/themes/_TEMPLATE.json +37 -39
  146. package/themes/biker.json +37 -39
  147. package/themes/commentator.json +37 -39
  148. package/themes/cyberpunk.json +37 -39
  149. package/themes/gamer.json +37 -39
  150. package/themes/imperial.json +37 -39
  151. package/themes/joker.json +37 -39
  152. package/themes/marvin.json +37 -39
  153. package/themes/mean.json +37 -39
  154. package/themes/military.json +37 -39
  155. package/themes/neutral.json +37 -39
  156. package/themes/pirate.json +37 -39
  157. package/themes/sports.json +37 -39
  158. package/themes/verstappen.json +37 -39
  159. package/themes/wizard.json +37 -39
  160. package/web/dist/assets/Activity-BjVp522q.js +1 -0
  161. package/web/dist/assets/ActivityDetail-8ep1bspW.js +1 -0
  162. package/web/dist/assets/Dashboard-OkC_PCH6.js +2 -0
  163. package/web/dist/assets/{Docs-DrJNDPwI.js → Docs-CKPWz00o.js} +2 -2
  164. package/web/dist/assets/FilterInput-CVyqmYWM.js +1 -0
  165. package/web/dist/assets/GreenhouseView-D0cbCJ5m.js +2 -0
  166. package/web/dist/assets/Installs-BtGGdoTt.js +2 -0
  167. package/web/dist/assets/JournalView-Ckl4dmzR.js +1 -0
  168. package/web/dist/assets/Laws-CLpdRRk8.js +3 -0
  169. package/web/dist/assets/Library-wPPuKQrI.js +1 -0
  170. package/web/dist/assets/{Markdown-BQAvN8xx.js → Markdown-CkFyfgNf.js} +14 -14
  171. package/web/dist/assets/OperatorHudView-CiAkAkQL.js +2 -0
  172. package/web/dist/assets/Personal-D8CnDo9v.js +1 -0
  173. package/web/dist/assets/Tabs-B4HNrrCs.js +1 -0
  174. package/web/dist/assets/drawable-BiwaOo6x.js +1 -0
  175. package/web/dist/assets/geist-mono-latin-400-normal-DTRLJnHl.woff2 +0 -0
  176. package/web/dist/assets/geist-mono-latin-500-normal-YINYabwD.woff2 +0 -0
  177. package/web/dist/assets/index-C1yil5j1.js +2 -0
  178. package/web/dist/assets/index-CDPDk2vj.css +1 -0
  179. package/web/dist/assets/{react-DbkvxWG5.js → react-B9Z_tXRV.js} +1 -1
  180. package/web/dist/assets/sections-GalMS0Zv.js +1 -0
  181. package/web/dist/assets/usePoll-O0sJEw1Y.js +1 -0
  182. package/web/dist/index.html +4 -4
  183. package/web/src/pages/Laws.jsx +616 -361
  184. package/adapters/copilot/README.md +0 -105
  185. package/web/dist/assets/Activity-CH-7cPIM.js +0 -1
  186. package/web/dist/assets/ActivityDetail-DZvz0xS5.js +0 -1
  187. package/web/dist/assets/CatalogRow-DftXpZHY.js +0 -1
  188. package/web/dist/assets/Diff-DvwdG0L9.js +0 -2
  189. package/web/dist/assets/Doctor-OTmwmYZg.js +0 -1
  190. package/web/dist/assets/FilterInput-BakJLvaV.js +0 -1
  191. package/web/dist/assets/GreenhouseView-XxrAdriX.js +0 -2
  192. package/web/dist/assets/Harness-C_LYNk5c.js +0 -1
  193. package/web/dist/assets/JournalView-BcuyeEaR.js +0 -1
  194. package/web/dist/assets/Laws-CWHrTKY4.js +0 -3
  195. package/web/dist/assets/Library-CA9IHghn.js +0 -1
  196. package/web/dist/assets/OperatorHudView-BMRY1Tt4.js +0 -2
  197. package/web/dist/assets/Profile-wceET1JY.js +0 -1
  198. package/web/dist/assets/Rules-BEXvY4Tx.js +0 -1
  199. package/web/dist/assets/Settings-DS2zF0Ez.js +0 -1
  200. package/web/dist/assets/Skills-DahlOJuI.js +0 -1
  201. package/web/dist/assets/StatusBadge-Cg6j-NJL.js +0 -1
  202. package/web/dist/assets/activity-iWaWVtsR.js +0 -1
  203. package/web/dist/assets/audiowide-latin-400-normal-6GFCX7ni.woff2 +0 -0
  204. package/web/dist/assets/drawable-BTHjTzF7.js +0 -1
  205. package/web/dist/assets/geist-mono-latin-400-normal-DKaoCDn5.woff2 +0 -0
  206. package/web/dist/assets/geist-mono-latin-500-normal-C3sF8Y1B.woff2 +0 -0
  207. package/web/dist/assets/geist-mono-latin-600-normal-BHzjB6_C.woff2 +0 -0
  208. package/web/dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  209. package/web/dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  210. package/web/dist/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  211. package/web/dist/assets/ibm-plex-serif-latin-400-normal-BIGslYFI.woff2 +0 -0
  212. package/web/dist/assets/ibm-plex-serif-latin-500-normal-REKAfBVG.woff2 +0 -0
  213. package/web/dist/assets/ibm-plex-serif-latin-600-normal-DAxitmSu.woff2 +0 -0
  214. package/web/dist/assets/index-AN5Emnrg.js +0 -2
  215. package/web/dist/assets/index-Ruh93A3A.css +0 -1
  216. package/web/dist/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  217. package/web/dist/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  218. package/web/dist/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
  219. package/web/dist/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
  220. package/web/dist/assets/lawCats-Btjp3Hk_.js +0 -1
  221. package/web/dist/assets/oswald-latin-400-normal-BAFo8sP8.woff2 +0 -0
  222. package/web/dist/assets/oswald-latin-500-normal-B-eyT0Dw.woff2 +0 -0
  223. package/web/dist/assets/oswald-latin-600-normal-plFmSr5g.woff2 +0 -0
  224. package/web/dist/assets/oswald-latin-700-normal-vy6hmKSr.woff2 +0 -0
  225. package/web/dist/assets/poppins-latin-400-normal-cpxAROuN.woff2 +0 -0
  226. package/web/dist/assets/poppins-latin-500-normal-C8OXljZJ.woff2 +0 -0
  227. package/web/dist/assets/poppins-latin-600-normal-zEkxB9Mr.woff2 +0 -0
  228. package/web/dist/assets/poppins-latin-700-normal-Qrb0O0WB.woff2 +0 -0
  229. package/web/dist/assets/rolldown-runtime-CbXtAM7H.js +0 -1
package/CHANGELOG.md CHANGED
@@ -8,7 +8,77 @@ label. For the capability ↔ spec map, see [SHIPPED.md](SHIPPED.md).
8
8
 
9
9
  ## [Unreleased]
10
10
 
11
- _Nothing yet._
11
+ ## [3.10.0] — 2026-10-01
12
+
13
+ **Upgrading:** re-emit after installing (`geneseed rebuild-all`). A Copilot install is no longer
14
+ maintained: `geneseed uninstall` it before upgrading, or leave its files as they are — nothing
15
+ re-emits them any more. Breaking for Copilot users only; every other host gains features.
16
+
17
+ ### Removed
18
+ - **GitHub Copilot is no longer a host** — dropped for lack of support and of cross-tool
19
+ support. `--emit copilot` / `--emit copilot-global`, the `--host copilot` hook dialect, the
20
+ Copilot agent dialect, its MCP target, the setup and web-console options and
21
+ `adapters/copilot/` are gone. Geneseed now emits for OpenCode, Claude Code, Bob and
22
+ OpenClaude, plus the plain `AGENT.md` bundle (#166).
23
+
24
+ ### Fixed
25
+ - **The session files reach the session.** The root file names `user-rules.md`, `PROFILE.md`,
26
+ the Memory and Notebook indexes, `wiki.jsonc` and `context.json` for session start, but on a
27
+ Claude-shaped install (Claude Code, Bob, OpenClaude) the context hook only looked at the repo
28
+ root — so none of them were ever injected, and the root told the model they sit "beside this
29
+ file", where they are not. The hook and the OpenCode context plugin now inject them from the
30
+ install's own folder as a `SESSION FILES` block, skipping any file still at its seed; the root
31
+ gives each host's real path; Claude-shaped installs now seed `context.json`; and the OpenCode
32
+ plugin finds `wiki.jsonc` on a project install (#167).
33
+ - **Bob folder skills know where they live.** Bob hands a skill's text without its directory, so
34
+ a folder skill's `<this-skill-directory>/…` paths were unresolvable; the Bob emit now writes the
35
+ real path. `daydream` gained its missing frontmatter, `react-view-transitions` is named after
36
+ its folder, and `doctor` checks every folder skill's `name`/`description` (#164).
37
+
38
+ ### Changed
39
+ - **A lighter lean root.** Restated prose is full-footprint only: the laws, Ethos, doctrine,
40
+ posture and mode intros, §3's dispatch envelope and council roster (they live in the
41
+ parallel-agents and council skills), §10 Scripts, and the folder-skill list on hosts that list
42
+ skills natively. The lean Claude root drops from ~33k to ~29k characters (#165).
43
+
44
+ ## [3.9.0] — 2026-09-30
45
+
46
+ **Upgrading:** re-emit after installing. Laws IX and XI are gone and Echo the Intent is now
47
+ **Law IX**: a note, memory or commit that says "Law IX" or "Law XI" from before this release
48
+ means the retired External Gate (now a rigor rule) or Absence Is a Claim (folded into Verify
49
+ Before Asserting). Nothing in the harness cites a rule by number any more.
50
+
51
+ ### Changed
52
+ - **Stable rule ids.** Every law and doctrine rule is declared by a permanent id on its heading
53
+ (`### {{LAW:verify-before-asserting}} Verify Before Asserting`) and cited by it. The number is
54
+ the rule's position, computed at render time, so removing or reordering a rule rewires no
55
+ citation. Theme title keys are keyed by id too (`LEX_VERIFY_BEFORE_ASSERTING`,
56
+ `DOC_CONSENT_BEFORE_PUSH`), so a renumber never touches a theme.
57
+ - **Citations render as principle names.** Every cross-reference in AGENT.md, the laws, the
58
+ doctrines, skills and agents now reads *Verify Before Asserting* rather than "Rule III" — the
59
+ same in every voice. The hook and guard-plugin messages name the principle too. Numbers remain
60
+ only on each rule's own heading.
61
+ - The memory section of AGENT.md (always on, both footprints) tells the agent to cite a rule by
62
+ its principle, never its number, in anything that outlives the session.
63
+ - **Web console redesign (Slate + Graphite).** New Overview (health, three charts, what needs
64
+ you), Constitution, Library, Personal and Installs pages; global and per-project installs are
65
+ shown apart; skill types head the Library as a full-width banner (#162). The console's flavours
66
+ are cut to Cultivar, Operator, Matrix and Atlas (#161). The Overview view choice now lives only
67
+ in the Appearance palette, not in the page header.
68
+
69
+ ### Removed
70
+ - Laws IX (External Gate, a rigor rule since 3.x) and XI (Absence Is a Claim, folded into Law III),
71
+ both retired in place until now. Their ids are recorded in `RETIRED_RULE_IDS` and can never be
72
+ reused.
73
+
74
+ ### Added
75
+ - **`explain-changes` folder skill — a visual walkthrough of a diff before it is committed**:
76
+ the agent writes a short brief (intent, risks, logical units) and
77
+ `scripts/render_changes.mjs` renders one offline HTML page with the exact git diff side by
78
+ side, then opens it. Offered by the `commit` skill and the git-gate prompt; never a gate.
79
+ - `doctor` refuses a citation by number, an unknown id, a duplicate id, a rule heading with no id,
80
+ a retired id declared again, a console `LAW_META`/`DOCTRINE_META` row pinned to a different rule
81
+ than its number now holds, and a hook-gated rule moving away from the address its hook keys.
12
82
 
13
83
  ## [3.8.0] — 2026-09-30
14
84
 
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_XI`, the 28 doctrine-rule titles `DOC_<PACK>_<n>`, the five pack
47
+ titles `LEX_<ID>`, the 28 doctrine-rule titles `DOC_<ID>` (keyed by stable rule id), the five pack
48
48
  names `PACK_CRAFT`/`PACK_RIGOR`/`PACK_OPS`/`PACK_PROCESS`/`PACK_COMMS`, 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,11 +98,13 @@ 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*. 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>}}`.
101
+ - **Invariants** (`src/laws/universal.md`) — *what is never traded*. Nine Rules, `I`..`IX`,
102
+ each declared `### {{LAW:<id>}} <Principle>` with a permanent id; the numeral is its
103
+ position, computed at render time (the retired IX and XI were removed on 2026-09-30, and
104
+ Echo the Intent became IX without a single citation changing).
104
105
  - **Doctrines** (`src/doctrines/{craft,rigor,ops,process,comms}.md`) — *how work is done
105
- here*. Practice rules addressed by pack and number, cited as `Doctrine process 5`.
106
+ here*. Practice rules addressed by pack and position (`process 5`), declared and cited by
107
+ id the same way; a citation of any rule renders as its principle's name.
106
108
  `PACK_ORDER` (`js/build/source.mjs`) fixes the order craft → rigor → ops → process → comms, which
107
109
  is narrative and deliberately not alphabetical.
108
110
 
@@ -145,12 +147,12 @@ vault or a specific tool's hooks.
145
147
 
146
148
  | Satellite | A new invariant | A new doctrine rule | A whole new pack |
147
149
  |---|---|---|---|
148
- | body | append to `src/laws/universal.md` — never insert; nothing resolves a cross-reference against the canon | append to `src/doctrines/<pack>.md`, `### {{DOCTRINE}} <pack> <n> — {{DOC_<PACK>_<n>}}`; ids must run contiguously from 1 | a new `src/doctrines/<pack>.md` with its `**Name** — lead line` |
149
- | themed title | `LEX_<roman>` in all 15 theme files | `DOC_<PACK>_<n>` in all 15 theme files | `PACK_<NAME>` in all 15, plus each rule's `DOC_*` |
150
+ | body | `### {{LAW:<id>}} <Principle>` in `src/laws/universal.md`; citations resolve by id, so no position rewires one | `### {{DOCTRINE:<id>}} <Principle>` in `src/doctrines/<pack>.md`; the number is its position | a new `src/doctrines/<pack>.md` with its `**Name** — lead line` |
151
+ | themed title | `LEX_<ID>` in all 15 theme files | `DOC_<ID>` in all 15 theme files | `PACK_<NAME>` in all 15, plus each rule's `DOC_*` |
150
152
  | class | `LAW_CLASS` in `js/inspect/inventory.mjs`, one of the six in `LAW_CLASSES` | **none** — a doctrine rule's class *is* its pack, and there is no second taxonomy over it | — |
151
153
  | console copy | a `LAW_META` row in `web/src/pages/Laws.jsx` (keyed by arabic number) | a `DOCTRINE_META` row in the same file (keyed `<pack>.<n>`) | one `DOCTRINE_META` row per rule |
152
154
  | registration | the numeral is the registration | the number is the registration | the pack name in `PACK_ORDER`, `js/build/source.mjs` |
153
- | renumber risk | high — appending is the only safe move | none — packs are numbered independently | none |
155
+ | renumber risk | none for citations (by id); `LAW_META`/`LAW_CLASS` are number-keyed and doctor-pinned, so append by preference | none for citations; `DOCTRINE_META`, exclusions and hook ledger keys are `<pack>.<n>` — append by preference | none |
154
156
  | counts | README badge + the `N universal laws` prose, `SHIPPED.md`'s triple, the web onboarding copy | **none** — the console spends the `N_PACKS` / `N_PACKS_ACTIVE` / `N_DOCTRINE_RULES` count tokens, all computed at request time | none, same reason |
155
157
  | changelog | `CHANGELOG.md` | `CHANGELOG.md` | `CHANGELOG.md` |
156
158
 
@@ -164,8 +166,9 @@ vault or a specific tool's hooks.
164
166
  Almost all of it is gated, across six named checks in `js/inspect/checks-build.mjs` —
165
167
  `themeParityProblems` (key parity across the voices), `lawMetaProblems` and
166
168
  `doctrineMetaProblems` (the console's Principle column, in both directions),
167
- `constitutionProblems` (pack numbering and filing, `LEX_I..LEX_XI` as an *equality*, the
168
- `DOC_*` vocabulary, and every `{{DOCTRINE}}` citation in `src/`), and
169
+ `constitutionProblems` (rule ids declared, unique and never retired, `LEX_*` as an *equality*,
170
+ the `DOC_*` vocabulary, the hook-gated addresses, and every `{{LAW:…}}`/`{{DOCTRINE:…}}`
171
+ citation in `src/` — a citation by number is refused), and
169
172
  `countTableProblems` / `proseMirrorProblems` (badges and prose). So `geneseed doctor
170
173
  --all` is the check; the table above only says what it will ask for. `CHANGELOG.md` has
171
174
  no gate and never has.
package/QUICKSTART.md CHANGED
@@ -43,7 +43,7 @@ or a login item it did not create. Your clone keeps working meanwhile.
43
43
 
44
44
  ## Everything else
45
45
 
46
- Claude Code, Bob, Copilot, OpenClaude and plain-`AGENT.md` installs, per-repo mode, MCP servers, all
46
+ Claude Code, Bob, OpenClaude and plain-`AGENT.md` installs, per-repo mode, MCP servers, all
47
47
  environment knobs, and troubleshooting live in the full **[Setup guide](SETUP.md)**.
48
48
 
49
49
  Once installed, point the agent at your repo's own docs with a tiny
package/README.md CHANGED
@@ -10,11 +10,11 @@
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-52-blueviolet)](src/skills/)
13
+ [![Skills](https://img.shields.io/badge/skills-53-blueviolet)](src/skills/)
14
14
  [![Agents](https://img.shields.io/badge/agents-18-orange)](src/agents/)
15
- [![Laws](https://img.shields.io/badge/laws-11-critical)](src/laws/universal.md)
15
+ [![Laws](https://img.shields.io/badge/laws-9-critical)](src/laws/universal.md)
16
16
  [![Plugins](https://img.shields.io/badge/plugins-7-teal)](adapters/opencode/plugins/)
17
- [![OpenCode · Claude Code · Bob · Copilot · OpenClaude · AGENT.md](https://img.shields.io/badge/works%20with-OpenCode%20·%20Claude%20Code%20·%20Bob%20·%20Copilot%20·%20OpenClaude%20·%20AGENT.md-1f6feb)](#-supported-harnesses)
17
+ [![OpenCode · Claude Code · Bob · OpenClaude · AGENT.md](https://img.shields.io/badge/works%20with-OpenCode%20·%20Claude%20Code%20·%20Bob%20·%20OpenClaude%20·%20AGENT.md-1f6feb)](#-supported-harnesses)
18
18
 
19
19
  [**Why**](#-1--why-geneseed) · [**Setup**](#-2--setup) · [**Web & terminal**](#-3--web--terminal) · [**What you get**](#-4--what-you-get)
20
20
 
@@ -24,7 +24,7 @@
24
24
 
25
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
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, OpenClaude, 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.
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, OpenClaude, 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
28
 
29
29
  ```bash
30
30
  npx geneseed setup
@@ -36,8 +36,8 @@ Want to read what it leaves behind before installing anything? [**geneseed-demo*
36
36
 
37
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
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, Copilot and OpenClaude, 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, six targets.** Skills are byte-identical on every host; only the wiring differs. Every commit renders all 317 emit configurations, and a second emit into the same tree must change nothing.
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 OpenClaude, 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
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
42
  - **It follows you.** Install once, globally; every repo inherits it. One `git pull` or `npm install -g geneseed@latest` rebuilds every active install.
43
43
 
@@ -163,10 +163,10 @@ The harness ships as a small set of layers, and the web console's rail is the sa
163
163
  | Layer | What it is |
164
164
  | --- | --- |
165
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 |
166
+ | **🛡️ Rules** (`laws/`) | 9 universal laws — always in force, never toggleable: sealed-secrets, one-intent-one-act, verify-before-asserting, deletion-is-deliberate, surface-failures, data-not-orders, least-privilege, cure-the-cause, echo-the-intent. Each rule has a permanent id; its number is only its position, and the harness cites rules by name |
167
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), **comms** (how answers are presented). 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 five pack files ship on disk either way, so a citation into a pack you left out still resolves |
168
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` |
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** |
169
+ | **🛠 Skills** (53) | 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** · **explain-changes** |
170
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 |
171
171
  | **🧠 Memory** (`memory/`) | one-fact-per-file durable knowledge, indexed by `MEMORY.md` (git-ignored, personal) |
172
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 |
@@ -212,7 +212,7 @@ A second per-install dial, **footprint**, sets how much of the constitution `AGE
212
212
 
213
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 five 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.
214
214
 
215
- Lean is the default: the rationale is one read away and the context it frees is paid back on every turn. Switch to **full** when token cost is a non-issue or you run a smaller model, which leans harder on always-present rationale. Set it with `--footprint lean|full`, the Settings toggle, the per-harness dropdown in the Harnesses tab, or the setup wizard. It's remembered in a `.geneseed-footprint` marker and preserved across rebuilds, on every host (OpenCode, Claude Code, Bob, Copilot).
215
+ Lean is the default: the rationale is one read away and the context it frees is paid back on every turn. Switch to **full** when token cost is a non-issue or you run a smaller model, which leans harder on always-present rationale. Set it with `--footprint lean|full`, the Settings toggle, the per-harness dropdown in the Harnesses tab, or the setup wizard. It's remembered in a `.geneseed-footprint` marker and preserved across rebuilds, on every host (OpenCode, Claude Code, Bob, OpenClaude).
216
216
 
217
217
  Either way the harness is otherwise identical — same files, Rules, capabilities, and guards; lean only relocates the *reasoning* to on-demand (and adds the standalone law, ontology and doctrine files to global/Claude/Bob installs). The one behavioural edge: with the rationale always in context, **full** applies a rule's nuance more reliably on subtle edge cases — or with a weaker model that may not reach for the pointer.
218
218
 
@@ -222,37 +222,37 @@ Want to check a build before it touches anything real? `geneseed validate --them
222
222
 
223
223
  ## 🔌 Supported harnesses
224
224
 
225
- One source, six emit targets. Geneseed builds into whichever host you point it
225
+ One source, five emit targets. Geneseed builds into whichever host you point it
226
226
  at — each with a per-repo and a global (`-global`) variant — plus a portable
227
227
  `files` bundle any `AGENT.md`-aware tool can read. **OpenCode** runs its own
228
- engine (JS plugins, colour themes, LSP); **Claude Code**, **Bob**, **Copilot**
228
+ engine (JS plugins, colour themes, LSP); **Claude Code**, **Bob**
229
229
  and **OpenClaude** share one Claude-shaped engine that diverges only by host dialect.
230
230
 
231
231
  The harness — its Rules, Agents, Skills, Memory convention, and preamble voice —
232
232
  is **identical on every host**. What differs is how much of it the host can
233
233
  *automate* for you (via plugins or hooks) versus carry as preamble discipline.
234
234
 
235
- | Capability | OpenCode | Claude Code | Bob | Copilot | OpenClaude |
236
- | --- | :---: | :---: | :---: | :---: | :---: |
237
- | **Instructions file** | `AGENT.md` + `opencode.json` | `CLAUDE.md` | `AGENTS.md` + `rules/geneseed.md` | `AGENTS.md` / `copilot-instructions.md` | `CLAUDE.md` (in `.openclaude/` per repo) |
238
- | **Agents** (capability specialists) | ✅ native | ✅ | ✅ | ✅ `.agent.md` | ✅ |
239
- | **Skills** (byte-identical) | ✅ | ✅ | ✅ | ✅ | ✅ |
240
- | **Memory & Notebook** | ✅ | ✅ | ✅ | ✅ | ✅ |
241
- | **Context injection** | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 🪝 hook³ | 🪝 hook⁴ |
242
- | **Memory write-back** (learn) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 🪝 hook³ | 🪝 hook⁴ |
243
- | **Git-gate consent** (process 5) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ (warn) | 🪝 hook³ | 🪝 hook⁴ |
244
- | **Rule-gate consent** (process 1) | ⚙️ plugin² | 🪝 hook | 🪝 hook¹ (warn) | 🪝 hook³ | 🪝 hook⁴ |
245
- | **Laws I / IV at the boundary** | ⚙️ plugin (block) | 🪝 hook (ask) | 🪝 hook¹ (exit 2) | 🪝 hook³ (ask) | 🪝 hook⁴ (ask) |
246
- | **Sovereign-repo excludes** | ⚙️ plugin | ✅ `claudeMdExcludes` | ✅ rules-shadow | ➖ none | ✅ `claudeMdExcludes` |
247
- | **MCP server wiring** | ✅ `mcp` | ✅ `mcpServers` | ✅ `mcp.json` | ✅ `mcp-config.json` | ✅ `mcpServers` |
248
- | **Colour themes** | ✅ full palette | ➖ | ➖ | ➖ | ➖ |
249
- | **LSP · workflow runner · primary-agent · `/`-commands** | ✅ | ➖ | ➖ | ➖ | ➖ |
250
-
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). · ⁴ OpenClaude is a Claude Code fork: Claude's hook groups and verdicts verbatim, in `~/.openclaude/settings.json` (global) or `.openclaude/settings.local.json` (per repo). Unverified live (no OpenClaude install on the authoring machine).</sub>
235
+ | Capability | OpenCode | Claude Code | Bob | OpenClaude |
236
+ | --- | :---: | :---: | :---: | :---: |
237
+ | **Instructions file** | `AGENT.md` + `opencode.json` | `CLAUDE.md` | `AGENTS.md` + `rules/geneseed.md` | `CLAUDE.md` (in `.openclaude/` per repo) |
238
+ | **Agents** (capability specialists) | ✅ native | ✅ | ✅ | ✅ |
239
+ | **Skills** (byte-identical) | ✅ | ✅ | ✅ | ✅ |
240
+ | **Memory & Notebook** | ✅ | ✅ | ✅ | ✅ |
241
+ | **Context injection** | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 🪝 hook³ |
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) |
246
+ | **Sovereign-repo excludes** | ⚙️ plugin | ✅ `claudeMdExcludes` | ✅ rules-shadow | ✅ `claudeMdExcludes` |
247
+ | **MCP server wiring** | ✅ `mcp` | ✅ `mcpServers` | ✅ `mcp.json` | ✅ `mcpServers` |
248
+ | **Colour themes** | ✅ full palette | ➖ | ➖ | ➖ |
249
+ | **LSP · workflow runner · primary-agent · `/`-commands** | ✅ | ➖ | ➖ | ➖ |
250
+
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. · ³ OpenClaude is a Claude Code fork: Claude's hook groups and verdicts verbatim, in `~/.openclaude/settings.json` (global) or `.openclaude/settings.local.json` (per repo). Unverified live (no OpenClaude install on the authoring machine).</sub>
252
252
 
253
253
  **Reading the matrix.** Everything above the divider is at full parity — no host
254
254
  drops an Agent, Skill, or the memory convention. The asymmetry is entirely in
255
- *automation mechanism*: OpenCode's plugin surface and the Claude/Bob/Copilot/OpenClaude hook
255
+ *automation mechanism*: OpenCode's plugin surface and the Claude/Bob/OpenClaude hook
256
256
  surfaces enforce a few Rules for you, each in the tier its host offers (a prompt on
257
257
  Claude Code, a hard block or a logged warning where the host has no prompt to
258
258
  give), and what no host can automate rides the preamble. The OpenCode-only extras (themes, LSP,
@@ -260,7 +260,7 @@ workflow runner, primary-agent) have no analogue on a Claude-shaped host.
260
260
 
261
261
  Per-host wiring in depth: **[OpenCode](adapters/opencode/README.md)** ·
262
262
  **[Claude Code](adapters/claude-code/README.md)** ·
263
- **[Bob](adapters/bob/README.md)** · **[Copilot](adapters/copilot/README.md)** ·
263
+ **[Bob](adapters/bob/README.md)** ·
264
264
  **[OpenClaude](adapters/openclaude/README.md)**.
265
265
  Token cost per host: **[docs/token-footprint.md](docs/token-footprint.md)**.
266
266
 
@@ -294,7 +294,7 @@ Geneseed/
294
294
  ├── tests/ Node test suites, golden.mjs (every emit config) and mutate.mjs
295
295
  ├── docs/ guides (web-ui, wiki, …) + docs/web/ (the console's Docs pages);
296
296
  │ specs/, reviews/, superpowers/ are local working docs — git-ignored
297
- ├── adapters/ per-host glue (opencode/, claude-code/, bob/, copilot/, openclaude/)
297
+ ├── adapters/ per-host glue (opencode/, claude-code/, bob/, openclaude/)
298
298
  └── .github/workflows/ ci.yml (doctor + tests) · publish.yml (npm, OIDC, manual only)
299
299
  ```
300
300
 
@@ -345,7 +345,6 @@ Details and precedence rules: [SETUP.md → Upgrade](SETUP.md#upgrade).
345
345
  | ⤷ [HOW-OPENCODE-LOADS.md](adapters/opencode/HOW-OPENCODE-LOADS.md) | Why a file shows up twice; plugin loading |
346
346
  | **[adapters/claude-code/](adapters/claude-code/README.md)** | The Claude Code hook adapter |
347
347
  | **[adapters/bob/](adapters/bob/README.md)** | The IBM Bob adapter — Claude-shaped, rules-file preamble |
348
- | **[adapters/copilot/](adapters/copilot/README.md)** | The GitHub Copilot adapter — global hooks (`sessionStart`, `preToolUse`, `agentStop`, `preCompact`) |
349
348
  | **[adapters/openclaude/](adapters/openclaude/README.md)** | The OpenClaude adapter — the Claude engine under `~/.openclaude` / `.openclaude/` |
350
349
  | **[src/memory/README.md](src/memory/README.md)** | The memory convention |
351
350
  | **[src/notebook/README.md](src/notebook/README.md)** | The agent's own freeform-space convention |
package/SETUP.md CHANGED
@@ -22,7 +22,7 @@ that matches your tool, then configure and verify. For the conceptual overview s
22
22
 
23
23
  - **Node ≥ 22.3** — the only hard requirement. Geneseed ships as an npm package with
24
24
  **zero dependencies**; `npx geneseed` needs nothing else.
25
- - **Your agent tool** — OpenCode (recommended), Claude Code, Bob, Copilot, OpenClaude, or anything
25
+ - **Your agent tool** — OpenCode (recommended), Claude Code, Bob, OpenClaude, or anything
26
26
  that reads a root instructions file.
27
27
  - *Only for a git checkout:* **git**. Nothing else — a checkout runs the same Node
28
28
  entry points the npm package installs.
@@ -93,8 +93,7 @@ hand? Pick a path below.
93
93
  | [A — OpenCode, global](#path-a--opencode-global-recommended) | **Recommended.** One install, every repo inherits it, nothing committed into projects. |
94
94
  | [B — OpenCode, per-repo](#path-b--opencode-per-repo) | You want a committed `.opencode/` layer in one repository. |
95
95
  | [C — Claude Code](#path-c--claude-code) | You drive Claude Code and want the lifecycle hooks. |
96
- | [C′ — GitHub Copilot](#path-c--github-copilot) | You drive the Copilot CLI, coding agent, or VS Code agent mode. |
97
- | [C″ — OpenClaude](#path-c--openclaude) | You drive OpenClaude, the any-model Claude Code fork. |
96
+ | [C′ — OpenClaude](#path-c--openclaude) | You drive OpenClaude, the any-model Claude Code fork. |
98
97
  | [D — Any `AGENT.md` tool](#path-d--any-agentmd-tool) | Cursor, Aider, or any tool that reads a root instructions file. |
99
98
  | [E — No runtime on the target at all](#path-e--no-runtime-on-the-target-at-all) | The machine that *uses* the harness cannot run Node. |
100
99
 
@@ -219,45 +218,11 @@ repo's own `.claude/settings.local.json`, and OpenClaude's in `.openclaude/setti
219
218
  Bob: the workspace rules shadow stub;
220
219
  OpenCode: the plugins stand down). Everything is reversed by `exclude remove`.
221
220
 
222
- Limitations: GitHub Copilot has no per-repo suppression mechanism, so the global
223
- `copilot-instructions.md` still loads there; and globally installed skills/
224
- subagents remain listed by the host (no native per-repo disable exists). A
225
- global install emitted later starts with an empty list — re-run
221
+ Limitation: globally installed skills/subagents remain listed by the host (no
222
+ native per-repo disable exists). A global install emitted later starts with an empty list — re-run
226
223
  `harness exclude add` (`exclude list` flags installs that diverge).
227
224
 
228
- ### Path C′ — GitHub Copilot
229
-
230
- ```
231
- geneseed-build --emit copilot-global # personal: render into ~/.copilot
232
- geneseed-build --emit copilot --out . --root . # per-repo: AGENTS.md + .github/, committed
233
- ```
234
-
235
- Copilot is Claude-shaped where it counts: skills are the same `SKILL.md` folders
236
- (Copilot's Agent Skills — `.github/skills/` in a repo, `~/.copilot/skills/`
237
- personally), agents render in Copilot's own custom-agent dialect
238
- (`agents/<name>.agent.md`, a `tools:` allowlist instead of Claude's denylist), and
239
- the preamble rides a file Copilot auto-loads: the repo-root `AGENTS.md` (CLI, coding
240
- agent, and VS Code agent mode) or the personal `~/.copilot/copilot-instructions.md`
241
- (CLI). Two differences from the Claude paths:
242
-
243
- - **Hooks at global scope only.** The global emit adds entries to four events in
244
- `~/.copilot/settings.json`: `sessionStart` (eager project-context injection),
245
- `preToolUse` (both gates behind one command, since entries carry no matcher —
246
- every rule **asks**, as on Claude Code), and `agentStop` + `preCompact` (`learn`,
247
- from the payload's `transcriptPath`). The per-repo emit wires nothing: a
248
- machine-absolute command in a shared `.github/` would fail on every teammate's
249
- machine.
250
- - **The per-repo layer lives in the shared `.github/`** (Copilot's repo config
251
- surface). Safe by construction: the ownership manifest + claim-on-create never
252
- touch files Geneseed didn't write — your workflows and same-named agents/skills
253
- survive every emit and uninstall.
254
-
255
- MCP servers go in `~/.copilot/mcp-config.json` (the Settings/MCP screens know the
256
- shape). `$COPILOT_CONFIG_DIR` relocates the personal dir, mirroring
257
- `$BOB_CONFIG_DIR`. Note both carriers stack if you install globally *and* per-repo —
258
- the global emit warns when that's about to happen.
259
-
260
- ### Path C″ — OpenClaude
225
+ ### Path C′ — OpenClaude
261
226
 
262
227
  ```
263
228
  geneseed-build --emit openclaude-global # render into ~/.openclaude
@@ -453,7 +418,7 @@ you run a smaller model.
453
418
  **Same harness, either way.** Footprint changes neither what the harness *is* nor what it
454
419
  can *do*: lean and full emit identical files (same agents, skills, plugins, commands, memory,
455
420
  notebook, hooks) and every Rule is present and binding. The only structural difference is
456
- that a lean install on a global / Claude / Bob / Copilot / OpenClaude target also ships the standalone
421
+ that a lean install on a global / Claude / Bob / OpenClaude target also ships the standalone
457
422
  `laws/universal.md` and `ontology/` (project bundles already carry them, and `doctrines/`
458
423
  ships at both footprints on every target); the only behavioural difference is that the
459
424
  reasoning loads on demand instead of every turn. Lean is the default; full, with the rationale
@@ -463,7 +428,7 @@ with a weaker model, and is one flag away.
463
428
  Set it with `--footprint lean|full` (alongside any `--emit`), the **Footprint** toggle in
464
429
  the web Settings, the per-harness dropdown in the Harnesses tab, or the setup wizard. It is
465
430
  remembered in a `.geneseed-footprint` marker and preserved across every rebuild, on every
466
- host (OpenCode, Claude Code, Bob, Copilot, OpenClaude).
431
+ host (OpenCode, Claude Code, Bob, OpenClaude).
467
432
 
468
433
  ### Dry-run a build (`validate`)
469
434
 
package/SHIPPED.md CHANGED
@@ -20,7 +20,7 @@ historical references, not files distributed with the repo.
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.8.0**.
23
+ > string. Current label: **3.10.0**.
24
24
 
25
25
  ## Capabilities
26
26
 
@@ -29,15 +29,15 @@ Every row below is present in the tree today; "Spec" names the design record.
29
29
  | Capability | What it is | Spec |
30
30
  | --- | --- | --- |
31
31
  | **Themed generator** | One neutral `src/` → 14 themed bundles via `geneseed-build` (zero dependencies); structure stays theme-independent | [DESIGN.md](DESIGN.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 five toggleable **Doctrine** packs (craft, rigor, ops, process, comms) 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` |
32
+ | **Laws / Agents / Skills / Memory / Notebook** | 9 laws, 18 agents, 53 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 nine always-on **Invariants**, and five toggleable **Doctrine** packs (craft, rigor, ops, process, comms) addressed `<pack> <n>`. Every rule carries a permanent id; its number is its position, computed at render time, and a citation renders as the rule's principle name. 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 rule ids (declared, unique, never a retired one), the per-rule Principle column, every `{{LAW:<id>}}` / `{{DOCTRINE:<id>}}` 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
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
35
  | **`diff` + improvements export** | Deployed-vs-source drift report; export an `improvements.md` back-port | `2026-06-12-improvements-export` |
36
36
  | **`status` / `version`** | Headless dashboard + fingerprint verdict (no TUI needed) | `2026-06-07-status-command` · `2026-06-07-version-and-uninstall` |
37
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
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
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`), OpenClaude asks exactly as Claude does (a Claude Code fork, under `~/.openclaude` / `.openclaude/`), 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) |
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`), OpenClaude asks exactly as Claude does (a Claude Code fork, under `~/.openclaude` / `.openclaude/`), 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 | [bob](adapters/bob/README.md) · [claude-code](adapters/claude-code/README.md) · [candidate hosts](docs/candidate-hosts.md) |
41
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
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
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` |
@@ -23,7 +23,8 @@ limitation to be aware of on a shared repo.
23
23
  - `agents/<name>.md` — the **Claude subagent dialect** verbatim (`name` +
24
24
  `description` + a `disallowedTools:` denylist for read-only agents).
25
25
  - `skills/<name>/SKILL.md` — **byte-identical** to every other host; skills
26
- are model-invoked via the `skill` tool.
26
+ are model-invoked via the `skill` tool. The one exception is the folder skills'
27
+ own directory — see *Bob-ism 3*.
27
28
  - `rules/geneseed.md` — a **slim shadow stub** (see *Bob-ism 1* below).
28
29
  - `settings.json` — Geneseed's lifecycle hooks (gitignored by the emit's
29
30
  `.bob/.gitignore`, see the caveat below).
@@ -64,6 +65,21 @@ never gets one; the `rules/geneseed.md` shadow above covers the same
64
65
  project-bypasses-global need. An older Bob install that wrote a stale exclude is
65
66
  **self-healed** (the entry is removed) on the next emit.
66
67
 
68
+ ## Bob-ism 3 — a folder skill is told where it lives
69
+
70
+ A folder skill (`explain-changes`, `token-report`, `daydream`, …) ships scripts or
71
+ prompts beside its `SKILL.md` and names them `<this-skill-directory>/…`. Claude Code
72
+ answers that placeholder itself — it gives the model each skill's base directory on load.
73
+ Bob gives the skill's text only, so the model was left with a path it could not resolve
74
+ and fell back to searching the filesystem. The Bob emit therefore writes the directory in:
75
+
76
+ - per repo, relative to the workspace root — `node .bob/skills/token-report/scripts/…` —
77
+ which is where Bob runs commands, and stays valid in a teammate's checkout;
78
+ - globally, the absolute path under `~/.bob/skills/`.
79
+
80
+ `doctor` also requires every folder skill's `SKILL.md` to open with a frontmatter whose
81
+ `name` is the folder's and which has a `description` — what any host registers a skill from.
82
+
67
83
  ## Hooks — Bob's own protocol
68
84
 
69
85
  Bob documents lifecycle hooks (its hooks page and the 2.0.2 changelog; see
@@ -58,7 +58,7 @@ which root file OpenClaude already loads (`AGENTS.md` when present, else
58
58
  ## Not supported
59
59
 
60
60
  - **Workflows.** OpenClaude ships its `WorkflowTool` disabled, so the `workflow`
61
- skill falls back to parallel agents, as on Bob and Copilot.
61
+ skill falls back to parallel agents, as on Bob.
62
62
  - **Live verification.** The emit follows OpenClaude's source (`src/utils/envUtils.ts`,
63
63
  `src/utils/claudemd.ts`, `src/utils/config.ts`, `src/types/hooks.ts`) as of
64
64
  2026-09. It has not been run against an installed OpenClaude yet.
@@ -276,7 +276,7 @@ It is not one now: the invariants are a closed set of nine, and project-context
276
276
  discovery is one of the two old laws absorbed into AGENT.md's own **§9 Context**
277
277
  section, which every build carries as prose. Nothing an adapter spec writes is
278
278
  added to the invariants. The text below survives as the *instruction* tier behind
279
- the *injection* tier, and `{{DOCTRINE}} process 4` (Read the Docs First) is its
279
+ the *injection* tier, and `{{DOCTRINE:read-the-docs-first}}` (Read the Docs First) is its
280
280
  nearest live citation:
281
281
 
282
282
  > **Rule (Project Context Discovery).** When project context has not already been
@@ -384,7 +384,7 @@ behaviour** — nothing changes the machine's current agent/model unless you opt
384
384
  `2026-06-17-opencode-color-themes` spec).
385
385
  - **Runtime guard plugin** (`geneseed-guard.js`, installed with the others). Enforces
386
386
  the safety Laws at the tool boundary: **blocks** writes to private-key/credential
387
- files (Law I), catastrophic shell like `rm -rf /` (Law IV), and any mutation under
387
+ files (Sealed Secrets), catastrophic shell like `rm -rf /` (Deletion Is Deliberate), and any mutation under
388
388
  a declared wiki's `protected` folders (AGENT.md §8, from `wiki.jsonc`); **warns** on
389
389
  `.env` writes and force-push. `GENESEED_GUARD=off` disables it, `=warn` downgrades
390
390
  blocks to warnings. Every **block** appends one line to the install's
@@ -400,7 +400,7 @@ behaviour** — nothing changes the machine's current agent/model unless you opt
400
400
  - **Default permissions.** A fresh `opencode.json` gets a minimal policy that **asks**
401
401
  before `rm -rf *` and a force-push — those are **Rule IV**'s territory and are in every
402
402
  build — and, **on an install that built the `process` pack in**, before every
403
- `git commit` and `git push` (the host-level backstop for **Doctrine process 5**: the
403
+ `git commit` and `git push` (the host-level backstop for **Consent Before Push**: the
404
404
  agent never records or shares code unprompted, on any branch). Build with
405
405
  `--doctrines` leaving `process` out and those two entries are simply not written.
406
406
  The whole block is added only when you have no `permission` key; an existing policy is
@@ -534,7 +534,7 @@ install `jsonc-parser` yourself — you lose OCX's dependency management and
534
534
  auto-updates, and you own the upgrade-by-re-copy. Prefer the OCX path.
535
535
 
536
536
  **Consent note.** `worktree_delete` auto-commits before removal. The harness's
537
- consent-before-commit rule (**Doctrine process 5**, when the `process` pack is built in)
537
+ consent-before-commit rule (**Consent Before Push**, when the `process` pack is built in)
538
538
  is enforced for *shell* `git commit` via `opencode.json`
539
539
  permissions, but this plugin commits through its own tool path — so review what it
540
540
  will commit before invoking delete, or keep the worktree and commit yourself.