geneseed 3.11.0 → 3.13.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 (265) hide show
  1. package/CHANGELOG.md +160 -0
  2. package/README.md +5 -5
  3. package/SHIPPED.md +2 -2
  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-guard.js +157 -2
  9. package/bin/geneseed-cli.mjs +4 -0
  10. package/docs/README.md +41 -22
  11. package/docs/concepts/agents.md +3 -1
  12. package/docs/concepts/collaboration.md +3 -1
  13. package/docs/concepts/exclusions.md +4 -2
  14. package/docs/concepts/footprint.md +3 -1
  15. package/docs/concepts/foreman-mode.md +4 -2
  16. package/docs/concepts/hook-gates.md +61 -0
  17. package/docs/concepts/hooks.md +8 -56
  18. package/docs/concepts/host-matrix.md +38 -0
  19. package/docs/concepts/hosts.md +6 -32
  20. package/docs/concepts/loop-branch.md +66 -0
  21. package/docs/concepts/loop-bricks.md +48 -0
  22. package/docs/concepts/loop-contracts.md +33 -0
  23. package/docs/concepts/loop-gates.md +30 -0
  24. package/docs/concepts/loop-notes.md +43 -0
  25. package/docs/concepts/loop-risk.md +36 -0
  26. package/docs/concepts/loop-templates.md +50 -0
  27. package/docs/concepts/loops.md +73 -0
  28. package/docs/concepts/lsp.md +2 -0
  29. package/docs/concepts/memory.md +3 -1
  30. package/docs/concepts/notebook.md +3 -1
  31. package/docs/concepts/rules.md +4 -2
  32. package/docs/concepts/skills.md +3 -1
  33. package/docs/concepts/themes.md +3 -1
  34. package/docs/extending.md +28 -8
  35. package/docs/guides/autostart.md +3 -1
  36. package/docs/guides/choose-your-setup.md +5 -66
  37. package/docs/guides/headless.md +5 -3
  38. package/docs/guides/install-agent-md.md +37 -0
  39. package/docs/guides/install-bob.md +20 -0
  40. package/docs/guides/install-claude-code.md +22 -0
  41. package/docs/guides/install-clone.md +34 -0
  42. package/docs/guides/install-openclaude.md +25 -0
  43. package/docs/guides/install-opencode.md +35 -0
  44. package/docs/guides/install-scripted.md +21 -0
  45. package/docs/guides/install.md +9 -118
  46. package/docs/guides/loop-finish.md +54 -0
  47. package/docs/guides/loop-running.md +66 -0
  48. package/docs/guides/loop-which-template.md +35 -0
  49. package/docs/guides/mcp-filesystem.md +41 -0
  50. package/docs/guides/mcp-gitlab.md +66 -0
  51. package/docs/guides/mcp-markitdown.md +36 -0
  52. package/docs/guides/mcp.md +8 -137
  53. package/docs/guides/migrate.md +3 -1
  54. package/docs/guides/project-context.md +4 -2
  55. package/docs/guides/read-non-markdown.md +17 -0
  56. package/docs/guides/run-a-loop.md +64 -0
  57. package/docs/guides/run-anywhere.md +2 -0
  58. package/docs/guides/setup-doctrines.md +55 -0
  59. package/docs/guides/setup-footprint.md +48 -0
  60. package/docs/guides/uninstall.md +3 -1
  61. package/docs/guides/upgrade.md +3 -1
  62. package/docs/guides/verify.md +3 -1
  63. package/docs/guides/wiki.md +3 -1
  64. package/docs/guides/worktree.md +3 -1
  65. package/docs/reference/about.md +3 -1
  66. package/docs/reference/cli.md +2 -0
  67. package/docs/reference/env-context.md +40 -0
  68. package/docs/reference/environment.md +10 -59
  69. package/docs/reference/glossary.md +7 -1
  70. package/docs/reference/loop-actions.md +20 -0
  71. package/docs/reference/opencode-plugins.md +14 -116
  72. package/docs/reference/plugin-activity.md +20 -0
  73. package/docs/reference/plugin-context.md +27 -0
  74. package/docs/reference/plugin-guard.md +27 -0
  75. package/docs/reference/plugin-learn.md +27 -0
  76. package/docs/reference/plugin-notify.md +20 -0
  77. package/docs/reference/plugin-ponytail.md +19 -0
  78. package/docs/reference/plugin-workflow.md +25 -0
  79. package/docs/reference/troubleshoot-doctor.md +50 -0
  80. package/docs/reference/troubleshoot-hooks.md +99 -0
  81. package/docs/reference/troubleshoot-install.md +108 -0
  82. package/docs/reference/troubleshoot-tools.md +56 -0
  83. package/docs/reference/troubleshoot-update.md +23 -0
  84. package/docs/reference/troubleshoot-web.md +66 -0
  85. package/docs/reference/troubleshooting.md +13 -337
  86. package/docs/understand/a-day.md +3 -1
  87. package/docs/understand/enforced-vs-asked.md +3 -1
  88. package/docs/understand/harness.md +2 -0
  89. package/docs/understand/machine-bob.md +17 -0
  90. package/docs/understand/machine-claude.md +35 -0
  91. package/docs/understand/machine-opencode.md +36 -0
  92. package/docs/understand/on-your-machine.md +12 -55
  93. package/docs/understand/take-it-out.md +13 -0
  94. package/docs/web-ui.md +36 -5
  95. package/harness.config.json +1 -1
  96. package/js/README.md +32 -2
  97. package/js/build/driver.mjs +14 -8
  98. package/js/build/generate.mjs +10 -6
  99. package/js/build/render.mjs +5 -0
  100. package/js/build/source.mjs +5 -1
  101. package/js/cli-table.json +261 -0
  102. package/js/hosts/gitref.mjs +99 -0
  103. package/js/hosts/hooks.mjs +88 -1
  104. package/js/hosts/installs.mjs +21 -0
  105. package/js/hosts/mcp.mjs +1 -1
  106. package/js/hosts/native.mjs +43 -5
  107. package/js/inspect/checks-authoring.mjs +10 -0
  108. package/js/inspect/checks-build.mjs +28 -0
  109. package/js/inspect/diff.mjs +3 -0
  110. package/js/inspect/doctor.mjs +2 -1
  111. package/js/inspect/inventory.mjs +1 -0
  112. package/js/inspect/status.mjs +1 -1
  113. package/js/loop/catalog.mjs +127 -0
  114. package/js/loop/cli.mjs +173 -0
  115. package/js/loop/graph.mjs +163 -0
  116. package/js/loop/registry.mjs +196 -0
  117. package/js/loop/score.mjs +182 -0
  118. package/js/loop/state.mjs +436 -0
  119. package/js/maintain/migrate.mjs +4 -2
  120. package/js/maintain/setup.mjs +1 -1
  121. package/js/web/actions.mjs +34 -3
  122. package/js/web/api.mjs +51 -2
  123. package/js/web/daemon.mjs +43 -5
  124. package/js/web/docs.mjs +64 -12
  125. package/js/web/handler.mjs +1 -0
  126. package/js/web/jobs.mjs +3 -1
  127. package/js/web/routes.mjs +5 -1
  128. package/js/web/server.mjs +5 -3
  129. package/package.json +1 -1
  130. package/registry.json +14 -0
  131. package/src/AGENT.md.tmpl +2 -0
  132. package/src/agents/explorer.md +2 -2
  133. package/src/agents/researcher.md +3 -3
  134. package/src/bricks/README.md +34 -0
  135. package/src/bricks/_template.md +32 -0
  136. package/src/bricks/adr-challenge.md +20 -0
  137. package/src/bricks/adr-draft.md +15 -0
  138. package/src/bricks/apply.md +17 -0
  139. package/src/bricks/baseline-green.md +17 -0
  140. package/src/bricks/bruno-test.md +16 -0
  141. package/src/bricks/characterize.md +17 -0
  142. package/src/bricks/ci-fix.md +18 -0
  143. package/src/bricks/ci-triage.md +20 -0
  144. package/src/bricks/compat-check.md +16 -0
  145. package/src/bricks/deps-audit.md +14 -0
  146. package/src/bricks/docs-update.md +15 -0
  147. package/src/bricks/done-check.md +16 -0
  148. package/src/bricks/fitness-define.md +22 -0
  149. package/src/bricks/flake-check.md +17 -0
  150. package/src/bricks/flake-repro.md +18 -0
  151. package/src/bricks/identify.md +23 -0
  152. package/src/bricks/lint.md +14 -0
  153. package/src/bricks/migration-plan.md +21 -0
  154. package/src/bricks/mutation-check.md +18 -0
  155. package/src/bricks/plan.md +17 -0
  156. package/src/bricks/red-test.md +16 -0
  157. package/src/bricks/reproduce.md +16 -0
  158. package/src/bricks/review.md +19 -0
  159. package/src/bricks/security-scan.md +17 -0
  160. package/src/bricks/spec.md +18 -0
  161. package/src/bricks/test.md +14 -0
  162. package/src/bricks/upgrade-scout.md +16 -0
  163. package/src/doctrines/process.md +11 -8
  164. package/src/loops/api-endpoint.json +31 -0
  165. package/src/loops/architecture-decision.json +22 -0
  166. package/src/loops/bugfix.json +23 -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 +24 -0
  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 +24 -0
  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 +48 -0
  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/geneseed.md +1 -1
  187. package/src/skills/git-archaeology.md +1 -1
  188. package/src/skills/git-rescue.md +4 -3
  189. package/src/skills/handoff.md +1 -1
  190. package/src/skills/herdr.md +1 -1
  191. package/src/skills/learn-mode.md +2 -2
  192. package/src/skills/loop.md +111 -0
  193. package/src/skills/opencode-theme.md +3 -3
  194. package/src/skills/ponytail.md +1 -1
  195. package/src/skills/profile.md +3 -4
  196. package/src/skills/prose.md +2 -3
  197. package/src/skills/quiz.md +1 -1
  198. package/src/skills/react-view-transitions/SKILL.md +1 -1
  199. package/src/skills/react-view-transitions/VENDOR.md +8 -3
  200. package/src/skills/research.md +3 -3
  201. package/src/skills/review-response.md +2 -2
  202. package/src/skills/rule.md +3 -3
  203. package/src/skills/security-audit.md +4 -4
  204. package/src/skills/teach.md +1 -1
  205. package/src/skills/wiki.md +3 -3
  206. package/src/skills/workflow.md +4 -4
  207. package/src/skills/worktree.md +2 -2
  208. package/themes/_TEMPLATE.json +2 -0
  209. package/themes/biker.json +2 -0
  210. package/themes/commentator.json +2 -0
  211. package/themes/cyberpunk.json +2 -0
  212. package/themes/gamer.json +2 -0
  213. package/themes/imperial.json +2 -0
  214. package/themes/joker.json +2 -0
  215. package/themes/marvin.json +2 -0
  216. package/themes/mean.json +2 -0
  217. package/themes/military.json +2 -0
  218. package/themes/neutral.json +2 -0
  219. package/themes/pirate.json +2 -0
  220. package/themes/sports.json +2 -0
  221. package/themes/verstappen.json +2 -0
  222. package/themes/wizard.json +2 -0
  223. package/web/dist/assets/Activity-Ca2Aruu7.js +1 -0
  224. package/web/dist/assets/ActivityDetail-Bo7v4Z_r.js +1 -0
  225. package/web/dist/assets/Dashboard-BuMq46aT.js +2 -0
  226. package/web/dist/assets/Docs-BzccCllG.js +5 -0
  227. package/web/dist/assets/FilterInput-CBcJBQPI.js +1 -0
  228. package/web/dist/assets/GreenhouseView-BCIKcnGG.js +2 -0
  229. package/web/dist/assets/Installs-DMFJvq7s.js +2 -0
  230. package/web/dist/assets/JournalView-o1rmd1_1.js +1 -0
  231. package/web/dist/assets/Laws-BANxq_I_.js +3 -0
  232. package/web/dist/assets/Library-DW4x0fbh.js +1 -0
  233. package/web/dist/assets/Loops-DEBibbBP.js +2 -0
  234. package/web/dist/assets/{Markdown-qjM2_ofS.js → Markdown-CdTX0kLe.js} +14 -14
  235. package/web/dist/assets/OperatorHudView-CLD0fYaA.js +2 -0
  236. package/web/dist/assets/Personal-6uMJvyBG.js +1 -0
  237. package/web/dist/assets/Tabs-BubnyZhF.js +1 -0
  238. package/web/dist/assets/activity-CObqyxkL.js +1 -0
  239. package/web/dist/assets/{api-Dc8f3ca-.js → api-D_ixdyEY.js} +1 -1
  240. package/web/dist/assets/drawable-C_x5xncq.js +1 -0
  241. package/web/dist/assets/index-CMPgezFm.js +2 -0
  242. package/web/dist/assets/index-DMsT4Aa6.css +1 -0
  243. package/web/dist/assets/{react-B9Z_tXRV.js → react-Bbzhmq4v.js} +1 -1
  244. package/web/dist/assets/rolldown-runtime-hePW80VL.js +1 -0
  245. package/web/dist/assets/sections-Dg23Hel5.js +1 -0
  246. package/web/dist/assets/usePoll-BOqeunzF.js +1 -0
  247. package/web/dist/index.html +6 -5
  248. package/web/dist/assets/Activity-C52LEb-2.js +0 -1
  249. package/web/dist/assets/ActivityDetail-CjNLRvXg.js +0 -1
  250. package/web/dist/assets/Dashboard-B6_sSCHi.js +0 -2
  251. package/web/dist/assets/Docs-Dj7BmCSA.js +0 -5
  252. package/web/dist/assets/FilterInput-CVyqmYWM.js +0 -1
  253. package/web/dist/assets/GreenhouseView-BALwjQsA.js +0 -2
  254. package/web/dist/assets/Installs-BbffDQm3.js +0 -2
  255. package/web/dist/assets/JournalView-JpAQ8Hqe.js +0 -1
  256. package/web/dist/assets/Laws-DK7eCWSm.js +0 -3
  257. package/web/dist/assets/Library-CoamHelE.js +0 -1
  258. package/web/dist/assets/OperatorHudView-DVx1HlBx.js +0 -2
  259. package/web/dist/assets/Personal-eaXb1zcj.js +0 -1
  260. package/web/dist/assets/Tabs-BmGtt8E2.js +0 -1
  261. package/web/dist/assets/drawable-Du_PZrQj.js +0 -1
  262. package/web/dist/assets/index-Bz_KMRDH.css +0 -1
  263. package/web/dist/assets/index-CNFH7o55.js +0 -2
  264. package/web/dist/assets/sections-GalMS0Zv.js +0 -1
  265. package/web/dist/assets/usePoll-O0sJEw1Y.js +0 -1
@@ -0,0 +1,17 @@
1
+ ---
2
+ group: guides
3
+ order: 20
4
+ title: "Reading non-markdown docs"
5
+ kind: "concept"
6
+ section: "Set up"
7
+ description: "Let the agent read PDF, Word, PowerPoint, Excel and HTML through a converter."
8
+ ---
9
+ The agent's doc discovery only sees markdown. The `ingest` skill teaches the agent to convert a PDF, Word, PowerPoint, Excel or HTML file, or a URL, to markdown before reading it. Install one converter and the skill uses it:
10
+
11
+ - **MarkItDown**: the broadest. Use [its MCP server](mcp-markitdown.md) (preferred on a host with MCP: nothing to install per call, one cheap tool), or `pip install markitdown`.
12
+ - **Pandoc**: excellent for Office and HTML, and a single binary.
13
+ - **Docling** (IBM): best for complex tables and scanned PDFs.
14
+
15
+ When an MCP converter is available, the skill prefers it. A prompt like *"convert file:///path/to/spec.pdf to markdown"* then just works. The skill never installs a converter silently. If none is present, it tells you which one to add.
16
+
17
+ Converter not found, or an MCP converter listed but not connecting? See [Model, agent and MCP problems](../reference/troubleshoot-tools.md).
@@ -0,0 +1,64 @@
1
+ ---
2
+ group: guides
3
+ order: 21
4
+ title: "Run a loop"
5
+ kind: "concept"
6
+ section: "Loops"
7
+ description: "Start a loop: what you need, how to ask, which template, and how much it does before it asks."
8
+ ---
9
+ A **loop** works one requirement as small iterations. Each one is planned, applied, tested, reviewed, scored for risk and committed on its own branch. You ask for it in plain words. The agent drives `geneseed loop`, which decides every step, and stops for you only when a change is risky or a step needs your sign-off. The loop never merges: the branch is yours to review.
10
+
11
+ This page is the how-to. For how the engine works (rings, scoring, trailers), see [Loops](../concepts/loops.md). Once it runs, see [While a loop runs](loop-running.md) and [Finish a loop](loop-finish.md).
12
+
13
+ ## Before you start
14
+
15
+ | You need | Why |
16
+ | --- | --- |
17
+ | An install that carries the `loop` skill | The skill is what talks to `geneseed loop`. After upgrading Geneseed, run `geneseed rebuild-all` so every install gets the current skill. |
18
+ | A git repository with a remote named `origin` | Every iteration ends with `git push -u origin HEAD:loop/<slug>`. With no remote, the agent reports and stops. |
19
+ | A test command the agent can run | The `test` brick runs the project's suite, and most templates retry `apply` until it passes. |
20
+ | For `ci-repair`: CI that runs on `loop/*` branches, and the `gh` CLI | `ci-triage` reads the checks of the HEAD commit with `gh run list --commit`. |
21
+ | For `legacy-tests`: a mutation tool (PIT, Stryker, mutmut, cargo-mutants) | Optional. Without one, `mutation-check` reports `unavailable` and the loop carries on, with a note saying so. |
22
+
23
+ Check the catalogue the CLI sees from your repo:
24
+
25
+ ```bash
26
+ geneseed loop check
27
+ ```
28
+
29
+ It lists every template and brick, marks the unavailable ones and says why, and names every project or global brick that overrides a shipped one.
30
+
31
+ ## Start a loop
32
+
33
+ Ask the agent, naming a template or not:
34
+
35
+ ```text
36
+ run a tdd loop to add rate limiting to the /orders endpoint
37
+ run a bugfix loop for issue 412: totals round the wrong way on refunds
38
+ start a loop to remove the dead code knip reports in src/billing
39
+ run a ci-repair loop on this branch, prudent
40
+ ```
41
+
42
+ The agent then:
43
+
44
+ 1. Creates a worktree on a new branch, `git worktree add ../<repo>-loop-<slug> -b loop/<slug>`, and works from there. Your own checkout is not touched.
45
+ 2. Picks the template you named (see [Which loop template](loop-which-template.md)). If you named none, it runs `geneseed loop check` and composes a graph from the available bricks, validated with `geneseed loop check --graph <file>`.
46
+ 3. Runs `geneseed loop init --title … --requirement … --graph <template> --preset <preset>`. This writes `LOOP.md` at the worktree root and registers the loop so the console can show it.
47
+
48
+ ## Trust: how far it goes before it asks
49
+
50
+ Before each change, and again after it, the loop scores its risk and compares the score with a **trust preset**:
51
+
52
+ | Preset | What gets through without asking |
53
+ | --- | --- |
54
+ | `prudent` | Little beyond renames. It also asks you to approve the graph before the first node runs. |
55
+ | `balanced` *(default)* | Logic changes and new files. API changes and deletions stop. |
56
+ | `aggressive` | Everything short of an architecture-level change. |
57
+
58
+ - **Install default.** The `--trust` choice your install was built with (`geneseed build --emit <target> --trust prudent`; see [Footprint, loop trust and changing later](setup-footprint.md)).
59
+ - **One loop.** Say it when you start: "run it prudent", "aggressive is fine for this one".
60
+ - **Mid-loop.** Pick another preset in the console under **Loops › Active**, or edit the `preset` field in `LOOP.md`. It applies from the next score, not to what already ran.
61
+
62
+ ---
63
+
64
+ **Next:** [Which loop template](loop-which-template.md)
@@ -3,6 +3,8 @@ group: guides
3
3
  order: 9
4
4
  title: "Run geneseed from anywhere"
5
5
  kind: "concept"
6
+ section: "Install"
7
+ description: "Put the geneseed command on your PATH from a clone."
6
8
  ---
7
9
  **Installed from npm? You have nothing to do.** `npm install -g geneseed` already puts `geneseed`, `geneseed-build` and `geneseed-hook` on your `PATH`.
8
10
 
@@ -0,0 +1,55 @@
1
+ ---
2
+ group: guides
3
+ order: 11
4
+ title: "Doctrine packs and single rules"
5
+ kind: "concept"
6
+ section: "Set up"
7
+ description: "Which practice packs bind, and how to drop a single rule."
8
+ ---
9
+ Part of [Choose your setup](choose-your-setup.md). Like every setup choice, packs and rules are fixed **at build time**: change one by rebuilding, not by editing the output.
10
+
11
+ ## Doctrine packs: which practices bind
12
+
13
+ The harness's rules come in tiers (see [Rules](../concepts/rules.md)). The Ethos and the Rules are always on. The **doctrines** are practices rather than principles, and they ship as packs you choose:
14
+
15
+ | Pack | What it governs |
16
+ | --- | --- |
17
+ | **craft** | how code is written: reuse first, house conventions, docs updated in the same change, the smallest diff |
18
+ | **rigor** | how work is proven: idempotence, honest tests, cover-and-verify, gates that can actually fail |
19
+ | **ops** | how the machine is driven: tool discovery, commands that return, complete teardowns |
20
+ | **process** | how a session runs: planning, context economy, docs first, bounded loops, and consent before every commit and push |
21
+ | **comms** | how answers are presented: stable reference codes on tracked items, and a diagram or table only where it earns its place |
22
+
23
+ Every pack is enabled by default. To keep only some packs, or none:
24
+
25
+ ```
26
+ geneseed build --emit opencode-global --doctrines craft,rigor # two packs
27
+ geneseed build --emit opencode-global --doctrines none # Ethos and Rules only
28
+ ```
29
+
30
+ The packs always load in the same order (craft, rigor, ops, process, comms), whatever order you type them in. A pack you leave out still ships on disk under `doctrines/`, so you can read it before you turn it on. A clone can set its own default in `harness.config.json` with a `doctrines` array.
31
+
32
+ **Dropping `process` changes what the machine does, not only what the agent reads.** The *Consent Before Push* rule in that pack is enforced at the tool boundary as well as in the prose:
33
+
34
+ - On Claude Code and OpenClaude, the git hook stays wired but stops asking before a commit or push.
35
+ - On OpenCode, a fresh install no longer gets the `git commit*` and `git push*` ask entries in `opencode.json`. On an existing install, entries that are already there are left in place and reported, because Geneseed cannot tell its own entries from ones you typed.
36
+
37
+ The refusals of destructive git and `rm -rf` belong to the always-on Rules, not to the pack, so they stay in every build. See [Enforced vs. asked](../understand/enforced-vs-asked.md).
38
+
39
+ ## One rule at a time
40
+
41
+ A pack is all-or-nothing. `--exclude-rules` drops single doctrine rules instead. It takes rule addresses, written `<pack> <n>` or `<pack>.<n>`:
42
+
43
+ ```
44
+ geneseed build --emit opencode-global --exclude-rules "process 7"
45
+ geneseed build --emit opencode-global --exclude-rules "process 5,craft 2"
46
+ geneseed build --emit opencode-global --exclude-rules none
47
+ ```
48
+
49
+ The number in an address is the rule's position in its pack, so it can change if a rule is added or removed. To see the current addresses, pass an address that does not exist: the build refuses it and lists every valid address. The web console's **Constitution** page has one switch per rule. You stage the changes there and apply them in a single rebuild.
50
+
51
+ Excluding *Consent Before Push* (`process 5` today) takes the commit and push consent gate with it, exactly as dropping the whole `process` pack does. The console and the wizard both warn you before applying it. A pack whose every rule is excluded drops out of the build entirely. See [Exclusions](../concepts/exclusions.md) for excluding whole folders instead.
52
+
53
+ ---
54
+
55
+ **Next:** [Footprint, loop trust and changing later](setup-footprint.md)
@@ -0,0 +1,48 @@
1
+ ---
2
+ group: guides
3
+ order: 12
4
+ title: "Footprint, loop trust and changing later"
5
+ kind: "concept"
6
+ section: "Set up"
7
+ description: "How much loads every turn, how far a loop goes before it asks, and how to change a choice."
8
+ ---
9
+ Part of [Choose your setup](choose-your-setup.md): the last build-time choices, and how to change any of them once the install exists.
10
+
11
+ ## Footprint: how much loads every turn
12
+
13
+ Footprint controls how much of the rules text sits inside `AGENT.md`, which is loaded on every turn. It changes the token cost, not which rules apply:
14
+
15
+ - **lean** *(default)*: each rule appears in a hand-written short form, with a pointer to the full text. The full text ships beside `AGENT.md`, and the agent reads it when a rule's nuance matters.
16
+ - **full**: every rule's complete text and rationale is inline. This costs the most tokens. It can help a smaller model, which applies a rule's nuance more reliably when the reasoning is always in front of it.
17
+
18
+ ```
19
+ geneseed build --emit opencode-global --footprint full
20
+ ```
21
+
22
+ Both footprints install the same agents, skills, hooks and plugins. More in [Footprint](../concepts/footprint.md).
23
+
24
+ ## Loop trust: how far a loop goes before it asks
25
+
26
+ The `loop` skill scores every change it validates and stops to ask once the score passes a threshold. `--trust` sets the preset the skill starts a loop with; the user can still name another one per loop.
27
+
28
+ - **prudent**: asks early, on anything past a rename.
29
+ - **balanced** *(default)*: logic changes and new files pass with a note; API changes and deletions stop.
30
+ - **aggressive**: only an architecture-level change stops the loop.
31
+
32
+ The preset lives in the `loop` skill only, so it costs nothing in the always-on instructions.
33
+
34
+ ```
35
+ geneseed build --emit opencode-global --trust prudent
36
+ ```
37
+
38
+ ## Changing a choice later
39
+
40
+ You have three ways to change a choice:
41
+
42
+ - **Re-run the wizard** with `geneseed setup`. It pre-selects what the install already has, so holding Enter cannot widen a set you narrowed on purpose. The wizard does not ask about single rules, but it keeps any rule exclusions already in place.
43
+ - **Use the web console** (`geneseed web`). **Settings** and the **Harnesses** page change theme, footprint and the rest per install. **Constitution** toggles packs and rules.
44
+ - **Run the build yourself.** Watch out: a flag you leave out takes the *generator's* default, not your install's current value. `geneseed status --json` prints, for every install, the exact `geneseed build` command that rebuilds it as it is. Start from that command and change the one flag you want.
45
+
46
+ ---
47
+
48
+ **Next:** [Verify it works](verify.md)
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  group: guides
3
- order: 5
3
+ order: 28
4
4
  title: "Uninstall"
5
5
  kind: "concept"
6
+ section: "Keep it running"
7
+ description: "Remove an install, and what stays behind."
6
8
  ---
7
9
  `geneseed uninstall` removes one install at a time. It deletes only what Geneseed wrote and keeps anything you would not be able to rebuild.
8
10
 
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  group: guides
3
- order: 4
3
+ order: 25
4
4
  title: "Upgrade"
5
5
  kind: "concept"
6
+ section: "Keep it running"
7
+ description: "Get a new version onto every install, and keep your local edits."
6
8
  ---
7
9
  Upgrading happens in two steps: get the new Geneseed, then rebuild every install from it. Editing or updating Geneseed changes nothing on your machine until something rebuilds. The route depends on how you installed.
8
10
 
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  group: guides
3
- order: 3
3
+ order: 13
4
4
  title: "Verify it works"
5
5
  kind: "concept"
6
+ section: "Set up"
7
+ description: "Check an install works, right after installing or when something feels off."
6
8
  ---
7
9
  Four checks, from quickest to most thorough. The first one alone tells you whether the harness loaded.
8
10
 
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  group: guides
3
- order: 7
3
+ order: 15
4
4
  title: "Connect your wiki"
5
5
  kind: "concept"
6
+ section: "Set up"
7
+ description: "Give the agent your own notes, machine-wide."
6
8
  ---
7
9
  If you keep a personal knowledge base on this machine, such as an Obsidian vault or any folder of interlinked markdown, you can declare it once. The agent then reads from it and writes to it while following your own structure. This is optional. Until you declare a wiki, the feature stays off.
8
10
 
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  group: guides
3
- order: 12
3
+ order: 30
4
4
  title: "Add git-worktree isolation"
5
5
  kind: "concept"
6
+ section: "OpenCode extras"
7
+ description: "Add the optional third-party git-worktree isolation to OpenCode."
6
8
  harness: "opencode"
7
9
  ---
8
10
  This is a third-party, optional OpenCode plugin. Geneseed does not ship it or install it.
@@ -1,7 +1,9 @@
1
1
  ---
2
2
  group: reference
3
- order: 6
3
+ order: 21
4
4
  title: "About — version, license, links"
5
5
  kind: "about"
6
+ section: "Glossary & about"
7
+ description: "Your version, theme and host, the license, and where updates come from."
6
8
  ---
7
9
  The console fills this page from your install: the version, the deployed theme and host, and where updates come from. Geneseed is MIT-licensed; the source is at [github.com/Arylmera/Geneseed](https://github.com/Arylmera/Geneseed).
@@ -3,5 +3,7 @@ group: reference
3
3
  order: 1
4
4
  title: "CLI — every subcommand"
5
5
  kind: "cli"
6
+ section: "CLI & environment"
7
+ description: "Every geneseed subcommand, from the CLI's own table."
6
8
  ---
7
9
  The console renders this page from `js/cli-table.json`, the CLI's own description of itself, so it is always in step with the installed version. Outside the console, `geneseed --help` lists every command and `geneseed <command> --help` describes one.
@@ -0,0 +1,40 @@
1
+ ---
2
+ group: reference
3
+ order: 4
4
+ title: "Context and memory variables"
5
+ kind: "concept"
6
+ section: "CLI & environment"
7
+ description: "The variables that steer what loads at session start and where memory is written."
8
+ ---
9
+ The environment variables that steer context injection and memory. None is required. The rest are on [Environment variables](environment.md).
10
+
11
+ "Plugin" means one of the OpenCode plugins — see [OpenCode plugins](opencode-plugins.md). "Hook" means `geneseed-hook`, the small binary your tool's settings call on Claude Code, Bob and OpenClaude (see the [glossary](glossary.md)).
12
+
13
+ ## Context injection
14
+
15
+ What gets loaded into the agent's context at session start — your project's docs and your machine wiki. See [Project context](../guides/project-context.md).
16
+
17
+ | Variable | Read by | Effect |
18
+ | --- | --- | --- |
19
+ | `GENESEED_CONTEXT` | context plugin, context hook | Explicit `context.json` manifest path; overrides discovery. |
20
+ | `GENESEED_ROOT` | context hook | Repo root to discover docs from (default: the current directory). |
21
+ | `GENESEED_WIKI` | context + guard plugins, context hook, web console | Explicit `wiki.jsonc` path (default `$GENESEED_HARNESS/wiki.jsonc`, else beside the install). |
22
+ | `GENESEED_STACK_GLOBAL` | context hook, Claude Code project build | `1` lets a global and a project install of the same host both inject. By default the project install makes the global one stand down. Rebuild the project install after changing it. |
23
+ | `GENESEED_CONTEXT_INJECT` | context plugin | `off` disables injection; the agent is only *asked* to read the docs. |
24
+ | `GENESEED_CONTEXT_VISIBLE` | context plugin | `1` shows the visible `PROJECT CONTEXT` block instead of the invisible per-request delivery. |
25
+ | `GENESEED_CONTEXT_TRANSFORM` | context plugin | Legacy. `0`/`off` = same as `GENESEED_CONTEXT_VISIBLE=1`; `1` matches the default. |
26
+ | `GENESEED_EAGER_FILE_KB` / `GENESEED_EAGER_TOTAL_KB` | context plugin | Per-file / total budget for docs injected in full (default 16 / 48). An oversized file is listed instead, never truncated. |
27
+ | `GENESEED_LAZY_HEADINGS` | context plugin | Cap on headings read for listed docs per session (default 64). |
28
+ | `GENESEED_WIKI_LAZY_LIMIT` | context plugin | Cap on wiki notes listed per wiki per session (default 200; beyond it the listing ends with a count). |
29
+
30
+ ## Memory and learn
31
+
32
+ Where distilled memories land at session end, and which model distils them. See [Memory](../concepts/memory.md).
33
+
34
+ | Variable | Read by | Effect |
35
+ | --- | --- | --- |
36
+ | `GENESEED_HARNESS` | learn, context, guard plugins; CLI | Base whose `memory/` is written (and where `wiki.jsonc` is looked up). Optional — the plugin finds the in-config store by itself; set it to pin the location. |
37
+ | `GENESEED_MEMORY` | learn plugin, CLI | Explicit memory dir; wins over `GENESEED_HARNESS`. |
38
+ | `GENESEED_MODEL` | learn + context plugins | `provider/model` fallback when the session's model can't be read from the transcript. |
39
+ | `GENESEED_LLM` | learn hook (Claude Code, Bob, OpenClaude) | Model CLI used to distil, e.g. `claude -p`. Unset, the hook prints the prompt instead of distilling. |
40
+ | `GENESEED_LEARN_DEBOUNCE_MS` | learn plugin | Quiet period before distilling, in ms (default 60000). |
@@ -1,14 +1,18 @@
1
1
  ---
2
2
  group: reference
3
- order: 2
3
+ order: 3
4
4
  title: "Environment variables"
5
5
  kind: "concept"
6
+ section: "CLI & environment"
7
+ description: "Where Geneseed installs, how the CLI and console behave, and where the other variables are listed."
6
8
  ---
7
- Every environment variable Geneseed reads, grouped by what it changes. None is required: an install works with all of them unset. Set one in your shell profile (or your tool's environment) when you need to move a default.
9
+ The environment variables Geneseed reads, grouped by what they change. None is required: an install works with all of them unset. Set one in your shell profile (or your tool's environment) when you need to move a default.
8
10
 
9
11
  "Plugin" means one of the OpenCode plugins — see [OpenCode plugins](opencode-plugins.md). "Hook" means `geneseed-hook`, the small binary your tool's settings call on Claude Code, Bob and OpenClaude (see the [glossary](glossary.md)).
10
12
 
11
- ### Where things install
13
+ The variables that steer context injection and memory are on [Context and memory variables](env-context.md).
14
+
15
+ ## Where things install
12
16
 
13
17
  Where Geneseed writes an install, and what an upgrade re-renders.
14
18
 
@@ -26,64 +30,11 @@ Where Geneseed writes an install, and what an upgrade re-renders.
26
30
  | `GENESEED_PRIMARY` | `geneseed build` | `1` also emits the primary orchestrator agent (OpenCode). |
27
31
  | `GENESEED_COMMANDS` | `geneseed build` | `1` also emits the `/slash` command layer (OpenCode). |
28
32
 
29
- ### Context injection
30
-
31
- What gets loaded into the agent's context at session start — your project's docs and your machine wiki. See [Project context](../guides/project-context.md).
32
-
33
- | Variable | Read by | Effect |
34
- | --- | --- | --- |
35
- | `GENESEED_CONTEXT` | context plugin, context hook | Explicit `context.json` manifest path; overrides discovery. |
36
- | `GENESEED_ROOT` | context hook | Repo root to discover docs from (default: the current directory). |
37
- | `GENESEED_WIKI` | context + guard plugins, context hook, web console | Explicit `wiki.jsonc` path (default `$GENESEED_HARNESS/wiki.jsonc`, else beside the install). |
38
- | `GENESEED_STACK_GLOBAL` | context hook, Claude Code project build | `1` lets a global and a project install of the same host both inject. By default the project install makes the global one stand down. Rebuild the project install after changing it. |
39
- | `GENESEED_CONTEXT_INJECT` | context plugin | `off` disables injection; the agent is only *asked* to read the docs. |
40
- | `GENESEED_CONTEXT_VISIBLE` | context plugin | `1` shows the visible `PROJECT CONTEXT` block instead of the invisible per-request delivery. |
41
- | `GENESEED_CONTEXT_TRANSFORM` | context plugin | Legacy. `0`/`off` = same as `GENESEED_CONTEXT_VISIBLE=1`; `1` matches the default. |
42
- | `GENESEED_EAGER_FILE_KB` / `GENESEED_EAGER_TOTAL_KB` | context plugin | Per-file / total budget for docs injected in full (default 16 / 48). An oversized file is listed instead, never truncated. |
43
- | `GENESEED_LAZY_HEADINGS` | context plugin | Cap on headings read for listed docs per session (default 64). |
44
- | `GENESEED_WIKI_LAZY_LIMIT` | context plugin | Cap on wiki notes listed per wiki per session (default 200; beyond it the listing ends with a count). |
45
-
46
- ### Memory and learn
47
-
48
- Where distilled memories land at session end, and which model distils them. See [Memory](../concepts/memory.md).
49
-
50
- | Variable | Read by | Effect |
51
- | --- | --- | --- |
52
- | `GENESEED_HARNESS` | learn, context, guard plugins; CLI | Base whose `memory/` is written (and where `wiki.jsonc` is looked up). Optional — the plugin finds the in-config store by itself; set it to pin the location. |
53
- | `GENESEED_MEMORY` | learn plugin, CLI | Explicit memory dir; wins over `GENESEED_HARNESS`. |
54
- | `GENESEED_MODEL` | learn + context plugins | `provider/model` fallback when the session's model can't be read from the transcript. |
55
- | `GENESEED_LLM` | learn hook (Claude Code, Bob, OpenClaude) | Model CLI used to distil, e.g. `claude -p`. Unset, the hook prints the prompt instead of distilling. |
56
- | `GENESEED_LEARN_DEBOUNCE_MS` | learn plugin | Quiet period before distilling, in ms (default 60000). |
57
-
58
- ### Guard
59
-
60
- The OpenCode safety guard. On Claude Code, Bob and OpenClaude the same gates are hooks and have no environment switch.
33
+ ## OpenCode plugin variables
61
34
 
62
- | Variable | Read by | Effect |
63
- | --- | --- | --- |
64
- | `GENESEED_GUARD` | guard plugin | `warn` downgrades every block to a logged warning; `off` disables the guard. |
65
-
66
- ### Notifications
67
-
68
- The desktop ping when a long turn finishes (OpenCode).
69
-
70
- | Variable | Read by | Effect |
71
- | --- | --- | --- |
72
- | `GENESEED_NOTIFY` | notify plugin | `off` disables notifications. |
73
- | `GENESEED_NOTIFY_MIN_SECONDS` | notify plugin | Minimum turn length before notifying (default 30; `0` = every turn). |
74
- | `GENESEED_NOTIFY_TITLE` | notify plugin | Notification title (default `Geneseed`). |
75
-
76
- ### Other OpenCode plugins
77
-
78
- | Variable | Read by | Effect |
79
- | --- | --- | --- |
80
- | `GENESEED_PONYTAIL` | ponytail plugin | Starting minimal-code level: `lite` \| `full` \| `ultra` \| `off` (default `off`; switch live with `/ponytail <level>`). |
81
- | `GENESEED_WORKFLOWS_DIR` | workflow plugin | Directory the `workflow` tool loads saved scripts from. |
82
- | `GENESEED_ACTIVITY` | activity plugin | `off` stops writing the live-activity files the web console reads. |
83
- | `GENESEED_DEBUG` | every plugin but guard and learn (which always log) | `1` logs what each plugin decided to stderr. |
84
- | `OPENCODE_DISABLE_LSP_DOWNLOAD` | OpenCode itself | `true` stops OpenCode downloading language servers — for air-gapped machines; install each server yourself. |
35
+ Each OpenCode plugin's page lists its own switches: [guard](plugin-guard.md) (`GENESEED_GUARD`), [notify](plugin-notify.md) (`GENESEED_NOTIFY`, `GENESEED_NOTIFY_MIN_SECONDS`, `GENESEED_NOTIFY_TITLE`), [ponytail](plugin-ponytail.md) (`GENESEED_PONYTAIL`), [workflow](plugin-workflow.md) (`GENESEED_WORKFLOWS_DIR`) and [activity](plugin-activity.md) (`GENESEED_ACTIVITY`). `GENESEED_DEBUG=1` makes every plugin but guard and learn (which always log) say what it decided on stderr. `OPENCODE_DISABLE_LSP_DOWNLOAD` belongs to OpenCode itself: see [Language servers](../concepts/lsp.md).
85
36
 
86
- ### Web console and CLI
37
+ ## Web console and CLI
87
38
 
88
39
  How the `geneseed` command behaves and prints.
89
40
 
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  group: reference
3
- order: 3
3
+ order: 20
4
4
  title: "Glossary"
5
5
  kind: "glossary"
6
+ section: "Glossary & about"
7
+ description: "Every Geneseed word you won't find in a programming glossary, with a dev analogy."
6
8
  ---
7
9
  Every word Geneseed uses that you would not find in a general programming glossary. The console shows this table in your installed theme's voice beside the neutral words; on GitHub you read the neutral ones.
8
10
 
@@ -26,6 +28,10 @@ Every word Geneseed uses that you would not find in a general programming glossa
26
28
  | Posture | — | the relationship register the agent works in (peer, mentor, expert, assistant, artisan) | pairing style |
27
29
  | Mode | — | how work gets executed — direct (the agent works every task itself) or foreman (substantial tasks spawn an isolated pipeline) | solo vs. delegating to a sub-team |
28
30
  | Footprint | — | how much of the Rules loads inline each turn (full vs lean) | eager vs. lazy loading |
31
+ | Loop | — | a requirement worked as small, validated, committed iterations on their own branch, driven by `geneseed loop` | a state machine over a ticket's steps |
32
+ | Iteration | — | one cycle of a loop back to its head; closes into its own commit | one sprint-of-one through a checklist |
33
+ | Brick | — | one node of a loop graph: a prompt for one agent or skill, reporting one of a declared set of outcomes | a step in a runbook |
34
+ | Trust preset | — | the loop's risk tolerance — prudent, balanced (default) or aggressive — set at `loop init` and editable in `LOOP.md` | how much a reviewer lets through without a second look |
29
35
  | Profile | — | who you are — seeded once, colours but never binds | your onboarding notes |
30
36
  | Memory force | — | a memory's binding strength (constraint, choice, conviction, tempered) | MUST / SHOULD / MAY |
31
37
  | Tagline | TAGLINE | the one-line essence of the theme | — |
@@ -0,0 +1,20 @@
1
+ ---
2
+ group: reference
3
+ order: 2
4
+ title: "Loop actions"
5
+ kind: "concept"
6
+ section: "CLI & environment"
7
+ description: "The geneseed loop actions, one line each."
8
+ ---
9
+ The actions of `geneseed loop`, the state machine behind [Loops](../concepts/loops.md). The `loop` skill calls them for you; [Finish a loop](../guides/loop-finish.md) shows how to drive one by hand.
10
+
11
+ | action | what it does |
12
+ |---|---|
13
+ | `check` | lists templates and every brick (available, unavailable, overridden); validates one graph file (`--graph`) or one brick file (`--brick`) |
14
+ | `init` | writes a fresh `LOOP.md` from a template or graph file, under a title, requirement and trust preset |
15
+ | `next` | the only driver of the cycle — returns the next thing to do: run a node, score a card, answer an `awaiting`, or a terminal |
16
+ | `score` | scores a declared card (`--declared`) before a mutate node runs, or the real diff (`--diff`, numstat piped on stdin) before a commit |
17
+ | `record` | records a brick's reported outcome and advances the graph; `--note` or `--note-file <path>` carries a finding (a read brick's plan or review findings) into `LOOP.md`'s notes so it survives the unit |
18
+ | `decide` | answers an `awaiting` validation with a verdict and a note |
19
+
20
+ Run `geneseed loop --help` for the full flag list.
@@ -1,130 +1,28 @@
1
1
  ---
2
2
  group: reference
3
- order: 5
4
- title: "OpenCode plugins"
5
3
  kind: "concept"
4
+ section: "OpenCode plugins"
5
+ order: 12
6
+ title: "OpenCode plugins"
7
+ description: "What the OpenCode plugins are, how they install, and the folders that silence them."
6
8
  ---
7
9
  On OpenCode, Geneseed's automation runs as {N_PLUGINS} plugins: small JavaScript files OpenCode loads from its `plugins/` directory at startup. They are what turns a rule from *asked* into *enforced* — the context load, the safety gates, memory distillation. On Claude Code, Bob and OpenClaude the same jobs are done by hooks instead (see [Hooks](../concepts/hooks.md)).
8
10
 
9
11
  > **You already know this:** a plugin is a git hook for your agent — code that runs on an event (session start, before a tool call, session idle), not text the model may or may not follow.
10
12
 
11
- Every plugin installs in the same step as the rest of the harness: `geneseed setup`, or `geneseed build --emit opencode-global` (global, into `~/.config/opencode/plugins/`) / `--emit opencode` (per-repo, into `.opencode/plugins/`). Installing by hand is covered in [Install](../guides/install.md). Keep **one** copy of each: OpenCode loads two local copies of the same plugin twice.
12
-
13
- Every plugin swallows its own errors — none can block or crash a session. Each variable below is also listed in [Environment variables](environment.md).
14
-
15
- ## geneseed-context
16
-
17
- **What it does.** Puts your project's documentation (and your machine wiki) into the agent's context before your first turn, so the agent never has to be trusted to read it. It needs **no per-repo file**: it discovers docs by convention.
18
-
19
- - **Injected in full (eager):** root `README.md`, `CONTRIBUTING.md`, `.cursorrules`, `user-rules.md`, `PROFILE.md`. Budget-capped; an oversized file is listed instead, never silently truncated. (`AGENT.md`, `AGENTS.md` and `CLAUDE.md` are not injected — OpenCode already loads them.)
20
- - **Listed (lazy, path + first heading, read on demand):** `docs/`, `doc/`, `documentation/`, `architecture/`, `adr/`, and `packages/*/README.md` / `apps/*/README.md` in a monorepo. `node_modules`, `.git`, `dist`, `build`, `vendor` and similar are never scanned.
21
- - **Machine wiki:** the wikis declared in `wiki.jsonc` ride in the same block, on the same budgets. See [Wiki](../guides/wiki.md).
22
- - **Explicit manifest:** `$GENESEED_CONTEXT`, `.harness/context.json` or a root `context.json` takes over from discovery; `"extend": true` layers it on top instead. See [Project context](../guides/project-context.md).
23
-
24
- **When it runs.** On every request: the context rides invisibly in the request's message list, so it also survives compaction. If your OpenCode build lacks that (experimental) hook, the plugin notices and falls back to one visible message at session start, re-pushed when the session compacts.
25
-
26
- **What you see.** Normally nothing — the context is there, but not shown. With the visible fallback, a `PROJECT CONTEXT` block at the top of the session.
27
-
28
- **Switches.**
29
- - `GENESEED_CONTEXT_INJECT=off` — no injection; the agent is only *asked* to read the docs.
30
- - `GENESEED_CONTEXT_VISIBLE=1` — force the visible block (legacy `GENESEED_CONTEXT_TRANSFORM=0` does the same).
31
- - `GENESEED_EAGER_FILE_KB` / `GENESEED_EAGER_TOTAL_KB` (default 16 / 48), `GENESEED_LAZY_HEADINGS` (64), `GENESEED_WIKI_LAZY_LIMIT` (200) — budgets.
32
- - `GENESEED_WIKI` — explicit `wiki.jsonc` path.
33
- - `GENESEED_DEBUG=1` — log what it discovered and injected to stderr. Silence with this set means the plugin did not load.
34
-
35
- ## geneseed-guard
36
-
37
- **What it does.** Enforces the safety rules at the tool boundary — before a tool call runs, not after. High-confidence patterns only, so legitimate work is not caught.
38
-
39
- - **Blocks** writes to private-key and credential files (*Sealed Secrets*), catastrophic shell commands such as deleting the filesystem root (*Deletion Is Deliberate*), and any change — write, move, rename, delete — under a wiki folder declared `protected` in `wiki.jsonc`.
40
- - **Warns** (logged, allowed) on `.env` writes and force-push.
41
- - **Speed-bumps** the *first* write to `user-rules.md` or a memory file: it is refused once, naming *Persist Insight* — whether something is a standing rule or a fact to remember is your call, settled through the `rule` skill. The re-issued write goes through.
42
-
43
- It ships whole on every install, whatever [doctrine packs](../concepts/rules.md) you chose. On Claude Code and Bob the same checks are hooks, which can *ask* you instead of refusing; OpenCode's tool hook has no ask tier. Protected wiki folders are enforced only here — on the other hosts they are an instruction.
44
-
45
- **When it runs.** Before every tool call (`tool.execute.before`).
46
-
47
- **What you see.** A refused tool call: `[geneseed-guard] blocked: <reason> — set GENESEED_GUARD=off to allow`. Warnings go to stderr.
48
-
49
- **Switches.**
50
- - `GENESEED_GUARD=warn` — log every block, allow the call.
51
- - `GENESEED_GUARD=off` — disable the guard.
52
-
53
- ## geneseed-learn
54
-
55
- **What it does.** Distils durable memories from the conversation into the install's `memory/` directory and keeps `MEMORY.md` up to date, de-duplicating against what is already stored. It is the OpenCode counterpart of the Claude Code `Stop` hook, but needs no API key and no model CLI: it distils with the **same model the session used**, through your OpenCode provider config. See [Memory](../concepts/memory.md).
56
-
57
- **When it runs.** After the session goes quiet. OpenCode signals "idle" after every turn, so each idle re-arms a timer and the distil runs once nothing has happened for `GENESEED_LEARN_DEBOUNCE_MS` (default 60 s). Trivial sessions are skipped.
58
-
59
- **What you see.** On stderr: `[geneseed-learn] wrote N memory file(s): …`, or `skipped: <reason>`. Total silence means it did not load.
60
-
61
- **Where it writes** — the first that resolves:
62
- 1. `GENESEED_MEMORY` — an explicit memory dir;
63
- 2. `$GENESEED_HARNESS/memory` (`/anamnesis` for the imperial theme);
64
- 3. the `memory/` beside the plugin's own install (the global install's store);
65
- 4. `./memory` or `./Harness/memory`, when the bundle lives in the project.
66
-
67
- So a global install needs nothing set; use `GENESEED_HARNESS` only to pin the location. If none resolves, it logs `no memory dir — set $GENESEED_HARNESS or $GENESEED_MEMORY.` and does nothing.
68
-
69
- **Switches.**
70
- - `GENESEED_MODEL=provider/model` — fallback when the session's model can't be read. Without it you get `could not determine a model`.
71
- - `GENESEED_LEARN_DEBOUNCE_MS` — the quiet period.
72
-
73
- ## geneseed-workflow
74
-
75
- **What it does.** Registers one tool, `workflow`, that runs saved orchestration scripts. The script — not the model — drives the control flow: the deterministic counterpart of the `council` and `parallel-agents` skills.
76
-
77
- - **Saved scripts only.** It loads `<name>.js` from the `workflows/` directory beside `plugins/`; nothing the model writes is evaluated. Shipped: `council`, `dispatch`, `research-plan-implement`, `review`.
78
- - **Call shape:** `workflow({ name, args })`; with no name it lists what is available.
79
- - **Isolation:** a script can run a child agent in its own git worktree on its own branch. A worktree with no change is removed; one with changes is kept, and the summary lists every kept branch and every file more than one agent changed. Nothing is merged or committed for you. Without git, such a child fails rather than falling back to the shared tree.
80
-
81
- **When it runs.** When the agent calls the `workflow` tool — usually because you asked for one.
82
-
83
- **What you see.** The tool's summary in the conversation. A phase-by-phase trace and the full result land in `.geneseed/workflow-runs/<runId>.log`.
84
-
85
- **Switches.**
86
- - `GENESEED_WORKFLOWS_DIR` — load scripts from another directory.
87
- - `GENESEED_DEBUG=1` — log to stderr.
88
-
89
- Ask the agent to *"list available workflows"* to check it loaded.
90
-
91
- ## geneseed-notify
92
-
93
- **What it does.** Sends a native desktop notification when the agent finishes a long turn, so you can start a run, walk away, and be called back. macOS uses `osascript`, Linux `notify-send` (install `libnotify` if nothing appears), Windows a PowerShell balloon.
94
-
95
- **When it runs.** When a session goes idle, and only if the turn took longer than `GENESEED_NOTIFY_MIN_SECONDS` (default 30) since your last prompt. Sub-agent sessions and the learn plugin's own sessions are skipped.
96
-
97
- **What you see.** A notification titled `Geneseed`. With `GENESEED_DEBUG=1`, `[geneseed-notify] notified for …` on stderr.
98
-
99
- **Switches.**
100
- - `GENESEED_NOTIFY=off` — disable.
101
- - `GENESEED_NOTIFY_MIN_SECONDS=N` — threshold (`0` = every turn).
102
- - `GENESEED_NOTIFY_TITLE="…"` — the title.
103
-
104
- ## geneseed-ponytail
105
-
106
- **What it does.** Holds an opt-in minimal-code mode: once on, it appends the "laziest solution that works" ruleset to the system prompt **every turn**, so the agent doesn't drift back to over-building mid-session. It is the sustained form of the `ponytail` skill, and it is not part of the [rules](../concepts/rules.md): nothing about it applies until you switch it on.
107
-
108
- **When it runs.** Every turn, while a level is set. It starts `off`.
109
-
110
- **What you see.** Replies that favour the smallest working change. Switch with `/ponytail lite|full|ultra|off` (bare `/ponytail` means `full`); the level is saved to `.geneseed-ponytail` beside OpenCode's config and applies from the next turn. On an OpenCode build without the experimental system-prompt hook it never injects; the skill still works.
111
-
112
- **Switches.**
113
- - `GENESEED_PONYTAIL=lite|full|ultra` — the starting level (default `off`).
114
- - `GENESEED_DEBUG=1` — logs `[geneseed-ponytail] ponytail <level>` on each switch.
115
-
116
- ## geneseed-activity
117
-
118
- **What it does.** Feeds the web console's **Activity** view: one small JSON file per session under `activity/` beside OpenCode's config, recording what the session is doing — phase, model, token and cost totals, files touched, plan, last error. The console reads and prunes those files; the two only meet on disk, so a crash on either side never blocks a session.
13
+ Every plugin installs in the same step as the rest of the harness: `geneseed setup`, or `geneseed build --emit opencode-global` (global, into `~/.config/opencode/plugins/`) / `--emit opencode` (per-repo, into `.opencode/plugins/`). Installing by hand is covered in [Install on OpenCode](../guides/install-opencode.md). Keep **one** copy of each: OpenCode loads two local copies of the same plugin twice.
119
14
 
120
- **When it runs.** On session events, for top-level sessions only (sub-agents and learn's sessions are skipped). Entries whose process died or went stale are pruned by the reader.
15
+ Every plugin swallows its own errors — none can block or crash a session. Each plugin's page lists the variables that tune it.
121
16
 
122
- **What you see.** A card per live session in **Activity** (`geneseed web`).
17
+ ## The plugins
123
18
 
124
- **Switches.**
125
- - `GENESEED_ACTIVITY=off` — kill switch at startup.
126
- - The Activity page's own toggle writes a `.geneseed-activity` flag file, read per event — no restart needed.
127
- - `GENESEED_DEBUG=1` — logs each write as `[geneseed-activity] …`.
19
+ - [geneseed-context](plugin-context.md): Puts your project docs, rules, profile, memory index and wiki in front of the agent.
20
+ - [geneseed-guard](plugin-guard.md): Blocks credential files, catastrophic commands and protected wiki writes before they run.
21
+ - [geneseed-learn](plugin-learn.md): Distils durable facts into memory/ once a session goes quiet.
22
+ - [geneseed-workflow](plugin-workflow.md): Adds a workflow tool that runs saved orchestration scripts.
23
+ - [geneseed-notify](plugin-notify.md): A desktop notification when a long turn finishes.
24
+ - [geneseed-ponytail](plugin-ponytail.md): An opt-in minimal-code mode, re-applied every turn.
25
+ - [geneseed-activity](plugin-activity.md): Feeds the web console's Activity view, one small file per session.
128
26
 
129
27
  ## Excluded folders
130
28
 
@@ -0,0 +1,20 @@
1
+ ---
2
+ group: reference
3
+ kind: "concept"
4
+ section: "OpenCode plugins"
5
+ order: 19
6
+ title: "geneseed-activity"
7
+ description: "Feeds the web console's Activity view, one small file per session."
8
+ ---
9
+ One of the [OpenCode plugins](opencode-plugins.md). [Environment variables](environment.md) points here for its switches.
10
+
11
+ **What it does.** Feeds the web console's **Activity** view: one small JSON file per session under `activity/` beside OpenCode's config, recording what the session is doing — phase, model, token and cost totals, files touched, plan, last error. The console reads and prunes those files; the two only meet on disk, so a crash on either side never blocks a session.
12
+
13
+ **When it runs.** On session events, for top-level sessions only (sub-agents and learn's sessions are skipped). Entries whose process died or went stale are pruned by the reader.
14
+
15
+ **What you see.** A card per live session in **Activity** (`geneseed web`).
16
+
17
+ **Switches.**
18
+ - `GENESEED_ACTIVITY=off` — kill switch at startup.
19
+ - The Activity page's own toggle writes a `.geneseed-activity` flag file, read per event — no restart needed.
20
+ - `GENESEED_DEBUG=1` — logs each write as `[geneseed-activity] …`.