# September 23 peer composition review **Disposition: feasible with deliberate Scenario/Text composition; not an accepted union. No newly verified runtime defect in the three delivered contributions. There are real textual Scenario conflicts and two definite combined-test struct-literal incompatibilities to resolve before compilation.** Read-only review against root `c87a0c2` (production remains `4ffff0d9d94bd1875e6b316b84ac11e5c5c9657c`; later root commits are harness work). Preexisting local `harness/STATE.md` modification was observed and left untouched. Reviewed exact fetched source `b8685416f56e53e30bd11ecf93a54cea10ac8458`, `14e7e6aa46f59346c7a9a478fc9498fd0b496aaf`, and `55198ee5112aa67e063436e4c6a253368e420689`, their relevant source deltas and published reviews. Used ordinary three-argument `git merge-tree ` without `--write-tree`; no merge/index/worktree/compiler/GUI/Gitea operation. Only this report was written. This is a bounded composition review, not a fresh audit of all attachment/Scenario implementation lines or a native-evidence revalidation. ## Actual bases and composition results - Attachments + State bends have common ancestor `3f9e6a18af96b5cd10940da4093be8da28b9c835` with root. Ordered source commits are `79cc9d5` → `3aa80de` → `53d01a3` → `26979c1` → `b868541`. The root comparison changes both `app.rs`, `views.rs`, and DECISIONS, but the read-only merge emits **no textual conflict markers**. The app additions do not replace SourceIndent handling; the view addition wires ordinary-canvas selected_attachment separately from source_binding. This result is only root versus this contribution, not a simulated final four-way union. - Latest transition also has common ancestor `3f9e6a1`. Its root comparison emits **no textual conflict markers**. Production is `acbfb6c` plus formatting `d46854c`, then `05e4c83`'s persistent decision footer/native oracle; `fe43730`, `d0b7c28`, and `55198ee` carry evidence/records. Do not stop at the old d0b7 source/evidence handoff: 05e4c83 is a material user-interface improvement. Its overlap with attachment source is only the identical final `diagram/focus.rs` tuple formatting. - Inspector is **only** `e2536f6` → `14e7e6a` above `b10b28cefd1d0794073ba241a0c8de9a83e85f68`, a 16-added/11-removed-line `views.rs` delta. A synthetic patch-base comparison using b10 has no conflict markers, but b10 is not an integrated root prerequisite. Root's actual Diagram lacks layout, and root lacks the saved-Scenario app modules; absence is verified from source, not inferred solely from Git ancestry. - The **full saved-Scenario prerequisite** has actual root common ancestor `c6d296a7e22c8f126834a1e217b88551634dd5cf`. The proper c6/root/14e7 read-only comparison emits **59 conflict paths**, matching the categories in peer `7dbf7ea:harness/scenario-text-composition-20260922.md`. That note is a proposal, not a composed or tested patch. The large old history includes functionality root already integrated differently; replaying all listed old commits or choosing whole files from the Scenario branch is inappropriate. Applying just the two inspector commits does not deliver saved Scenario. ## Recommended integration order 1. Preserve the current root and its harness/user-owned specification. On the integration owner's isolated branch, reconcile **b10 saved Scenario with current root** first, using `7dbf7ea` as a function/interface guide and actual trees as authority. Root owns current ordinary defaults, Text workspace, Tab, Iced patch, rename-scroll restoration and allocation/navigation admission; b10 owns saved-Scenario layout, typed rendering, view/visit authority, Details, arrangement picker and spacing. Settle source-writer and app admission seams before bulk fixture adaptation. 2. Apply the exact inspector pair **e2536f6 then 14e7e6a**. Keep Properties outer shape `[header(tabs, actions), scrollable(body)]` and Connections `[tabs, scrollable(connections)]`: Scrollable remains child 1. Taking e253 alone reintroduces the reviewed tab-switch state destruction. Do not change Apply/Revert dispatch or busy/modal authority as part of layout integration. 3. Apply attachments **79cc9d5 → 3aa80de → 53d01a3**, then State bends **26979c1 → b868541**. The final correction is mandatory: 269 alone regresses read-only pan by canceling navigation along with edits. Update new union-only model/context literals and menu callers, not just conflict files. 4. Integrate the complete latest transition contribution through **55198ee**, preserving 05e4c83. Retain the already-identical focus formatting once; do not manufacture a semantic change to resolve a redundant formatting patch. Keep Scenario's `result_view_compatible` refusal for Scenario destinations and its saved-destination test alongside transition's counterpart predicate/search/footer. 5. Preserve peer evidence at its original source pins, verify its portable package bytes with the provided tools, and record new **combined** verification at the new source commit. Update current harness checkpoint after integration, without replacing it with peer branch snapshots or reviving old PLAN/TASK_LEDGER state. No private source8 code is part of this recommendation. Steps 2–4 have little intrinsic order dependence after step 1; the stated order keeps the small inspector correction adjacent to its prerequisite and avoids mixing State's repaired cancellation with unfinished Scenario authority changes. An earlier bounded attachment/transition milestone is technically possible, but cannot be called the full Scenario integration. ## Concrete seams and invariants **Source writer/model (highest risk).** b10 adds Diagram.layout, schema-qualified `EditContext`, and Scenario lane/message identity including qualified reference path plus occurrence. Root already has CompleteForEdit/Compact/CompactValues and `InsertionSyntax` plumbing. Compose both through record/list/value/item-key operations. Preserve authored `layout none` on unrelated edits, but remove cleared Some payloads while retaining comments; blindly restoring layout null into CompleteForEdit changes that contract. Root parser/source defaults must also accept optional attachment fields with absent-vs-authored precision retained. Regenerate normative language HTML from the resulting RST rather than choosing one rendered file. Keep root vendored Iced, Cargo exclusion/patch/lockfile and notices. **Input authority before side effects.** Actual b10 `App::update` admits Scenario spacing and validates document/scenario/representation/visit/revision before reveal/camera reconciliation; Properties also validates current selected identity and editable target. Root's update first dispatches captured TextWorkspace and checks source/diagram-usage/allocation envelopes, input-owner Scope, and rename token/preview scroll. The union must reject stale input before either family's boundary effects, not merely concatenate handlers later in `update_inner`. Preserve `SourceIndent` admission through `source_input_envelope`, focus-only key binding, one draft transaction, and source session resets. Retain root WorkDrag passive boundary exceptions while adding Scenario representation/visit-qualified reveal receipts and Scope. **Caches, picking and cancellation.** Inspected b868 State scene cache compares Context, node preview, attachment preview, and bend preview. Draw selection/context/viewport admission must remain effective before another input arrives. Bend preview reroutes with fixed projected nodes/ports; it is not a general resize preview. Preserve State node/action-row priority, endpoint semantic reconnect, explicit attachment tool, then authored bend/segment eligibility. Right-click cancels preview and derives indices from committed geometry. Carry both `bend` and `route_segment` through ContextMenu/Request and retain late selected-relation admission. `cancel_edit` clears edits but preserves `pan_from`; `cancel_gesture` additionally clears pan. Root/Scenario busy/read-only wiring must not replace the former with a blanket reset. Ordinary attachment drags own a viewport stamp and cancel on camera/bounds/focus loss/pointer exit/outside release; wheel cancellation happens before publishing Zoom so a same-batch release is inert. Core route preview caching includes both attachment preferences. Preserve semantic port authority over dormant route preferences and folded-proxy suspension. These are explicit actual code contracts, not evidence that a new combined run already exercises them. Resize #16 is not among the inspected sources; no resize policy or exact resize conflict resolution is accepted here. **Definite combined compilation repairs.** Latest transition `crates/oa-core/tests/transition_lifecycle.rs:156` constructs EdgeRoute with only edge/waypoints/label. b10 `crates/oa-core/src/scenario_layout/tests.rs:602` does likewise. Adding attachment EdgeRoute fields makes these literal initializers incomplete; Serde defaults do not fill Rust struct literals. Add explicit absent preferences for existing fixtures, then separately include a nonempty authored-attachment lifecycle conservation case. Neither fixture error implies production corruption, and no compiler was run in this review. Inspect all new Diagram/EdgeRoute/Scope/Context/Request constructors and ProjectionKind matches, including files that merge cleanly. **Transition semantics.** Search query is transient state and recovery initializes it empty; searching must not change the request, inferred plan IDs, recovery snapshot or accepted target. Candidate compatibility is not complete-plan approval. Persistent guidance must use actual destination/conflict conditions. Preserve the preexisting ordinary/Scenario destination distinction while retaining complete target geometry/routes/artifacts across deletion/recreation/relink. ## Required combined gates First compile/list against the identified composed source and compare actual test membership to the relevant inputs; don't add historical pass counts. Resolve struct-literal/API/exhaustiveness failures before expensive runs. Then: - Source/default/Scenario lifecycle: compact saved layout; explicit-none/unrelated edit; payload clear; lane/message reorder with qualified duplicate occurrence; rename/remap; spacing after Text Apply; source Undo/Redo; Save As/reopen; exact intended source differences and full decoded Project equality. Retain root nine source_indentation tests, navigation/selection/focus, diagnostic authority and rename-scroll tests. - Mounted input sequence: saved Scenario → focused Details → exact saved-view Properties → actual arrangement picker → spacing gesture → Text drawer/edit/Apply → return. Old picker, Properties, viewport, spacing-finish and Text messages must be inert before canceling newer work. Include busy/passive completion and F6/Tab same-batch focus ownership. Root allocation/removal must refuse unsupported saved-Scenario actions without converting its projection or losing layout. - Attachments: existing `attachment_geometry`, `attachment_lifecycle`, `attachment_trace_ports`, `attachment_workshop`, `edge_attachments`, routing/port/State suites; HTTP conditional transaction/export/restart; ordinary pointer cancellation and stale commits; mounted immediate-menu State Escape. State bends: all 14 named tests, existing read-only pan regression, right-click provisional index, draw-before-update invalidation, off-grid return/no-op, second-view and full-history preservation. - Transition: counterpart compatibility/search/recovery and bidirectional lifecycle tests; saved-Scenario destination exclusion; add/reuse a fixture retaining nonempty attachments, authored bends and labels through relink/reopen. Test routed State metadata survives switching to/from Scenario/Text, not merely each page in isolation. - After targeted repairs, full workspace tests, strict workspace all-target Clippy and matching GUI/evaluator builds on the combined pin. Run a short native combined workflow covering sticky inspector actions/tab return, attachment vs reconnect, bend edit/cancel, source Tab/undo, save/reopen, and transition decision footer. Existing peer originals need not be repeated wholesale, but new interaction seams require observed evidence. Packaged release launch and platform scope remain separate gates. ## Evidence inspected and limits The previously absent evidence objects became available during this task: `d6aabb5dec82900ebfac1183abb4036ca06cc0e5` (State), `bb7edfbf01b43577b01d4dc7f6b8dd9240145759` (attachments), and `3a5fd8e648797837bbfcd8ede1edab96216d7ab0` (inspector). Read State integration, gate and native review reports; attachment integration review; inspector initial/follow-up source and independent native review; latest transition lifecycle note and independent review; and `7dbf7ea` composition note. Their reported native/test outcomes remain **peer evidence**, not newly executed or rehashed results here. Archived raw receipts/images and ZIP verifiers were not exhaustively inspected in this bounded task. State's accepted endpoint b868 has reported 1835 passed/7 ignored and native saved-state/reopen evidence, with native held-drag/direct-segment insertion limits. Inspector has reported lower-field Apply/Revert/rejection/tab return and small-window Revert, not broad keyboard/accessibility or small-window valid Apply acceptance. Transition final native inputs were recorded as d0b7 plus captured changes, subsequently bound to committed 05e4c83; do not identify the tested footer solely by old HEAD. Attachment evidence distinguishes 53d GUI from unchanged-core 3aa evaluator. Preserve all these provenance limits. No combined union, complete usability, Linux, resize, private source8, or release acceptance is claimed.