geneseed 2.1.0 → 3.0.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 (187) hide show
  1. package/CHANGELOG.md +108 -0
  2. package/DESIGN.md +112 -61
  3. package/QUICKSTART.md +1 -1
  4. package/README.md +24 -14
  5. package/SETUP.md +83 -17
  6. package/SHIPPED.md +5 -4
  7. package/adapters/bob/README.md +3 -3
  8. package/adapters/claude-code/README.md +6 -4
  9. package/adapters/claude-code/skills/geneseed/SKILL.md +10 -6
  10. package/adapters/copilot/README.md +5 -4
  11. package/adapters/opencode/GLOBAL-HARNESS-SPEC.md +11 -6
  12. package/adapters/opencode/HOW-OPENCODE-LOADS.md +1 -1
  13. package/adapters/opencode/README.md +15 -9
  14. package/adapters/opencode/agents/orchestrator.md +1 -1
  15. package/adapters/opencode/plugins/geneseed-context.js +7 -7
  16. package/adapters/opencode/plugins/geneseed-guard.js +6 -6
  17. package/adapters/opencode/workflows/dispatch.js +1 -1
  18. package/bin/geneseed.mjs +72 -6
  19. package/docs/extending.md +164 -55
  20. package/docs/limits.md +4 -4
  21. package/docs/token-footprint.md +15 -4
  22. package/docs/web/authoring.md +1 -1
  23. package/docs/web/claude-hooks.md +2 -2
  24. package/docs/web/collaboration.md +3 -3
  25. package/docs/web/first-session.md +2 -2
  26. package/docs/web/footprint.md +14 -7
  27. package/docs/web/foreman-mode.md +2 -2
  28. package/docs/web/harnesses.md +5 -3
  29. package/docs/web/install-quick.md +1 -1
  30. package/docs/web/model.md +3 -3
  31. package/docs/web/plugin-context.md +2 -2
  32. package/docs/web/plugin-guard.md +3 -3
  33. package/docs/web/plugin-ponytail.md +1 -1
  34. package/docs/web/rules.md +23 -3
  35. package/docs/web/setup-choices.md +20 -7
  36. package/docs/web/themes-author.md +13 -1
  37. package/docs/web-ui.md +36 -12
  38. package/harness.config.json +1 -1
  39. package/js/catalog.mjs +29 -4
  40. package/js/checkout.mjs +24 -1
  41. package/js/cli-table.json +8 -6
  42. package/js/diff.mjs +8 -3
  43. package/js/doctor.mjs +307 -4
  44. package/js/emit.mjs +48 -11
  45. package/js/generate.mjs +39 -5
  46. package/js/hooks.mjs +8 -7
  47. package/js/installs.mjs +101 -4
  48. package/js/inventory.mjs +150 -21
  49. package/js/migrate.mjs +10 -4
  50. package/js/render.mjs +110 -7
  51. package/js/settings.mjs +218 -27
  52. package/js/setup.mjs +95 -5
  53. package/js/status.mjs +45 -4
  54. package/js/tui.mjs +44 -1
  55. package/js/uninstall.mjs +25 -6
  56. package/js/web/actions.mjs +56 -5
  57. package/js/web/api.mjs +95 -16
  58. package/js/web/docs.mjs +33 -5
  59. package/js/web/jobs.mjs +12 -3
  60. package/js/web/server.mjs +6 -0
  61. package/package.json +1 -1
  62. package/src/AGENT.md.tmpl +75 -65
  63. package/src/agents/_template.md +4 -4
  64. package/src/agents/advocate.md +4 -4
  65. package/src/agents/architect.md +2 -2
  66. package/src/agents/developer.md +5 -5
  67. package/src/agents/docs.md +2 -2
  68. package/src/agents/empiricist.md +3 -3
  69. package/src/agents/explorer.md +3 -3
  70. package/src/agents/framer.md +3 -3
  71. package/src/agents/historian.md +3 -3
  72. package/src/agents/operator.md +3 -3
  73. package/src/agents/pragmatist.md +3 -3
  74. package/src/agents/reviewer.md +2 -2
  75. package/src/agents/security.md +2 -2
  76. package/src/agents/skeptic.md +4 -4
  77. package/src/agents/steward.md +3 -3
  78. package/src/agents/tester.md +2 -2
  79. package/src/agents/user-advocate.md +3 -3
  80. package/src/agents/visionary.md +3 -3
  81. package/src/doctrines/README.md +41 -0
  82. package/src/doctrines/craft.md +51 -0
  83. package/src/doctrines/ops.md +61 -0
  84. package/src/doctrines/process.md +87 -0
  85. package/src/doctrines/rigor.md +52 -0
  86. package/src/laws/universal.md +17 -336
  87. package/src/memory/README.md +2 -2
  88. package/src/modes/README.md +2 -2
  89. package/src/modes/foreman.md +1 -1
  90. package/src/notebook/README.md +2 -2
  91. package/src/ontology/universal.md +89 -0
  92. package/src/postures/README.md +3 -3
  93. package/src/postures/artisan.md +3 -3
  94. package/src/postures/assistant.md +1 -1
  95. package/src/postures/expert.md +1 -1
  96. package/src/postures/mentor.md +1 -1
  97. package/src/postures/peer.md +2 -2
  98. package/src/skills/_template.md +2 -2
  99. package/src/skills/brainstorm.md +2 -2
  100. package/src/skills/clarify.md +2 -2
  101. package/src/skills/codebase-design.md +1 -1
  102. package/src/skills/commit.md +5 -5
  103. package/src/skills/council.md +4 -4
  104. package/src/skills/crash-course.md +1 -1
  105. package/src/skills/daydream/SKILL.md +1 -1
  106. package/src/skills/debug.md +2 -2
  107. package/src/skills/decode.md +1 -1
  108. package/src/skills/develop.md +6 -6
  109. package/src/skills/document-project.md +4 -4
  110. package/src/skills/domain-modeling.md +1 -1
  111. package/src/skills/drill.md +1 -1
  112. package/src/skills/feynman.md +1 -1
  113. package/src/skills/forge-mcp.md +3 -3
  114. package/src/skills/fresh-eyes.md +4 -4
  115. package/src/skills/frontend-design.md +1 -1
  116. package/src/skills/gap-detector.md +1 -1
  117. package/src/skills/geneseed-code-review.md +1 -1
  118. package/src/skills/geneseed.md +4 -4
  119. package/src/skills/git-archaeology.md +1 -1
  120. package/src/skills/git-rescue.md +3 -3
  121. package/src/skills/handoff.md +4 -4
  122. package/src/skills/herdr.md +1 -1
  123. package/src/skills/ingest.md +3 -3
  124. package/src/skills/learning-path.md +1 -1
  125. package/src/skills/migrate.md +5 -5
  126. package/src/skills/opencode-theme.md +1 -1
  127. package/src/skills/parallel-agents.md +2 -2
  128. package/src/skills/pipeline.md +2 -2
  129. package/src/skills/plan.md +2 -2
  130. package/src/skills/ponytail.md +1 -1
  131. package/src/skills/profile.md +1 -1
  132. package/src/skills/prose.md +2 -2
  133. package/src/skills/prototype.md +2 -2
  134. package/src/skills/refactor.md +2 -2
  135. package/src/skills/release.md +4 -4
  136. package/src/skills/repo-map.md +5 -5
  137. package/src/skills/research.md +6 -6
  138. package/src/skills/review-response.md +3 -3
  139. package/src/skills/roast-me.md +1 -1
  140. package/src/skills/rule.md +5 -5
  141. package/src/skills/ship.md +3 -3
  142. package/src/skills/tdd.md +2 -2
  143. package/src/skills/tickets.md +1 -1
  144. package/src/skills/wayfinder.md +1 -1
  145. package/src/skills/wiki.md +4 -4
  146. package/src/skills/workflow.md +2 -2
  147. package/themes/README.md +17 -7
  148. package/themes/_TEMPLATE.json +37 -36
  149. package/themes/biker.json +37 -36
  150. package/themes/commentator.json +37 -36
  151. package/themes/cyberpunk.json +37 -36
  152. package/themes/gamer.json +37 -36
  153. package/themes/imperial.json +37 -36
  154. package/themes/joker.json +37 -36
  155. package/themes/marvin.json +37 -36
  156. package/themes/mean.json +37 -36
  157. package/themes/military.json +37 -36
  158. package/themes/neutral.json +37 -36
  159. package/themes/pirate.json +37 -36
  160. package/themes/sports.json +37 -36
  161. package/themes/verstappen.json +37 -36
  162. package/themes/wizard.json +37 -36
  163. package/web/dist/assets/{About-BYXlmbyo.js → About-C0Mk0igT.js} +1 -1
  164. package/web/dist/assets/{Activity-us5MPf4u.js → Activity-C4aJJVXz.js} +1 -1
  165. package/web/dist/assets/{ActivityDetail-CiaQXUk2.js → ActivityDetail-DaQ85za0.js} +1 -1
  166. package/web/dist/assets/{Diff-Bh0qbZ2s.js → Diff-B3tlO2Yj.js} +1 -1
  167. package/web/dist/assets/{Doctor-BIlQME45.js → Doctor-BNC-5Dmo.js} +1 -1
  168. package/web/dist/assets/{Graph-4dYD1dPG.js → Graph-us0T6ZcV.js} +1 -1
  169. package/web/dist/assets/{Harnesses-PzYZ3LOC.js → Harnesses-DAMgyfM_.js} +1 -1
  170. package/web/dist/assets/Laws-rOxegJ75.js +1 -0
  171. package/web/dist/assets/{Library-CjMbksJW.js → Library-KmwrHA1J.js} +1 -1
  172. package/web/dist/assets/{Markdown-Bk81c3aZ.js → Markdown-0eQOVGSF.js} +1 -1
  173. package/web/dist/assets/{Profile-Curui_-j.js → Profile-ZU7WV6Xl.js} +1 -1
  174. package/web/dist/assets/{Rules-Bm283wdv.js → Rules-CtDoPhhf.js} +1 -1
  175. package/web/dist/assets/{Skills-gruqYuhl.js → Skills-BhoOxdkD.js} +1 -1
  176. package/web/dist/assets/{StatusBadge-EiM_FPqv.js → StatusBadge-CGvYVCwa.js} +1 -1
  177. package/web/dist/assets/{Themes-DU99j4Hr.js → Themes-Dr7OOkD7.js} +1 -1
  178. package/web/dist/assets/{activity-0rvQ6Vra.js → activity-B8aq3qtl.js} +1 -1
  179. package/web/dist/assets/index-2wqPDxuN.css +1 -0
  180. package/web/dist/assets/{index-0b2hobOo.js → index-AhMzkdbI.js} +1 -1
  181. package/web/dist/assets/index-CRftEtBX.js +12 -0
  182. package/web/dist/assets/{index-IiGFmCW_.js → index-D0lPN_qW.js} +1 -1
  183. package/web/dist/index.html +2 -2
  184. package/web/src/pages/Laws.jsx +282 -91
  185. package/web/dist/assets/Laws-DtZweXal.js +0 -1
  186. package/web/dist/assets/index-D5VY3TY_.js +0 -12
  187. package/web/dist/assets/index-DUCsDv7z.css +0 -1
package/CHANGELOG.md CHANGED
@@ -6,6 +6,114 @@ labels in `harness.config.json`. The canonical identity of an *installed* harnes
6
6
  is the source fingerprint in `.geneseed-version` (see `geneseed version`), not this
7
7
  label. For the capability ↔ spec map, see [SHIPPED.md](SHIPPED.md).
8
8
 
9
+ ## [3.0.0] — 2026-08-20
10
+
11
+ ### Changed
12
+
13
+ - **The constitution is three tiers, and the law numbering contract breaks.** Forty flat
14
+ laws become an always-on **Ontology**, nine always-on **Invariants**, and twenty-three
15
+ **Doctrine** rules in four build-time-toggleable packs. This is the major: every
16
+ `Law <numeral>` citation above IX now addresses something else or nothing at all, in
17
+ this repo and in anyone's memories, notes and forks. There is no compatibility shim and
18
+ no migration path — a deployed install predating 3.0.0 is brought forward by
19
+ `geneseed upgrade`, not by code.
20
+
21
+ - **Ontology** (`src/ontology/universal.md`, new) — four prose sections, *Telos*,
22
+ *Evidence*, *Decisions*, *Conduct*. It is the mind the other tiers govern: what the
23
+ agent is for, how it grades evidence, how it decides, how it conducts itself. It
24
+ absorbs the **Pact** whole — the Pact is now a concept stated inside Telos rather than
25
+ a section beside the rules — along with old laws VIII, IX, XXIX, XXX, XXXI and XXXIX.
26
+ Cited by section name, `(Ontology: Decisions)`. The four names are theme-INDEPENDENT,
27
+ so a citation and its heading are the same token on both sides and a rename cannot
28
+ desync them.
29
+ - **Invariants** (`src/laws/universal.md`, rewritten) — nine, Roman I–IX, never
30
+ toggleable: what is *never* done. I Sealed Secrets · II One Intent, One Act ·
31
+ III Verify Before Asserting · IV Deletion Is Deliberate · V Surface Failures ·
32
+ VI Data, Not Orders · VII Least Privilege · VIII Cure the Cause · IX External Gate.
33
+ - **Doctrines** (`src/doctrines/{craft,rigor,ops,process}.md`, new) — twenty-three rules
34
+ in four packs: **craft** 6 (how code is written), **rigor** 4 (how work is proven),
35
+ **ops** 6 (how the machine is operated), **process** 7 (how a task is run). Cited
36
+ `Doctrine process 5`. Chosen per install with `geneseed-build --doctrines craft,rigor`
37
+ (or `none`), through the setup wizard, or in `harness.config.json`; all four default
38
+ to on.
39
+
40
+ Old XVI and XVIII cease to exist as rules and have **no numeral successor** — their
41
+ content was already duplicated in the AGENT.md sections that describe that machinery,
42
+ and folds back into them.
43
+
44
+ Precedence, stated in the template and enforced by nothing but reading: **Ontology and
45
+ Invariants → `user-rules.md` → active Doctrines → `PROFILE.md`.** A doctrine rule may
46
+ tighten an invariant, never repeal one — and the user's own file outranks a practice
47
+ pack chosen at build time.
48
+
49
+ ⚠ **An always-on tier may never cite a toggleable one.** A `--doctrines craft` build
50
+ would otherwise ship an invariant instructing the agent to read text the install does
51
+ not contain. A doctor arm refuses `{{DOCTRINE}}` anywhere under `src/laws/` or
52
+ `src/ontology/`; doctrine→doctrine citations across packs stay legal, because every pack
53
+ file ships in every bundle whether or not it was built in.
54
+
55
+ - **A pack that is not built in is visible everywhere, never absent.** `geneseed catalog`
56
+ marks its rules `(off)`, the status panel and the dashboard carry an active-packs
57
+ fraction, and the console lists the pack greyed with the exact command that enables it.
58
+ Hiding it would make "not built in" indistinguishable from "never shipped", which is the
59
+ one thing a build-time toggle must not look like.
60
+
61
+ - **The commit/push consent gate rides the `process` pack.** It is the boundary half of
62
+ Doctrine process 5, so a build without that pack installs no `git-gate` hook and writes
63
+ no `git commit*` / `git push*` permission — prompt and boundary are never allowed to
64
+ disagree. `rm -rf *` and force-push refusals are Invariant IV's territory and stay in
65
+ every build. ⚠ On OpenCode this holds for a *fresh* install: an `opencode.json` that
66
+ already carries a `git commit*` entry keeps it and is reported, because Geneseed cannot
67
+ tell its own entry from one you typed and will not delete what it may not own.
68
+
69
+ Unknown always resolves to the **full** pack set, never to a config value. An install
70
+ with no `Active packs:` marker — every install predating this release — keeps its
71
+ consent gate on upgrade.
72
+
73
+ - **The console's Laws page is the Constitution page.** One nav entry, three bands, read
74
+ top to bottom. Deep links address all three tiers: `#/item/law/ont:telos`,
75
+ `#/item/law/IV`, `#/item/law/process.5`. The route, the section id and the filename stay
76
+ `laws`.
77
+
78
+ - **The lean footprint grew ~17%, deliberately.** Measured on `neutral`, `AGENT.md` goes
79
+ from 31,457 to 36,882 bytes at `lean` and 53,378 to 54,810 at `full`. Lean truncates
80
+ each invariant and each doctrine rule to its first line, but ships the **ontology
81
+ whole** — four flowing prose sections reduced to four orphan sentences would have been a
82
+ worldview nobody could read. `--doctrines` is now the larger lever on that cost.
83
+
84
+ ### Added
85
+
86
+ - `--doctrines` on the generator, a doctrine-packs question in the setup wizard that
87
+ pre-selects what the install already carries, and an `Active packs:` marker in every
88
+ carrier so an install remembers its selection across upgrades.
89
+ - Doctor gates for the whole constitution: dangling `{{DOCTRINE}}` citations, per-pack
90
+ rule contiguity, `DOC_*` theme coverage in both directions, an exact `LEX_I..LEX_IX`
91
+ equality (a presence check had already missed four keys the renumber orphaned), a
92
+ single-word tier noun in every voice — both heading parsers match it with `\S+`, so a
93
+ two-word value makes a whole tier parse to nothing in silence — and a `DOCTRINE_META`
94
+ parity check whose class arm is an equality against the rule's own pack.
95
+ - A `[note]` channel in `doctor`: printed, never counted. Its one producer reports which
96
+ body citations point into packs a narrowed build did not render. That state must be
97
+ visible, but failing the doctor over a configuration its owner chose would be wrong.
98
+ - Count tokens `{N_ONTOLOGY}`, `{N_PACKS}`, `{N_PACKS_ACTIVE}` and `{N_DOCTRINE_RULES}`
99
+ for the in-app docs. `{N_LAWS}` stays the **invariant** count — the rail badge, the
100
+ README prose and SHIPPED.md's triple are all held to that one number by a frozen gate.
101
+
102
+ ### Fixed
103
+
104
+ - **Four `§N` cross-references that render into every bundle** pointed at the section that
105
+ used to be there: inserting `## 2. Doctrines` pushed every later AGENT.md section down
106
+ one and the sweep stopped at the template. `src/skills/wiki.md`,
107
+ `src/skills/daydream/SKILL.md`, `src/skills/handoff.md`, `src/agents/_template.md`, plus
108
+ six in the two OpenCode plugins — one of them a live deny message a user reads. A doctor
109
+ arm now refuses a `§N` the template declares no section for; the half it cannot catch (a
110
+ pointer that still resolves and now means something else) is recorded as a manual sweep
111
+ in `docs/extending.md`.
112
+ - An `opencode.json` whose `permission` Geneseed cannot see inside — a blanket
113
+ `"bash": "allow"` — made the reconcile a no-op and the merge then returned before any of
114
+ its warnings. A rule stated in AGENT.md with nothing behind it at the boundary, in
115
+ silence. Now reported, naming the shape and the gates left unwired.
116
+
9
117
  ## [2.1.0] — 2026-08-19
10
118
 
11
119
  ### Added
package/DESIGN.md CHANGED
@@ -31,22 +31,32 @@ vault or a specific tool's hooks.
31
31
  3. **Theme is voice + vocabulary; the scaffolding is theme-independent.** A single
32
32
  neutral source renders to any theme via token substitution, split into two classes:
33
33
  - **Structure** (always plain English, every theme, every emit) — the section
34
- *layout*, the harness name (`HARNESS`), the law *numbers*, a few rare technical
35
- nouns (`Context`, `Scripts`, `Charter`), and the folder names (`laws/`, `agents/`,
36
- `skills/`, `memory/` via `DIR_*`). These live in the `STRUCTURE` map in `js/render.mjs`
37
- and are laid on top of every render, so a theme can never move a path, a link, or
38
- a heading number. Tooling stays stable.
34
+ *layout*, the harness name (`HARNESS`), the law *numbers*, the four ontology section
35
+ names (`ONT_TELOS`, `ONT_EVIDENCE`, `ONT_DECISIONS`, `ONT_CONDUCT`), a few rare
36
+ technical nouns (`Context`, `Scripts`, `Charter`), and the folder names (`laws/`,
37
+ `ontology/`, `doctrines/`, `agents/`, `skills/`, `memory/`, `notebook/` via `DIR_*`).
38
+ These live in the `STRUCTURE` map in `js/render.mjs` and are laid on top of every
39
+ render, so a theme can never move a path, a link, or a heading number. No theme file
40
+ defines a `DIR_*` or an `ONT_*` key, and none may: an ontology citation spells the
41
+ section on both sides (`{{ONTOLOGY}}: {{ONT_TELOS}}`), so heading and reference move
42
+ together or not at all. Tooling stays stable.
39
43
  - **Voice + vocabulary** (themed) — how the AI *responds* (`VOICE`), a top `BANNER`,
40
- and the prose words the docs use: the core nouns `LAW(S)`/`AGENT(S)`/`SKILL(S)`/
41
- `MEMORY`/`NOTEBOOK`/`VAULT`/`WIKI`, plus `TAGLINE`, `LOADED_SIGIL`, `EPI_*`, `BENEDICTION`, `DESC_*`,
42
- `ROAST_PERSONA`, the law titles `LEX_*`, and the section intros `INTRO_*`. Each
43
- theme defines its own nouns; **neutral keeps the plain words** (Rule, Agent, Skill,
44
- Memory, Workspace), so neutral output is unchanged.
44
+ and the prose words the docs use: the core nouns `LAW(S)`/`DOCTRINE(S)`/`ONTOLOGY`/
45
+ `AGENT(S)`/`SKILL(S)`/`MEMORY`/`NOTEBOOK`/`VAULT`/`WIKI`, plus `TAGLINE`,
46
+ `LOADED_SIGIL`, `EPI_*`, `BENEDICTION`, `DESC_*`, `ROAST_PERSONA`, the invariant
47
+ titles `LEX_I`..`LEX_IX`, the 23 doctrine-rule titles `DOC_<PACK>_<n>`, the four pack
48
+ names `PACK_CRAFT`/`PACK_RIGOR`/`PACK_OPS`/`PACK_PROCESS`, and the section intros
49
+ `INTRO_*`. Each theme defines its own nouns; **neutral keeps the plain words** (Rule,
50
+ Doctrine, Agent, Skill, Memory, Workspace), so neutral output is unchanged.
51
+ `{{LAW}}` and `{{DOCTRINE}}` must each be a **single word** — both heading parsers
52
+ match the tier noun with `\S+`, so a two-word value makes the whole tier parse to
53
+ nothing in silence. `constitutionProblems` refuses one.
45
54
 
46
55
  So `imperial` flavours the agent's tone *and* the page — the banner, the readiness
47
- sigil, the epigraphs, and the words themselves (the laws read as *Dictates*, agents
48
- as *Adepts*, skills as *Rites*) — while every folder is still `agents/`/`skills/`,
49
- law numbers stay `XVIII`, and links resolve identically across themes. The source
56
+ sigil, the epigraphs, and the words themselves (the invariants read as *Dictates*,
57
+ doctrine rules as *Doctrinae*, agents as *Adepts*) — while every folder is still
58
+ `agents/`/`skills/`, an invariant is still numbered `IV` and a doctrine rule is still
59
+ addressed `process 5`, and links resolve identically across themes. The source
50
60
  tree under `src/` stays neutral for sane authoring. Toggle = one flag.
51
61
 
52
62
  The OpenCode emits add only: native skills at `skills/<name>/SKILL.md` (not slash
@@ -76,61 +86,102 @@ vault or a specific tool's hooks.
76
86
  documentation* maintained elsewhere. It also subsumes what a baked-in project
77
87
  rules file used to do: point at the project's own conventions instead.
78
88
 
79
- 7. **Lean governance — every line must change behaviour.** The Laws, agent specs,
80
- and skills are the product, and a bloated instruction surface is ignored at
81
- runtime, not obeyed: an over-long rule set dilutes the rules that matter. So the
82
- bar for a new Law is high — it must be universal (it binds *every* task, in
83
- *every* repository), agent-behavioural (something the model does, not infra it
89
+ 7. **Lean governance — three tiers, and every line must change behaviour.** The
90
+ constitution, the agent specs, and the skills are the product, and a bloated
91
+ instruction surface is ignored at runtime, not obeyed: an over-long rule set dilutes
92
+ the rules that matter. The governance surface is split into three tiers, each answering
93
+ a different question:
94
+
95
+ - **Ontology** (`src/ontology/universal.md`) — *who is deciding*. Four sections of
96
+ flowing prose: **Telos** (what the agent is for, and the Pact it works under),
97
+ **Evidence** (how a claim is graded by how it was obtained), **Decisions** (classify
98
+ and tier by reversibility; show the real forks), **Conduct** (answer what was asked,
99
+ once). It absorbed the Pact, which is now stated *inside* Telos rather than standing
100
+ as a peer of the rules.
101
+ - **Invariants** (`src/laws/universal.md`) — *what is never traded*. Nine numbered
102
+ Rules, `I`..`IX`, headed `### {{LAW}} <roman> — {{LEX_<roman>}}`.
103
+ - **Doctrines** (`src/doctrines/{craft,rigor,ops,process}.md`) — *how work is done
104
+ here*. Practice rules addressed by pack and number, cited as `Doctrine process 5`.
105
+ `PACK_ORDER` (`js/checkout.mjs`) fixes the order craft → rigor → ops → process, which
106
+ is narrative and deliberately not alphabetical.
107
+
108
+ **The Ontology and the Invariants are never toggleable** — every build carries both,
109
+ whole. The Doctrine packs are the only tier a repository may narrow, chosen once at
110
+ build time (`--doctrines craft,rigor`, `--doctrines none`, or the setup wizard) and
111
+ defaulting to all four on. There is no runtime toggle. Every pack file ships on disk at
112
+ both footprints whether or not it was built in, which is what lets a citation into an
113
+ inactive pack still resolve.
114
+
115
+ **Conflict order, exactly:** Ontology + Invariants → the user's own `user-rules.md` →
116
+ the active Doctrines → `PROFILE.md`. A doctrine rule may *tighten* an invariant, never
117
+ repeal one; a user rule outranks a doctrine rule outright; nothing outranks an
118
+ invariant. And an always-on tier may never cite a toggleable one — a `--doctrines craft`
119
+ build would otherwise ship an invariant pointing at text its `AGENT.md` does not
120
+ contain — so `constitutionProblems` (`js/doctor.mjs`) refuses a `{{DOCTRINE}}` token
121
+ anywhere under `src/ontology/` or `src/laws/`.
122
+
123
+ The bar for a **new invariant** is the highest in the tree: universal (it binds *every*
124
+ task, in *every* repository), agent-behavioural (something the model does, not infra it
84
125
  cannot instantiate), and not already covered. A principle that is app-code craft,
85
- host-specific infrastructure, or single-domain belongs in an agent, a skill, or
86
- `context.json`, not in the universal Laws; a rule that overlaps an existing Law is
87
- folded in as a clause, not minted as a new number. This is the authoring-time
88
- counterpart to Law XV's runtime context economy: keep the instruction surface
89
- high-signal and pruned so it stays read and heeded.
90
-
91
- A Law that clears that bar is not one edit but six, because its *satellites* —
92
- themed title, class, display copy, counts — live outside `universal.md`:
93
-
94
- 1. the rule body in `src/laws/universal.md`, headed `### {{LAW}} <roman> — {{LEX_<roman>}}`;
95
- 2. `LEX_<roman>` in `themes/_TEMPLATE.json`, then `geneseed-build --sync-themes`
96
- to seed every theme, then restyle each one in its own voice. The flag is the
97
- *generator's*, not the CLI's: `geneseed build` forwards `--theme` and nothing else,
98
- so `geneseed build --sync-themes` is an error, not a synonym;
99
- 3. `LAW_CLASS` in `js/inventory.mjs` — the governance class, one of the six
100
- in `LAW_CLASSES`;
101
- 4. `LAW_META` in `web/src/pages/Laws.jsx` — the class fallback *and* the one-line
102
- Principle shown in the web ledger. This copy exists nowhere else; a law absent
103
- here renders with a blank description;
104
- 5. the counts — README badge and prose, `SHIPPED.md`, the web onboarding copy;
105
- 6. `CHANGELOG.md`.
106
-
107
- Five of the six are gated by `doctor`, in three different checks — theme-key parity
108
- for step 2, the authoring sweep for step 3, and the count and prose mirrors for step 5
109
- (`themeParityProblems`, `authoringProblems`, `countTableProblems` / `proseMirrorProblems`,
110
- all in `js/doctor.mjs`) — so `geneseed doctor --all` is the check, not the checklist
111
- above; the list just says what it will ask for. Step 6 has no gate and never has. Steps 3
112
- and 4 both earned their gate the same way: a law shipped without them, and the
113
- only symptom was a wrong chip or an empty cell in a UI nobody re-read.
114
-
115
- Two things the checklist cannot tell you, and `docs/extending.md` can: the default
116
- footprint is **lean**, which keeps a law's heading and its *first sentence* only — so an
117
- amendment written into the second paragraph does not exist for most installs — and
118
- `LEX_I` is one of seven theme keys frozen byte-for-byte in a recording nothing can
119
- re-make, so Law I's themed titles are the one part of this list that cannot be edited.
126
+ host-specific infrastructure, or single-domain now has a home one tier down — a doctrine
127
+ pack — or in an agent, a skill, or `context.json`. A rule that overlaps an existing
128
+ invariant is folded in as a clause, not minted as a new number. This is the
129
+ authoring-time counterpart to Doctrine `process 3`'s runtime context economy.
130
+
131
+ **The satellites differ per tier, and that difference is the design** — a doctrine rule
132
+ is cheap on purpose, so the expensive slot stays scarce:
133
+
134
+ | Satellite | A new invariant | A new doctrine rule | A whole new pack |
135
+ |---|---|---|---|
136
+ | body | append to `src/laws/universal.md` — never insert; nothing resolves a cross-reference against the canon | append to `src/doctrines/<pack>.md`, `### {{DOCTRINE}} <pack> <n> — {{DOC_<PACK>_<n>}}`; ids must run contiguously from 1 | a new `src/doctrines/<pack>.md` with its `**Name** — lead line` |
137
+ | themed title | `LEX_<roman>` in all 15 theme files | `DOC_<PACK>_<n>` in all 15 theme files | `PACK_<NAME>` in all 15, plus each rule's `DOC_*` |
138
+ | class | `LAW_CLASS` in `js/inventory.mjs`, one of the six in `LAW_CLASSES` | **none** — a doctrine rule's class *is* its pack, and there is no second taxonomy over it | — |
139
+ | console copy | a `LAW_META` row in `web/src/pages/Laws.jsx` (keyed by arabic number) | a `DOCTRINE_META` row in the same file (keyed `<pack>.<n>`) | one `DOCTRINE_META` row per rule |
140
+ | registration | the numeral is the registration | the number is the registration | the pack name in `PACK_ORDER`, `js/checkout.mjs` |
141
+ | renumber risk | high — appending is the only safe move | none — packs are numbered independently | none |
142
+ | counts | README badge + the `N universal laws` prose, `SHIPPED.md`'s triple, the web onboarding copy | **none** — the console spends the `N_PACKS` / `N_PACKS_ACTIVE` / `N_DOCTRINE_RULES` count tokens, all computed at request time | none, same reason |
143
+ | changelog | `CHANGELOG.md` | `CHANGELOG.md` | `CHANGELOG.md` |
144
+
145
+ "All 15 theme files" is the 14 voices **and** `themes/_TEMPLATE.json`: theme parity
146
+ skips underscore-prefixed names, but `constitutionProblems` reads the template too,
147
+ because it is what `geneseed-build --sync-themes` seeds a new voice from. That flag is
148
+ the *generator's*, not the CLI's — `geneseed build --sync-themes` is an error, not a
149
+ synonym. `--sync-themes` writes the template's placeholder and only *prints* which keys
150
+ to restyle; a shipped placeholder passes every gate.
151
+
152
+ Almost all of it is gated, across six named checks in `js/doctor.mjs` —
153
+ `themeParityProblems` (key parity across the voices), `lawMetaProblems` and
154
+ `doctrineMetaProblems` (the console's Principle column, in both directions),
155
+ `constitutionProblems` (pack numbering and filing, `LEX_I..LEX_IX` as an *equality*, the
156
+ `DOC_*` vocabulary, and every `{{DOCTRINE}}` citation in `src/`), and
157
+ `countTableProblems` / `proseMirrorProblems` (badges and prose). So `geneseed doctor
158
+ --all` is the check; the table above only says what it will ask for. `CHANGELOG.md` has
159
+ no gate and never has.
160
+
161
+ Two things the table cannot tell you, and `docs/extending.md` can: the default footprint
162
+ is **lean**, which keeps an invariant's or a doctrine rule's heading and its *first
163
+ sentence* only — so an amendment written into the second paragraph does not exist for
164
+ most installs — and `LEX_I` is one of seven theme keys frozen byte-for-byte in a
165
+ recording nothing can re-make, so Rule I's themed titles are the one part of this list
166
+ that cannot be edited. The Ontology is exempt from the truncation: it ships whole at
167
+ both footprints, because four flowing sections cut to their first sentences would read
168
+ as four orphan sentences.
120
169
 
121
170
  ## 🧩 Components
122
171
 
123
- The `Harness/` output column shows the **neutral** folder name; the imperial theme
124
- renders it as the name in parentheses.
172
+ Every folder name in the `Harness/` output column is theme-independent (Decision 3): no
173
+ theme file defines a `DIR_*` key, so `laws/` is `laws/` in all fourteen voices.
125
174
 
126
175
  | Component | Source | `Harness/` output | Purpose |
127
176
  | --- | --- | --- | --- |
128
- | Entrypoint | `src/AGENT.md.tmpl` | `AGENT.md` | what the tool reads; inlines the rules, links the rest |
129
- | Governance | `src/laws/` | `laws/` (`leges/`) | universal rules |
130
- | Delegation | `src/agents/` | `agents/` (`legati/`) | capability specialists with output contracts |
131
- | Workflows | `src/skills/` | `skills/` (`rites/`) | repeatable procedures |
132
- | Memory | `src/memory/` | `memory/` (`anamnesis/`) | one-fact-per-file convention + index |
133
- | Notebook | `src/notebook/` | `notebook/` (`scriptorium/`) | the agent's sovereign space — any medium, seed-once charter the agent may rewrite; only `.gitignore` re-asserted |
177
+ | Entrypoint | `src/AGENT.md.tmpl` | `AGENT.md` | what the tool reads; inlines the constitution, links the rest |
178
+ | Ontology | `src/ontology/` | `ontology/` | the mind the rules govern — Telos, Evidence, Decisions, Conduct; always on, never toggleable |
179
+ | Governance | `src/laws/` | `laws/` | the nine universal invariants; always on, never toggleable |
180
+ | Doctrines | `src/doctrines/` | `doctrines/` | the four practice packs — the one build-time axis that changes *which rules ship*; the whole catalogue is written to disk either way |
181
+ | Delegation | `src/agents/` | `agents/` | capability specialists with output contracts |
182
+ | Workflows | `src/skills/` | `skills/` | repeatable procedures |
183
+ | Memory | `src/memory/` | `memory/` | one-fact-per-file convention + index |
184
+ | Notebook | `src/notebook/` | `notebook/` | the agent's sovereign space — any medium, seed-once charter the agent may rewrite; only `.gitignore` re-asserted |
134
185
  | Posture | `src/postures/` | inlined into `AGENT.md` | how much ceremony the agent brings to a task |
135
186
  | Mode | `src/modes/` | inlined into `AGENT.md` | the working axis (solo, foreman, …) — orthogonal to posture |
136
187
  | Context | `js/emit.mjs` | `context.json` | empty per-repo manifest, written once and never overwritten; git-ignore it |
package/QUICKSTART.md CHANGED
@@ -10,7 +10,7 @@ repo inherits it, nothing committed into your projects. The only prerequisite is
10
10
 
11
11
  Same command on macOS, Linux and Windows (cmd, PowerShell, or any POSIX shell).
12
12
 
13
- Pick a **theme**, pick **OpenCode global** when asked for the install mode, confirm.
13
+ Pick a **theme**, then accept the defaults for posture, mode, doctrine packs and footprint (or pick deliberately — see [setup choices](docs/web/setup-choices.md)), pick **OpenCode global** when asked for the install mode, confirm.
14
14
  The wizard builds the harness and offers a health check.
15
15
 
16
16
  Want the command to stay? `npm install -g geneseed`, then plain `geneseed …` from
package/README.md CHANGED
@@ -12,7 +12,7 @@
12
12
  [![Themes](https://img.shields.io/badge/themes-14-9cf)](themes/)
13
13
  [![Skills](https://img.shields.io/badge/skills-47-blueviolet)](src/skills/)
14
14
  [![Agents](https://img.shields.io/badge/agents-17-orange)](src/agents/)
15
- [![Laws](https://img.shields.io/badge/laws-40-critical)](src/laws/universal.md)
15
+ [![Laws](https://img.shields.io/badge/laws-9-critical)](src/laws/universal.md)
16
16
  [![Plugins](https://img.shields.io/badge/plugins-7-teal)](adapters/opencode/plugins/)
17
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)
18
18
 
@@ -38,7 +38,7 @@ The lineage is also why an **imperial** theme ships alongside the neutral one: i
38
38
 
39
39
  ### How it works
40
40
 
41
- One canonical source in `src/` renders, via a tiny zero-dependency generator (`geneseed-build`), into a ready-to-use bundle. **A theme controls only *voice*** — how the AI responds and how the prose inside the docs reads (tagline, greeting, descriptions). **Structure is theme-independent**: section names (Rules, Agents, Skills, Memory…) and folder names (`laws/`, `agents/`, `skills/`, `memory/`, `notebook/`) are always plain English, so the scaffolding stays tool-friendly while the flavour lives in the words.
41
+ One canonical source in `src/` renders, via a tiny zero-dependency generator (`geneseed-build`), into a ready-to-use bundle. **A theme controls only *voice*** — how the AI responds and how the prose inside the docs reads (tagline, greeting, descriptions). **Structure is theme-independent**: section names (Rules, Agents, Skills, Memory…), folder names (`laws/`, `ontology/`, `doctrines/`, `agents/`, `skills/`, `memory/`, `notebook/`) and the four ontology section headings (Telos, Evidence, Decisions, Conduct) are always plain English, so the scaffolding stays tool-friendly while the flavour lives in the words.
42
42
 
43
43
  ```bash
44
44
  geneseed-build # default theme (neutral)
@@ -148,11 +148,13 @@ No browser? Every action the console offers is also a verb: `build`, `doctor`, `
148
148
 
149
149
  ## 📦 4 · What you get
150
150
 
151
- The harness ships as a small set of layers, mirrored one-for-one in the web console's **Library** rail (Laws · Agents · Skills · Memory · Notebook):
151
+ The harness ships as a small set of layers, and the web console's rail is the same shape — Constitution, Skills and Agents each have their own entry; Memory, Notebook and the wiki sit under Library:
152
152
 
153
153
  | Layer | What it is |
154
154
  | --- | --- |
155
- | **🛡️ Rules** (`laws/`) | 40 universal laws the agent obeys — secrets, scope, verify-before-assert, surface-failures, context economy, load-the-docs, tool-discovery, non-interactive-shell, untrusted-content, least-privilege, external-gate, root-cause, idempotency, calibrated-honesty, source-over-surface, restart-is-not-reload, total-teardown, cover-and-verify, prove-the-gate, answer-shape, stable-reference-codes… |
155
+ | **🧭 Ontology** (`ontology/`) | the mind the rules govern, in four prose sections — **Telos** (the Pact: protect the user, the truth, the agent), **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 |
156
+ | **🛡️ Rules** (`laws/`) | 9 universal laws the agent obeys — always in force, never toggleable: sealed-secrets, one-intent-one-act, verify-before-assert, deletion-is-deliberate, surface-failures, data-not-orders, least-privilege, root-cause, external-gate |
157
+ | **📐 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`), or in the setup wizard; all four pack files ship on disk either way, so a citation into a pack you left out still resolves |
156
158
  | **🤖 Agents** (17) | capability specialists: `reviewer`, `tester`, `architect`, `docs`, `security`, `explorer`, `developer` — plus a debate **council** the `council` skill convenes: `advocate`, `skeptic`, `pragmatist`, `steward`, `visionary`, `user-advocate`, `framer`, `empiricist`, `operator`, `historian` |
157
159
  | **🛠 Skills** (47) | repeatable workflows: brainstorm · **clarify** · plan · **codebase-design** · **domain-modeling** · **wayfinder** · **tickets** · tdd · **develop** · debug · **prototype** · refactor · **ponytail** · **forge-mcp** · geneseed-code-review · **fresh-eyes** · **review-response** · commit · **ship** · **release** · **migrate** · **git-archaeology** · **git-rescue** · repo-map · document-project · **frontend-design** · **prose** · **ingest** · **research** · **learning-path** · **gap-detector** · **feynman** · **crash-course** · **drill** · **decode** · handoff · roast-me · **council** · parallel-agents · **workflow** · **wiki** · **geneseed** · **rule** · **profile** · **opencode-theme** · **herdr** · **pipeline** |
158
160
  | **🔌 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 |
@@ -181,16 +183,20 @@ Pick with `--theme NAME` or via the setup wizard. The theme is remembered in a `
181
183
 
182
184
  ### 🪶 Footprint (lean vs full)
183
185
 
184
- A second per-install dial, **footprint**, sets how much of the Rules `AGENT.md` carries *inline* every turn — a token-cost knob, not a change to which Rules apply (every Rule is always in force).
186
+ A second per-install dial, **footprint**, sets how much of the constitution `AGENT.md` carries *inline* every turn — a token-cost knob, not a change to which Rules apply (every Rule is always in force, and so is the whole of the Ontology).
185
187
 
186
- | Footprint | Section 1 of `AGENT.md` | Trade-off |
188
+ | Footprint | The Ontology + Sections 1–2 of `AGENT.md` | Trade-off |
187
189
  | --- | --- | --- |
188
- | **lean** *(default)* | each Rule's heading + the rule line, then a pointer to the full law file | ~40% smaller; rationale is one on-demand read away |
189
- | **full** | every Rule's complete text **and** rationale, inlined | maximum guidance density; largest per-turn token cost |
190
+ | **lean** *(default)* | the Ontology **whole**; each Rule and each active doctrine rule as its heading + the rule line, then a pointer to the full text | lighter every turn; rationale is one on-demand read away |
191
+ | **full** | the Ontology, every Rule and every active doctrine rule at complete text **and** rationale, inlined | maximum guidance density; largest per-turn token cost |
190
192
 
191
- Lean still ships the complete `laws/universal.md` beside `AGENT.md` and points the agent there before acting on secrets, deletion, git history, scope, or untrusted content — so it's a context/token optimization, **not** a rules cut. 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).
193
+ **The Ontology is never truncated.** Lean keeps only the first sentence of each `### ` block, and the four ontology sections are flowing prose rather than numbered rules — truncating them would leave four orphan sentences, so they ship whole at both footprints. The invariants and the doctrine rules *are* truncated at lean, each to its heading plus its first sentence.
192
194
 
193
- Either way the harness is otherwise identical — same files, Rules, capabilities, and guards; lean only relocates each Rule's *reasoning* to on-demand (and adds the standalone laws file 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 — which is why it stays the default.
195
+ Both footprints put the full text on disk beside `AGENT.md`: `laws/`, `ontology/` and `doctrines/` all ship in the bundle, 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. Measured on `neutral`, adding the ontology and doctrine tiers moved the always-loaded `AGENT.md` from 31,457 to 36,882 bytes at lean (+17.2%) and from 53,378 to 54,810 at full (+2.7%) — the lean growth is the price of shipping the ontology whole, and it was taken deliberately.
196
+
197
+ 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).
198
+
199
+ 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.
194
200
 
195
201
  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).
196
202
 
@@ -214,10 +220,10 @@ is **identical on every host**. What differs is how much of it the host can
214
220
  | **Agents** (capability specialists) | ✅ native | ✅ | ✅ | ✅ `.agent.md` |
215
221
  | **Skills** (byte-identical) | ✅ | ✅ | ✅ | ✅ |
216
222
  | **Memory & Notebook** | ✅ | ✅ | ✅ | ✅ |
217
- | **Context injection** (Rule XVIII) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 📄 preamble |
223
+ | **Context injection** | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 📄 preamble |
218
224
  | **Memory write-back** (learn) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 📄 preamble |
219
- | **Git-gate consent** (Rule XX) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 📄 preamble |
220
- | **Rule-gate consent** (Rule VI) | ⚙️ plugin² | 🪝 hook | 🪝 hook¹ | 📄 preamble |
225
+ | **Git-gate consent** (process 5) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 📄 preamble |
226
+ | **Rule-gate consent** (process 1) | ⚙️ plugin² | 🪝 hook | 🪝 hook¹ | 📄 preamble |
221
227
  | **Sovereign-repo excludes** | ⚙️ plugin | ✅ `claudeMdExcludes` | ✅ rules-shadow | ➖ none |
222
228
  | **MCP server wiring** | ✅ `mcp` | ✅ `mcpServers` | ✅ `mcpServers` | ✅ `mcp-config.json` |
223
229
  | **Colour themes** | ✅ full palette | ➖ | ➖ | ➖ |
@@ -253,7 +259,11 @@ Geneseed/
253
259
  ├── harness.config.json default theme + metadata (the one owner of the version)
254
260
  ├── src/ canonical source — edit here
255
261
  │ ├── AGENT.md.tmpl the entrypoint, rendered to AGENT.md
256
- │ ├── laws/ governance rules
262
+ │ ├── ontology/ how the agent thinks — Telos, Evidence, Decisions, Conduct
263
+ │ ├── laws/ the universal invariants
264
+ │ ├── doctrines/ the four practice packs (craft, rigor, ops, process)
265
+ │ ├── postures/ the relationship register, inlined into AGENT.md
266
+ │ ├── modes/ the operating register, inlined into AGENT.md
257
267
  │ ├── agents/ capability specialists
258
268
  │ ├── skills/ repeatable workflows
259
269
  │ ├── memory/ memory convention + index
package/SETUP.md CHANGED
@@ -165,9 +165,11 @@ your repo's `.claude/settings.json` (paths assume the bundle is at the repo root
165
165
  It wires:
166
166
 
167
167
  - **PreToolUse** (matcher `Bash`) — runs `harness git-gate`, a tool-boundary backstop
168
- for Law XX. The hook inspects the command and forces an `ask` on every `git commit`
169
- or `git push` (even chained or `-C`-flagged), un-suppressible by a one-time "don't
170
- ask again". Every other Bash command is deferred to the normal permission flow.
168
+ for Doctrine `process 5`. The hook inspects the command and forces an `ask` on every
169
+ `git commit` or `git push` (even chained or `-C`-flagged), un-suppressible by a
170
+ one-time "don't ask again". Every other Bash command is deferred to the normal
171
+ permission flow. It is wired only when the **process** pack is active — build with
172
+ `--doctrines` leaving `process` out and this hook is not installed at all.
171
173
  - **SessionStart** (`startup`/`clear`) — prints `AGENT.md` and injects the project
172
174
  context (`harness context`, which auto-discovers the repo's docs);
173
175
  - **SessionStart** (`resume`) — refreshes the project context only, without re-printing
@@ -286,17 +288,79 @@ doubles as a CI drift check: `1` when it had to change files, `0` when every the
286
288
  already in sync, and `2` when `_TEMPLATE.json` itself is missing or unreadable — the one
287
289
  case where a `0` would have meant "in sync" without having checked anything.
288
290
 
291
+ ### Doctrine packs
292
+
293
+ The constitution is three tiers, and only one of them is a choice. The **Ontology** (how the
294
+ agent thinks — Telos, Evidence, Decisions, Conduct) and the nine **Rules** (what it never
295
+ trades away) are always on and cannot be switched off. The **Doctrines** are practices rather
296
+ than principles, and they ship as four packs:
297
+
298
+ | Pack | What it governs |
299
+ | --- | --- |
300
+ | **craft** | how code is written — reuse first, house conventions, docs in the same change, the smallest diff |
301
+ | **rigor** | how work is proven — idempotence, honest tests, cover-and-verify, gates that can actually fail |
302
+ | **ops** | how the machine is driven — tool discovery, commands that return, complete teardowns, restart is not reload |
303
+ | **process** | how a session runs — planning, context economy, docs first, bounded loops, and the consent gate on every commit and push |
304
+
305
+ They are picked **at build time**, once, on the generator — there is no runtime toggle — and
306
+ the default is all four:
307
+
308
+ geneseed-build --doctrines craft,rigor # two packs
309
+ geneseed-build --doctrines none # ontology and the nine Rules only
310
+ geneseed-build # all four (the default)
311
+
312
+ `harness.config.json`'s `doctrines` array sets this checkout's own default, and `doctor`
313
+ refuses one that names a pack the checkout does not ship. Order is fixed by the harness
314
+ (craft → rigor → ops → process) regardless of the order you type.
315
+
316
+ The setup wizard asks too — one *all* / *choose* gate, then a yes/no per pack with its
317
+ one-line description — and it **pre-selects what the install already carries**, read off the
318
+ `Active packs:` marker line in the deployed `AGENT.md`. So re-running the wizard and holding
319
+ Enter cannot silently widen a set you deliberately narrowed.
320
+
321
+ **The whole catalogue always ships.** Every pack file lands under `doctrines/` beside
322
+ `AGENT.md` at both footprints whether or not it was built in, so a rule that cites a pack you
323
+ left out is still readable on disk — only the rendered `AGENT.md` is narrower. `doctor` reports
324
+ such citations as a `[note]`, printed and not counted, because a narrowed build is a
325
+ configuration you chose rather than a defect.
326
+
327
+ ⚠ **Turning `process` off also removes the commit/push consent gate.** Doctrine `process 5`
328
+ (*Consent Before Push*) is enforced twice: as prose in `AGENT.md`, and at the tool boundary —
329
+ the `git-gate` PreToolUse hook on Claude Code and Bob, and the `git commit*` / `git push*`
330
+ permission entries on OpenCode. A build without the `process` pack wires neither, and
331
+ rebuilding an install that had them takes the Claude hook back out of `settings.json`. That is
332
+ deliberate and it is the rule the tiering rests on: **prompt and boundary must never
333
+ disagree.** A gate that stops every command to ask consent for a rule the install did not adopt
334
+ is a gate the agent cannot explain and you did not ask for. Two details worth knowing:
335
+
336
+ - **What stays in every build regardless:** `rm -rf *`, `git push --force*` and `git push -f*`.
337
+ Those are Rule IV's territory — an always-on invariant — not the process pack's.
338
+ - **On OpenCode, an existing `opencode.json` is not stripped.** That file is co-owned, nothing
339
+ on disk records who wrote a given permission entry, and Geneseed will not delete a line you
340
+ might have typed yourself. A pack-off rebuild leaves an already-written `git commit*` in
341
+ place and *reports* it instead. A fresh install has no git gate at all.
342
+
343
+ `process` is the only pack whose removal changes what the machine does rather than only what
344
+ the agent reads — which is why the wizard's blurb for it says so.
345
+
289
346
  ### Footprint (lean vs full)
290
347
 
291
- **Footprint** sets how much of the Rules `AGENT.md` carries *inline* on every turn — a
348
+ **Footprint** sets how much of the constitution `AGENT.md` carries *inline* on every turn — a
292
349
  token-cost dial, not a change to which Rules apply. Both states keep all Rules in force:
293
350
 
294
- - **full** (default) — Section 1 inlines every Rule's complete text *and* rationale.
295
- Maximum guidance density; the largest always-loaded block in the harness.
296
- - **lean** — Section 1 carries each Rule's heading + the rule line, then a pointer to the
297
- full law file. ~40% smaller; the complete `laws/universal.md` still ships beside
298
- `AGENT.md` and the agent reads it on demand (and is told to before acting on secrets,
299
- deletion, git history, scope, or untrusted content).
351
+ - **lean** (default) — Sections 1–2 carry the heading and rule line of each Rule and each
352
+ active doctrine rule, then a pointer to the full text. Lighter every turn; the complete
353
+ `laws/universal.md`, `ontology/` and `doctrines/` still ship beside `AGENT.md` and the agent
354
+ reads them on demand (and is told to before acting on secrets, deletion, git history, scope,
355
+ or untrusted content).
356
+ - **full** — Sections 1–2 inline every Rule's and every active doctrine rule's complete text
357
+ *and* rationale. Maximum guidance density; the largest always-loaded block in the harness.
358
+
359
+ **The Ontology is never truncated.** Lean keeps only the first sentence of each `### ` block,
360
+ and the four ontology sections are flowing prose rather than numbered rules — cutting them
361
+ would leave four orphan sentences, so they ship whole at both footprints. That is why adding
362
+ the ontology tier grew the lean carrier proportionally more than the full one; it was taken as
363
+ a deliberate cost.
300
364
 
301
365
  **Why:** context is scarce and metered. Lean reclaims that budget — and the tokens you
302
366
  pay for it — for the task, moving the *rationale* one read away while keeping the rules
@@ -310,10 +374,11 @@ you run a smaller model.
310
374
  can *do*: lean and full emit identical files (same agents, skills, plugins, commands, memory,
311
375
  notebook, hooks) and every Rule is present and binding. The only structural difference is
312
376
  that a lean install on a global / Claude / Bob / Copilot target also ships the standalone
313
- `laws/universal.md` (project bundles already carry it); the only behavioural difference is
314
- that each Rule's reasoning loads on demand instead of every turn. Lean is the default;
315
- full, with the rationale always in front of the model, applies a rule's nuance more
316
- reliably on subtle edge cases or with a weaker model, and is one flag away.
377
+ `laws/universal.md` and `ontology/` (project bundles already carry them, and `doctrines/`
378
+ ships at both footprints on every target); the only behavioural difference is that the
379
+ reasoning loads on demand instead of every turn. Lean is the default; full, with the rationale
380
+ always in front of the model, applies a rule's nuance more reliably on subtle edge cases or
381
+ with a weaker model, and is one flag away.
317
382
 
318
383
  Set it with `--footprint lean|full` (alongside any `--emit`), the **Footprint** toggle in
319
384
  the web Settings, the per-harness dropdown in the Harnesses tab, or the setup wizard. It is
@@ -418,7 +483,7 @@ opt-in, now simply matches the default. To drop injection entirely, set
418
483
  If you keep a personal knowledge base on this machine — an Obsidian vault, or any
419
484
  folder of interlinked markdown — declare it once in **`wiki.jsonc`** and the agent
420
485
  becomes a citizen of it: entry notes load each session (eager) or on demand (lazy),
421
- and it reads *and writes* notes under your vault's own conventions (AGENT.md §7,
486
+ and it reads *and writes* notes under your vault's own conventions (AGENT.md §8,
422
487
  the `wiki` skill). Unlike `context.json` this is **per machine, not per repo**.
423
488
 
424
489
  The build seeds `wiki.jsonc` beside `AGENT.md` (for a global install:
@@ -462,7 +527,7 @@ list keeps the feature off. The file may hold private paths — it is host-speci
462
527
  covered by the bundle `.gitignore`, and never committed.
463
528
 
464
529
  On tools without the plugins (plain `AGENT.md`, Claude Code), the same contract
465
- holds through prose: AGENT.md §7 instructs the agent to read `wiki.jsonc` at session
530
+ holds through prose: AGENT.md §8 instructs the agent to read `wiki.jsonc` at session
466
531
  start and honour it.
467
532
 
468
533
  ### Memory
@@ -963,7 +1028,8 @@ capability agent. Notes:
963
1028
 
964
1029
  - **Permissions still gate.** The consent-before-commit/push / `rm -rf` `ask` rules
965
1030
  will *block* in a non-interactive run (nothing to answer the prompt). Both
966
- `git commit` and `git push` are gated now (Law XX, every branch), so a CI job that
1031
+ `git commit` and `git push` are gated on every branch whenever the **process** pack
1032
+ is active (Doctrine `process 5`; a build without it wires neither), so a CI job that
967
1033
  commits must opt those commands back to `"allow"` in its own `permission.bash` map,
968
1034
  or scope the run to read-only work — don't blanket-disable the guards.
969
1035
  - **`--pure`** runs OpenCode ignoring local/global config — handy to reproduce a bug