Record the round's last two findings, and the review the old code is owed

`pre-submit-review` arrived after the Rust port and most of Iris were
written, so all of that went in unreviewed and no sweep has covered it. The
surface-texture defect is the argument for a pass of its own.

Nothing in Iris is kept for the app's sake either: the app is to be rewritten
against the new API rather than ported call by call.
This commit is contained in:
iris-ai committed 2026-09-20 01:32:01 -04:00
1 parent 718923c217
commit 734c521f5d
2 files changed
+47 -23

No files matched your search

+19 -9
View File
@@ -6,7 +6,7 @@ found is in `docs/LAYOUT_LOG.md`.
## The Iris layout repair is submitted
**Iris PR #19** (`layout/one-ask`) replaces closed #18. The tip is `7502176`,
**Iris PR #19** (`layout/one-ask`) replaces closed #18. The tip is `1096c31`,
and past the reviewed `cadfba0` it is seven rounds, each described in
`docs/LAYOUT_LOG.md`:
@@ -24,9 +24,10 @@ and past the reviewed `cadfba0` it is seven rounds, each described in
read, three reuse rejections the diagnostics could not see, and a fuzz case
that ran only in the long scan.
- **A sweep over the renderer, the text store and the retained path**,
`d8d5122` through `7502176` -- a contract kept where the new window left
`d8d5122` through `1096c31` -- a contract kept where the new window left
it out, a surface configured under its own texture, a counter naming the
wrong contract, and three things nothing reads.
wrong contract, things nothing reads, and a question asked through a value
rather than a reference.
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
@@ -61,14 +62,23 @@ a compile error, which reads exactly like a fuzzer failure.
`pre-submit-review` over each round's changes, and apply the gate above to
whatever each one touched. The ordinary oracle does not replace absolute
geometry and retained-primitive expectations.
2. **Integrate the app's Iris capabilities before changing its pin.**
2. **A review of everything written before the review gate existed.**
`pre-submit-review` and the rule that nothing is submitted unreviewed
arrived on 2026-09-13, well after the Rust port and most of Iris were
written, so all of that code went in unreviewed and none of the five
sweeps above covered more than the layout branch. It wants a pass of its
own (Bryan, 2026-09-20). The surface-texture defect in `02048ea` is the
argument: nothing about that arm was hard, and it was written wrong
anyway, which is what a first reader catches and a later sweep of some
other subject does not.
3. **Integrate the app's Iris capabilities before changing its pin.**
`32f6ad8` has 45 commits not reachable from the review branch; shared UI
ownership, richer masks, Android support, and app-side performance work
must survive the integration. The app then absorbs the branch's
vocabulary and container API, all of it already upstream: `rest` ->
`leftover`, `SizeRule` beside widgets, alignment properties, the removal
of `OrthoSize`, region/placement/rel_base, and `PlaceDesc`.
3. **Round-to-nearest**, CPU and shader together as one verified change.
must survive the integration. What has to survive is those capabilities,
not the calls the app makes today: the app is to be largely rewritten
against the new API rather than ported call by call, so nothing in Iris
is kept alive for the app's sake (Bryan, 2026-09-20).
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)".
+28 -14
View File
@@ -10,9 +10,10 @@ the current plan is in `docs/HANDOFF.md`.
Over the parts the four earlier rounds did not read -- the renderer, the
text store, the input default, the harness -- and once more over `redraw`.
Four findings, `d8d5122` through `7502176`. The cold dump is byte-identical
to `781199a` and all three seed scans pass (400 at depth 5 in 69.45s, 1,000
at depth 6 in 214.69s, 2,000 at depth 4 in 419.50s).
Six findings, `d8d5122` through `1096c31`, the last two from Bryan's reading
of the first four. The cold dump is byte-identical to `781199a` and all three
seed scans pass (400 at depth 5 in 69.45s, 1,000 at depth 6 in 214.69s, 2,000
at depth 4 in 419.50s).
**A contract was kept where it no longer held** (`d8d5122`). The sibling of
`713e3e7`, in the same function. `redraw` keeps the narrower of the old and
@@ -37,6 +38,10 @@ the swapchain. The texture is good for that frame, so it is drawn with and
presented and the rebuild happens after `present` consumes it. Not
reproducible on demand here; the claim rests on wgpu's own documented panic.
This one is the reason for the sweep recorded under "The code written before
the review gate" below: nothing about the arm was hard, and it was written
that way anyway.
**A counter named the wrong contract** (`9b4cc32`). `AxisHolds` is four
contracts and `diag::outside` counted three: a refusal because this window
is outside the range the drawing was made for bumped "reuse outside: a rel
@@ -44,20 +49,29 @@ base". A window range is pixels and a rel base pin is a window-unit length an
unchanged window can still change, so the rig answered "why did that
redraw?" with the wrong one for every resize. Same class as `8088a1f`.
**Three things nothing reads** (`7502176`). `Axis::pair` and
`RegionAlign::NEAR` arrived on this branch with no caller and never got one;
`Holds::contains` took `&self` where its five siblings on the same `Copy`
pair take `self`. The comment beside a span's cross-axis accumulator said a
scalable child "makes Children scalable too" -- `Children` names nothing in
this repository, and what it makes scalable is the span.
**Things nothing reads** (`7502176`, `1096c31`). `Axis::pair`,
`RegionAlign::NEAR` and `Painter::text_data` arrived on this branch with no
caller and never got one. The comment beside a span's cross-axis accumulator
said a scalable child "makes Children scalable too" -- `Children` names
nothing in this repository, and what it makes scalable is the span.
`text_data` was held back a round on the grounds that it is the only way a
widget inside `draw` can reach `TextData`, and the app's integration might
want it. That reasoning is wrong: nothing in iris is kept for the app's sake,
because the app is to be largely rewritten against this API rather than
ported call by call (Bryan, 2026-09-20).
**A question asked through a value** (`445287c`). `7502176` moved
`Holds::contains` from `&self` to `self` to match its five siblings, which
was the wrong way to reconcile them. A method taking `self` can only be
called on a value, so a caller holding a reference has to dereference to ask
-- `Copy` or not (Bryan, 2026-09-20). Every method that answers a question
about a value now takes `&self`: `Holds`, `AxisHolds` and `LayoutHolds`
throughout, `LayoutLen::{is_px, is_only_leftover, declared, fills}` and
`Size::within_box`. Builders that return a changed copy still take `self`.
### Tripped a rule and left as it stands
- `Painter::text_data` has no caller either, and is the only way a widget in
`draw` can reach `TextData` at all (`painter.rsc` is private). It replaces
`main`'s `text_resources`, which the app does not call today but which the
pending integration may want. Deleting a framework's one escape hatch to
the text store while the app is still on the old pin is not a sweep's call.
- `TextData`'s spare store clones the whole string into `Placed` on every
re-break. Bounded at 128 entries, but the clone is per re-break and
proportional to the text; a transcript-sized text would pay it on every