pmacs/docs
Levi Neuwirth 7d6b6da366
docs(framing): bottom-panel revision 9 --- Q#BP-R2 overruled, and R-c2 stops fighting a tested contract
Answers review of revision 8. Still framing only; no implementation.
Both items reverse a decision revision 8 made.

**Q#BP-R2 IS OVERRULED: a terminal-chrome wheel is CONSUMED, not
clamped.** I argued clamping on consistency grounds and missed that SGR
wheel input is COORDINATE-BEARING: `encode_mouse` takes a `coord` and
writes `coord.col + 1` / `coord.row + 1` into the emitted sequence
(`src/terminal/input.rs:102`, `:146`) --- which A4, added one revision
earlier, pins exactly. Clamping therefore fabricates a hit on the
terminal's final content row, and an application that routes wheel
input by position acts on a cell the user never pointed at. The
consistency I was buying is cosmetic; the price is a synthetic
coordinate handed to a program as real.

The asymmetry with `Up` is the part worth keeping in the record: `Up`
must be normalized because an unterminated gesture HANGS --- the daemon
holds a button down forever --- while a wheel tick is self-contained
and dropping one strands nothing. Liveness is what earns
normalization, and the wheel has no liveness obligation. Consumed, and
never fallen through to the document; TUI parity restored.

**R-c2 WOULD HAVE BROKEN A TESTED GUARANTEE.** Revision 8 said to
retain the `Down` cell in `last_pointer_cell`. That field is cleared on
press deliberately, and a live test says why: "the first drag after a
press must reach the daemon even at the cell the press landed on"
(`pmacs-gpu/src/main.rs:19841`). Storing `Down` there makes the press's
own cell the dedupe baseline and suppresses exactly that `Drag`.

Ruled: a separate `gesture_last_content_cell`. The two fields have
different jobs and conflating them was the error ---
`last_pointer_cell` answers "is this motion worth sending?", the new
one answers "where did this gesture last legitimately point?" ---
different lifetimes, different resets. Written on arm and on each
accepted content motion; reset on release and on BOTH identity changes;
never consulted by `panel_motion_is_new`. A second mutation guards the
separation itself: point the dedupe at the new field and the existing
first-`Drag`-after-press assertion must fail.

The alternative --- ruling `Down` the dedupe baseline and retiring the
guarantee --- is recorded as considered and rejected. It would need a
mutation showing the first same-cell `Drag` is redundant, and it is not
obviously so, since that event is what establishes the daemon's drag
state.

**And the crossing table follows the choice.** Revision 8 promised a
content-originated `Drag` over chrome would be sent. It should not be:
once normalized, its coordinate is usually the one already reported and
the ordinary dedupe suppresses it, correctly --- promising delivery
would oblige the producer to defeat its own dedupe for a daemon state
that is identical either way. `Up` is the load-bearing crossing event
and the only one promised unconditionally.

Gates: all nine green under `env -u TMPDIR`, log 20260814T123502Z.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bqGA6s9tTUFzYpbeW3tai
2026-08-14 14:39:47 +02:00
..
active-work.md docs(framing): bottom-panel revision 9 --- Q#BP-R2 overruled, and R-c2 stops fighting a tested contract 2026-08-14 14:39:47 +02:00
agent-handoff.md fix(gate): review round 3 --- canonical ancestry, guard witnesses, and a withdrawn claim 2026-08-13 17:07:55 +02:00
auto-indent-framing.md
…
auto-pairing-framing.md
…
autosave-recovery-framing.md
…
bottom-panel-framing.md docs(framing): bottom-panel revision 9 --- Q#BP-R2 overruled, and R-c2 stops fighting a tested contract 2026-08-14 14:39:47 +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 fix(gate): review round 3 --- canonical ancestry, guard witnesses, and a withdrawn claim 2026-08-13 17:07:55 +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
…
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-set-font-framing.md
…
gpu-terminal-input-framing.md
…
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: Stage 1a --- re-measure the framing's ground truth, and open the lane 2026-08-12 14:29:04 +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
…
inline-math-slice-framing.md
…
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
…
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
…
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