pmacs/docs
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
..
active-work.md test(panel): the nine family-gate rows, and three that proved nothing 2026-08-20 17:55:21 +02:00
agent-handoff.md docs(handoff): a timeout wrapper around the gate is not a result 2026-08-20 17:32:34 +02:00
auto-indent-framing.md
…
auto-pairing-framing.md
…
autosave-recovery-framing.md
…
bottom-panel-framing.md docs(framing): fold the mapping-generation closure audit into revision 16 2026-08-20 17:55:21 +02:00
bottom-panel-stage2-framing.md docs(bottom-panel): record framing revision 7 2026-07-29 22:37:41 -04:00
bottom-panel-stage3-framing.md review round 1: the crdt suite Stage 3 missed, and two stale explanations 2026-08-04 12:08:28 +02:00
ci-crdt-coverage-framing.md review round 2: assert the CRDT capability defaults, not their round-trip 2026-08-01 11:37:19 -04:00
ci-red-signatures.md docs(framing): SS5b revision 16 --- the producer rule was self-defeating, and R7 recurs on a docs-only diff 2026-08-20 17:55:21 +02:00
comment-toggle-framing.md
…
compile-mode-framing.md
…
config-registry-framing.md
…
context-menu-framing.md
…
cua-typeover-undo-framing.md
…
desktop-save-framing.md
…
destination-capture-framing.md docs: carry the four-plus-one dedication count into the framing 2026-08-10 14:11:43 +02:00
dired-framing.md docs: record dired Stage 1 (#165) as landed 2026-07-25 17:39:27 -04:00
dired-stage2-framing.md docs: dired Stage 2 framing rev 9 2026-07-28 21:09:11 -04:00
discovery-stage1-command-family-framing.md docs(discovery): finalize Stage 1 framing review 2026-07-31 18:28:35 -04:00
discovery-stage2-framing.md docs: record discovery Stage 2 framing approval 2026-08-10 13:52:32 +02:00
distribution-stage1-framing.md docs(release): a tag before the merge does nothing, silently 2026-08-01 14:46:27 -04:00
editing-conveniences-framing.md
…
folding-framing.md
…
folding-stage2-framing.md
…
full-grid-resync-framing.md docs: the framing said "awaiting approval" after being approved 2026-08-06 15:22:03 +02:00
gate-protocol-build-framing.md docs: gate framing revision 5 --- pin both emitter pairs, correct print-plan 2026-08-09 18:11:14 +02:00
gate-script-framing.md docs: correct a misattributed review round and an unmeasured claim 2026-08-13 21:10:10 +02:00
generated-buffer-immutability-framing.md merge: integrate main after PR 188 lands 2026-07-29 12:28:25 -04:00
git-integration-framing.md docs: narrow the copy-detection claim to the fixture it was measured on 2026-08-09 22:34:19 +02:00
gpu-attach-robustness-framing.md
…
gpu-chord-forwarding-framing.md
…
gpu-golden-harness-framing.md
…
gpu-horizontal-scroll-framing.md feat(gpu): horizontal scroll — QoL Stage 5, closing the long-lines arc (#223) 2026-08-08 10:55:49 +00:00
gpu-initial-target-framing.md test(journey): pin the destination commit, and land the doc updates 2026-07-26 17:25:22 -04:00
gpu-invocation-framing.md
…
gpu-minibuffer-framing.md
…
gpu-probe-sigint-framing.md docs(framing): record revision 13 approval 2026-08-19 20:52:25 +02:00
gpu-set-font-framing.md
…
gpu-terminal-input-framing.md docs: measure the CI coverage gap and record the vterm as-framed audit 2026-07-25 17:17:23 -04:00
gui-arc-framing.md docs: Q#S1-7 --- Meta/Super moves to Stage 2, in both records 2026-08-11 23:12:04 +02:00
gui-stage1-input-framing.md docs(framing): SS5b revision 15 --- appended means LAST, and cancellation had a race 2026-08-20 17:55:21 +02:00
gui-zoom-framing.md docs(zoom): the ties both round up, they do not oppose 2026-08-06 17:50:03 +02:00
horizontal-scroll-framing.md feat(view): horizontal scroll, text and decorations together 2026-08-07 22:43:17 +02:00
in-buffer-completion-framing.md
…
in-buffer-search-framing.md
…
inline-math-framing.md docs: record the inline-math slice (#158) as landed 2026-07-25 18:16:31 -04:00
inline-math-slice-framing.md fix(math): review round 3 — mapping bug, whitespace defect, real MATH gaps 2026-07-24 20:19:40 -04:00
journey-stage1a-framing.md feat(compile): make building discoverable — journey step 9 2026-07-30 21:13:12 -04:00
journey-stage1b1-compile-defaults-framing.md docs(journey): framing revision 2 — close review round 1 2026-07-30 18:40:34 -04:00
journey-stage1b2-lsp-guidance-framing.md docs(journey): framing revision 4 — close review round 3 2026-07-30 21:52:15 -04:00
journey-stage1b3-welcome-framing.md docs(journey): framing revision 4 — close review round 3 2026-07-31 14:55:57 -04:00
json-yaml-framing.md docs: absorption pass at c5f7501 — #209 landed, and six weeks of drift 2026-08-01 13:56:23 -04:00
keybindings.md feat(git): Stage 1 --- *git-status* and *git-diff*, no wire change 2026-08-09 14:43:21 +02:00
kill-ring-framing.md
…
latex-grammar-math-substrate-framing.md
…
lean4-mode-framing.md fix(lean4): count fan-outs where a claim cannot skip the count 2026-07-26 17:15:24 -04:00
locals-query-processing-framing.md
…
long-lines-framing.md test: the report itself, at a real PTY — and §1.1 was wrong 2026-08-07 19:37:46 +02:00
lsp-file-watch-d3-framing.md feat(lsp): D3 --- the file watcher stops sleeping and walks once per scan (#233) 2026-08-11 14:59:28 +02:00
lsp-file-watcher-framing.md fix(lsp): read the glob form from the pattern, and stop a cancelled scan emitting 2026-08-11 09:00:15 +02:00
lsp-language-coverage-framing.md docs: LaTeX framing revision 3 --- step zero corrected the premise 2026-08-10 10:48:49 +02:00
lsp-panels-framing.md
…
lua-bindings-split-framing.md
…
macos-ci-signal-integrity-framing.md docs: record Stage 2 in the framing, and fence R3 off from R2's retirement 2026-08-05 13:51:40 +02:00
mcp-for-package-authors.md
…
mode-system-wiring-framing.md
…
modeline-detection-framing.md
…
multi-language-injections-framing.md
…
package-author-guide.md
…
package-manager-hardening-framing.md
…
packages.md
…
persistence-framing.md
…
pmacs-gpu-design.md
…
pmacs-gpu-diagnostic-parity-framing.md
…
pmacs-gpu-mouse-deferred-framing.md
…
pmacs-gpu-mouse-framing.md
…
pmacs-gpu-perline-reshape-framing.md
…
pmacs-gpu-phase-a-audit.md
…
pmacs-gpu-quad-backgrounds-audit.md
…
pmacs-gpu-quad-backgrounds-framing.md
…
pmacs-gpu-scroll-framing.md
…
pmacs-gpu-status-band-framing.md
…
pmacs-gpu-wavy-squiggles-framing.md
…
probe-sigint-evidence.md docs(framing): close revision 12 approval blockers 2026-08-19 15:21:35 +02:00
process-signal-diagnostic-completeness-framing.md docs(process): stop overclaiming the pre-kill sample; drop a dead comment 2026-07-30 14:41:50 -04:00
process-signal-tolerance-framing.md docs: frame the PTY terminate diagnostic (revision 4) 2026-07-25 21:12:51 -04:00
process-teardown-stdin-deadlock-framing.md fix(process): arm the setsid dependency, correct the orphan account 2026-07-29 22:54:06 -04:00
project.md
…
query-replace-framing.md
…
r8-fixture-boundary-framing.md fix(tests): bound the LSP fixture's project detection — retires R8 (#226) 2026-08-09 08:54:06 +00:00
reap-ledger-silent-failures-framing.md fix(process): scope the escalation claim to ticks, and pin the boundary 2026-07-30 20:41:03 -04:00
repository-audit-2026-07-03.md
…
resource-op-delete-guard-framing.md fix(lsp): close review gaps in workspace edit reporting 2026-07-29 12:29:50 -04:00
roadmap-2026-07.md
…
semantic-frontend-protocol.md
…
side-quest-backlog.md docs: Q#S1-7 --- Meta/Super moves to Stage 2, in both records 2026-08-11 23:12:04 +02:00
statusline-segments-framing.md
…
tab-width-parity-framing.md
…
terminal-config-and-copy-mode-framing.md docs: correct the non-adopter attribution and two stale anchors 2026-07-26 16:45:12 -04:00
test-ambient-config-isolation-framing.md docs(framing): record the deliberate departure from the §7 branch plan 2026-07-31 19:46:33 -04:00
theme-faces-framing.md
…
tree-primitive-framing.md fix(listview): ids must also be unique and not NaN 2026-08-05 23:06:25 +02:00
ux-arc-framing.md
…
vterm-framing.md Merge main, and fold #173's a37 findings into the CI-coverage lane 2026-07-26 09:29:42 -04:00
web-grammars-html-css-framing.md
…
worker-identity-framing.md fix(workers): a safe display-text boundary for purpose and handler names 2026-08-10 14:51:54 +02:00