diff --git a/docs/IRIS_EXTRACTION_HANDOFF.md b/docs/IRIS_EXTRACTION_HANDOFF.md index 52b2f56..c4c7e4b 100644 --- a/docs/IRIS_EXTRACTION_HANDOFF.md +++ b/docs/IRIS_EXTRACTION_HANDOFF.md @@ -5,19 +5,21 @@ Not a decisions log; delete it when the extraction is done. ## Where things stand -Canonical `main` is **`00d2230`** (#13, wgpu 30). Eleven slices are in; two -pull requests are open and both are waiting on the owner, not on me: +Canonical `main` is **`32b1038`** (#14, SetSize). Twelve slices are in. One +pull request is open and one branch is pushed but unopened: - **#12** `split/12-pointer-routing`, worktree `/home/bob/repos/iris-pr12`, - head `71ba372`. A widget takes only the input it answers to, and only where - the cursor is. Self-reviewed under the process below, which found two - defects: consumption decided once a frame rather than per input kind, and a - press firing on a widget the cursor had just left. Six tests across layers; - three of them fail on `main`. -- **#14** `split/14-setsize`, worktree `/home/bob/repos/iris-pr14`, head - `f312db6`. The `Sized` widget becomes `SetSize`, so the prelude stops - shadowing the marker trait and `?Sized` resolves again in any crate that - imports it. `tests/prelude_bounds.rs` fails to compile if that comes back. + head `f3fd941`. Reworked after the owner's review rejected the design: a + layer, not a widget, is what consumes input. `CursorSenses::consumes` + decides only whether a layer stops the input reaching the one below, taking + nothing out of the cursor, and senses on one layer never block each other. + Five tests; two fail on `main`. One question is out to her in the reply: + whether a widget the cursor has left should still be handed a press. +- **`split/15-harness`**, worktree `/home/bob/repos/iris-pr15`, head + `d5efdd2`, pushed with no pull request opened. `Tasks` takes an + `Arc` instead of an `Arc`, so `DefaultRsc` builds + without one, and `iris::harness` drives a ui with no surface. Six tests in + `tests/harness.rs`. Open it when #12 clears. Check for a review before starting anything, and read the newest `submitted_at` rather than the first result: @@ -71,23 +73,29 @@ Other standing instructions from the owner: - Pull Iris out even if the Rust application switchover is not accepted. No app, session, transcript, setup or server concepts in Iris; the dependency runs one way from `app/` to Iris. -- **Small, coherent PRs.** The original extraction PR was too large to review. - A slice may be redone rather than transplanted, and need not remove every old - feature. Independent PRs may be open at once so work continues during review. +- **Small, coherent PRs, one at a time.** The original extraction PR was too + large to review. A slice may be redone rather than transplanted, and need not + remove every old feature. Do not open several at once to stay busy during a + review: on 2026-09-13 the owner asked for the work to go serially, most + fundamental first, so that code is written once against the version of the + framework that will actually exist. - Do not recreate an `ai` branch in canonical Iris; the fork is the boundary. - **Never rewrite a pushed branch.** Follow review with additive commits, and merge `upstream/main` in rather than rebasing when a branch falls behind. - Respond to each review finding with a fix or a concise explanation. Do not add a ceremonial comment when the changed code already answers it. +- **A test has to guard something that could break again.** The owner deleted + #14's test as pointless: the rename it guarded cannot regress. When a fix is + structural, the structure is the test. ## The next slice -**The headless rig and the test harness.** `scripts/run-headless.sh`, -`headless.conf`, `rig-input` and `iris::harness` live in ai-app's iris -submodule and not in canonical Iris. Until they are extracted, Iris can only -be tested by what runs without a window, and every rendering claim is verified -by hand from another checkout. Extracting them is what lets later slices -arrive with tests instead of screenshots. Nothing else is claimed. +**The headless rig.** `scripts/run-headless.sh`, `headless.conf` and +`rig-input` are still only in ai-app's iris submodule, so every rendering +claim in canonical Iris is verified by hand from another checkout. The harness +half of this is done in `split/15-harness`; the rig is shell and a Wayland +replay binary and transplants nearly as-is, minus the `--phone` and `--dir` +flags' ai-app specifics. Still in the target, roughly in dependency order: @@ -95,9 +103,9 @@ Still in the target, roughly in dependency order: (308 lines to 2313), plus `core/src/event/controller.rs`, `desktop/input.rs`, `android/input.rs` and `sense_tests.rs`: pointer capture, drag slop and axis, platform cancellation, mask-aware hit testing, event timestamps. It replaces - the file #12 fixes, and **the archived copy carries the same per-frame - consumption defect #12 removes** — extracting it as-is brings the bug back, - so `tests/pointer_routing.rs` is the acceptance criterion for that slice. + the file #12 fixes. The archive's own `consumes` is what #12 now implements, + so that part transplants; `tests/pointer_routing.rs` is the acceptance + criterion for the slice. - Widget draw size and measurement cleanup (source commit `6671194`). - Retained span, scrolling and layout placement. - Retained paints, selection, overlays and shared UI runtime state. @@ -262,5 +270,6 @@ argument for doing it next. | #10 | Text layout and rendering on Parley (`0f6a28b`) | | #11 | Atlas as an array texture, and the primitive rendering overhaul (`b234497`) | | #13 | Build on wgpu 30 (`00d2230`) | +| #14 | Rename the `Sized` widget to `SetSize` (`32b1038`) | URLs are `https://git.arirex.me/iris/iris/pulls/{number}`.