Files
ARCADIA-Studio/harness/experiments/canvas-editing-followup-20260912/activation-label-paint-independent-review.md
T

4.4 KiB
Raw Blame History

Independent paint-repair review — 2026-09-12

Reviewed root commit d61f1f3877, integrating worker d50be10378e90498c2d4c293b377dd9f97ee00af, against419c78c. Read the handoff and both changed files, surrounding Scene painter/hit logic, mounted renderer construction and installed WGPU screenshot contract. Visually inspected the preserved native witness .local/native-qa/canvas-followup-20260912-01/evidence/oa-outer-activation-selected-0.png. No compiler/test/UI/Gitea action or code edit. This report is the sole reviewer-written artifact.

No actionable source defect found in the bounded repair. The changes address the observed backplate erasure and corresponding shoulder hit priority. Current combined test/native acceptance remains root-owned; this review does not establish a pass.

Painter and hit behavior

crates/oa-desktop/src/behavior.rs:1984–1995 moves all label backgrounds after guides but before activation and card fills/strokes. Message paths, arrowheads and shortened text remain afterward at2039–2084, with card/header text later. This removes the specific white bands visible above C2/R2/R1 in the native witness without repainting filled activations over anchored message ends.

The order also preserves self-loop geometry: every background now precedes every message path, so a later message's white mask cannot erase an earlier self-loop arm or arrowhead. Boxes/header fills still cover backgrounds, and their text stays above message backgrounds. The repair changes no geometry or endpoint correlation. Existing card/message overlap policy is unchanged apart from lowering white masks.

At behavior.rs:1611–1663, titled boxes retain first priority. Exact message segments retain priority over activation rectangles; activations now precede approximate label rectangles, which in turn precede broad message tolerance. This matches the targeted exposed shoulder: the old overly wide label rectangle no longer steals it. Message text outside bars remains selectable, while exact endpoints still select their messages. The fixed1.5 world-unit precise tolerance and broad8/scale tolerance are pre-existing policies, not new focus/hit semantics introduced by this repair.

The OA/SA shoulder test at behavior/scenario_activation/tests.rs:130 establishes that each selected point is inside both the outer bar and old white mask, and outside even the broad message-line tolerance. It also checks label selection outside activations and both endpoints of all four occurrences. Those are discriminating checks of the intended priority change, without conflating a shoulder with an actual message line.

Pixel evaluator adequacy

The test at scenario_activation/tests.rs:162 draws the production Canvas/Scene through the existing WGPU headless renderer, then reads actual screenshot pixels. Installed iced_wgpu-0.14.0/src/lib.rs:182 explicitly documents RGBA bytes, consistent with the test indexing.

For its two-lane fixture, lane x coordinates are160 and400. The selected outer left border is394; tested label masks start around172 and extend to397. Thus the entire sampled x392…396 strip lies under the old backplate, rather than accidentally sampling an uncovered border outside it. The y samples are label+3…19, several pixels above the message at label+26 and its arrowhead. Only the outer call is selected/teal; inner messages/bars, guides and their labels are gray. A gray glyph or inner border is therefore not a credible source of teal matching at every one of17 rows in each of three bands.

The original ordering is source-predicted to erase those sampled pixels, while the new ordering should restore selected-border continuity. This is stronger than inspecting a fabricated paint-order list or accepting “any colored pixel” in a large area. No pre-repair negative-control execution was performed by this reviewer, and antialiasing/color tolerance still needs the actual root gate result.

Its scope is intentionally narrow: ordinary scale, selected OA outer bar, three white-mask intersections, and actual painter output. It does not measure unselected pale contrast, all self-loop/arrowhead pixels, minimum-scale usability, text collisions or a complete native window. Existing geometry tests plus the root's same-source native bound OA/SA/reentrant/header/self-loop checks remain necessary. Peer lifecycle integration and palette improvements remain separate work.