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.
- package/CHANGELOG.md +109 -5
- package/DESIGN.md +54 -1282
- package/README.md +8 -10
- package/SETUP.md +15 -7
- package/SHIPPED.md +3 -3
- package/adapters/opencode/opencode.json +0 -9
- package/bin/geneseed.mjs +2 -2
- package/docs/declined.md +53 -2
- package/docs/design-history.md +1290 -0
- package/docs/extending.md +563 -0
- package/docs/limits.md +141 -82
- package/docs/web/agents.md +1 -1
- package/docs/web/rules.md +1 -1
- package/geneseed +0 -0
- package/harness.config.json +1 -1
- package/js/cli-table.json +1 -1
- package/js/doctor.mjs +67 -22
- package/js/inventory.mjs +2 -1
- package/js/lib/fs.mjs +6 -2
- package/js/mcp.mjs +3 -15
- package/js/render.mjs +6 -4
- package/js/settings.mjs +79 -1
- package/js/themes.mjs +1 -1
- package/js/tui.mjs +2 -2
- package/js/uninstall.mjs +5 -5
- package/js/web/actions.mjs +20 -4
- package/js/web/server.mjs +53 -2
- package/package.json +1 -1
- package/src/laws/universal.md +35 -0
- package/themes/_TEMPLATE.json +3 -0
- package/themes/biker.json +3 -0
- package/themes/commentator.json +3 -0
- package/themes/cyberpunk.json +3 -0
- package/themes/gamer.json +3 -0
- package/themes/imperial.json +3 -0
- package/themes/joker.json +3 -0
- package/themes/marvin.json +3 -0
- package/themes/mean.json +3 -0
- package/themes/military.json +3 -0
- package/themes/neutral.json +3 -0
- package/themes/pirate.json +3 -0
- package/themes/sports.json +3 -0
- package/themes/verstappen.json +3 -0
- package/themes/wizard.json +3 -0
- package/web/dist/assets/{About-DX1-VTBP.js → About-BYXlmbyo.js} +1 -1
- package/web/dist/assets/{Activity-Dp9NaXOn.js → Activity-us5MPf4u.js} +1 -1
- package/web/dist/assets/{ActivityDetail-HpOBtrXS.js → ActivityDetail-CiaQXUk2.js} +1 -1
- package/web/dist/assets/{Diff-Ct4G3Se8.js → Diff-Bh0qbZ2s.js} +1 -1
- package/web/dist/assets/{Doctor-DGjkZFuA.js → Doctor-BIlQME45.js} +1 -1
- package/web/dist/assets/{Graph-b8o-S6kv.js → Graph-4dYD1dPG.js} +1 -1
- package/web/dist/assets/Harnesses-PzYZ3LOC.js +1 -0
- package/web/dist/assets/Laws-DtZweXal.js +1 -0
- package/web/dist/assets/{Library-BEZscyaQ.js → Library-CjMbksJW.js} +1 -1
- package/web/dist/assets/{Markdown-k_LSLBGq.js → Markdown-Bk81c3aZ.js} +1 -1
- package/web/dist/assets/{Profile-DydukTxP.js → Profile-Curui_-j.js} +1 -1
- package/web/dist/assets/{Rules-CIRG4Ldt.js → Rules-Bm283wdv.js} +1 -1
- package/web/dist/assets/{Skills-Buoi1IBr.js → Skills-gruqYuhl.js} +1 -1
- package/web/dist/assets/{StatusBadge-CE_AJttl.js → StatusBadge-EiM_FPqv.js} +1 -1
- package/web/dist/assets/{Themes-CI4o3gJC.js → Themes-DU99j4Hr.js} +1 -1
- package/web/dist/assets/{activity-BCW7e6Cy.js → activity-0rvQ6Vra.js} +1 -1
- package/web/dist/assets/{index-B1PIx7RM.js → index-0b2hobOo.js} +1 -1
- package/web/dist/assets/index-D5VY3TY_.js +12 -0
- package/web/dist/assets/{index-Ck2iCdaC.js → index-IiGFmCW_.js} +1 -1
- package/web/dist/index.html +1 -1
- package/web/src/pages/Laws.jsx +3 -0
- package/web/dist/assets/Harnesses-gr3-aHBF.js +0 -1
- package/web/dist/assets/Laws-DTwF5tTC.js +0 -1
- 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
|
-
## [
|
|
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] —
|
|
893
|
+
## [2.0.0] — 2026-08-17
|
|
796
894
|
|
|
797
|
-
*
|
|
798
|
-
|
|
799
|
-
|
|
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
|