Files
ARCADIA-Studio/harness/experiments/palette-readability-20260913/palette-canvas-handoff-20260913.md
T

42 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Essential canvas palette consumers — source-only handoff
Commit **`092f5244b9264b53bccea884a1a4fe9d860f2ad2`**, branch `codex/palette-canvas-956atf-20260913`, isolated worktree `.local/palette-canvas-20260913`, base **`aadc6396d39ff336d05381d58d545093d3f37a73`**. The worktree is clean. Root owns #26, synthesis, integration, compiler/native gates and Gitea. Only the four delegated source files changed; no root tracked files or other workers' files were edited.
Read the palette audit and independent critique before editing. This patch implements essential boundary consumers and the selected state-row cue. As explicitly agreed by root during this task, the architecture warning cue remains a proposal below; existing warning color and “amber line” guidance stay coherent and unchanged.
## Implemented sites
- `behavior.rs:2077,2094`: unselected typed activation borders, participant/action cards, fragment/branch outlines use `style::BOUNDARY` instead of decorative LINE. Existing fills, widths, painter order, message/arrow/label order, typed geometry and hit priority are unchanged.
- `diagram.rs:1176,1602`: ordinary architecture edge color `#909EAD` and unselected architecture node/container boundaries now use BOUNDARY. Selected/category/trace/warning paths retain their existing roles. Grid dots remain LINE. No path, port, arrowhead, label bounds, dash pattern or selection handle changes.
- `behavior/scenario_lifecycle/render.rs:243,245,265`: editing guides use TEAL when selected and BOUNDARY otherwise; definite lifetime lines use the same roles. The previously very pale dotted guide must remain findable in absent/unresolved intervals. Its dotted 1-unit geometry remains distinct from the solid 2-unit Alive interval; '?' and the existing legend remain intact. Capsule/X painting, clipping, hits and lifetime semantics are unchanged.
- `behavior/state_canvas.rs:1517,1533,1568`: selected StateAction and internal-transition relation rows retain their existing fill and gain an inset 1.5-unit TEAL rectangle. This supplies a visible shape change when hue is lost. The outline stays within the existing row, away from text and separator; row dimensions, layout, ordering, relation identity and hit bounds do not change. A defensive guard skips the outline for a row no larger than two units, avoiding negative rectangle dimensions for minimum/degenerate geometry. Existing state node outlines already use INK/TEAL; their header and guidance dividers remain LINE.
**Dependency:** the separate foundation worker must supply `pub const BOUNDARY: iced::Color` in `style.rs`. It is intentionally not defined or copied into this worktree. The isolated commit alone is not claimed to compile; combine with the reviewed foundation first. All other colors remain the existing style roles or existing fills.
## Verification and acceptance limits
Executed standalone rustfmt with edition 2024 and `skip_children=true`, Git whitespace/diff checks, exact four-file ownership review and commit/status checks. No Cargo, rustc, tests, app launch/input, screenshots or Gitea writes. No test source was changed or removed; no mirror-of-implementation unit tests were added for the simple paint-role substitutions.
Root should retain the existing activation WGPU continuity, shoulder/endpoint selection and lifecycle marker/clip tests. State regressions include `typed_state_actions_are_named_selectable_rows_before_internal_transitions_and_regions`, `internal_rows_and_pseudostate_hits_use_shared_persisted_geometry`, and selected-endpoint reconnect tests. Diagram route/pin/label/port handles and source/SVG geometry checks should remain unchanged. All are **unrun for this commit**.
After foundation integration, actual resolved-color tests must cover BOUNDARY against white, six-percent container tints, activation fill and state fills; do not assume the proposed numeric token is the final integrated value. Native/WGPU witnesses must inspect ordinary edges, selected/unselected narrow activations, absence/Alive/unresolved guide distinctions and selected StateAction/internal rows in grayscale, at 100%, Fit/minimum window and overview zoom. Existing selected-border pixel predicates must continue measuring continuity rather than merely a convenient RGB identity. No palette or monitor acceptance is claimed.
Main visual risk: stronger dotted guides and stronger ordinary boundaries increase visual density. They preserve the existing 1-versus-2-unit dotted/solid lifetime distinction, but its legibility requires the combined native witness. The selected-row outline is additional paint inside existing geometry; it is not a font, zoom or layout remedy.
## Warning cue proposal: actual current behavior
`diagram.rs:1165` colors an edge amber when its derived warnings contain something other than `PromotedEndpoints`. Selected/highlighted edges instead use TEAL, so hue alone does not identify that selected edge's warning. `diagram.rs:1424` paints a fixed 30-unit screen-space warning strip: selected non-suspended route gets its first warning text; otherwise it counts actionable warning routes and says to select an amber line. Suspended custom routes defer to the fixed host hint explaining expansion. These are actual derived routing warnings; do not replace them with unrelated model validation warnings.
`routing.rs:46,1269` owns `EdgeLabelGeometry` and its semantic text, exact bounds and placement. Empty-label routes have zero label bounds. Nonempty labels measure their present text and avoid nodes, prior labels and visible strokes using a bounded search; authored offsets stay exact. `diagram.rs:1208` paints these same bounds, and `:372` uses them for hit testing. Association-end labels and arrows have separate geometry. Appending `!` or a triangle at the current label edge would escape already measured/collision-checked space, while an on-route backplate could erase another path or an endpoint arrow. This palette-only patch therefore does not do that.
| Candidate | Benefit | Cost / falsifier |
|---|---|---|
| On-route `!` glyph with a contrasting halo | Immediate spatial association, including in screenshots | Needs an explicit shared placement/bounds contract for unlabeled, short, coincident, reversed, self and authored-label routes; must avoid both endpoint arrow zones and other paths/labels. Placement/hits/export consistency exceed this four-file color-consumer patch. Test an obstacle/no-clear-path case with only a short endpoint segment and a crowded label before choosing it. |
| Explicit selectable warning entries through the existing interaction host | Names the affected relation and actual warning without hue; adds no paint over model geometry or arrows; handles hidden labels and coincident routes | Requires a small host/menu wiring change outside current ownership and a source-context-bound snapshot of the actual visible routed scene. It is a discoverable list rather than an on-route glyph; selection must visibly identify the corresponding edge. |
**Recommend the selectable-entry candidate for the next bounded task.** The existing architecture host already reserves a fixed-height hint strip outside the measured canvas (`views.rs:569–603`) and uses the shared menu infrastructure (`model_menu.rs:35,47`, `context_menu::Menu`). A “Routing warnings (N)” control in that reserved strip can open entries such as “Warning · Pressure channel — No clear path”. Include stable alias or endpoint names when display names collide. Selecting an entry should use the established relation selection action (`Message::Select(id)`, `app.rs:2132`) through the existing context-bound menu invocation path; root must confirm the existing select handler's draft/focus safeguards apply. Preserve expand-endpoint guidance for suspended routes.
Requirements before implementing that proposal: obtain warnings from the same settled `RoutedView` that is displayed, rather than running an independent router every view rebuild; bind entries to document/diagram/revision/epoch and invalidate on context changes using the existing menu protections; keep the fixed strip height constant while dragging/resizing; do not steal focus from an active text edit or commit a pending route gesture. Rename the old “amber line” instruction only when the control actually exists. A plain unspecialized current `model_menu::Request` does not already carry a warning list, so this is proposed explicit wiring, not a claimed existing capability.
Minimal future evaluators: two warning edges with duplicate names; an unlabeled warning edge; a selected warning edge whose line is TEAL; an ordinary non-warning edge; `PromotedEndpoints`/suspended custom routing; keyboard open/select/Escape; stale menu after switching document/view or editing geometry; and unchanged routes/source/history plus unchanged measured canvas size. This candidate addresses warning discoverability without expanding the palette patch into a label-placement policy. Warning non-hue identification remains **unfinished** until that work is implemented and tested.