docs: the verification pass over Tasks A and B, and the composer background withdrawn

RUST.md gains the pass's findings with their commits and the numbers:
the block model held under a per-character prefix property, the
size-independent hit-box defect and its fix, the tail-rebuild selection
gap, why the three new debug_asserts are whole-set, the text-shape
counter that turns "a delta costs one block" into a measurement, and the
verification bench run.

IRIS_TODO.md's "the bar's own grey background is not drawn" is
withdrawn: decoding the screencap puts it at rgb(41,40,49), full width,
y2245..y2365 -- drawn, and dark on black, which is most likely what the
earlier reading was.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
irisandClaude Fable 5.1 committed 2026-09-06 18:40:25 -04:00
1 parent c3cfc67bb3
commit 6973a89815
2 files changed
+93 -4

No files matched your search

+83
View File
@@ -180,6 +180,89 @@ moves least, which is consistent -- a delta into a *short* message never
cost much. **The phone number is Iris's to take**; nothing here is a
statement about her device.
### Verification pass over Tasks A and B, 2026-09-06
Read of `git diff fb6b459..HEAD -- iris/ client-core/` against LAYOUT.md,
TEXTURES.md, IRIS.md/DECISIONS.md's 2026-09-06 entries and CODE_RULES.md,
with the emulator. **Verdict: deliverable to the phone.** One real defect
found and fixed, two missing guards added, one open item closed as stale.
1. **The block model is correct.** `split_blocks` was checked against the
shapes a real transcript has -- a fence with blank lines, a `---`
inside a fence, a nested list, a fence directly under a heading, a
table, a quote -- and against the property `apply_delta` rests on, at
**every character boundary** of a message containing all of them:
growing a message may rewrite its last block and never an earlier one,
or `common_prefix` says so. No defect (`client-core`'s
`every_prefix_of_a_streamed_message_keeps_all_but_its_last_block`,
commit `a56a928`). A delta closing a fence, a delta mid-word and a
stream ending inside an unterminated fence are each their own test.
2. **`iris/core/src/ui/render_state.rs`, `draw_inner`'s size-independent
fast path: fixed** (commit `e63e923`). It rewrites the widget's own
primitives in place and writes **no** move-slot delta, so unlike `mov`
there is nothing for `move_applied` to count; `167862c` counted one
anyway, and `resolved_region` then subtracted a distance the chain
never held. Every such widget's hit box sat short of its drawing by
its last step, with the drawing correct -- nothing on screen to say
so. `Span` reaches this on the **first frame** of any tree containing
a `Rect` (the `.background(rect(..))` idiom, list row tints), because
it measures each child at the full region and then places it. Pinned
by `a_size_independent_widget_moved_by_its_parent_has_the_hit_box_it_is_drawn_at`,
the sibling of `a_panned_widgets_own_hit_box_moves_exactly_once` on the
branch that fix had no reason to touch.
3. **Selection across blocks is sound; its rebuild path had no test**
(commit `155d899`). `SelKey = (RowKey, u32)` orders lexicographically,
which is reading order at both levels, so `begin`/`extend`/`locate`
and the range queries carry over unchanged; `selected_text` joining
with a blank line is right for blocks as well as rows, since that is
how markdown separates them. The gap was the tail rebuilt under the
**same key with fewer blocks** -- the dropped blocks keep pointing at
widgets `replace_back`'s drop frees, and `Selection::begin` resolves
every registered handle on an ordinary press, so the next tap anywhere
panics. `e1030d6`'s unconditional `unregister` is correct and now has
`a_tail_rebuilt_with_fewer_blocks_leaves_none_of_them_in_selection`,
confirmed to fail (3 blocks still registered, expected 1) without it.
`Selection::registered_blocks` is the test-only accessor that lets it
assert the contract rather than only that nothing panicked.
4. **The three new `debug_assert!`s are whole-set, not one member.**
`Len::fold_dp`'s is in `draw_inner` after *every* `Widget::draw`, so
it governs the set by construction; `Pad` and `Span` were checked and
already fold through `apply_rest`, and `Sized`/`MaxSize` are the two
that reported a caller-written `Len` raw. `own_mask`'s reuse lives
inside `Painter::set_mask` itself, whose only caller is
`widget/mask.rs`. `move_applied` has exactly two writers, `mov` and
`reposition` (now one, after finding 2), and `resolved_region` is the
only reader -- `window_region` goes through it.
5. **The O(last block) claim now holds for parley, by counter**
(commit `c3cfc67`). `take_counters` gained a fourth number, text
shapes, bumped in `Painter::render_text` -- which `TextView::render`
only reaches on a cache miss, so it counts shapes and not requests. A
draw counter cannot stand in for it either way. Measured: **one delta
into a 100-paragraph reply shapes exactly 1 text layout, the same as
into a one-paragraph reply.**
6. **The composer bar's grey background *is* drawn** -- IRIS_TODO.md's
"still open, and pre-existing" note is stale and has been corrected.
Measured by decoding the screencap rather than eyeballing it: the bar
is `rgb(41,40,49)` (the declared `40,40,46` after sRGB rounding),
**full width, y2245..y2365** on the 1080x2424 AVD, with the field at
`31,2277..1048,2329` and the 63px nav strip below. Whatever the note
saw, Task A's `MaxSize`/`own_mask` fixes closed it.
**Checks run**: `cargo fmt --all --check` clean in both workspaces;
`cargo clippy --workspace --all-targets` warning-free (only the
pre-existing future-incompat note about `wgpu`/`naga`/`winit`);
`cargo test` 81 (iris) + 13 (iris-core) + 20 (transcript-ui) + 123
(client-core), all passing. One bench run on this checkout's AVD with the
assertions live, debug x86_64 `force-gles`, no abort and nothing in
logcat: **stream: 298 frames over 21.0s, late 287 (96.3%), p50 52.8ms,
p90 108.1ms, p99 137.3ms, worst 148.9ms** -- reproducing the "after"
column above.
- [x] **Merge the `DragGesture` work** -- done 2026-09-06 (merge commit
`f802de9`, `git merge --no-ff worktree-agent-a754368325fa06839`,