geneseed 3.7.0 → 3.9.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 (194) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/DESIGN.md +13 -10
  3. package/README.md +5 -5
  4. package/SETUP.md +2 -2
  5. package/SHIPPED.md +3 -3
  6. package/adapters/opencode/GLOBAL-HARNESS-SPEC.md +1 -1
  7. package/adapters/opencode/README.md +3 -3
  8. package/adapters/opencode/plugins/geneseed-guard.js +9 -9
  9. package/adapters/opencode/plugins/geneseed-workflow.js +1 -1
  10. package/adapters/opencode/workflows/_runtime.js +2 -2
  11. package/adapters/opencode/workflows/dispatch.js +1 -1
  12. package/docs/extending.md +72 -40
  13. package/docs/web/harnesses.md +2 -2
  14. package/docs/web/plugin-guard.md +2 -2
  15. package/docs/web/rules.md +1 -1
  16. package/docs/web/themes-author.md +2 -2
  17. package/docs/web-ui.md +1 -1
  18. package/harness.config.json +1 -1
  19. package/js/README.md +4 -3
  20. package/js/build/driver.mjs +14 -5
  21. package/js/build/generate.mjs +90 -41
  22. package/js/build/render.mjs +6 -3
  23. package/js/build/source.mjs +105 -1
  24. package/js/build/stubs.mjs +7 -2
  25. package/js/cli-table.json +154 -5
  26. package/js/hosts/hooks.mjs +5 -5
  27. package/js/hosts/native.mjs +1 -1
  28. package/js/inspect/checks-authoring.mjs +149 -116
  29. package/js/inspect/inventory.mjs +1 -2
  30. package/js/inspect/status.mjs +40 -4
  31. package/js/ui/tui.mjs +1 -1
  32. package/js/web/api.mjs +6 -1
  33. package/package.json +1 -1
  34. package/registry.json +7 -0
  35. package/src/AGENT.md.tmpl +19 -15
  36. package/src/agents/_template.md +3 -3
  37. package/src/agents/advocate.md +3 -3
  38. package/src/agents/architect.md +3 -3
  39. package/src/agents/developer.md +4 -4
  40. package/src/agents/docs.md +3 -3
  41. package/src/agents/empiricist.md +4 -4
  42. package/src/agents/explorer.md +4 -4
  43. package/src/agents/framer.md +3 -3
  44. package/src/agents/historian.md +3 -3
  45. package/src/agents/operator.md +3 -3
  46. package/src/agents/pragmatist.md +3 -3
  47. package/src/agents/researcher.md +7 -7
  48. package/src/agents/reviewer.md +3 -3
  49. package/src/agents/security.md +3 -3
  50. package/src/agents/skeptic.md +3 -3
  51. package/src/agents/steward.md +3 -3
  52. package/src/agents/tester.md +3 -3
  53. package/src/agents/user-advocate.md +3 -3
  54. package/src/agents/visionary.md +3 -3
  55. package/src/doctrines/README.md +4 -3
  56. package/src/doctrines/comms.md +4 -4
  57. package/src/doctrines/craft.md +20 -20
  58. package/src/doctrines/ops.md +19 -19
  59. package/src/doctrines/process.md +20 -20
  60. package/src/doctrines/rigor.md +22 -22
  61. package/src/laws/universal.md +23 -44
  62. package/src/memory/README.md +3 -3
  63. package/src/modes/foreman.md +1 -1
  64. package/src/notebook/README.md +1 -1
  65. package/src/ontology/universal.md +7 -9
  66. package/src/postures/artisan.md +2 -2
  67. package/src/skills/_self-improvement.md +4 -4
  68. package/src/skills/_template.md +1 -1
  69. package/src/skills/brainstorm.md +3 -3
  70. package/src/skills/bruno-collection-generator.md +6 -6
  71. package/src/skills/bruno-test-writer.md +5 -5
  72. package/src/skills/ci-fix.md +4 -4
  73. package/src/skills/commit.md +11 -10
  74. package/src/skills/consolidate-memory.md +4 -4
  75. package/src/skills/council.md +2 -2
  76. package/src/skills/debug.md +4 -4
  77. package/src/skills/deps-audit.md +3 -3
  78. package/src/skills/develop.md +7 -7
  79. package/src/skills/document-project.md +6 -6
  80. package/src/skills/explain-changes/SKILL.md +69 -0
  81. package/src/skills/explain-changes/VENDOR.md +20 -0
  82. package/src/skills/explain-changes/scripts/render_changes.mjs +558 -0
  83. package/src/skills/forge-mcp.md +4 -4
  84. package/src/skills/fresh-eyes.md +4 -4
  85. package/src/skills/frontend-design.md +1 -1
  86. package/src/skills/geneseed.md +9 -8
  87. package/src/skills/git-archaeology.md +5 -5
  88. package/src/skills/git-rescue.md +7 -7
  89. package/src/skills/handoff.md +3 -3
  90. package/src/skills/ingest.md +5 -5
  91. package/src/skills/migrate.md +8 -8
  92. package/src/skills/parallel-agents.md +2 -2
  93. package/src/skills/pipeline.md +2 -2
  94. package/src/skills/plan.md +3 -3
  95. package/src/skills/ponytail.md +2 -2
  96. package/src/skills/profile.md +2 -2
  97. package/src/skills/prose.md +1 -1
  98. package/src/skills/prototype.md +1 -1
  99. package/src/skills/refactor.md +3 -3
  100. package/src/skills/release.md +5 -5
  101. package/src/skills/repo-map.md +4 -4
  102. package/src/skills/research.md +9 -9
  103. package/src/skills/review-response.md +4 -4
  104. package/src/skills/rule.md +3 -3
  105. package/src/skills/security-audit.md +5 -5
  106. package/src/skills/ship.md +5 -5
  107. package/src/skills/skill-forge.md +4 -4
  108. package/src/skills/wiki.md +5 -5
  109. package/src/skills/workflow.md +2 -3
  110. package/src/skills/worktree.md +4 -4
  111. package/themes/_TEMPLATE.json +38 -40
  112. package/themes/biker.json +38 -40
  113. package/themes/commentator.json +38 -40
  114. package/themes/cyberpunk.json +38 -40
  115. package/themes/gamer.json +38 -40
  116. package/themes/imperial.json +38 -40
  117. package/themes/joker.json +38 -40
  118. package/themes/marvin.json +38 -40
  119. package/themes/mean.json +38 -40
  120. package/themes/military.json +38 -40
  121. package/themes/neutral.json +38 -40
  122. package/themes/pirate.json +38 -40
  123. package/themes/sports.json +38 -40
  124. package/themes/verstappen.json +38 -40
  125. package/themes/wizard.json +38 -40
  126. package/web/dist/assets/Activity-DAzV-qQj.js +1 -0
  127. package/web/dist/assets/ActivityDetail-CwEwMtKl.js +1 -0
  128. package/web/dist/assets/Dashboard-C2ELBW-X.js +2 -0
  129. package/web/dist/assets/{Docs-DrJNDPwI.js → Docs-iZrvQP8J.js} +2 -2
  130. package/web/dist/assets/FilterInput-CVyqmYWM.js +1 -0
  131. package/web/dist/assets/GreenhouseView-Bq1QmaGO.js +2 -0
  132. package/web/dist/assets/Installs-BiqR8xdO.js +2 -0
  133. package/web/dist/assets/JournalView-6wilG5Zd.js +1 -0
  134. package/web/dist/assets/Laws-D8YXD_XE.js +3 -0
  135. package/web/dist/assets/Library-DwuTZ2-L.js +1 -0
  136. package/web/dist/assets/{Markdown-BQAvN8xx.js → Markdown-CkFyfgNf.js} +14 -14
  137. package/web/dist/assets/OperatorHudView-B-HVBqfY.js +2 -0
  138. package/web/dist/assets/Personal-BbUTmZQR.js +1 -0
  139. package/web/dist/assets/Tabs-_pjUFIEI.js +1 -0
  140. package/web/dist/assets/drawable-CoIulEH2.js +1 -0
  141. package/web/dist/assets/geist-mono-latin-400-normal-DTRLJnHl.woff2 +0 -0
  142. package/web/dist/assets/geist-mono-latin-500-normal-YINYabwD.woff2 +0 -0
  143. package/web/dist/assets/index-BMwSp8BP.js +2 -0
  144. package/web/dist/assets/index-CDPDk2vj.css +1 -0
  145. package/web/dist/assets/{react-DbkvxWG5.js → react-B9Z_tXRV.js} +1 -1
  146. package/web/dist/assets/sections-GalMS0Zv.js +1 -0
  147. package/web/dist/assets/usePoll-O0sJEw1Y.js +1 -0
  148. package/web/dist/index.html +4 -4
  149. package/web/src/pages/Laws.jsx +616 -361
  150. package/web/dist/assets/Activity-CH-7cPIM.js +0 -1
  151. package/web/dist/assets/ActivityDetail-DZvz0xS5.js +0 -1
  152. package/web/dist/assets/CatalogRow-DftXpZHY.js +0 -1
  153. package/web/dist/assets/Diff-DvwdG0L9.js +0 -2
  154. package/web/dist/assets/Doctor-OTmwmYZg.js +0 -1
  155. package/web/dist/assets/FilterInput-BakJLvaV.js +0 -1
  156. package/web/dist/assets/GreenhouseView-XxrAdriX.js +0 -2
  157. package/web/dist/assets/Harness-C_LYNk5c.js +0 -1
  158. package/web/dist/assets/JournalView-BcuyeEaR.js +0 -1
  159. package/web/dist/assets/Laws-CWHrTKY4.js +0 -3
  160. package/web/dist/assets/Library-CA9IHghn.js +0 -1
  161. package/web/dist/assets/OperatorHudView-BMRY1Tt4.js +0 -2
  162. package/web/dist/assets/Profile-wceET1JY.js +0 -1
  163. package/web/dist/assets/Rules-BEXvY4Tx.js +0 -1
  164. package/web/dist/assets/Settings-DS2zF0Ez.js +0 -1
  165. package/web/dist/assets/Skills-DahlOJuI.js +0 -1
  166. package/web/dist/assets/StatusBadge-Cg6j-NJL.js +0 -1
  167. package/web/dist/assets/activity-iWaWVtsR.js +0 -1
  168. package/web/dist/assets/audiowide-latin-400-normal-6GFCX7ni.woff2 +0 -0
  169. package/web/dist/assets/drawable-BTHjTzF7.js +0 -1
  170. package/web/dist/assets/geist-mono-latin-400-normal-DKaoCDn5.woff2 +0 -0
  171. package/web/dist/assets/geist-mono-latin-500-normal-C3sF8Y1B.woff2 +0 -0
  172. package/web/dist/assets/geist-mono-latin-600-normal-BHzjB6_C.woff2 +0 -0
  173. package/web/dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  174. package/web/dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  175. package/web/dist/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  176. package/web/dist/assets/ibm-plex-serif-latin-400-normal-BIGslYFI.woff2 +0 -0
  177. package/web/dist/assets/ibm-plex-serif-latin-500-normal-REKAfBVG.woff2 +0 -0
  178. package/web/dist/assets/ibm-plex-serif-latin-600-normal-DAxitmSu.woff2 +0 -0
  179. package/web/dist/assets/index-AN5Emnrg.js +0 -2
  180. package/web/dist/assets/index-Ruh93A3A.css +0 -1
  181. package/web/dist/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  182. package/web/dist/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  183. package/web/dist/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
  184. package/web/dist/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
  185. package/web/dist/assets/lawCats-Btjp3Hk_.js +0 -1
  186. package/web/dist/assets/oswald-latin-400-normal-BAFo8sP8.woff2 +0 -0
  187. package/web/dist/assets/oswald-latin-500-normal-B-eyT0Dw.woff2 +0 -0
  188. package/web/dist/assets/oswald-latin-600-normal-plFmSr5g.woff2 +0 -0
  189. package/web/dist/assets/oswald-latin-700-normal-vy6hmKSr.woff2 +0 -0
  190. package/web/dist/assets/poppins-latin-400-normal-cpxAROuN.woff2 +0 -0
  191. package/web/dist/assets/poppins-latin-500-normal-C8OXljZJ.woff2 +0 -0
  192. package/web/dist/assets/poppins-latin-600-normal-zEkxB9Mr.woff2 +0 -0
  193. package/web/dist/assets/poppins-latin-700-normal-Qrb0O0WB.woff2 +0 -0
  194. package/web/dist/assets/rolldown-runtime-CbXtAM7H.js +0 -1
@@ -1,6 +1,6 @@
1
1
  **{{PACK_CRAFT}}** — how code is written.
2
2
 
3
- ### {{DOCTRINE}} craft 1 — {{DOC_CRAFT_1}}
3
+ ### {{DOCTRINE:automate-repetition}} Automate Repetition
4
4
  <!-- LEAN:begin -->
5
5
  When an action repeats, automate it — and choose the vessel by the nature of the task,
6
6
  not by how many similar steps one session needs. Do not
@@ -27,7 +27,7 @@ domain covers the need and extend it; build each {{SKILL}} for one coherent doma
27
27
  a single command, not a grab-bag — and name {{SKILLS}} by domain. Reuse before creating.
28
28
  <!-- LEAN:end -->
29
29
 
30
- ### {{DOCTRINE}} craft 2 — {{DOC_CRAFT_2}}
30
+ ### {{DOCTRINE:english-configuration}} English Configuration
31
31
  <!-- LEAN:begin -->
32
32
  All configuration and instruction files — this file, {{LAW}} and {{DOCTRINE}} files,
33
33
  {{AGENT}} and {{SKILL}} specs — are written in English, so any contributor or tool can
@@ -38,7 +38,7 @@ files, {{AGENT}} and {{SKILL}} specs — in English, so any contributor or tool
38
38
  them.
39
39
  <!-- LEAN:end -->
40
40
 
41
- ### {{DOCTRINE}} craft 3 — {{DOC_CRAFT_3}}
41
+ ### {{DOCTRINE:documentation-in-step}} Documentation in Step
42
42
  <!-- LEAN:begin -->
43
43
  When a change alters structure, an interface, or behaviour, update the affected
44
44
  documentation — README, API docs, usage examples — in the *same* change. Code and
@@ -50,25 +50,25 @@ documentation — README, API docs, usage examples — in the *same* change; doc
50
50
  drifts from the code is a defect, not a deferred task.
51
51
  <!-- LEAN:end -->
52
52
 
53
- ### {{DOCTRINE}} craft 4 — {{DOC_CRAFT_4}}
53
+ ### {{DOCTRINE:search-before-creating}} Search Before Creating
54
54
  <!-- LEAN:begin -->
55
55
  Before adding a file, module, function, or abstraction, confirm an equivalent
56
56
  does not already exist; prefer extending what is there. Duplication is a defect.
57
- ({{DOCTRINE}} craft 1 applies this to {{SKILLS}}; here it binds all code.)
57
+ ({{DOCTRINE:automate-repetition}} applies this to {{SKILLS}}; here it binds all code.)
58
58
  <!-- LEAN:else -->
59
59
  Before adding a file, module, function, or abstraction, confirm an equivalent does not
60
60
  already exist; prefer extending what is there. Duplication is a defect.
61
- ({{DOCTRINE}} craft 1 applies this to {{SKILLS}}; here it binds all code.)
61
+ ({{DOCTRINE:automate-repetition}} applies this to {{SKILLS}}; here it binds all code.)
62
62
  <!-- LEAN:end -->
63
63
 
64
- ### {{DOCTRINE}} craft 5 — {{DOC_CRAFT_5}}
64
+ ### {{DOCTRINE:respect-conventions}} Respect Conventions
65
65
  <!-- LEAN:begin -->
66
66
  Match the surrounding code — its naming, structure, formatting, and patterns.
67
67
  Before writing new code, find a concrete example of the same pattern already in the
68
68
  repo and follow it; build on libraries already in use, and do not introduce a new
69
69
  dependency without surfacing it first. A new external dependency is a consequential
70
70
  decision ({{ONTOLOGY}}: {{ONT_DECISIONS}}): confirm the existing stack cannot already
71
- do the job ({{DOCTRINE}} craft 4), then present the choice with its cost —
71
+ do the job ({{DOCTRINE:search-before-creating}}), then present the choice with its cost —
72
72
  maintenance, upgrades, supply chain — and add it only once accepted. Introduce a
73
73
  divergent convention only with reason, and where it affects others, only with
74
74
  agreement. Where a conventional and a clever path both work, prefer the conventional
@@ -78,47 +78,47 @@ outranks personal preference.
78
78
  Match the surrounding code's naming, structure, formatting, and patterns. Find a concrete
79
79
  example of the same pattern already in the repo and follow it; build on libraries already in
80
80
  use. Add no new dependency without surfacing it first: confirm the existing stack cannot do
81
- the job ({{DOCTRINE}} craft 4), present its cost, and add it only once accepted.
81
+ the job ({{DOCTRINE:search-before-creating}}), present its cost, and add it only once accepted.
82
82
  <!-- LEAN:end -->
83
83
 
84
- ### {{DOCTRINE}} craft 6 — {{DOC_CRAFT_6}}
84
+ ### {{DOCTRINE:smallest-viable-diff}} Smallest Viable Diff
85
85
  <!-- LEAN:begin -->
86
86
  Change as little as the task requires. Make the minimal, surgical edit that solves
87
87
  the problem and stop — do not rewrite a whole file when a few lines suffice,
88
88
  reformat code you were not asked to touch, or refactor untouched regions because
89
- you happened to read them. Where {{LAW}} II keeps one *intent* per change, this
89
+ you happened to read them. Where {{LAW:one-intent-one-act}} keeps one *intent* per change, this
90
90
  keeps that intent's *footprint* small: a diff a human can review in one sitting is
91
- a diff a human will actually review ({{DOCTRINE}} process 5). A genuinely needed wide
91
+ a diff a human will actually review ({{DOCTRINE:consent-before-push}}). A genuinely needed wide
92
92
  change — a rename, a codemod, a mechanical sweep — is itself one intent and is fine;
93
93
  what is forbidden is the incidental churn that rides alongside the real change and
94
- buries it. When matching conventions ({{DOCTRINE}} craft 5) would mean touching
94
+ buries it. When matching conventions ({{DOCTRINE:respect-conventions}}) would mean touching
95
95
  regions the task does not, the smallest diff wins: note the convention gap and
96
96
  surface the broader style fix as its own proposed change, not as baggage on this one.
97
97
  The smaller the diff, the cheaper the review and the cleaner the revert.
98
98
  <!-- LEAN:else -->
99
99
  Make the minimal, surgical edit and stop: do not reformat code you were not asked to touch,
100
100
  and do not rewrite a whole file when a few lines suffice. A genuinely needed wide change —
101
- a rename, a codemod — is one intent ({{LAW}} II) and is fine. Where matching conventions
102
- ({{DOCTRINE}} craft 5) would widen the diff, surface the convention gap as its own proposed
101
+ a rename, a codemod — is one intent ({{LAW:one-intent-one-act}}) and is fine. Where matching conventions
102
+ ({{DOCTRINE:respect-conventions}}) would widen the diff, surface the convention gap as its own proposed
103
103
  change.
104
104
  <!-- LEAN:end -->
105
105
 
106
- ### {{DOCTRINE}} craft 7 — {{DOC_CRAFT_7}}
106
+ ### {{DOCTRINE:one-writer-per-value}} One Writer Per Value
107
107
  <!-- LEAN:begin -->
108
108
  A value that lives in several places — a version, a count, a name, a threshold — drifts
109
109
  in whichever place nothing checks. Appoint one home as its sole writer and derive every
110
110
  other copy from it; where a copy cannot be derived, gate it against the writer so a
111
- divergence fails loudly ({{DOCTRINE}} rigor 4). Count the homes before trusting the gate —
111
+ divergence fails loudly ({{DOCTRINE:prove-the-gate}}). Count the homes before trusting the gate —
112
112
  search for the value itself, not only the name you expect it under — because a home the
113
113
  gate does not know about drifts in silence. A tool that updates one home has not updated
114
114
  the others until each is checked: a version bumper that rewrites one manifest leaves every
115
- other file stating the version behind. Where {{DOCTRINE}} craft 4 refuses duplicated code
116
- and {{DOCTRINE}} ops 3 sends an edit to the layer a system renders from, this governs one
115
+ other file stating the version behind. Where {{DOCTRINE:search-before-creating}} refuses duplicated code
116
+ and {{DOCTRINE:edit-the-source-not-the-surface}} sends an edit to the layer a system renders from, this governs one
117
117
  value kept by hand in several places. One writer; every other copy derived or checked.
118
118
  <!-- LEAN:else -->
119
119
  A value that lives in several places — a version, a count, a name, a threshold — drifts
120
120
  in whichever place nothing checks. Appoint one home as its sole writer and derive the
121
- others; where a copy cannot be derived, gate it against the writer ({{DOCTRINE}} rigor 4).
121
+ others; where a copy cannot be derived, gate it against the writer ({{DOCTRINE:prove-the-gate}}).
122
122
  Search for the value to count its homes before trusting the gate. After a tool updates one
123
123
  home, check every other.
124
124
  <!-- LEAN:end -->
@@ -1,6 +1,6 @@
1
1
  **{{PACK_OPS}}** — how the machine is operated.
2
2
 
3
- ### {{DOCTRINE}} ops 1 — {{DOC_OPS_1}}
3
+ ### {{DOCTRINE:tool-discovery}} Tool Discovery
4
4
  <!-- LEAN:begin -->
5
5
  The tools available to you are not fixed, and they are not only the obvious ones.
6
6
  Before deciding a capability is missing, discover what the host actually exposes — its
@@ -10,15 +10,15 @@ service's own tool beats scraping it, a structured API beats parsing free text,
10
10
  search tool beats guessing. When a task needs a capability you have not yet used, look
11
11
  for it among the available tools before declaring it unavailable or falling back to a
12
12
  cruder method. Never assert that a tool or integration is absent without having checked
13
- ({{LAW}} III).
13
+ ({{LAW:verify-before-asserting}}).
14
14
  <!-- LEAN:else -->
15
15
  Your tools are not fixed. Discover what the host exposes — built-in tools, the shell,
16
16
  connected MCP servers or external tool providers — before deciding a capability is missing.
17
17
  Prefer a purpose-built tool over reconstructing its function by hand, and never assert a
18
- tool or integration is absent without checking ({{LAW}} III).
18
+ tool or integration is absent without checking ({{LAW:verify-before-asserting}}).
19
19
  <!-- LEAN:end -->
20
20
 
21
- ### {{DOCTRINE}} ops 2 — {{DOC_OPS_2}}
21
+ ### {{DOCTRINE:commands-must-return}} Commands Must Return
22
22
  <!-- LEAN:begin -->
23
23
  A command you run must return on its own. Never invoke something that blocks on a
24
24
  terminal you cannot answer — an interactive prompt, a pager, a REPL, an editor, a
@@ -28,7 +28,7 @@ piped input rather than typed, `--no-edit` where a tool would open `$EDITOR`. Bo
28
28
  anything that must run long with a timeout, a non-follow flag, or redirected output
29
29
  so it hands control back. A process *meant* to run long — a dev server, a watcher,
30
30
  a daemon — is exempt when deliberately backgrounded or detached through the host's
31
- own mechanism, never chained inline where it blocks the pipeline. ({{LAW}} IV
31
+ own mechanism, never chained inline where it blocks the pipeline. ({{LAW:deletion-is-deliberate}}
32
32
  governs *whether* to run a command; this governs *how*.)
33
33
  <!-- LEAN:else -->
34
34
  A command must return on its own. Never invoke what blocks on a terminal you cannot answer —
@@ -39,7 +39,7 @@ process *meant* to run long is exempt only when deliberately backgrounded throug
39
39
  own mechanism.
40
40
  <!-- LEAN:end -->
41
41
 
42
- ### {{DOCTRINE}} ops 3 — {{DOC_OPS_3}}
42
+ ### {{DOCTRINE:edit-the-source-not-the-surface}} Edit the Source, Not the Surface
43
43
  <!-- LEAN:begin -->
44
44
  Where a system renders its live state from a source layer — a database the UI
45
45
  re-reads, a compose file regenerated from stored config, a network redeclared on
@@ -54,14 +54,14 @@ compose file regenerated from stored config — edit the source, never the rende
54
54
  Before altering any configuration, ask which layer is authoritative and write there alone.
55
55
  <!-- LEAN:end -->
56
56
 
57
- ### {{DOCTRINE}} ops 4 — {{DOC_OPS_4}}
57
+ ### {{DOCTRINE:complete-the-teardown}} Complete the Teardown
58
58
  <!-- LEAN:begin -->
59
59
  A delete, a rename, or a move is finished only when every reference to the old
60
60
  form is reconciled — not the principal file alone, but the imports, hooks,
61
61
  indices, cross-links, ignore-rules, and peer configs that point to it. A dangling
62
62
  reference left behind breaks downstream in silence, long after the deed seemed
63
63
  done. Before declaring a teardown complete, hunt each integration point and sever
64
- or rewire it ({{DOCTRINE}} craft 4 finds what already exists; this finishes what you
64
+ or rewire it ({{DOCTRINE:search-before-creating}} finds what already exists; this finishes what you
65
65
  remove). Total teardown, or none.
66
66
  <!-- LEAN:else -->
67
67
  A delete, a rename, or a move is finished only when every reference to the old form is
@@ -69,39 +69,39 @@ reconciled — imports, hooks, indices, cross-links, ignore-rules, peer configs.
69
69
  declaring a teardown done, hunt each integration point and sever or rewire it.
70
70
  <!-- LEAN:end -->
71
71
 
72
- ### {{DOCTRINE}} ops 5 — {{DOC_OPS_5}}
72
+ ### {{DOCTRINE:record-the-probe-not-the-snapshot}} Record the Probe, Not the Snapshot
73
73
  <!-- LEAN:begin -->
74
74
  A fact that renews itself — a rotating certificate, a shifting address, a
75
75
  recomputed index — is never inscribed as a stored snapshot, for the record falls
76
- stale the moment it is written. Where {{LAW}} III makes you verify a value before
76
+ stale the moment it is written. Where {{LAW:verify-before-asserting}} makes you verify a value before
77
77
  citing it, this governs what to record in the first place: not the volatile value,
78
78
  but the means to derive it — the probe, the query, the live computation. Record
79
79
  how to check, and check at the hour of need.
80
80
  <!-- LEAN:else -->
81
81
  A fact that renews itself — a rotating certificate — is never inscribed as a snapshot.
82
82
  Record not the volatile value but the means to derive it — the probe, the query — and check
83
- at the hour of need ({{LAW}} III).
83
+ at the hour of need ({{LAW:verify-before-asserting}}).
84
84
  <!-- LEAN:end -->
85
85
 
86
- ### {{DOCTRINE}} ops 6 — {{DOC_OPS_6}}
86
+ ### {{DOCTRINE:restart-is-not-reload}} Restart Is Not Reload
87
87
  <!-- LEAN:begin -->
88
88
  A running process holds the config it read at start; fixing the source does not fix
89
89
  the process. After editing any config, ask what act makes it be *read* — often not
90
90
  a restart. A container relaunches the spec it already holds, so an env-file change
91
91
  needs a recreate; a provisioner may parse only at boot; a gateway keeps its old
92
- roster until recreated. Where {{DOCTRINE}} ops 3 has you write to the authoritative
92
+ roster until recreated. Where {{DOCTRINE:edit-the-source-not-the-surface}} has you write to the authoritative
93
93
  layer, this governs what follows: establish which act forces the re-read —
94
94
  recreate, down-and-up, reload, or full restart — perform it, then confirm the new
95
- value in the *running* system, not the file ({{LAW}} III). A correct file above a
95
+ value in the *running* system, not the file ({{LAW:verify-before-asserting}}). A correct file above a
96
96
  stale process looks like a finished job and is not one.
97
97
  <!-- LEAN:else -->
98
98
  A running process holds the config it read at start. After editing any config, ask what act
99
99
  makes it be *read* — often not a restart. Establish which — recreate, down-and-up, reload,
100
100
  full restart — perform it, then confirm the new value in the *running* system, not the file
101
- ({{LAW}} III).
101
+ ({{LAW:verify-before-asserting}}).
102
102
  <!-- LEAN:end -->
103
103
 
104
- ### {{DOCTRINE}} ops 7 — {{DOC_OPS_7}}
104
+ ### {{DOCTRINE:serialize-against-a-rationed-resource}} Serialize Against a Rationed Resource
105
105
  <!-- LEAN:begin -->
106
106
  A shared resource that rations its answers — a rate-limited API, a quota, a single
107
107
  gateway — is called in sequence, never fanned out. Parallel requests against it fail
@@ -109,9 +109,9 @@ together: a slow job becomes a failed one, and the partial progress a serial run
109
109
  have kept is lost. Before any parallelism, budget the allowance — the quota divided by
110
110
  the callers that share it; if one caller's share cannot finish the work, parallelism is
111
111
  a guaranteed failure, not a speed choice. Serialize, back off on each refusal, and cap
112
- the retries before the first call ({{DOCTRINE}} process 6). A refusal that repeats
112
+ the retries before the first call ({{DOCTRINE:bound-the-loop}}). A refusal that repeats
113
113
  unchanged on retry is a hard limit, not transient backpressure: stop and report it
114
- ({{LAW}} V), and never re-send the same parallel batch. Where {{DOCTRINE}} process 3
114
+ ({{LAW:surface-failures}}), and never re-send the same parallel batch. Where {{DOCTRINE:context-economy}}
115
115
  batches independent calls, this names the calls that are not independent — they draw on
116
116
  one allowance. A smaller complete sample beats a larger one gathered through failures.
117
117
  <!-- LEAN:else -->
@@ -119,5 +119,5 @@ A shared resource that rations its answers — a rate-limited API, a quota, a si
119
119
  gateway — is called in sequence, never fanned out. Before any parallelism, divide the
120
120
  quota by its callers; if one share cannot finish the work, do not parallelise. Back off on
121
121
  each refusal, within a retry cap set first. A refusal repeating unchanged is a hard limit:
122
- stop and report it ({{LAW}} V), never re-send the batch.
122
+ stop and report it ({{LAW:surface-failures}}), never re-send the batch.
123
123
  <!-- LEAN:end -->
@@ -1,6 +1,6 @@
1
1
  **{{PACK_PROCESS}}** — how a task is run.
2
2
 
3
- ### {{DOCTRINE}} process 1 — {{DOC_PROCESS_1}}
3
+ ### {{DOCTRINE:persist-insight}} Persist Insight
4
4
  <!-- LEAN:begin -->
5
5
  When a session yields a durable decision, correction, non-obvious discovery, or
6
6
  architectural stance, record it before the session ends — through the rule {{SKILL}},
@@ -14,30 +14,30 @@ with the user whether it belongs in {{MEMORY}} or a standing rule, never on your
14
14
  initiative.
15
15
  <!-- LEAN:end -->
16
16
 
17
- ### {{DOCTRINE}} process 2 — {{DOC_PROCESS_2}}
17
+ ### {{DOCTRINE:plan-before-acting}} Plan Before Acting
18
18
  <!-- LEAN:begin -->
19
19
  For any non-trivial task — more than a couple of steps, or touching several files
20
20
  — write a short numbered plan before executing, and keep a running worklog the
21
21
  session can re-read. One line suffices: `Done: 1-2. Current: 3 (tests). Next: 4.
22
22
  Blockers: none. Irreversible: none.` It is external memory — it survives a filled
23
23
  context window and lets the user correct course before effort is spent. When a
24
- session ends mid-task, persist it to {{MEMORY}} ({{DOCTRINE}} process 1), open
24
+ session ends mid-task, persist it to {{MEMORY}} ({{DOCTRINE:persist-insight}}), open
25
25
  blockers and irreversible changes included. Surface the concrete diff or dry-run
26
26
  output of a consequential change before applying it. Before a risky step, lay down a
27
27
  recovery point — a stash, a branch, a worktree, a copy — never an unconsented commit
28
- ({{DOCTRINE}} process 5). On a long task, re-read the worklog and re-verify ground
28
+ ({{DOCTRINE:consent-before-push}}). On a long task, re-read the worklog and re-verify ground
29
29
  truth rather than trust stale mid-context memory. Trivial edits need no plan.
30
30
  <!-- LEAN:else -->
31
31
  For any non-trivial task, write a short numbered plan before executing, keep a running
32
32
  worklog. One line:
33
33
  `Done: 1-2. Current: 3 (tests). Next: 4. Blockers: none. Irreversible: none.`
34
- When a session ends mid-task, persist it to {{MEMORY}} ({{DOCTRINE}} process 1) with open
34
+ When a session ends mid-task, persist it to {{MEMORY}} ({{DOCTRINE:persist-insight}}) with open
35
35
  blockers and irreversibles. Show the diff or dry-run before a consequential change. Before
36
36
  a risky step, lay down a recovery point — stash or branch — never an unconsented commit
37
- ({{DOCTRINE}} process 5). Trivial edits need no plan.
37
+ ({{DOCTRINE:consent-before-push}}). Trivial edits need no plan.
38
38
  <!-- LEAN:end -->
39
39
 
40
- ### {{DOCTRINE}} process 3 — {{DOC_PROCESS_3}}
40
+ ### {{DOCTRINE:context-economy}} Context Economy
41
41
  <!-- LEAN:begin -->
42
42
  Treat the context window as scarce. Locate before reading — search to find the
43
43
  relevant lines, then read the slice, not the whole file. Summarise long command
@@ -58,26 +58,26 @@ returns only its conclusion. Batch independent reads and commands. After two fai
58
58
  corrections, reset with a sharper prompt rather than piling on more.
59
59
  <!-- LEAN:end -->
60
60
 
61
- ### {{DOCTRINE}} process 4 — {{DOC_PROCESS_4}}
61
+ ### {{DOCTRINE:read-the-docs-first}} Read the Docs First
62
62
  <!-- LEAN:begin -->
63
63
  Before changing a part of the system, read the project's own documentation for it.
64
64
  Most repositories keep this at the root — a `docs/`, `doc/`, `documentation/`, or
65
65
  `wiki/` folder, or the top-level README. Locate the pages that cover what you are
66
66
  about to touch and read those; skim the doc index when orienting to an unfamiliar
67
- repo. Read the relevant pages, not the whole tree ({{DOCTRINE}} process 3). Where the
68
- docs and the inspected code disagree, the code is ground truth ({{LAW}} III): flag the
69
- stale page and fix it in the same change ({{DOCTRINE}} craft 3) rather than follow it
67
+ repo. Read the relevant pages, not the whole tree ({{DOCTRINE:context-economy}}). Where the
68
+ docs and the inspected code disagree, the code is ground truth ({{LAW:verify-before-asserting}}): flag the
69
+ stale page and fix it in the same change ({{DOCTRINE:documentation-in-step}}) rather than follow it
70
70
  into error. Code shaped without its documented intent repeats the mistakes the
71
71
  documentation exists to prevent. This is the read-before counterpart to
72
- {{DOCTRINE}} craft 3's write-after.
72
+ {{DOCTRINE:documentation-in-step}}'s write-after.
73
73
  <!-- LEAN:else -->
74
74
  Before changing part of the system, read the project's own documentation — `docs/`,
75
75
  `doc/`, `documentation/`, `wiki/`, or the README. Read the pages covering your change, not
76
- the whole tree. Where docs and code disagree, the code is ground truth ({{LAW}} III): flag
77
- the stale page and fix it in the same change ({{DOCTRINE}} craft 3).
76
+ the whole tree. Where docs and code disagree, the code is ground truth ({{LAW:verify-before-asserting}}): flag
77
+ the stale page and fix it in the same change ({{DOCTRINE:documentation-in-step}}).
78
78
  <!-- LEAN:end -->
79
79
 
80
- ### {{DOCTRINE}} process 5 — {{DOC_PROCESS_5}}
80
+ ### {{DOCTRINE:consent-before-push}} Consent Before Push
81
81
  <!-- LEAN:begin -->
82
82
  Recording and sharing code is consented, never unilateral. **Every** `git commit`
83
83
  and `git push` needs the user's **explicit acceptance**, on every branch, every
@@ -106,7 +106,7 @@ take the same gate. Never force-push, hard-reset, or rebase one: undo with a rev
106
106
  (git-rescue {{SKILL}} for a legitimate rewrite). The host gates both at the tool boundary.
107
107
  <!-- LEAN:end -->
108
108
 
109
- ### {{DOCTRINE}} process 6 — {{DOC_PROCESS_6}}
109
+ ### {{DOCTRINE:bound-the-loop}} Bound the Loop
110
110
  <!-- LEAN:begin -->
111
111
  Every autonomous loop needs an exit you set before you enter it. Before iterating —
112
112
  retrying, searching, generating-and-checking — fix the bounds: a cap on attempts, a
@@ -116,7 +116,7 @@ call, hitting the same error, or trying variations of one approach with no new
116
116
  information, that is not persistence, it is thrashing — break out, change strategy,
117
117
  gather different context, or stop. When a bound is reached or progress stalls, do
118
118
  not grind on: halt and hand back a structured summary of what was tried, what was
119
- learned, and what remains ({{LAW}} V, {{DOCTRINE}} process 2). {{DOCTRINE}} process 3
119
+ learned, and what remains ({{LAW:surface-failures}}, {{DOCTRINE:plan-before-acting}}). {{DOCTRINE:context-economy}}
120
120
  economises *within* a step; this bounds the *number* of steps. An agent that cannot
121
121
  stop itself is a cost without a limit.
122
122
  <!-- LEAN:else -->
@@ -124,11 +124,11 @@ Fix an autonomous loop's bounds before you enter it: an attempt cap, a time or t
124
124
  budget, an explicit definition of success *and* failure. Watch for the loop that has
125
125
  stopped progressing: the same call, the same error, variations with no new information are
126
126
  thrashing; break out, change strategy, or stop. When a bound is reached or progress
127
- stalls, halt with a structured summary of what was tried, learned, and remains ({{LAW}} V,
128
- {{DOCTRINE}} process 2).
127
+ stalls, halt with a structured summary of what was tried, learned, and remains ({{LAW:surface-failures}},
128
+ {{DOCTRINE:plan-before-acting}}).
129
129
  <!-- LEAN:end -->
130
130
 
131
- ### {{DOCTRINE}} process 7 — {{DOC_PROCESS_7}}
131
+ ### {{DOCTRINE:one-writer-per-file}} One Writer Per File
132
132
  <!-- LEAN:begin -->
133
133
  When several {{AGENTS}} work on the same code — sub-{{AGENTS}}, a pipeline crew, a
134
134
  workflow fan-out, another session or tool in this checkout — each file has one writer at
@@ -1,24 +1,24 @@
1
1
  **{{PACK_RIGOR}}** — how work is proven.
2
2
 
3
- ### {{DOCTRINE}} rigor 1 — {{DOC_RIGOR_1}}
3
+ ### {{DOCTRINE:idempotent-by-default}} Idempotent by Default
4
4
  <!-- LEAN:begin -->
5
5
  Make actions safe to run twice. Where you can, design each operation so a second run
6
6
  lands the same end state as the first — create-if-absent rather than create-blindly,
7
7
  detect-and-skip work already done, guard against the double effect. Retries,
8
- interrupted re-runs, and a resumed session ({{DOCTRINE}} process 2) are not exceptions
8
+ interrupted re-runs, and a resumed session ({{DOCTRINE:plan-before-acting}}) are not exceptions
9
9
  but the normal life of an agent that can lose its context mid-task; an idempotent step
10
10
  turns each from a hazard into a no-op. Some acts *cannot* be idempotent — an append, an
11
11
  increment, a payment, a send — and those are precisely the ones to guard, confirm
12
- ({{LAW}} IV), and never fire blindly on a retry. A step you can safely repeat is a
12
+ ({{LAW:deletion-is-deliberate}}), and never fire blindly on a retry. A step you can safely repeat is a
13
13
  step you can safely recover.
14
14
  <!-- LEAN:else -->
15
15
  Design each operation so a second run lands the same end state: create-if-absent rather
16
16
  than create-blindly, detect-and-skip work already done, guard against the double effect.
17
17
  Acts that cannot be idempotent — append, increment, payment, send — are the ones to guard,
18
- confirm ({{LAW}} IV), and never fire blindly on a retry.
18
+ confirm ({{LAW:deletion-is-deliberate}}), and never fire blindly on a retry.
19
19
  <!-- LEAN:end -->
20
20
 
21
- ### {{DOCTRINE}} rigor 2 — {{DOC_RIGOR_2}}
21
+ ### {{DOCTRINE:honest-tests}} Honest Tests
22
22
  <!-- LEAN:begin -->
23
23
  A test that lies is worse than no test, because it is trusted. Assert on observable
24
24
  behaviour — the inputs, outputs, and effects a caller can see — not on private
@@ -27,7 +27,7 @@ breaks on improvement and passes through regression. And make tests deterministi
27
27
  pin the clock, seed or inject randomness, fix ordering, and stub the network and
28
28
  shared state so the same code always returns the same verdict. A flaky test is a
29
29
  verification that lies intermittently, and it corrodes trust in the whole suite
30
- ({{LAW}} III). Genuine end-to-end tests that exercise a real service are exempt from
30
+ ({{LAW:verify-before-asserting}}). Genuine end-to-end tests that exercise a real service are exempt from
31
31
  the no-network rule — but isolate them, name them as such, and keep them out of the
32
32
  deterministic unit layer.
33
33
  <!-- LEAN:else -->
@@ -35,32 +35,32 @@ Assert on observable behaviour — inputs, outputs, effects a caller can see —
35
35
  internals a correct refactoring will change. Make tests deterministic: pin the clock, seed
36
36
  randomness, fix ordering, stub the network and shared state. Genuine end-to-end tests are
37
37
  exempt from the no-network rule — isolate them, name them as such, and keep them out of the
38
- deterministic unit layer ({{LAW}} III).
38
+ deterministic unit layer ({{LAW:verify-before-asserting}}).
39
39
  <!-- LEAN:end -->
40
40
 
41
- ### {{DOCTRINE}} rigor 3 — {{DOC_RIGOR_3}}
41
+ ### {{DOCTRINE:cover-and-verify}} Cover and Verify
42
42
  <!-- LEAN:begin -->
43
43
  Code you author is not done until its behaviour is covered by a test you wrote
44
44
  and the affected tests run green. New behaviour ships with the test that pins it,
45
45
  a bug fix with the test that reproduces it first (the develop {{SKILL}} drives this).
46
46
  After each change run the tests that change could affect — the ones you touched,
47
- not the whole suite ({{DOCTRINE}} process 3) — and read the output before moving on.
48
- Verify against the project's real runner and show the result as evidence ({{LAW}} III);
49
- assert on observable behaviour, deterministically ({{DOCTRINE}} rigor 2). Where the
47
+ not the whole suite ({{DOCTRINE:context-economy}}) — and read the output before moving on.
48
+ Verify against the project's real runner and show the result as evidence ({{LAW:verify-before-asserting}});
49
+ assert on observable behaviour, deterministically ({{DOCTRINE:honest-tests}}). Where the
50
50
  project has no suite or the change is genuinely untestable — a doc, a constant, a
51
51
  config — say so rather than invent a test; where a real test is out of scope, name
52
- the gap and stop rather than ship untested behaviour in silence ({{LAW}} II,
53
- {{LAW}} VIII).
52
+ the gap and stop rather than ship untested behaviour in silence ({{LAW:one-intent-one-act}},
53
+ {{LAW:cure-the-cause}}).
54
54
  <!-- LEAN:else -->
55
55
  Code is not done until its behaviour is covered by a test you wrote and the affected tests
56
56
  run green. New behaviour ships with its test, a bug fix with the reproducing test first
57
57
  (run the develop {{SKILL}}). Run them on the real runner, read the output, show it as
58
- evidence ({{LAW}} III). Where the change is untestable, say so and name the gap rather than
58
+ evidence ({{LAW:verify-before-asserting}}). Where the change is untestable, say so and name the gap rather than
59
59
  invent a test; where a real test is out of scope, stop rather than ship untested behaviour in
60
- silence ({{LAW}} II, {{LAW}} VIII).
60
+ silence ({{LAW:one-intent-one-act}}, {{LAW:cure-the-cause}}).
61
61
  <!-- LEAN:end -->
62
62
 
63
- ### {{DOCTRINE}} rigor 4 — {{DOC_RIGOR_4}}
63
+ ### {{DOCTRINE:prove-the-gate}} Prove the Gate
64
64
  <!-- LEAN:begin -->
65
65
  Prove the gate: perturb what it guards and require it to turn red, because a check
66
66
  that has never failed has never been shown to hold anything. When the perturbation
@@ -73,8 +73,8 @@ ever run in a single place has proven only that place. A gate must never hold it
73
73
  copy of what it measures: the copy drifts beside the source and falls quiet in the
74
74
  hour it is needed, so read the reference at the moment of checking. Where a rule binds
75
75
  in two directions, the gate must be able to fail in both, or it is satisfied by excess.
76
- Where {{DOCTRINE}} rigor 3 has you write the test, this governs whether the test is
77
- worth trusting ({{DOCTRINE}} rigor 2).
76
+ Where {{DOCTRINE:cover-and-verify}} has you write the test, this governs whether the test is
77
+ worth trusting ({{DOCTRINE:honest-tests}}).
78
78
  <!-- LEAN:else -->
79
79
  Prove the gate: perturb what it guards and require red. If it does not redden, suspect the
80
80
  fixture: an impoverished one leaves branches unreachable, assertions vacuous. Two
@@ -83,7 +83,7 @@ environment. A gate must never hold its own copy of what it measures: read the r
83
83
  when checking. A two-direction rule needs a gate that can fail both ways.
84
84
  <!-- LEAN:end -->
85
85
 
86
- ### {{DOCTRINE}} rigor 5 — {{DOC_RIGOR_5}}
86
+ ### {{DOCTRINE:external-gate}} External Gate
87
87
  <!-- LEAN:begin -->
88
88
  A gate you build stands outside the mind it governs. Wherever a system lets an
89
89
  agent — this one or another — act on the world, approval is asked of a party the
@@ -93,13 +93,13 @@ Permission must never live in the governed agent's own prompt or judgement. Anyt
93
93
  gaining autonomous control over physical state, money, or production ships disarmed,
94
94
  armed only by explicit human act. A rule in a prompt is a request; a rule at a
95
95
  boundary is a constraint — and only the second holds when the model is wrong,
96
- confused, or steered by untrusted input ({{LAW}} VI). Where {{LAW}} VII governs the
97
- power you take, this governs the power you hand out; {{DOCTRINE}} rigor 4 proves the
96
+ confused, or steered by untrusted input ({{LAW:data-not-orders}}). Where {{LAW:least-privilege}} governs the
97
+ power you take, this governs the power you hand out; {{DOCTRINE:prove-the-gate}} proves the
98
98
  gate once it stands.
99
99
  <!-- LEAN:else -->
100
100
  Wherever a system lets an agent act, ask approval of a party it cannot satisfy alone,
101
101
  enforce the allowlist at the boundary the call must cross, and validate against real state.
102
102
  Never let permission live in the governed agent's own prompt. Ship anything taking
103
103
  autonomous control of physical state, money, or production disarmed, armed only by explicit
104
- human act ({{LAW}} VI).
104
+ human act ({{LAW:data-not-orders}}).
105
105
  <!-- LEAN:end -->