geneseed 3.6.0 → 3.8.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 (88) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/DESIGN.md +6 -6
  3. package/QUICKSTART.md +1 -1
  4. package/README.md +33 -31
  5. package/SETUP.md +36 -10
  6. package/SHIPPED.md +3 -3
  7. package/adapters/claude-code/skills/geneseed/SKILL.md +1 -1
  8. package/adapters/openclaude/README.md +64 -0
  9. package/adapters/opencode/plugins/geneseed-workflow.js +1 -1
  10. package/adapters/opencode/workflows/_runtime.js +1 -1
  11. package/docs/extending.md +18 -6
  12. package/docs/web/exclusions.md +1 -0
  13. package/docs/web/footprint.md +1 -1
  14. package/docs/web/harnesses.md +14 -14
  15. package/docs/web/install-quick.md +1 -1
  16. package/docs/web/rules.md +1 -1
  17. package/docs/web/themes-author.md +1 -1
  18. package/docs/web-ui.md +1 -1
  19. package/harness.config.json +1 -1
  20. package/js/README.md +3 -3
  21. package/js/build/driver.mjs +64 -14
  22. package/js/build/emit-claude.mjs +1 -1
  23. package/js/build/generate.mjs +92 -42
  24. package/js/build/source.mjs +5 -4
  25. package/js/cli-table.json +151 -2
  26. package/js/hosts/hooks.mjs +11 -4
  27. package/js/hosts/hosts.mjs +17 -2
  28. package/js/hosts/installs.mjs +32 -2
  29. package/js/hosts/mcp.mjs +8 -1
  30. package/js/hosts/settings.mjs +4 -1
  31. package/js/inspect/diff.mjs +1 -1
  32. package/js/inspect/doctor.mjs +3 -3
  33. package/js/inspect/excludes.mjs +7 -5
  34. package/js/inspect/status.mjs +44 -8
  35. package/js/maintain/migrate.mjs +1 -1
  36. package/js/maintain/setup.mjs +7 -2
  37. package/js/maintain/uninstall.mjs +3 -3
  38. package/js/web/actions.mjs +7 -5
  39. package/js/web/api.mjs +2 -2
  40. package/js/web/docs.mjs +1 -1
  41. package/package.json +2 -1
  42. package/src/doctrines/README.md +3 -2
  43. package/src/doctrines/comms.md +53 -0
  44. package/src/doctrines/process.md +0 -26
  45. package/src/skills/geneseed.md +9 -8
  46. package/src/skills/parallel-agents.md +1 -1
  47. package/src/skills/pipeline.md +1 -1
  48. package/src/skills/token-report/SKILL.md +2 -1
  49. package/src/skills/token-report/VENDOR.md +3 -3
  50. package/src/skills/token-report/scripts/token_report.mjs +14 -7
  51. package/src/skills/workflow.md +2 -2
  52. package/themes/_TEMPLATE.json +5 -3
  53. package/themes/biker.json +5 -3
  54. package/themes/commentator.json +5 -3
  55. package/themes/cyberpunk.json +5 -3
  56. package/themes/gamer.json +5 -3
  57. package/themes/imperial.json +5 -3
  58. package/themes/joker.json +5 -3
  59. package/themes/marvin.json +5 -3
  60. package/themes/mean.json +5 -3
  61. package/themes/military.json +5 -3
  62. package/themes/neutral.json +5 -3
  63. package/themes/pirate.json +5 -3
  64. package/themes/sports.json +5 -3
  65. package/themes/verstappen.json +5 -3
  66. package/themes/wizard.json +5 -3
  67. package/web/dist/assets/{Activity-Flgf4kHy.js → Activity-CH-7cPIM.js} +1 -1
  68. package/web/dist/assets/{ActivityDetail-DIpr85nh.js → ActivityDetail-DZvz0xS5.js} +1 -1
  69. package/web/dist/assets/{CatalogRow-CjyLjaLb.js → CatalogRow-DftXpZHY.js} +1 -1
  70. package/web/dist/assets/{Diff-Deisdha8.js → Diff-DvwdG0L9.js} +1 -1
  71. package/web/dist/assets/{Docs-DGUdY4l4.js → Docs-DrJNDPwI.js} +1 -1
  72. package/web/dist/assets/{Doctor-F74lJ69P.js → Doctor-OTmwmYZg.js} +1 -1
  73. package/web/dist/assets/{GreenhouseView-D072lBiD.js → GreenhouseView-XxrAdriX.js} +1 -1
  74. package/web/dist/assets/Harness-C_LYNk5c.js +1 -0
  75. package/web/dist/assets/{JournalView-DWFqZ0Iw.js → JournalView-BcuyeEaR.js} +1 -1
  76. package/web/dist/assets/{Laws-BN6g3HU7.js → Laws-CWHrTKY4.js} +1 -1
  77. package/web/dist/assets/{Library-CDOv4emM.js → Library-CA9IHghn.js} +1 -1
  78. package/web/dist/assets/{OperatorHudView-CwNIUVX8.js → OperatorHudView-BMRY1Tt4.js} +1 -1
  79. package/web/dist/assets/{Profile-CpP9BTne.js → Profile-wceET1JY.js} +1 -1
  80. package/web/dist/assets/{Rules-DFXsUCB7.js → Rules-BEXvY4Tx.js} +1 -1
  81. package/web/dist/assets/{Settings-BqZVUtJ5.js → Settings-DS2zF0Ez.js} +1 -1
  82. package/web/dist/assets/{Skills-Cu6kBgfF.js → Skills-DahlOJuI.js} +1 -1
  83. package/web/dist/assets/{drawable-BgfrEBer.js → drawable-BTHjTzF7.js} +1 -1
  84. package/web/dist/assets/{index-CAqrWhKl.js → index-AN5Emnrg.js} +2 -2
  85. package/web/dist/assets/{lawCats-BLgxl151.js → lawCats-Btjp3Hk_.js} +1 -1
  86. package/web/dist/index.html +1 -1
  87. package/web/src/pages/Laws.jsx +6 -2
  88. package/web/dist/assets/Harness-DNRP2Va7.js +0 -1
package/CHANGELOG.md CHANGED
@@ -10,6 +10,80 @@ label. For the capability ↔ spec map, see [SHIPPED.md](SHIPPED.md).
10
10
 
11
11
  _Nothing yet._
12
12
 
13
+ ## [3.8.0] — 2026-09-30
14
+
15
+ **Upgrading:** re-emit (or `geneseed rebuild-all`) after installing, so each install carries the
16
+ rewritten `geneseed` skill.
17
+
18
+ ### Added
19
+ - `geneseed status` lists every install with its theme, footprint, posture/mode, doctrine packs
20
+ and excluded rules; `geneseed status --json` prints the same payload plus, per install, the
21
+ `geneseed build` command that rebuilds it unchanged — a global install's command names its
22
+ config dir with `--config-dir`, so it rebuilds in place even from a shell without the env
23
+ override that located it.
24
+ - `geneseed build` forwards the generator's flags (`--emit`, `--footprint`, `--posture`, `--mode`,
25
+ `--doctrines`, `--exclude-rules`, `--out`, `--root`, `--config-dir`); the dry run is
26
+ `geneseed validate`.
27
+
28
+ ### Fixed
29
+ - `setup`'s non-interactive hint (`geneseed build --emit … --theme …`) was a usage error.
30
+ - The `geneseed` skill named `geneseed learn` and `geneseed context`, which are hook verbs the CLI
31
+ refuses; it now reads `status --json` and changes an install by one flag of its rebuild command.
32
+ - README and SETUP claimed `geneseed-build --validate-only` dry-runs a build; the generator refuses
33
+ that flag, and both now name `geneseed validate`.
34
+ - A `-global` emit ignored `--out` and always wrote the live config dir, so a global install could
35
+ not be previewed anywhere else; `--config-dir <dir>` now redirects it, and a per-repo emit
36
+ refuses the flag rather than ignoring it (#156).
37
+
38
+ ## [3.7.0] — 2026-09-28
39
+
40
+ **Upgrading:** re-emit (or `geneseed rebuild-all`) after installing. An install built before
41
+ this change keeps the reference-codes rule: see *Address migration* below.
42
+
43
+ ### Added — doctrines
44
+
45
+ - **A fifth doctrine pack, `comms` — how answers are presented.** On by default, rendered last
46
+ (craft → rigor → ops → process → comms), toggleable like every pack. It holds two rules:
47
+ - `comms 1` — *Codes That Persist*: the reference-codes rule (`D`/`O`/`F`/`R`/`Q`/`A`),
48
+ moved out of process unchanged, themed titles included.
49
+ - `comms 2` — *Structure Beside Prose*: beside the prose, pick a diagram or a table, rarely
50
+ both. Draw a boxes-and-arrows diagram only when the arrows carry meaning (flow,
51
+ dependencies, topology, a spatial subject, four or more linked elements, or on request);
52
+ classifications and comparisons take a table or list; three steps or fewer stay inline.
53
+ ASCII in a terminal, Mermaid where markdown renders it; a richer rendered page is offered
54
+ in one line, never built unasked. Strictly additive to `comms 1`: a diagram or table may
55
+ tag a coded item, never absorb, merge or renumber it.
56
+
57
+ ### Changed — address migration
58
+
59
+ Anyone citing a doctrine rule by address must remap two of them:
60
+
61
+ | Old address | New address | Rule |
62
+ |---|---|---|
63
+ | `process 7` | `comms 1` | Codes That Persist (reference codes) |
64
+ | `process 8` | `process 7` | One Writer Per File |
65
+
66
+ `process 1`–`6` are unchanged. Every citation inside `src/` was remapped in this change. An
67
+ existing install is migrated when it is next rebuilt: if its carrier was rendered before the
68
+ comms pack existed (it names `process 8`, as a heading or in its `Excluded rules:` line) and its
69
+ `Active packs:` marker names `process`, `comms` is added so the codes rule is not lost; its
70
+ excluded rules are re-addressed by the table above. An install built after this change that has
71
+ comms switched off stays off.
72
+
73
+ ### Added — hosts
74
+
75
+ - **OpenClaude as a fifth host** (`--emit openclaude` / `--emit openclaude-global`).
76
+ [OpenClaude](https://openclaude.gitlawb.com/) is an any-model CLI forked from Claude Code, so
77
+ it rides the Claude engine and hook dialect verbatim. Only the paths differ:
78
+ `~/.openclaude` (`$OPENCLAUDE_CONFIG_DIR`, OpenClaude's own variable) globally, and
79
+ `.openclaude/` per repo. The per-repo preamble is `.openclaude/CLAUDE.md` rather than a root
80
+ file, because OpenClaude skips a root `CLAUDE.md` whenever `AGENTS.md` exists. MCP config goes
81
+ in `.openclaude.json` / `.mcp.json`. The host is wired through setup (appended after `files`,
82
+ so scripted menu answers keep their numbers), uninstall, disable/enable, excludes, status,
83
+ doctor, the web console's Harness page and Deploy form, and the `token-report` skill. The
84
+ golden matrix gains 56 cells, plus 2 deletion cells. Unverified live: no OpenClaude install
85
+ on the authoring machine. See `adapters/openclaude/README.md`.
86
+
13
87
  ## [3.6.0] — 2026-09-27
14
88
 
15
89
  **Upgrading:** re-emit (or `geneseed rebuild-all`) after installing. The root file changed, and
package/DESIGN.md CHANGED
@@ -44,8 +44,8 @@ vault or a specific tool's hooks.
44
44
  and the prose words the docs use: the core nouns `LAW(S)`/`DOCTRINE(S)`/`ONTOLOGY`/
45
45
  `AGENT(S)`/`SKILL(S)`/`MEMORY`/`NOTEBOOK`/`VAULT`/`WIKI`, plus `TAGLINE`,
46
46
  `LOADED_SIGIL`, `EPI_*`, `BENEDICTION`, `DESC_*`, `ROAST_PERSONA`, the invariant
47
- titles `LEX_I`..`LEX_XI`, the 27 doctrine-rule titles `DOC_<PACK>_<n>`, the four pack
48
- names `PACK_CRAFT`/`PACK_RIGOR`/`PACK_OPS`/`PACK_PROCESS`, and the section intros
47
+ titles `LEX_I`..`LEX_XI`, the 28 doctrine-rule titles `DOC_<PACK>_<n>`, the five pack
48
+ names `PACK_CRAFT`/`PACK_RIGOR`/`PACK_OPS`/`PACK_PROCESS`/`PACK_COMMS`, and the section intros
49
49
  `INTRO_*`. Each theme defines its own nouns; **neutral keeps the plain words** (Rule,
50
50
  Doctrine, Agent, Skill, Memory, Workspace), so neutral output is unchanged.
51
51
  `{{LAW}}` and `{{DOCTRINE}}` must each be a **single word** — both heading parsers
@@ -101,9 +101,9 @@ vault or a specific tool's hooks.
101
101
  - **Invariants** (`src/laws/universal.md`) — *what is never traded*. Eleven numbered
102
102
  Rules, `I`..`XI`, nine in force — IX and XI are retired in place, their numbers kept so
103
103
  existing citations resolve — headed `### {{LAW}} <roman> — {{LEX_<roman>}}`.
104
- - **Doctrines** (`src/doctrines/{craft,rigor,ops,process}.md`) — *how work is done
104
+ - **Doctrines** (`src/doctrines/{craft,rigor,ops,process,comms}.md`) — *how work is done
105
105
  here*. Practice rules addressed by pack and number, cited as `Doctrine process 5`.
106
- `PACK_ORDER` (`js/build/source.mjs`) fixes the order craft → rigor → ops → process, which
106
+ `PACK_ORDER` (`js/build/source.mjs`) fixes the order craft → rigor → ops → process → comms, which
107
107
  is narrative and deliberately not alphabetical.
108
108
 
109
109
  **The Ontology and the Invariants are never toggleable** — every build carries both,
@@ -197,7 +197,7 @@ theme file defines a `DIR_*` key, so `laws/` is `laws/` in all fourteen voices.
197
197
  | Themes | `themes/*.json` | — | token → label maps; `themes/opencode/` is a separate colour system |
198
198
  | Release label | `harness.config.json` | `.geneseed-version` | the theme and the human-readable version the driver reads; the canonical identity is the source fingerprint, not this string |
199
199
  | Lifecycle | `registry.json` | — | maintainer-side status/version/owner per agent and skill; never rendered into a bundle |
200
- | Generator | `bin/build-driver.mjs` (`geneseed-build`) | — | substitution + `<!-- INCLUDE: -->` inlining, and the nine `--emit` targets |
200
+ | Generator | `bin/build-driver.mjs` (`geneseed-build`) | — | substitution + `<!-- INCLUDE: -->` inlining, and the eleven `--emit` targets |
201
201
  | CLI, as data | `js/cli-table.json` | — | the owned document the entry point parses its own argv from |
202
202
  | Automation | `bin/geneseed-cli.mjs` (`geneseed`) | — | 25 verbs — `build` / `doctor` / `status` / `prompt` / `diff` / `setup` / `web` / `upgrade` / … |
203
203
  | Hooks | `bin/geneseed-hook.mjs` (`geneseed-hook`) | — | the five verbs an emitted hook config invokes: `context` / `git-gate` / `rule-gate` / `tool-gate` / `learn` |
@@ -225,7 +225,7 @@ theme file defines a `DIR_*` key, so `laws/` is `laws/` in all fourteen voices.
225
225
  stuck. WIRE must precede MANIFEST because wiring is what fills the `managed` record the
226
226
  manifest stores, and no RENDER may follow a WIRE because a render writes wholesale a file
227
227
  a wire has just reconciled. `tests/unit/emit_phase_order.test.mjs` fails the build if any of
228
- the nine emits drifts out of that order, or if a new file-mutating routine in
228
+ the eleven emits drifts out of that order, or if a new file-mutating routine in
229
229
  `js/hosts/settings.mjs` is called from an emit without being classified. RENDER and WIRE now run
230
230
  in the *same process* — the seam that once spawned a second runtime per emit is gone — so
231
231
  the render and wire dispatchers stay two separate functions and two separate statements on
package/QUICKSTART.md CHANGED
@@ -43,7 +43,7 @@ or a login item it did not create. Your clone keeps working meanwhile.
43
43
 
44
44
  ## Everything else
45
45
 
46
- Claude Code, Bob and plain-`AGENT.md` installs, per-repo mode, MCP servers, all
46
+ Claude Code, Bob, Copilot, OpenClaude and plain-`AGENT.md` installs, per-repo mode, MCP servers, all
47
47
  environment knobs, and troubleshooting live in the full **[Setup guide](SETUP.md)**.
48
48
 
49
49
  Once installed, point the agent at your repo's own docs with a tiny
package/README.md CHANGED
@@ -14,7 +14,7 @@
14
14
  [![Agents](https://img.shields.io/badge/agents-18-orange)](src/agents/)
15
15
  [![Laws](https://img.shields.io/badge/laws-11-critical)](src/laws/universal.md)
16
16
  [![Plugins](https://img.shields.io/badge/plugins-7-teal)](adapters/opencode/plugins/)
17
- [![OpenCode · Claude Code · Bob · Copilot · AGENT.md](https://img.shields.io/badge/works%20with-OpenCode%20·%20Claude%20Code%20·%20Bob%20·%20Copilot%20·%20AGENT.md-1f6feb)](#-supported-harnesses)
17
+ [![OpenCode · Claude Code · Bob · Copilot · OpenClaude · AGENT.md](https://img.shields.io/badge/works%20with-OpenCode%20·%20Claude%20Code%20·%20Bob%20·%20Copilot%20·%20OpenClaude%20·%20AGENT.md-1f6feb)](#-supported-harnesses)
18
18
 
19
19
  [**Why**](#-1--why-geneseed) · [**Setup**](#-2--setup) · [**Web & terminal**](#-3--web--terminal) · [**What you get**](#-4--what-you-get)
20
20
 
@@ -24,7 +24,7 @@
24
24
 
25
25
  <p align="center"><img src="docs/assets/demo.svg" alt="geneseed setup, then two laws catching a force-push and a credential at the tool boundary" width="760"></p>
26
26
 
27
- **Geneseed compiles your agent's rules instead of asking you to write them.** One source in `src/` renders into a ready-made harness for OpenCode, Claude Code, Bob, Copilot, or any `AGENT.md` tool: a constitution of laws and doctrines, a roster of capability agents, native skills, a memory convention — and, wherever the host has a hook surface, gates that *enforce* the laws at the tool boundary instead of hoping the model remembers them.
27
+ **Geneseed compiles your agent's rules instead of asking you to write them.** One source in `src/` renders into a ready-made harness for OpenCode, Claude Code, Bob, Copilot, OpenClaude, or any `AGENT.md` tool: a constitution of laws and doctrines, a roster of capability agents, native skills, a memory convention — and, wherever the host has a hook surface, gates that *enforce* the laws at the tool boundary instead of hoping the model remembers them.
28
28
 
29
29
  ```bash
30
30
  npx geneseed setup
@@ -36,8 +36,8 @@ Want to read what it leaves behind before installing anything? [**geneseed-demo*
36
36
 
37
37
  A hand-written instructions file is prose the model may or may not honour, copied into every repo and drifting in each one. Geneseed is a build, and that changes four things:
38
38
 
39
- - **Laws are enforced, not suggested.** A force-push, a `reset --hard`, or a credential written into a tracked file is caught by a hook *before* the tool runs, in the host's own dialect — a prompt on Claude Code and Copilot, a hard block on OpenCode, exit 2 on Bob. The gates fail closed, and every catch is one line in a ledger that `geneseed status` counts.
40
- - **One source, five targets.** Skills are byte-identical on every host; only the wiring differs. Every commit renders all 261 emit configurations, and a second emit into the same tree must change nothing.
39
+ - **Laws are enforced, not suggested.** A force-push, a `reset --hard`, or a credential written into a tracked file is caught by a hook *before* the tool runs, in the host's own dialect — a prompt on Claude Code, Copilot and OpenClaude, a hard block on OpenCode, exit 2 on Bob. The gates fail closed, and every catch is one line in a ledger that `geneseed status` counts.
40
+ - **One source, six targets.** Skills are byte-identical on every host; only the wiring differs. Every commit renders all 317 emit configurations, and a second emit into the same tree must change nothing.
41
41
  - **Costs are measured, not guessed.** Zero runtime dependencies. The hook path loads in about 14 ms per tool call. The default *lean* footprint keeps the always-on context small and puts the full rationale one read away — the numbers are in [docs/token-footprint.md](docs/token-footprint.md).
42
42
  - **It follows you.** Install once, globally; every repo inherits it. One `git pull` or `npm install -g geneseed@latest` rebuilds every active install.
43
43
 
@@ -164,7 +164,7 @@ The harness ships as a small set of layers, and the web console's rail is the sa
164
164
  | --- | --- |
165
165
  | **🧭 Ethos** (`ontology/`) | the mind the rules govern, in four prose sections — **Telos** (the Pact: three ranked laws — protect the user, serve their intent, keep your own honesty), **Evidence** (every claim graded by how it was obtained), **Decisions** (classify and tier by reversibility, show the real forks), **Conduct** (answer what was asked, once). Always in force, never toggleable |
166
166
  | **🛡️ Rules** (`laws/`) | 11 universal laws, nine of them in force — always, never toggleable: sealed-secrets, one-intent-one-act, verify-before-assert, deletion-is-deliberate, surface-failures, data-not-orders, least-privilege, root-cause, echo-the-intent. Laws IX and XI are retired, their numbers kept so old references resolve |
167
- | **📐 Doctrines** (`doctrines/`) | practice packs, chosen per install at build time: **craft** (how code is written), **rigor** (how work is proven), **ops** (how the machine is operated), **process** (how a task is run). A doctrine rule may tighten a Rule, never repeal one, and the user's own `user-rules.md` outranks it. Pick with `geneseed-build --doctrines craft,rigor` (or `none`), a single rule with `--exclude-rules "process 7"`, in the setup wizard, or through the switches on the console's Constitution page; all four pack files ship on disk either way, so a citation into a pack you left out still resolves |
167
+ | **📐 Doctrines** (`doctrines/`) | practice packs, chosen per install at build time: **craft** (how code is written), **rigor** (how work is proven), **ops** (how the machine is operated), **process** (how a task is run), **comms** (how answers are presented). A doctrine rule may tighten a Rule, never repeal one, and the user's own `user-rules.md` outranks it. Pick with `geneseed-build --doctrines craft,rigor` (or `none`), a single rule with `--exclude-rules "process 7"`, in the setup wizard, or through the switches on the console's Constitution page; all five pack files ship on disk either way, so a citation into a pack you left out still resolves |
168
168
  | **🤖 Agents** (18) | capability specialists: `reviewer`, `tester`, `architect`, `docs`, `security`, `explorer`, `researcher`, `developer` — plus a debate **council** the `council` skill convenes: `advocate`, `skeptic`, `pragmatist`, `steward`, `visionary`, `user-advocate`, `framer`, `empiricist`, `operator`, `historian` |
169
169
  | **🛠 Skills** (52) | repeatable workflows: brainstorm · plan · **codebase-design** · **domain-modeling** · **wayfinder** · **tickets** · **develop** · **worktree** · debug · **prototype** · refactor · **ponytail** · **forge-mcp** · **bruno-collection-generator** · **bruno-test-writer** · geneseed-code-review · **fresh-eyes** · **security-audit** · **ci-fix** · **deps-audit** · **review-response** · commit · **ship** · **release** · **migrate** · **git-archaeology** · **git-rescue** · repo-map · document-project · **frontend-design** · **prose** · **ingest** · **research** · **teach** · **quiz** · handoff · roast-me · **council** · parallel-agents · **workflow** · **wiki** · **geneseed** · **rule** · **profile** · **consolidate-memory** · **skill-forge** · **opencode-theme** · **herdr** · **pipeline** · **daydream** · **react-view-transitions** · **token-report** |
170
170
  | **🔌 Plugins** (OpenCode) | `geneseed-context` injects project docs *and your machine wiki* every session (and across compaction); `geneseed-learn` distils memory at session end; `geneseed-guard` enforces the safety Laws and protected wiki folders at the tool boundary; `geneseed-workflow` registers the `workflow` tool that runs saved orchestration scripts; `geneseed-notify` sends a native OS notification when a long run finishes; `geneseed-ponytail` holds a minimal-code mode (`/ponytail lite\|full\|ultra\|off`), opt-in, injecting the laziest-that-works ruleset every turn so it doesn't drift; `geneseed-activity` streams what each session is doing to the web console's Activity view |
@@ -210,49 +210,49 @@ A second per-install dial, **footprint**, sets how much of the constitution `AGE
210
210
 
211
211
  **Lean is authored, not cut.** The Ethos, every Rule and every doctrine rule carry a hand-written lean form beside their full text (`LEAN` blocks in `src/`), so a rule's lean footprint is decided by its author and not by where its first full stop happens to fall — the earlier first-sentence cut shipped Rule II as one 36-character line and dropped its stop-and-ask mechanism, and shipped a doctrine rule like *Change as little as the task requires.* as six words with no verb to act on.
212
212
 
213
- Both footprints put the full text on disk beside `AGENT.md`: `laws/`, `ontology/` and `doctrines/` all ship in the bundle at **full** text whatever the footprint, and **all four pack files ship whether or not the pack was built in** — which is what lets a citation into an inactive pack resolve. So lean is a context/token optimization, **not** a rules cut.
213
+ Both footprints put the full text on disk beside `AGENT.md`: `laws/`, `ontology/` and `doctrines/` all ship in the bundle at **full** text whatever the footprint, and **all five pack files ship whether or not the pack was built in** — which is what lets a citation into an inactive pack resolve. So lean is a context/token optimization, **not** a rules cut.
214
214
 
215
215
  Lean is the default: the rationale is one read away and the context it frees is paid back on every turn. Switch to **full** when token cost is a non-issue or you run a smaller model, which leans harder on always-present rationale. Set it with `--footprint lean|full`, the Settings toggle, the per-harness dropdown in the Harnesses tab, or the setup wizard. It's remembered in a `.geneseed-footprint` marker and preserved across rebuilds, on every host (OpenCode, Claude Code, Bob, Copilot).
216
216
 
217
217
  Either way the harness is otherwise identical — same files, Rules, capabilities, and guards; lean only relocates the *reasoning* to on-demand (and adds the standalone law, ontology and doctrine files to global/Claude/Bob installs). The one behavioural edge: with the rationale always in context, **full** applies a rule's nuance more reliably on subtle edge cases — or with a weaker model that may not reach for the pointer.
218
218
 
219
- Want to check a build before it touches anything real? `geneseed-build --validate-only --theme NAME --emit MODE --out TARGET` renders and validates into a throwaway sandbox — nothing under `--out`/`--root` is written — and exits non-zero on any problem. Details: [SETUP.md](SETUP.md#dry-run-a-build-validate).
219
+ Want to check a build before it touches anything real? `geneseed validate --theme NAME --emit MODE --out TARGET` renders and validates into a throwaway sandbox — nothing under `--out`/`--root` is written — and exits non-zero on any problem. Details: [SETUP.md](SETUP.md#dry-run-a-build-validate).
220
220
 
221
221
  ---
222
222
 
223
223
  ## 🔌 Supported harnesses
224
224
 
225
- One source, five emit targets. Geneseed builds into whichever host you point it
225
+ One source, six emit targets. Geneseed builds into whichever host you point it
226
226
  at — each with a per-repo and a global (`-global`) variant — plus a portable
227
227
  `files` bundle any `AGENT.md`-aware tool can read. **OpenCode** runs its own
228
- engine (JS plugins, colour themes, LSP); **Claude Code**, **Bob**, and
229
- **Copilot** share one Claude-shaped engine that diverges only by host dialect.
228
+ engine (JS plugins, colour themes, LSP); **Claude Code**, **Bob**, **Copilot**
229
+ and **OpenClaude** share one Claude-shaped engine that diverges only by host dialect.
230
230
 
231
231
  The harness — its Rules, Agents, Skills, Memory convention, and preamble voice —
232
232
  is **identical on every host**. What differs is how much of it the host can
233
233
  *automate* for you (via plugins or hooks) versus carry as preamble discipline.
234
234
 
235
- | Capability | OpenCode | Claude Code | Bob | Copilot |
236
- | --- | :---: | :---: | :---: | :---: |
237
- | **Instructions file** | `AGENT.md` + `opencode.json` | `CLAUDE.md` | `AGENTS.md` + `rules/geneseed.md` | `AGENTS.md` / `copilot-instructions.md` |
238
- | **Agents** (capability specialists) | ✅ native | ✅ | ✅ | ✅ `.agent.md` |
239
- | **Skills** (byte-identical) | ✅ | ✅ | ✅ | ✅ |
240
- | **Memory & Notebook** | ✅ | ✅ | ✅ | ✅ |
241
- | **Context injection** | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 🪝 hook³ |
242
- | **Memory write-back** (learn) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 🪝 hook³ |
243
- | **Git-gate consent** (process 5) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ (warn) | 🪝 hook³ |
244
- | **Rule-gate consent** (process 1) | ⚙️ plugin² | 🪝 hook | 🪝 hook¹ (warn) | 🪝 hook³ |
245
- | **Laws I / IV at the boundary** | ⚙️ plugin (block) | 🪝 hook (ask) | 🪝 hook¹ (exit 2) | 🪝 hook³ (ask) |
246
- | **Sovereign-repo excludes** | ⚙️ plugin | ✅ `claudeMdExcludes` | ✅ rules-shadow | ➖ none |
247
- | **MCP server wiring** | ✅ `mcp` | ✅ `mcpServers` | ✅ `mcp.json` | ✅ `mcp-config.json` |
248
- | **Colour themes** | ✅ full palette | ➖ | ➖ | ➖ |
249
- | **LSP · workflow runner · primary-agent · `/`-commands** | ✅ | ➖ | ➖ | ➖ |
250
-
251
- <sub>✅ native support · ⚙️ OpenCode plugin · 🪝 `settings.json` hook · 📄 carried by preamble prose only · ➖ no host mechanism (harness discipline still applies) · ¹ Bob's own hook contract: global hooks in `~/.bob/settings/settings.json`, Claude's event names but stdout ignored on `PreToolUse` — a refusal is **exit code 2**. So Laws I/IV exit 2, the consent rules are a stderr line, `SessionStart` context is plain stdout, `Stop` runs learn; `SubagentStop`/`PreCompact` are not Bob events and are not written. Unverified live (no Bob install on the authoring machine); the harness still holds via the rules preamble. · ² OpenCode's `tool.execute.before` can only allow or throw, with no "ask the user" tier, so the rule gate is a one-shot speed bump there rather than a prompt. · ³ Copilot's `~/.copilot/settings.json` hooks (`sessionStart`, `preToolUse`, `agentStop`, `preCompact`) wired by the **global** emit only; `preToolUse` has an ask tier, so every rule asks as on Claude Code. Unverified live (no Copilot CLI on the authoring machine).</sub>
235
+ | Capability | OpenCode | Claude Code | Bob | Copilot | OpenClaude |
236
+ | --- | :---: | :---: | :---: | :---: | :---: |
237
+ | **Instructions file** | `AGENT.md` + `opencode.json` | `CLAUDE.md` | `AGENTS.md` + `rules/geneseed.md` | `AGENTS.md` / `copilot-instructions.md` | `CLAUDE.md` (in `.openclaude/` per repo) |
238
+ | **Agents** (capability specialists) | ✅ native | ✅ | ✅ | ✅ `.agent.md` | ✅ |
239
+ | **Skills** (byte-identical) | ✅ | ✅ | ✅ | ✅ | ✅ |
240
+ | **Memory & Notebook** | ✅ | ✅ | ✅ | ✅ | ✅ |
241
+ | **Context injection** | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 🪝 hook³ | 🪝 hook⁴ |
242
+ | **Memory write-back** (learn) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 🪝 hook³ | 🪝 hook⁴ |
243
+ | **Git-gate consent** (process 5) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ (warn) | 🪝 hook³ | 🪝 hook⁴ |
244
+ | **Rule-gate consent** (process 1) | ⚙️ plugin² | 🪝 hook | 🪝 hook¹ (warn) | 🪝 hook³ | 🪝 hook⁴ |
245
+ | **Laws I / IV at the boundary** | ⚙️ plugin (block) | 🪝 hook (ask) | 🪝 hook¹ (exit 2) | 🪝 hook³ (ask) | 🪝 hook⁴ (ask) |
246
+ | **Sovereign-repo excludes** | ⚙️ plugin | ✅ `claudeMdExcludes` | ✅ rules-shadow | ➖ none | ✅ `claudeMdExcludes` |
247
+ | **MCP server wiring** | ✅ `mcp` | ✅ `mcpServers` | ✅ `mcp.json` | ✅ `mcp-config.json` | ✅ `mcpServers` |
248
+ | **Colour themes** | ✅ full palette | ➖ | ➖ | ➖ | ➖ |
249
+ | **LSP · workflow runner · primary-agent · `/`-commands** | ✅ | ➖ | ➖ | ➖ | ➖ |
250
+
251
+ <sub>✅ native support · ⚙️ OpenCode plugin · 🪝 `settings.json` hook · 📄 carried by preamble prose only · ➖ no host mechanism (harness discipline still applies) · ¹ Bob's own hook contract: global hooks in `~/.bob/settings/settings.json`, Claude's event names but stdout ignored on `PreToolUse` — a refusal is **exit code 2**. So Laws I/IV exit 2, the consent rules are a stderr line, `SessionStart` context is plain stdout, `Stop` runs learn; `SubagentStop`/`PreCompact` are not Bob events and are not written. Unverified live (no Bob install on the authoring machine); the harness still holds via the rules preamble. · ² OpenCode's `tool.execute.before` can only allow or throw, with no "ask the user" tier, so the rule gate is a one-shot speed bump there rather than a prompt. · ³ Copilot's `~/.copilot/settings.json` hooks (`sessionStart`, `preToolUse`, `agentStop`, `preCompact`) wired by the **global** emit only; `preToolUse` has an ask tier, so every rule asks as on Claude Code. Unverified live (no Copilot CLI on the authoring machine). · ⁴ OpenClaude is a Claude Code fork: Claude's hook groups and verdicts verbatim, in `~/.openclaude/settings.json` (global) or `.openclaude/settings.local.json` (per repo). Unverified live (no OpenClaude install on the authoring machine).</sub>
252
252
 
253
253
  **Reading the matrix.** Everything above the divider is at full parity — no host
254
254
  drops an Agent, Skill, or the memory convention. The asymmetry is entirely in
255
- *automation mechanism*: OpenCode's plugin surface and the Claude/Bob/Copilot hook
255
+ *automation mechanism*: OpenCode's plugin surface and the Claude/Bob/Copilot/OpenClaude hook
256
256
  surfaces enforce a few Rules for you, each in the tier its host offers (a prompt on
257
257
  Claude Code, a hard block or a logged warning where the host has no prompt to
258
258
  give), and what no host can automate rides the preamble. The OpenCode-only extras (themes, LSP,
@@ -260,7 +260,8 @@ workflow runner, primary-agent) have no analogue on a Claude-shaped host.
260
260
 
261
261
  Per-host wiring in depth: **[OpenCode](adapters/opencode/README.md)** ·
262
262
  **[Claude Code](adapters/claude-code/README.md)** ·
263
- **[Bob](adapters/bob/README.md)** · **[Copilot](adapters/copilot/README.md)**.
263
+ **[Bob](adapters/bob/README.md)** · **[Copilot](adapters/copilot/README.md)** ·
264
+ **[OpenClaude](adapters/openclaude/README.md)**.
264
265
  Token cost per host: **[docs/token-footprint.md](docs/token-footprint.md)**.
265
266
 
266
267
  ## 🗂 Layout
@@ -281,7 +282,7 @@ Geneseed/
281
282
  │ ├── AGENT.md.tmpl the entrypoint, rendered to AGENT.md
282
283
  │ ├── ontology/ how the agent thinks — Telos, Evidence, Decisions, Conduct
283
284
  │ ├── laws/ the universal invariants
284
- │ ├── doctrines/ the four practice packs (craft, rigor, ops, process)
285
+ │ ├── doctrines/ the five practice packs (craft, rigor, ops, process, comms)
285
286
  │ ├── postures/ the relationship register, inlined into AGENT.md
286
287
  │ ├── modes/ the operating register, inlined into AGENT.md
287
288
  │ ├── agents/ capability specialists
@@ -293,7 +294,7 @@ Geneseed/
293
294
  ├── tests/ Node test suites, golden.mjs (every emit config) and mutate.mjs
294
295
  ├── docs/ guides (web-ui, wiki, …) + docs/web/ (the console's Docs pages);
295
296
  │ specs/, reviews/, superpowers/ are local working docs — git-ignored
296
- ├── adapters/ per-host glue (opencode/, claude-code/, bob/, copilot/)
297
+ ├── adapters/ per-host glue (opencode/, claude-code/, bob/, copilot/, openclaude/)
297
298
  └── .github/workflows/ ci.yml (doctor + tests) · publish.yml (npm, OIDC, manual only)
298
299
  ```
299
300
 
@@ -345,6 +346,7 @@ Details and precedence rules: [SETUP.md → Upgrade](SETUP.md#upgrade).
345
346
  | **[adapters/claude-code/](adapters/claude-code/README.md)** | The Claude Code hook adapter |
346
347
  | **[adapters/bob/](adapters/bob/README.md)** | The IBM Bob adapter — Claude-shaped, rules-file preamble |
347
348
  | **[adapters/copilot/](adapters/copilot/README.md)** | The GitHub Copilot adapter — global hooks (`sessionStart`, `preToolUse`, `agentStop`, `preCompact`) |
349
+ | **[adapters/openclaude/](adapters/openclaude/README.md)** | The OpenClaude adapter — the Claude engine under `~/.openclaude` / `.openclaude/` |
348
350
  | **[src/memory/README.md](src/memory/README.md)** | The memory convention |
349
351
  | **[src/notebook/README.md](src/notebook/README.md)** | The agent's own freeform-space convention |
350
352
 
package/SETUP.md CHANGED
@@ -22,7 +22,7 @@ that matches your tool, then configure and verify. For the conceptual overview s
22
22
 
23
23
  - **Node ≥ 22.3** — the only hard requirement. Geneseed ships as an npm package with
24
24
  **zero dependencies**; `npx geneseed` needs nothing else.
25
- - **Your agent tool** — OpenCode (recommended), Claude Code, Bob, Copilot, or anything
25
+ - **Your agent tool** — OpenCode (recommended), Claude Code, Bob, Copilot, OpenClaude, or anything
26
26
  that reads a root instructions file.
27
27
  - *Only for a git checkout:* **git**. Nothing else — a checkout runs the same Node
28
28
  entry points the npm package installs.
@@ -94,6 +94,7 @@ hand? Pick a path below.
94
94
  | [B — OpenCode, per-repo](#path-b--opencode-per-repo) | You want a committed `.opencode/` layer in one repository. |
95
95
  | [C — Claude Code](#path-c--claude-code) | You drive Claude Code and want the lifecycle hooks. |
96
96
  | [C′ — GitHub Copilot](#path-c--github-copilot) | You drive the Copilot CLI, coding agent, or VS Code agent mode. |
97
+ | [C″ — OpenClaude](#path-c--openclaude) | You drive OpenClaude, the any-model Claude Code fork. |
97
98
  | [D — Any `AGENT.md` tool](#path-d--any-agentmd-tool) | Cursor, Aider, or any tool that reads a root instructions file. |
98
99
  | [E — No runtime on the target at all](#path-e--no-runtime-on-the-target-at-all) | The machine that *uses* the harness cannot run Node. |
99
100
 
@@ -214,7 +215,8 @@ Inside an excluded folder the global install is fully dormant: the context,
214
215
  learn and git-gate hooks exit silently (they check `<config dir>/excludes.json`
215
216
  on every call — edits take effect immediately, no re-emit), and the global
216
217
  preamble is suppressed natively (Claude: `claudeMdExcludes` written to the
217
- repo's own `.claude/settings.local.json`; Bob: the workspace rules shadow stub;
218
+ repo's own `.claude/settings.local.json`, and OpenClaude's in `.openclaude/settings.local.json`;
219
+ Bob: the workspace rules shadow stub;
218
220
  OpenCode: the plugins stand down). Everything is reversed by `exclude remove`.
219
221
 
220
222
  Limitations: GitHub Copilot has no per-repo suppression mechanism, so the global
@@ -255,6 +257,28 @@ shape). `$COPILOT_CONFIG_DIR` relocates the personal dir, mirroring
255
257
  `$BOB_CONFIG_DIR`. Note both carriers stack if you install globally *and* per-repo —
256
258
  the global emit warns when that's about to happen.
257
259
 
260
+ ### Path C″ — OpenClaude
261
+
262
+ ```
263
+ geneseed-build --emit openclaude-global # render into ~/.openclaude
264
+ geneseed-build --emit openclaude --out . --root . # per-repo: .openclaude/, committed
265
+ ```
266
+
267
+ [OpenClaude](https://openclaude.gitlawb.com/) grew out of the Claude Code codebase, so this
268
+ is Path C with another config dir: the same agents, skills, hook groups and `ask` verdicts.
269
+ It never reads `~/.claude` or a project `.claude/`, so a Claude Code install does not reach
270
+ it. Both installs can live side by side. Two differences:
271
+
272
+ - **The per-repo preamble is `.openclaude/CLAUDE.md`**, not a root file. OpenClaude skips a
273
+ root `CLAUDE.md` whenever the repo has an `AGENTS.md`, and reads `.openclaude/CLAUDE.md`
274
+ always. Hooks go in `.openclaude/settings.local.json` (gitignored) with a
275
+ `claudeMdExcludes` for the global preamble, as on Claude Code.
276
+ - **`$OPENCLAUDE_CONFIG_DIR` relocates the global dir.** It is OpenClaude's own variable.
277
+ MCP servers go in `~/.openclaude.json`, or in `.openclaude.json` inside that dir when it is
278
+ set. Per repo they go in `.mcp.json`.
279
+
280
+ Details in [adapters/openclaude/](adapters/openclaude/README.md).
281
+
258
282
  ### Path D — Any `AGENT.md` tool
259
283
 
260
284
  ```
@@ -323,7 +347,7 @@ case where a `0` would have meant "in sync" without having checked anything.
323
347
  The constitution is three tiers, and only one of them is a choice. The **Ontology** (how the
324
348
  agent thinks — Telos, Evidence, Decisions, Conduct) and the nine **Rules** (what it never
325
349
  trades away) are always on and cannot be switched off. The **Doctrines** are practices rather
326
- than principles, and they ship as four packs:
350
+ than principles, and they ship as five packs:
327
351
 
328
352
  | Pack | What it governs |
329
353
  | --- | --- |
@@ -331,17 +355,18 @@ than principles, and they ship as four packs:
331
355
  | **rigor** | how work is proven — idempotence, honest tests, cover-and-verify, gates that can actually fail |
332
356
  | **ops** | how the machine is driven — tool discovery, commands that return, complete teardowns, restart is not reload |
333
357
  | **process** | how a session runs — planning, context economy, docs first, bounded loops, and the consent gate on every commit and push |
358
+ | **comms** | how answers are presented — stable reference codes on tracked items, a diagram or a table only where it earns its place |
334
359
 
335
360
  They are picked **at build time**, once, on the generator — there is no runtime toggle — and
336
- the default is all four:
361
+ the default is all five:
337
362
 
338
363
  geneseed-build --doctrines craft,rigor # two packs
339
364
  geneseed-build --doctrines none # ontology and the nine Rules only
340
- geneseed-build # all four (the default)
365
+ geneseed-build # all five (the default)
341
366
 
342
367
  `harness.config.json`'s `doctrines` array sets this checkout's own default, and `doctor`
343
368
  refuses one that names a pack the checkout does not ship. Order is fixed by the harness
344
- (craft → rigor → ops → process) regardless of the order you type.
369
+ (craft → rigor → ops → process → comms) regardless of the order you type.
345
370
 
346
371
  ### One rule at a time
347
372
 
@@ -428,7 +453,7 @@ you run a smaller model.
428
453
  **Same harness, either way.** Footprint changes neither what the harness *is* nor what it
429
454
  can *do*: lean and full emit identical files (same agents, skills, plugins, commands, memory,
430
455
  notebook, hooks) and every Rule is present and binding. The only structural difference is
431
- that a lean install on a global / Claude / Bob / Copilot target also ships the standalone
456
+ that a lean install on a global / Claude / Bob / Copilot / OpenClaude target also ships the standalone
432
457
  `laws/universal.md` and `ontology/` (project bundles already carry them, and `doctrines/`
433
458
  ships at both footprints on every target); the only behavioural difference is that the
434
459
  reasoning loads on demand instead of every turn. Lean is the default; full, with the rationale
@@ -438,7 +463,7 @@ with a weaker model, and is one flag away.
438
463
  Set it with `--footprint lean|full` (alongside any `--emit`), the **Footprint** toggle in
439
464
  the web Settings, the per-harness dropdown in the Harnesses tab, or the setup wizard. It is
440
465
  remembered in a `.geneseed-footprint` marker and preserved across every rebuild, on every
441
- host (OpenCode, Claude Code, Bob, Copilot).
466
+ host (OpenCode, Claude Code, Bob, Copilot, OpenClaude).
442
467
 
443
468
  ### Dry-run a build (`validate`)
444
469
 
@@ -447,8 +472,8 @@ geneseed validate --theme imperial --emit opencode --out /path/to/repo/Harness
447
472
  ```
448
473
 
449
474
  (It is a verb on the CLI rather than a flag on the generator because it runs `doctor`, and
450
- the generator is deliberately unable to start a process. `geneseed-build --validate-only
451
- …` is the same tool with the same flags.)
475
+ the generator is deliberately unable to start a process — `geneseed-build` refuses
476
+ `--validate-only` outright.)
452
477
 
453
478
  Renders and emits the requested `--theme`/`--emit`/`--out`/`--root`/`--footprint`
454
479
  combination into a throwaway sandbox — nothing under the real `--out`/`--root` is
@@ -917,6 +942,7 @@ not connected, walk these in order:
917
942
  | `GENESEED_NO_WEB` | `home` | `1` disables the web-first default of bare `geneseed` — it prints the command list instead |
918
943
  | `GENESEED_STACK_GLOBAL` | context hook | `1` disables project-bypasses-global: a project install of the same host no longer makes the global install's hook stand down, so both inject |
919
944
  | `OPENCODE_CONFIG_DIR` / `XDG_CONFIG_HOME` | global emit | where the global install is written |
945
+ | `OPENCLAUDE_CONFIG_DIR` | `openclaude-global` emit | OpenClaude's own config dir variable (default `~/.openclaude`); also moves `.openclaude.json` |
920
946
  | `OPENCODE_DISABLE_LSP_DOWNLOAD` | OpenCode (LSP) | `true` stops OpenCode auto-downloading built-in language servers (typescript, pyright, jdtls) — set it on air-gapped machines and pre-install each server yourself |
921
947
 
922
948
  ---
package/SHIPPED.md CHANGED
@@ -20,7 +20,7 @@ historical references, not files distributed with the repo.
20
20
  > **On version numbers.** [`harness.config.json`](harness.config.json)'s `version` is a
21
21
  > human-readable label only. The canonical identity of an installed harness is the
22
22
  > **source fingerprint** stamped in `.geneseed-version` (see `geneseed version`), not the
23
- > string. Current label: **3.6.0**.
23
+ > string. Current label: **3.8.0**.
24
24
 
25
25
  ## Capabilities
26
26
 
@@ -30,14 +30,14 @@ Every row below is present in the tree today; "Spec" names the design record.
30
30
  | --- | --- | --- |
31
31
  | **Themed generator** | One neutral `src/` → 14 themed bundles via `geneseed-build` (zero dependencies); structure stays theme-independent | [DESIGN.md](DESIGN.md) |
32
32
  | **Laws / Agents / Skills / Memory / Notebook** | 11 laws, 18 agents, 52 skills, the memory convention, and the agent's sovereign notebook | `2026-06-11-notebook-sovereign-space` · `2026-06-10-notebook-agent-own-space` |
33
- | **Three-tier constitution** | The governance surface splits into an always-on **Ontology** (Telos, Evidence, Decisions, Conduct — the Pact absorbed into Telos), the eleven always-on **Invariants** (IX and XI retired in place — folded into rigor 5 and Law III, numbers kept), and four toggleable **Doctrine** packs (craft, rigor, ops, process) addressed `<pack> <n>`. Packs are chosen at build time with `--doctrines` or the setup wizard; the whole catalogue ships on disk either way, so a citation into an inactive pack still resolves. Precedence, in order: Ontology + Invariants, then the user's `user-rules.md`, then the active Doctrines, then `PROFILE.md`. `doctor`'s `constitutionProblems` gates pack numbering, the per-rule Principle column, every `{{DOCTRINE}}` citation in `src/`, and the rule that an always-on tier may never cite a toggleable one | `2026-08-19-three-tier-constitution-design` |
33
+ | **Three-tier constitution** | The governance surface splits into an always-on **Ontology** (Telos, Evidence, Decisions, Conduct — the Pact absorbed into Telos), the eleven always-on **Invariants** (IX and XI retired in place — folded into rigor 5 and Law III, numbers kept), and five toggleable **Doctrine** packs (craft, rigor, ops, process, comms) addressed `<pack> <n>`. Packs are chosen at build time with `--doctrines` or the setup wizard; the whole catalogue ships on disk either way, so a citation into an inactive pack still resolves. Precedence, in order: Ontology + Invariants, then the user's `user-rules.md`, then the active Doctrines, then `PROFILE.md`. `doctor`'s `constitutionProblems` gates pack numbering, the per-rule Principle column, every `{{DOCTRINE}}` citation in `src/`, and the rule that an always-on tier may never cite a toggleable one | `2026-08-19-three-tier-constitution-design` |
34
34
  | **`doctor`** | One check: unresolved tokens, dead/non-hermetic links, theme-key parity, authoring gates, rendered-bundle drift | `2026-06-07-theme-aware-doctor-diff` |
35
35
  | **`diff` + improvements export** | Deployed-vs-source drift report; export an `improvements.md` back-port | `2026-06-12-improvements-export` |
36
36
  | **`status` / `version`** | Headless dashboard + fingerprint verdict (no TUI needed) | `2026-06-07-status-command` · `2026-06-07-version-and-uninstall` |
37
37
  | **Terminal rendering** | There is no full-screen control panel: `tui` and `menu` are verbs that say so and print the command list. The display-width and glyph layer ships on, behind `status` and the install animation | `2026-06-07-tui-refactor-polish` · `2026-06-08-tui-modern-refresh` · `2026-06-11-windows-tui` |
38
38
  | **Web console** | Local browser UI (Dashboard; Codex: Constitution, Rules, Profile, Skills, Agents, Library, Docs; Care: Activity, Changes, Doctor; Setup: Harness, Settings), auto-build, in-app docs menu | `2026-06-12-web-ui-v2` · `2026-06-12-web-auto-build` · `2026-06-13-docs-menu` |
39
39
  | **OpenCode adapter** | Native agents/skills mapping + plugins (context, learn, guard, workflow, notify, ponytail, activity); global-emit link integrity; JSONC config target | `2026-06-07-opencode-adapter-features` · `2026-06-07-global-emit-link-integrity` · `2026-06-12-opencode-jsonc-target` · `2026-06-16-ponytail-minimal-code-mode` |
40
- | **Host hooks, per dialect** | Every host gets the hook surface its runtime offers, spoken in that runtime's own verdict dialect via `--host`: Claude Code asks (`permissionDecision`), Copilot asks as Claude does (`sessionStart`, `preToolUse`, `agentStop`, `preCompact` in `~/.copilot/settings.json`, global scope only), Bob refuses by exit code 2 (five Claude-named events, nested `~/.bob/settings/settings.json`, no subagent event), OpenCode's guard throws. Laws I/IV are the hard tier everywhere; the consent rules ask where a host can ask and warn where it cannot. `tool-gate` fuses the two gates for hosts that run one command per event; `PreCompact` runs `learn` before Claude compacts; every block or ask lands in `notebook/gates.jsonl` on every host | [copilot](adapters/copilot/README.md) · [bob](adapters/bob/README.md) · [claude-code](adapters/claude-code/README.md) · [candidate hosts](docs/candidate-hosts.md) |
40
+ | **Host hooks, per dialect** | Every host gets the hook surface its runtime offers, spoken in that runtime's own verdict dialect via `--host`: Claude Code asks (`permissionDecision`), OpenClaude asks exactly as Claude does (a Claude Code fork, under `~/.openclaude` / `.openclaude/`), Copilot asks as Claude does (`sessionStart`, `preToolUse`, `agentStop`, `preCompact` in `~/.copilot/settings.json`, global scope only), Bob refuses by exit code 2 (five Claude-named events, nested `~/.bob/settings/settings.json`, no subagent event), OpenCode's guard throws. Laws I/IV are the hard tier everywhere; the consent rules ask where a host can ask and warn where it cannot. `tool-gate` fuses the two gates for hosts that run one command per event; `PreCompact` runs `learn` before Claude compacts; every block or ask lands in `notebook/gates.jsonl` on every host | [copilot](adapters/copilot/README.md) · [bob](adapters/bob/README.md) · [claude-code](adapters/claude-code/README.md) · [candidate hosts](docs/candidate-hosts.md) |
41
41
  | **Workflow primitive** | Saved, code-driven subagent orchestration (`workflow` tool + runtime); shipped scripts include `dispatch` — decompose a goal, route each subtask to its owning agent, converge | `2026-06-09-opencode-workflow-primitive` |
42
42
  | **Per-agent memory** | Each capability agent keeps durable lessons in `memory/agents/<name>.md`: read at dispatch, written back mechanically by `learn` on session/subagent end (OpenCode plugin + Claude `SubagentStop`; Bob has no subagent event); `learn --consolidate` rebuilds the index | `2026-07-04-orchestration-memory-upgrade` |
43
43
  | **Wiki integration** | Machine-wide knowledge base (`wiki.jsonc`): eager/lazy loading, conventions, protected folders enforced at the tool boundary | `2026-06-11-wiki-knowledge-base` |
@@ -21,7 +21,7 @@ If none resolve, the user does not have Geneseed deployed here — say so and st
21
21
 
22
22
  A live harness root contains: `AGENT.md`, `ontology/universal.md`, `laws/universal.md`, `doctrines/<pack>.md`, `agents/<name>.md`, `skills/<name>/SKILL.md`, `memory/MEMORY.md`, `notebook/NOTEBOOK.md`, `themes/`, and (on OpenCode) `plugins/`, `workflows/`, `opencode.jsonc`, `wiki.jsonc`.
23
23
 
24
- The constitution is **three tiers**: an always-on **Ontology** (four prose sections — Telos, Evidence, Decisions, Conduct), nine always-on **Rules** numbered I–IX, and the **Doctrines** — practice packs (`craft`, `rigor`, `ops`, `process`) chosen per install at build time. `AGENT.md` carries all three inline (whole at the `full` footprint, heading-plus-first-line at `lean`), *and* the complete text ships as files beside it. All four pack files ship even when a pack was not built in, so a citation into an inactive pack still resolves on disk — which is why a question about a rule is answered from the tier file, never only from `AGENT.md`.
24
+ The constitution is **three tiers**: an always-on **Ontology** (four prose sections — Telos, Evidence, Decisions, Conduct), nine always-on **Rules** numbered I–IX, and the **Doctrines** — practice packs (`craft`, `rigor`, `ops`, `process`, `comms`) chosen per install at build time. `AGENT.md` carries all three inline (whole at the `full` footprint, heading-plus-first-line at `lean`), *and* the complete text ships as files beside it. All five pack files ship even when a pack was not built in, so a citation into an inactive pack still resolves on disk — which is why a question about a rule is answered from the tier file, never only from `AGENT.md`.
25
25
 
26
26
  ## Read-only verbs (safe, no confirmation needed)
27
27
 
@@ -0,0 +1,64 @@
1
+ # 🦀 OpenClaude adapter
2
+
3
+ > [← Back to README](../../README.md) · [Setup guide](../../SETUP.md) · [Claude Code adapter](../claude-code/README.md) · [OpenCode adapter](../opencode/README.md)
4
+
5
+ [OpenClaude](https://openclaude.gitlawb.com/) (`@gitlawb/openclaude`, binary
6
+ `openclaude`) is an open-source coding-agent CLI that "originated from the Claude
7
+ Code codebase" and talks to any model provider. Its config surfaces are Claude
8
+ Code's (`settings.json` hooks, `agents/*.md`, `skills/<name>/SKILL.md`,
9
+ `CLAUDE.md`, `claudeMdExcludes`), so the emit **reuses the Claude engine and the
10
+ Claude hook dialect verbatim**. What changes is where OpenClaude keeps its config.
11
+ There is nothing to install by hand: `geneseed setup` (or `geneseed-build --emit
12
+ openclaude` / `--emit openclaude-global`) writes everything.
13
+
14
+ **OpenClaude never reads `~/.claude`, a project `.claude/`, or `$CLAUDE_CONFIG_DIR`.**
15
+ A Claude Code install is invisible to it, so it gets its own. The two coexist on one
16
+ machine and in one repo without touching each other.
17
+
18
+ ## What the emit writes
19
+
20
+ ### Per-repo (`--emit openclaude`)
21
+
22
+ Everything lives under **`.openclaude/`**. Nothing is written at the repo root.
23
+
24
+ - `CLAUDE.md`: the harness preamble as a delimited **managed block**. OpenClaude
25
+ loads the root `AGENTS.md`, or the root `CLAUDE.md` only when `AGENTS.md` is
26
+ absent, but it **always** reads `.openclaude/CLAUDE.md`. Writing there means the
27
+ preamble loads in every repo, and a root `CLAUDE.md` owned by a Claude Code install
28
+ (or by you) is left alone.
29
+ - `agents/<name>.md` in the Claude subagent dialect, and `skills/<name>/SKILL.md`,
30
+ byte-identical to every other host.
31
+ - `settings.local.json`: Geneseed's hooks, plus a `claudeMdExcludes` entry for the
32
+ global `~/.openclaude/CLAUDE.md` (project-bypasses-global, as on Claude).
33
+ Gitignored by the emit's `.openclaude/.gitignore`, because the hook commands name
34
+ this machine's paths.
35
+ - `memory/`, `notebook/` stores and their indices.
36
+ - MCP servers you wire with `geneseed mcp` or the web console go in the repo's
37
+ `.mcp.json`, as on Claude.
38
+
39
+ ### Global (`--emit openclaude-global` → `~/.openclaude`, or `$OPENCLAUDE_CONFIG_DIR`)
40
+
41
+ The same layout under the config dir, with `CLAUDE.md` (auto-loaded as user
42
+ memory) and `settings.json`. `$OPENCLAUDE_CONFIG_DIR` is OpenClaude's own
43
+ documented variable, so Geneseed honours it. Claude's `$CLAUDE_CONFIG_DIR` is
44
+ ignored, as OpenClaude ignores it. MCP servers go in `~/.openclaude.json`, or in
45
+ `$OPENCLAUDE_CONFIG_DIR/.openclaude.json` when the variable is set: OpenClaude's
46
+ global config file.
47
+
48
+ ## Hooks
49
+
50
+ The Claude group set, unchanged: `PreToolUse` (git gate on `Bash`, rule gate on
51
+ writes), `SessionStart` (context on `startup|clear` and `resume|compact`), `Stop`,
52
+ `SubagentStop` and `PreCompact` (learn). OpenClaude reads Claude's
53
+ `hookSpecificOutput.permissionDecision`, so the gates **ask** where Claude asks.
54
+ The context hook carries `--host openclaude` for one reason. It tells the hook
55
+ which root file OpenClaude already loads (`AGENTS.md` when present, else
56
+ `CLAUDE.md`), so that file is not injected a second time.
57
+
58
+ ## Not supported
59
+
60
+ - **Workflows.** OpenClaude ships its `WorkflowTool` disabled, so the `workflow`
61
+ skill falls back to parallel agents, as on Bob and Copilot.
62
+ - **Live verification.** The emit follows OpenClaude's source (`src/utils/envUtils.ts`,
63
+ `src/utils/claudemd.ts`, `src/utils/config.ts`, `src/types/hooks.ts`) as of
64
+ 2026-09. It has not been run against an installed OpenClaude yet.
@@ -89,7 +89,7 @@ function summarize(name, result, stats, tracePath) {
89
89
  }
90
90
 
91
91
  // Kept worktrees are work awaiting review, and an overlap is a conflict awaiting ONE
92
- // merger (process 8) — both are said out loud, never left for the trace to hold.
92
+ // merger (process 7) — both are said out loud, never left for the trace to hold.
93
93
  function isolationReport(stats) {
94
94
  const kept = stats.worktrees || []
95
95
  if (!kept.length) return ""
@@ -182,7 +182,7 @@ async function runChildSession(client, { prompt, agent, model, title, directory
182
182
 
183
183
  // ---- worktree isolation ------------------------------------------------------
184
184
  // `agent(prompt, { isolation: "worktree" })` — the same option Claude Code's Workflow
185
- // takes. Parallel editors in one tree lose each other's writes (process 8, one writer per
185
+ // takes. Parallel editors in one tree lose each other's writes (process 7, one writer per
186
186
  // file), so each isolated agent gets its own branch + worktree off the root's HEAD, and
187
187
  // the files it changed are recorded for `overlaps()`. A worktree with no change is
188
188
  // removed with its branch; one with changes is KEPT for the parent to review and merge —
package/docs/extending.md CHANGED
@@ -119,7 +119,7 @@ Notes that matter:
119
119
  from the seven commands; the container one is reachable locally through
120
120
  `tests/helpers/no-python-container.sh` with a docker daemon.
121
121
  - **Two assertions in `tests/unit/claude.test.mjs` silently stand down** on any machine where an
122
- ancestor of the temp sandbox is a `.claude`/`.bob` install — which is every developer machine
122
+ ancestor of the temp sandbox is a `.claude`/`.bob`/`.openclaude` install — which is every developer machine
123
123
  with Claude Code installed under `~`. They are replaced by a `t.diagnostic`, so the TAP
124
124
  `# skipped` count does **not** move, and a local run shows no sign of it.
125
125
 
@@ -280,7 +280,7 @@ of nine emit modes in order and themed, under both footprints, with a `CEILING`
280
280
  (half the ceiling) on the rendered size. Its docblock carries the current measurement against
281
281
  the largest carrier — the host-agnostic `files` bundle; no figure is repeated here, because a
282
282
  typed headroom is stale by the next rule. Read that docblock before adding text to any tier; it is
283
- re-measured, never nudged, and the ceiling is measured **with all four packs active**, which is
283
+ re-measured, never nudged, and the ceiling is measured **with all five packs active**, which is
284
284
  the only configuration it can speak for.
285
285
 
286
286
  ### 2d — Adding a whole PACK
@@ -291,15 +291,27 @@ Rare, and mechanical. On top of §2a for each rule the pack carries:
291
291
  file `PACK_ORDER` names but cannot read, or one carrying no `### {{DOCTRINE}} <pack> <n>`
292
292
  heading at all, is a refusal.
293
293
  2. `PACK_ORDER` in `js/build/source.mjs` — the registration, and the render order. It is **narrative,
294
- not alphabetical** (craft → rigor → ops → process); discovery sorts alphabetically and the
294
+ not alphabetical** (craft → rigor → ops → process → comms); discovery sorts alphabetically and the
295
295
  renderer refuses a `.md` under `src/doctrines/` that `PACK_ORDER` does not name, rather than
296
296
  skipping it.
297
297
  3. `PACK_<NAME>` in `themes/_TEMPLATE.json` and all fourteen voices. Unlike `DOC_*`, this family is
298
298
  held only by `themeParityProblems` — presence, across the voices, template excluded.
299
299
  4. `DOCTRINE_BLURBS` in `js/maintain/setup.mjs` — the one-line description an installer sees in the wizard,
300
300
  and the only place a pack is ever explained to them. Missing entries fall back to the bare name.
301
- 5. `harness.config.json` if the pack should be on by default; `constitutionProblems` refuses a
302
- `doctrines` array naming a pack this checkout does not ship.
301
+ 5. `harness.config.json` only if this checkout's default must be *narrower* than every pack. The
302
+ shipped file carries no `doctrines` key, and an absent key means all of `PACK_ORDER`, so
303
+ step 2 already makes a new pack default-on. `constitutionProblems` refuses a `doctrines`
304
+ array naming a pack this checkout does not ship.
305
+ 6. The written-out **pack lists** in `tests/` — not only the rule totals of §2a. The full set is
306
+ spelled out, in `PACK_ORDER`, in `emit_smoke`, `generate`, `harness`, `setup`, `web_api`,
307
+ `web_jobs` and `wizard`, and the wizard cells also feed one y/n answer per pack on stdin.
308
+ Grep `tests/` for `'process']` and `ops,process` before trusting this list.
309
+ 7. **Existing installs.** An install's pack set is read back off its carrier's `Active packs:`
310
+ marker (§9), which names only the packs that existed when it was built, so a new pack reaches
311
+ an existing install only if that install is re-emitted *and* the reader adds it. A pack that
312
+ merely adds rules can stay off for old installs. A pack that *moves* a rule out of another
313
+ pack cannot, or the moved rule disappears on the next rebuild: `comms` (2026-09-27) is the
314
+ worked example — see `legacyProcessCarrier` in `js/hosts/installs.mjs`.
303
315
 
304
316
  ---
305
317
 
@@ -682,7 +694,7 @@ rows, nor `web/package.json`.
682
694
  |---|---|---|
683
695
  | git checkout | `geneseed upgrade` | export improvements → preflight → ff-only pull → `doctor` on the pulled tree → re-emit this bundle → bounce the web daemon → `rebuild-all` |
684
696
  | npm | `npm install -g geneseed@latest`, then `geneseed rebuild-all` | there is no `postinstall`; the two steps are manual |
685
- | any | `geneseed rebuild-all` | every **active** install, each re-read in its own five values (theme, emit, footprint, posture, mode) |
697
+ | any | `geneseed rebuild-all` | every **active** install, each re-read in its own values: theme, emit, footprint, posture, mode, and the two doctrine axes (`Active packs:` and `Excluded rules:`, read back by `doctrinesForBuild` and `excludedRulesOfDir`) |
686
698
 
687
699
  **Which installs get missed:** project installs that were never registered; installs disabled via
688
700
  the `.geneseed-disabled` stash; registry rows whose directory is gone; and everything after the