From f486f00ec9ff3071beb7c82cc3108a39db38aade Mon Sep 17 00:00:00 2001 From: iris-ai <4+iris-ai@noreply.localhost> Date: Mon, 14 Sep 2026 20:29:55 -0400 Subject: [PATCH] Bring the state of #18 and what a frame is made of up to date Co-Authored-By: Claude Opus 5 --- docs/IRIS_EXTRACTION_HANDOFF.md | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/docs/IRIS_EXTRACTION_HANDOFF.md b/docs/IRIS_EXTRACTION_HANDOFF.md index aa2335f..e18625b 100644 --- a/docs/IRIS_EXTRACTION_HANDOFF.md +++ b/docs/IRIS_EXTRACTION_HANDOFF.md @@ -9,11 +9,15 @@ Canonical `main` is **`ca2b4b2`** (#17, the headless rig). Sixteen slices are in. **#18 `split/18-position-chain`** is open and finished apart from one decision: -worktree `/home/bob/repos/iris-pr18`, head `77bb75e`, twenty-two commits, -workspace tests passing, fmt and clippy clean. The last four are the text -shaping work, three retained-layout details that claimed something they did -not do, and the many-widgets-dirty cases. It is LAYOUT.md §2's position chain, generalised -to boxes. `/home/bob/repos/ai-app-2` is on `rustify`, worktree clean. +worktree `/home/bob/repos/iris-pr18`, head `3f7cd82`, twenty-four commits, +workspace tests passing, fmt and clippy clean. It is LAYOUT.md §2's position +chain, generalised to boxes. The last six are a performance pass that changes +no layout: the two halves of the text fix (`e5f8b6b`, `2525637`), three +retained-layout details that claimed something they did not do (`f1a47e9`), +the many-widgets-dirty cases (`77bb75e`), what the settle order is holding up +(`bf94380`), and carrying a widget's depth rather than walking for it +(`3f7cd82`). Every one of them keeps the five reference renders and the resize +render byte-identical, and the hundred-seed sweep passes. `/home/bob/repos/ai-app-2` is on `rustify`, worktree clean. **The one thing waiting on the owner.** `tabs` at 1920x1200 is no longer byte-identical to `upstream/main`: 1,283 pixels of 2.3M (0.06%), two @@ -464,6 +468,13 @@ rather than by length. Memoizing the depth walk within one scan does not pay to stop rescanning, which changes the order widgets settle in and is hers to agree first. +**What a frame is made of now**, `perf record` on the `many` phase at 130 of +260 dirty, which is the heaviest thing the rig has: `Layers::write` 16%, +parley's `break_all_lines` 15%, `Painter::glyphs` 14%, `InstanceList::push` 7%, +`LayerDraws::free` 6%, `draw_inner` 5.5%, choosing the next dirty widget 4.7%. +Four fifths of it is primitive bookkeeping, and none of that has had a pass. +That is where to look next rather than at the settle loop. + The remaining costs after this are: - **Writing a glyph instance per glyph per draw.** With shaping and placement