16 KiB
Scenario semantic reorder App increment — Windows evidence
Implementation and bounded Windows verification at 1c4099a9ef76dd28d17ef892e95edf89e860569f, on the issue-29 working branch. This succeeds the historical interaction experiment and implements the reorder policy. It does not claim integration into the default branch, a new release, or completion of all issue-29 work. The issue-37 prerelease is unchanged; Linux remains user-paused.
At this exact source, Scenario tests 315 passed / 0 failed / 1 ignored / 1,296 filtered, formatting, strict desktop Clippy and the desktop/CLI build passed, each with 818 unchanged inputs and exact source proof. Native run 2 confirms the corrected chooser at ordinary and compact sizes; fresh-process run 3 confirms exact saved-source reopen. The complete checks package retains 17 runs including five failures, rather than replacing failed history.
Portable evidence and verification: checks ZIP 29,229,448 bytes, SHA-256 80406d81e0a5d47bea2ef284bc50a079713d828e8ea291cb96cfcedfeaa16235; native ZIP 12,792,711 bytes, SHA-256 0686d691a6ecea80310c5ee31056de36a7389d89a41ca501e6db9427f1ba4a82. Both standalone verifiers pass their documented consistency checks. Source, command, UI and platform limits below remain part of acceptance.
Implemented behavior and design
The Scenario header's Reorder control opens an explicit semantic destination chooser for the entire exact selection. Ordinary Saved message/lifeline drags retain their spacing meaning. Ordered local occurrences must be visible and share one immediate Scenario/Branch parent; unsupported or cross-parent members refuse the complete set. Selection does not grant movement permission. A selected anchor is an explicit no-op; append is explicit; there is no default destination.
The chooser searches full names, aliases and positions, pages five exact destinations at a time, and compares before/after semantic neighborhoods. The selected block follows original sequence order, independent of click order or primary. Exact destination and display consequences remain beside Apply in a fixed footer. This addresses the preceding experiment's counterexample: tied Saved Y positions make some semantic destinations unreachable through unchanged nearest-Y-only dragging. The chooser is a justified identity-based implementation; it does not establish that a graphical handle can never work or that all future interaction choices are settled.
Header access uses the existing keyboard control mechanism. Successful Begin requests token-specific query focus. Enter previews a unique search match; Ctrl+Enter applies the exact displayed proposal, ignores autorepeat, and is consumed when no valid proposal exists. Escape cancels. The current child overlay gets priority: an arrangement picker opened earlier in the same Iced input batch must block cached Apply. A stale focus task first checks for its exact target and cannot blur a newer query. The chooser is outside the camera Viewport so that its input reaches text and scrolling controls.
One immutable Session captures Project, full Scenario Context, complete selection Snapshot and token. It retains only the current exact-Slot proposal; repeated current Slot reuses it, a changed/revisited Slot recomputes. Commands remain private until consumed Finish. The App rejects stale packets before touching a newer session, retires admitted Begin before fresh capture, and retires terminal success/no-op/refusal/source-write failure. Finish binds the actual displayed Slot, preventing queued Apply(A) from committing preview(B). One Document transaction changes the parent list and preserves all authored layouts, unrelated views, selection and primary. No-op/cancel preserve history, including Redo.
Semantic validity and candidate presentation are separate. Baseline Fallback permits explicit semantic choice only when all selected subjects are actually visible; it does not enable coordinate editing. Candidate Fallback may commit after explicit adjacent warning while retaining the requested Saved representation and authored coordinates. Unavailable candidates or candidates hiding any original selected target cannot commit. Real fallback tests and synthetic guard injections have different evidential scope.
A post-commit result identifies parent, destination, affected count and actual ordered neighborhood using ordinals and full aliases, so repeated names and unchanged Saved Y positions do not obscure the result. The revised summary lifetime ignores passive input-epoch changes but retains document/owner/representation/visit/revision and exact selection generation/membership/primary checks. Live operation admission still requires the full epoch. At 1c4099a9, admitted spacing Finish reconciles the summary after multiselection reconciliation; stale spacing rejects still return before this change. The passing regression commits real spacing after reorder, checks immediate summary removal without another event, confirms the semantic list/selection remain, and verifies Undo returns to the reordered source. This closes the earlier early-return gap at the source/test level.
Executed gates and retained failures
Raw receipts, streams, input inventories/archives and source proofs originated under .local/scenario-group-gates/ and are published in the checks archive's logical-file map. Every entry below records unchanged captured inputs; scenario gates 1–8 each have a PASS exact-inventory/Git-blob source proof. This report reads those records; it does not rerun gates or independently repeat their Git comparison. Commands were Windows GNU/LLVM Rust/Cargo 1.98.1, using the project toolchain environment, one Cargo job and incremental compilation disabled (format-2 records no job variable; formatting does not compile).
| Gate | Exact source | Result and interpretation |
|---|---|---|
reorder-app-test-1 |
61099ed4742eaa51c3bd81129bc072d8321961b7 |
Compile failure: ambiguous column macros and private test fixture helper import. |
reorder-app-test-2 |
f3ed6e97dd3caf06046711cf74d268c7274bc780 |
reorder_ filter: 23 pass, 0 fail, 1,581 filtered. Selected only one of nine App tests; not nine-test coverage. |
reorder-app-scenario-1 |
f3ed6e97dd3caf06046711cf74d268c7274bc780 |
301 pass, 6 fail, 1 ignore. Five fixtures omitted Derived Behavior navigation; sixth incorrectly expected comma normalization to exceed the source budget. |
reorder-app-scenario-2 |
c9f6a3da40e288e9f993d9cacf516142c0017cf3 |
307 pass, 0 fail, 1 ignore after fixture/oracle corrections. |
reorder-app-scenario-3 |
652ffb4d1b21f414a69ebac549459f4bb9e3c16a |
Compile failure: nonexistent text_input::focus API. |
reorder-app-scenario-4 |
9bfa113aa52a957ef268839b5e6d87f97b20d6ea |
Compile failure: widget operation finish receiver required &self, not &mut self. |
reorder-app-scenario-5 |
04485e001798430fb1b2e8d1347e6bde51e6e7a1 |
310 pass, 0 fail, 1 ignore; all 12 App tests included. Strict Clippy also passed at this source. |
reorder-app-scenario-6 |
14df924b98d74144c1e40fbe7098994ff5eb2e94 |
310 pass, 0 fail, 1 ignore; format, strict Clippy and build also passed at this source. Used for native run 1. |
reorder-app-scenario-7 |
201097793c010a181d113bdec7c5bf7ec81eacf9 |
Compile failure in new summary test: oa_core::SourceBundle is not exported at that path. This does not validate the new layout/summary fixes. |
reorder-app-scenario-8 |
1c4099a9ef76dd28d17ef892e95edf89e860569f |
315 pass, 0 fail, 1 ignore. Includes all 17 App tests: 12 previous adapter/keyboard cases, one long-alias mounted layout case, four summary-lifetime cases. Format-2 also passes at this source. |
The other final-source receipts are reorder-app-format-2 (cargo fmt --all -- --check), reorder-app-clippy-3 (cargo clippy -p oa-desktop --all-targets --message-format=json -- -D warnings) and reorder-app-build-2 (cargo build -p oa-desktop -p oa-cli --message-format=json), all exit 0 with exact 818-input source proofs. The complete 17-run package additionally retains the earlier format-1, clippy-1/2 and build-1 receipts; the five failures are test-1 and scenario-1/3/4/7.
Scenario gates use cargo test -p oa-desktop scenario --message-format=json -- --nocapture; completed test executions above each exclude 1,296 other tests. The single ignored test is the existing timing case. Inventories contain 817 inputs through scenario-6 and 818 at scenario-7/8. Scenario-8 and format-2 both record exact 818-input source proofs. The bounded evidence review independently counted all 17 named App passes in raw scenario-8 output and verified both runs' stdout/stderr/input-map/archive hashes and lengths against receipts; it did not repeat Git-blob comparison. Passing source proofs establish source attribution, not functional success for failed gates. All failures must remain in portable evidence.
Coverage includes exact whole-model/source Undo/Redo, selection preservation, no-op Redo, temporal refusal, stale packets/selection ABA, real baseline Fallback, synthetic Unavailable/hidden-target guards, and mounted query/keyboard/overlay ownership. The source writer reorders existing identity chunks with their trivia; the corrected exact-budget test establishes successful byte-preserving permutation and exact Undo readback. No real App source-write failure fixture was established. Its error branch remains a runtime coverage gap; separate Document atomicity evidence is not a substitute for executing that adapter branch.
Native run 1: observations and defects
The retained .local/scenario-reorder-app-native/run-1-observations.md records source 14df924b…, build-1 and current CLI preflight-2. All four fixture checks exited zero with expected incomplete-model warnings. The fixture has 24 repeated display names, tied B/C positions and a distant report_24. Selection used click plus contextual Add to selection; this is not native Shift-click evidence. Initial nonmaximized navigation misses and a file-picker UIA failure remain disclosed; maximizing and ordinary filename typing allowed the trial to proceed.
Observed: no initial destination; Enter alone did not enable Apply; search @c auto-focused and Enter previewed B/A/D/C despite tied geometry; Escape and explicit Cancel retained selection; scrolling kept the footer available and did not pan the canvas. Ctrl+Enter applied before-C once, retaining count two/primary A and authored coordinates. One Undo restored the exact 12,764-byte baseline; one Redo restored the exact applied source SHA-256 f48147dbc5101d8dd0386f72ef769d8684935a410d7e60b85d420033d5243f06. Normal close exited zero with empty process streams and unchanged immutable inputs.
Two product defects prevent treating this run as final acceptance:
- Captures 24/28 show After text clipped beneath the floating scrollbar. The later source reserves a gutter, propagates Fill widths and uses WordOrGlyph wrapping. The mounted long-alias layout evaluator passes in scenario-8; corrected-source native screenshots in run 2 confirm readable columns and a reserved scrollbar gutter.
- New Saved-order diagnostics reduced viewport height by 40px and erased the result summary through epoch equality. The revised lifetime described above preserves passive-resize/camera results while retiring substantive changes in four passing summary tests at scenario-8. Diagnostic wording now identifies aliases and explains disagreement between positions and execution order. Corrected-source native run 2 confirms persistent result summaries after real diagnostic height changes.
The original native full-file oracle also failed at byte 647: expected comma spacing differed from the writer's moved reference trivia. This was an evaluator error, not evidence of coordinate/semantic corruption. Keep its failed receipt and original expectations intact; a corrected exact oracle must be separately pinned and must continue to compare every other source byte. Do not silently normalize arbitrary differences.
Corrected native run 2 and fresh-process run 3
Run 2 uses source 1c4099a9… and build-2. The executable is 119,900,672 bytes, SHA-256 123e5bebda06c8446cb86c3e071599feea318e69953a949f64b29ec3010d2717. Independent review of original captures finds readable Before/After columns, a fixed destination/action footer, and a persistent semantic result after diagnostics resize the viewport. Actual image sizes are 1605 × 872 and 1104 × 732. At compact size the comparison body requires scrolling; footer and result remain visible. These dimensions are capture sizes, not exact client-area claims.
The repeated-name D-then-A selection moves in semantic A/D order. Before-C is separately reachable despite B/C tied Y. Search reaches offscreen @report_24; a later no-match query preserves the previously explicit proposal and labeled destination. Cancellation and selected-anchor no-op preserve Redo. Exact snapshots independently confirm baseline after Undo/cancel/no-op, identical before-C after Redo, far-anchor commit, and the final before-C commit. All are 12,764 bytes, compared without normalization against separately pinned v2 expected files:
| Phase | Snapshot numbers | SHA-256 |
|---|---|---|
| baseline | 29, 34 | 0ad45e5ec3768862823175d9664c0e746e2a3afbc4df367b14477dc9f8705bf7 |
| before-C | 27, 36, 76 | f48147dbc5101d8dd0386f72ef769d8684935a410d7e60b85d420033d5243f06 |
| before report_24 | 62 | 0b1cf1bba8ba2df869d34210b611d9551821ab24fdd4fbefd29effa76167dd3e |
Captures 64–71 confirm native keyboard entry: F6 enters the viewport; six Shift+Tab steps reach Reorder through Actual Size, Zoom In, Zoom Out, Fit and Details; Enter opens the focused query. This relatively long route and subtle viewport outline remain discoverability limitations. Earlier F6/Tab/Shift+Tab returned to the viewport and was not a blocked Reorder route. Escape cancellation is observed. Native selection remains click plus contextual Add; native Shift-click is not claimed. Captures 44–56 retain system window-sizing recovery; resize cancels the live operation under exact-epoch rules, followed by a fresh compact operation.
Run 3 starts a fresh copied process and explicitly uses run-2 snapshot 76 as its prepared initial source. Original captures 14/15 show Saved A with persisted ordinals B1/A2/D3/C4 and the expected alias-based diagnostic notices. Selection is zero in the new process, as appropriate for transient selection. Independently, the prepared initial pin, run-2 snapshot 76, run-3 snapshot 15, final working source and pinned v2 before-C expectation are all exactly equal, with SHA f48147…3f06 above. This is saved-source persistence evidence, not persistence of transient selection or operation history.
Runs 2 and 3 both closed normally with exit 0 and empty stdout/stderr. Their complete prepared immutable inventories were independently rehashed and matched; final source and log pins match the close receipts. Separate local reviews are retained as run-2-review.md and run-3-review.md in the native evidence materials. Run 1 remains findings-only evidence, including original evaluator failure; v2 expectations do not retroactively turn it into an accepted run.
Verification and delivery limits
The bounded increment is implemented and verified for the stated source and Windows workflows. Tests and native observations do not establish arbitrary window sizes, native temporal-refusal/fallback scenarios, screen-reader completeness, or Linux behavior. Accessibility captures expose mostly the window shell; native focus is supported by visual highlights and the observed route, with separate mounted input coverage. The real App source-write error branch still lacks a runtime failure fixture; Document atomicity evidence remains separate. Aggregate removal and broader issue-29 completeness remain separate work.
The native package retains all 535 members from three closed run attempts and two CLI preflights, including original failures, exact helpers, source proofs and original captures. Run 1 remains unaccepted with its failed source-oracle receipt; run 2/3 and matching current CLI preflight are explicitly accepted only for the bounded cases above. Omitted executable/DLL bytes retain their build/readback pins; an offline archive check cannot rehash omitted bytes. No default-branch integration or new published release is asserted by this report.