Files
ai-app/docs/HANDOFF.md
T
iris-aiandClaude Opus 5 67584cedda Record what the review of Iris #19 found
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>
2026-09-19 07:20:59 -04:00

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

  1. 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 collapsed leftover child, and a reused child keeps the mask its parent replaced. Both are live at cadfba0 and neither has a test.
  2. Bryan's review of #19. Fixes to it are unreviewed code: repeat the pre-submit-review passes over whatever each round changes, and re-run the three fuzzers and the dump diff for anything that touches Span, Painter or render_state.
  3. The app's Iris pin, once #19 lands. It is still on the old submodule commit, and the branch changes API the app uses: SizeRule beside a widget rather than a wrapper, alignment as a widget property, rest renamed to leftover, OrthoSize gone.
  4. 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.md under "Rendering the grid (pending)".

Smaller layout items, none urgent

  • Nested spans pass leftover weight 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::div by zero answers MIN/MAX while ratio answers ZERO; both are caller bugs under debug_assert, but the fallbacks differ.
  • The comment on the local == UiRegion::FULL shortcut in widget_at says composing through FULL "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 name Painter::place, SetSize, desired_width, apply_rest, Len::dp, Aligned and MaxSize, none of which exist. Do not restore OnResize::Translate or OrthoSize.
  • LazySpan, then SizeRule::{Min, Max, Clamp}. A cap may not contain leftover; whether Max narrows the child's drawing box is a product decision.
  • Scroll taking 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.