54 lines
8.5 KiB
Markdown
54 lines
8.5 KiB
Markdown
# Allocation drag UI source handoff — 2026-09-11
|
||
|
||
Codex-956atf `/root/allocation_drag_ui`, delegated by root under issue 3's expanded UI scope (comment 472). This is an isolated, uncommitted source contribution. Root owns independent review, the compiler lane, native acceptance, integration and publication.
|
||
|
||
Worktree: `C:/Users/User/Documents/Git/ARCADIA-Studio/.local/allocation-drag-worktree-20260911`, parent-provided branch `codex/allocation-drag-956atf-20260911`, base `abffa4b3f0a859d7439103100f59805804d46e55`. Root instructions, PROJECT_GOAL, the original independent review and adopted v2 contract were read. User-owned input, core/schema/behavior/guide sources, the frozen pure planner/tests and peer CreateContextElement logic were not edited. No compiler/Cargo/test/native execution, Git/index command, Gitea mutation, Linux/WSL, VPN operation or subdelegation occurred.
|
||
|
||
Apply the focused changes to shared files against that base; do not replace a newer root `app.rs`, `diagram.rs`, `views.rs` or their tests wholesale. In particular preserve the root canvas and peer child-work changes integrated after this worktree's base. The five existing test-helper files below have only mechanical `allocation: None` constructor additions and formatting.
|
||
|
||
## Implemented seams
|
||
|
||
- `app/allocation_drag.rs` owns clean input admission, selection without `select`/`apply`, a monotonic input epoch, accepted snapshot identity, token registration/consumption, per-leaf stable IDs, destination-keyed semantic plans and retryable status. Stamps include document instance/revision/diagram/context, input epoch, snapshot identity, exact bounds, pan and zoom. Ordinary App input retires the token before dispatch; passive updates retire it when the measured boundary changes. Keyboard/focus events retire a held gesture; modal/tool/Undo/Fit round trips cannot revive it. Old motion/release packets cannot cancel a newer token.
|
||
- `diagram/work_drag.rs` and localized `diagram.rs` wiring preserve ordered native positions and the existing three-screen-pixel threshold. Work-body press, preview and release messages can be emitted before Iced rebuilds; App processes their shared token in order. Dirty Allocation object presses are intercepted before node/port/edge selection. Non-Allocation and non-work gesture paths retain their previous implementation. Existing test constructors explicitly opt into that legacy path; new mounted tests use the production capability.
|
||
- Accepted visible performer regions, semantic ancestry, other cards, ports, route segments/handles/labels and the viewport are frozen at press. Resolution uses half-open boundaries, deepest semantic ancestry, explicit incomparable overlap refusal, and exposed-space occlusion. Collapsed targets expose only their header. Q cards and their port glyphs do not occlude their moving ghost. Outside release cancels, never unassigns. The fixed feedback overlay band is also excluded from destination hits.
|
||
- App preview owns the pure SemanticPlan and PlacementPlan. Candidate node/port drawing, relationship details and routing use that plan's Project and its own ViewIndex; the accepted semantic cache does not substitute for it. A separate passive WorkFeedback canvas paints the frozen target outline/label above candidate text. The destination/refusal text also persists in App status after release. Low zoom (work/target 16-world-unit type below 9 screen pixels) gives a readable retry refusal; no automatic Fit or packing is introduced.
|
||
- The final optional Batch goes directly through `Document::execute`, avoiding unrelated App selection/repair helpers. The pure finish gate is rerun at release. Source rejection leaves the document/history intact; clean snapped no-ops do not execute. Work remains selected after a successful commit. Arrange next drag is visibly armed, consumed on press and cleared by cancellation/lifetime changes. Existing whole-view Arrange is relabeled Auto-layout to distinguish it.
|
||
|
||
The frozen pure planner remains SHA-256 `761921A1DD608873DDECFBC138685D40A1F557BC3B619E02D90231E13814B433`. Root reported its separate warning-denied direct harness and 29 component tests passing; that evidence does not validate this UI contribution.
|
||
|
||
## Authored verification and remaining gates
|
||
|
||
`app::allocation_drag::tests` contains 19 unexecuted tests:
|
||
|
||
- Actual DiagramCanvas → App clean stationary selection; dirty property raw input/value/editor cursor and selection preservation; dirty nearby port interception; pending source/behavior, busy and modal admission.
|
||
- OA and SA ordinary incoming → reassignment → outgoing through an ordered native event batch, exact relation identity/metadata, work elements, source compile round trip and one-step Undo/Redo snapshots.
|
||
- Modal round trip, equal Fit/Undo, measured resize, Escape/unfocus, equal document replacement and actual canvas-origin change retirement; stale packets leave a newer token alone; release consumes once.
|
||
- One-shot Arrange consumption, snapped no-op preserving Redo, outside-viewport cancellation, atomic Document source-budget refusal and a fresh live-state retry.
|
||
- Semantic plans reused within/revisiting one target, distinct plans and stable relation IDs across targets, own-index projection; same snapped root point on opposite sides of a target border still rebuilds destination semantics even where conservative layout gates refuse placement.
|
||
- Semantic nested priority versus geometric peer overlap, half-open shared borders, card/overlay/port/edge controls and collapsed-header target regions.
|
||
- Role-only outward refusal with unchanged placement; same-effective arrangement without a direct Allocation; uniform folded parent drag moving its hidden child placement and assigning only semantic leaves.
|
||
|
||
Actual local validation is limited to successful scoped `rustfmt.exe --edition 2024 --config skip_children=true` parsing/formatting of the changed Rust files, source inspection and SHA-256 capture. No test pass, type-check pass, GPU behavior or native usability is claimed. The root compiler lane must run the 19 mounted tests, planner regressions and relevant existing App/diagram/architecture regressions, then independently review the integration.
|
||
|
||
Native acceptance remains required at 1100×700 and wider for normal empty/incoming/between/outgoing and uniform composite tasks; exact highlighted destination, candidate ports/routes and target readability; source comments/save/reopen; dirty text-control focus retention (the authored test checks editor cursor data, not native widget focus); keyboard activation and Escape; source refusal; target occlusion and cancellation. The renderer's label sizing and the low-zoom readability threshold are unverified heuristics. Frozen target outlining does not claim large-model layout usability. Mixed/distributed layout, role exit and collateral repair deliberately retain the planner's named refusals.
|
||
|
||
## Frozen changed Rust sources
|
||
|
||
| Path relative to worktree | SHA-256 |
|
||
| --- | --- |
|
||
| `crates/oa-desktop/src/app/allocation_drag.rs` | `40A57B54334477B5940C9DEC1E1F9E72AC2091672B2B352DDE0404AB58E883ED` |
|
||
| `crates/oa-desktop/src/app/allocation_drag_tests.rs` | `B0421511F945B76759F3162AABCCE6EE8BD988FA1FD836F450E0E1AF04A53845` |
|
||
| `crates/oa-desktop/src/diagram/work_drag.rs` | `63818235CE77788975643B7BC5B44D133F72D3461ACC4F2A172F4407C495EDB7` |
|
||
| `crates/oa-desktop/src/app.rs` | `03BA30E32FC8D7F67DABE2C6A928629D76AE856B07F2FCF6273D340128EF44CE` |
|
||
| `crates/oa-desktop/src/diagram.rs` | `A640B94EDDFFE57DCA51A9BCE8527E3FE51799CB6EFD30A69F54F26F8AAE999A` |
|
||
| `crates/oa-desktop/src/diagram/port_labels.rs` | `6643F0CBDE7A59D4772AE5284A488083E3B81F2FEFABC43619D75738F474646F` |
|
||
| `crates/oa-desktop/src/views.rs` | `F583BCF9D4A7ED90D2DE17E7D1321CB311071EC6C637DF4153F4D1D9088F44DE` |
|
||
| `crates/oa-desktop/src/main.rs` | `3C3EC86149393111275B811C28585CDB72BD99FA31FF23E746D76DEA4C3CFDF2` |
|
||
| `crates/oa-desktop/src/diagram/port_hit_tests.rs` | `C3728F127711CB6D7F80A4670A798808B6E4239DD29C273445DE81706AB6F39E` |
|
||
| `crates/oa-desktop/src/diagram/pointer_tests.rs` | `AE68E091032FE2CF71559FF7E671B3B6D657EE8279330345F0C7A57EDFA472EF` |
|
||
| `crates/oa-desktop/src/diagram/lifecycle_tests.rs` | `03DD13106F3FDD06A26699BFDFBA006FAD086A0711CAD2BA1AEB09A4E8F8656E` |
|
||
| `crates/oa-desktop/src/app/architecture_authoring_tests.rs` | `2C41129220D103030E7EF22A14409CF8D874401CB1C767462BC27B8BB219628B` |
|
||
| `crates/oa-desktop/src/app/architecture_authoring/tests.rs` | `887D877FE33C45F2834A918D33F9A834E8A46BB65E07961F629265982F55BBE9` |
|
||
|
||
This handoff itself is the fourteenth changed path. It contains no live task ledger or independent publication claim.
|