77 lines
11 KiB
Markdown
77 lines
11 KiB
Markdown
# Saved Scenario group spacing
|
||
|
||
Branch-specific continuation of Scenario selection, tracked in [Gitea #29](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/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](scenario-group-reorder-policy-20260924.md) 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](scenario-group-spacing-evidence-20260924/README.md); 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:
|
||
|
||
```powershell
|
||
cargo test -p oa-desktop scenario --message-format=json -- --nocapture
|
||
```
|
||
|
||
Additional completed gate commands:
|
||
|
||
```powershell
|
||
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.
|