test(state): #133 — pin the #107 legacy-name shim (and its fail-closed gate)
All checks were successful
Check / eval (push) Successful in 4m9s

mkFlake prefers state.json and still accepts the legacy theme-state.json,
because a machine only migrates on its next menu write. Nothing evaluated a
checkout carrying ONLY the legacy name, so the shim could rot with every
check green — breaking rebuilds for precisely the users who have not opened
the menu since #107, i.e. the ones least likely to see it coming.

checks.state-legacy-name evaluates two fixtures: legacy-only must resolve,
and no-state-at-all must still throw. The gate is half the shim's contract
(it turns "no state file" into one readable error instead of a readFile
stack from inside the module system) and was equally unpinned.

Cheap by construction: mkFlake wraps its return in `builtins.seq
_themeState`, so forcing the attrset forces the state read and nothing else
— no module system, no home.nix. Hence a one-file fixture and no measurable
cost (flake check still ~35s). That file is a SYMLINK to the shipped
template's state.json: a copy would drift and the check would quietly start
testing a fossil. The fixture also asserts it has no state.json, or it would
pass while testing nothing.

Both assertions proven by breaking lib.nix — deleting the fallback, then
defeating the gate — and watching each fail by name. Delete this check
together with the shim and the nomarchy-theme-sync alias.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-16 14:04:16 +01:00
parent 3cc644edd9
commit a6f86cf575
5 changed files with 67 additions and 12 deletions

View File

@@ -555,6 +555,22 @@ Design/decision records and a running log of shipped work (items marked
`%26`, `%3F`, `%23`, `caf%C3%A9`. **Unverified on purpose:** whether each
vendor's page fills the box or auto-submits — testing that means posting into
Bernardo's own accounts.
- ✓ **The #107 compat shim is pinned (#133, 2026-07-16):** `mkFlake` prefers
`state.json` and still accepts the legacy `theme-state.json`, because a
machine only migrates on its next menu write — but nothing evaluated a
checkout carrying **only** the legacy name, so the shim could rot with every
check green, breaking rebuilds for exactly the users who have not touched the
menu since #107 (i.e. the least likely to notice). `checks.state-legacy-name`
now evaluates two fixtures: legacy-only must resolve, and **no state at all
must still throw** — the fail-closed gate is half the shim's contract and was
equally unpinned. Cheap by construction: `mkFlake` wraps its return in
`builtins.seq _themeState`, so forcing the attrset forces the state read and
nothing else — no module system, no `home.nix` — which is why the fixture is
one file and the check costs no measurable time. That file is a **symlink** to
the shipped template's `state.json`: a copy would drift and the check would
quietly start testing a fossil. Both assertions were proven by breaking
`lib.nix` — deleting the fallback, then defeating the gate — and watching each
fail by name. Delete it with the shim and the `nomarchy-theme-sync` alias.
- ✓ **The VM's verdict on menu geometry is worthless — and so is measuring
(#132, 2026-07-16):** the guest draws the picker with icons at ~¼ of
`ui.iconSize` and rows short enough to clip a 6-row root, so screenshots are