Record the quality sweep and point the handoff at 69ba915

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
iris-aiandClaude Opus 5 committed 2026-09-20 00:21:13 -04:00
1 parent 362191c3f3
commit 03c8933612
2 files changed
+72 -2

No files matched your search

+6 -2
View File
@@ -6,8 +6,8 @@ found is in `docs/LAYOUT_LOG.md`.
## The Iris layout repair is submitted ## The Iris layout repair is submitted
**Iris PR #19** (`layout/one-ask`) replaces closed #18. The tip is `1ebd4d3`, **Iris PR #19** (`layout/one-ask`) replaces closed #18. The tip is `69ba915`,
and past the reviewed `cadfba0` it is five rounds, each described in and past the reviewed `cadfba0` it is six rounds, each described in
`docs/LAYOUT_LOG.md`: `docs/LAYOUT_LOG.md`:
- **The repair**, `add6774` and `84dad21` -- collapsed-share placement, - **The repair**, `add6774` and `84dad21` -- collapsed-share placement,
@@ -19,6 +19,10 @@ and past the reviewed `cadfba0` it is five rounds, each described in
- **A clarity sweep**, `3da1c71` through `1ebd4d3` -- naming the pairs layout - **A clarity sweep**, `3da1c71` through `1ebd4d3` -- naming the pairs layout
returns, `Span::slot`, a diagnostic that printed the rel base while calling returns, `Span::slot`, a diagnostic that printed the rel base while calling
it the box, and `in_parent` matching a place's own cases. it the box, and `in_parent` matching a place's own cases.
- **A quality sweep**, `aea0387` through `69ba915` -- a kept contract judged
against the placed box rather than the box asked about, two things nothing
read, three reuse rejections the diagnostics could not see, and a fuzz case
that ran only in the long scan.
The settled design of the last three is in `docs/LAYOUT.md` under "Three The settled design of the last three is in `docs/LAYOUT.md` under "Three
names, and the one argument that says them". Bryan settled the API over names, and the one argument that says them". Bryan settled the API over
+66
View File
@@ -6,6 +6,72 @@ nothing here is rediscovered. Each entry says who found it and when.
it (settled design, the measurement method) belongs in `docs/LAYOUT.md`, and it (settled design, the measurement method) belongs in `docs/LAYOUT.md`, and
the current plan is in `docs/HANDOFF.md`. the current plan is in `docs/HANDOFF.md`.
## Quality sweep of the whole branch (2026-09-20)
A fourth sweep, over the layout core, the arithmetic, the atlas, the sensor
walk and the fuzz rig rather than over naming. Four findings, all on
`layout/one-ask` past `1ebd4d3`; the cold dump is byte-identical to it and
all three seed scans pass (400 at depth 5 in 65.09s, 1,000 at depth 6 in
161.27s, 2,000 at depth 4 in 301.90s).
**A kept contract was judged against the wrong box** (`713e3e7`). `redraw`
keeps the narrower guarantee a parent holds when the fresh drawing covers
it, so widening and narrowing back do not churn the parent. It asked
`was_holds.contains(.., active.placement)` -- where the answer put the
drawing -- when `holds` is about `active.region`, the box the drawing was
made in. The two differ on every axis a widget reported less than it was
offered, so such a widget marked its parent every time its contract
widened. Cost, not geometry: accepting is always safe, since `region` is
always inside the old range, so refusing only escalates. `resize` and
`try_reuse` both already ask about `region`.
`widening_what_a_drawing_holds_for_does_not_relay_out_the_parent` fails at
`1ebd4d3` and passes with the line changed; the existing
`widening_and_restoring_a_contract_does_not_invalidate_its_reader` cannot
see it, because its leaf reports `LEFTOVER`, which fills its box.
**Two things nothing read** (`aea0387`). `ActiveData::size_deps` was written
on every draw and cleared on every undraw, and read nowhere -- a `Vec` per
active widget. The `Painter`'s own copy is the live one, used in `draw_at`
to record whoever asked about a child it did not draw. `SizeRule::apply`
had no caller and would have been wrong with one: it answers the rule's own
length where `draw_at` resolves a fraction against the rel base first.
**Three reuse rejections said nothing** (`8088a1f`). Of the eight
rejections in `try_reuse`, a changed inherited mask counted and traced
nothing, an undrawn record traced without counting, and a changed
region-node choice counted without tracing. The mask one is what this
branch's repair was about, so the rig could not answer "why did that
redraw?" for it. Adding a counter meant editing a variant list and a name
list at the same index; they are one declaration now.
**A fuzz case ran only in the long scan** (`69ba915`). `Case::SizeResize`
was in `ALL` and in none of `generated.rs`'s `case!` invocations, so the
size-then-resize order -- which the enum's own comment argues is not the
same test as the other order -- was never checked by `cargo test`. The
tests and the list of which cases have one come from one macro invocation,
and a case missing from it now fails a test.
### Tripped a rule and left as it stands
- `Span` reads every child's cross length through `place_at(..).len(!axis)`
even where `has_exact_size(!axis)` makes it moot. The read looks like an
unwanted dependency, but `depend_on` only matters for a child that is not
in `children`, which is how `undraw` keeps a measured-then-dropped child
reachable. For a placed child it does nothing.
- `PixelRegion::contains` is inclusive at both ends, so two adjacent
widgets both claim the boundary step. Senses on one layer never block
each other, so both receiving it is what the design says.
- `CursorData::sense` is meaningless until `should_run` fills it, which the
code says in place and proposes a prepare stage for. A real
unrepresentable-state finding, but it is the event API's shape rather
than this branch's.
- `Wrapper` with no child answers `Size::default()`, which is `LEFTOVER`.
It reads as "nothing" but matches `impl Widget for ()`, whose comment
says a gap takes the default length so a span gives it a share.
- `ALL` in `tests/scenario/mod.rs` is still a hand-kept list of every
`Case`; `Case::name`'s match is the compiler-checked one. A variant left
out of `ALL` is invisible to the shrinker's `--case` selection too.
## Naming and logic sweep (2026-09-19) ## Naming and logic sweep (2026-09-19)
Settled with Bryan across one session, on the branch past `58ce74d`. Nothing Settled with Bryan across one session, on the branch past `58ce74d`. Nothing