geneseed 2.0.0 → 2.1.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 (68) hide show
  1. package/CHANGELOG.md +109 -5
  2. package/DESIGN.md +54 -1282
  3. package/README.md +8 -10
  4. package/SETUP.md +15 -7
  5. package/SHIPPED.md +3 -3
  6. package/adapters/opencode/opencode.json +0 -9
  7. package/bin/geneseed.mjs +2 -2
  8. package/docs/declined.md +53 -2
  9. package/docs/design-history.md +1290 -0
  10. package/docs/extending.md +563 -0
  11. package/docs/limits.md +141 -82
  12. package/docs/web/agents.md +1 -1
  13. package/docs/web/rules.md +1 -1
  14. package/geneseed +0 -0
  15. package/harness.config.json +1 -1
  16. package/js/cli-table.json +1 -1
  17. package/js/doctor.mjs +67 -22
  18. package/js/inventory.mjs +2 -1
  19. package/js/lib/fs.mjs +6 -2
  20. package/js/mcp.mjs +3 -15
  21. package/js/render.mjs +6 -4
  22. package/js/settings.mjs +79 -1
  23. package/js/themes.mjs +1 -1
  24. package/js/tui.mjs +2 -2
  25. package/js/uninstall.mjs +5 -5
  26. package/js/web/actions.mjs +20 -4
  27. package/js/web/server.mjs +53 -2
  28. package/package.json +1 -1
  29. package/src/laws/universal.md +35 -0
  30. package/themes/_TEMPLATE.json +3 -0
  31. package/themes/biker.json +3 -0
  32. package/themes/commentator.json +3 -0
  33. package/themes/cyberpunk.json +3 -0
  34. package/themes/gamer.json +3 -0
  35. package/themes/imperial.json +3 -0
  36. package/themes/joker.json +3 -0
  37. package/themes/marvin.json +3 -0
  38. package/themes/mean.json +3 -0
  39. package/themes/military.json +3 -0
  40. package/themes/neutral.json +3 -0
  41. package/themes/pirate.json +3 -0
  42. package/themes/sports.json +3 -0
  43. package/themes/verstappen.json +3 -0
  44. package/themes/wizard.json +3 -0
  45. package/web/dist/assets/{About-DX1-VTBP.js → About-BYXlmbyo.js} +1 -1
  46. package/web/dist/assets/{Activity-Dp9NaXOn.js → Activity-us5MPf4u.js} +1 -1
  47. package/web/dist/assets/{ActivityDetail-HpOBtrXS.js → ActivityDetail-CiaQXUk2.js} +1 -1
  48. package/web/dist/assets/{Diff-Ct4G3Se8.js → Diff-Bh0qbZ2s.js} +1 -1
  49. package/web/dist/assets/{Doctor-DGjkZFuA.js → Doctor-BIlQME45.js} +1 -1
  50. package/web/dist/assets/{Graph-b8o-S6kv.js → Graph-4dYD1dPG.js} +1 -1
  51. package/web/dist/assets/Harnesses-PzYZ3LOC.js +1 -0
  52. package/web/dist/assets/Laws-DtZweXal.js +1 -0
  53. package/web/dist/assets/{Library-BEZscyaQ.js → Library-CjMbksJW.js} +1 -1
  54. package/web/dist/assets/{Markdown-k_LSLBGq.js → Markdown-Bk81c3aZ.js} +1 -1
  55. package/web/dist/assets/{Profile-DydukTxP.js → Profile-Curui_-j.js} +1 -1
  56. package/web/dist/assets/{Rules-CIRG4Ldt.js → Rules-Bm283wdv.js} +1 -1
  57. package/web/dist/assets/{Skills-Buoi1IBr.js → Skills-gruqYuhl.js} +1 -1
  58. package/web/dist/assets/{StatusBadge-CE_AJttl.js → StatusBadge-EiM_FPqv.js} +1 -1
  59. package/web/dist/assets/{Themes-CI4o3gJC.js → Themes-DU99j4Hr.js} +1 -1
  60. package/web/dist/assets/{activity-BCW7e6Cy.js → activity-0rvQ6Vra.js} +1 -1
  61. package/web/dist/assets/{index-B1PIx7RM.js → index-0b2hobOo.js} +1 -1
  62. package/web/dist/assets/index-D5VY3TY_.js +12 -0
  63. package/web/dist/assets/{index-Ck2iCdaC.js → index-IiGFmCW_.js} +1 -1
  64. package/web/dist/index.html +1 -1
  65. package/web/src/pages/Laws.jsx +3 -0
  66. package/web/dist/assets/Harnesses-gr3-aHBF.js +0 -1
  67. package/web/dist/assets/Laws-DTwF5tTC.js +0 -1
  68. package/web/dist/assets/index-BnTQUSUz.js +0 -12
package/CHANGELOG.md CHANGED
@@ -6,9 +6,62 @@ 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
+ ## [2.1.0] — 2026-08-19
10
10
 
11
11
  ### Added
12
+ - **Law XXXVIII — Prove the Gate.** A 38th universal law, in the verification class:
13
+ perturb what a check guards and require it to turn red, because one that has never
14
+ failed has never been shown to hold anything. It carries the four ways a green gate
15
+ lies — an impoverished fixture that leaves branches unreachable, two implementations
16
+ agreeing on what both get wrong, a gate that has only ever run in one environment,
17
+ and a gate holding its own drifting copy of what it measures — and the rule that a
18
+ two-directional constraint needs a gate able to fail in both directions. Sits beside
19
+ Law XXVII (honest tests) and Law XXXV (cover and verify): those say write the test,
20
+ this says prove the test is worth trusting.
21
+ - **Laws XXXIX and XL — Shape the Answer, Codes That Persist.** Two communication laws,
22
+ taking the count to 40. XXXIX governs order, repetition and scale: close on the
23
+ conclusion, state each fact once, and match the reply's length to the size of the task
24
+ — where Law VIII strips filler, this orders what is left. XL gives every tracked item
25
+ a short reference code (`D` decisions, `O` options, `F` findings, `R` risks, `Q`
26
+ questions, `A` actions) and forbids renumbering one once issued: the user will cite it
27
+ back, and a moved code makes their reply mean something they did not say.
28
+ - **An `Open folder` button beside every MCP config path, because a preset hands you a blank
29
+ token field and no idea which file it goes in.** The Harnesses screen already printed the
30
+ path above each target's server rows; it could not take you there. The button asks the
31
+ machine running the daemon to open the containing folder — `explorer` / `open` /
32
+ `xdg-open`, reusing the same opener `geneseed web` uses for the browser, so it is not a new
33
+ process the harness learns to start.
34
+
35
+ It opens the **folder, not the file**: handing a `.json` to the OS opens whatever claims
36
+ that extension, which on a stock Windows box is a browser — a read-only view of the exact
37
+ file you are trying to edit. The filename is already on screen beside the button.
38
+ The note names the directory rather than claiming a window appeared, because a headless
39
+ host has no opener and the server swallows that failure by design.
40
+
41
+ **The allowlist is the whole security of the endpoint**, and it is now literally the same
42
+ function the toggle uses (`mcpTargetPaths()`) rather than a second copy — a path the server
43
+ did not itself list is a 404 before anything opens. On Windows the opener interpolates into
44
+ a `cmd` command line, so the exact-match lookup is also what bounds the strings that can
45
+ reach a shell to the ones the machine's own install registry produced.
46
+
47
+ `/api/reveal` is **the first route that never existed on the Python reference**, which the
48
+ route-partition test asserted set-equality against. `REF_POST` is a *record* of what the
49
+ reference answered, so widening it would have forged the record; instead the partition
50
+ gained a sixth part, `POST_BEYOND_REF`, plus a gate that no reference route may hide inside
51
+ it. Both claims stay checkable: the reference's surface is still pinned exactly, and
52
+ everything past it has to be enumerated rather than merely appear.
53
+
54
+ `web/dist` **is** rebuilt here, so the button is live. It was held back while the corpus
55
+ still recorded `index.html` verbatim, Vite's content-hashed asset names included: a rebuild
56
+ would have retired the four `static/` cells (8 recordings) with no recorder left to re-bless
57
+ them. The branch this one waited on retired that corpus outright, so the cost it was saving
58
+ no longer exists and the rebuild is free.
59
+ What did *not* wait: `static/a-path-climbing-out-of-dist-falls-back-to-index` was the only
60
+ one of those four with no unit twin, and it is the only one that is a security claim rather
61
+ than a caching claim, so it now has one — stronger than the cell, which asked for
62
+ `/../../build.py` and asserted the body held no `argparse`, a file P4 deleted, making both
63
+ absences free. The twin probes a file that is really there, five traversal spellings deep,
64
+ and says so before trusting the absence.
12
65
  - **`npx geneseed setup` is now the way in, and the README says exactly where that stops
13
66
  being true.** The install docs assume npm first: one command, no clone, no Python, on
14
67
  macOS, Linux and Windows alike. **All 25 commands** run from Node, along with all
@@ -75,6 +128,51 @@ label. For the capability ↔ spec map, see [SHIPPED.md](SHIPPED.md).
75
128
  you the wizard, this is why.
76
129
 
77
130
  ### Removed
131
+ - **The recorded emit, cli and web corpora are retired — 1381 cells, and the two replayers that
132
+ existed only to drive them.** They were produced by the Python implementation this project
133
+ deleted, and by nothing else: no program that could write a cell survives, so a red cell could
134
+ never be re-blessed and never be re-recorded. The effect was a gate that turned red on every
135
+ deliberate content change — an emitted sentence, a reworded refusal, a version bump — while
136
+ saying nothing at all about a defect that happened to be stable on the day the recording was
137
+ taken. The 2.0 bump had already shown it: one label moving reddened 224 of 259 emit cells and
138
+ not one of them was a defect.
139
+ **The deletion was licensed by a measurement, not by the redness.** `tests/mutate.mjs` names,
140
+ per row, the gate that must kill each of its 31 planted mutations. Five declared a corpus replay
141
+ and nothing else; all five are killed by `tests/unit/` alone, the control included. For every
142
+ defect the matrix knows how to plant, the corpus was redundant.
143
+ **What it cost, stated rather than glossed:** byte-level regression detection on emit, cli and
144
+ web output. Nothing now notices a rendered bundle, a verb's stdout/stderr/exit code, or an HTTP
145
+ response body moving by one byte for a reason nobody intended. **What still runs on every
146
+ commit, on Linux and Windows both:** `golden.mjs --idempotent` and `--deletion` (a run against
147
+ another run of the same generator — determinism, not regression), `doctor --all`, and the unit
148
+ suite. The tag **`python-reference-v1.0.0`** is kept as the historical pointer: the second
149
+ implementation and every cell it recorded still live there, and nowhere else.
150
+ `docs/limits.md` carries the full argument, the rows it weakened, and the two pieces of frozen
151
+ residue it freed.
152
+ - **The `gitlab-2` MCP preset is gone; the pattern it taught is not.** It was a
153
+ byte-for-byte copy of the `gitlab` preset under a different `GITLAB_API_URL`, so the MCP
154
+ screen carried two rows to teach one thing SETUP.md already teaches in prose: a second
155
+ GitLab instance is a hand-copied block with its own URL and its own token. The `gitlab`
156
+ preset's description now says so, and SETUP.md gained the step people actually get stuck
157
+ on — *where does this file live* — naming both places that already answer it: the config
158
+ path the web console prints above each target's server rows, and `geneseed mcp`, which
159
+ prints the same paths from the terminal without starting anything.
160
+ Anyone who already wired a `gitlab-2` keeps it: the listing is a union of
161
+ the shipped presets and whatever is in your config, so it still appears, now marked as
162
+ yours rather than as a preset.
163
+
164
+ **What it cost the recordings, and why that no longer needs stating separately.** The
165
+ preset listing was recorded verbatim in the web corpus, and the reference that produced
166
+ those bytes was deleted in P4 — no recorder survived, so a moved listing could only be
167
+ retired: five cells × two platforms, **10 recordings**. That accounting is now subsumed by
168
+ the entry above, which retires the whole web corpus for the same underlying reason.
169
+ What matters is what replaced them, and it outlives both: three of the five already had
170
+ absolute twins in `tests/unit/web_api.test.mjs`, and the other two were **written first**
171
+ (`the MCP toggle refuses a commented jsonc and does not rewrite a byte`, `a user-defined
172
+ server joins the presets in the listing and keeps its own state`), each mutation-checked
173
+ against the guard it covers. The coverage is stronger than what it replaced: a corpus cell
174
+ proved two implementations agreed, which is silent on whether either was right; these state
175
+ what the endpoint must do.
78
176
  - **`upgrade.sh` and `sync-self.sh` are gone.** Each was a few lines of bash that found a
79
177
  Python interpreter and then ran `rituals/harness.py upgrade` (or `sync-self`) — the same
80
178
  command every launcher already runs, on every OS, and one that native Windows could never
@@ -792,11 +890,12 @@ label. For the capability ↔ spec map, see [SHIPPED.md](SHIPPED.md).
792
890
  These join `learning-path`, `gap-detector`, and `feynman`, bringing the
793
891
  skill count to 33.
794
892
 
795
- ## [2.0.0] — not yet published
893
+ ## [2.0.0] — 2026-08-17
796
894
 
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.*
895
+ *Published to npm as `geneseed@2.0.0` on 2026-08-17, by hand — npm's trusted-publisher screen
896
+ needs a package that already exists, so the first release could not come from the workflow that
897
+ gates every one after it. `harness.config.json` and `package.json` both read `2.0.0`, which is
898
+ also the version this build stamps into every bundle it emits.*
800
899
 
801
900
  *⚠ The bump itself was the last thing this release found. Moving the label reddened 224 of 259
802
901
  recorded emit cells, because the configured version is stamped into two places and only one of them
@@ -857,6 +956,11 @@ and the replayers refuse to record — so a change that moves a recorded byte is
857
956
  than a step. `docs/limits.md` is the standing list of what that costs, row by row, including
858
957
  four strings that are known to be wrong and are now permanently unfixable.
859
958
 
959
+ *⚠ Superseded before publication. The emit, cli and web corpora were retired on 2026-08-17 for
960
+ exactly the reason this section admits — see 2.1.0 → Removed. The paragraph above stands as
961
+ the record of what was believed at the time; what this release guarantees is the shorter list
962
+ there.*
963
+
860
964
  ### Removed
861
965
 
862
966
  - **The second implementation.** 85 Python files, and with them the full-screen curses panel