geneseed 3.12.0 → 3.14.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 (240) hide show
  1. package/CHANGELOG.md +160 -0
  2. package/README.md +2 -2
  3. package/SHIPPED.md +1 -1
  4. package/adapters/bob/README.md +1 -1
  5. package/adapters/claude-code/README.md +1 -1
  6. package/adapters/openclaude/README.md +1 -1
  7. package/adapters/opencode/README.md +3 -3
  8. package/adapters/opencode/plugins/geneseed-learn.js +10 -1
  9. package/bin/geneseed-cli.mjs +10 -14
  10. package/bin/geneseed-hook.mjs +22 -15
  11. package/docs/README.md +41 -22
  12. package/docs/concepts/agents.md +3 -1
  13. package/docs/concepts/collaboration.md +3 -1
  14. package/docs/concepts/exclusions.md +4 -2
  15. package/docs/concepts/footprint.md +3 -1
  16. package/docs/concepts/foreman-mode.md +3 -1
  17. package/docs/concepts/hook-gates.md +61 -0
  18. package/docs/concepts/hooks.md +8 -56
  19. package/docs/concepts/host-matrix.md +38 -0
  20. package/docs/concepts/hosts.md +6 -32
  21. package/docs/concepts/loop-branch.md +66 -0
  22. package/docs/concepts/loop-bricks.md +48 -0
  23. package/docs/concepts/loop-contracts.md +33 -0
  24. package/docs/concepts/loop-gates.md +30 -0
  25. package/docs/concepts/loop-notes.md +43 -0
  26. package/docs/concepts/loop-risk.md +36 -0
  27. package/docs/concepts/loop-templates.md +50 -0
  28. package/docs/concepts/loops.md +24 -116
  29. package/docs/concepts/lsp.md +2 -0
  30. package/docs/concepts/memory.md +3 -1
  31. package/docs/concepts/notebook.md +3 -1
  32. package/docs/concepts/rules.md +4 -2
  33. package/docs/concepts/skills.md +3 -1
  34. package/docs/concepts/themes.md +3 -1
  35. package/docs/extending.md +28 -13
  36. package/docs/guides/autostart.md +3 -1
  37. package/docs/guides/choose-your-setup.md +5 -80
  38. package/docs/guides/headless.md +5 -3
  39. package/docs/guides/install-agent-md.md +37 -0
  40. package/docs/guides/install-bob.md +20 -0
  41. package/docs/guides/install-claude-code.md +22 -0
  42. package/docs/guides/install-clone.md +34 -0
  43. package/docs/guides/install-openclaude.md +25 -0
  44. package/docs/guides/install-opencode.md +35 -0
  45. package/docs/guides/install-scripted.md +21 -0
  46. package/docs/guides/install.md +9 -118
  47. package/docs/guides/loop-finish.md +54 -0
  48. package/docs/guides/loop-running.md +66 -0
  49. package/docs/guides/loop-which-template.md +35 -0
  50. package/docs/guides/mcp-filesystem.md +41 -0
  51. package/docs/guides/mcp-gitlab.md +66 -0
  52. package/docs/guides/mcp-markitdown.md +36 -0
  53. package/docs/guides/mcp.md +8 -137
  54. package/docs/guides/migrate.md +3 -1
  55. package/docs/guides/project-context.md +4 -2
  56. package/docs/guides/read-non-markdown.md +17 -0
  57. package/docs/guides/run-a-loop.md +64 -0
  58. package/docs/guides/run-anywhere.md +2 -0
  59. package/docs/guides/setup-doctrines.md +55 -0
  60. package/docs/guides/setup-footprint.md +48 -0
  61. package/docs/guides/uninstall.md +3 -1
  62. package/docs/guides/upgrade.md +3 -1
  63. package/docs/guides/verify.md +3 -1
  64. package/docs/guides/wiki.md +3 -1
  65. package/docs/guides/worktree.md +3 -1
  66. package/docs/reference/about.md +3 -1
  67. package/docs/reference/cli.md +2 -0
  68. package/docs/reference/env-context.md +40 -0
  69. package/docs/reference/environment.md +10 -59
  70. package/docs/reference/glossary.md +3 -1
  71. package/docs/reference/loop-actions.md +20 -0
  72. package/docs/reference/opencode-plugins.md +14 -118
  73. package/docs/reference/plugin-activity.md +20 -0
  74. package/docs/reference/plugin-context.md +27 -0
  75. package/docs/reference/plugin-guard.md +27 -0
  76. package/docs/reference/plugin-learn.md +27 -0
  77. package/docs/reference/plugin-notify.md +20 -0
  78. package/docs/reference/plugin-ponytail.md +19 -0
  79. package/docs/reference/plugin-workflow.md +25 -0
  80. package/docs/reference/troubleshoot-doctor.md +50 -0
  81. package/docs/reference/troubleshoot-hooks.md +99 -0
  82. package/docs/reference/troubleshoot-install.md +108 -0
  83. package/docs/reference/troubleshoot-tools.md +56 -0
  84. package/docs/reference/troubleshoot-update.md +23 -0
  85. package/docs/reference/troubleshoot-web.md +66 -0
  86. package/docs/reference/troubleshooting.md +13 -337
  87. package/docs/understand/a-day.md +3 -1
  88. package/docs/understand/enforced-vs-asked.md +3 -1
  89. package/docs/understand/harness.md +2 -0
  90. package/docs/understand/machine-bob.md +17 -0
  91. package/docs/understand/machine-claude.md +35 -0
  92. package/docs/understand/machine-opencode.md +36 -0
  93. package/docs/understand/on-your-machine.md +12 -55
  94. package/docs/understand/take-it-out.md +13 -0
  95. package/docs/web-ui.md +35 -15
  96. package/harness.config.json +1 -1
  97. package/js/README.md +30 -13
  98. package/js/build/args.mjs +374 -0
  99. package/js/build/driver.mjs +137 -553
  100. package/js/build/emit-claude.mjs +2 -4
  101. package/js/build/generate.mjs +6 -3
  102. package/js/build/render.mjs +5 -9
  103. package/js/build/source.mjs +3 -11
  104. package/js/cli-table.json +27 -1
  105. package/js/hosts/hooks-context.mjs +431 -0
  106. package/js/hosts/hooks-learn.mjs +275 -0
  107. package/js/hosts/hooks-prims.mjs +108 -0
  108. package/js/hosts/hooks.mjs +50 -977
  109. package/js/hosts/hosts.mjs +12 -4
  110. package/js/hosts/installs.mjs +5 -6
  111. package/js/hosts/mcp.mjs +13 -49
  112. package/js/hosts/memory-files.mjs +181 -0
  113. package/js/hosts/native.mjs +43 -5
  114. package/js/hosts/settings.mjs +135 -414
  115. package/js/hosts/shim.mjs +373 -0
  116. package/js/inspect/checks-authoring.mjs +21 -828
  117. package/js/inspect/checks-build.mjs +32 -4
  118. package/js/inspect/checks-constitution.mjs +493 -0
  119. package/js/inspect/checks-counts.mjs +242 -0
  120. package/js/inspect/checks-repo.mjs +17 -8
  121. package/js/inspect/diff.mjs +4 -1
  122. package/js/inspect/doctor.mjs +2 -2
  123. package/js/inspect/inventory.mjs +4 -4
  124. package/js/inspect/scan.mjs +1 -1
  125. package/js/inspect/status.mjs +1 -1
  126. package/js/inspect/validate.mjs +48 -35
  127. package/js/loop/catalog.mjs +17 -4
  128. package/js/loop/cli.mjs +52 -16
  129. package/js/loop/graph.mjs +19 -1
  130. package/js/loop/registry.mjs +191 -0
  131. package/js/loop/score.mjs +46 -7
  132. package/js/loop/state.mjs +157 -19
  133. package/js/maintain/memory.mjs +1 -1
  134. package/js/maintain/migrate.mjs +18 -30
  135. package/js/maintain/setup.mjs +1 -1
  136. package/js/maintain/uninstall.mjs +47 -88
  137. package/js/ui/cli.mjs +12 -12
  138. package/js/web/actions.mjs +39 -4
  139. package/js/web/api.mjs +34 -21
  140. package/js/web/docs.mjs +87 -78
  141. package/js/web/routes.mjs +5 -1
  142. package/package.json +1 -1
  143. package/src/agents/explorer.md +2 -2
  144. package/src/agents/researcher.md +3 -3
  145. package/src/bricks/README.md +3 -1
  146. package/src/bricks/adr-challenge.md +20 -0
  147. package/src/bricks/adr-draft.md +15 -0
  148. package/src/bricks/characterize.md +17 -0
  149. package/src/bricks/ci-fix.md +2 -1
  150. package/src/bricks/ci-triage.md +20 -0
  151. package/src/bricks/compat-check.md +16 -0
  152. package/src/bricks/done-check.md +16 -0
  153. package/src/bricks/fitness-define.md +22 -0
  154. package/src/bricks/flake-check.md +17 -0
  155. package/src/bricks/flake-repro.md +18 -0
  156. package/src/bricks/identify.md +6 -3
  157. package/src/bricks/migration-plan.md +21 -0
  158. package/src/bricks/mutation-check.md +18 -0
  159. package/src/bricks/plan.md +6 -6
  160. package/src/bricks/red-test.md +16 -0
  161. package/src/bricks/review.md +5 -3
  162. package/src/bricks/spec.md +18 -0
  163. package/src/bricks/upgrade-scout.md +16 -0
  164. package/src/loops/api-endpoint.json +31 -0
  165. package/src/loops/architecture-decision.json +22 -0
  166. package/src/loops/bugfix.json +1 -0
  167. package/src/loops/ci-repair.json +19 -0
  168. package/src/loops/deps-upgrade.json +29 -0
  169. package/src/loops/enforce-architecture-rule.json +28 -0
  170. package/src/loops/feature.json +8 -5
  171. package/src/loops/fix-flaky-tests.json +30 -0
  172. package/src/loops/legacy-refactor.json +26 -0
  173. package/src/loops/legacy-tests.json +29 -0
  174. package/src/loops/refactor.json +5 -1
  175. package/src/loops/remove-dead-code.json +30 -0
  176. package/src/loops/spec-first-feature.json +29 -0
  177. package/src/loops/tdd.json +25 -0
  178. package/src/loops/update-contract.json +33 -0
  179. package/src/skills/brick-forge.md +3 -1
  180. package/src/skills/bruno-collection-generator.md +3 -3
  181. package/src/skills/bruno-test-writer.md +3 -3
  182. package/src/skills/ci-fix.md +3 -3
  183. package/src/skills/consolidate-memory.md +4 -4
  184. package/src/skills/council.md +1 -1
  185. package/src/skills/fresh-eyes.md +1 -1
  186. package/src/skills/git-archaeology.md +1 -1
  187. package/src/skills/git-rescue.md +4 -3
  188. package/src/skills/handoff.md +1 -1
  189. package/src/skills/herdr.md +1 -1
  190. package/src/skills/learn-mode.md +2 -2
  191. package/src/skills/loop.md +22 -10
  192. package/src/skills/opencode-theme.md +3 -3
  193. package/src/skills/ponytail.md +1 -1
  194. package/src/skills/profile.md +3 -4
  195. package/src/skills/prose.md +2 -3
  196. package/src/skills/quiz.md +1 -1
  197. package/src/skills/react-view-transitions/SKILL.md +1 -1
  198. package/src/skills/react-view-transitions/VENDOR.md +8 -3
  199. package/src/skills/research.md +3 -3
  200. package/src/skills/review-response.md +2 -2
  201. package/src/skills/rule.md +3 -3
  202. package/src/skills/security-audit.md +4 -4
  203. package/src/skills/teach.md +1 -1
  204. package/src/skills/wiki.md +3 -3
  205. package/src/skills/workflow.md +4 -4
  206. package/src/skills/worktree.md +2 -2
  207. package/web/dist/assets/Activity-CjRqZnr-.js +1 -0
  208. package/web/dist/assets/ActivityDetail-OQTxKBj2.js +1 -0
  209. package/web/dist/assets/Dashboard-J-xCe_Gk.js +2 -0
  210. package/web/dist/assets/Docs-CvOZ8akL.js +5 -0
  211. package/web/dist/assets/{GreenhouseView-C6ibc8IE.js → GreenhouseView-6KDjX8da.js} +1 -1
  212. package/web/dist/assets/{Installs-DRYjYnxs.js → Installs-MWuhNjSm.js} +2 -2
  213. package/web/dist/assets/JournalView-C8MrOz2c.js +1 -0
  214. package/web/dist/assets/Laws-Du0-Zyp2.js +3 -0
  215. package/web/dist/assets/Library-DOkO0TtB.js +1 -0
  216. package/web/dist/assets/Loops-Dv_aLByJ.js +2 -0
  217. package/web/dist/assets/{Markdown-qjM2_ofS.js → Markdown-X2a3qvOh.js} +14 -14
  218. package/web/dist/assets/{OperatorHudView-Bs7paWmh.js → OperatorHudView-BPP1dtLz.js} +1 -1
  219. package/web/dist/assets/{Personal-BY5n4gTw.js → Personal-26VPYkK0.js} +1 -1
  220. package/web/dist/assets/Tabs-BzKuFskD.js +1 -0
  221. package/web/dist/assets/{usePoll-O0sJEw1Y.js → activity-Dr7ZMBI3.js} +1 -1
  222. package/web/dist/assets/{api-CyMRbU2x.js → api-D_ixdyEY.js} +1 -1
  223. package/web/dist/assets/drawable-zVVDbsyw.js +1 -0
  224. package/web/dist/assets/index-Ctp-4poP.css +1 -0
  225. package/web/dist/assets/index-KHt3wE_K.js +2 -0
  226. package/web/dist/assets/usePoll-DD8VjtSg.js +1 -0
  227. package/web/dist/index.html +3 -3
  228. package/web/src/pages/Laws.jsx +0 -1
  229. package/web/dist/assets/Activity-GaaZWXTY.js +0 -1
  230. package/web/dist/assets/ActivityDetail-4t7d45Du.js +0 -1
  231. package/web/dist/assets/Dashboard-CYn7Tp16.js +0 -2
  232. package/web/dist/assets/Docs-BeFKLg2T.js +0 -5
  233. package/web/dist/assets/JournalView-1HbU1mfg.js +0 -1
  234. package/web/dist/assets/Laws-DFoG8JWB.js +0 -3
  235. package/web/dist/assets/Library-DDjgNwz_.js +0 -1
  236. package/web/dist/assets/Loops-D9VEoO0F.js +0 -1
  237. package/web/dist/assets/Tabs-ho-EYD8i.js +0 -1
  238. package/web/dist/assets/drawable-CLS9drMb.js +0 -1
  239. package/web/dist/assets/index-CX_hXMi5.css +0 -1
  240. package/web/dist/assets/index-Cjr7XCA3.js +0 -2
package/CHANGELOG.md CHANGED
@@ -8,6 +8,166 @@ label. For the capability ↔ spec map, see [SHIPPED.md](SHIPPED.md).
8
8
 
9
9
  ## [Unreleased]
10
10
 
11
+ ## [3.14.0] — 2026-10-04
12
+
13
+ **Upgrading:** re-emit (`geneseed rebuild-all`) so installed hooks pick up the gate fixes and the
14
+ per-verb hook modules; then `geneseed web restart`.
15
+
16
+ ### Security
17
+ - **Sealed Secrets gate** — `sk-ant-` keys containing `_` (base64url, most real keys) no longer
18
+ slip past; `MultiEdit` (`edits[].new_string`) and `NotebookEdit` (`notebook_path`/`new_source`)
19
+ are now scanned like `Write`/`Edit`.
20
+ - **Destructive-git gate** — catches `git push -f`, `git push origin +main`, `git reset -q --hard`
21
+ and `git clean -d -f` (flags anywhere after the verb); `LAW_IV_BASH` mirrors it.
22
+ - **Memory names** — a model-written memory `name:` that is not a plain slug is refused instead
23
+ of becoming a path outside the memory dir (Claude `learn` hook and the OpenCode learn plugin).
24
+ - **Uninstall** — manifest paths are contained to the install dir before unlinking (as deactivate
25
+ already did); empty-directory pruning stops at the base.
26
+
27
+ ### Fixed
28
+ - `--exclude-rules` is carried through every re-render: `geneseed diff` no longer reports drift on
29
+ an install with excluded rules, console Restore and `geneseed migrate` no longer re-admit them,
30
+ and `validate` honours every render axis. Unknown ids in `harness.config.json` now warn and are
31
+ dropped instead of breaking every later rebuild.
32
+ - Claude `settings.json` that is not a JSON object, or unreadable, is refused instead of
33
+ overwritten; every JSON config write is atomic.
34
+ - Loop: a malformed `record --card` is refused before it can wedge the loop; `check` resolves
35
+ bricks from the git root; `next` no longer rewrites `LOOP.md`; a clean tree is recognised.
36
+ - Console: the Docs host selector follows the deployed install instead of sticking to OpenCode;
37
+ the About page shows the installed and source fingerprints; the outline strips inline markdown.
38
+ - `theme --transparent-only` names the file it wrote; `validate --help` prints its own usage.
39
+ - Doctor's module-map check keys by folder, so twin module names can no longer hide a missing row.
40
+ - `learn` reports on stderr when it cannot start the model CLI.
41
+
42
+ ### Changed
43
+ - The hook binary loads one verb's module per call (`hooks.mjs` gates, `hooks-context.mjs`,
44
+ `hooks-learn.mjs`): gate cold import ~16 → ~10 ms, on every tool call. The memory-file helpers
45
+ live in the no-spawn `memory-files.mjs`, so the CLI no longer reaches `child_process`.
46
+ - Internal splits: `js/hosts/shim.mjs`, `js/build/args.mjs`, `checks-constitution.mjs`,
47
+ `checks-counts.mjs`; one JSON-object reader and one `CLAUDE_STYLE` host list; dead code and
48
+ Python-era comments removed.
49
+
50
+ ## [3.13.0] — 2026-10-04
51
+
52
+ **Upgrading:** re-emit (`geneseed rebuild-all`) so the installed `loop` skill knows the new
53
+ templates, human gates and note files; then `geneseed web restart` (and a hard reload) for the
54
+ new Loops and Docs pages.
55
+
56
+ ### Added
57
+ - **Template `category`** — `architecture`, `tests`, `development`, `refactoring` or `day-to-day`;
58
+ every shipped template carries one, and the console's Loops page groups templates by it.
59
+ - **Five loop templates** — `tdd` (plan, then write each failing test before the code that passes
60
+ it), `legacy-tests` (pin undocumented behaviour with characterization tests, mutation-checked,
61
+ production code untouched), `legacy-refactor` (pin current behaviour once, then refactor behind
62
+ that net), `deps-upgrade` (upgrade one package or group per iteration, breaking changes read
63
+ before the bump, lockfiles excluded from the deletion count so their churn doesn't force a
64
+ blocking score), and `ci-repair` (triage the current commit's failing CI checks and fix one
65
+ code failure per iteration).
66
+ - **Five bricks** backing the templates above — `red-test`, `characterize`, `mutation-check`
67
+ (reports `unavailable` rather than a silent `pass` when no mutation tool is on the stack),
68
+ `upgrade-scout`, `ci-triage` (reports `done` rather than green when CI has no run for HEAD).
69
+ - **`geneseed loop record --note` / `--note-file`** — carries a `read` brick's finding (a plan, a
70
+ review finding, a mutation gap, a CI classification) into `LOOP.md`'s notes so it survives into
71
+ the next brick and the next iteration; `--note-file` for anything multi-line or that mentions
72
+ `git commit`/`push`, which a shell argument can't carry safely.
73
+ - **Console: Loops › Active tab** — every loop `geneseed loop init` has launched, discovered via a
74
+ new **loop registry** (`$XDG_CONFIG_HOME/geneseed/loops.json`, identity only — `LOOP.md` stays
75
+ the source of state) instead of a worktree scan. `GET /api/loops/active` reports each loop's
76
+ branch, status, iteration, current node and preset; a card per loop, an `awaiting` loop
77
+ highlighted with what it's waiting on (answered in the agent's session, never the page),
78
+ finished loops kept muted for 7 days. Selecting a card draws its ring with the current node and
79
+ its iteration history. A per-loop preset picker (`POST /api/loops/preset`) rewrites `LOOP.md`'s
80
+ `preset`, applying from the next score on — the tab's only write; no `decide` and no relaunch
81
+ from the page. Only loops launched on this version or later are registered.
82
+
83
+ - **Seven more loop templates** — `architecture-decision` (one ADR per decision, challenged by a
84
+ skeptic brick, reviewed by the user), `enforce-architecture-rule` (encode a rule as a test with
85
+ an allowlist of today's violations, fix one violation per iteration), `update-contract` (expand,
86
+ migrate one consumer per iteration, contract, with contract files gated for a human by default),
87
+ `spec-first-feature` (write the spec first, build one task per iteration, closed by an
88
+ independent `done-check`), `api-endpoint` (plan, apply, test, a Bruno request and a security
89
+ review per endpoint), `remove-dead-code` (confirm green, delete one coherent unused group per
90
+ iteration, deletions scored soft) and `fix-flaky-tests` (confirm by repeated runs, fix the root
91
+ cause per iteration, never a retry or a sleep).
92
+ - **Nine bricks** backing the templates above — `adr-draft`, `adr-challenge`, `fitness-define`,
93
+ `migration-plan`, `spec`, `done-check`, `compat-check`, `flake-repro`, `flake-check`.
94
+ - **Human gates** — a brick's frontmatter can carry `gate: human` (optionally `gateOn:
95
+ <outcomes>`), holding its transition for a person regardless of preset or score. `geneseed loop
96
+ decide --verdict ok|no|amend` answers it: `ok` follows the reported outcome (a held failure
97
+ still stops), `no` stops the loop, `amend` re-runs the brick with a note and restarts its ring
98
+ budget, capped at 3 amends per brick per iteration. A passed gate is named under the closing
99
+ commit's new `Loop-Gates` trailer. In the console, a gated brick carries a person badge on the
100
+ loop ring ("Human gate", or "Human gate on pass") and a "human gate" tag in its rows, and the
101
+ Active section shows a gated loop as `Awaiting gate at <node>`.
102
+ - **Template `contracts` and `ignoreDeletions` globs** — `contracts` names interface/schema files
103
+ that always escalate a touching iteration to at least the `api` risk weight; copied from the
104
+ template at `loop init`, extendable with `--contracts` or by hand in `LOOP.md`.
105
+ `ignoreDeletions` excludes matched files from the >20-deleted-lines escalation only — the write
106
+ set still applies to them.
107
+ - **`rules` on every node** — a template may carry `rules`, a list of one-line instructions
108
+ (`loop check` refuses anything else); `geneseed loop next` hands them to every brick it runs,
109
+ not only the iteration head, so a template-wide proviso is visible everywhere, including to
110
+ `review`. `description` stays the catalogue blurb and is never sent as rules. The shipped
111
+ templates' instructions moved out of their descriptions into `rules`.
112
+ - **A guide to running a loop** — `docs/guides/run-a-loop.md`, `loop-running.md` and
113
+ `loop-finish.md`: what you need, how to ask, which template for which job, the trust preset,
114
+ answering a blocking score or a human gate, watching, stopping, merging, driving the engine by
115
+ hand, and a symptom table.
116
+ - **Console: rendered brick view** — the Loops page's Bricks reader renders a brick's body as
117
+ markdown under its facts (effect, outcomes, gate), with the raw source one click away.
118
+
119
+ ### Changed
120
+ - **Categories nest under the selected rail entry** — on the Library (skill types), Docs
121
+ (sections) and Loops (template categories, brick origins, run statuses) pages, a selected
122
+ entry's categories open in the rail beneath it, with counts and a share bar, replacing the
123
+ full-width banner above the page.
124
+ - **The Docs selector names all four hosts** — OpenCode, Claude Code, OpenClaude and IBM Bob. A
125
+ page or inline block tagged with a family still shows to every host in it; a page can now name
126
+ several hosts (`harness: ["claude", "openclaude"]`), so Bob no longer sees the Claude Code /
127
+ OpenClaude machine page.
128
+ - **Docs in the Library layout** — the console's Docs tab is a rail of parts (Understand, Guides,
129
+ Concepts, Reference), a filterable list grouped by section, and a reader with a breadcrumb,
130
+ the page's outline and Previous / Next within its section. Pages carry a new `section` and
131
+ `description` in their frontmatter.
132
+ - **Long doc pages split into short ones**, each a section of its part: the install guide (one
133
+ page per host, from a clone, without the wizard), what lands on your machine (one page per
134
+ host, taking it back out), troubleshooting (installing, hooks, updating, doctor, web console),
135
+ the OpenCode plugins (one page per plugin), loops (templates, bricks, notes and rules, risk,
136
+ human gates, contracts, the loop branch) and the run-a-loop guide. The `geneseed loop` actions
137
+ table moved to Reference. Then the rest of the long ones: choose your setup (voice and working
138
+ style · doctrine packs and single rules · footprint, loop trust and changing later), MCP servers
139
+ (a hub, one page per preset, reading non-markdown docs; the won't-connect checklist moved to
140
+ Troubleshooting), hooks (the hooks · gates, settings and the shim), environment variables (the
141
+ context and memory ones on their own page; plugin switches live on each plugin's page), the
142
+ host capability matrix, and which loop template. Every first page keeps its old address.
143
+ - **The Understand track has more pages** — what lands on your machine is now one page per host
144
+ plus taking it back out, so a returning reader's "New here?" progress shows the new steps
145
+ as unread.
146
+ - **Console Loops page in the Library layout** — a rail (Templates · Bricks · Active, with
147
+ counts) replaces the tabs; each section is a filterable list grouped like the Library's
148
+ (templates by `category`, bricks by origin, active loops by status, awaiting first) beside a
149
+ detail pane: the ring, the template's `rules`, and its bricks as compact rows that a click on a
150
+ ring node highlights. Inner-ring nodes no longer overlap (`api-endpoint`).
151
+ - **`feature`** now closes through an independent `done-check` — it maps every requirement to a
152
+ passing test before `$close` instead of trusting the iterations that already ran.
153
+ - **`deps-upgrade`** marks lockfiles with `ignoreDeletions` instead of a lowered `delete` weight,
154
+ so lockfile churn stays out of the deletion count without lowering the weight for any other
155
+ deletion in the same iteration.
156
+ - **Write-set entries accept globs** when they have at least one literal path segment (a tool's
157
+ generated store, say); a wildcard-only entry (`**`, `**/*.java`) still matches nothing rather
158
+ than declaring the whole repo writable.
159
+
160
+ ### Fixed
161
+ - **Skill and agent descriptions follow the skill-authoring rules** — no trigger sentence is cut
162
+ mid-way in any theme, and no description carries XML-like tags (#179).
163
+ - **The install page no longer scrolls on open** — the reader's own host is lit (its link on the
164
+ Install page, its scope's heading on the OpenCode page) without moving the page.
165
+ - The bricks README link on the loops page pointed at a repository that does not exist; the
166
+ console's wiki button opened a docs page that does not exist.
167
+ - A read-setup brick's plan or review findings no longer vanish between steps — `record --note`
168
+ / `--note-file` writes them into `LOOP.md`'s notes instead of leaving them in the brick's own,
169
+ discarded context.
170
+
11
171
  ## [3.12.0] — 2026-10-03
12
172
 
13
173
  **Upgrading:** re-emit after installing (`geneseed rebuild-all`) to get the `loop` and
package/README.md CHANGED
@@ -41,7 +41,7 @@ A hand-written instructions file is prose the model may or may not honour, copie
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
 
44
- This page is the overview. **New to agent harnesses?** Start with [Understand](docs/understand/harness.md) — four short pages on what a harness is, what lands on your machine, what changes in your day, and what is enforced versus only asked. Everything else — every install path, configuration knob, and troubleshooting step — is in the **[documentation](docs/README.md)**, which the web console also renders.
44
+ This page is the overview. **New to agent harnesses?** Start with [Understand](docs/understand/harness.md) — a short course on what a harness is, what lands on your machine, what changes in your day, and what is enforced versus only asked. Everything else — every install path, configuration knob, and troubleshooting step — is in the **[documentation](docs/README.md)**, which the web console also renders.
45
45
 
46
46
  ---
47
47
 
@@ -199,7 +199,7 @@ Pick with `--theme NAME` or via the setup wizard; upgrades remember it. More in
199
199
 
200
200
  ### 🪶 Footprint (lean vs full)
201
201
 
202
- A second per-install dial sets how much of the constitution the root file carries *inline* every turn — a token-cost knob, not a change to which Rules apply. **lean** (the default) carries each rule's hand-written short form and points to the full text on disk; **full** inlines every rule with its rationale. Every rule is in force either way. More in [Footprint](docs/concepts/footprint.md) and [Choose your setup](docs/guides/choose-your-setup.md).
202
+ A second per-install dial sets how much of the constitution the root file carries *inline* every turn — a token-cost knob, not a change to which Rules apply. **lean** (the default) carries each rule's hand-written short form and points to the full text on disk; **full** inlines every rule with its rationale. Every rule is in force either way. More in [Footprint](docs/concepts/footprint.md) and [Footprint, loop trust and changing later](docs/guides/setup-footprint.md).
203
203
 
204
204
  ---
205
205
 
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.12.0**.
23
+ > string. Current label: **3.14.0**.
24
24
 
25
25
  ## Capabilities
26
26
 
@@ -1,6 +1,6 @@
1
1
  # 🤖 IBM Bob adapter
2
2
 
3
- > [← Back to README](../../README.md) · [Install guide](../../docs/guides/install.md) · [Claude Code adapter](../claude-code/README.md) · [OpenCode adapter](../opencode/README.md)
3
+ > [← Back to README](../../README.md) · [Install guide](../../docs/guides/install-bob.md) · [Claude Code adapter](../claude-code/README.md) · [OpenCode adapter](../opencode/README.md)
4
4
 
5
5
  [IBM Bob](https://bob.ibm.com) is **Claude-Code-shaped**: a project `.bob/`
6
6
  layer, an `AGENTS.md` instructions file, `SKILL.md` skills, subagents, and a
@@ -1,6 +1,6 @@
1
1
  # 🪝 Claude Code adapter
2
2
 
3
- > [← Back to README](../../README.md) · [Install guide](../../docs/guides/install.md) · [OpenCode adapter](../opencode/README.md)
3
+ > [← Back to README](../../README.md) · [Install guide](../../docs/guides/install-claude-code.md) · [OpenCode adapter](../opencode/README.md)
4
4
 
5
5
  Optional. Claude Code supports lifecycle **hooks**, so a team using it can make
6
6
  parts of the harness fire automatically instead of relying on agent
@@ -1,6 +1,6 @@
1
1
  # 🦀 OpenClaude adapter
2
2
 
3
- > [← Back to README](../../README.md) · [Install guide](../../docs/guides/install.md) · [Claude Code adapter](../claude-code/README.md) · [OpenCode adapter](../opencode/README.md)
3
+ > [← Back to README](../../README.md) · [Install guide](../../docs/guides/install-openclaude.md) · [Claude Code adapter](../claude-code/README.md) · [OpenCode adapter](../opencode/README.md)
4
4
 
5
5
  [OpenClaude](https://openclaude.gitlawb.com/) (`@gitlawb/openclaude`, binary
6
6
  `openclaude`) is an open-source coding-agent CLI that "originated from the Claude
@@ -1,6 +1,6 @@
1
1
  # 🔌 OpenCode adapter
2
2
 
3
- > [← Back to README](../../README.md) · [Install guide](../../docs/guides/install.md) · [How OpenCode loads](HOW-OPENCODE-LOADS.md) · [Global harness spec](GLOBAL-HARNESS-SPEC.md)
3
+ > [← Back to README](../../README.md) · [Install guide](../../docs/guides/install-opencode.md) · [How OpenCode loads](HOW-OPENCODE-LOADS.md) · [Global harness spec](GLOBAL-HARNESS-SPEC.md)
4
4
 
5
5
  [OpenCode](https://opencode.ai) is `AGENTS.md`-native and has first-class
6
6
  **subagents** and **commands**, so Geneseed fits it cleanly. Pick the depth you
@@ -468,9 +468,9 @@ OpenCode runs, so the command has to resolve — the `uvx` form above needs only
468
468
  call). No uv? `pipx install markitdown-mcp` and swap the command to `["markitdown-mcp"]`.
469
469
  Or drop the block entirely — the skill falls back to a CLI converter (MarkItDown /
470
470
  Pandoc / Docling) and never installs one silently. Listed but not connecting? The
471
- command isn't on PATH — see [the MCP guide](../../docs/guides/mcp.md).
471
+ command isn't on PATH — see [Model, agent and MCP problems](../../docs/reference/troubleshoot-tools.md).
472
472
  Full runbook, including the corporate-TLS (`UV_SYSTEM_CERTS`) step and the OCR extras:
473
- [the MCP guide](../../docs/guides/mcp.md).
473
+ [the MarkItDown guide](../../docs/guides/mcp-markitdown.md).
474
474
 
475
475
  ## Optional add-on — git-worktree isolation (third-party, not vendored)
476
476
 
@@ -251,6 +251,11 @@ function parseFrontmatter(chunk) {
251
251
  return fm
252
252
  }
253
253
 
254
+ // A memory `name:` becomes a FILENAME and the model writes it, so it is a plain slug or
255
+ // nothing — no separator, no `..`, no drive. The same rule as MEMORY_SLUG_RE in
256
+ // js/hosts/hooks.mjs, inlined because this file ships standalone.
257
+ const MEMORY_SLUG_RE = /^[A-Za-z0-9][A-Za-z0-9_-]{0,99}$/
258
+
254
259
  async function writeMemories(output, memDir, existing) {
255
260
  const written = []
256
261
  const indexLines = []
@@ -259,7 +264,7 @@ async function writeMemories(output, memDir, existing) {
259
264
  if (!chunk || chunk.toUpperCase() === "NOTHING") continue
260
265
  const fm = parseFrontmatter(chunk)
261
266
  const name = (fm.name || "").trim()
262
- if (!name || existing.has(name)) continue
267
+ if (!MEMORY_SLUG_RE.test(name) || existing.has(name)) continue
263
268
  await fs.writeFile(path.join(memDir, `${name}.md`), chunk.replace(/\n+$/, "") + "\n", "utf8")
264
269
  existing.add(name)
265
270
  written.push(name)
@@ -393,4 +398,8 @@ export const GeneseedLearn = async ({ client }) => {
393
398
  }
394
399
  }
395
400
 
401
+ // OpenCode treats every export as a plugin and rejects non-functions; hang the test
402
+ // helpers off the factory instead — reachable via import, invisible to the loader.
403
+ Object.assign(GeneseedLearn, { writeMemories })
404
+
396
405
  export default GeneseedLearn
@@ -58,7 +58,7 @@
58
58
  import '../js/lib/node-floor.mjs';
59
59
  import { cliSpec, printHelp, printVerbList } from '../js/ui/cli.mjs';
60
60
  import { parseIntStrict } from '../js/lib/text.mjs';
61
- import { printErr } from '../js/lib/fs.mjs';
61
+ import { printErr, printOut } from '../js/lib/fs.mjs';
62
62
 
63
63
  /**
64
64
  * The verbs this entry answers — and, since P10c, NOTHING ELSE ABOUT THEM.
@@ -302,7 +302,7 @@ async function main(argv) {
302
302
  // that binary is never reached, and its import graph is paid on every tool call.
303
303
  if (process.env.GENESEED_NO_SHIM_CHECK !== '1' && verb !== 'help'
304
304
  && !argv.some((t) => t === '-h' || t === '--help')) {
305
- const { shimDead } = await import('../js/hosts/settings.mjs');
305
+ const { shimDead } = await import('../js/hosts/shim.mjs');
306
306
  const dead = shimDead();
307
307
  if (dead.length) {
308
308
  printErr(`[geneseed] ⚠ hooks are off on this machine: the hook shim points at `
@@ -311,25 +311,21 @@ async function main(argv) {
311
311
  }
312
312
  }
313
313
  // `validate` — the generator's `--validate-only`, and the one verb this entry answers that is NOT
314
- // in the table above. It is dispatched here, before the lookup, for a reason that is a
315
- // property of the gates rather than a preference:
316
- //
317
- // * `VERBS` is asserted to be the twin of `rituals/harness.py`'s SUBPARSERS
318
- // (`test_every_entry_verb_is_a_real_harness_subcommand`), and `--validate-only` is a
319
- // GENERATOR flag — `harness.py` has never had a `validate` subcommand to be a twin of;
320
- // * `test_the_matrix_covers_every_verb_it_claims` demands a recorded cell group per table
321
- // row, and a cell has an `lf` half this host cannot produce.
322
- //
323
- // So a row would have meant amending two gates and recording a corpus half blind. It takes
324
- // the generator's own parser (see `parseDriverArgs`) because its flags are the generator's,
314
+ // in the table above. It is dispatched here, before the lookup, because its flags are the
315
+ // GENERATOR's, not a table row's: it takes the generator's own parser (see `parseDriverArgs`),
325
316
  // and it is on THIS binary — not on `bin/build-driver.mjs` — because it runs the doctor, which
326
317
  // starts a process the driver is banned from reaching.
327
318
  if (verb === 'validate') {
328
319
  // Lazy for the same reason the table rows are — `parseDriverArgs` alone drags the whole
329
320
  // generator driver in, and every OTHER verb was paying for it.
330
- const [{ cmdValidate }, { parseDriverArgs }] = await Promise.all([
321
+ const [{ cmdValidate, VALIDATE_USAGE }, { parseDriverArgs }] = await Promise.all([
331
322
  import('../js/inspect/validate.mjs'), import('../js/build/driver.mjs'),
332
323
  ]);
324
+ // Before the borrowed parser, whose own `-h` prints the GENERATOR's usage.
325
+ if (argv.slice(1).some((t) => t === '-h' || t === '--help')) {
326
+ printOut(VALIDATE_USAGE);
327
+ return 0;
328
+ }
333
329
  try {
334
330
  return cmdValidate(parseDriverArgs(argv.slice(1)));
335
331
  } catch (e) {
@@ -27,9 +27,10 @@
27
27
  * component — so the last driver to emit anything on a machine owns every install's hooks,
28
28
  * including installs the other driver wrote. That is safe exactly while the two entry
29
29
  * points answer the same verbs identically, which is not a hope:
30
- * `test_the_entry_carries_exactly_the_verbs_the_emitter_wires` pins the verb set to the
31
- * hooks the emitter wires, and `tests/harness_golden.py` runs this binary as a process
32
- * against the Python one on stdout, stderr, exit code and every file written.
30
+ * `tests/unit/hook_cli.test.mjs`'s "the hook entry carries exactly the verbs the emitter wires"
31
+ * pins the verb set to the hooks the emitter wires, and `node tests/golden.mjs --cli` runs
32
+ * this binary as a process with absolute assertions on stdout, stderr, exit code and every file
33
+ * written.
33
34
  *
34
35
  * The verb set is deliberately SMALL and refuses the rest by name. `harness.py` has 24
35
36
  * subparsers (25 invocable names — `update` is an alias of `upgrade`); a hook entry that
@@ -39,22 +40,29 @@
39
40
  */
40
41
  // FIRST, before anything it could fail to run: an old Node gets one sentence, not a stack trace.
41
42
  import '../js/lib/node-floor.mjs';
42
- import { cmdContext, cmdGitGate, cmdRuleGate, cmdToolGate, cmdLearn } from '../js/hosts/hooks.mjs';
43
- // Not a new module on the hot path: `js/hosts/hooks.mjs` above already imports
44
- // `js/lib/fs.mjs`, so this edge names a file the process has already loaded.
43
+ // Not a new module on the hot path: every verb's module imports `js/lib/fs.mjs` too, so this
44
+ // edge only loads early a file the process would load anyway.
45
45
  import { printErr } from '../js/lib/fs.mjs';
46
46
 
47
47
  // `--host` selects the verdict dialect (see js/hosts/hooks.mjs's header); the emitter bakes
48
48
  // it into the command for every host that is not Claude Code, so the hook never has to guess
49
49
  // its reader from the payload's shape.
50
+ //
51
+ // `load` is a DYNAMIC import per verb, so a process parses only its own verb's module: the gates
52
+ // run on every tool call and must not pay for `context`'s discovery or `learn`'s spawn. The
53
+ // specifiers stay literal strings — `tests/unit/hook_cli.test.mjs`'s import walk reads them.
50
54
  const HOSTED = { '--root': 'root', '--host': 'host' };
55
+ const gates = () => import('../js/hosts/hooks.mjs');
51
56
  const VERBS = {
52
- context: { fn: cmdContext, flags: HOSTED },
53
- 'git-gate': { fn: cmdGitGate, flags: HOSTED, switches: { '--no-consent': 'noConsent' } },
54
- 'rule-gate': { fn: cmdRuleGate, flags: HOSTED },
55
- 'tool-gate': { fn: cmdToolGate, flags: HOSTED },
57
+ context: { load: () => import('../js/hosts/hooks-context.mjs'), fn: 'cmdContext', flags: HOSTED },
58
+ 'git-gate': {
59
+ load: gates, fn: 'cmdGitGate', flags: HOSTED, switches: { '--no-consent': 'noConsent' },
60
+ },
61
+ 'rule-gate': { load: gates, fn: 'cmdRuleGate', flags: HOSTED },
62
+ 'tool-gate': { load: gates, fn: 'cmdToolGate', flags: HOSTED },
56
63
  learn: {
57
- fn: cmdLearn,
64
+ load: () => import('../js/hosts/hooks-learn.mjs'),
65
+ fn: 'cmdLearn',
58
66
  flags: { '--memory': 'memory' },
59
67
  switches: { '--consolidate': 'consolidate' },
60
68
  positional: 'file',
@@ -62,7 +70,7 @@ const VERBS = {
62
70
  };
63
71
 
64
72
  function die(code, msg) {
65
- // CRLF on Windows, for the same reason `js/hosts/hooks.mjs`'s funnels translate: argparse
73
+ // CRLF on Windows, for the same reason the hook verbs' funnels translate: argparse
66
74
  // writes this line through `sys.stderr`, which does. `printErr` owns the `\n`-to-`os.linesep` rule.
67
75
  printErr(`geneseed-hook: error: ${msg}\n`);
68
76
  return code;
@@ -128,8 +136,7 @@ async function main(argv) {
128
136
  // argument. The four hook verbs are four of the reference's 26 and had the same gap.
129
137
  // `js/ui/cli.mjs` is imported HERE, not at the top: a static import cost every tool call
130
138
  // of every session a module parse (~3 ms of an ~12 ms controllable budget) for a branch
131
- // only a human at a terminal ever takes. The hook path never awaits it, so `main` staying
132
- // async-shaped costs the hot verbs nothing.
139
+ // only a human at a terminal ever takes.
133
140
  if (argv.slice(1).some((t) => t === '-h' || t === '--help')) {
134
141
  const { printHelp } = await import('../js/ui/cli.mjs');
135
142
  const rc = printHelp('geneseed-hook', verb);
@@ -137,7 +144,7 @@ async function main(argv) {
137
144
  }
138
145
  const parsed = parse(spec, argv.slice(1));
139
146
  if (parsed.error) return die(2, parsed.error);
140
- return spec.fn(parsed.args);
147
+ return (await spec.load())[spec.fn](parsed.args);
141
148
  }
142
149
 
143
150
  main(process.argv.slice(2)).then((code) => { process.exitCode = code; });
package/docs/README.md CHANGED
@@ -2,40 +2,59 @@
2
2
 
3
3
  [← Back to README](../README.md)
4
4
 
5
- **New to agent harnesses?** Read **Understand** first — four short pages, about ten minutes, and every other page assumes them. The same pages open the **Docs** tab of the web console (`geneseed web`), which adds an interactive map of your own install and filters host-specific passages to the tool you use.
5
+ **New to agent harnesses?** Read **Understand** first — a short track, about ten minutes, that every other page assumes. The same pages open the **Docs** tab of the web console (`geneseed web`), which groups each part into sections, adds an interactive map of your own install, and filters host-specific passages to the tool you use.
6
6
 
7
7
  ## 1 · Understand
8
8
 
9
- 1. **[What a harness is](understand/harness.md)** — git hooks + CI + a runbook, but for your AI agent.
10
- 2. **[What lands on your machine](understand/on-your-machine.md)** — every file and hook an install writes, what it does for you, what it costs, how to turn it off.
11
- 3. **[A day with the harness](understand/a-day.md)** — the moments you will actually meet: a push that asks first, a skill, a delegation, a memory.
12
- 4. **[Enforced vs. asked](understand/enforced-vs-asked.md)** — what is guaranteed by code, and what the model is only asked to do.
9
+ **Start here** — [What a harness is](understand/harness.md): git hooks + CI + a runbook, but for your AI agent.
10
+
11
+ **On your machine** — [What lands on your machine](understand/on-your-machine.md) · [On OpenCode](understand/machine-opencode.md) · [On Claude Code and OpenClaude](understand/machine-claude.md) · [On Bob, or any AGENT.md tool](understand/machine-bob.md) · [Taking it back out](understand/take-it-out.md): every file and hook an install writes, what it does for you, what it costs, how to turn it off.
12
+
13
+ **Day to day** — [A day with the harness](understand/a-day.md): the moments you will actually meet · [Enforced vs. asked](understand/enforced-vs-asked.md): what is guaranteed by code, and what the model is only asked to do.
13
14
 
14
15
  ## 2 · Guides
15
16
 
16
- | Guide | When |
17
- | --- | --- |
18
- | [Install](guides/install.md) | First time — npx, a clone, or a specific host |
19
- | [Choose your setup](guides/choose-your-setup.md) | Theme, doctrine packs, one rule at a time, footprint, posture, mode |
20
- | [Verify it works](guides/verify.md) | Right after installing, or when something feels off |
21
- | [Upgrade](guides/upgrade.md) | Getting a new version onto every install |
22
- | [Uninstall](guides/uninstall.md) | Removing an install — and what stays behind |
23
- | [Project context](guides/project-context.md) | Choosing which of a repo's docs the agent loads |
24
- | [Connect your wiki](guides/wiki.md) | Giving the agent your own notes, machine-wide |
25
- | [MCP servers](guides/mcp.md) | MarkItDown, GitLab, Filesystem — and reading non-markdown docs |
26
- | [Run geneseed from anywhere](guides/run-anywhere.md) | Putting the CLI on your PATH from a clone |
27
- | [Start the web console at login](guides/autostart.md) | Keeping the console running |
28
- | [Run in CI / headless](guides/headless.md) | OpenCode without a terminal |
29
- | [Add git-worktree isolation](guides/worktree.md) | OpenCode, optional third-party add-on |
30
- | [Migrate from a clone to npm](guides/migrate.md) | Moving an old clone install to the npm package |
17
+ | Section | Guide | When |
18
+ | --- | --- | --- |
19
+ | Install | [Install](guides/install.md) | First time — one command, and the page for each host |
20
+ | Install | [From a clone](guides/install-clone.md) | npm is out of reach, or you want to change the harness |
21
+ | Install | [OpenCode](guides/install-opencode.md) · [Claude Code](guides/install-claude-code.md) · [OpenClaude](guides/install-openclaude.md) · [IBM Bob](guides/install-bob.md) · [Any AGENT.md tool](guides/install-agent-md.md) | Installing for one host, global or per repo |
22
+ | Install | [Without the wizard](guides/install-scripted.md) | A script, a CI job, a shell with no terminal |
23
+ | Install | [Run geneseed from anywhere](guides/run-anywhere.md) | Putting the CLI on your PATH from a clone |
24
+ | Set up | [Choose your setup](guides/choose-your-setup.md) · [Doctrine packs and single rules](guides/setup-doctrines.md) · [Footprint, loop trust and changing later](guides/setup-footprint.md) | Theme, posture, mode; doctrine packs and single rules; footprint, loop trust, changing a choice |
25
+ | Set up | [Verify it works](guides/verify.md) | Right after installing, or when something feels off |
26
+ | Set up | [Project context](guides/project-context.md) | Choosing which of a repo's docs the agent loads |
27
+ | Set up | [Connect your wiki](guides/wiki.md) | Giving the agent your own notes, machine-wide |
28
+ | Set up | [MCP servers](guides/mcp.md) · [MarkItDown](guides/mcp-markitdown.md) · [GitLab](guides/mcp-gitlab.md) · [Filesystem](guides/mcp-filesystem.md) · [Reading non-markdown docs](guides/read-non-markdown.md) | Where the config lives, the three presets, and reading PDF and Office files |
29
+ | Loops | [Run a loop](guides/run-a-loop.md) · [Which loop template](guides/loop-which-template.md) · [While a loop runs](guides/loop-running.md) · [Finish a loop](guides/loop-finish.md) | Working a requirement as small, validated, committed iterations |
30
+ | Keep it running | [Upgrade](guides/upgrade.md) | Getting a new version onto every install |
31
+ | Keep it running | [Migrate from a clone to npm](guides/migrate.md) | Moving an old clone install to the npm package |
32
+ | Keep it running | [Start the web console at login](guides/autostart.md) | Keeping the console running |
33
+ | Keep it running | [Uninstall](guides/uninstall.md) | Removing an install — and what stays behind |
34
+ | OpenCode extras | [Run in CI / headless](guides/headless.md) | OpenCode without a terminal |
35
+ | OpenCode extras | [Add git-worktree isolation](guides/worktree.md) | OpenCode, optional third-party add-on |
31
36
 
32
37
  ## 3 · Concepts
33
38
 
34
- [Hosts](concepts/hosts.md) · [Rules](concepts/rules.md) · [Agents](concepts/agents.md) · [Skills](concepts/skills.md) · [Hooks](concepts/hooks.md) · [Memory](concepts/memory.md) · [Notebook](concepts/notebook.md) · [Footprint](concepts/footprint.md) · [Collaboration](concepts/collaboration.md) · [Foreman mode](concepts/foreman-mode.md) · [Exclusions](concepts/exclusions.md) · [Themes](concepts/themes.md) · [Code intelligence (LSP)](concepts/lsp.md)
39
+ **Harness** — [Hosts](concepts/hosts.md) · [What each host automates](concepts/host-matrix.md) · [Rules](concepts/rules.md) · [Agents](concepts/agents.md) · [Skills](concepts/skills.md) · [Hooks](concepts/hooks.md) · [Hook gates, settings and the shim](concepts/hook-gates.md)
40
+
41
+ **Memory** — [Memory](concepts/memory.md) · [Notebook](concepts/notebook.md)
42
+
43
+ **Configuration** — [Footprint](concepts/footprint.md) · [Themes](concepts/themes.md) · [Exclusions](concepts/exclusions.md) · [Code intelligence (LSP)](concepts/lsp.md)
44
+
45
+ **Working together** — [Collaboration](concepts/collaboration.md) · [Foreman mode](concepts/foreman-mode.md)
46
+
47
+ **Loops** — [Loops](concepts/loops.md) · [Templates](concepts/loop-templates.md) · [Bricks and their origins](concepts/loop-bricks.md) · [Notes and rules](concepts/loop-notes.md) · [Risk, trust and validation levels](concepts/loop-risk.md) · [Human gates](concepts/loop-gates.md) · [Contracts and ignored deletions](concepts/loop-contracts.md) · [LOOP.md, trailers and the loop branch](concepts/loop-branch.md)
35
48
 
36
49
  ## 4 · Reference
37
50
 
38
- [CLI](reference/cli.md) · [Environment variables](reference/environment.md) · [Glossary](reference/glossary.md) · [Troubleshooting](reference/troubleshooting.md) (by symptom) · [OpenCode plugins](reference/opencode-plugins.md) · [About](reference/about.md)
51
+ **CLI & environment** — [CLI](reference/cli.md) · [Loop actions](reference/loop-actions.md) · [Environment variables](reference/environment.md) · [Context and memory variables](reference/env-context.md)
52
+
53
+ **Troubleshooting** (by symptom) — [Overview](reference/troubleshooting.md) · [Install](reference/troubleshoot-install.md) · [Hooks, context and memory](reference/troubleshoot-hooks.md) · [Model, agents and MCP](reference/troubleshoot-tools.md) · [Updating](reference/troubleshoot-update.md) · [Doctor findings](reference/troubleshoot-doctor.md) · [Web console](reference/troubleshoot-web.md)
54
+
55
+ **OpenCode plugins** — [Overview](reference/opencode-plugins.md) · [context](reference/plugin-context.md) · [guard](reference/plugin-guard.md) · [learn](reference/plugin-learn.md) · [workflow](reference/plugin-workflow.md) · [notify](reference/plugin-notify.md) · [ponytail](reference/plugin-ponytail.md) · [activity](reference/plugin-activity.md)
56
+
57
+ **Glossary & about** — [Glossary](reference/glossary.md) · [About](reference/about.md)
39
58
 
40
59
  ## For contributors
41
60
 
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  group: concepts
3
- order: 3
3
+ order: 4
4
4
  title: "Agents"
5
5
  kind: "concept"
6
+ section: "Harness"
7
+ description: "The specialists the main session can hand work to."
6
8
  link: {"hash": "#/section/agents", "label": "Browse the catalog →"}
7
9
  ---
8
10
  An **agent** is a specialist the main session can hand a piece of work to. Each one is a markdown file with its own instructions, installed where your host looks for subagents (`agents/` in the install). It runs in its own context and returns a result, so its reading and searching does not fill your conversation.
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  group: concepts
3
- order: 9
3
+ order: 14
4
4
  title: "Collaboration"
5
5
  kind: "concept"
6
+ section: "Working together"
7
+ description: "Register, contract, how firmly a memory binds, and who you are."
6
8
  ---
7
9
  Beside the [rules](rules.md), a few pieces shape *how* the agent works with you: the register it speaks in, the contract between you, how firmly a memory binds, and who you are. All of them are plain text in the install, so they reach every host unchanged.
8
10
 
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  group: concepts
3
- order: 11
3
+ order: 12
4
4
  title: "Exclusions"
5
5
  kind: "concept"
6
+ section: "Configuration"
7
+ description: "Two ways to switch things off: one rule, or every hook in a folder."
6
8
  link: {"hash": "#/harness", "label": "Manage in Harness →"}
7
9
  ---
8
10
  Geneseed has two different ways to switch something off, and they work at different scales:
@@ -52,4 +54,4 @@ The finer switch removes a single doctrine rule from an install while keeping th
52
54
  geneseed build --emit claude-global --exclude-rules "process 7"
53
55
  ```
54
56
 
55
- The install records it (`Excluded rules: process 7` beside its pack list) and every rebuild and upgrade keeps it. The always-on Rules and the Ethos cannot be excluded. Picking packs and rules is covered in [Choose your setup](../guides/choose-your-setup.md); what the layers are is in [Rules](rules.md).
57
+ The install records it (`Excluded rules: process 7` beside its pack list) and every rebuild and upgrade keeps it. The always-on Rules and the Ethos cannot be excluded. Picking packs and rules is covered in [Doctrine packs and single rules](../guides/setup-doctrines.md); what the layers are is in [Rules](rules.md).
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  group: concepts
3
- order: 8
3
+ order: 10
4
4
  title: "Footprint (lean vs full)"
5
5
  kind: "concept"
6
+ section: "Configuration"
7
+ description: "Lean or full: how much of the constitution rides inline every turn."
6
8
  link: {"hash": "#/settings", "label": "Toggle it in Settings →"}
7
9
  ---
8
10
  **Footprint** decides how much of the [constitution](rules.md) the agent carries *inline* in its instructions file on every turn. It has two settings, **lean** (the default) and **full**, chosen per install. It is a token-cost dial, not a rules dial: every rule the install adopted is in force at either setting.
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  group: concepts
3
- order: 10
3
+ order: 15
4
4
  title: "Foreman mode"
5
5
  kind: "concept"
6
+ section: "Working together"
7
+ description: "Direct or foreman: whether the session does the work or hands it to a crew."
6
8
  link: {"hash": "#/harness", "label": "Set the mode in Harness →"}
7
9
  ---
8
10
  **Mode** decides how work gets executed in a session. Two modes ship: **direct**, the default, where the agent does every task itself, and **foreman**, where the session hands substantial tasks to a crew of [agents](agents.md) and keeps talking to you while they work.