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
@@ -3,9 +3,10 @@
3
3
  What a deployed harness costs in context-window tokens, per host. Token counts are
4
4
  chars/4 estimates and shift a little with theme and version.
5
5
 
6
- **Treat every number below as a floor, not a reading.** They were measured on a
7
- `--footprint lean` build (the default) of the neutral theme when the tree carried
8
- 47 skills and 17 agents, and nothing re-measures this page automatically. For a
6
+ **Treat every number below as a floor, not a reading.** They were measured on
7
+ 2026-09-12 on a `--footprint lean` build (the default) of the neutral theme with
8
+ four doctrine packs, 54 skills and 19 agents, and nothing re-measures this page
9
+ automatically. For a
9
10
  live figure on your own install, ask the agent for the `token-report` skill —
10
11
  that is what it is for. A `--footprint full` build runs roughly 5k tokens
11
12
  heavier on the root file.
@@ -16,41 +17,65 @@ The context every host injects at session start, before you type anything:
16
17
 
17
18
  | Component | Claude Code | OpenCode | Bob | Copilot |
18
19
  |---|---|---|---|---|
19
- | Root instruction file | ~6.4k (`CLAUDE.md`) | ~6.4k (`AGENT.md`) | ~8.3k (`AGENTS.md`) | ~8.3k (`AGENTS.md`) |
20
- | Skill metadata (name + description) | ~1.7k | ~1.7k | ~1.7k | ~1.7k |
21
- | Agent metadata | ~0.5k | ~0.55k | ~0.5k | ~0.5k |
22
- | Eager memory/notebook injection | ~1.2k (SessionStart hook) | ~1.2k (context plugin) | ~1.2k (SessionStart hook) | — (no hooks; read on demand) |
23
- | **Total** | **~9.8k** | **~9.9k** | **~11.7k** | **~10.5k** |
20
+ | Root instruction file | ~7.3k (`CLAUDE.md`) | ~7.3k (`AGENT.md`) | ~7.7k (`AGENTS.md`, §3 table inline) | ~9.0k (`AGENTS.md`, §3+§4 tables inline) |
21
+ | Skill metadata (name + description) | ~4.1k | ~4.1k | ~4.1k (native) | — (§4 table; native catalogue unverified) |
22
+ | Agent metadata | ~0.5k | ~0.5k | — (no agents directory) | — (§3 table) |
23
+ | Eager memory/notebook injection | ~1.2k (SessionStart hook) | ~1.2k (context plugin) | ~1.2k (SessionStart hook) | ~1.2k (sessionStart hook) |
24
+ | **Total** | **~13k** | **~13k** | **~13k** | **~10k** |
24
25
 
25
- The emits are at parity by design: ~10–12k tokens, about 5–6% of a 200k
26
- window. Bob and Copilot carry the §3/§4 catalogue tables inline because their
26
+ The emits are at parity by design: ~10–13k tokens, about 6% of a 200k
27
+ window. Bob catalogues skills natively but has no agents directory, so its
28
+ root keeps the §3 Agents table and drops the §4 Skills table — the catalogue
29
+ flag is per kind (`hostCatalogsNatively`), not one boolean. Before the 2026-09 footprint pass every hooked host paid roughly double
30
+ this: the context hook re-injected the root file the host had already loaded
31
+ natively, and skill descriptions ran to 900 characters each — see the
32
+ "Where the tokens go" list below for what changed. Bob and Copilot carry the §3/§4 catalogue tables inline because their
27
33
  hosts expose no native skill/agent inventory; Claude Code and OpenCode ship a
28
- pointer to the host's own inventory instead, ~1.9k tokens lighter. Copilot also
29
- runs without eager injection — it has no hook mechanism, so the
30
- memory/notebook indexes load when the agent reads them, not eagerly. The
31
- eager-injection path is budget-capped identically everywhere
32
- (16 KB per file, 48 KB total ≈ 12k tokens ceiling), so growing Memory degrades
33
- every host the same way instead of one silently falling behind.
34
+ pointer to the host's own inventory instead, ~1.9k tokens lighter. Copilot's
35
+ eager injection rides its `sessionStart` hook, which the **global** emit wires;
36
+ a project-scope Copilot install has no hooks, so there the memory/notebook
37
+ indexes load when the agent reads them, not eagerly. The
38
+ eager-injection path is budget-capped identically everywhere — 16 KB per file
39
+ (cut at a line break, with a marker saying so) and 48 KB per session (files past
40
+ the budget are listed lazy with the reason) — so a 40k-character README no
41
+ longer leaves whole every session, and growing Memory degrades every host the
42
+ same way instead of one silently falling behind. The hook also **never injects
43
+ the root file the host loads by itself** (`CLAUDE.md` on Claude Code,
44
+ `AGENTS.md` on Bob and Copilot, `AGENT.md`/`AGENTS.md`/`CLAUDE.md` on OpenCode):
45
+ until 2026-09 it did, and the whole harness was paid twice per session.
34
46
 
35
47
  ## Where the tokens go
36
48
 
37
49
  - **The root file is ~65% of the bill**, and the constitution inside it is the
38
- bulk of that — no longer one section but three: the Ontology, the nine Rules,
50
+ bulk of that — no longer one section but three: the Ethos, the nine Rules,
39
51
  and the doctrine packs this install built in. **Two** levers move it, not one.
40
52
  The [footprint dial](#/docs/footprint) (`lean`, the default, swaps each Rule,
41
- the Ontology and the longest prose sections — the preamble, §6 Notebook, §8
42
- Wiki — for their hand-written condensations, and cuts each doctrine rule to its
43
- heading plus first line; `full` inlines every rationale). And the
53
+ each doctrine rule, the Ethos and the longest prose sections — the preamble,
54
+ §6 Notebook, §8 Wiki — for their hand-written condensations; `full` inlines
55
+ every rationale). And the
44
56
  [doctrine packs](#/docs/setup-choices) — `geneseed-build --doctrines craft,rigor`
45
57
  drops whole blocks of §2 at build time, which removes far more than the
46
58
  footprint dial trims. Anything else is noise.
47
59
 
48
60
  The lean condensations are authored, not generated. An earlier design shipped
49
- the Ontology *whole* under `lean` on the grounds that truncating four flowing
61
+ the Ethos *whole* under `lean` on the grounds that truncating four flowing
50
62
  sections to four orphan sentences would ship a worldview nobody could read —
51
- the `LEAN:` blocks answer that by hand-writing the short form instead
52
- (measured on `neutral`, the root file at `lean` went from 29,966 bytes to
53
- 25,614 with them).
63
+ the `LEAN:` blocks answer that by hand-writing the short form instead. The
64
+ doctrine packs were the last tier still cut at the first full stop, and they
65
+ now author their halves too — which *adds* text at `lean` rather than removing
66
+ it, deliberately: eleven of the twenty-four rules were shipping a slogan with
67
+ no verb an agent could act on. Read the carrier size off the ceiling in
68
+ `tests/unit/emit_smoke.test.mjs` rather than a byte count quoted here; the
69
+ figure moved twice while this paragraph went on stating the old one.
70
+ - **Skill descriptions are the second bill** on a host that catalogues natively.
71
+ Each is the skill's purpose line plus the *first sentence* of its trigger,
72
+ capped at 320 characters (`skillDescription` in `js/hosts/native.mjs`); at
73
+ the earlier 900-character cap the catalogue weighed ~5.6k tokens. The later
74
+ trigger sentences still live in the body, read as soon as the skill is chosen.
75
+ - **§5–§10 carry authored lean halves too** (Memory, Notebook, Workspace, Wiki,
76
+ Context, Scripts): each keeps its obligations — read `MEMORY.md`, read
77
+ `context.json` before the first reply, the git-ignored folders — and points at
78
+ the on-disk README or config file for the rest.
54
79
  - **Skill bodies (~53k) and agent bodies (~10k) are lazy** on every host —
55
80
  loaded only when invoked. A typical skill costs ≤3k per invocation; the
56
81
  heaviest (`react-view-transitions`, ~17.5k with its reference files) loads
@@ -72,8 +97,9 @@ token counter also includes, none of which Geneseed controls:
72
97
  definitions. On OpenCode this is typically 5–10k tokens before any
73
98
  harness content loads.
74
99
  2. **Your repo's docs, injected eagerly** — the context delivery
75
- (plugin on OpenCode, SessionStart hook on Claude Code / Bob; Copilot has no
76
- hook channel, so its sessions read docs on demand instead) discovers and
100
+ (plugin on OpenCode, SessionStart hook on Claude Code / Bob, `sessionStart`
101
+ hook on a global Copilot install; a project-scope Copilot install has no
102
+ hooks, so it reads docs on demand instead) discovers and
77
103
  injects `README.md`, `CONTRIBUTING.md`, and files under `docs/`, up to the
78
104
  48 KB budget (≈12k tokens). A doc-heavy repo fills it.
79
105
  3. **Wiki eager entries** plus the lazy listing of the rest, if a wiki is
@@ -5,4 +5,4 @@ title: "Agents"
5
5
  kind: "concept"
6
6
  link: {"hash": "#/section/agents", "label": "Browse the catalog →"}
7
7
  ---
8
- {N_AGENTS} capability specialists — `reviewer`, `tester`, `architect`, `developer`, `docs`, `security`, `explorer`, plus a debate **council** the [[council]] skill convenes (`advocate`, `skeptic`, `pragmatist`, `steward`, `visionary`, `user-advocate`, `framer`, `empiricist`, `operator`, `historian`). You delegate by capability, not by folder: the harness picks the right specialist from the request.
8
+ {N_AGENTS} capability specialists — `reviewer`, `tester`, `architect`, `developer`, `docs`, `security`, `explorer`, `researcher`, plus a debate **council** the [[council]] skill convenes (`advocate`, `skeptic`, `pragmatist`, `steward`, `visionary`, `user-advocate`, `framer`, `empiricist`, `operator`, `historian`). You delegate by capability, not by folder: the harness picks the right specialist from the request.
@@ -6,11 +6,12 @@ kind: "concept"
6
6
  ---
7
7
  Claude Code has no `instructions` array and no JS plugin dir — the harness reaches it through **`settings.json` hooks** instead: the same capabilities the OpenCode plugins provide, each driven by a `geneseed-hook` subcommand. `CLAUDE.md` itself auto-loads by location, so it needs no hook at all.
8
8
 
9
- ### The four hooks
9
+ ### The hooks
10
10
 
11
11
  - **Context injection** — `SessionStart` (startup, clear, resume) runs `geneseed-hook context`: auto-discovers the repo's docs by convention and injects them before your first turn, plus your machine wiki. It honours the same `GENESEED_CONTEXT` manifest as the OpenCode context plugin.
12
12
  - **Git gate** — `PreToolUse` on Bash runs `geneseed-hook git-gate`: a `git commit` or `git push` anywhere in the command line — a compound one-liner and a `-C <path>` form included — asks first, at the tool boundary and before the shell runs it (**Doctrine process 5**). It is the one hook that rides a doctrine pack: an install built without **process** never gets this group, because a boundary that keeps asking for a rule the install did not adopt is a gate arguing with its own harness.
13
13
  - **Rule gate** — `PreToolUse` on the write tools runs `geneseed-hook rule-gate`: a write to `user-rules.md` or to a memory file asks first, because whether something you want kept is a standing rule or a durable fact is *your* call, settled through the [rule skill](#/docs/skills) (**Doctrine process 1**). Ordinary edits are untouched.
14
+ - **Tool gate** — `geneseed-hook tool-gate` is the git gate and the rule gate fused behind one command, for hosts whose hook config has no per-tool matcher (Copilot, Bob). Claude Code matches per tool, so its `settings.json` wires the two gates above instead.
14
15
  - **Learn** — `Stop` and `SubagentStop` run `geneseed-hook learn`: distils durable memories into the install's `memory/` store at session end; a subagent's stop routes to the per-agent lesson path (`memory/agents/<name>.md`).
15
16
 
16
17
  ### Where they live
@@ -19,7 +20,7 @@ The emit merges the hook groups surgically into your `settings.json` (global `~/
19
20
 
20
21
  ### The hook shim
21
22
 
22
- Hooks run with the project as their working directory, so every command has to be an absolute path. Rather than write the interpreter and this checkout into your `settings.json`, the emit points all four hooks at one stable file — the **hook shim**, at `~/.geneseed/bin/geneseed-hook` (`geneseed-hook.cmd` on Windows). The shim holds the two volatile paths; the config holds none.
23
+ Hooks run with the project as their working directory, so every command has to be an absolute path. Rather than write the interpreter and this checkout into your `settings.json`, the emit points every hook at one stable file — the **hook shim**, at `~/.geneseed/bin/geneseed-hook` (`geneseed-hook.cmd` on Windows). The shim holds the two volatile paths; the config holds none.
23
24
 
24
25
  That indirection is what lets the checkout move. Before it, relocating or replacing the clone silently broke the gates in every install at once, and the only repair was re-emitting every config. Now a single build rewrites the shim and every install is live again. The shim is refreshed on **every** emit, so an ordinary `geneseed build` is the repair; `geneseed doctor` reports it if it was ever stale.
25
26
 
@@ -16,7 +16,7 @@ A **mode** is the session's operating register — *how* work gets executed, as
16
16
 
17
17
  ### The Pact — a two-way contract
18
18
 
19
- Where the Rules bind the agent, the **Pact** binds the collaboration — and it is not a layer beside them: it is stated inside the Ontology's **Telos**, the tier that is always in force, so it holds in every task and every repository. It carries three co-equal protections (you, the truth, the agent), never traded one for another, and — unusually — names what *you* owe back: don't punish candour that honours the pact, give context up front, decide when shown a fork. Your half is not enforceable against you; the agent's half is binding on it.
19
+ Where the Rules bind the agent, the **Pact** binds the collaboration — and it is not a layer beside them: it is stated inside **Telos**, the first Ethos section, the tier that is always in force, so it holds in every task and every repository. It carries three ranked laws — protect the user, the code's future maintainer included; serve their intent; keep the agent's own honesty — each yielding only to the one above, and — unusually — names what *you* owe back: don't punish candour that honours the pact, give context up front, decide when shown a fork. Your half is not enforceable against you; the agent's half is binding on it.
20
20
 
21
21
  ### Typed memory — binding force
22
22
 
@@ -24,4 +24,4 @@ A memory may carry an optional `force` — **constraint** (imposed, not the agen
24
24
 
25
25
  ### Your profile — identity
26
26
 
27
- `PROFILE.md`, seeded once beside `AGENT.md` and never overwritten, holds *who you are*: role, habits, register preferences. It is identity, not rules — it colours how the agent works but never binds (precedence is the Ontology and the Rules, then `user-rules.md`, then the active Doctrines, then the profile). Edit it here under the **Profile** tab, or in the file directly — or let the agent draft it: the [[profile]] skill interviews you (who you are, how you work, how you like answers pitched) and writes the file only with your consent, routing anything that is really a standing rule to `user-rules.md` instead.
27
+ `PROFILE.md`, seeded once beside `AGENT.md` and never overwritten, holds *who you are*: role, habits, register preferences. It is identity, not rules — it colours how the agent works but never binds (precedence is the Ethos and the Rules, then `user-rules.md`, then the active Doctrines, then the profile). Edit it here under the **Profile** tab, or in the file directly — or let the agent draft it: the [[profile]] skill interviews you (who you are, how you work, how you like answers pitched) and writes the file only with your consent, routing anything that is really a standing rule to `user-rules.md` instead.
@@ -8,7 +8,7 @@ Once installed, the agent doesn't change *how* you talk to your tool — it chan
8
8
 
9
9
  ### What loaded automatically
10
10
 
11
- - **`AGENT.md`** — the [constitution](#/docs/rules): the Ontology's {N_ONTOLOGY} sections, {N_LAWS} always-on Rules, and the {N_DOCTRINE_RULES} doctrine rules from the packs this install built in.
11
+ - **`AGENT.md`** — the [constitution](#/docs/rules): the {N_ONTOLOGY} Ethos sections, {N_LAWS} always-on Rules, and the {N_DOCTRINE_RULES} doctrine rules from the packs this install built in.
12
12
  - **Your repo's docs** — `README.md`, `CONTRIBUTING.md`, anything under `docs/` the harness discovers.
13
13
  - **Your machine's wiki** (if you [set one up](#/docs/configure-wiki)) — eager entries and a lazy listing of the rest.
14
14
  - **The skill and agent catalogue** — invokable by name.
@@ -16,7 +16,7 @@ Once installed, the agent doesn't change *how* you talk to your tool — it chan
16
16
  ### Try these prompts
17
17
 
18
18
  - *"Use the **profile** skill"* — a short interview that drafts `PROFILE.md` (seeded empty at install), so the agent knows who you are and how you like answers pitched.
19
- - *"Use the **clarify** skill on this feature request."*
19
+ - *"Use the **brainstorm** skill on this feature request."*
20
20
  - *"Delegate to the **reviewer** agent on the staged diff."*
21
21
  - *"Use **brainstorm** then **plan** for how to add X."*
22
22
  - *"Use **council** to debate whether we should ship Y now."*
@@ -9,8 +9,8 @@ link: {"hash": "#/settings", "label": "Toggle it in Settings →"}
9
9
 
10
10
  ### The difference
11
11
 
12
- - **Full** — `AGENT.md` inlines the Ontology, every Rule and every rule of the **active** doctrine packs, complete text and reasoning included, on every single turn.
13
- - **Lean** — each Rule and each doctrine rule is carried as its **heading + the rule itself** (one line), each tier closing with a pointer to its complete text shipped beside `AGENT.md` — the agent reads the reasoning on demand when a rule's application is unclear. The **Ontology ships whole even at lean**: it is flowing prose, not numbered blocks, and truncating it to first sentences would leave orphan fragments rather than a shorter argument.
12
+ - **Full** — `AGENT.md` inlines the Ethos, every Rule and every rule of the **active** doctrine packs, complete text and reasoning included, on every single turn.
13
+ - **Lean** — each Rule and each doctrine rule is carried as its **heading + an authored short form** — the rule and its mechanism, written by hand rather than cut at the first full stop — each tier closing with a pointer to its complete text shipped beside `AGENT.md` — the agent reads the reasoning on demand when a rule's application is unclear. The Ethos is condensed the same way, as **one authored short form for the whole tier**: it is flowing prose rather than numbered blocks, so cutting it section by section would have left orphan fragments instead of a shorter argument.
14
14
 
15
15
  ### What ships on disk either way
16
16
 
@@ -6,7 +6,7 @@ kind: "concept"
6
6
  ---
7
7
  One source, **five emit targets** — each with a per-repo and a global (`-global`) variant, plus a portable `files` bundle any `AGENT.md`-aware tool can read. **OpenCode** runs its own engine (JS plugins, colour themes, LSP); **Claude Code**, **Bob**, and **Copilot** share one Claude-shaped engine that diverges only by host dialect.
8
8
 
9
- The harness *content* — the constitution (Ontology, Rules, Doctrines), Agents, Skills, Memory, and the preamble voice — is **identical on every host**: one build renders the same text for all five targets. What differs is how much of it the host can *automate* (via plugins or hooks) versus carry as preamble discipline.
9
+ The harness *content* — the constitution (Ethos, Rules, Doctrines), Agents, Skills, Memory, and the preamble voice — is **identical on every host**: one build renders the same text for all five targets. What differs is how much of it the host can *automate* (via plugins or hooks) versus carry as preamble discipline.
10
10
 
11
11
  | Capability | OpenCode | Claude | Bob | Copilot |
12
12
  | --- | :---: | :---: | :---: | :---: |
package/docs/web/model.md CHANGED
@@ -4,7 +4,7 @@ order: 0
4
4
  title: "The harness model"
5
5
  kind: "concept"
6
6
  ---
7
- Geneseed assembles its runtime pieces around a single `AGENT.md` entrypoint: an **Ontology** (how the agent thinks, decides and speaks — always on), **Rules** (the always-on invariants it never breaks), **Doctrines** (practice packs this repository chose at build time), **Agents** (capability specialists you delegate to), **Skills** (repeatable workflows the agent can invoke), **Memory** (one-fact-per-file durable knowledge), and a **Notebook** (the agent's own sovereign space). The first three are the [constitution](#/docs/rules), in that order of precedence — with your own `user-rules.md` sitting between the Rules and the Doctrines.
7
+ Geneseed assembles its runtime pieces around a single `AGENT.md` entrypoint: an **Ethos** (how the agent thinks, decides and speaks — always on), **Rules** (the always-on invariants it never breaks), **Doctrines** (practice packs this repository chose at build time), **Agents** (capability specialists you delegate to), **Skills** (repeatable workflows the agent can invoke), **Memory** (one-fact-per-file durable knowledge), and a **Notebook** (the agent's own sovereign space). The first three are the [constitution](#/docs/rules), in that order of precedence — with your own `user-rules.md` sitting between the Rules and the Doctrines.
8
8
  <!--harness:opencode-->
9
9
  On OpenCode, {N_PLUGINS} **Plugins** bind the pieces to the host: context injection, learn-at-session-end, the safety guard, the saved workflow runner, end-of-run notifications, a live-activity feed for this console, and an opt-in minimal-code mode.
10
10
  <!--/harness-->
@@ -9,6 +9,7 @@ Registers one custom tool, `workflow`, that runs saved, code-driven orchestratio
9
9
  - **Saved scripts only (v1):** the tool loads `<name>.js` from the sibling `workflows/` dir. No model-authored scripts are eval'd.
10
10
  - **Call shape:** `workflow({ name, args })` — call with no name to list what's available. Shipped: `council`, `review`, `research-plan-implement`.
11
11
  - **Runtime API:** scripts get `agent()`, `parallel()`, `pipeline()`, `phase()`, `log()`, `budget`, `args`. Child work runs as real OpenCode sessions; concurrency is capped at `min(16, cores − 2)`.
12
+ - **Worktree isolation:** `agent(prompt, { isolation: "worktree" })` runs that child on its own branch in its own git worktree (under the OS temp dir), the same option Claude Code's Workflow takes. A worktree with no change is removed with its branch; one with changes is kept, and the tool's summary lists every kept branch and every file more than one agent changed (`rt.worktrees()`, `rt.overlaps()` inside the script). Nothing is merged or committed for you. The worktree holds tracked files only — an agent that must build or test installs dependencies first. Without git the agent fails; it never falls back to the shared tree.
12
13
 
13
14
  ### Install
14
15
 
package/docs/web/rules.md CHANGED
@@ -7,9 +7,9 @@ link: {"hash": "#/laws", "label": "Browse the constitution →"}
7
7
  ---
8
8
  The agent's standing rules come in **three tiers**, and the tier decides how a rule binds and whether this install carries it at all. All three are authored under `src/` and rendered into `AGENT.md`; the console shows them as three bands under **Constitution**.
9
9
 
10
- ### Ontology — always on
10
+ ### Ethos — always on
11
11
 
12
- {N_ONTOLOGY} sections of flowing prose in `src/ontology/universal.md`: what the agent is for, how it grades evidence, how it decides, how it conducts itself. It is the mind the other tiers govern — never numbered, never toggleable, and it is where the **Pact** (the mutual contract between you and the agent) is stated. Cited by section name, `Ontology: Decisions`, and its section names are theme-independent so a citation and its heading can never drift apart.
12
+ {N_ONTOLOGY} sections of flowing prose in `src/ontology/universal.md`: what the agent is for, how it grades evidence, how it decides, how it conducts itself. It is the mind the other tiers govern — never numbered, never toggleable, and it is where the **Pact** (the mutual contract between you and the agent) is stated. Cited by section name, `Ethos: Decisions`, and its section names are theme-independent so a citation and its heading can never drift apart.
13
13
 
14
14
  ### Invariants — always on
15
15
 
@@ -25,6 +25,6 @@ Rules toggle **individually** too — `geneseed-build --exclude-rules "process 7
25
25
 
26
26
  ### Which outranks which
27
27
 
28
- Ontology and Invariants first, then your own `user-rules.md`, then the active Doctrines, then `PROFILE.md`. A rule you write in `user-rules.md` **outranks a doctrine rule** — a practice pack chosen at build time never overrides an instruction you wrote for your own repo — and nothing outranks an invariant: a user rule or a doctrine rule may tighten one, never repeal it.
28
+ Ethos and Invariants first, then your own `user-rules.md`, then the active Doctrines, then `PROFILE.md`. A rule you write in `user-rules.md` **outranks a doctrine rule** — a practice pack chosen at build time never overrides an instruction you wrote for your own repo — and nothing outranks an invariant: a user rule or a doctrine rule may tighten one, never repeal it.
29
29
 
30
30
  Themes rename the nouns, never the structure: an imperial deploy reads the invariants as *Dictates*, a neutral deploy as *Rules*. The tier, the address and the rule itself do not move.
@@ -29,7 +29,7 @@ Pick **direct** unless you want the session managing a crew for you. Switch back
29
29
 
30
30
  ### Doctrine packs — which practices bind
31
31
 
32
- Which practice rules this install adopts, fixed at build time. Unlike the dials above this one really does change *which rules apply*: the [Ontology and the Rules](#/docs/rules) are always on, the doctrines are yours to pick. All four ship enabled, and leaving one out is a deliberate choice, not a default:
32
+ Which practice rules this install adopts, fixed at build time. Unlike the dials above this one really does change *which rules apply*: the [Ethos and the Rules](#/docs/rules) are always on, the doctrines are yours to pick. All four ship enabled, and leaving one out is a deliberate choice, not a default:
33
33
 
34
34
  - **craft** — how code is written: reuse first, house conventions, docs in step, the smallest diff.
35
35
  - **rigor** — how work is proven: idempotence, honest tests, coverage, gates that can actually fail.
@@ -56,7 +56,7 @@ The switches are on the **Constitution** page, one per rule, staged locally and
56
56
 
57
57
  How much of the constitution `AGENT.md` carries inline every turn. A token-cost dial, not a rules cut — whatever this install adopted always applies:
58
58
 
59
- - **lean** *(default)* — the Ontology whole, then each Rule and each doctrine rule as its heading plus its first line, with a pointer to the complete text shipped beside `AGENT.md` and read on demand.
59
+ - **lean** *(default)* — the Ethos, each Rule and each doctrine rule in an authored short form — the rule and its mechanism, hand-written beside the full text — with a pointer to the complete text shipped beside `AGENT.md` and read on demand.
60
60
  - **full** — every Rule's and every active doctrine rule's complete text *and* rationale inline. Best when token cost is a non-issue or you run a smaller model, which applies a rule's nuance more reliably with the *why* eagerly in context.
61
61
 
62
62
  ---
@@ -5,4 +5,4 @@ title: "Skills"
5
5
  kind: "concept"
6
6
  link: {"hash": "#/section/skills", "label": "Browse the catalog →"}
7
7
  ---
8
- {N_SKILLS} repeatable workflows the agent can invoke by name — from [[brainstorm]], [[clarify]], [[plan]], [[tdd]] and [[debug]] through [[council]], [[research]] and [[ship]] to [[roast-me]]. A skill is a markdown playbook under `src/skills/`; the agent reads it before acting. The catalog link lists every one, live.
8
+ {N_SKILLS} repeatable workflows the agent can invoke by name — from [[brainstorm]], [[plan]], [[develop]] and [[debug]] through [[council]], [[research]] and [[ship]] to [[roast-me]]. A skill is a markdown playbook under `src/skills/`; the agent reads it before acting. The catalog link lists every one, live.
@@ -15,6 +15,6 @@ Every rule in the constitution gets its title from a theme key, and a theme that
15
15
  - `DOC_*` — one title per doctrine rule, named after its address (`DOC_CRAFT_1`, `DOC_PROCESS_5`, …). `doctor` reads the pack files under `src/doctrines/` and requires exactly the set they name — a missing one is a blank heading, an extra one is a dead key.
16
16
  - `PACK_*` — one name per pack (`PACK_CRAFT`, `PACK_RIGOR`, `PACK_OPS`, `PACK_PROCESS`), used for the pack's own sub-heading.
17
17
 
18
- The Ontology's section names are **not** theme keys: a citation reads `({{ONTOLOGY}}: {{ONT_TELOS}})`, token on both sides, so heading and reference always move together. They live in the build's fixed structure table and you neither declare nor rename them.
18
+ The Ethos section names are **not** theme keys: a citation reads `({{ONTOLOGY}}: {{ONT_TELOS}})`, token on both sides, so heading and reference always move together. They live in the build's fixed structure table and you neither declare nor rename them.
19
19
 
20
20
  > ⚠ `LAW` and `DOCTRINE` must each be a **single word**. Both heading parsers match the tier noun with `\S+`, so a two-word value does not error — the heading simply stops matching and the whole tier parses to nothing, in silence. `doctor` gates this for every real voice (`_TEMPLATE.json` is exempt; its values are placeholders).
package/docs/web-ui.md CHANGED
@@ -61,7 +61,7 @@ It is hidden where the rail collapses to icons (≤960px) and returns with the p
61
61
 
62
62
  A global **Spotlight** search lives in the topbar — press <kbd>/</kbd> to focus it (or
63
63
  <kbd>Ctrl</kbd>/<kbd>⌘</kbd>+<kbd>K</kbd>, which also works from inside a text field), type
64
- to jump to any agent, skill, doc, spec, MCP server, or constitutional rule — the `laws`
64
+ to jump to any agent, skill, doc, MCP server, or constitutional rule — the `laws`
65
65
  catalog it indexes is the whole constitution, so an ontology section, an invariant and a
66
66
  doctrine rule are all reachable by name; <kbd>↑</kbd>/<kbd>↓</kbd> to
67
67
  move, <kbd>Enter</kbd> to open, <kbd>Esc</kbd> to clear. A bottom **Console** drawer
@@ -69,7 +69,7 @@ streams the output of background jobs and keeps their history across reloads.
69
69
 
70
70
  ## Views
71
71
 
72
- ### 🧬 Harness
72
+ ### Dashboard
73
73
 
74
74
  - **Dashboard** (`#/`) — a live readout of what's deployed. Three lenses: **Status**
75
75
  (readiness ring, a KPI band, a genome grid, recent activity), **Lineage** (the
@@ -84,6 +84,9 @@ streams the output of background jobs and keeps their history across reloads.
84
84
  puts an active-packs fraction under the tile (`3/4 packs · N rules`), and the Operator HUD
85
85
  gives it its own cell (`PACKS 3/4`). That is what makes a narrowed install *look* different
86
86
  from a full one at a glance.
87
+
88
+ ### 📖 Codex
89
+
87
90
  - **Rules** (`#/rules`) — your own standing rules, read from and written to the
88
91
  `user-rules.md` beside the deployed AGENT.md (the seed-once file no update ever
89
92
  touches). List with scope (user/project) and trial chips, add/edit/retire forms, a
@@ -92,7 +95,7 @@ streams the output of background jobs and keeps their history across reloads.
92
95
  content the page last read — if an agent session edited the file meanwhile, the save
93
96
  409s and the page reloads instead of clobbering it.
94
97
  - **Constitution** (`#/laws`) — the whole governance surface on one page, in three bands:
95
- the **Ontology** (four prose sections), the **Invariants** (the nine numbered Rules, with
98
+ the **Ethos** (four prose sections), the **Invariants** (the nine numbered Rules, with
96
99
  a class facet — only non-empty classes render, and two of the six have had no invariant
97
100
  since the split), and the **Doctrines** (one group per pack, each marked active or not for
98
101
  this install). Every row expands to its full body, lazily fetched. The rail entry is
@@ -108,17 +111,22 @@ streams the output of background jobs and keeps their history across reloads.
108
111
  **Promote to rule** control turns a recurring lesson into a trial rule in
109
112
  `user-rules.md` — provenance recorded, the source fact deleted so it isn't loaded
110
113
  twice — landing you on the Rules page.
111
-
112
- ### 📚 Learn
113
-
114
+ - **Profile** (`#/profile`) — `PROFILE.md` beside the deployed AGENT.md: who you are and
115
+ how you like to work. Opens rendered; **Edit** is a whole-file editor. The save carries
116
+ the fingerprint it loaded — if an agent session changed the file first, your edit stays
117
+ on screen and a second Save replaces the newer version.
118
+ - **Skills** (`#/skills`) and **Agents** (`#/agents`) — the deployed catalogue, each entry
119
+ with its purpose line and full spec.
114
120
  - **Docs** (`#/docs`) — rendered documentation: markdown pages, concept pages, a CLI
115
121
  reference (generated from the harness argument parser), and a glossary, grouped into
116
- Get started / Core concepts / How-to / MCP servers / Plugins / Reference / Deeper.
117
- - **Specs** (`#/specs`) — the dated implementation specs from `docs/specs/`, each with its
118
- purpose line, rendered with the same engine as Docs.
122
+ Get started / Core concepts / How-to / MCP servers / Plugins / Reference / Deeper. Filtered
123
+ for one host family (OpenCode, or Claude Code — which Bob and Copilot share); with no
124
+ choice stored it follows the deployed install.
119
125
 
120
- ### 🔧 Maintain
126
+ ### 🩺 Care
121
127
 
128
+ - **Activity** (`#/activity`) — the agent sessions on this machine: each one's status,
129
+ the files it touched and its todo progress; open one for its detail.
122
130
  - **Changes** (`#/diff`) — the diff between the deployed harness and the source: edited /
123
131
  added / missing files with per-file expansion and coloured unified-diff lines. Select
124
132
  files to **export an `improvements.md`** back-port, or **restore** them to source.
@@ -2,5 +2,5 @@
2
2
  "_comment": "version is a human-readable release label only; the canonical identity of an installed harness is the source fingerprint stamped in .geneseed-version (see `harness version`), not this string.",
3
3
  "theme": "neutral",
4
4
  "product": "Geneseed",
5
- "version": "3.3.0"
5
+ "version": "3.5.0"
6
6
  }
package/js/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # `js/` — the module map
2
2
 
3
- Fifty-six modules in seven folders. This page is the address book: **what each one owns**, and
3
+ Fifty-seven modules in seven folders. This page is the address book: **what each one owns**, and
4
4
  **which file to open first** for a given task. It is not documentation of behaviour — every module
5
5
  has a docblock for that, and the docblock is the thing to read before editing.
6
6
 
@@ -14,7 +14,7 @@ a module that does not exist, is a test failure. `geneseed doctor` reports the s
14
14
  ```
15
15
  bin/geneseed-cli.mjs the `geneseed` CLI — 20+ verbs, may NOT spawn
16
16
  bin/geneseed-hook.mjs the hook entry — 5 verbs, loads on EVERY tool call (~14 ms)
17
- bin/build-driver.mjs `geneseed-build` — the generator's flags and emit targets
17
+ bin/build-driver.mjs `geneseed-build` — a thin entry over js/build/driver.mjs
18
18
 
19
19
  js/build/ src/ + themes/ → rendered text → a bundle → a per-host install
20
20
  js/hosts/ where it stops being a renderer and touches the machine
@@ -45,7 +45,8 @@ as a per-host install at project or global scope.
45
45
  | `emit-common.mjs` | Constants, tree walkers, and the three writers BOTH global emits share. Decides no host |
46
46
  | `stubs.mjs` | Write-once seed files: context, wiki, rules, excludes, profile, `.gitignore`, memory/notebook indexes |
47
47
  | `version.mjs` | The release marker: fingerprint the sources, read/compare/write an install's version, warn on downgrade |
48
- | `generate.mjs` | CLI verbs `build`, `prompt`, `theme`, `rebuild-all` — the thin face over `bin/build-driver.mjs` |
48
+ | `driver.mjs` | The generator driver: `--emit`/`--theme`/`--footprint` flag parsing, the nine emit targets, per-host emit orchestration, the prune and the manifest. `bin/build-driver.mjs` is only its entry |
49
+ | `generate.mjs` | CLI verbs `build`, `prompt`, `theme`, `rebuild-all` — the thin face over `driver.mjs` |
49
50
  | `catalog.mjs` | `geneseed catalog` — prints the shipped roster. Classifies nothing itself |
50
51
  | `themes.mjs` | Maintainer-only `--sync-themes`: inserts `_TEMPLATE.json`'s missing keys into the committed themes |
51
52
 
@@ -181,8 +182,8 @@ and inline lists are held against a surface list written out in
181
182
 
182
183
  | I want to | open first | then |
183
184
  |---|---|---|
184
- | a doctrine rule | `src/doctrines/<pack>.md` — APPEND, ids run contiguously | `docs/extending.md` §2a — five files, `--sync-themes`, restyle 14 voices by hand |
185
- | a law (invariant) | `src/laws/universal.md` — **APPEND, never insert** | `docs/extending.md` §2c. Amend the FIRST sentence: lean footprint keeps nothing else |
185
+ | a doctrine rule | `src/doctrines/<pack>.md` — APPEND, ids run contiguously | `docs/extending.md` §2a — five files, `--sync-themes`, restyle 14 voices by hand. Author BOTH LEAN halves |
186
+ | a law (invariant) | `src/laws/universal.md` — **APPEND, never insert** | `docs/extending.md` §2c. Author both LEAN halves: the lean footprint ships nothing else |
186
187
  | a skill or an agent | `src/skills/<name>.md` or `src/agents/<name>.md` | `docs/extending.md` §3 — eight steps. Write the FILE before the table row or the build aborts |
187
188
  | a doctor check | `js/inspect/checks-{build,repo,authoring}.mjs` | register with `ran(...)` in `doctor.mjs`, then a PLANTED FAULT in `tests/unit/harness.test.mjs` |
188
189
  | a web endpoint | GET → `js/web/api.mjs`; POST → `js/web/actions.mjs` | declare it in `js/web/routes.mjs`; the partition test probes the real handler |