Two live defects at cadfba0, each with the repro that showed it and the fix that answered it: a span places the slot after a collapsed leftover child a gap early and a gap too long, and a child reused under a parent that redrew keeps the mask index that parent replaced, so its drawing is clipped where the subtree used to be. Neither is covered by a test, which is why the suite is green over both. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
4.2 KiB
Handoff
Where the work in flight stands. The durable layout design and the
measurement method are in docs/LAYOUT.md; what the review of #19 found is
in docs/LAYOUT_LOG.md.
The Iris layout repair is submitted
Iris PR #19 (layout/one-ask at cadfba0, 123 commits over upstream
main at ca2b4b2) is open and waiting on Bryan. It replaces #18, which
is closed and whose branch split/18-position-chain stays as the reviewed
baseline the newer work was measured against. Bryan decided on 2026-09-19
that the experiment replaces it, because it is more performant where it
matters.
The checkout is /home/bob/repos/iris-layout-experiment, on branch
wip/hint-first, which is the same commit as layout/one-ask. Both are
pushed to origin (iris-ai/iris). What the branch does and what it leaves
undone is in the PR description; the settled protocol is in docs/LAYOUT.md
under "Frames, decided boxes and padding".
Verification at cadfba0, all run in this checkout:
| check | result |
|---|---|
cargo fmt --all --check, clippy -D warnings, with and without layout-diagnostics |
clean |
cargo test --workspace |
123 suite, 20 core, 11 generated, green |
cargo test --release --test generated |
11/11 |
| shrinker, 400 seeds, depth 5, sixteen cases | agree, 60 s |
| 1000 seeds at depth 6 | agree, 177 s |
| 2000-seed depth-4 scan, sixteen cases | agree, 295 s (82,203 widgets) |
cold dump of 400 trees at depth 5, diffed against f6242aa |
identical, 34,488 widget boxes |
| counters, seeds 1 and 13 at depth 8 | unchanged from f6242aa (the table is in docs/LAYOUT.md) |
five renders, the tabs replay, a live resize against a cold render |
all byte-identical to a888717 |
The renderer was Vulkan on the host's RX 7900 XT: src/default/render.rs
asks for Backends::PRIMARY and .expect()s the adapter, so a PNG at all
means it was not the software fallback.
What is next, in order
- The two defects the review of #19 found, written up with their
repros and fixes in
docs/LAYOUT_LOG.md: a span misplaces the slot after a collapsedleftoverchild, and a reused child keeps the mask its parent replaced. Both are live atcadfba0and neither has a test. - Bryan's review of #19. Fixes to it are unreviewed code: repeat the
pre-submit-reviewpasses over whatever each round changes, and re-run the three fuzzers and the dump diff for anything that touchesSpan,Painterorrender_state. - The app's Iris pin, once #19 lands. It is still on the old submodule
commit, and the branch changes API the app uses:
SizeRulebeside a widget rather than a wrapper, alignment as a widget property,restrenamed toleftover,OrthoSizegone. - Round-to-nearest, CPU and shader together as one verified change.
Bryan approved it on 2026-09-17 and neither half has landed; the
derivation, the form to use and what to re-check are in
docs/LAYOUT.mdunder "Rendering the grid (pending)".
Smaller layout items, none urgent
- Nested spans pass
leftoverweight up, so three leftover children in one inner span beside one in another get three quarters to one quarter. No other layout system does that; confirm it is wanted. - A span can overflow itself without bound, so boxes of negative length reach children and nothing states what a widget may assume about one.
Fixed::divby zero answersMIN/MAXwhileratioanswersZERO; both are caller bugs underdebug_assert, but the fallbacks differ.- The comment on the
local == UiRegion::FULLshortcut inwidget_atsays composing throughFULL"is not quite the identity in f32"; on the grid it is exact and the shortcut is performance only. docs/LAYOUT.md§4, §5 and the density section namePainter::place,SetSize,desired_width,apply_rest,Len::dp,AlignedandMaxSize, none of which exist. Do not restoreOnResize::TranslateorOrthoSize.LazySpan, thenSizeRule::{Min, Max, Clamp}. A cap may not containleftover; whetherMaxnarrows the child's drawing box is a product decision.Scrolltaking a direction rather than one axis.
Other product work is in docs/PLAN.md and the focused documents it links.
Do not mix it into the Iris layout branch.