Files
ARCADIA-Studio/harness/scenario-group-spacing-20260924.md
T

11 KiB
Raw Blame History

Saved Scenario group spacing

Branch-specific continuation of Scenario selection, tracked in Gitea #29. Final source 8d6fac4701933c7ada13cc7e6e07060662aa7465; spacing operation logic is unchanged from 3b113e5316724eca001cd92c5b8efed0a48ccc86. Intervening 67534ce4a5fab29cb69b461f00d447eca2e7d12b and 4a27c8ef0b8f4954e208fdfda5efd2b41c240577 change tests only; final 8d6fac47 revises four help/refusal/menu text locations. This work is outside the frozen #37 Windows prerelease and does not complete #29.

Implemented behavior

In a supported saved Scenario view, dragging a selected lifeline header moves the selected local lifelines horizontally; dragging a selected message body or label moves the selected local messages vertically. A group must contain only rendered local members of one kind. Pressing any selected member starts the whole-group operation on that first press and preserves the existing primary. Message groups may span local operands without changing their parent or semantic order.

Each member moves from its own original displayed coordinate by the common world-space delta. The preview retains the complete selection and primary, shows the count, and reports geometry refusals. Release prepares one batch and commits model/source together through Document. Semantic order, unselected presentation records and other views remain untouched; Undo/Redo use the normal single transaction.

A stationary plain click collapses a group to the clicked member even when that group cannot move. Mixed or unsupported groups retain their complete selection and refuse actual motion; no eligible subset is moved. The three-pixel group threshold is Euclidean in screen space. After crossing it, a supported group's off-axis movement or return to origin is a no-op that retains selection and history. An ineligible group refuses the whole motion even after returning to origin. Escape cancels the captured gesture.

Admission checks the complete Scenario representation/visit Context, camera lifetime, selection generation, session token and captured full Snapshot before effects. Current terminal or failed-start input retires its lifetime; old packets cannot cancel a newer session. Source-update failure leaves the accepted model/source/history and stored camera unchanged. Ordinary singleton spacing remains supported.

This is presentation movement. The separate semantic group reorder policy still governs sequence reorder; its user-facing gesture and destination design remain unresolved. No saved-view semantic reorder arm is introduced.

Review and first gate

Independent implementation review found a click regression: immediate rejection of mixed-group spacing prevented stationary click-to-collapse. The corrected controller retains a full-snapshot click session, using the pressed singleton only as an unchanged display/hit/camera witness. Its retained group refusal prevents any partial preparation; stationary Finish collapses, crossed motion refuses. The correction and frozen pure planner received static reinspection with no unresolved material finding. The scoped review is retained beside the evidence; static review is distinct from runtime acceptance.

The first Scenario gate at 3b113e53 closed with exit 101: 286 passed, 3 failed, 1 ignored, with all 811 captured inputs unchanged. Preserve that run as a failure. The three failed tests concerned a literal lane oracle that assumed an order for randomly generated IDs, a synthetic packet that omitted current selection generation, and an expected direct Collapse message superseded by the captured spacing Finish path.

Test-only correction 67534ce4 explicitly authors the initial geometry for the literal oracle, captures the current generation, and checks the new event path while retaining actual selection outcomes. Independent review confirmed that exact Project/source, primary/set, camera/visit, history and reopen assertions remain; pure tests retain missing-override coverage. No production fix is attributed to this test-only commit.

Scenario repeat group-spacing-scenario-2 at 67534ce4 passed 289 tests, zero failed, one ignored, exit 0 with all 811 captured inputs unchanged. Strict lint group-spacing-clippy-1 at that source then failed on two redundant f64::from conversions in the test oracle. Commit 4a27c8ef adds only explicit f32 types to the two literal starting-coordinate variables. Values 148, 240, 160 and 400 are exact in both formats; promotion back to f64 preserves the exact prior addition and final f32 cast. Independent review found numeric equivalence and no production change. Final 8d6fac47 distinguishes unavailable semantic group reordering/removal from available saved spacing and adds a saved-group drag hint; it changes no operation admission or command path. Reusing the 67534ce4 executed-test evidence alongside final-source all-target lint/build/native evidence is proportionate; the 289 tests were not executed at 4a27c8ef or 8d6fac47.

Verification record

Evidence Closed result
Scenario repeat at 67534ce4 289 passed, 0 failed, 1 ignored; closed exit 0, unchanged 811-input capture and exact source proof retained in the evidence package.
Formatting at 4a27c8ef group-spacing-format-3 passed, closed exit 0 with unchanged inputs.
Strict desktop lint at 4a27c8ef group-spacing-clippy-2 passed, closed exit 0 with unchanged inputs.
Formatting at 8d6fac47 group-spacing-format-4 passed, closed exit 0 with unchanged inputs.
Windows Studio/CLI build at 8d6fac47 group-spacing-build-1 passed, exit 0, 811 unchanged inputs; both executable artifacts pinned.
Strict desktop lint at 8d6fac47 group-spacing-clippy-3 passed, exit 0, 811 unchanged inputs.
Native saved-group exercise at 8d6fac47 Two fresh processes, normal exits 0 and empty logs; nine run-1 saved snapshots and one fresh-process reopened snapshot pass exact declared phases.
Portable evidence Package index and replay commands; raw failed gates, old-CLI preflight and all native captures retained.

The passing Scenario filter includes pure whole-Project transformations, both pressed members, deterministic command order, local cross-operand groups, typed/mixed/foreign/latent refusal, simultaneous call/reply and lane geometry, zero/subprecision no-op, exact source Undo/Redo/reopen, stale input and selection ABA, source-failure atomicity, and mounted modifier/input coverage. Filters overlap and must not be summed as unique tests; the existing timing diagnostic remains ignored.

Native observations and source checks

Windows 11, existing user profile, maximized 1605×872 window, actual-size 100% during measured movements. Both isolated processes use the closed build's Studio executable (119,703,552 bytes, SHA-256 e74342f3e06a28f91d378a429661fc88e5b009ce60549b3a2611160d48d16cdc) with libunwind.dll, a system-only PATH and an otherwise empty working directory. The matching current CLI validates all three immutable fixtures with exit 0 and only three expected unallocated-activity advisory warnings. Preflight 1 used an obsolete CLI lacking saved-layout syntax and failed; it remains historical evidence, not a current-source failure.

The original fixture has three local messages and lanes in two saved views. Run 1 selected Gamma then contextually added Alpha, making Alpha primary. Dragging nonprimary Gamma by +24 screen/world Y moved both selected messages: A Alpha 160→184 and Gamma 360→384; Beta stayed 260. One Undo returned the entire file to baseline bytes; one Redo restored both positions. A horizontal-only message drag retained the full group and made no source edit.

Selecting Intake and adding Review made Review primary. Dragging nonprimary Intake +32 X changed A Intake 140→172 and Review 400→432; Archive stayed 660. One Undo reverted this whole lane edit. A vertical-only lane drag preserved the group and available Redo; Redo restored both lanes. A→B→A navigation showed B's unchanged spacing and A's edits; the group reduced to the visible Review singleton, not an empty selection. Semantic Alpha/Beta/Gamma order and all B records remained byte-identical.

A mixed Alpha/Intake selection refused message-body and lane-header drags with explicit feedback and both members retained. Stationary message and header clicks each collapsed the mixed group correctly. Dragging a supported lane group outside the canvas cancelled the whole edit and retained selection. Final Save exactly matched the declared combined phase. Run 2 copied that actual saved source, opened it in a fresh process, selected saved A and actual size, visually retained both edits, and saved the same bytes again. Both processes closed through Alt+F4 with exit 0, empty stdout/stderr and unchanged immutable inputs.

The whole-source oracle permits only exact Decimal-equivalent spelling of the four predeclared changed A coordinate tokens (for example 184.0 versus 184); it has no numeric tolerance. Every other byte must match the intended phase. Final saved source is 3,554 bytes, SHA-256 360b9e24564a10cce3379a097bf30f33db5c583cceaaaf595fc595f662b556d5. Original expected fixtures were never rewritten from observed output.

Native selection used contextual Add, not held Shift; mounted modifier tests remain separate evidence. Native Escape during a held drag, out-and-back drag, dirty Properties, stale packets and intermediate preview frames were not exercised. Labels remain ellipsized, and the narrowed Review→Archive gap lets Beta's white label background obscure a short section of Archive's lifeline. Names remain identifiable and semantic/source checks pass; broad readability/accessibility acceptance is not claimed. Initial navigation/focus retries, one disallowed JavaScript eval and an undeclared local binding error are tool/harness recovery history, not asserted product failures. Raw captures preserve the actual observations; filename labels alone are not assertions.

Reproduction

Use a Windows checkout at the stated source with the recorded GNU/LLVM toolchain and matching dependency cache. The first gate used stable-x86_64-pc-windows-gnullvm, CARGO_BUILD_JOBS=1, CARGO_INCREMENTAL=0, and the captured Cargo home/target directory. Retain the complete environment receipt with final results. Linux checks remain excluded for this prerelease workflow.

The first Scenario command, also suitable for the corrected-source repeat, is:

cargo test -p oa-desktop scenario --message-format=json -- --nocapture

Additional completed gate commands:

cargo fmt --all -- --check
cargo clippy -p oa-desktop --all-targets --message-format=json -- -D warnings
cargo build -p oa-desktop -p oa-cli --message-format=json

Limits

This increment does not provide automatic-view group semantic reorder, arbitrary mixed-group movement, referenced-definition movement, aggregate removal, or complete Scenario authoring/accessibility acceptance. Unsupported or fallback geometry cannot be edited through spacing. The native observations above establish only the stated bounded workflows. This is branch-specific contribution evidence; no combined integration, new release or full-workspace gate is claimed. Current prerelease #37 is separately delivered and excludes this work.