From 265ce6f82984976916cbb00603932f787b152b30 Mon Sep 17 00:00:00 2001 From: iris-ai <4+iris-ai@noreply.localhost> Date: Sat, 19 Sep 2026 17:59:40 -0400 Subject: [PATCH] Record the PlaceDesc argument in the handoff --- docs/HANDOFF.md | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 1e5dff4..1c8ca33 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -6,11 +6,11 @@ in `docs/LAYOUT_LOG.md`. ## The Iris layout repair is submitted -**Iris PR #19** (`layout/one-ask`) replaces closed #18. The tip is `c55be21`: +**Iris PR #19** (`layout/one-ask`) replaces closed #18. The tip is `58ce74d`: `add6774` fixes collapsed-share placement, retained mask ownership and a redraw-on-reparent defect, `84dad21` removes repeated work in the test -harness, and `5642f20` through `c55be21` are the vocabulary and API -work below. +harness, and `5642f20` through `58ce74d` are the vocabulary and API work +below. The core design remains sound; round-to-nearest is still unchanged. Two checkouts share one Git storage. `/home/bob/repos/iris` is the active @@ -44,19 +44,25 @@ itself. Three names, and only two of them are boxes: `aeb60e5` also cut what a container has to say, since correctness and cost had been paid for and ergonomics had not: -- `Painter::widget_within(id, region)` takes a box in the widget's own - coordinates and derives the child's rel base from it, so `Pad` and - `Offset` are one call each. `Offset` had been reading `region_len`, which - pinned its drawing to a box length an offset does not depend on. -- `Painter::place_at` takes the rel base, returns the answer, and draws the - child where there is no answer to re-express. `Span`'s second pass is one - call, and its `drawn_across` bookkeeping is gone. -- The rel base a container decides for a child is `narrow_rel_base`, and it - takes `impl Into; 2]>>`, so one that narrows nothing - writes `None`. The resolved value stays the bare `rel_base`. -- `Part::All` is a `Part::WHOLE` constant rather than a variant. It was - exactly `Of(UiSpan::FULL)`; measured at 0.07% of instructions retired - against 0.04% run-to-run noise on a 60-seed depth-5 shrink. +- **One argument says where a child goes.** `widget_at` and `place_at` take + `impl Into`, so a wrapper passes a `UiRegion` and says nothing + else -- `Pad` and `Offset` are one call each. `Place` and `Part` are gone: + `Place` was a product written as a sum, and `Part`'s three cases named + operations the geometry already had (`UiSpan::within`, `UiSpan::shift`, + and `placement`'s own body). +- **`PlaceDescAxis` is named after the operation**: `within`, `shifted`, + `sized`, `WHOLE`, with `fills` and `rel_base` as builders. The rel base a + caller does not state follows the constructor -- `within` narrows it, + `shifted` passes it through, `sized` is it -- which removes the one rule a + caller could get wrong with nothing failing. +- **`PlaceDesc` is a proper pair**, with `x`/`y`, `axis`, `axis_mut` and + `from_axis` like every other pair here, so joint work is written once + rather than per axis. +- `Painter::place_at` returns the answer and draws the child where there is + no answer to re-express, so `Span`'s second pass is one call and its + `drawn_across` bookkeeping is gone. +- `widget_within` and `ActiveData::narrow_rel_base` are deleted; `asked` and + `placed` carry the rel base their ask stated. Cold layout is byte-identical to `84dad21` across all of it, over 400 depth-5 trees.