geneseed 2.0.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 (196) hide show
  1. package/CHANGELOG.md +217 -5
  2. package/DESIGN.md +149 -1326
  3. package/QUICKSTART.md +1 -1
  4. package/README.md +30 -22
  5. package/SETUP.md +98 -24
  6. package/SHIPPED.md +6 -5
  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/opencode.json +0 -9
  16. package/adapters/opencode/plugins/geneseed-context.js +7 -7
  17. package/adapters/opencode/plugins/geneseed-guard.js +6 -6
  18. package/adapters/opencode/workflows/dispatch.js +1 -1
  19. package/bin/geneseed.mjs +74 -8
  20. package/docs/declined.md +53 -2
  21. package/docs/design-history.md +1290 -0
  22. package/docs/extending.md +672 -0
  23. package/docs/limits.md +141 -82
  24. package/docs/token-footprint.md +15 -4
  25. package/docs/web/agents.md +1 -1
  26. package/docs/web/authoring.md +1 -1
  27. package/docs/web/claude-hooks.md +2 -2
  28. package/docs/web/collaboration.md +3 -3
  29. package/docs/web/first-session.md +2 -2
  30. package/docs/web/footprint.md +14 -7
  31. package/docs/web/foreman-mode.md +2 -2
  32. package/docs/web/harnesses.md +5 -3
  33. package/docs/web/install-quick.md +1 -1
  34. package/docs/web/model.md +3 -3
  35. package/docs/web/plugin-context.md +2 -2
  36. package/docs/web/plugin-guard.md +3 -3
  37. package/docs/web/plugin-ponytail.md +1 -1
  38. package/docs/web/rules.md +23 -3
  39. package/docs/web/setup-choices.md +20 -7
  40. package/docs/web/themes-author.md +13 -1
  41. package/docs/web-ui.md +36 -12
  42. package/geneseed +0 -0
  43. package/harness.config.json +1 -1
  44. package/js/catalog.mjs +29 -4
  45. package/js/checkout.mjs +24 -1
  46. package/js/cli-table.json +9 -7
  47. package/js/diff.mjs +8 -3
  48. package/js/doctor.mjs +374 -26
  49. package/js/emit.mjs +48 -11
  50. package/js/generate.mjs +39 -5
  51. package/js/hooks.mjs +8 -7
  52. package/js/installs.mjs +101 -4
  53. package/js/inventory.mjs +150 -20
  54. package/js/lib/fs.mjs +6 -2
  55. package/js/mcp.mjs +3 -15
  56. package/js/migrate.mjs +10 -4
  57. package/js/render.mjs +116 -11
  58. package/js/settings.mjs +297 -28
  59. package/js/setup.mjs +95 -5
  60. package/js/status.mjs +45 -4
  61. package/js/themes.mjs +1 -1
  62. package/js/tui.mjs +46 -3
  63. package/js/uninstall.mjs +30 -11
  64. package/js/web/actions.mjs +76 -9
  65. package/js/web/api.mjs +95 -16
  66. package/js/web/docs.mjs +33 -5
  67. package/js/web/jobs.mjs +12 -3
  68. package/js/web/server.mjs +59 -2
  69. package/package.json +1 -1
  70. package/src/AGENT.md.tmpl +75 -65
  71. package/src/agents/_template.md +4 -4
  72. package/src/agents/advocate.md +4 -4
  73. package/src/agents/architect.md +2 -2
  74. package/src/agents/developer.md +5 -5
  75. package/src/agents/docs.md +2 -2
  76. package/src/agents/empiricist.md +3 -3
  77. package/src/agents/explorer.md +3 -3
  78. package/src/agents/framer.md +3 -3
  79. package/src/agents/historian.md +3 -3
  80. package/src/agents/operator.md +3 -3
  81. package/src/agents/pragmatist.md +3 -3
  82. package/src/agents/reviewer.md +2 -2
  83. package/src/agents/security.md +2 -2
  84. package/src/agents/skeptic.md +4 -4
  85. package/src/agents/steward.md +3 -3
  86. package/src/agents/tester.md +2 -2
  87. package/src/agents/user-advocate.md +3 -3
  88. package/src/agents/visionary.md +3 -3
  89. package/src/doctrines/README.md +41 -0
  90. package/src/doctrines/craft.md +51 -0
  91. package/src/doctrines/ops.md +61 -0
  92. package/src/doctrines/process.md +87 -0
  93. package/src/doctrines/rigor.md +52 -0
  94. package/src/laws/universal.md +17 -301
  95. package/src/memory/README.md +2 -2
  96. package/src/modes/README.md +2 -2
  97. package/src/modes/foreman.md +1 -1
  98. package/src/notebook/README.md +2 -2
  99. package/src/ontology/universal.md +89 -0
  100. package/src/postures/README.md +3 -3
  101. package/src/postures/artisan.md +3 -3
  102. package/src/postures/assistant.md +1 -1
  103. package/src/postures/expert.md +1 -1
  104. package/src/postures/mentor.md +1 -1
  105. package/src/postures/peer.md +2 -2
  106. package/src/skills/_template.md +2 -2
  107. package/src/skills/brainstorm.md +2 -2
  108. package/src/skills/clarify.md +2 -2
  109. package/src/skills/codebase-design.md +1 -1
  110. package/src/skills/commit.md +5 -5
  111. package/src/skills/council.md +4 -4
  112. package/src/skills/crash-course.md +1 -1
  113. package/src/skills/daydream/SKILL.md +1 -1
  114. package/src/skills/debug.md +2 -2
  115. package/src/skills/decode.md +1 -1
  116. package/src/skills/develop.md +6 -6
  117. package/src/skills/document-project.md +4 -4
  118. package/src/skills/domain-modeling.md +1 -1
  119. package/src/skills/drill.md +1 -1
  120. package/src/skills/feynman.md +1 -1
  121. package/src/skills/forge-mcp.md +3 -3
  122. package/src/skills/fresh-eyes.md +4 -4
  123. package/src/skills/frontend-design.md +1 -1
  124. package/src/skills/gap-detector.md +1 -1
  125. package/src/skills/geneseed-code-review.md +1 -1
  126. package/src/skills/geneseed.md +4 -4
  127. package/src/skills/git-archaeology.md +1 -1
  128. package/src/skills/git-rescue.md +3 -3
  129. package/src/skills/handoff.md +4 -4
  130. package/src/skills/herdr.md +1 -1
  131. package/src/skills/ingest.md +3 -3
  132. package/src/skills/learning-path.md +1 -1
  133. package/src/skills/migrate.md +5 -5
  134. package/src/skills/opencode-theme.md +1 -1
  135. package/src/skills/parallel-agents.md +2 -2
  136. package/src/skills/pipeline.md +2 -2
  137. package/src/skills/plan.md +2 -2
  138. package/src/skills/ponytail.md +1 -1
  139. package/src/skills/profile.md +1 -1
  140. package/src/skills/prose.md +2 -2
  141. package/src/skills/prototype.md +2 -2
  142. package/src/skills/refactor.md +2 -2
  143. package/src/skills/release.md +4 -4
  144. package/src/skills/repo-map.md +5 -5
  145. package/src/skills/research.md +6 -6
  146. package/src/skills/review-response.md +3 -3
  147. package/src/skills/roast-me.md +1 -1
  148. package/src/skills/rule.md +5 -5
  149. package/src/skills/ship.md +3 -3
  150. package/src/skills/tdd.md +2 -2
  151. package/src/skills/tickets.md +1 -1
  152. package/src/skills/wayfinder.md +1 -1
  153. package/src/skills/wiki.md +4 -4
  154. package/src/skills/workflow.md +2 -2
  155. package/themes/README.md +17 -7
  156. package/themes/_TEMPLATE.json +37 -33
  157. package/themes/biker.json +37 -33
  158. package/themes/commentator.json +37 -33
  159. package/themes/cyberpunk.json +37 -33
  160. package/themes/gamer.json +37 -33
  161. package/themes/imperial.json +37 -33
  162. package/themes/joker.json +37 -33
  163. package/themes/marvin.json +37 -33
  164. package/themes/mean.json +37 -33
  165. package/themes/military.json +37 -33
  166. package/themes/neutral.json +37 -33
  167. package/themes/pirate.json +37 -33
  168. package/themes/sports.json +37 -33
  169. package/themes/verstappen.json +37 -33
  170. package/themes/wizard.json +37 -33
  171. package/web/dist/assets/{About-DX1-VTBP.js → About-C0Mk0igT.js} +1 -1
  172. package/web/dist/assets/{Activity-Dp9NaXOn.js → Activity-C4aJJVXz.js} +1 -1
  173. package/web/dist/assets/{ActivityDetail-HpOBtrXS.js → ActivityDetail-DaQ85za0.js} +1 -1
  174. package/web/dist/assets/{Diff-Ct4G3Se8.js → Diff-B3tlO2Yj.js} +1 -1
  175. package/web/dist/assets/{Doctor-DGjkZFuA.js → Doctor-BNC-5Dmo.js} +1 -1
  176. package/web/dist/assets/{Graph-b8o-S6kv.js → Graph-us0T6ZcV.js} +1 -1
  177. package/web/dist/assets/Harnesses-DAMgyfM_.js +1 -0
  178. package/web/dist/assets/Laws-rOxegJ75.js +1 -0
  179. package/web/dist/assets/{Library-BEZscyaQ.js → Library-KmwrHA1J.js} +1 -1
  180. package/web/dist/assets/{Markdown-k_LSLBGq.js → Markdown-0eQOVGSF.js} +1 -1
  181. package/web/dist/assets/{Profile-DydukTxP.js → Profile-ZU7WV6Xl.js} +1 -1
  182. package/web/dist/assets/{Rules-CIRG4Ldt.js → Rules-CtDoPhhf.js} +1 -1
  183. package/web/dist/assets/{Skills-Buoi1IBr.js → Skills-BhoOxdkD.js} +1 -1
  184. package/web/dist/assets/{StatusBadge-CE_AJttl.js → StatusBadge-CGvYVCwa.js} +1 -1
  185. package/web/dist/assets/{Themes-CI4o3gJC.js → Themes-Dr7OOkD7.js} +1 -1
  186. package/web/dist/assets/{activity-BCW7e6Cy.js → activity-B8aq3qtl.js} +1 -1
  187. package/web/dist/assets/index-2wqPDxuN.css +1 -0
  188. package/web/dist/assets/{index-B1PIx7RM.js → index-AhMzkdbI.js} +1 -1
  189. package/web/dist/assets/index-CRftEtBX.js +12 -0
  190. package/web/dist/assets/{index-Ck2iCdaC.js → index-D0lPN_qW.js} +1 -1
  191. package/web/dist/index.html +2 -2
  192. package/web/src/pages/Laws.jsx +282 -88
  193. package/web/dist/assets/Harnesses-gr3-aHBF.js +0 -1
  194. package/web/dist/assets/Laws-DTwF5tTC.js +0 -1
  195. package/web/dist/assets/index-BnTQUSUz.js +0 -12
  196. package/web/dist/assets/index-DUCsDv7z.css +0 -1
package/CHANGELOG.md CHANGED
@@ -6,9 +6,170 @@ 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
- ## [Unreleased]
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.
10
83
 
11
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
+
117
+ ## [2.1.0] — 2026-08-19
118
+
119
+ ### Added
120
+ - **Law XXXVIII — Prove the Gate.** A 38th universal law, in the verification class:
121
+ perturb what a check guards and require it to turn red, because one that has never
122
+ failed has never been shown to hold anything. It carries the four ways a green gate
123
+ lies — an impoverished fixture that leaves branches unreachable, two implementations
124
+ agreeing on what both get wrong, a gate that has only ever run in one environment,
125
+ and a gate holding its own drifting copy of what it measures — and the rule that a
126
+ two-directional constraint needs a gate able to fail in both directions. Sits beside
127
+ Law XXVII (honest tests) and Law XXXV (cover and verify): those say write the test,
128
+ this says prove the test is worth trusting.
129
+ - **Laws XXXIX and XL — Shape the Answer, Codes That Persist.** Two communication laws,
130
+ taking the count to 40. XXXIX governs order, repetition and scale: close on the
131
+ conclusion, state each fact once, and match the reply's length to the size of the task
132
+ — where Law VIII strips filler, this orders what is left. XL gives every tracked item
133
+ a short reference code (`D` decisions, `O` options, `F` findings, `R` risks, `Q`
134
+ questions, `A` actions) and forbids renumbering one once issued: the user will cite it
135
+ back, and a moved code makes their reply mean something they did not say.
136
+ - **An `Open folder` button beside every MCP config path, because a preset hands you a blank
137
+ token field and no idea which file it goes in.** The Harnesses screen already printed the
138
+ path above each target's server rows; it could not take you there. The button asks the
139
+ machine running the daemon to open the containing folder — `explorer` / `open` /
140
+ `xdg-open`, reusing the same opener `geneseed web` uses for the browser, so it is not a new
141
+ process the harness learns to start.
142
+
143
+ It opens the **folder, not the file**: handing a `.json` to the OS opens whatever claims
144
+ that extension, which on a stock Windows box is a browser — a read-only view of the exact
145
+ file you are trying to edit. The filename is already on screen beside the button.
146
+ The note names the directory rather than claiming a window appeared, because a headless
147
+ host has no opener and the server swallows that failure by design.
148
+
149
+ **The allowlist is the whole security of the endpoint**, and it is now literally the same
150
+ function the toggle uses (`mcpTargetPaths()`) rather than a second copy — a path the server
151
+ did not itself list is a 404 before anything opens. On Windows the opener interpolates into
152
+ a `cmd` command line, so the exact-match lookup is also what bounds the strings that can
153
+ reach a shell to the ones the machine's own install registry produced.
154
+
155
+ `/api/reveal` is **the first route that never existed on the Python reference**, which the
156
+ route-partition test asserted set-equality against. `REF_POST` is a *record* of what the
157
+ reference answered, so widening it would have forged the record; instead the partition
158
+ gained a sixth part, `POST_BEYOND_REF`, plus a gate that no reference route may hide inside
159
+ it. Both claims stay checkable: the reference's surface is still pinned exactly, and
160
+ everything past it has to be enumerated rather than merely appear.
161
+
162
+ `web/dist` **is** rebuilt here, so the button is live. It was held back while the corpus
163
+ still recorded `index.html` verbatim, Vite's content-hashed asset names included: a rebuild
164
+ would have retired the four `static/` cells (8 recordings) with no recorder left to re-bless
165
+ them. The branch this one waited on retired that corpus outright, so the cost it was saving
166
+ no longer exists and the rebuild is free.
167
+ What did *not* wait: `static/a-path-climbing-out-of-dist-falls-back-to-index` was the only
168
+ one of those four with no unit twin, and it is the only one that is a security claim rather
169
+ than a caching claim, so it now has one — stronger than the cell, which asked for
170
+ `/../../build.py` and asserted the body held no `argparse`, a file P4 deleted, making both
171
+ absences free. The twin probes a file that is really there, five traversal spellings deep,
172
+ and says so before trusting the absence.
12
173
  - **`npx geneseed setup` is now the way in, and the README says exactly where that stops
13
174
  being true.** The install docs assume npm first: one command, no clone, no Python, on
14
175
  macOS, Linux and Windows alike. **All 25 commands** run from Node, along with all
@@ -75,6 +236,51 @@ label. For the capability ↔ spec map, see [SHIPPED.md](SHIPPED.md).
75
236
  you the wizard, this is why.
76
237
 
77
238
  ### Removed
239
+ - **The recorded emit, cli and web corpora are retired — 1381 cells, and the two replayers that
240
+ existed only to drive them.** They were produced by the Python implementation this project
241
+ deleted, and by nothing else: no program that could write a cell survives, so a red cell could
242
+ never be re-blessed and never be re-recorded. The effect was a gate that turned red on every
243
+ deliberate content change — an emitted sentence, a reworded refusal, a version bump — while
244
+ saying nothing at all about a defect that happened to be stable on the day the recording was
245
+ taken. The 2.0 bump had already shown it: one label moving reddened 224 of 259 emit cells and
246
+ not one of them was a defect.
247
+ **The deletion was licensed by a measurement, not by the redness.** `tests/mutate.mjs` names,
248
+ per row, the gate that must kill each of its 31 planted mutations. Five declared a corpus replay
249
+ and nothing else; all five are killed by `tests/unit/` alone, the control included. For every
250
+ defect the matrix knows how to plant, the corpus was redundant.
251
+ **What it cost, stated rather than glossed:** byte-level regression detection on emit, cli and
252
+ web output. Nothing now notices a rendered bundle, a verb's stdout/stderr/exit code, or an HTTP
253
+ response body moving by one byte for a reason nobody intended. **What still runs on every
254
+ commit, on Linux and Windows both:** `golden.mjs --idempotent` and `--deletion` (a run against
255
+ another run of the same generator — determinism, not regression), `doctor --all`, and the unit
256
+ suite. The tag **`python-reference-v1.0.0`** is kept as the historical pointer: the second
257
+ implementation and every cell it recorded still live there, and nowhere else.
258
+ `docs/limits.md` carries the full argument, the rows it weakened, and the two pieces of frozen
259
+ residue it freed.
260
+ - **The `gitlab-2` MCP preset is gone; the pattern it taught is not.** It was a
261
+ byte-for-byte copy of the `gitlab` preset under a different `GITLAB_API_URL`, so the MCP
262
+ screen carried two rows to teach one thing SETUP.md already teaches in prose: a second
263
+ GitLab instance is a hand-copied block with its own URL and its own token. The `gitlab`
264
+ preset's description now says so, and SETUP.md gained the step people actually get stuck
265
+ on — *where does this file live* — naming both places that already answer it: the config
266
+ path the web console prints above each target's server rows, and `geneseed mcp`, which
267
+ prints the same paths from the terminal without starting anything.
268
+ Anyone who already wired a `gitlab-2` keeps it: the listing is a union of
269
+ the shipped presets and whatever is in your config, so it still appears, now marked as
270
+ yours rather than as a preset.
271
+
272
+ **What it cost the recordings, and why that no longer needs stating separately.** The
273
+ preset listing was recorded verbatim in the web corpus, and the reference that produced
274
+ those bytes was deleted in P4 — no recorder survived, so a moved listing could only be
275
+ retired: five cells × two platforms, **10 recordings**. That accounting is now subsumed by
276
+ the entry above, which retires the whole web corpus for the same underlying reason.
277
+ What matters is what replaced them, and it outlives both: three of the five already had
278
+ absolute twins in `tests/unit/web_api.test.mjs`, and the other two were **written first**
279
+ (`the MCP toggle refuses a commented jsonc and does not rewrite a byte`, `a user-defined
280
+ server joins the presets in the listing and keeps its own state`), each mutation-checked
281
+ against the guard it covers. The coverage is stronger than what it replaced: a corpus cell
282
+ proved two implementations agreed, which is silent on whether either was right; these state
283
+ what the endpoint must do.
78
284
  - **`upgrade.sh` and `sync-self.sh` are gone.** Each was a few lines of bash that found a
79
285
  Python interpreter and then ran `rituals/harness.py upgrade` (or `sync-self`) — the same
80
286
  command every launcher already runs, on every OS, and one that native Windows could never
@@ -792,11 +998,12 @@ label. For the capability ↔ spec map, see [SHIPPED.md](SHIPPED.md).
792
998
  These join `learning-path`, `gap-detector`, and `feynman`, bringing the
793
999
  skill count to 33.
794
1000
 
795
- ## [2.0.0] — not yet published
1001
+ ## [2.0.0] — 2026-08-17
796
1002
 
797
- *Nothing described here has been published to any registry: there is no tag, no release and no
798
- install URL. `harness.config.json` and `package.json` both read `2.0.0`, which is the version this
799
- build stamps into every bundle it emits — it is not evidence that anything was shipped.*
1003
+ *Published to npm as `geneseed@2.0.0` on 2026-08-17, by hand — npm's trusted-publisher screen
1004
+ needs a package that already exists, so the first release could not come from the workflow that
1005
+ gates every one after it. `harness.config.json` and `package.json` both read `2.0.0`, which is
1006
+ also the version this build stamps into every bundle it emits.*
800
1007
 
801
1008
  *⚠ The bump itself was the last thing this release found. Moving the label reddened 224 of 259
802
1009
  recorded emit cells, because the configured version is stamped into two places and only one of them
@@ -857,6 +1064,11 @@ and the replayers refuse to record — so a change that moves a recorded byte is
857
1064
  than a step. `docs/limits.md` is the standing list of what that costs, row by row, including
858
1065
  four strings that are known to be wrong and are now permanently unfixable.
859
1066
 
1067
+ *⚠ Superseded before publication. The emit, cli and web corpora were retired on 2026-08-17 for
1068
+ exactly the reason this section admits — see 2.1.0 → Removed. The paragraph above stands as
1069
+ the record of what was believed at the time; what this release guarantees is the shorter list
1070
+ there.*
1071
+
860
1072
  ### Removed
861
1073
 
862
1074
  - **The second implementation.** 85 Python files, and with them the full-screen curses panel