docs: GPU authority is structural, and the framing said otherwise

The framing claimed L2's height-only resize "invokes the real follow
path (resize -> ensure_caret_painted -> horizontal_follow)". It does
not, in the setup L2 itself mandates: the caret is deliberately outside
the manual viewport, and the painted-before policy skips the follow
precisely there. The paragraph now carries the correction and its
consequence --- that the GPU needs no authority flag, because there is
no follow to outrank --- along with the decision to delete rather than
complete it, and the four rows that replace the single one.

The ledger's stale claims go with it. "Landed but not yet witnessed"
still listed wrap and buffer-replacement clearing, which L8 and L8b-L8e
now cover and whose GPU half described a latch that no longer exists;
"owed outright" still listed L7b and the GPU read side. Both are
corrected rather than quietly dropped, since the entry's purpose is to
tell a recovering session what is actually left.

Also records the shared-target false red's FOURTH occurrence, at the
same four module uses with drifted line numbers --- which is the entry's
own point about which parts of that signature are stable.
This commit is contained in:
Levi Neuwirth 2026-09-02 00:45:45 +02:00
parent 269c52e5a7
commit 2166c4290b
No known key found for this signature in database
2 changed files with 68 additions and 16 deletions

View File

@ -319,7 +319,7 @@ Framing
this base, the panel-replay prerequisite recorded as DISCHARGED by #243,
and the both-axis effect witness still owed.
**Landed so far** (latest verified code head `ec6444e`)**:** B1's per-target fractional
**Landed so far** (latest verified code head `269c52e`)**:** B1's per-target fractional
wheel residual (the producer), B2's daemon-side horizontal panel leg,
B3/B7's shared `scroll_window_columns` with its saturated bound and wrap
pin, B4's middle-click PRIMARY paste, **B6's minimap wheel routing**,
@ -457,21 +457,41 @@ blank, the text off its left edge. `clamp_code_scroll_left` now sits at
`reshape`'s tail, beside B5's icon hook and for the same reason.
**Owed to the framing, not to the code: L2's wording**, which promises a
witness this frontend cannot provide. The GPU's four `manual_left_authority`
writes are still read by nothing; whether they should be deleted or given
a reader is a framing decision, not one to take in passing.
witness this frontend cannot provide.
**Settled (user decision, 2026-09-02): the GPU latch is deleted, not
completed.** The contract is behavioral, and the two frontends are not
required to share a representation; a reader would have duplicated the
painted-before policy and needed a cursor baseline of its own to avoid
suppressing genuine cursor movement. `manual_left_authority`, its
initializer and its four writes are gone, and `scroll_by_columns`
no longer returns an unused `bool`. **GPU authority is structural**,
and the framing now says so.
The GPU's four rows: **L2** (height-only preserves — the policy, not a
latch), **L7a** (widening clamps to the exact bound), **L7b** (a
content shrink clamps **through the incremental edit path**), and
**L3** (a moved `CursorByte` pulls the viewport back). Each fires on
its own mutation; L2's also necessarily bites L7a, which its doc names.
**L7b, GPU, is the one that found a live gap.** Q#R1's keystroke case
re-shapes only the affected line through `try_reshape_line` and skips
the full `reshape` — **and skipped clause 3's clamp with it**. A
one-line delete shortening the widest line could leave the viewport
past the end of the text with no later event to repair it. The clamp
now runs on that branch too.
**Landed but NOT yet witnessed:**
- **wrap and buffer-replacement clearing** of that latch and the origin
(clause 5), on both the GPU's `scroll_by_columns` and the buffer
replacement path;
- **R4 and R5's residual resets**, as two separate clears beside
`code_scroll_left` so omitting either is individually visible.
**Owed outright:** L7b and the GPU's whole read side (above), step 3's
fractional both-axis panel witness, R4/R5's own replacement witnesses,
and **B1's disposal half** — a residual keyed to a surface that goes
(The wrap and buffer-replacement clearing that stood here is done: the
TUI's four replacement paths carry L8b–L8e, wrap carries L8, and the
GPU half of that bullet described the latch that no longer exists.)
**Owed outright:** step 3's fractional both-axis panel witness, R4/R5's
own replacement witnesses, and **B1's disposal half** — a residual keyed to a surface that goes
away must go with it, and this frontend does not yet track "that buffer
is gone".
@ -557,12 +577,14 @@ error: could not compile `pmacs-gpu` (bin "pmacs-gpu" test)
due to 4 previous errors
```
**THREE occurrences now**, all local. The third (at `9cb610e`) gave the
**FOUR occurrences now**, all local. The third (at `9cb610e`) gave the
complete set of four sites, which the second's captured tail had cut to
three: at that head they were `main.rs:9049`, `:13546`, `:14772` and
`:14833` — every use of the module the 1b branch added in `9e54cd2`.
Line numbers drift as the file grows; the module path is the stable
part of the signature.
The fourth (2026-09-02, mid-edit) hit the same four uses at
`:9109`, `:13658`, `:14884` and `:14945`. **Line numbers drift as the
file grows and are not part of the signature; the module path is**, and
the count of four is stable across all of them.
An earlier draft of this entry guessed the missing fourth site was
`widest_display_columns`. The third occurrence shows that guess was

View File

@ -841,9 +841,39 @@ released snaps to the caret's.
**L2 is height-only for the same reason L3 leaves the viewport.** A
resize that changes width also changes the clamp, so the origin could
move for a reason unrelated to authority and the row would not
discriminate. Height-only invokes the real follow path
(`resize` → `ensure_caret_painted` → `horizontal_follow`) while leaving
horizontal geometry fixed.
discriminate.
**CORRECTION (revision 21, implementation).** This paragraph said
height-only "invokes the real follow path
(`resize` → `ensure_caret_painted` → `horizontal_follow`)". **That is
false in the setup L2 itself requires.** `resize` runs
`ensure_caret_painted` only when the caret was painted, and L2's caret
is deliberately outside the manual viewport — so Q#F6's painted-before
policy skips the follow, and no follow runs at all.
**The consequence is that the GPU needs no authority flag.** The TUI
does: `horizontal_follow` runs on every paint there and would drag the
origin back, so only a latch can outrank it. On the GPU the follow
reaches the origin only through `ensure_caret_painted`, which is
skipped exactly when the user has scrolled the caret off screen — and
when the caret IS on screen it is inside the viewport, where
`follow_left` returns the origin it was handed. **GPU authority is
structural: there is no follow to outrank.**
A flag was carried there for a while, written in four places and read
in none. **It has been removed rather than completed** (user decision,
2026-09-02): giving it a reader would have duplicated the
painted-before policy and needed a cursor baseline of its own to avoid
suppressing genuine cursor movement. **The contract is behavioral; the
two frontends are not required to share a representation.**
So the GPU's rows are: **L2** (height-only preserves, witnessing the
policy — mutation: follow unconditionally), **L7a** (widening clamps to
the exact bound), **L7b** (a content shrink clamps **through the
incremental edit path**, which bypasses `reshape` and so bypassed the
clamp), and **L3** (a moved `CursorByte` pulls the viewport back —
the "until the cursor changes" boundary, which without a flag is the
only thing that marks it).
**L7 needs both legs.** Clause 3 promises re-clamping on *geometry and
content* changes; widening the viewport witnesses only the geometry