geneseed 3.10.0 → 3.11.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 (186) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/DESIGN.md +1 -1
  3. package/README.md +26 -44
  4. package/SHIPPED.md +2 -2
  5. package/adapters/bob/README.md +1 -1
  6. package/adapters/claude-code/README.md +17 -12
  7. package/adapters/openclaude/README.md +1 -1
  8. package/adapters/opencode/README.md +4 -4
  9. package/bin/build-driver.mjs +2 -0
  10. package/bin/geneseed-cli.mjs +17 -0
  11. package/bin/geneseed-hook.mjs +2 -0
  12. package/docs/README.md +42 -0
  13. package/docs/_groups.json +18 -0
  14. package/docs/concepts/agents.md +44 -0
  15. package/docs/concepts/collaboration.md +62 -0
  16. package/docs/concepts/exclusions.md +55 -0
  17. package/docs/concepts/footprint.md +52 -0
  18. package/docs/concepts/foreman-mode.md +69 -0
  19. package/docs/concepts/hooks.md +101 -0
  20. package/docs/concepts/hosts.md +55 -0
  21. package/docs/concepts/lsp.md +50 -0
  22. package/docs/{web → concepts}/memory.md +2 -2
  23. package/docs/{web → concepts}/notebook.md +2 -2
  24. package/docs/concepts/rules.md +52 -0
  25. package/docs/concepts/skills.md +49 -0
  26. package/docs/concepts/themes.md +50 -0
  27. package/docs/extending.md +27 -21
  28. package/docs/guides/autostart.md +70 -0
  29. package/docs/guides/choose-your-setup.md +120 -0
  30. package/docs/guides/headless.md +22 -0
  31. package/docs/guides/install.md +161 -0
  32. package/docs/guides/mcp.md +195 -0
  33. package/docs/guides/migrate.md +41 -0
  34. package/docs/guides/project-context.md +87 -0
  35. package/docs/guides/run-anywhere.md +45 -0
  36. package/docs/guides/uninstall.md +51 -0
  37. package/docs/guides/upgrade.md +65 -0
  38. package/docs/guides/verify.md +65 -0
  39. package/docs/guides/wiki.md +69 -0
  40. package/docs/guides/worktree.md +47 -0
  41. package/docs/reference/about.md +7 -0
  42. package/docs/reference/cli.md +7 -0
  43. package/docs/reference/environment.md +99 -0
  44. package/docs/reference/glossary.md +33 -0
  45. package/docs/reference/opencode-plugins.md +131 -0
  46. package/docs/reference/troubleshooting.md +350 -0
  47. package/docs/understand/a-day.md +77 -0
  48. package/docs/understand/enforced-vs-asked.md +64 -0
  49. package/docs/understand/harness.md +36 -0
  50. package/docs/understand/on-your-machine.md +76 -0
  51. package/docs/web-ui.md +1 -1
  52. package/harness.config.json +1 -1
  53. package/js/README.md +3 -2
  54. package/js/build/generate.mjs +12 -1
  55. package/js/build/source.mjs +6 -0
  56. package/js/cli-table.json +1 -1
  57. package/js/hosts/mcp.mjs +1 -1
  58. package/js/hosts/settings.mjs +13 -1
  59. package/js/inspect/checks-authoring.mjs +5 -3
  60. package/js/inspect/doctor.mjs +1 -1
  61. package/js/inspect/inventory.mjs +1 -1
  62. package/js/inspect/registry.mjs +20 -3
  63. package/js/inspect/status.mjs +7 -2
  64. package/js/lib/node-floor.mjs +30 -0
  65. package/js/maintain/setup.mjs +109 -21
  66. package/js/maintain/update.mjs +4 -15
  67. package/js/ui/cli.mjs +2 -2
  68. package/js/web/api.mjs +3 -0
  69. package/js/web/daemon.mjs +52 -0
  70. package/js/web/docs.mjs +149 -65
  71. package/js/web/server.mjs +5 -2
  72. package/package.json +6 -4
  73. package/registry.json +7 -0
  74. package/src/AGENT.md.tmpl +4 -0
  75. package/src/postures/mentor.md +1 -0
  76. package/src/skills/learn-mode.md +89 -0
  77. package/src/skills/pipeline.md +2 -2
  78. package/src/skills/quiz.md +2 -1
  79. package/src/skills/teach.md +2 -1
  80. package/themes/_TEMPLATE.json +1 -0
  81. package/themes/biker.json +1 -0
  82. package/themes/commentator.json +1 -0
  83. package/themes/cyberpunk.json +1 -0
  84. package/themes/gamer.json +1 -0
  85. package/themes/imperial.json +1 -0
  86. package/themes/joker.json +1 -0
  87. package/themes/marvin.json +1 -0
  88. package/themes/mean.json +1 -0
  89. package/themes/military.json +1 -0
  90. package/themes/neutral.json +1 -0
  91. package/themes/pirate.json +1 -0
  92. package/themes/sports.json +1 -0
  93. package/themes/verstappen.json +1 -0
  94. package/themes/wizard.json +1 -0
  95. package/web/dist/assets/Activity-C52LEb-2.js +1 -0
  96. package/web/dist/assets/ActivityDetail-CjNLRvXg.js +1 -0
  97. package/web/dist/assets/Dashboard-B6_sSCHi.js +2 -0
  98. package/web/dist/assets/Docs-Dj7BmCSA.js +5 -0
  99. package/web/dist/assets/{GreenhouseView-D0cbCJ5m.js → GreenhouseView-BALwjQsA.js} +1 -1
  100. package/web/dist/assets/Installs-BbffDQm3.js +2 -0
  101. package/web/dist/assets/JournalView-JpAQ8Hqe.js +1 -0
  102. package/web/dist/assets/Laws-DK7eCWSm.js +3 -0
  103. package/web/dist/assets/Library-CoamHelE.js +1 -0
  104. package/web/dist/assets/{Markdown-CkFyfgNf.js → Markdown-qjM2_ofS.js} +5 -5
  105. package/web/dist/assets/{OperatorHudView-CiAkAkQL.js → OperatorHudView-DVx1HlBx.js} +1 -1
  106. package/web/dist/assets/Personal-eaXb1zcj.js +1 -0
  107. package/web/dist/assets/{Tabs-B4HNrrCs.js → Tabs-BmGtt8E2.js} +1 -1
  108. package/web/dist/assets/api-Dc8f3ca-.js +1 -0
  109. package/web/dist/assets/drawable-Du_PZrQj.js +1 -0
  110. package/web/dist/assets/index-Bz_KMRDH.css +1 -0
  111. package/web/dist/assets/index-CNFH7o55.js +2 -0
  112. package/web/dist/index.html +3 -2
  113. package/QUICKSTART.md +0 -50
  114. package/SETUP.md +0 -1148
  115. package/docs/web/_groups.json +0 -45
  116. package/docs/web/about.md +0 -6
  117. package/docs/web/adapters-claude-code.md +0 -8
  118. package/docs/web/adapters-opencode-loads.md +0 -8
  119. package/docs/web/adapters-opencode-spec.md +0 -8
  120. package/docs/web/adapters-opencode.md +0 -8
  121. package/docs/web/agents.md +0 -8
  122. package/docs/web/authoring.md +0 -11
  123. package/docs/web/autostart.md +0 -9
  124. package/docs/web/claude-hooks.md +0 -37
  125. package/docs/web/cli.md +0 -6
  126. package/docs/web/collaboration.md +0 -27
  127. package/docs/web/configure-wiki.md +0 -9
  128. package/docs/web/design.md +0 -7
  129. package/docs/web/env-knobs.md +0 -9
  130. package/docs/web/exclusions.md +0 -26
  131. package/docs/web/first-session.md +0 -28
  132. package/docs/web/footprint.md +0 -38
  133. package/docs/web/foreman-mode.md +0 -33
  134. package/docs/web/glossary.md +0 -6
  135. package/docs/web/harnesses.md +0 -30
  136. package/docs/web/headless.md +0 -9
  137. package/docs/web/ingest-docs.md +0 -9
  138. package/docs/web/install-paths.md +0 -9
  139. package/docs/web/install-quick.md +0 -35
  140. package/docs/web/lsp-overview.md +0 -37
  141. package/docs/web/mcp-claude-code.md +0 -10
  142. package/docs/web/mcp-filesystem.md +0 -9
  143. package/docs/web/mcp-gitlab.md +0 -9
  144. package/docs/web/mcp-markitdown.md +0 -9
  145. package/docs/web/mcp-overview.md +0 -34
  146. package/docs/web/mcp-trouble.md +0 -9
  147. package/docs/web/mcp-verify.md +0 -9
  148. package/docs/web/migrate.md +0 -39
  149. package/docs/web/model.md +0 -20
  150. package/docs/web/pipelines.md +0 -24
  151. package/docs/web/plugin-activity.md +0 -23
  152. package/docs/web/plugin-context.md +0 -26
  153. package/docs/web/plugin-guard.md +0 -24
  154. package/docs/web/plugin-learn.md +0 -27
  155. package/docs/web/plugin-notify.md +0 -24
  156. package/docs/web/plugin-ponytail.md +0 -23
  157. package/docs/web/plugin-setup.md +0 -7
  158. package/docs/web/plugin-workflow.md +0 -25
  159. package/docs/web/plugins.md +0 -17
  160. package/docs/web/project-context.md +0 -9
  161. package/docs/web/rules.md +0 -30
  162. package/docs/web/run-anywhere.md +0 -9
  163. package/docs/web/self-improve.md +0 -8
  164. package/docs/web/setup-choices.md +0 -64
  165. package/docs/web/skills.md +0 -8
  166. package/docs/web/themes-author.md +0 -20
  167. package/docs/web/themes.md +0 -9
  168. package/docs/web/token-footprint.md +0 -7
  169. package/docs/web/trouble.md +0 -38
  170. package/docs/web/upgrade.md +0 -9
  171. package/docs/web/verify.md +0 -30
  172. package/docs/web/wiki.md +0 -7
  173. package/docs/web/worktree.md +0 -10
  174. package/docs/wiki.md +0 -43
  175. package/web/dist/assets/Activity-BjVp522q.js +0 -1
  176. package/web/dist/assets/ActivityDetail-8ep1bspW.js +0 -1
  177. package/web/dist/assets/Dashboard-OkC_PCH6.js +0 -2
  178. package/web/dist/assets/Docs-CKPWz00o.js +0 -2
  179. package/web/dist/assets/Installs-BtGGdoTt.js +0 -2
  180. package/web/dist/assets/JournalView-Ckl4dmzR.js +0 -1
  181. package/web/dist/assets/Laws-CLpdRRk8.js +0 -3
  182. package/web/dist/assets/Library-wPPuKQrI.js +0 -1
  183. package/web/dist/assets/Personal-D8CnDo9v.js +0 -1
  184. package/web/dist/assets/drawable-BiwaOo6x.js +0 -1
  185. package/web/dist/assets/index-C1yil5j1.js +0 -2
  186. package/web/dist/assets/index-CDPDk2vj.css +0 -1
@@ -0,0 +1,350 @@
1
+ ---
2
+ group: reference
3
+ order: 4
4
+ title: "Troubleshooting"
5
+ kind: "concept"
6
+ ---
7
+ Find what you are seeing below. Each entry gives the likely cause, the fix, and how to confirm it worked. Messages in quotes are what Geneseed actually prints.
8
+
9
+ First stop for almost anything: `geneseed doctor`. It renders the harness into a temp directory and reports every problem it finds without touching your install.
10
+
11
+ ```bash
12
+ geneseed doctor
13
+ ```
14
+
15
+ ## Installing
16
+
17
+ ### `Node.js not found` or `Node vX is too old`
18
+
19
+ The one-step installer (`./install`, `install.cmd`, `install.command`) checks Node first and stops:
20
+
21
+ > `xx Node v20.11.0 is too old — Geneseed needs 22.3 or newer.`
22
+
23
+ **Cause.** No Node on PATH, or an older one — Linux distribution packages are often behind.
24
+
25
+ **Fix.** Install the current Node.js LTS from <https://nodejs.org/> (macOS: `brew install node`; Linux: nvm or NodeSource). Open a **new** terminal, then run the installer again.
26
+
27
+ **Confirm.**
28
+
29
+ ```bash
30
+ node --version
31
+ ```
32
+
33
+ prints 22.3 or newer, and the installer's first line reads `ok Node v…`.
34
+
35
+ ### `geneseed needs Node 22.3 or newer`
36
+
37
+ Run without the installer — `npx geneseed`, a global npm install, or a hook — on an older Node, every Geneseed command stops with one sentence:
38
+
39
+ > `geneseed needs Node 22.3 or newer; this is Node 20.18.1. Install a current Node from https://nodejs.org (or your package manager), then run the command again.`
40
+
41
+ **Cause.** The `node` on PATH is older than 22.3. npm only *warns* about the engine requirement, so a global install succeeds anyway. A hook prints the same sentence and lets the tool call through rather than block it, so on Claude Code, Bob or OpenClaude the hooks are off until Node is upgraded.
42
+
43
+ **Fix.** Install the current Node.js LTS (see above), open a **new** terminal, and run the command again.
44
+
45
+ **Confirm.** `geneseed version` prints the version instead of the sentence.
46
+
47
+ ### `setup` says it needs an interactive terminal
48
+
49
+ > `[setup] needs an interactive terminal. Non-interactive? e.g.:`
50
+ > ` geneseed build --emit opencode-global --theme neutral`
51
+
52
+ **Cause.** `geneseed setup` is a wizard and refuses to run when its input is not a terminal — in CI, through a pipe, or from a tool that runs commands without a TTY.
53
+
54
+ **Fix.** Run it from a real terminal, or skip the wizard and build directly with the flags it would have asked for:
55
+
56
+ ```bash
57
+ geneseed build --emit opencode-global --theme neutral
58
+ ```
59
+
60
+ See [Install](../guides/install.md) for the emit target that matches your tool.
61
+
62
+ **Confirm.** `geneseed status` lists the install.
63
+
64
+ ### `setup` lists a tool as missing — or present — when it isn't
65
+
66
+ Setup opens with `AI coding tools on this machine:` and an `ok` or `--` per tool.
67
+
68
+ **Cause.** The check only asks whether the command (`opencode`, `claude`, `bob`, `openclaude`) is on your PATH. A desktop-only install with no command shows as missing; an unrelated program with the same name shows as present.
69
+
70
+ **Fix.** Nothing to fix — the line is advisory. Pick the install mode for the tool you actually use; a missing tool among several present is just a line, and you can continue without one.
71
+
72
+ **Confirm.** Open the tool and check for the readiness sigil (see "The agent never shows the readiness sigil" below).
73
+
74
+ ### `Java 21+ (jdtls) missing`
75
+
76
+ Shown in setup's summary for OpenCode installs:
77
+
78
+ > `Java 21+ (jdtls) missing — install a JDK 21+ — e.g. brew install openjdk@21, SDKMAN sdk install java 21-tem, or your distro's package`
79
+
80
+ **Cause.** OpenCode's Java language server needs a JDK 21 or newer, and it is the one language server OpenCode cannot download for you. See [LSP](../concepts/lsp.md).
81
+
82
+ **Fix.** Install a JDK 21+ if you work in Java; ignore the line otherwise. Everything else works without it.
83
+
84
+ **Confirm.**
85
+
86
+ ```bash
87
+ java -version
88
+ ```
89
+
90
+ reports `version "21` or higher.
91
+
92
+ ### `geneseed: command not found`
93
+
94
+ **Cause.** The `geneseed` launcher is not on your PATH. A git clone is not put there automatically (an `npm install -g geneseed` install is).
95
+
96
+ **Fix.** From the cloned folder:
97
+
98
+ ```bash
99
+ ./geneseed link
100
+ ```
101
+
102
+ ```bat
103
+ .\geneseed.cmd link
104
+ ```
105
+
106
+ On Windows, `link` writes to `%LOCALAPPDATA%\Geneseed\bin` and adds it to your user PATH — only **new** terminals see it, so close and reopen yours.
107
+
108
+ **Confirm.**
109
+
110
+ ```bash
111
+ geneseed version
112
+ ```
113
+
114
+ works from any directory. See [Run anywhere](../guides/run-anywhere.md).
115
+
116
+ ## Hooks, context and memory
117
+
118
+ ### Hooks stopped firing
119
+
120
+ The agent loads its rules, but nothing is enforced and no memory is written — on Claude Code, Bob or OpenClaude.
121
+
122
+ Every `geneseed` command now says so first, on stderr:
123
+
124
+ > `[geneseed] ⚠ hooks are off on this machine: the hook shim points at <path>, which no longer exists. Fix: geneseed rebuild-all`
125
+
126
+ and the `gates` row of `geneseed status` reads `DEAD — hook shim points at <path>; run: geneseed rebuild-all`. A script that must not see the line can set `GENESEED_NO_SHIM_CHECK=1`.
127
+
128
+ **Cause.** Almost always a **stale hook shim**. Your tool's settings call `geneseed-hook` through one small script, `~/.geneseed/bin/geneseed-hook` (`geneseed-hook.cmd` on Windows), which holds the absolute path of your Geneseed folder. Move or delete that folder and the shim points at nothing: the hooks still fire, fail, and every gate goes silently dead. `geneseed doctor` reports it as:
129
+
130
+ > `[shim] <path> pointed at <old path>, which does not exist — every hook in every install was dead (the checkout most likely moved).`
131
+
132
+ **Fix.** Re-emit from where Geneseed lives now — any build rewrites the shim:
133
+
134
+ ```bash
135
+ geneseed rebuild-all
136
+ ```
137
+
138
+ If you moved the shim itself with `GENESEED_HOME`, set it the same way before rebuilding.
139
+
140
+ **Confirm.** `geneseed doctor` prints no `[shim]` line, and a new session opens with the readiness sigil and your project docs in context.
141
+
142
+ ### The agent never shows the readiness sigil
143
+
144
+ The first reply of a session should open with the readiness sigil (`✅` in the neutral theme) — the agent's sign that it loaded the harness.
145
+
146
+ **Cause.** The tool is not loading the root file. On OpenCode, `opencode.json` `instructions` does not point at `AGENT.md`; on another tool, its rules setting does not.
147
+
148
+ **Fix.** Rebuild the install so its config is merged again:
149
+
150
+ ```bash
151
+ geneseed rebuild-all
152
+ ```
153
+
154
+ For a tool Geneseed does not wire itself, point its rules setting at the bundle's `AGENT.md`.
155
+
156
+ **Confirm.** Start a **new** session; the first reply opens with the sigil. See [Verify](../guides/verify.md).
157
+
158
+ <!--harness:opencode-->
159
+ *(OpenCode only)*
160
+
161
+ ### The agent doesn't load my project docs
162
+
163
+ **Cause.** The `geneseed-context` plugin is not in OpenCode's plugins directory, or injection is switched off (`GENESEED_CONTEXT_INJECT=off`).
164
+
165
+ **Fix.**
166
+
167
+ ```bash
168
+ geneseed build --emit opencode-global
169
+ ```
170
+
171
+ and unset `GENESEED_CONTEXT_INJECT`.
172
+
173
+ **Confirm.** `ls ~/.config/opencode/plugins/` shows the `geneseed-*.js` files, and a session started with `GENESEED_DEBUG=1` logs what the plugin discovered. See [OpenCode plugins](opencode-plugins.md).
174
+
175
+ ### `PROJECT CONTEXT` appears twice
176
+
177
+ **Cause.** Two copies of the context plugin — the global one and a leftover `.opencode/plugins/` in the repo. OpenCode loads both.
178
+
179
+ **Fix.** Delete the project copy (`.opencode/plugins/geneseed-context.js`), or uninstall the project-scoped install.
180
+
181
+ **Confirm.** A new session shows the block at most once.
182
+
183
+ ### The full `PROJECT CONTEXT` block shows in the terminal
184
+
185
+ **Cause.** Either `GENESEED_CONTEXT_VISIBLE=1` (or legacy `GENESEED_CONTEXT_TRANSFORM=0`) is set, or your OpenCode build lacks the experimental hook for invisible delivery and the plugin fell back to the visible block.
186
+
187
+ **Fix.** Unset the variable. If it still shows, your OpenCode build is the reason — update OpenCode, or live with the visible block; the context is the same.
188
+
189
+ **Confirm.** Run with `GENESEED_DEBUG=1`; the plugin's log says which delivery it used.
190
+
191
+ ### No memory is written after a session
192
+
193
+ **Cause.** The learn plugin found no memory directory, or it did not load.
194
+
195
+ **Fix.** Pin the store, then restart OpenCode:
196
+
197
+ ```bash
198
+ export GENESEED_HARNESS=~/.config/opencode
199
+ ```
200
+
201
+ (or `GENESEED_MEMORY` for an explicit directory), and confirm the `geneseed-*.js` files are in the plugins dir.
202
+
203
+ **Confirm.** About a minute after the session goes quiet, stderr shows `[geneseed-learn] wrote N memory file(s): …` or a `skipped:` reason. Total silence means the plugin did not load.
204
+ <!--/harness-->
205
+
206
+ ### `could not determine a model`
207
+
208
+ **Cause.** The learn step could not read which model the session used.
209
+
210
+ **Fix.** Give it a fallback:
211
+
212
+ ```bash
213
+ export GENESEED_MODEL=provider/model
214
+ ```
215
+
216
+ **Confirm.** The next session end writes memory instead of logging the message.
217
+
218
+ ### A read-only agent won't run a command
219
+
220
+ **Cause.** By design: read-only agents are denied the shell. The few that must run read-only commands (the reviewer, security) are allowed it in their own spec.
221
+
222
+ **Fix.** Hand the task to an agent that can run commands, or run it yourself. See [Agents](../concepts/agents.md).
223
+
224
+ ### PDFs and Office documents are ignored
225
+
226
+ **Cause.** Agents read text. Binary documents need converting first.
227
+
228
+ **Fix.** Use the `ingest` skill with a converter installed (MarkItDown, Pandoc or Docling), or wire MarkItDown as an MCP server — see [MCP servers](../guides/mcp.md).
229
+
230
+ ### An MCP server is listed but won't connect
231
+
232
+ See [MCP servers](../guides/mcp.md) — each server has its own checks there.
233
+
234
+ ## Updating
235
+
236
+ ### `geneseed upgrade` refuses to run
237
+
238
+ The upgrade is a `git pull`, so it first checks the folder. Each refusal says what to do:
239
+
240
+ | Message | Fix |
241
+ | --- | --- |
242
+ | `git is not installed or not on PATH — install git to enable updates.` | Install git, open a new terminal, retry. |
243
+ | ``This Geneseed install isn't a git checkout — update it with `npm install -g geneseed@latest`, or re-clone it with git.`` | Use the npm command for an npm install; otherwise re-clone (`git clone https://github.com/Arylmera/Geneseed.git`). |
244
+ | `You have local changes in the Geneseed folder. Commit or stash them, then update.` | `git stash` in the Geneseed folder, upgrade, then `git stash pop`. |
245
+ | ``HEAD is detached (a tag/commit is checked out). Run `git checkout <branch>` to re-enable updates.`` | `git checkout main`. |
246
+ | ``Your branch has no upstream — set one with `git branch --set-upstream-to`.`` | `git branch --set-upstream-to=origin/main`. |
247
+
248
+ **Confirm.** `geneseed upgrade` completes and `geneseed version` shows the new version. See [Upgrade](../guides/upgrade.md).
249
+
250
+ ## Doctor findings
251
+
252
+ ### `unresolved token … in …`
253
+
254
+ **Cause.** A theme JSON lacks a key the templates use — usually a custom theme that fell behind.
255
+
256
+ **Fix.** Compare it with `themes/neutral.json`: every key there must exist in your theme. Then re-render:
257
+
258
+ ```bash
259
+ geneseed build --theme <yours>
260
+ ```
261
+
262
+ **Confirm.** `geneseed doctor --theme <yours>` is clean.
263
+
264
+ ### A committed `Harness/` bundle drifted from `src/`
265
+
266
+ **Cause.** A bundle committed to a repo was rendered from an older `src/`, or was edited in place.
267
+
268
+ **Fix.** Re-render and commit it:
269
+
270
+ ```bash
271
+ geneseed build
272
+ git add Harness
273
+ ```
274
+
275
+ If the drift is your own edits, export them first — `geneseed diff` (or the console's **Changes** page) writes them up so they can be folded back into `src/`.
276
+
277
+ **Confirm.** `geneseed doctor` no longer reports the bundle.
278
+
279
+ ### `registry.json unreadable` / `registry.json is not valid JSON`
280
+
281
+ > `[authoring] registry.json unreadable: …`
282
+
283
+ **Cause.** The Geneseed folder's `registry.json` is missing or damaged — typically a bad merge or a hand edit. The web console stays up, but every entity's status badge reads "unknown".
284
+
285
+ **Fix.** Restore the shipped copy (this discards any local edit to that one file):
286
+
287
+ ```bash
288
+ git -C <geneseed folder> restore registry.json
289
+ ```
290
+
291
+ **Confirm.** `geneseed doctor` no longer names `registry.json`, and the badges come back.
292
+
293
+ ## Web console
294
+
295
+ ### `web/dist is missing`
296
+
297
+ > `[web] web/dist is missing. Build the UI first:`
298
+ > ` cd web && npm install && npm run build`
299
+
300
+ **Cause.** The built console ships in the repo, so this only happens on a partial checkout. On an interactive terminal `geneseed web` offers to build it for you.
301
+
302
+ **Fix.** Build it from the Geneseed folder:
303
+
304
+ ```bash
305
+ cd web && npm install && npm run build
306
+ ```
307
+
308
+ If it instead says `web/ sources are missing`, run `geneseed upgrade` (twice on an old install).
309
+
310
+ **Confirm.** `geneseed web` opens the console.
311
+
312
+ ### The console looks broken after an upgrade
313
+
314
+ Pages fail to load, or the console shows a banner: *This console is running code from before your last upgrade.* `geneseed web status` adds:
315
+
316
+ > `[web] running OLD code (started before the last upgrade) — geneseed web restart`
317
+
318
+ **Cause.** The console server serves the page it started with. An `npm install -g geneseed@latest` or a `git pull` replaces `web/dist/`, and the old page asks for files that no longer exist. `geneseed upgrade` and `geneseed rebuild-all` restart a stale console themselves; other upgrade paths do not.
319
+
320
+ **Fix.** Click **Restart** on the banner, or:
321
+
322
+ ```bash
323
+ geneseed web restart
324
+ ```
325
+
326
+ A browser refresh is not enough — the server, not the page, is out of date.
327
+
328
+ **Confirm.** `geneseed web status` prints no `OLD code` line and the banner is gone.
329
+
330
+ ### The console says `no deployed harness`
331
+
332
+ > `[web] no deployed harness at <dir>.`
333
+
334
+ **Cause.** Nothing is installed where the console looks. It still serves, read-only, with most actions disabled.
335
+
336
+ **Fix.**
337
+
338
+ ```bash
339
+ geneseed setup
340
+ ```
341
+
342
+ **Confirm.** Restart the console — `geneseed web restart` — and the warning is gone.
343
+
344
+ ### Skills or agents not tracked in git
345
+
346
+ **Cause.** A parent `.gitignore` blanket-ignores the bundle directory.
347
+
348
+ **Fix.** Remove the bare `Harness/` line from the parent `.gitignore`; the bundle's own `.gitignore` already scopes what to skip.
349
+
350
+ **Confirm.** `git status` lists the bundle's files.
@@ -0,0 +1,77 @@
1
+ ---
2
+ group: understand
3
+ order: 3
4
+ title: "A day with the harness"
5
+ kind: "concept"
6
+ ---
7
+ After the install you talk to your tool the way you always did. What changes is what the agent already knows when you start, and what happens at a few specific moments. Here are four of them.
8
+
9
+ Start with one prompt on your first day:
10
+
11
+ > *"Use the profile skill."*
12
+
13
+ The agent interviews you briefly and drafts `PROFILE.md`: your role, your stack, and whether you want terse answers or explanations. From then on every session starts with it.
14
+
15
+ ### 1. The agent tries to push
16
+
17
+ You ask the agent to clean up a branch and it decides to force-push. A gate runs before the shell does, so the command waits for you. On Claude Code it looks like this (the prompt's layout depends on your version; the reason text is Geneseed's):
18
+
19
+ ```text
20
+ ● Bash(git push --force origin feature/login)
21
+ Geneseed (Deletion Is Deliberate) — a history-rewriting or discarding git act
22
+ needs confirmation bound to this specific command
23
+ Do you want to proceed? Yes / No
24
+ ```
25
+
26
+ An ordinary `git commit` or `git push` gets a milder question when the **process** pack is on: *"Geneseed (Consent Before Push) — every git commit/push needs explicit approval; to see the change first, use the explain-changes skill"*. If you answer no, the command does not run, however the model phrased its reasoning.
27
+
28
+ Bob has no prompt, so the same force-push is refused outright:
29
+
30
+ ```text
31
+ [geneseed] BLOCKED: Geneseed (Deletion Is Deliberate) — a history-rewriting or discarding git act needs confirmation bound to this specific command
32
+ ```
33
+
34
+ On OpenCode the question comes from OpenCode's own permission prompt, which Geneseed configures in `opencode.json`. Every catch goes into a log, and `geneseed status` counts the catches by rule.
35
+
36
+ ### 2. You call a skill by name
37
+
38
+ A **skill** is a written procedure the agent follows step by step. You call it in plain English:
39
+
40
+ > *"Use the brainstorm skill on this feature request."*
41
+
42
+ The agent loads the skill's full text only now. Until then it carried just the skill's name and one-line description. `brainstorm` turns a raw idea into a design you approve before any code is written. Skills chain together: *"Use brainstorm, then plan, for how to add rate limiting."*
43
+
44
+ ### 3. You hand work to a specialist
45
+
46
+ An **agent** is a specialist with a narrow job and its own instructions. The main agent delegates to it:
47
+
48
+ > *"Delegate to the reviewer agent on the staged diff."*
49
+
50
+ The reviewer reads the change, runs the tests, and comes back with findings ordered correctness-first, each pointing at a `file:line`. It ends with a one-line verdict: ship, fix-then-ship, or block. The reviewer only reads; it does not edit your code.
51
+
52
+ ### 4. The session teaches the next one
53
+
54
+ When a session winds down, the **learn** step reads the conversation and keeps what is worth remembering. On OpenCode this happens by itself, with the model the session already uses. On Claude Code it is off until you set `GENESEED_LLM` to a model command, for example `claude -p`.
55
+
56
+ A new file appears in the install's `memory/` folder:
57
+
58
+ ```markdown
59
+ ---
60
+ name: integration-tests-need-docker
61
+ description: the integration suite needs a running Docker daemon
62
+ type: project
63
+ ---
64
+ The integration tests start Postgres in a container; run `docker info` before the suite.
65
+ ```
66
+
67
+ and one line is added to `memory/MEMORY.md`:
68
+
69
+ ```markdown
70
+ - [integration-tests-need-docker](integration-tests-need-docker.md) — the integration suite needs a running Docker daemon
71
+ ```
72
+
73
+ Next session, that index is in front of the agent before your first message. Memory stays on your machine. `geneseed memory list` shows every fact and `geneseed memory rm <name>` removes one.
74
+
75
+ ---
76
+
77
+ **Next:** [Enforced vs. asked](enforced-vs-asked.md)
@@ -0,0 +1,64 @@
1
+ ---
2
+ group: understand
3
+ order: 4
4
+ title: "Enforced vs. asked"
5
+ kind: "concept"
6
+ ---
7
+ Geneseed gives your agent two kinds of instruction, and it matters which kind you are relying on.
8
+
9
+ - **Enforced.** A hook (Claude Code, Bob, OpenClaude) or a plugin (OpenCode) runs *before* the action, looks at the command or the file about to be written, and can stop it. The model cannot talk its way past it: the check is code, not a request.
10
+ - **Asked.** Text in the root rules file (`CLAUDE.md`, `AGENT.md`, `AGENTS.md`). The model reads it every session and usually follows it. Nothing guarantees it.
11
+
12
+ > **You already know this:** a failing CI check versus a line in `CONTRIBUTING.md`. Both say "do not merge untested code". Only one of them actually blocks the merge.
13
+
14
+ Most of the harness is *asked*. A few rules, where one mistake is expensive and the bad action is easy to recognise, are also *enforced*.
15
+
16
+ ### What is enforced, per host
17
+
18
+ <!--harness:claude-->
19
+ *(Claude Code only)*
20
+
21
+ On Claude Code and OpenClaude the hooks never block silently. They make the host **ask you**, with the reason shown:
22
+
23
+ - **Destructive git**: a force-push, `reset --hard`, `clean -f`, `branch -D` or `checkout --`. Wired in every build.
24
+ - **Commit and push**: every `git commit` and `git push`, including chained one-liners and `git -C <path>`. This question belongs to the **process** pack. Build without it and the git gate stays wired. Only this question goes away, and destructive git is still caught.
25
+ - **Credentials**: a write or edit whose content looks like a real key (AWS, GitHub, Anthropic, Slack, or a private-key block), anywhere except a `.env` file.
26
+ - **Your rules and memory**: any write by the agent to `user-rules.md` or to the memory store. Whether something is a standing rule or a fact to remember is your call.
27
+
28
+ If a gate crashes, it asks instead of letting the call through. Other shell commands, `rm -rf` included, go through Claude Code's normal permission flow.
29
+
30
+ **Bob** runs one combined gate and has no "ask": it refuses with exit code 2, and only for two rules: credentials and destructive git. The commit/push and memory checks become a log line, and the call goes through. Bob's hook wiring follows its documentation but has not been tested on a live Bob install.
31
+
32
+ <!--/harness-->
33
+ <!--harness:opencode-->
34
+ *(OpenCode only)*
35
+
36
+ On OpenCode, two mechanisms enforce rules:
37
+
38
+ - **OpenCode's own permission prompt**, which Geneseed configures in `opencode.json`. It asks you before `rm -rf`, a force-push, `reset --hard`, `clean -f`, `branch -D` and `checkout --`, and, when the **process** pack is on, before every commit and push.
39
+ - **The guard plugin**, which blocks outright: writes to key and credential files (`id_rsa`, `*.pem`, `.ssh/`, `.npmrc`…), catastrophic commands (`rm -rf /`, `rm -rf ~`, formatting or overwriting a disk), and any change inside a folder your wiki marks `protected`. It also refuses the first write to `user-rules.md` or memory once. Re-issue the write and it goes through.
40
+
41
+ The guard only warns on `.env` edits. It checks credentials by **file path**, not by content, so a key pasted into an ordinary source file is not caught here. One caveat about the process pack: if your `opencode.json` already has a `git commit*` entry, a rebuild without the pack leaves that entry in place and reports it. Geneseed cannot tell its own entry from one you typed.
42
+
43
+ <!--/harness-->
44
+
45
+ **Protected wiki folders** are blocked only on OpenCode. On Claude Code, Bob and OpenClaude they are an instruction the model reads. A **plain bundle** installs no hooks or plugins, so everything in it is asked.
46
+
47
+ Everything else, from "verify before you claim it works" to every practice in the doctrine packs, is asked on every host. In a folder you exclude with `geneseed exclude add <folder>`, the gates stand down too.
48
+
49
+ ### Why not enforce everything
50
+
51
+ A gate sees one tool call: a command string, or a file path and its content. It cannot see whether the agent read the docs, checked its claim, or planned before acting. Most rules are about judgement, and no pattern can check judgement.
52
+
53
+ The patterns that do exist are deliberately narrow. A gate that fired on every hash or lockfile would get allow-listed within a day and then protect nothing. A narrow gate that fires rarely stays switched on. Each gate also costs about 14 ms per tool call, on every call.
54
+
55
+ ### What the harness does not do
56
+
57
+ - **It does not make the model smarter.** It gives the same model better instructions and a few guard rails.
58
+ - **It does not check facts.** The rules tell the agent to verify before asserting. Nothing confirms that it did.
59
+ - **It does not review code on its own.** The reviewer agent runs when you or the agent ask for it, not on every change.
60
+ - **It is not a sandbox.** A destructive command that matches no pattern runs like any other. Your host's own permission settings still apply on top.
61
+
62
+ ---
63
+
64
+ **Where next:** [Install it](../guides/install.md) · [The rules in detail](../concepts/rules.md) · [Glossary](../reference/glossary.md)
@@ -0,0 +1,36 @@
1
+ ---
2
+ group: understand
3
+ order: 1
4
+ title: "What a harness is"
5
+ kind: "concept"
6
+ ---
7
+ Your coding agent starts every session knowing nothing about how you work. It does not know that you never push without looking at the diff first, that secrets live in `.env`, or that this repo's docs explain the build. You tell it again, or it guesses.
8
+
9
+ The usual fix is a `CLAUDE.md` or `AGENTS.md`: a page of instructions the tool loads at the start of each session. That helps, but it has two weaknesses. It is prose, so the model reads it and usually follows it, but nothing makes it. And you copy it into every repo, where each copy slowly drifts from the others.
10
+
11
+ A **harness** is everything around the model that shapes how it works: the instructions it loads, the specialists it can hand work to, the routines it can follow, what it remembers between sessions, and the checks that run before it acts. Every Geneseed term is defined in the [glossary](../reference/glossary.md).
12
+
13
+ > **You already know this:** git hooks, CI, and a team runbook, but for the agent. The runbook says how work is done. The hooks and CI stop the mistakes that matter before they land.
14
+
15
+ ### What Geneseed is
16
+
17
+ Geneseed is a build that produces a harness. One source renders:
18
+
19
+ - **the rules**: a short set of rules the agent always follows, plus practice packs you choose ([Rules](../concepts/rules.md));
20
+ - **agents**: specialists such as a reviewer or a tester that the main agent can delegate to ([Agents](../concepts/agents.md));
21
+ - **skills**: written procedures you call by name, such as `brainstorm` or `plan` ([Skills](../concepts/skills.md));
22
+ - **a memory convention**: one fact per file, kept on your machine between sessions ([Memory](../concepts/memory.md)).
23
+
24
+ It renders them for OpenCode, Claude Code, Bob, OpenClaude, or as a plain bundle for any tool that reads `AGENT.md`. The content is the same on every host. Only the wiring differs.
25
+
26
+ Where the host lets it, Geneseed also installs **gates**: small programs that run before a tool call and stop a few things outright, such as a force-push or a credential written into a tracked file. Those rules do not depend on the model remembering them. [Enforced vs. asked](enforced-vs-asked.md) explains which rules a gate stops and which ones the model is only told about.
27
+
28
+ ### Install once, use everywhere
29
+
30
+ You install it once, at the user level, and every repo you open inherits it. There is nothing to copy into each project. When the source changes, you rebuild and every install picks up the change, so no copy drifts.
31
+
32
+ The name comes from Warhammer 40,000, where gene-seed is implanted once and the rest grows from it. That is the only lore you need. The default theme is neutral.
33
+
34
+ ---
35
+
36
+ **Next:** [What lands on your machine](on-your-machine.md)
@@ -0,0 +1,76 @@
1
+ ---
2
+ group: understand
3
+ order: 2
4
+ title: "What lands on your machine"
5
+ kind: "map"
6
+ ---
7
+ An install writes a handful of files into your host's config folder and, where the host allows it, wires small programs that run at fixed moments: when a session starts, before a tool call, when a session ends. Everything below says what each piece does for you, when it runs, what it costs, and how to turn it off. The **Kind** column uses four words:
8
+
9
+ - **enforced**: code runs before the action and can stop it. The model cannot argue past it.
10
+ - **automatic**: runs by itself at a fixed moment, such as session start or session end.
11
+ - **asked**: text the model reads every session. It usually follows it, but nothing makes it.
12
+ - **on demand**: loads only when you or the agent call it by name.
13
+
14
+ Token costs are for the default *lean* footprint. Before you type anything, a session carries about 12k tokens of harness. That is roughly 6% of a 200k window. A `--footprint full` build adds about 5k on the rules file. For a live figure on your own install, ask the agent to use the `token-report` skill.
15
+
16
+ <!--harness:claude-->
17
+ *(Claude Code only)*
18
+
19
+ | Piece | What it does for you | Kind | Cost | Turn it off |
20
+ |---|---|---|---|---|
21
+ | `CLAUDE.md` (managed block) | The rules, the pointers to agents and skills, and how memory works. Geneseed writes only its own block; your own lines in the file stay | asked | ~7.2k tokens every session | Shrink it with fewer doctrine packs (`--doctrines`); remove it with `geneseed uninstall` |
22
+ | `user-rules.md` | Your own standing rules, read every session. Seeded empty | asked | 0 until you write in it | Leave it empty |
23
+ | `PROFILE.md` | Who you are and how you like answers pitched. Fill it with the `profile` skill | asked | 0 until you fill it | Leave the seeded text untouched |
24
+ | context hook | At session start, and again after a resume or compaction, puts your repo's README, CONTRIBUTING and a listing of `docs/` in front of the agent, with your rules, profile, memory index and wiki | automatic | Your docs, capped at 16 KB a file and 48 KB a session | `geneseed exclude add <folder>` silences every hook in that folder |
25
+ | git-gate hook | Before each shell command: asks you before any `git commit` or `git push`, and before a force-push, `reset --hard`, `clean -f`, `branch -D` or `checkout --` | enforced | ~14 ms per shell call | The commit/push question goes away if you build without the **process** pack; the destructive-git question has no switch except `geneseed exclude` |
26
+ | rule-gate hook | Before each write or edit: asks you when the file would carry a credential-shaped string (outside `.env`), or when the agent writes to `user-rules.md` or memory | enforced | ~14 ms per write | `geneseed exclude add <folder>` |
27
+ | learn hook | When the agent finishes a reply, and before compaction, distils durable facts from the recent conversation into `memory/`. Off until you set `GENESEED_LLM` to a model command such as `claude -p` | automatic | One model call each time it runs, once enabled | Leave `GENESEED_LLM` unset (the default) |
28
+ | `skills/` | Written procedures you call by name, such as `brainstorm` or `plan` | on demand | ~4.1k tokens for names and descriptions; a skill's body loads only when called | No per-skill switch; `geneseed uninstall` removes them all |
29
+ | `agents/` | Specialists the agent can delegate to, such as `reviewer` or `tester` | on demand | ~0.5k tokens | `geneseed uninstall` |
30
+ | `memory/` | Durable facts, one per file, with a `MEMORY.md` index the context hook injects | automatic | 0 when fresh; grows as facts accumulate | `geneseed memory list`, then `geneseed memory rm <name>` |
31
+ | `notebook/` | The agent's own working space: plans, scratch notes, and the gate log `gates.jsonl` | automatic | 0 when fresh; its index grows with use | Delete what you do not want; it is git-ignored and yours |
32
+ | hook shim | `~/.geneseed/bin/geneseed-hook`, the one stable path every hook calls, so moving the Geneseed checkout does not break your hooks | automatic | Nothing on its own | Not removed by uninstall, since every install on the machine shares it. `GENESEED_HOME` moves it |
33
+
34
+ <!--/harness-->
35
+ <!--harness:opencode-->
36
+ *(OpenCode only)*
37
+
38
+ | Piece | What it does for you | Kind | Cost | Turn it off |
39
+ |---|---|---|---|---|
40
+ | `AGENT.md` | The rules, the pointers to agents and skills, and how memory works | asked | ~7.2k tokens every session | Shrink it with fewer doctrine packs (`--doctrines`); remove it with `geneseed uninstall` |
41
+ | `user-rules.md` | Your own standing rules, read every session. Seeded empty | asked | 0 until you write in it | Leave it empty |
42
+ | `PROFILE.md` | Who you are and how you like answers pitched. Fill it with the `profile` skill | asked | 0 until you fill it | Leave the seeded text untouched |
43
+ | `opencode.json` entries | `instructions` points OpenCode at `AGENT.md`. `permission.bash` makes OpenCode ask before `rm -rf`, a force-push, `reset --hard`, `clean -f`, `branch -D` or `checkout --`, and before every commit and push when the **process** pack is on | enforced | No tokens | Edit the `permission` block yourself. The commit/push questions follow the **process** pack |
44
+ | context plugin | Puts your repo's README, CONTRIBUTING and a listing of `docs/` in front of the agent, with your rules, profile, memory index and wiki | automatic | Your docs, capped at 16 KB a file and 48 KB a session | `GENESEED_CONTEXT_INJECT=off` |
45
+ | guard plugin | Blocks writes to key and credential files (`id_rsa`, `.pem`, `.ssh/`…), catastrophic commands (`rm -rf /`, formatting a disk), and changes inside your wiki's protected folders. Refuses the first write to `user-rules.md` or memory once, so the choice is yours | enforced | No tokens | `GENESEED_GUARD=off`, or `GENESEED_GUARD=warn` to log instead of block |
46
+ | learn plugin | Once a session has been quiet for 60 seconds, distils durable facts into `memory/` with the model the session already uses | automatic | One model call per quiet session | `geneseed exclude add <folder>` silences it in that folder |
47
+ | activity plugin | Writes one small file per session that the web console's Activity view shows | automatic | No tokens | `GENESEED_ACTIVITY=off` |
48
+ | notify plugin | A desktop notification when a turn took longer than 30 seconds | automatic | No tokens | `GENESEED_NOTIFY=off` |
49
+ | ponytail plugin | Minimal-code mode. `/ponytail lite`, `full` or `ultra` adds a short ruleset to every turn until you switch it off | on demand | 0 while off, which is the default | `/ponytail off` |
50
+ | workflow plugin | Adds a `workflow` tool that runs saved orchestration scripts | on demand | Runs only when called | `geneseed uninstall` |
51
+ | `skills/` | Written procedures you call by name, such as `brainstorm` or `plan` | on demand | ~4.1k tokens for names and descriptions; a skill's body loads only when called | No per-skill switch; `geneseed uninstall` removes them all |
52
+ | `agents/` | Specialists the agent can delegate to, such as `reviewer` or `tester` | on demand | ~0.5k tokens | `geneseed uninstall` |
53
+ | `memory/` | Durable facts, one per file, with a `MEMORY.md` index the context plugin injects | automatic | 0 when fresh; grows as facts accumulate | `geneseed memory list`, then `geneseed memory rm <name>` |
54
+ | `notebook/` | The agent's own working space: plans, scratch notes, and the gate log `gates.jsonl` | automatic | 0 when fresh; its index grows with use | Delete what you do not want; it is git-ignored and yours |
55
+
56
+ <!--/harness-->
57
+
58
+ ### Where the files are
59
+
60
+ **OpenCode.** A global install writes to `~/.config/opencode/`. Setting `OPENCODE_CONFIG_DIR` or `XDG_CONFIG_HOME` moves it. Geneseed merges its entries into your existing `opencode.json` and keeps every other key. A per-repo install writes into the repo instead.
61
+
62
+ **Claude Code.** A global install writes to `~/.claude/`, and its hooks go into `~/.claude/settings.json`, next to any hooks of your own. A per-repo install uses the repo's `.claude/` folder, with the hooks in `.claude/settings.local.json`.
63
+
64
+ **Bob.** A global install writes to `~/.bob/`, or `BOB_CONFIG_DIR`. Bob does not load a global `AGENTS.md`, so the rules go into `~/.bob/rules/geneseed.md`. A per-repo install writes `AGENTS.md` instead. Hooks live in `~/.bob/settings/settings.json`. Bob runs three of them: context at session start, one combined gate before each tool call, and learn at session end. Bob has no "ask" prompt, so the gate refuses outright, and only for credentials and destructive git. The commit/push and memory questions become log lines.
65
+
66
+ **OpenClaude.** Same pieces as Claude Code, under `~/.openclaude/` or `OPENCLAUDE_CONFIG_DIR`. A per-repo install uses `.openclaude/`, with the hooks in `.openclaude/settings.local.json`.
67
+
68
+ **Plain bundle.** The `files` target writes `AGENT.md` and the same folders into `./Harness/` for any tool that reads `AGENT.md`. It installs no hooks and no plugins, so nothing in it is enforced.
69
+
70
+ ### Taking it back out
71
+
72
+ `geneseed uninstall` removes only what Geneseed recorded writing: the rules file or its managed block, `agents/`, `skills/`, plugins, and Geneseed's own hook and config entries. It keeps `memory/` and `notebook/` in place, along with the files it seeded for you to edit (`user-rules.md`, `PROFILE.md`, `wiki.jsonc`). Add `--archive-memory` to move memory and notebook aside instead. It still deletes nothing. See [Uninstall](../guides/uninstall.md).
73
+
74
+ ---
75
+
76
+ **Next:** [A day with the harness](a-day.md)
package/docs/web-ui.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  **Every view in the local browser console, what it shows, and how to drive it.**
6
6
 
7
- [← README](../README.md) · [Setup](../SETUP.md) · [What's shipped](../SHIPPED.md)
7
+ [← README](../README.md) · [Docs](README.md) · [What's shipped](../SHIPPED.md)
8
8
 
9
9
  </div>
10
10
 
@@ -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.10.0"
5
+ "version": "3.11.0"
6
6
  }
package/js/README.md CHANGED
@@ -118,6 +118,7 @@ into files users have committed, so change the test that states it in the same c
118
118
  | `text.mjs` | String primitives: `codePointLength`, `WHITESPACE`, `parseIntStrict`, `percentDecode` |
119
119
  | `udiff.mjs` | `geneseed diff`'s own difflib clone — the alignment IS the printed hunks — plus `splitLines` |
120
120
  | `proc.mjs` | One constant: the `windowsHide` flag every spawn in `js/` must reuse |
121
+ | `node-floor.mjs` | The first import of all three binaries: below Node 22.3, one sentence on stderr and exit 1 (0 in the hook) instead of a stack trace |
121
122
 
122
123
  **Before editing:** parse with `parseJson`, never `JSON.parse` — the latter collapses int `1` and
123
124
  float `1.0` into one double, and that value gets written into a user's file. Do not swap in a diff
@@ -168,7 +169,7 @@ the deployed harness as JSON.
168
169
  | `actions.mjs` | The mutating endpoints — rules, profile, memory, MCP, excludes — plus install/deploy argv |
169
170
  | `daemon.mjs` | Detached web start/stop/status/restart, the `.geneseed-web.json` record, and `openUrl` |
170
171
  | `jobs.mjs` | `JobManager` and the action→argv table. The only module here that spawns job children |
171
- | `docs.mjs` | The Docs tab: the `docs/web/` page registry, `?harness=` filtering, the five page kinds |
172
+ | `docs.mjs` | The Docs tab: the `docs/<folder>/` page registry, `?harness=` filtering, link rewriting, the six page kinds |
172
173
  | `activity.mjs` | The `activity/` session files: pid-liveness prune, list, detail, and the on/off flag |
173
174
 
174
175
  **Before editing:** `makeHandler(state, jm, token, dist, holder)`'s arity is load-bearing — three
@@ -190,6 +191,6 @@ and inline lists are held against a surface list written out in
190
191
  | 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 |
191
192
  | a CLI verb | `js/cli-table.json` — the table IS the parser | the `VERBS` row in `bin/geneseed-cli.mjs`, the row count in `cli_table.test.mjs`, `NATIVE` in **two** test files |
192
193
  | a hook verb | `js/hosts/hooks.mjs` | `claudeHookGroups` in `settings.mjs`, `VERBS` in `bin/geneseed-hook.mjs`. Keep the import graph tiny |
193
- | a console doc page | `docs/web/<id>.md` — the stem is the id | `docs/extending.md` §4c. Only `kind: "concept"` gets `{N_*}` substitution |
194
+ | a console doc page | `docs/<understand|guides|concepts|reference>/<id>.md` — the stem is the id | `docs/extending.md` §4c. Only `kind: "concept"` gets `{N_*}` substitution |
194
195
  | an OpenCode plugin | `adapters/opencode/plugins/geneseed-<name>.js` | `docs/extending.md` §4a — the `geneseed-` prefix is mechanically load-bearing |
195
196
  | to change a `js/lib/` primitive | `tests/fixtures/pure_probe.mjs` **first** | the docblock says which Node default it deliberately departs from — change that sentence too, or the next reader restores the default |