diff --git a/docs/active-work.md b/docs/active-work.md index 84625e6..b913265 100644 --- a/docs/active-work.md +++ b/docs/active-work.md @@ -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** (code head `f441d3d`)**:** B1's per-target fractional +**Landed so far** (latest verified code head `9cb610e`)**:** 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**, @@ -354,18 +354,58 @@ documentation-only commits and remains the recovery source. Calling commit carrying the sentence — the self-certifying checkpoint defect this ledger has already recorded elsewhere. -**Landed but NOT yet witnessed** — recovery needs this split, because -"L1–L8 owed" reads as though none of the mechanism exists: +### The latch was never the thing the ledger said it was + +**This entry was wrong, and the correction is the recovery-relevant +part.** It listed the manual horizontal authority latch as "landed but +not yet witnessed". Writing L1 showed otherwise: +`manual_left_authority` existed on the GPU, was **written in four +places and read in none**, and did not exist on the TUI at all. What +had landed was the arming. The preservation the latch exists for was +nowhere, on either frontend. + +L1 measured it before anything changed: a sideways wheel moved the TUI +origin to 30, and the next paint put it back to 0. **A horizontal +scroll was undone by the following frame.** An unread `bool` preserves +nothing, and "landed but unwitnessed" is exactly how that reads from +the outside. + +**`9cb610e` implements clauses 2–5 for the TUI** and witnesses each: +L1 preservation across a real `paint_frame`, L3 release on a genuine +cursor move, L4 a vertical wheel preserving authority, L5 viewport-only, +L6 an absorbed notch arming nothing, L7a re-clamp on widening, L8 wrap +clearing the latch. Seven mutations run, each biting its named rows. + +Three things the framing's L-table did not anticipate, all surfaced by +setup assertions rather than by reading: + +- **L4's stated hazard cannot arise in the setup the same table + mandates.** The vertical wheel carries point only when the caret is + INSIDE the viewport — `pos_to_display` returns `None` left of the + edge (Q#HS7(c′)) — and every other L-row requires it outside. L4 + places the caret inside and uses the **latch** as its discriminator, + because the origin cannot discriminate there. +- **Clause 3 needs a mechanism, not an exemption.** `scroll_window` + refreshes `manual_left_cursor` to the point it dragged along, so + clause 4's "genuine cursor change" stays false. Keying release on the + cursor byte alone releases exactly where clause 3 forbids it. +- **`paint_frame` runs the follow BEFORE resolving the frame's wrap + mode and content width**, so a geometry or wrap change reaches the + follow one frame late. L7a and L8 paint twice and say why. + +**Still owed on this axis: L7b (content shrink), and the GPU's entire +read side with L2 and L5's GPU leg.** The GPU's four writes remain +inert until something consults them. + +**Landed but NOT yet witnessed:** -- the **manual horizontal authority latch** (`manual_left_authority`), - armed only by an *effective* move (clause 2); - **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:** the **L1–L8 rows** for the latch above, step 3's +**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 away must go with it, and this frontend does not yet track "that buffer @@ -453,10 +493,17 @@ error: could not compile `pmacs-gpu` (bin "pmacs-gpu" test) due to 4 previous errors ``` -Three of the four were read off the second occurrence's output — -`main.rs:13291`, `:14517`, `:14578`; the fourth scrolled past the -captured tail and is **not** recorded here rather than guessed. All are -uses of the module the 1b branch added in `9e54cd2`. +**THREE 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. + +An earlier draft of this entry guessed the missing fourth site was +`widest_display_columns`. The third occurrence shows that guess was +right — and it was still right not to record it, because a signature +that is *usually* right is one nobody can match against. **Why it is false.** Both times, the module was fully present: `pmacs-protocol/src/columns.rs` existed and matched HEAD, and diff --git a/docs/ci-red-signatures.md b/docs/ci-red-signatures.md index 690cc52..d3364b0 100644 --- a/docs/ci-red-signatures.md +++ b/docs/ci-red-signatures.md @@ -1083,6 +1083,40 @@ regression in two unrelated subsystems at once is far less likely than one loaded machine. If a future run reds **one** of these without the other, that is a different incident and should be judged as one. +### U20 — U6's composition test reds ALONE, which U6 says is a new incident + +Recorded during GUI Stage 1b, 2026-09-01, local (Linux). **This row +exists because U6's closing rule says it must**: *"If a future run reds +one of these without the other, that is a different incident and should +be judged as one."* This is that run. It is filed separately rather than +as a sixth U6 occurrence, because U6's selector requires **both** tests +failing together and its whole argument rests on the pair — a real +regression in two unrelated subsystems at once being less likely than +one loaded machine. One test alone does not carry that argument. + +| field | value | +|---|---| +| **selector** | `--lib editor::tests::composition_overhead_under_ten_percent`, **alone** — `optimistic::tests::criterion_1_end_of_line_typing_completes_sub_frame_per_keystroke` passed in the same run | +| **job / flavor** | local (Linux), bare `cargo test --lib` (default features), full-lib load, **not** `scripts/gate` | +| **required fragments** | `composition machinery added more than 10% overhead` + a ratio; the run also printed `dispatch overhead : 87.9%` and `realistic overhead : 82.1%` | +| **status** | **ONE occurrence.** Not reproduced in six subsequent full-lib runs — three on the observing tree and three on the same tree with the observing diff reverted | +| **margin** | **1.879 against a 1.10 budget** (`single=158789 ns, dispatch=298366 ns`). Recorded because U11 taught this registry what a missing margin costs. This is far the largest margin any occurrence of this selector has shown: U6's five were 1.297, 1.182, 1.592, 1.527 and one unrecorded | +| **what IS established** | the observing diff (`9cb610e`, the TUI horizontal-authority latch) adds work to the paint path, so it was a live suspect. It was tested rather than argued about: three full-lib runs with the diff and three with `src/editor.rs` and `src/window.rs` restored to HEAD. **All six green.** The single failure is therefore not reproducible either way | +| **what is NOT** | why it fired. The load confound is once again unmeasured — no `/proc/loadavg` reading was taken at the moment of failure, which is the same gap U15 exists to close | + +**The margin is the part that does not fit.** 1.879 is not a budget +missed by a hair; it is the machinery costing nearly twice what the +budget allows, and it is a third again worse than U6's worst. A +load-sensitive assertion can produce that, but so can a real +regression, and this row does not pretend the size of the margin +resolves the question. What it does establish is that the observing +diff is not the cause, because six controlled runs say so. + +**If this selector reds alone again, this row is where it goes**, and +the first thing to capture is a contemporaneous load reading — the one +piece of evidence that would separate the two explanations and that +neither U6 nor this row has at the moment of failure. + ### U7 — a *different* wall-clock render-budget test reds each sweep Recorded during worker identity Stage 1 review round 3, 2026-08-09.