docs: the zoom lane recorded revision 4 and three findings

The lane went stale across two review rounds. It said framing revision
4, 13 acceptance tests, and "the three findings review caught" --- all
true when written, none true now.

Brings it current: revision 5, the pushed tip, 15 tests, and the two
later findings. The quantization one gets a real entry rather than a
mention, because its content is a REUSABLE fact about this codebase ---
ConfigKind::Number validates finiteness and bounds and nothing else,
and on_change cannot veto --- so any future setting needing a stronger
predicate than a range meets the same wall.

Also records the verification asymmetry that mattered: the raw-step
bite fails the new witness while the pre-existing 0.37 test still
passes. That is why it had to be a separate test, and it is the kind of
detail a lane summary usually drops.

New section for pre-checkout CI reds, which #220 hit three times. The
job dies in "Set up job" before actions/checkout; grepping the full log
for checkout/cargo/test-result returns 0. No code is fetched, so the
red says nothing about the commit in either direction --- re-running it
is a first execution, not a retry-to-green.

It gets a section here and not a registry row on purpose: matching
requires an exact test selector plus fragments, and no test ran. Making
it a row would mean deforming the row shape. Whether the registry wants
a non-row section for the class is left to its owner.

Written down rather than acted on silently because the registry's
opening instruction is to read it BEFORE attributing a red run to the
environment, and that is exactly the attribution being made here.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bqGA6s9tTUFzYpbeW3tai
This commit is contained in:
Levi Neuwirth 2026-08-06 17:52:11 +02:00
parent 1e054f7109
commit b645fe7f3b
No known key found for this signature in database
1 changed files with 67 additions and 6 deletions

View File

@ -304,10 +304,12 @@ correction from #171 and #215 — so the row below was filled in rather
than invented.
- **Branch `gui-zoom`**, base `githubsucks/main` @ `218d2e7` (the #219
merge). `githubsucks/gui-zoom` is the authoritative tip.
merge). Pushed; `githubsucks/gui-zoom` is the authoritative tip, at
`1e054f7`.
Recover: `git fetch githubsucks && git checkout gui-zoom`.
- **Framing `docs/gui-zoom-framing.md` revision 4**, approved after
four review rounds. **Q#Z1 = (c)** configured base with `None`
- **Framing `docs/gui-zoom-framing.md` revision 5**, approved after
four review rounds; revision 5 adds §3.2 for a finding raised against
the implementation. **Q#Z1 = (c)** configured base with `None`
preserved; **Q#Z2 = additive**; **Q#Z3 = (C)** commands only, no
default bindings; **Q#Z4** eager restore inside `install_state_dirs`.
@ -320,7 +322,7 @@ than invented.
dimension and `apply_font_facts` already re-metriced everything; this
drives the preference that existed.
### The three findings review caught, none of which was in revision 1
### The findings review caught, none of which was in revision 1
- **Q#Z3 was not implementable.** `keymap_stack::Scope` is
`Buffer | Mode | Global` with no frontend identity, and
@ -339,14 +341,38 @@ drives the preference that existed.
- **Every size write clobbered the family.** `set_font` replaces both
fields unconditionally, so `{ size = n }` alone silently cleared a
configured family until restart.
- **The bounds could not carry the round-trip guarantee** (raised
against the implementation, not the framing). `ConfigKind::Number`
validates finiteness and bounds and *nothing else*, and `on_change`
is notified after the value is stored — so it cannot veto. A step of
`0.015` is therefore settable, and used raw it broke the framed
exact round trip: `16.00 -> 16.02 -> 16.01`. Fixed by quantizing the
step **and** the base at the point of use, which is the operation
`validate_font_size` already applies to sizes, one level up.
Set-time enforcement was rejected: the registry cannot express
precision, and a validating wrapper is bypassed by a direct
`pmacs.config.set` — the seam `autosave` documents about
`interval_ms`.
A fifth, documentation-only: the explanation of *why* `0.015` broke
said the two intermediates rounded in opposite directions. They do not.
`16.015` and `16.005` are exactly `1601.5` and `1600.5` centi-pixels —
both exact ties, and half-up sends **both up**. The mechanism is that
half-up is not symmetric under negation, so the two roundings
accumulate rather than cancel. Corrected in all three copies; no
behavior change.
### Verification
13 acceptance tests, three bitten: dropping family preservation fails
15 acceptance tests, four bitten: dropping family preservation fails
3; reverting to the framing's first parser `^(%d+)$` fails 4 including
the seam restore (it anchors to end-of-subject and rejects the
newline-terminated file the writer emits); hardcoding the 16.0 origin
fails the base test.
fails the base test; **using the raw step instead of the quantized one
fails the unrepresentable-step witness** with
`left: Some(16.01) / right: Some(16.0)` **while the pre-existing 0.37
test still passes** — which is exactly why the new case had to be its
own test rather than another parameter of that one.
### Not in scope
@ -373,6 +399,41 @@ so this is load-sensitive and **undiagnosed** — recorded as a scope
note for the audit, not as a registry row: these were local, and the
registry judges red **CI** runs.
## Pre-checkout CI reds — a class the registry has no row shape for
Seen 2026-08-06 on #220, three times across two runs (`M4`+`M5`, then
`M5` again on the rerun):
```
Prepare all required actions
Getting action download info
Failed to resolve action download info. Error: Internal Server Error
##[error]Failed to resolve action download info.
```
**This is not a flake and not a test failure.** The job dies inside
`Set up job`, before `actions/checkout` — a `grep` for
`checkout|cargo|test result:` over the full job log returns **0**. No
repo code is fetched, so the red carries *zero* information about the
commit, in either direction.
Two things follow, and both matter for signal integrity:
- **Re-running is a first execution, not a retry-to-green.** The rerun
rule governs a test that ran and failed; nothing ran here. The
discriminator is objective and cheap — did the job reach checkout?
- **It cannot be a registry row as the registry is written.** Matching
requires an *exact test selector* plus fragments, and there is no
test. Recorded here rather than forced into a shape it does not fit.
The second `M5` failure took **4m52s**, which read like a real run;
the duration was entirely retry backoff. Duration is not evidence that
a job executed — **the log is**.
Whether `docs/ci-red-signatures.md` should grow a short non-row section
for this class is an open question for its owner, not something this
lane decided.
## Tree primitive (P5) — MERGED as #217; adoption is the open work
**The lane is gone, not the work.** Rule 4 removes a lane after merge,