8.4 KiB
Ordinary saved-view multiselect: source/composition review
Reviewed 2026-09-23, source only. Delivery: 7e348d967d1787c052a145b7448636613a6a7054; final executable source: f6a6010baed9e6164a1fcc7ecd58256a562827d7, following 12a7352ddef5f69a144ead8219a50916233d63a9, above b8685416f56e53e30bd11ecf93a54cea10ac8458. Intended integration base: f82e29d6b8ed2b5fd23ac806675d3eafe851d104. Inspected Git objects, actual production/test changes, and harness/multiselect-saved-view-20260923.md. No merge, compiler, GUI, subject edits, or Gitea writes were performed. Peer runtime receipts remain evidence for the peer pin, not a compiled combined candidate.
Disposition
Suitable for a bounded integration attempt after the constructor repair below. I found no established production functional blocker in this source review. This is not acceptance of the combined executable or completion of all multiselect surfaces. Preserve the final fixed-height strip fix; integrating only the first feature commit reinstates a peer-observed canvas resize/refit defect.
Definite integration repair
New example does not construct the newer Diagram model. At delivery crates/oa-core/examples/multiselect_native.rs:36–46, the Diagram literal has no layout. The combined model requires layout: Option<DiagramLayout> at crates/oa-core/src/model.rs:1523. Add layout: None to this ordinary fixture when integrating. Serde defaults do not supply missing fields in a Rust literal. This is a source-established compilation incompatibility for the example/all-target gate, not a demonstrated runtime defect in the peer's own base. Check new literals against the final combined types rather than assuming clean textual application implies type compatibility.
Shared seams to preserve
A read-only comparison of the two ranges from b868541 found five production paths changed on both sides: oa-core/src/lib.rs and oa-desktop/src/{app.rs,diagram.rs,main.rs,views.rs}. Their edited base-line intervals did not overlap. This is a hunk observation, not a performed merge or a guarantee about Git conflict resolution.
- App admission and reconciliation. Delivery
app.rs:1293–1396adds the multiselect boundary, earlyDiagramSelectionenvelope refusal, and post-action reconciliation. Keep the combined early Text handling and Scenario spacing/epoch admission (f82 app.rs:1367–1427) ahead of their side effects, plus the newer saved-Scenario architecture-action refusal. The new envelope check must coexist with these checks.app/multiselect.rsrejects dirty/busy/active-edit operations, requires all selected targets to be placements for Move/Hide, and rechecks full selection snapshot, context, and visible membership. It does not silently move the placement subset of a mixed selection. Nested Text dispatch callsself.update, so its mutating path can receive the new reconciliation; do not bypass that recursion when combining branches. - Surface identity. Retain the combined
route_contextexclusion for saved Scenarios and the saved-Scenario picker/view guard (f82 views.rs:391–408). The new adapter obtains its context only onPage::Diagramthroughroute_context; Scenario/Behavior should never acquire an ordinary saved-view group merely because a Diagram record exists. State, allocation-group semantics, derived Process, and Scenario adapters remain explicitly unfinished in the delivery. - Canvas and rendering. Retain the added
selectionfield and explicitNonevalues in unrelated canvas fixtures; retain the combined SVG unsupported-Scenario result/error path (f82 diagram.rs:1881–1901). Keep deliveryviews.rs:614–684, especially the always-reserved.height(56)at line 682. The final mounted regression checks empty, singleton, group, and mixed selections, including a long primary name, against the same canvas bounds and fitted camera. This directly addresses the earlier conditional-strip defect. - Properties and Text. Keep the combined Properties Apply/Revert action row outside the scrolling body, Connections/Properties tab and scroll ownership, and the focused Text
SourceIndentbinding (f82 views.rs:1209). The new group controls belong above the diagram and explicitly say Properties edits only the primary; replacing the whole olderviews.rswould lose unrelated accepted fixes. The delivery does not change the source writer; retain combined compact/default/comment preservation and explicit-none handling in full. - Transient lifetime and focus. Keep the delivery's selection generation/scope checks, ordered pointer handling, modifier restoration through the mounted focus owner, and pending-group cancellation on viewport/context changes. Group placement moves are one
execute(Command::Batch(...)); the core planner unions descendants and computes route translation once against the original diagram. The App rejects queued singleton Move/Delete paths while a group owns the action. These are meaningful protections, not UI-only selection decoration.
Targeted remaining checks, not proven production bugs
Group preview cache depends on event ordering. Delivery diagram.rs:549–555 caches by route context and singleton preview/route/port state, with no group snapshot or current selection/viewport validity key. diagram/multiselect.rs:267–295 applies a crossed-threshold group preview without independently checking live selection, editable state, or viewport. A direct scene read after changing those inputs can therefore retain the old preview until input cancellation clears the cache. However, native RedrawRequested is handled by DiagramCanvas::update and reaches group_input, whose validity checks run first; I have not established an actual native path that bypasses that ordering. This is not a proven stale-commit or native rendering bug.
The existing tests changed_viewport_or_context_retires_group_without_a_release_intent (delivery diagram/multiselect_tests.rs:596) and changed_selection_generation_rejects_press_even_after_membership_is_restored (line 646) dispatch a release before inspecting the cleared preview. A discriminating additional check should warm the real scene cache during a group drag, change viewport or selection generation, deliver the normal mounted redraw, then assert committed geometry and no release intent. Include dirty/read-only or overlay retirement if the combined owner can suppress child updates. Harden the scene validity contract only if that trace exposes a reachable gap; a bare draw-before-update unit call alone is insufficient to claim a native failure.
After constructor repair, verify the combined application retains: ordinary group selection and fixed canvas across empty/single/group/mixed states; one-command move/hide with full-Project and source round trips, Undo/Redo, and unchanged non-active views; stale group events across Text Apply/navigation; saved-Scenario refusal and stale Scenario events without selection/history/deferred-reveal side effects; and Properties action-row/tab return behavior. Exercise OA and SA placement identities, including duplicate semantic occurrences, alongside an existing saved Scenario layout and explicit route attachments in the same project. The peer's own source/history and geometry tests are reusable evidence, but do not cover all those newer composed records.
Evidence limits and oracle assessment
The core planner tests use explicit expected geometry/complete models for descendant union and route behavior; the App tests also compare source and history. Selection snapshots preserve exact placement/port/edge identity and a generation, preventing membership ABA from reviving a captured gesture. These checks support the claimed ordinary saved-view slice.
The native example openly derives a bounded common delta from saved placement A, then independently enumerates the expected moved set/routes and compares the complete Project. That is a useful invariant oracle, not an independent expected pointer-to-world delta. A uniformly wrong displacement could satisfy it. The handoff correctly labels this limitation; keep that wording when reusing its receipts. Native context-menu Add exercises selection through a different input path from Shift-click; mounted Shift tests provide separate evidence, and neither should be relabeled as native Shift-click observation. The final layout/refit regression and native fixed-strip observation are specifically worth preserving; passing core geometry tests alone would not have detected the original UI defect.