Trace the scroll circularity to apply_leftover rather than the protocol

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
iris-aiandClaude Fable 5.1 committed 2026-09-18 13:25:14 -04:00
1 parent b2484b900e
commit bdddb610c0
1 file changed
+15 -8
+15 -8
View File
@@ -457,14 +457,21 @@ today fails in three widgets and is fixable locally in each:
- `Branch` reads `extent_len(Y)` for "the rest of my box"; that is
`Of(40px..FULL)`.
`Scroll` is the one legitimate own-answer box left. With the gate gone its
content box lays the row out afresh, the text takes the room the leftover
child gave back, and `content_len` from the viewport measurement is stale by
that difference; it is deterministic on both paths, so warm equals cold, but
the scroll range is off in the circular case. That case (a wrapping text
beside a `leftover` child in a horizontally scrolling row) needs its own
decision; Compose gives the text an unbounded width there. None of this was
run; it is what the traces and the two experiments point at.
`Scroll` looked like the one legitimate own-answer box left, and on a
closer read (planning pass, later the same day) its circularity is
`Scroll`'s own doing rather than the protocol's. It resolves the content
length with `apply_leftover`, which turns any `leftover` in the answer into a
*whole extra viewport on top of the pixels*: a row reporting `600 px +
leftover` in a 900 px viewport gets a 1500 px content box, so the wrapping
text inside is offered 900 px more room than it was measured in and
re-wraps, and the layout drifts one iteration per evaluation. Under Bryan's
definition a share is the room left in the deciding box, so the content
length should be `max(viewport, px + rel·viewport)`: 900 for that row, the
rect takes the 300 px left, nothing scrolls, and the row's box in the
content box offers every child the room it was measured in. With that the
content box never re-offers room, `Scroll` needs no own-answer evaluation,
and the "return the answer from the first box" rule (seed 86) has nothing
left to guard. Proposed, not run.
**Question 2, `Pad`.** Answered by the decision above that a share narrows
the frame: the overflow in the example comes from the pad sitting in a