Retain independent union reviews and corrected Scenario test scope
This commit is contained in:
@@ -36,7 +36,10 @@ rejected `layout`. Correction `2a0579daafb89994730284c108f460782e5e6650`,
|
||||
incorporated here as `846cae8`, adds `layout` to parser admission only. It does
|
||||
not add a synthetic null to CompleteForEdit or change omission defaults; real
|
||||
payload clearing remains distinct from unrelated edits beside explicit none.
|
||||
The failed receipts remain retained. The corrected run is pending at this note.
|
||||
The failed receipts remain retained. At corrected `2a0579d`, all 27 Scenario
|
||||
layout and 22 source-default library cases pass against the actual 129-name
|
||||
inventory on 742 unchanged inputs. These are local Scenario-only receipts;
|
||||
they do not establish the combined attachment/State/transition result.
|
||||
|
||||
## Evidence scope
|
||||
|
||||
@@ -54,6 +57,13 @@ verifiers and supplemental actual outcome/source-binding checks. Historical
|
||||
failed attachment comparisons and State dirty-source gaps remain disclosed.
|
||||
The audit did not run their application binaries or repeat their native trials.
|
||||
|
||||
Retained reviews: [composition plan](reviews/peer-composition-plan-20260923.md),
|
||||
[Scenario source and stale-event correction](reviews/scenario-text-union-source-20260923.md),
|
||||
[combined source](reviews/peer-union-source-20260923.md), and
|
||||
[peer evidence audit](reviews/peer-evidence-audit-20260923.md). Their historical
|
||||
source pins and pre-execution status remain explicit; later passing gates do
|
||||
not retroactively turn a source review into runtime evidence.
|
||||
|
||||
## Combined acceptance still required
|
||||
|
||||
First resolve any actual constructor/API/parser failures on frozen source.
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
# 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 <base> <root> <peer>` 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.
|
||||
@@ -0,0 +1,50 @@
|
||||
# September 23 peer evidence verification
|
||||
|
||||
Disposition: the inspected portable packages pass integrity/consistency verification within their stated scopes. No new package defect found. This is a fresh offline verification of peer receipts and committed bytes, **not** new compilation, application execution, model-checker execution, native interaction, or release acceptance.
|
||||
|
||||
Reviewer: delegated Codex-956atf review, 2026-09-23. Parent owns integration/publication. Only scratch evidence/report files were written; no worktree, source edits, compiler, GUI, runtime executable, Gitea write, or remote mutation.
|
||||
|
||||
## Extracted commits and scope
|
||||
|
||||
| Scratch directory | Fetched commit | Repository evidence prefix | Files / bytes |
|
||||
|---|---|---|---:|
|
||||
| state | `d6aabb5dec82900ebfac1183abb4036ca06cc0e5` | `harness/experiments/state-bends-b868541-20260923` | 346 / 43,573,465 |
|
||||
| attachments | `bb7edfbf01b43577b01d4dc7f6b8dd9240145759` | `harness/experiments/edge-attachments-53d01a3-20260923` | 523 / 28,265,440 |
|
||||
| inspector | `3a5fd8e648797837bbfcd8ede1edab96216d7ab0` | `harness/experiments/scenario-inspector-actions-14e7e6a-20260922` | 867 / 8,654,498 |
|
||||
| transition | `55198ee5112aa67e063436e4c6a253368e420689` | `harness/experiments/transition-native-lifecycle-20260913` | 18 / 21,375,088 |
|
||||
|
||||
Size estimate preceded extraction: 101,868,491 bytes against 1,432,682,496 available bytes. `git ls-tree -r -l <commit> -- <prefix>` enumerated scope; `git cat-file --batch` extracted its blob objects unchanged into `.local/peer-evidence-verify-20260923/<directory>`. No EXE/DLL/PDB files. `extraction.json` records every path, Git object, byte count and SHA-256. Independent readback verified exact membership and all 1,754 files against that inventory.
|
||||
|
||||
## Commands and fresh results
|
||||
|
||||
Run from repository root, where `$py` is `C:/Users/User/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe`, `$ev` is the absolute `.local/peer-evidence-verify-20260923` directory and `$repo` the absolute repository root:
|
||||
|
||||
```powershell
|
||||
& $py -B "$ev/state/verify-build.py" verify --archive "$ev/state" --repo $repo
|
||||
& $py -B "$ev/attachments/original/verify-build.py" verify --archive "$ev/attachments/original" --repo $repo
|
||||
& $py -B "$ev/attachments/corrected/verify-build.py" verify --archive "$ev/attachments/corrected" --repo $repo --related-archive "$ev/attachments/original"
|
||||
& $py -B "$ev/transition/checks/verify.py"
|
||||
& $py -B "$ev/transition/native/verify.py"
|
||||
& $py -B "$ev/independent-check.py"
|
||||
```
|
||||
|
||||
All six finished exit 0. Sources were inspected before execution. The first three scripts' `verify` branches read files/Git only; their unused `build` branches were not invoked. Corrected attachments and State share identical verifier bytes. Transition uses read-only standard-library verification, without opening historical absolute paths. Inspector's `original/native-recipe/verify.ps1` is a function library, not a standalone portable verifier; it was inspected and **not** misrepresented as a verification run. `independent-check.py` performs the missing inspector checks plus cross-package checks and writes only its result JSON.
|
||||
|
||||
Exact executable arguments, exits and stdout/stderr filenames are in `verifier-results.json`; complete outputs are `verifier-1` through `verifier-5` `.stdout.txt`/`.stderr.txt`. Additional results: `independent-results.json`, `independent-check.stdout.txt`, and `evaluator-source-diffs.json`, all under `$ev`.
|
||||
|
||||
| Supplied verifier | Originals / source records checked | Other verified relationships |
|
||||
|---|---:|---|
|
||||
| State | 340 / 8,259 | 110,713 available of 110,805 receipt references; 92 explicitly external |
|
||||
| Attachments original | 340 / 5,496 | 14,066 of 14,117 references available; 51 external |
|
||||
| Attachments corrected | 132 / 2,750 | Exact prerequisite original archive; 30,392 of 30,422 references available; 30 external |
|
||||
| Transition checks | 253 stored members / 265 logical files | Ten closed Cargo receipts, five source-capsule pairs, 40 recorded checker trials including expected rejection exits |
|
||||
| Transition native | Pinned sibling checks ZIP | Four closed trials, 12 full-model receipts, 88 capture records, 92 images, three linked source capsules |
|
||||
|
||||
## Independent claim and source checks
|
||||
|
||||
- **State:** raw rows and 61 suite summaries agree: 1,835 passed, zero failed, seven ignored (1,842 actual rows). Three launch/close chains have exit 0 and empty archived streams; 17 full-Project receipts report exact equality. Source map records match Git at `53d01a3d4451b94792986f2dfac56f6f04e111a4`, `26979c109384add3e2a4bfd0092b8da1464e37a2`, and final `b8685416f56e53e30bd11ecf93a54cea10ac8458`. Historical failed-targeted/final evidence remains failed. Two unavailable historical dirty `state_bend_tests.rs` files remain acknowledged gaps, not recovered source proof. Run 3's moved-bend N2 reopening is supported by the supplemental plan/copied checkpoint and explicit actual-path oracle; its frozen default launch/capture source still identifies N3. No continuous drag/camera proof is inferred.
|
||||
- **Attachments:** raw original final workspace membership is 1,819 passed/zero failed/seven ignored across 61 summaries. Corrected desktop is 1,194/zero/six, plus exactly two focused passes. Original source-map has 5,458 exact Git records and 38 preserved overrides; all overrides equal their pinned Git blobs after CRLF-to-LF normalization (one includes mixed endings). Corrected map's 2,750 records match `53d01a3` Git exactly although original command receipts retain their then-dirty `3aa80de` HEAD. Three original closed runs contain **25 exact and four false** full-Project receipts; two corrected runs contain five exact receipts. All five launch/closure chains have exit 0/empty streams. Original overwritten shared-target preflight failure and later restoration do not establish continuous binary immutability. Corrected evaluator reuse is supported by Git diff: only four desktop files changed from `3aa80de89c5b79200286926781e8f3a192bc61f4` to `53d01a3`; core/Cargo are unchanged.
|
||||
- **Inspector:** exact inventory verifies 863 originals totaling 8,285,235 bytes plus the declared metadata. All ten published prerequisite blobs match recorded pins. Before/after input manifests agree: 2,596 repository files match `14e7e6aa46f59346c7a9a478fc9498fd0b496aaf` Git byte for byte; remaining 23 entries are outside that checkout. Eighteen Cargo configuration search slots remain receipt data. Fifteen successful step receipts match their archived logs. Exactly 18 selected passing names match selection and are present in the 1,095-name candidate listing. Eight comparisons verify all 80 artifact pins and actual/expected/input Project JSON equality; the saved-source pins match. Native exit 0/empty streams/launch identity checked; 17 images retained. Source diff from evaluator `b10b28cefd1d0794073ba241a0c8de9a83e85f68` changes only `views.rs`. This establishes neither a full desktop suite run nor fresh reopening or keyboard activation of action buttons.
|
||||
- **Transition:** final 715 captured inputs match **all 715 Git blobs** at `55198ee` exactly, beyond the supplied verifier's self-consistency check. Earlier capsules differ in `workflow.rs` and, for old producer build 1, producer README/checker source. The supplied verifier establishes the exact final footer-literal-only delta from corrected producer build 2. Recorded HEAD `d0b7c28` alone never identified those dirty bytes. Final GUI build and two format receipts share the final manifest; earlier strict lint is scoped to its original wording. Forty synthetic checker outcomes are bound to corrected producer build 2; accepted first-relink identities and saved bytes match later reopen/no-op receipts in each direction. Interrupted native trial 1 stays excluded. Launch-pinned capture helpers differ from separately serialized session functions; snapshots lack completion timestamps. No authenticated complete UI action history is claimed.
|
||||
|
||||
The State/attachment inventory verifiers check available receipt hashes, not runtime semantics or exhaustive receipt coverage. Additional raw membership/closure checks above are therefore material. Excluded binaries/toolchains are historical hash observations, not freshly rehashed artifacts. Reused Cargo caches and fingerprints do not establish clean/hermetic rebuilds. This review deliberately reuses prior native criticism rather than repeating exhaustive image review, and does not transfer these peer results to the parent's integrated source or another platform.
|
||||
@@ -0,0 +1,24 @@
|
||||
# Independent combined source review — September 23
|
||||
|
||||
**Disposition: no new verified blocker in the bounded composition seams. Accept the source composition for frozen combined verification, not for release or runtime acceptance.**
|
||||
|
||||
Reviewed `.local/peerunion` source commit `846cae81e7be29c0b24cff1740e3fcf3d0b21fcc` (current clean HEAD `f3dd8356bfb5c6f1e59dac354f59e482a6d58b80` adds only `harness/peer-union-20260923.md`). Compared the actual combined delta from `0b61771d079cae4a513958fad04e6c3e785d458f`, relevant production files against attachment/State `b8685416f56e53e30bd11ecf93a54cea10ac8458` and transition `55198ee5112aa67e063436e4c6a253368e420689`, and the prior `.local/september23-peer-integration-review.md`. Read applicable instructions and project goal. This review ran no compiler, test, GUI, or Gitea mutation and edited no application/worktree source. Parent owns those gates and shared coordination.
|
||||
|
||||
## Resolved integration defect and evidence limit
|
||||
|
||||
The initial candidate `ffa7b160034f4fb679c35044faa9281b2a183878` inherited the Scenario/Text composition's missing Diagram `layout` parser-field admission. Parent reports its separate Scenario `0b61771` run passed 20 and failed seven source-lifecycle tests with unknown-field `layout`; those are parent's observed results, not tests executed by this reviewer. My preceding Scenario source acceptance did not catch this inventory omission and must not be interpreted as proof those lifecycle tests passed.
|
||||
|
||||
The actual repair at `846cae8` adds `layout: null` only to `parser_fields(Context::Diagram)` (`crates/oa-core/src/source_defaults.rs:55`). This admits the optional field while leaving `declaration_defaults` (`:126`) and `CompleteForEdit` rendering (`:74`) unchanged. In particular, it does not restore a synthetic top-level layout null into the editor's typed declaration map. That distinction preserves the existing contract between clearing a real layout payload and an unrelated edit alongside authored `layout none`. Attachment restoration remains scoped to nested route endpoint preferences (`:102`); compact route omission remains scoped to the endpoint/waypoint/label defaults (`:248`). Source-level repair accepted; corrected lifecycle execution remains a required gate.
|
||||
|
||||
## Verified combined seams
|
||||
|
||||
- **Admission before side effects.** The attachment/transition delta does not alter `App::update`'s early dispatch and guards. Captured TextWorkspace dispatch remains at `crates/oa-desktop/src/app.rs:1342`, source/usage/allocation envelopes at `:1347`, and Scenario document/scenario/representation/visit/revision/active-epoch admission before reveal reconciliation at `:1387`. The accepted `0b61771` epoch correction survives; passive FormShown/Viewport/Restored/Scrolled and separately qualified Camera retain their distinct contracts. No attachment branch is inserted before those guards. Ordinary `edit_route` now additionally refuses pages other than Diagram (`:4863`), preserving Scenario exclusion. Attachment commit validates context, selected relation, endpoint owner, exact one-field intent and non-no-op state before mutation. `views.rs:482` displays the selected endpoint only for the current route context and edge.
|
||||
- **State cancellation and retained scenes.** `behavior/state_canvas.rs` production is identical to final `b868541`; its sole delta is a test Diagram's `layout: None`. `cancel_edit` (`:139`) clears edit previews/gestures while preserving `pan_from`; `cancel_gesture` (`:147`) also clears pan. The noneditable update path still calls only `cancel_edit` (`:1184`). Scene construction (`:693`) checks valid context and distinguishes general gesture authority from captured route viewport authority. Cache membership includes context and the node/attachment/bend previews. `draw` requests `scene_with_bounds` (`:1639`), so retained previews are checked against current bounds before another event. Right-click derives menu indices after canceling the provisional gesture. State view creation adds `layout: None` without changing its projection (`behavior/state_edit.rs:376`). The menu-armed attachment Escape correction also survives in `app.rs:2590`.
|
||||
- **Transition presentation and saved Scenario.** `workflow.rs:357` continues to admit only architecture or State projections for transition destinations, with layer/containment checks and the existing empty-target State restriction. Thus the empty-target universal quantifier cannot accidentally admit saved Scenario. The same predicate governs presentation choices and final explicit-destination application; the saved-Scenario regression remains at `:2008`. Transition's search/query state, public counterpart compatibility predicate and final decision footer survive composition. Footer enablement includes `destination_error` (`:1418`) and its guidance is outside the scrollable content (`:1427` onward). Candidate compatibility remains separate from full-plan acceptance.
|
||||
- **Combined fixtures and real conservation oracles.** The Scenario invalid-route fixture now supplies both absent attachment fields (`crates/oa-core/src/scenario_layout/tests.rs:602`); this is a literal repair, not a new semantic oracle. In contrast, `crates/oa-core/tests/transition_lifecycle.rs:160` authors nonempty source and target attachments in the shared rich-side fixture used in both transition directions. The preexisting expected deletion is independently constructed by removing the known deleted side/trace/artifacts and only that side's route (`:344`), then compared to the complete actual Project (`:400`). Retained-side attachment loss therefore fails equality. Relink compares the entire result after removing the new trace with an expected Project changed only at the reviewed target name (`:590`–`:604`). JSON and source compile round trips compare the full Project and canonical source (`:238`), and deletion undo/redo also compares exact source (`:390`). These assertions exercise the added nonempty fields; they do not merely assert the fixture contains them. For SA semantic-port endpoints, the authored preferences intentionally remain dormant presentation data rather than overriding port authority.
|
||||
|
||||
## Remaining acceptance boundary
|
||||
|
||||
This is a risk-directed source review, not an exhaustive new audit of each delivered feature. Clean textual application and unchanged peer production are insufficient for combined runtime acceptance. Run the frozen union's relevant source/default/Scenario lifecycle, early admission, Text indentation, State bend/pan, attachment and both-direction transition suites, then the required workspace/Clippy/build gates. Confirm actual membership and results rather than adding historical peer counts. The parser repair must specifically turn the seven reported source-lifecycle failures into passing cases without weakening the explicit-none/clear/source-preservation assertions.
|
||||
|
||||
The native combined Scenario → Text Apply/return → State/ordinary route editing → transition/reopen workflow remains required, including stale retained messages, busy/read-only panning, immediate menu Escape, and the persistent decision footer. No new test or native pass is claimed here. Public format/version adoption, normative Scenario language/API completeness, private analysis source8, resize, accessibility, Linux, and packaged release acceptance remain outside this bounded source disposition; the new combined provenance note correctly keeps those limitations visible.
|
||||
@@ -0,0 +1,65 @@
|
||||
# Scenario/Text union: independent source review
|
||||
|
||||
2026-09-23 — delegated Astra critic. Local-only report; parent owns compilation, fixes, integration and publication.
|
||||
|
||||
**Updated disposition:** correction **`0b61771d079cae4a513958fad04e6c3e785d458f` passes the targeted source re-review and resolves the inherited P2 finding in source.** No source-review blocker remains in the inspected writer/default, Text admission or always-active-canvas composition. Proceed with the parent's frozen compiler/test gates. No runtime, native GUI, cross-platform or release acceptance is claimed. The original finding below is preserved against `6f4dfc6`.
|
||||
|
||||
## Source and review scope
|
||||
|
||||
Reviewed clean `.local/scunion` at `6f4dfc67b3443b2b1725e2b576eb37224977b9b2` against root `5960563b23b3f28f83343c283b7c156bf248994a`, and compared relevant seams with Scenario/inspector `14e7e6aa46f59346c7a9a478fc9498fd0b496aaf` (which includes b10). Read `harness/scenario-text-union-20260923.md`, `.local/september23-peer-integration-review.md`, actual source deltas and pertinent test bodies. Independent `git diff --check 5960563 6f4dfc6` returned no whitespace errors.
|
||||
|
||||
This is a focused composition review, not a fresh complete audit of the 14,000-line saved-Scenario contribution. No compiler, tests, GUI, source edits, author-branch mutation or Gitea action occurred. All paths/line numbers below are relative to candidate `6f4dfc6`.
|
||||
|
||||
## Correction re-review
|
||||
|
||||
Independently verified clean `.local/scunion` HEAD at `0b61771d079cae4a513958fad04e6c3e785d458f` and inspected its complete four-file delta from `6f4dfc6`. Production change is the 11-line early epoch condition/comment in `app.rs`; the other changes add the regression, recapture the current post-viewport context in an existing test, repair an obsolete focus-mode test comment and record the correction. `git diff --check 6f4dfc6 0b61771` returned no whitespace errors. No compiler/test was run by this critic.
|
||||
|
||||
The early gate now requires current canvas epoch for all active Scenario commands before shared reconciliation. The enumerated FormShown/Viewport/Restored/Scrolled/Camera exceptions match the inspected existing inner-handler admission contracts; Camera still checks its separate lifetime and spacing still uses its separate early envelope. Existing document/owner/representation/visit/revision checks remain. Production BehaviorControl can still refresh an otherwise admitted toolbar epoch before redispatch. This addresses the actual ordering defect without removing the intentional passive-event behavior.
|
||||
|
||||
The new `stale_active_actions_cannot_remove_new_same_visit_deferred_reveal` is discriminating: it captures the old Context, performs real same-view RevealInDiagram, asserts unchanged visit/representation/revision and changed epoch, then sends old Representation/Shelf/Select/Zoom messages. It compares the complete pending tuple, pending visit, navigation focus, camera boundary, current Context, selection, accepted source/model, source workspace and history after each refusal. The original `6f4dfc6` trace would clear the tuple on the first Representation event. Finally a current viewport event must consume the receipt while retaining target focus/selection and accepted document/history, proving the guard does not merely disable reveal completion. These are independently specified state invariants, not expected values computed by the new predicate. Execution remains pending.
|
||||
|
||||
The existing prior-visit spacing test's newly recaptured post-Viewport Context is also correct: a successful viewport update can increment the canvas epoch, so its later preserved-current-state oracle must use the Context after that update. No acceptance assertion was removed by this adjustment.
|
||||
|
||||
## Verified finding
|
||||
|
||||
**P2 — stale active Scenario input from the same visit clears a newer deferred reveal before being rejected. Inherited from `14e7e6a`, not introduced by this union.**
|
||||
|
||||
At `crates/oa-desktop/src/app.rs:1380–1391`, early Scenario admission checks document, owner, representation, visit and revision, but does not require the canvas epoch for ordinary active commands. Only Camera lifetime and Properties receive additional early checks (`:1393–1412`). `reconcile_pending_diagram_reveal` runs at `:1423`; its implementation at `app/diagram_reveal.rs:87–113` clears pending reveal, pending Scenario visit and navigation focus for a Representation command. The exact context/epoch refusal happens later at `app.rs:2128–2130`, after those effects.
|
||||
|
||||
Concrete source trace:
|
||||
|
||||
1. In an already open saved Scenario, capture `CanvasEvent::Representation(old_context, current_representation)` from the arrangement picker.
|
||||
2. Reveal another object in the **same** representation before processing that captured callback. `behavior/scenario.rs:390–417` retains the current visit when document/owner/representation are unchanged. `behavior/scenario/usage.rs:248` and `app/scenario_diagram.rs:7–38` use that entry behavior. `app/diagram_usages.rs:463` increments `canvas_epoch`, then `:479–506` installs a new navigation focus and pending reveal with the retained visit.
|
||||
3. Deliver the old Representation event. It passes the early gate because only epoch differs, clears the newer reveal/focus in reconciliation, then fails exact context in the inner handler. Its requested action is refused but the pending navigation is already lost.
|
||||
|
||||
This is a deterministic control-flow finding; it was not executed by this critic. The same early admission and delayed exact-context ordering are present in inspected `14e7e6a`. Root adds allocation preflight alongside these shared boundaries but does not create the underlying reveal defect.
|
||||
|
||||
**Fix:** before shared boundary effects, require exact current Context for active Scenario commands, including Representation/Select/OpenUse/Back/tool/reorder actions. Keep only explicitly documented passive exceptions for Viewport, FormShown, Scrolled and Restored, plus Camera's separate lifetime contract and the already separately admitted spacing protocol. Preserve the production BehaviorControl policy that deliberately refreshes an admitted toolbar epoch; do not remove its same-camera-lifetime behavior indiscriminately.
|
||||
|
||||
**Discriminating regression:** capture the actual Representation message, reveal another object in the same saved view, assert same visit but new epoch and live pending reveal/focus, deliver the captured message, then require every pending receipt/focus/context/selection/camera/document/history value unchanged. Finally send the current viewport event and assert the reveal completes normally. Existing `scenario_spacing/tests.rs:294–315` covers stale spacing finish through its separate envelope, and the newly added union test at `:29–89` changes visit; neither isolates this active-command same-visit hole.
|
||||
|
||||
## Writer/default composition accepted within scope
|
||||
|
||||
`crates/oa-core/src/source_project.rs:853–872,930–968` retains CompleteForEdit as old/new comparison authority and separate Compact/CompactValues insertion templates. It does not replace current root formatting with the older Scenario writer or globally add a null layout default.
|
||||
|
||||
`EditContext` (`:1239–1256`) grants Scenario row semantics only along Diagram → layout → Scenario → lanes/messages. `scenario_item_key` (`:1655–1696`) uses stable alias-to-original-identity correspondence for lifelines, and the full referenced occurrence path plus occurrence for messages; contextual paths do not collapse to the final occurrence alone. Existing `identity_origins` feed the alias mapping before list matching, so rename/reidentity correspondence survives this composition. Context deliberately returns to Other inside a matched row, avoiding accidental Scenario keys on unrelated nested lists.
|
||||
|
||||
The narrow explicit-none exception (`:1462–1470`) preserves an authored `layout none` only when the complete original model already had no layout field. A real Some→None clear instead erases significant layout tokens while retaining trivia through the existing `erase_syntax` behavior. It does not turn absent layout into an empty Some payload. No conceptual defect was found in these inspected rules.
|
||||
|
||||
The new `scenario_layout/tests/source_lifecycle.rs:248–302` is a meaningful combined oracle: authored explicit-empty description survives name/alias changes; omitted categories/view_options stay omitted; lane/message row comments follow swaps; unchanged numeric spelling remains; clear retains comments; decoded Project equals explicit intended mutations; repeating the clear is byte-exact no-op. Existing tests at `:43`, `:88` and `:218` independently cover rename/reorder, reidentity/comment correspondence, explicit-none→Some→None and full model equality. Assertions are targeted authored-byte fragments rather than a full expected-file literal, so this evidence does not establish preservation of every unrelated byte; existing ordinary default-preservation and whole-bundle tests remain required execution gates.
|
||||
|
||||
## Input authority and always-active canvas accepted within scope
|
||||
|
||||
The union keeps TextWorkspace dispatch and source/diagram-usage/allocation envelopes before shared boundaries (`app.rs:1334–1360`), early scoped toolbar refusal, separately admitted Scenario spacing (`:1362–1364`), and root rename-envelope/preview-scroll handling (`:1367–1376`). Scenario visit/representation and selected-Properties guards are composed before the shared effects, subject to the narrower epoch finding above. WorkDrag KeyboardBoundary/Unfocused remain passive exceptions in `app/diagram_reveal.rs:102–103`.
|
||||
|
||||
`behavior/canvas_workspace.rs:68–92` carries Scenario representation and visit in Scope; `app.rs:1473–1517` compares input ownership, limits toolbar messages to supported presentation controls, refreshes only the admitted context epoch, and preserves spacing retirement and logical focus behavior. No obsolete `scenario.focused`, `scenario.focus`, `CanvasEvent::Focus`, or panel-focus references were found in candidate desktop source. This is source compatibility evidence, not a compiler or keyboard usability result.
|
||||
|
||||
`behavior/scenario.rs:534–538` makes Details→Properties dismiss the Scenario shelf only; `app.rs:2187–2193` selects the Properties tab without selecting/applying another record or changing representation/camera. Inspector composition in `views.rs:881–908` preserves the two-child outer arrangement with Scrollable at child 1, retaining the reviewed Properties/Connections reconciliation shape while placing Apply/Revert outside the scroller. The adapted mounted tests appropriately replace obsolete hide/restore-panel assertions with actual editable inspector geometry, same view/visit/selection/camera and unchanged accepted snapshot checks. Removing focus-mode assertions is consistent with root's intended always-active canvas; it is not evidence that real keyboard focus is correct.
|
||||
|
||||
The new stale Text/Scenario union test retains an actual spacing token/stamp, source version, complete source/model, selection, camera and history after queued Text indentation/drawer/command messages and earlier-visit Scenario commands, then finishes the still-live gesture. Those are useful independent state oracles. Its final `can_undo` assertion proves a commit occurred but does not alone verify the exact coordinate delta; adjacent existing `same_batch_preview_is_immutable_and_one_commit_undo_redo_has_exact_source_parity` supplies an independently calculated expected Project and exact source Undo/Redo checks. Run both.
|
||||
|
||||
## Acceptance remaining
|
||||
|
||||
Execute the now-authored same-visit stale-command regression at the corrected pin, then run the parent's actual frozen compiler/test inventory, ordinary default/source lifecycle, Scenario source/references/layout, Text/source indentation/rename-scroll, spacing/Details/navigation and focus suites. Inspect union-only constructor/API failures before inferring anything from historical totals.
|
||||
|
||||
Native combined acceptance remains required for arrangement picker → Details → lower-field Apply/Revert → Properties/Connections return → spacing/cancel → Text Tab/edit/Apply/return → save/reopen, preserving view/visit and logical keyboard ownership. Source inspection and mounted test code cannot establish that workflow's usability. Attachment, transition, resize, private source8 and release/platform acceptance remain separate work.
|
||||
Reference in New Issue
Block a user