pmacs/pmacs-gpu
Levi Neuwirth a242038e8a
test(panel): the nine family-gate rows, and three that proved nothing
The G6/G7/G8 matrix, plus the probe correction and the corrections
review found in my first attempt at these rows. This is the coherent
checkpoint: full eleven-stage `--protocol` gate, green.

**THREE OF THESE ROWS PASSED WITHOUT PROVING THEIR CLAIM**, and each
failed differently:

  G8b/G8d had no atomicity. G8b installed a LEGACY frame and then
  switched the session to Mapped, so `mapping_generation` was `None`
  throughout --- asserting it stayed `None` after the refusal asserted
  nothing. Each direction now uses an independent state, accepts a
  CORRECT-FAMILY baseline so there is real authority to preserve, and
  primes both pointer latches. Two new mutations pin it: clearing
  authority before refusing fails G8b, discarding the retained frame
  fails G8d. The family-gate mutation touched neither.

  G8e covered one direction. An authority check that only holds one way
  is one a peer walks around by choosing which identity to forge, so a
  mapped session now also fails to borrow a legacy identity --- and
  BOTH claimed identities have real registered sessions, or a
  payload-keyed lookup fails for want of a session rather than for want
  of authority. That was why G8e's own named mutation did not bite on
  the first attempt.

  G6b measured ambient state. It pre-focused the panel and then asserted
  against `active_window_id()`, which tracks `active_frontend` too ---
  satisfiable by a frontend switch that never routed anything. Every
  routing and refusal row asserts `views[fid].active` now, with the
  document precondition stated rather than assumed.

**And the probe measured the payload rather than the band, twice over.**
Its identity tuple was `(panel_epoch, geometry_epoch, size)`, which
ordinary content, focus, cursor and generation updates all leave
unchanged --- so accepted frames went uncounted, including the
identical-frame/higher-generation case this slice requires, and a
fixture waiting for two frames would wait forever. It snapshots the
complete accepted authority now, `(presented frame, mapping_generation)`,
and keeps the raw payload kind ONLY to tell a real `Absent` from a
refusal: inferring absence from `presented() == None` turned a rejection
into "the daemon says there is no band", a different fact entirely.

Nine rows, ten mutations, each biting its own:

  G6a legacy outbound            G7a mapped outbound, live generation
  G6b legacy inbound routing     G7b mapped inbound routing
  G8a bare from v25 refused      G8c mapped from v24 refused
  G8b legacy at v25 refused, atomically
  G8d mapped at v24 refused, atomically
  G8e both forgery directions
  plus: an Unsupported session accepts NEITHER family

G6c/G7c remain replay-lane effects.

**The gate earned its keep**: it caught a real regression I would have
shipped. `one_daemon_serves_a_v21_panel_session_and_a_shipped_v20_client`
counter-offers `PROTOCOL_VERSION`, now 25, so it is a MAPPED session
whose helper drained for legacy `Present` and timed out. Third suite
whose helpers assumed one family --- daemon acceptance, the GPU probe,
now GPU acceptance --- each written when only one family existed and
each quietly deciding what "a panel arrived" means.

Four `--protocol` runs were needed. Three failed on unrelated
signatures: the composition budget twice, in different steps, and
`setsid_escapee_is_not_reaped_and_teardown_reclaims_readers` once, a
new signature. All are recorded in the lane ledger rather than
`ci-red-signatures.md`, which ends at U9 here while the unmerged replay
branch already holds a U10.

Gates: all eleven green under `env -u TMPDIR` with `--protocol`,
log 20260815T185708Z, verified by exit status.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bqGA6s9tTUFzYpbeW3tai
2026-08-20 17:55:21 +02:00
..
fonts feat(math): bundle Latin Modern Math and read its MATH constants 2026-07-24 18:27:34 -04:00
src test(panel): the nine family-gate rows, and three that proved nothing 2026-08-20 17:55:21 +02:00
Cargo.toml feat(release): binaries on tag — Distribution Stage 1 2026-08-01 14:40:47 -04:00