docs: the framing said "awaiting approval" after being approved

Two places, not one. The status line said proposed, and §3 still said
Q#FG1 "needs approval before implementation" — while the lane, the
branch, and PR #219 all record it decided as A. A framing that
survives the lane is the durable record; one that describes its own
state wrongly is worse than no record, because it reads as authoritative.

Also records what implementation corrected about the framing rather
than leaving §5.2 describing a witness that was not built: the
time-based settle it specified cannot work, since a settled pmacs
screen emits per-frame bytes forever and "output stopped growing" never
becomes true. The shipped test anchors to content instead, which
excludes startup's clears by construction rather than by timing — and
its repaint-ordering assertion has to be scoped after the new clear,
because the fixture repeats its marker and the suffix opens with the
tail of startup's own frame.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Levi Neuwirth 2026-08-06 15:22:03 +02:00
parent 3361da08df
commit 6bffa52064
No known key found for this signature in database
1 changed files with 36 additions and 3 deletions

View File

@ -1,6 +1,9 @@
# Honoring `full_grid` — QoL Stage 1 # Honoring `full_grid` — QoL Stage 1
**Status: revision 2 — proposed, awaiting approval.** Reported from daily-driver use: **Status: revision 2 — APPROVED, IMPLEMENTED, in review as PR #219.**
Q#FG1 was decided **A**: the sole grid consumer honors the flag by
resetting style, clearing, then applying spans. Reported from
daily-driver use:
zooming a terminal with `Ctrl +/-` leaves the TUI visibly broken — zooming a terminal with `Ctrl +/-` leaves the TUI visibly broken —
stale glyphs where content should be blank, and dead regions where stale glyphs where content should be blank, and dead regions where
content should be. content should be.
@ -180,7 +183,15 @@ is the better answer on the merits:
- A makes the protocol's documented sentence true, rather than working - A makes the protocol's documented sentence true, rather than working
around it. around it.
**Q#FG1 is the one decision that needs approval before implementation.** **Q#FG1 — DECIDED: A**, on approval. The consumer honors the flag;
`full_grid` keeps its sparse-resync meaning and the producer is
unchanged.
*Implementation note, recorded because it confirmed the reasoning
rather than merely following it:* the fix is `emit_cell_delta` beside
`emit_span` and `emit_status_overlay` — no struct change, no generic
parameter, no new pattern. B would have touched the producer, changed
what every resync costs on the wire, and left the flag unread.
--- ---
@ -230,7 +241,29 @@ new pattern.
blank. blank.
3. **`full_grid: false` emits neither**, whatever the spans are. 3. **`full_grid: false` emits neither**, whatever the spans are.
### 5.2 PTY acceptance ### 5.1a What implementation changed about §5.2
**The time-based settle described below does not work**, and the
framing said to build it. A settled pmacs screen emits per-frame bytes
indefinitely, so "output stopped growing" never becomes true — the wait
simply runs to its deadline. The vterm suite already recorded the same
behaviour ("a settled screen emits empty diffs forever"); this framing
did not connect it.
The shipped witness anchors its mark to **content** instead: just past
the first painted byte of the fixture. That excludes both of startup's
clears *by construction* rather than by timing — `Frontend::new` clears
before any frame exists, and the first frame is itself a resync whose
clear precedes its own spans — so no timing assumption survives in the
test at all. It is strictly stronger than what §5.2 asked for.
One further correction found by running it: the repaint-ordering
assertion must be scoped to **after the new clear**. The fixture
repeats its marker, so the suffix opens with the tail of startup's own
frame, and an unscoped comparison measures the clear against paints it
was never meant to precede.
### 5.2 PTY acceptance — as originally framed
`tests/common/pty.rs:42` exposes `resize(rows, cols)`, so the real `tests/common/pty.rs:42` exposes `resize(rows, cols)`, so the real
scenario is reachable: spawn pmacs, put distinctive content on screen, scenario is reachable: spawn pmacs, put distinctive content on screen,