diff --git a/.gitattributes b/.gitattributes index 443f218e..b6c7a3e9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -70,3 +70,6 @@ harness/experiments/diagram-resize-foundation-20260912/** -text whitespace=-blan harness/experiments/delete-native-f7-20260912/** -text whitespace=-blank-at-eol,-blank-at-eof,cr-at-eol harness/experiments/canvas-editing-followup-20260912/** -text whitespace=-blank-at-eol,-blank-at-eof,cr-at-eol harness/experiments/resize-port-policy-20260912/** -text whitespace=-blank-at-eol,-blank-at-eof,cr-at-eol +harness/experiments/canvas-native-83f53c7-20260912/** -text whitespace=-blank-at-eol,-blank-at-eof,cr-at-eol +harness/experiments/nested-lifecycle-union-20260912/** -text whitespace=-blank-at-eol,-blank-at-eof,cr-at-eol +harness/experiments/canvas-native-d61f1f3-20260912/** -text whitespace=-blank-at-eol,-blank-at-eof,cr-at-eol diff --git a/harness/STATE.md b/harness/STATE.md index 9fe93263..d42c35f3 100644 --- a/harness/STATE.md +++ b/harness/STATE.md @@ -82,12 +82,26 @@ positional focus-tree replacement and includes nested activations and redundant canvas-control removal. Strict lint found two obsolete event variants, removed by 4015498. Combined source **83f53c7c6e277e250f06d2ae6bfa6a7988bd2e4b** now passes all 834 Windows desktop tests, strict all-target Clippy and the matching GUI build -with all 533 source inputs unchanged. Native acceptance remains pending. The +with all 533 source inputs unchanged. Its bounded native trial passes the original +architecture/state Save/Undo focus sequences, Inspector text protection and bound +scenario Save/reopen with exact Project/SourceBundle comparisons. It exposes +message-label backgrounds erasing nested activation borders, so rendering +acceptance remains open. Correction **d61f1f3** preserves the strokes and their +selection priority; all 836 Windows desktop tests, strict all-target Clippy and +the matching GUI build pass with all 533 inputs unchanged. Its +[native recheck](release-canvas-native-d61f1f3-20260912.md) passes border continuity +and exposed-shoulder versus exact-message selection in bound OA/SA and reentrant +scenes, including minimum-window Fit; Save preserves the exact Project/SourceBundle. +Palette/readability remains open. The [canvas follow-up evidence](release-canvas-followup-20260912.md) preserves exact failures, reviews and validated bound OA/SA evaluator fixtures. Complete direct manipulation, persistent process placement/lanes and coherent peer integration remain open. Gitea owns live coordination. +[Native follow-up evidence](release-canvas-native-83f53c7-20260912.md) records +the normally closed source83 trial, observed defect, minimum-size layout and +the boundary between state and scenario keyboard policies. + Complete quantities/calculations/constraints, maintained libraries, graphical/ source/REST parity, transitions and engineering-task usability, aligned reST/help, optimized packages and final independent acceptance remain required. Finite diff --git a/harness/experiments/canvas-editing-followup-20260912/activation-assertion-handoff.md b/harness/experiments/canvas-editing-followup-20260912/activation-assertion-handoff.md new file mode 100644 index 00000000..fdf0442f --- /dev/null +++ b/harness/experiments/canvas-editing-followup-20260912/activation-assertion-handoff.md @@ -0,0 +1,13 @@ +# Atomic Call/Reply activation assertion migration + +Owner: `/root/nested_call_design`; root owns integration, Gitea and serialized compiler/native acceptance. Isolated worktree `.local/activation-assertion-20260912`, branch `codex/activation-assertion-956atf-20260912`, base `4015498`. Only `crates/oa-desktop/src/behavior/scenario.rs` is changed. + +Committed correction: `10eb86d00f39cdf17df58513305bfe283fa34b74`; isolated worktree clean. Root confirmed the completed base gate: 833 passed, one failed, zero ignored; the exact failure at scenario.rs:3256 was the stale generic-box assertion. All 12 typed activation tests passed in that base gate. These are root-reported base results, not execution of this correction. + +The existing `graphical_call_reply_is_atomic_correlated_and_source_equivalent` test still searched generic Scene boxes for a Call rectangle of width 8. The production renderer now consumes typed `Scene::activations`; its new dimension is not an appropriate replacement semantic assertion. The correction keeps all original atomic two-step creation, exact model reply correlation/endpoints, whole-Project canonical source roundtrip, exclusion of already-replied Calls from the reply picker, and complete undo restoration checks. + +The replacement asserts exactly one typed segment with the correct Call, receiving lifeline, ordered scope, and `Finish::Reply` ID. Its finite, positive rectangle must begin at the actual Call receive endpoint and end at the actual Reply send endpoint, both on the same rectangle edge. There must be no generic Call box or open marker. An interior hit must select the Call, with explicit preconditions proving that point is outside message-line slop and labels. The rectangle under test is the exact data consumed by `Scene::draw` for its square fill and outline (`behavior.rs`, activation loop); this is source/geometry evidence, not a claim of rendered pixels or low-scale legibility. + +Search of `crates/oa-desktop/src` for old width-8 comparisons and constructions found only this stale assertion plus an unrelated 8-by-4 palette icon. No other Call-box assertions were changed. + +Checks performed: source review, standalone installed `rustfmt.exe --edition 2024 --config skip_children=true` on the owned file, and `git diff --check`. Initial PATH-only `rustfmt` lookup failed; using the existing `.local/toolchain/rustup/toolchains/stable-x86_64-pc-windows-gnullvm/bin/rustfmt.exe` succeeded. No Cargo, rustc, test run, native interaction, root tracked edit, or Gitea action. Root's running full-suite failure receipt remains authoritative; the replacement needs the focused existing test and subsequent required combined gate after inputs may change. diff --git a/harness/experiments/canvas-editing-followup-20260912/activation-label-paint-handoff.md b/harness/experiments/canvas-editing-followup-20260912/activation-label-paint-handoff.md new file mode 100644 index 00000000..439f19bd --- /dev/null +++ b/harness/experiments/canvas-editing-followup-20260912/activation-label-paint-handoff.md @@ -0,0 +1,25 @@ +# Activation border / label backplate repair + +Source-only contribution by `/root/nested_call_design`, isolated worktree `.local/activation-label-paint-20260912`, branch `codex/activation-label-paint-956atf-20260912`, base `419c78c07142961feff4f9ede46adf7d4bd014eb`. Root owns integration, Gitea, compiler and native acceptance. + +Committed correction: `d50be10378e90498c2d4c293b377dd9f97ee00af`. Isolated worktree is clean. + +## Verified diagnosis + +Inspected `.local/native-qa/canvas-followup-20260912-01/evidence/oa-outer-activation-selected-0.png` with the image tool. Its SHA-256 is `63D85E7C13B688594D8CD429E5631BCF55F2D4528B3837316A9AE542F2E7CBA4`. The screenshot shows interrupted selected outer execution borders immediately above C2, R2 and R1. Approximate screen x=441..666 label backplates overlap the x=663 outer border although displayed text ends near x=600. `behavior.rs` places message labels 26 units above each row, paints a white backplate up to 225 units wide and 22 high, then paints shortened text. Those backplates were painted after activation fills/outlines. The source predicts exactly the repeated gaps; this is painter ordering, not segmented activation geometry or lost reply correlation. + +The examined renderer file is unchanged between root's native build `83f53c7` and the worktree base; its pre-repair SHA-256 is `3089D88A8FA66ECAA2151F2F55A85C71DE30E556457FCD52FDBD0CA1184B59D8`. Related hit inspection found that 225-by-25 label hit rectangles took priority over activation rectangles in those same bands. Root explicitly authorized correcting that priority along with painting. + +## Bounded correction + +Only `crates/oa-desktop/src/behavior.rs` and `behavior/scenario_activation/tests.rs` change. Backplates now paint after lifeline guides and before activation fills/strokes and cards. Message segments, arrowheads and text retain their foreground pass. This preserves guide masking beneath labels, keeps self-call segments/arrowheads above the masks, and leaves lifeline header fill/text above them. Repainting activation fills in the foreground was rejected because it could obscure anchored arrowheads and messages. + +Hit order becomes titled boxes, precise message segments, activation rectangles, label rectangles, then broad message tolerance. Label extents themselves are unchanged. The formerly exposed Call shoulder now selects its Call while exact message points and label text outside activations remain message targets. No model/schema/anchors/dimensions, global palette, text content or truncation changes. Unselected pale borders and minimum-scale usability remain separate issue 26/native acceptance concerns. + +## Evaluators and status + +`activation_shoulders_under_label_backplates_select_their_call` uses production OA and SA Project/Scene fixtures, long labels, and exact C2/R2/R1 shoulder points within the prior backplates. Preconditions exclude broad message-line slop. It checks C1 selection at those points, message-label selection outside activations, and precise endpoint selection for all four occurrences. + +`long_message_backplates_do_not_erase_selected_activation_border_pixels` uses the existing supported headless WGPU renderer, production Canvas widget and `Scene::draw`. It inspects RGBA screenshot pixels at the selected outer border through three label-height bands, allowing antialiasing tolerance. It would detect the original white erasure rather than merely asserting a separately constructed paint-order list. Installed `iced_wgpu` source explicitly documents RGBA screenshots. It tests ordinary-scale pixel continuity, not minimum-scale legibility or a whole-window native workflow. + +Executed: scoped standalone rustfmt (edition 2024, skip_children=true), source review and git diff whitespace checks. **No compiler, Cargo, test execution, native interaction or root tracked edits.** Root must run both new tests and required combined gates, then recheck the bound native OA/SA/reentrant scenarios, headers/labels/self loops, arrow endpoints and the same selected-border bands. Existing semantic, atomic creation, undo and source-equivalence tests remain intact. diff --git a/harness/experiments/canvas-editing-followup-20260912/activation-label-paint-independent-review.md b/harness/experiments/canvas-editing-followup-20260912/activation-label-paint-independent-review.md new file mode 100644 index 00000000..8da70581 --- /dev/null +++ b/harness/experiments/canvas-editing-followup-20260912/activation-label-paint-independent-review.md @@ -0,0 +1,26 @@ +# Independent paint-repair review — 2026-09-12 + +Reviewed root commit **d61f1f38779ab70a77efcde523ae31c432aefcfd**, integrating worker **d50be10378e90498c2d4c293b377dd9f97ee00af**, against419c78c. Read the handoff and both changed files, surrounding Scene painter/hit logic, mounted renderer construction and installed WGPU screenshot contract. Visually inspected the preserved native witness `.local/native-qa/canvas-followup-20260912-01/evidence/oa-outer-activation-selected-0.png`. No compiler/test/UI/Gitea action or code edit. This report is the sole reviewer-written artifact. + +**No actionable source defect found in the bounded repair.** The changes address the observed backplate erasure and corresponding shoulder hit priority. Current combined test/native acceptance remains root-owned; this review does not establish a pass. + +## Painter and hit behavior + +`crates/oa-desktop/src/behavior.rs:1984–1995` moves all label backgrounds after guides but before activation and card fills/strokes. Message paths, arrowheads and shortened text remain afterward at2039–2084, with card/header text later. This removes the specific white bands visible above C2/R2/R1 in the native witness without repainting filled activations over anchored message ends. + +The order also preserves self-loop geometry: every background now precedes every message path, so a later message's white mask cannot erase an earlier self-loop arm or arrowhead. Boxes/header fills still cover backgrounds, and their text stays above message backgrounds. The repair changes no geometry or endpoint correlation. Existing card/message overlap policy is unchanged apart from lowering white masks. + +At `behavior.rs:1611–1663`, titled boxes retain first priority. Exact message segments retain priority over activation rectangles; activations now precede approximate label rectangles, which in turn precede broad message tolerance. This matches the targeted exposed shoulder: the old overly wide label rectangle no longer steals it. Message text outside bars remains selectable, while exact endpoints still select their messages. The fixed1.5 world-unit precise tolerance and broad8/scale tolerance are pre-existing policies, not new focus/hit semantics introduced by this repair. + +The OA/SA shoulder test at `behavior/scenario_activation/tests.rs:130` establishes that each selected point is inside both the outer bar and old white mask, and outside even the broad message-line tolerance. It also checks label selection outside activations and both endpoints of all four occurrences. Those are discriminating checks of the intended priority change, without conflating a shoulder with an actual message line. + +## Pixel evaluator adequacy + +The test at `scenario_activation/tests.rs:162` draws the production Canvas/Scene through the existing WGPU headless renderer, then reads actual screenshot pixels. Installed `iced_wgpu-0.14.0/src/lib.rs:182` explicitly documents RGBA bytes, consistent with the test indexing. + +For its two-lane fixture, lane x coordinates are160 and400. The selected outer left border is394; tested label masks start around172 and extend to397. Thus the entire sampled x392…396 strip lies under the old backplate, rather than accidentally sampling an uncovered border outside it. The y samples are label+3…19, several pixels above the message at label+26 and its arrowhead. Only the outer call is selected/teal; inner messages/bars, guides and their labels are gray. A gray glyph or inner border is therefore not a credible source of teal matching at every one of17 rows in each of three bands. + +The original ordering is source-predicted to erase those sampled pixels, while the new ordering should restore selected-border continuity. This is stronger than inspecting a fabricated paint-order list or accepting “any colored pixel” in a large area. No pre-repair negative-control execution was performed by this reviewer, and antialiasing/color tolerance still needs the actual root gate result. + +Its scope is intentionally narrow: ordinary scale, selected OA outer bar, three white-mask intersections, and actual painter output. It does not measure unselected pale contrast, all self-loop/arrowhead pixels, minimum-scale usability, text collisions or a complete native window. Existing geometry tests plus the root's same-source native bound OA/SA/reentrant/header/self-loop checks remain necessary. Peer lifecycle integration and palette improvements remain separate work. + diff --git a/harness/experiments/canvas-editing-followup-20260912/manifest.json b/harness/experiments/canvas-editing-followup-20260912/manifest.json index 4113ca84..db92ba09 100644 --- a/harness/experiments/canvas-editing-followup-20260912/manifest.json +++ b/harness/experiments/canvas-editing-followup-20260912/manifest.json @@ -138,5 +138,25 @@ "file": "independent-focus-review.md", "bytes": 7050, "sha256": "a3e17f387eebf1c15b508ad2afc4d91602192ce1bbe9eca84189e1599809b722" + }, + { + "file": "activation-assertion-handoff.md", + "bytes": 2706, + "sha256": "f5ba841ca824ebd084375da28ecd5fb1622667e005537741edfe3f3a63297df4" + }, + { + "file": "activation-label-paint-handoff.md", + "bytes": 4133, + "sha256": "746a4fad5b717af45ae5decc01d308f067afe8faf71ce9ac7afc86fc077c374a" + }, + { + "file": "activation-label-paint-independent-review.md", + "bytes": 4475, + "sha256": "e0e8371057ba6dc938846e826e9374317a443a8b4dd04f3b1273dc3ebc827a3f" + }, + { + "file": "nested-lifecycle-union-review.md", + "bytes": 9975, + "sha256": "9fae22f29d7f2f0b8efa2731aa9a1bbc11ae9c2a9832ea2ba358ffd4f7451dd9" } ] diff --git a/harness/experiments/canvas-editing-followup-20260912/nested-lifecycle-union-review.md b/harness/experiments/canvas-editing-followup-20260912/nested-lifecycle-union-review.md new file mode 100644 index 00000000..39d9b859 --- /dev/null +++ b/harness/experiments/canvas-editing-followup-20260912/nested-lifecycle-union-review.md @@ -0,0 +1,46 @@ +# Nested activation / lifecycle union review — 2026-09-12 + +Bounded independent source review for root-owned #21. Read [peer comment698](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/21#issuecomment-698) by Codex-ytr83r at22:23:59UTC and relevant #2 publication comments. No source edits, compilation, UI, Gitea mutation or integration approval. The active paint-repair worker's ownership is unchanged. + +## Exact source boundary + +- Root typed activation source inspected at **83f53c7c6e277e250f06d2ae6bfa6a7988bd2e4b**. Its activation implementation is unchanged by root HEAD419c78c at review time. `crates/oa-desktop/src/behavior.rs:23–26` compiles scenario_lifecycle only for tests; `scenario_activation.rs:99–119` emits raw spans. +- Peer experimental source inspected directly through Gitea at **911f63e63ca9e35af631ae02cbf731f2b34b72a2**. [behavior.rs](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/911f63e63ca9e35af631ae02cbf731f2b34b72a2/crates/oa-desktop/src/behavior.rs) blob **3f9fd97e038733ac92749b1543e9fa68cd3dda2c** has production lifecycle wiring and the two-site test-only Scene anchor hook. +- Confirmed that lifecycle support predates that unexecuted experiment by reading published checkpoint **7aa007b0777aa182a99f46e90eeb9b2558f3ad2a**. Its [behavior.rs](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/7aa007b0777aa182a99f46e90eeb9b2558f3ad2a/crates/oa-desktop/src/behavior.rs) blob **d199096df61cacde7858ab1915f352b5c479e347** has production module line23, align_messages line1329 and alive_spans clipping line1655. The checkpoint identifies its implementation as33e30c1; peer reported gates are not rerun or adopted here. +- [scenario_lifecycle/render.rs](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/911f63e63ca9e35af631ae02cbf731f2b34b72a2/crates/oa-desktop/src/behavior/scenario_lifecycle/render.rs) is **identical blob a066d9671cb60070f507d8840977e100aac89792** at911f63e and7aa007b. `scenario_lifecycle.rs` at911f63e is blob **6fe044890864ecf3095d0fedf590104f6121abf7**. + +**Peer698 is substantively correct: this is an explicit union dependency, not evidence that either branch regressed an already integrated counterpart. Do not replace either renderer wholesale or treat911f63e's source experiment as accepted implementation.** + +## Required integration contract + +1. **One ordered geometry pipeline.** Record occurrences/rows/scopes after peer's16-unit self-Create/Delete clearance and any test-only row-anchor hook (peer behavior.rs1432–1454). Establish final scene height before Rendering::new, which uses height−20 as its root extent (render.rs32–65). Build lifecycle from those same world coordinates, align Create/Delete messages, then derive typed activations and final Call/Reply anchors. Do not run the old and new activation_sequence implementations together. The pre-row hook remains upstream and cfg(test); it is not a persisted-layout contract. + +2. **Keep message kinds' endpoint meanings separate.** Lifecycle align_messages (render.rs113–151) places a self-Create/Delete receive point on its marker row and send point24 above; Create points at the capsule edge. Root typed activation anchoring (scenario_activation.rs216) intentionally handles Call/Reply/Asynchronous only. Keep that exclusion: a self-Call starts at its lower receive endpoint, while self-Create/Delete's marker row must not be shifted or rewritten as a Call loop. Both aligners must preserve occurrence IDs and use the same recorded rows. + +3. **Clip visible activation pieces by receiver AND exact scope.** alive_spans (render.rs154–175) intersects only Life::Alive intervals with the requested extent and rejects absent/unresolved regions. It may return zero, one or multiple pieces. Peer lifecycle projection gives siblings the same entry rather than the previous screen operand's exit, and marks conditional/repeated/parallel continuation unresolved when appropriate (scenario_lifecycle.rs197–205,246–273). Preserve that conservative meaning unless root separately decides otherwise. A parent activation must not bridge a death, pre-birth region or another operand merely because screen y is continuous. Retain typed call/receiver/scope/column identity for each surviving piece. + +4. **Keep logical correlation timing distinct from clipped rectangle edges.** Root currently reconstructs Correlation.start and reply times from Segment.rect/Finish at scenario_activation.rs216–232; reply anchoring finds a segment by Finish::Reply without checking that its visible end is the reply's send y (around258–265). Blindly clipping rects while retaining the original finish on every piece is unsafe. + + Concrete union falsifier: raw Call at148, receiver Delete at240, correlated Reply at332. Clipping the Call→Reply segment to148…240 and leaving Finish::Reply(reply332) makes the geometric end look like a reply at240. It also lets the actual reply at332 attach to that displaced execution's x despite no visible execution there. If several alive pieces survive, copying Reply to all pieces creates ambiguous first-match anchoring. Conversely, simply deleting Reply metadata can erase the real correlation used to distinguish crossed calls. + + Required observable rule: only a visible piece that actually reaches the terminal reply-send coordinate can supply that reply anchor/cap. A lifetime-clipped end is not a reply. Preserve original call/compatible-reply timing for correlation decisions even when its visible representation is clipped or absent. This can be a small separation of logical metadata from visible fragments; it is not a request for another traversal engine or new model schema. + +5. **Deletion terminates the local execution without pretending to answer the call.** Peer behavior.rs1723–1734 explicitly handles receiver Delete, clips at death, preserves an unanswered-call cue, and stops that local traversal. Root Finish currently has Reply/Boundary/Continuation/Open but no explicit death terminal. Decide a typed representation that distinguishes “execution terminated, call unanswered” from both reply and ordinary continuation. Preserve the sibling-open path and unresolved post-fragment state. Do not derive all unresolved cues only from surviving clipped fragments: an entirely invisible fragment can otherwise erase the semantic uncertainty cue. Nor may a later Create automatically resurrect an execution already terminated by Delete. + +6. **Columns, hit geometry and paint use the same visible pieces.** One call's related pieces must retain a consistent chosen track; clipping cannot silently change call identity or make different siblings chronological. No active_segment result may come from an absent interval or from fabricated nesting caused by clipped start/end times (root scenario_activation.rs313–380). Preserve source/receiver anchors at real events, marker hit identity, and the paint worker's existing selection/layering correction. Integration must explicitly reconcile lifecycle lanes/markers with that painter; this report does not allocate or edit its files. + +## Minimal combined acceptance cases before adoption + +Retain the existing root nested/crossed/reentrant/self/UUID tests and peer lifecycle tests, adapting representations rather than dropping assertions. Add these discriminating combined cases in OA and SA where the core admits them: + +- Delayed Create → C1 → C2 → R2 → R1 → Delete: typed starts are actual call receives, each reply reaches its correlated visible end, and bars remain inside alive spans. +- C1 → ALT(left: Delete; right: empty): preserve left death termination plus unanswered cue, right26-unit open span, and no definite post-frame bar. Peer `render_tests.rs:478–545` already provides the independent lifecycle oracle. Replace its width8 anonymous-box lookup with typed call/receiver/scope lookup; preserve the actual assertions. +- Call before delayed birth, Call spanning Delete, and a later correlated Reply after Delete: preserve admitted semantic data and lifecycle uncertainty; no invented reply finish at a clipping boundary or detached bar anchor. If a constructed sequence is rejected by core semantics, record that and use an admitted incomplete case. +- Delete then later Create: no automatic resurrection of the prior terminated activation. Multiple alive pieces must not duplicate reply finishes or unresolved cues. +- Self-Create/Delete after an Action retains16-unit clearance, marker receive row and hit identity; self-Call/Reply still uses the typed lower receive start. Peer `render_tests.rs:666–737` covers the marker half. +- Crossed replies spanning a clipped/uncertain operand: compare original compatible correlation endpoints so clipping cannot manufacture an innermost caller execution. +- Passive source roundtrip and moved test-only anchors compare **both** lifecycle geometry and complete typed segment tuples, plus final polylines, IDs, labels, frames and whole Project. Peer Scene experiment `mod.rs:88–104` already compares lifecycle but predates typed segments. Keep that assertion and add segment metadata. Its baseline self-call x oracle at175–178 must change from lane+75 to the actual typed lane/lane+66/lane+66/lane+6 for its isolated self-call; its send/receive y oracle remains636/660. +- Native pan/zoom and selection at birth/death markers and each exposed nested shoulder, including unselected bars, must verify the final combined painter. Root's native83f53c7 and peer historical renderer results each remain scoped to their own source. + +The bounded Scene experiment at911f63e is explicitly uncompiled/unexecuted and does not cover delayed creation/deletion or nested activations. Passing its seven tests alone could not establish this union. Required interface decisions are the endpoint/clip/finish distinction and one geometry pipeline; no peer schema or general free-editing policy is accepted by this review. + diff --git a/harness/experiments/canvas-native-83f53c7-20260912/bound-baseline/README.md b/harness/experiments/canvas-native-83f53c7-20260912/bound-baseline/README.md new file mode 100644 index 00000000..0d1642e3 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/bound-baseline/README.md @@ -0,0 +1 @@ +Open bound-nested-calls.arcadia. In Behavior select OA Nested pressure checks, SA Nested pressure checks, or OA Reentrant pressure review. Each has two lifelines and four rows ordered C1,C2,R2,R1. C1 requests 420.0 kPa and R1 returns 418.0; C2 requests 380.0 and R2 returns 378.0. The SA messages resolve an actual synchronous interface-operation allocation; Replies derive it from their exact Calls. OA uses a bound Interaction carrying an Operation item without SA-only OperationUse. The reentrant case uses an explicit reverse Interaction for C2/R2. Check unselected bars, both reply ends, each bar's selection, Properties values/correlation, source parity and save/reopen. scenario-identities.tsv lists every UI target UUID. diagnostics.txt records completeness warnings. Generator validation and roundtrip are not desktop paint or native acceptance. diff --git a/harness/experiments/canvas-native-83f53c7-20260912/bound-baseline/bound-nested-calls.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/bound-baseline/bound-nested-calls.arcadia new file mode 100644 index 00000000..45d95f6d --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/bound-baseline/bound-nested-calls.arcadia @@ -0,0 +1,486 @@ +arcadia 7; +project bound_nested_calls "Bound nested pressure checks" id "21b00d00-0000-4000-8000-000000000001" { + description "Native activation acceptance. Requested 420/380 kPa, measured 418/378 kPa. Unicode readback: Δ pressure · 戻り値."; + + oa_activity bound_100 "Review pressure demand" id "21b00d00-0000-4000-8000-000000000064" { + description ""; + parent none; + } + + oa_activity bound_101 "Inspect pressure" id "21b00d00-0000-4000-8000-000000000065" { + description ""; + parent none; + } + + oa_exchange_item bound_110 "Check pressure" id "21b00d00-0000-4000-8000-00000000006e" { + description ""; + kind Information; + mechanism Operation; + parent none; + supertype none; + } + + oa_data_field bound_111 "requested_pressure" id "21b00d00-0000-4000-8000-00000000006f" { + default none; + description ""; + direction In; + maximum 1; + minimum 1; + parent @bound_110; + storage Value; + type_ref Real; + unit "kPa"; + } + + oa_data_field bound_112 "measured_pressure" id "21b00d00-0000-4000-8000-000000000070" { + default none; + description ""; + direction Return; + maximum 1; + minimum 1; + parent @bound_110; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_actor bound_200 "Operator console" id "21b00d00-0000-4000-8000-0000000000c8" { + description ""; + parent none; + } + + sa_system bound_201 "Pressure service" id "21b00d00-0000-4000-8000-0000000000c9" { + description ""; + parent none; + } + + sa_port bound_202 "Client socket" id "21b00d00-0000-4000-8000-0000000000ca" { + contract { + Component { + kind Standard; + orientation Unset; + }; + }; + description ""; + legacy none; + parent @bound_200; + } + + sa_port bound_203 "Service socket" id "21b00d00-0000-4000-8000-0000000000cb" { + contract { + Component { + kind Standard; + orientation Unset; + }; + }; + description ""; + legacy none; + parent @bound_201; + } + + sa_exchange_item bound_210 "Check pressure" id "21b00d00-0000-4000-8000-0000000000d2" { + description ""; + kind Information; + mechanism Operation; + parent none; + supertype none; + } + + sa_data_field bound_211 "requested_pressure" id "21b00d00-0000-4000-8000-0000000000d3" { + default none; + description ""; + direction In; + maximum 1; + minimum 1; + parent @bound_210; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_data_field bound_212 "measured_pressure" id "21b00d00-0000-4000-8000-0000000000d4" { + default none; + description ""; + direction Return; + maximum 1; + minimum 1; + parent @bound_210; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_interface bound_213 "Pressure check API" id "21b00d00-0000-4000-8000-0000000000d5" { + description ""; + parent none; + supertype none; + } + + oa_scenario bound_1000 "OA Nested pressure checks" id "21b00d00-0000-4000-8000-0000000003e8" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_1040, @bound_1030, @bound_1060, @bound_1050]; + viewpoint OperationalActivity; + } + + oa_lifeline bound_1001 "L1 Console" id "21b00d00-0000-4000-8000-0000000003e9" { + description ""; + parent @bound_1000; + represented @bound_100; + } + + oa_lifeline bound_1002 "L2 Inspector" id "21b00d00-0000-4000-8000-0000000003ea" { + description ""; + parent @bound_1000; + represented @bound_101; + } + + oa_occurrence bound_1030 "C2 380 kPa" id "21b00d00-0000-4000-8000-000000000406" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_1002; + reply_to none; + sender @bound_1001; + values [{ + expression "380.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1040 "C1 420 kPa" id "21b00d00-0000-4000-8000-000000000410" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_1002; + reply_to none; + sender @bound_1001; + values [{ + expression "420.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1050 "R1 418 kPa" id "21b00d00-0000-4000-8000-00000000041a" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_1001; + reply_to @bound_1040; + sender @bound_1002; + values [{ + expression "418.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1060 "R2 378 kPa" id "21b00d00-0000-4000-8000-000000000424" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_1001; + reply_to @bound_1030; + sender @bound_1002; + values [{ + expression "378.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + sa_scenario bound_2000 "SA Nested pressure checks" id "21b00d00-0000-4000-8000-0000000007d0" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_2040, @bound_2030, @bound_2060, @bound_2050]; + viewpoint BoundaryInterface; + } + + sa_lifeline bound_2001 "L1 Console" id "21b00d00-0000-4000-8000-0000000007d1" { + description ""; + parent @bound_2000; + represented @bound_200; + } + + sa_lifeline bound_2002 "L2 Inspector" id "21b00d00-0000-4000-8000-0000000007d2" { + description ""; + parent @bound_2000; + represented @bound_201; + } + + sa_occurrence bound_2030 "C2 380 kPa" id "21b00d00-0000-4000-8000-0000000007ee" { + body { + Exchange { + exchange @bound_223; + message_kind Call; + operation { + allocation @bound_220; + }; + receiver @bound_2002; + reply_to none; + sender @bound_2001; + values [{ + expression "380.0"; + field @bound_211; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2040 "C1 420 kPa" id "21b00d00-0000-4000-8000-0000000007f8" { + body { + Exchange { + exchange @bound_223; + message_kind Call; + operation { + allocation @bound_220; + }; + receiver @bound_2002; + reply_to none; + sender @bound_2001; + values [{ + expression "420.0"; + field @bound_211; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2050 "R1 418 kPa" id "21b00d00-0000-4000-8000-000000000802" { + body { + Exchange { + exchange @bound_223; + message_kind Reply; + receiver @bound_2001; + reply_to @bound_2040; + sender @bound_2002; + values [{ + expression "418.0"; + field @bound_212; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2060 "R2 378 kPa" id "21b00d00-0000-4000-8000-00000000080c" { + body { + Exchange { + exchange @bound_223; + message_kind Reply; + receiver @bound_2001; + reply_to @bound_2030; + sender @bound_2002; + values [{ + expression "378.0"; + field @bound_212; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + oa_scenario bound_3000 "OA Reentrant pressure review" id "21b00d00-0000-4000-8000-000000000bb8" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_3040, @bound_3030, @bound_3060, @bound_3050]; + viewpoint OperationalActivity; + } + + oa_lifeline bound_3001 "L1 Console" id "21b00d00-0000-4000-8000-000000000bb9" { + description ""; + parent @bound_3000; + represented @bound_100; + } + + oa_lifeline bound_3002 "L2 Inspector" id "21b00d00-0000-4000-8000-000000000bba" { + description ""; + parent @bound_3000; + represented @bound_101; + } + + oa_occurrence bound_3030 "C2 380 kPa" id "21b00d00-0000-4000-8000-000000000bd6" { + body { + Exchange { + exchange @bound_121; + message_kind Call; + receiver @bound_3001; + reply_to none; + sender @bound_3002; + values [{ + expression "380.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3040 "C1 420 kPa" id "21b00d00-0000-4000-8000-000000000be0" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_3002; + reply_to none; + sender @bound_3001; + values [{ + expression "420.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3050 "R1 418 kPa" id "21b00d00-0000-4000-8000-000000000bea" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_3001; + reply_to @bound_3040; + sender @bound_3002; + values [{ + expression "418.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3060 "R2 378 kPa" id "21b00d00-0000-4000-8000-000000000bf4" { + body { + Exchange { + exchange @bound_121; + message_kind Reply; + receiver @bound_3002; + reply_to @bound_3030; + sender @bound_3001; + values [{ + expression "378.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + interaction bound_120 "Pressure check" id "21b00d00-0000-4000-8000-000000000078" { + description ""; + items [@bound_110]; + source @bound_100; + target @bound_101; + } + + interaction bound_121 "Demand review callback" id "21b00d00-0000-4000-8000-000000000079" { + description ""; + items [@bound_110]; + source @bound_101; + target @bound_100; + } + + interface_item_allocation bound_220 "Synchronous pressure check" id "21b00d00-0000-4000-8000-0000000000dc" { + acquisition Unspecified; + description ""; + order 0; + source @bound_213; + target @bound_210; + transmission Synchronous; + } + + interface_requirement bound_221 "Console requires check" id "21b00d00-0000-4000-8000-0000000000dd" { + description ""; + source @bound_202; + target @bound_213; + } + + interface_provision bound_222 "Service provides check" id "21b00d00-0000-4000-8000-0000000000de" { + description ""; + source @bound_203; + target @bound_213; + } + + boundary_exchange bound_223 "Pressure channel" id "21b00d00-0000-4000-8000-0000000000df" { + description ""; + items [@bound_210]; + oriented false; + source @bound_202; + target @bound_203; + } + +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/bound-baseline/diagnostics.txt b/harness/experiments/canvas-native-83f53c7-20260912/bound-baseline/diagnostics.txt new file mode 100644 index 00000000..b026a721 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/bound-baseline/diagnostics.txt @@ -0,0 +1,24 @@ +[ + Issue { + severity: Warning, + element: Some( + 21b00d00-0000-4000-8000-000000000064, + ), + code: "unallocated_leaf", + field: Some( + "allocation", + ), + message: "Allocate leaf 'Review pressure demand' to a performer.", + }, + Issue { + severity: Warning, + element: Some( + 21b00d00-0000-4000-8000-000000000065, + ), + code: "unallocated_leaf", + field: Some( + "allocation", + ), + message: "Allocate leaf 'Inspect pressure' to a performer.", + }, +] diff --git a/harness/experiments/canvas-native-83f53c7-20260912/bound-baseline/scenario-identities.tsv b/harness/experiments/canvas-native-83f53c7-20260912/bound-baseline/scenario-identities.tsv new file mode 100644 index 00000000..7cd0cd19 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/bound-baseline/scenario-identities.tsv @@ -0,0 +1,4 @@ +scenario owner L1 L2 C1 C2 R2 R1 +OA Nested pressure checks 21b00d00-0000-4000-8000-0000000003e8 21b00d00-0000-4000-8000-0000000003e9 21b00d00-0000-4000-8000-0000000003ea 21b00d00-0000-4000-8000-000000000410 21b00d00-0000-4000-8000-000000000406 21b00d00-0000-4000-8000-000000000424 21b00d00-0000-4000-8000-00000000041a +SA Nested pressure checks 21b00d00-0000-4000-8000-0000000007d0 21b00d00-0000-4000-8000-0000000007d1 21b00d00-0000-4000-8000-0000000007d2 21b00d00-0000-4000-8000-0000000007f8 21b00d00-0000-4000-8000-0000000007ee 21b00d00-0000-4000-8000-00000000080c 21b00d00-0000-4000-8000-000000000802 +OA Reentrant pressure review 21b00d00-0000-4000-8000-000000000bb8 21b00d00-0000-4000-8000-000000000bb9 21b00d00-0000-4000-8000-000000000bba 21b00d00-0000-4000-8000-000000000be0 21b00d00-0000-4000-8000-000000000bd6 21b00d00-0000-4000-8000-000000000bf4 21b00d00-0000-4000-8000-000000000bea diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-delete-save/notes.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-delete-save/notes.arcadia new file mode 100644 index 00000000..e65a1fc7 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-delete-save/notes.arcadia @@ -0,0 +1,2 @@ +// Preserve deletion evidence 雨. +// Exact bytes matter. diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-delete-save/project.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-delete-save/project.arcadia new file mode 100644 index 00000000..2d1c65c8 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-delete-save/project.arcadia @@ -0,0 +1,228 @@ +arcadia 7; +project delete_oracle "Delete oracle" id "de1e7e00-0000-4000-8000-000000000001" { + include "notes.arcadia"; + description ""; + + oa_activity delete_10 "Target work" id "de1e7e00-0000-4000-8000-00000000000a" { + description ""; + parent none; + } + + oa_activity delete_11 "Untouched work" id "de1e7e00-0000-4000-8000-00000000000b" { + description ""; + parent none; + } + + oa_entity delete_12 "OA Dispatch team" id "de1e7e00-0000-4000-8000-00000000000c" { + description ""; + parent none; + } + + oa_scenario delete_20 "Reference scenario" id "de1e7e00-0000-4000-8000-000000000014" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps []; + viewpoint OperationalActivity; + } + + oa_lifeline delete_21 "Target reference" id "de1e7e00-0000-4000-8000-000000000015" { + description ""; + parent @delete_20; + represented @delete_10; + } + + sa_function delete_50 "SA Initialize controller" id "de1e7e00-0000-4000-8000-000000000032" { + description ""; + parent none; + } + + sa_state_machine delete_51 "SA Controller modes" id "de1e7e00-0000-4000-8000-000000000033" { + description ""; + parent none; + } + + sa_region delete_52 "SA Main region" id "de1e7e00-0000-4000-8000-000000000034" { + description ""; + parent @delete_51; + } + + sa_state delete_53 "SA Ready" id "de1e7e00-0000-4000-8000-000000000035" { + description ""; + do_activity ""; + entry ""; + exit ""; + kind State; + parent @delete_52; + } + + allocation delete_13 "OA performs target work" id "de1e7e00-0000-4000-8000-00000000000d" { + description ""; + source @delete_12; + target @delete_10; + } + + state_action delete_54 "SA Entry initialize" id "de1e7e00-0000-4000-8000-000000000036" { + description ""; + phase Entry; + source @delete_53; + target @delete_50; + } + + diagram view_30 "Work view 30" id "de1e7e00-0000-4000-8000-00000000001e" { + description ""; + layer Oa; + projection Allocation; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + + + + + + + + + + + + + + + + + + + node node_32 id "de1e7e00-0000-4000-8000-000000000020" { + collapsed false; + diagram @view_30; + element @delete_12; + position { + x 40.0; + y 40.0; + }; + size { + height 230.0; + width 380.0; + }; + } + + diagram view_40 "Work view 40" id "de1e7e00-0000-4000-8000-000000000028" { + description ""; + layer Oa; + projection Allocation; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_41 id "de1e7e00-0000-4000-8000-000000000029" { + collapsed false; + diagram @view_40; + element @delete_10; + position { + x 80.0; + y 80.0; + }; + size { + height 90.0; + width 180.0; + }; + } + + node node_42 id "de1e7e00-0000-4000-8000-00000000002a" { + collapsed false; + diagram @view_40; + element @delete_12; + position { + x 40.0; + y 40.0; + }; + size { + height 230.0; + width 380.0; + }; + } + + diagram sa_modes_view "SA Controller modes view" id "de1e7e00-0000-4000-8000-00000000003c" { + description ""; + layer Sa; + projection { + StateMachine { + machine @delete_51; + }; + }; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_61 id "de1e7e00-0000-4000-8000-00000000003d" { + collapsed false; + diagram @sa_modes_view; + element @delete_51; + position { + x 40.0; + y 40.0; + }; + size { + height 460.0; + width 620.0; + }; + } + + node node_62 id "de1e7e00-0000-4000-8000-00000000003e" { + collapsed false; + diagram @sa_modes_view; + element @delete_52; + position { + x 60.0; + y 95.0; + }; + size { + height 380.0; + width 580.0; + }; + } + + node node_63 id "de1e7e00-0000-4000-8000-00000000003f" { + collapsed false; + diagram @sa_modes_view; + element @delete_53; + position { + x 100.0; + y 155.0; + }; + size { + height 190.0; + width 320.0; + }; + } + +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-final-restored/notes.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-final-restored/notes.arcadia new file mode 100644 index 00000000..e65a1fc7 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-final-restored/notes.arcadia @@ -0,0 +1,2 @@ +// Preserve deletion evidence 雨. +// Exact bytes matter. diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-final-restored/project.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-final-restored/project.arcadia new file mode 100644 index 00000000..80374746 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-final-restored/project.arcadia @@ -0,0 +1,224 @@ +arcadia 7; +project delete_oracle "Delete oracle" id "de1e7e00-0000-4000-8000-000000000001" { + include "notes.arcadia"; + description ""; + + oa_activity delete_10 "Target work" id "de1e7e00-0000-4000-8000-00000000000a" { + description ""; + parent none; + } + + oa_activity delete_11 "Untouched work" id "de1e7e00-0000-4000-8000-00000000000b" { + description ""; + parent none; + } + + oa_entity delete_12 "OA Dispatch team" id "de1e7e00-0000-4000-8000-00000000000c" { + description ""; + parent none; + } + + oa_scenario delete_20 "Reference scenario" id "de1e7e00-0000-4000-8000-000000000014" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps []; + viewpoint OperationalActivity; + } + + oa_lifeline delete_21 "Target reference" id "de1e7e00-0000-4000-8000-000000000015" { + description ""; + parent @delete_20; + represented @delete_10; + } + + sa_function delete_50 "SA Initialize controller" id "de1e7e00-0000-4000-8000-000000000032" { + description ""; + parent none; + } + + sa_state_machine delete_51 "SA Controller modes" id "de1e7e00-0000-4000-8000-000000000033" { + description ""; + parent none; + } + + sa_region delete_52 "SA Main region" id "de1e7e00-0000-4000-8000-000000000034" { + description ""; + parent @delete_51; + } + + sa_state delete_53 "SA Ready" id "de1e7e00-0000-4000-8000-000000000035" { + description ""; + do_activity ""; + entry ""; + exit ""; + kind State; + parent @delete_52; + } + + allocation delete_13 "OA performs target work" id "de1e7e00-0000-4000-8000-00000000000d" { + description ""; + source @delete_12; + target @delete_10; + } + + state_action delete_54 "SA Entry initialize" id "de1e7e00-0000-4000-8000-000000000036" { + description ""; + phase Entry; + source @delete_53; + target @delete_50; + } + + diagram view_30 "Work view 30" id "de1e7e00-0000-4000-8000-00000000001e" { + description ""; + layer Oa; + projection Allocation; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_31 id "de1e7e00-0000-4000-8000-00000000001f" { + collapsed false; + diagram @view_30; + element @delete_10; + position { + x 80.0; + y 80.0; + }; + size { + height 90.0; + width 180.0; + }; + } + + node node_32 id "de1e7e00-0000-4000-8000-000000000020" { + collapsed false; + diagram @view_30; + element @delete_12; + position { + x 40.0; + y 40.0; + }; + size { + height 230.0; + width 380.0; + }; + } + + diagram view_40 "Work view 40" id "de1e7e00-0000-4000-8000-000000000028" { + description ""; + layer Oa; + projection Allocation; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_41 id "de1e7e00-0000-4000-8000-000000000029" { + collapsed false; + diagram @view_40; + element @delete_10; + position { + x 80.0; + y 80.0; + }; + size { + height 90.0; + width 180.0; + }; + } + + node node_42 id "de1e7e00-0000-4000-8000-00000000002a" { + collapsed false; + diagram @view_40; + element @delete_12; + position { + x 40.0; + y 40.0; + }; + size { + height 230.0; + width 380.0; + }; + } + + diagram sa_modes_view "SA Controller modes view" id "de1e7e00-0000-4000-8000-00000000003c" { + description ""; + layer Sa; + projection { + StateMachine { + machine @delete_51; + }; + }; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_61 id "de1e7e00-0000-4000-8000-00000000003d" { + collapsed false; + diagram @sa_modes_view; + element @delete_51; + position { + x 40.0; + y 40.0; + }; + size { + height 460.0; + width 620.0; + }; + } + + node node_62 id "de1e7e00-0000-4000-8000-00000000003e" { + collapsed false; + diagram @sa_modes_view; + element @delete_52; + position { + x 60.0; + y 95.0; + }; + size { + height 380.0; + width 580.0; + }; + } + + node node_63 id "de1e7e00-0000-4000-8000-00000000003f" { + collapsed false; + diagram @sa_modes_view; + element @delete_53; + position { + x 100.0; + y 155.0; + }; + size { + height 190.0; + width 320.0; + }; + } + +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-redo-save/notes.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-redo-save/notes.arcadia new file mode 100644 index 00000000..e65a1fc7 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-redo-save/notes.arcadia @@ -0,0 +1,2 @@ +// Preserve deletion evidence 雨. +// Exact bytes matter. diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-redo-save/project.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-redo-save/project.arcadia new file mode 100644 index 00000000..2d1c65c8 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-redo-save/project.arcadia @@ -0,0 +1,228 @@ +arcadia 7; +project delete_oracle "Delete oracle" id "de1e7e00-0000-4000-8000-000000000001" { + include "notes.arcadia"; + description ""; + + oa_activity delete_10 "Target work" id "de1e7e00-0000-4000-8000-00000000000a" { + description ""; + parent none; + } + + oa_activity delete_11 "Untouched work" id "de1e7e00-0000-4000-8000-00000000000b" { + description ""; + parent none; + } + + oa_entity delete_12 "OA Dispatch team" id "de1e7e00-0000-4000-8000-00000000000c" { + description ""; + parent none; + } + + oa_scenario delete_20 "Reference scenario" id "de1e7e00-0000-4000-8000-000000000014" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps []; + viewpoint OperationalActivity; + } + + oa_lifeline delete_21 "Target reference" id "de1e7e00-0000-4000-8000-000000000015" { + description ""; + parent @delete_20; + represented @delete_10; + } + + sa_function delete_50 "SA Initialize controller" id "de1e7e00-0000-4000-8000-000000000032" { + description ""; + parent none; + } + + sa_state_machine delete_51 "SA Controller modes" id "de1e7e00-0000-4000-8000-000000000033" { + description ""; + parent none; + } + + sa_region delete_52 "SA Main region" id "de1e7e00-0000-4000-8000-000000000034" { + description ""; + parent @delete_51; + } + + sa_state delete_53 "SA Ready" id "de1e7e00-0000-4000-8000-000000000035" { + description ""; + do_activity ""; + entry ""; + exit ""; + kind State; + parent @delete_52; + } + + allocation delete_13 "OA performs target work" id "de1e7e00-0000-4000-8000-00000000000d" { + description ""; + source @delete_12; + target @delete_10; + } + + state_action delete_54 "SA Entry initialize" id "de1e7e00-0000-4000-8000-000000000036" { + description ""; + phase Entry; + source @delete_53; + target @delete_50; + } + + diagram view_30 "Work view 30" id "de1e7e00-0000-4000-8000-00000000001e" { + description ""; + layer Oa; + projection Allocation; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + + + + + + + + + + + + + + + + + + + node node_32 id "de1e7e00-0000-4000-8000-000000000020" { + collapsed false; + diagram @view_30; + element @delete_12; + position { + x 40.0; + y 40.0; + }; + size { + height 230.0; + width 380.0; + }; + } + + diagram view_40 "Work view 40" id "de1e7e00-0000-4000-8000-000000000028" { + description ""; + layer Oa; + projection Allocation; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_41 id "de1e7e00-0000-4000-8000-000000000029" { + collapsed false; + diagram @view_40; + element @delete_10; + position { + x 80.0; + y 80.0; + }; + size { + height 90.0; + width 180.0; + }; + } + + node node_42 id "de1e7e00-0000-4000-8000-00000000002a" { + collapsed false; + diagram @view_40; + element @delete_12; + position { + x 40.0; + y 40.0; + }; + size { + height 230.0; + width 380.0; + }; + } + + diagram sa_modes_view "SA Controller modes view" id "de1e7e00-0000-4000-8000-00000000003c" { + description ""; + layer Sa; + projection { + StateMachine { + machine @delete_51; + }; + }; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_61 id "de1e7e00-0000-4000-8000-00000000003d" { + collapsed false; + diagram @sa_modes_view; + element @delete_51; + position { + x 40.0; + y 40.0; + }; + size { + height 460.0; + width 620.0; + }; + } + + node node_62 id "de1e7e00-0000-4000-8000-00000000003e" { + collapsed false; + diagram @sa_modes_view; + element @delete_52; + position { + x 60.0; + y 95.0; + }; + size { + height 380.0; + width 580.0; + }; + } + + node node_63 id "de1e7e00-0000-4000-8000-00000000003f" { + collapsed false; + diagram @sa_modes_view; + element @delete_53; + position { + x 100.0; + y 155.0; + }; + size { + height 190.0; + width 320.0; + }; + } + +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-undo-save/notes.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-undo-save/notes.arcadia new file mode 100644 index 00000000..e65a1fc7 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-undo-save/notes.arcadia @@ -0,0 +1,2 @@ +// Preserve deletion evidence 雨. +// Exact bytes matter. diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-undo-save/project.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-undo-save/project.arcadia new file mode 100644 index 00000000..80374746 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/arch-undo-save/project.arcadia @@ -0,0 +1,224 @@ +arcadia 7; +project delete_oracle "Delete oracle" id "de1e7e00-0000-4000-8000-000000000001" { + include "notes.arcadia"; + description ""; + + oa_activity delete_10 "Target work" id "de1e7e00-0000-4000-8000-00000000000a" { + description ""; + parent none; + } + + oa_activity delete_11 "Untouched work" id "de1e7e00-0000-4000-8000-00000000000b" { + description ""; + parent none; + } + + oa_entity delete_12 "OA Dispatch team" id "de1e7e00-0000-4000-8000-00000000000c" { + description ""; + parent none; + } + + oa_scenario delete_20 "Reference scenario" id "de1e7e00-0000-4000-8000-000000000014" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps []; + viewpoint OperationalActivity; + } + + oa_lifeline delete_21 "Target reference" id "de1e7e00-0000-4000-8000-000000000015" { + description ""; + parent @delete_20; + represented @delete_10; + } + + sa_function delete_50 "SA Initialize controller" id "de1e7e00-0000-4000-8000-000000000032" { + description ""; + parent none; + } + + sa_state_machine delete_51 "SA Controller modes" id "de1e7e00-0000-4000-8000-000000000033" { + description ""; + parent none; + } + + sa_region delete_52 "SA Main region" id "de1e7e00-0000-4000-8000-000000000034" { + description ""; + parent @delete_51; + } + + sa_state delete_53 "SA Ready" id "de1e7e00-0000-4000-8000-000000000035" { + description ""; + do_activity ""; + entry ""; + exit ""; + kind State; + parent @delete_52; + } + + allocation delete_13 "OA performs target work" id "de1e7e00-0000-4000-8000-00000000000d" { + description ""; + source @delete_12; + target @delete_10; + } + + state_action delete_54 "SA Entry initialize" id "de1e7e00-0000-4000-8000-000000000036" { + description ""; + phase Entry; + source @delete_53; + target @delete_50; + } + + diagram view_30 "Work view 30" id "de1e7e00-0000-4000-8000-00000000001e" { + description ""; + layer Oa; + projection Allocation; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_31 id "de1e7e00-0000-4000-8000-00000000001f" { + collapsed false; + diagram @view_30; + element @delete_10; + position { + x 80.0; + y 80.0; + }; + size { + height 90.0; + width 180.0; + }; + } + + node node_32 id "de1e7e00-0000-4000-8000-000000000020" { + collapsed false; + diagram @view_30; + element @delete_12; + position { + x 40.0; + y 40.0; + }; + size { + height 230.0; + width 380.0; + }; + } + + diagram view_40 "Work view 40" id "de1e7e00-0000-4000-8000-000000000028" { + description ""; + layer Oa; + projection Allocation; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_41 id "de1e7e00-0000-4000-8000-000000000029" { + collapsed false; + diagram @view_40; + element @delete_10; + position { + x 80.0; + y 80.0; + }; + size { + height 90.0; + width 180.0; + }; + } + + node node_42 id "de1e7e00-0000-4000-8000-00000000002a" { + collapsed false; + diagram @view_40; + element @delete_12; + position { + x 40.0; + y 40.0; + }; + size { + height 230.0; + width 380.0; + }; + } + + diagram sa_modes_view "SA Controller modes view" id "de1e7e00-0000-4000-8000-00000000003c" { + description ""; + layer Sa; + projection { + StateMachine { + machine @delete_51; + }; + }; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_61 id "de1e7e00-0000-4000-8000-00000000003d" { + collapsed false; + diagram @sa_modes_view; + element @delete_51; + position { + x 40.0; + y 40.0; + }; + size { + height 460.0; + width 620.0; + }; + } + + node node_62 id "de1e7e00-0000-4000-8000-00000000003e" { + collapsed false; + diagram @sa_modes_view; + element @delete_52; + position { + x 60.0; + y 95.0; + }; + size { + height 380.0; + width 580.0; + }; + } + + node node_63 id "de1e7e00-0000-4000-8000-00000000003f" { + collapsed false; + diagram @sa_modes_view; + element @delete_53; + position { + x 100.0; + y 155.0; + }; + size { + height 190.0; + width 320.0; + }; + } + +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/baseline-preflight/notes.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/baseline-preflight/notes.arcadia new file mode 100644 index 00000000..e65a1fc7 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/baseline-preflight/notes.arcadia @@ -0,0 +1,2 @@ +// Preserve deletion evidence 雨. +// Exact bytes matter. diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/baseline-preflight/project.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/baseline-preflight/project.arcadia new file mode 100644 index 00000000..80374746 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/baseline-preflight/project.arcadia @@ -0,0 +1,224 @@ +arcadia 7; +project delete_oracle "Delete oracle" id "de1e7e00-0000-4000-8000-000000000001" { + include "notes.arcadia"; + description ""; + + oa_activity delete_10 "Target work" id "de1e7e00-0000-4000-8000-00000000000a" { + description ""; + parent none; + } + + oa_activity delete_11 "Untouched work" id "de1e7e00-0000-4000-8000-00000000000b" { + description ""; + parent none; + } + + oa_entity delete_12 "OA Dispatch team" id "de1e7e00-0000-4000-8000-00000000000c" { + description ""; + parent none; + } + + oa_scenario delete_20 "Reference scenario" id "de1e7e00-0000-4000-8000-000000000014" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps []; + viewpoint OperationalActivity; + } + + oa_lifeline delete_21 "Target reference" id "de1e7e00-0000-4000-8000-000000000015" { + description ""; + parent @delete_20; + represented @delete_10; + } + + sa_function delete_50 "SA Initialize controller" id "de1e7e00-0000-4000-8000-000000000032" { + description ""; + parent none; + } + + sa_state_machine delete_51 "SA Controller modes" id "de1e7e00-0000-4000-8000-000000000033" { + description ""; + parent none; + } + + sa_region delete_52 "SA Main region" id "de1e7e00-0000-4000-8000-000000000034" { + description ""; + parent @delete_51; + } + + sa_state delete_53 "SA Ready" id "de1e7e00-0000-4000-8000-000000000035" { + description ""; + do_activity ""; + entry ""; + exit ""; + kind State; + parent @delete_52; + } + + allocation delete_13 "OA performs target work" id "de1e7e00-0000-4000-8000-00000000000d" { + description ""; + source @delete_12; + target @delete_10; + } + + state_action delete_54 "SA Entry initialize" id "de1e7e00-0000-4000-8000-000000000036" { + description ""; + phase Entry; + source @delete_53; + target @delete_50; + } + + diagram view_30 "Work view 30" id "de1e7e00-0000-4000-8000-00000000001e" { + description ""; + layer Oa; + projection Allocation; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_31 id "de1e7e00-0000-4000-8000-00000000001f" { + collapsed false; + diagram @view_30; + element @delete_10; + position { + x 80.0; + y 80.0; + }; + size { + height 90.0; + width 180.0; + }; + } + + node node_32 id "de1e7e00-0000-4000-8000-000000000020" { + collapsed false; + diagram @view_30; + element @delete_12; + position { + x 40.0; + y 40.0; + }; + size { + height 230.0; + width 380.0; + }; + } + + diagram view_40 "Work view 40" id "de1e7e00-0000-4000-8000-000000000028" { + description ""; + layer Oa; + projection Allocation; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_41 id "de1e7e00-0000-4000-8000-000000000029" { + collapsed false; + diagram @view_40; + element @delete_10; + position { + x 80.0; + y 80.0; + }; + size { + height 90.0; + width 180.0; + }; + } + + node node_42 id "de1e7e00-0000-4000-8000-00000000002a" { + collapsed false; + diagram @view_40; + element @delete_12; + position { + x 40.0; + y 40.0; + }; + size { + height 230.0; + width 380.0; + }; + } + + diagram sa_modes_view "SA Controller modes view" id "de1e7e00-0000-4000-8000-00000000003c" { + description ""; + layer Sa; + projection { + StateMachine { + machine @delete_51; + }; + }; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_61 id "de1e7e00-0000-4000-8000-00000000003d" { + collapsed false; + diagram @sa_modes_view; + element @delete_51; + position { + x 40.0; + y 40.0; + }; + size { + height 460.0; + width 620.0; + }; + } + + node node_62 id "de1e7e00-0000-4000-8000-00000000003e" { + collapsed false; + diagram @sa_modes_view; + element @delete_52; + position { + x 60.0; + y 95.0; + }; + size { + height 380.0; + width 580.0; + }; + } + + node node_63 id "de1e7e00-0000-4000-8000-00000000003f" { + collapsed false; + diagram @sa_modes_view; + element @delete_53; + position { + x 100.0; + y 155.0; + }; + size { + height 190.0; + width 320.0; + }; + } + +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-preflight/README.md b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-preflight/README.md new file mode 100644 index 00000000..0d1642e3 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-preflight/README.md @@ -0,0 +1 @@ +Open bound-nested-calls.arcadia. In Behavior select OA Nested pressure checks, SA Nested pressure checks, or OA Reentrant pressure review. Each has two lifelines and four rows ordered C1,C2,R2,R1. C1 requests 420.0 kPa and R1 returns 418.0; C2 requests 380.0 and R2 returns 378.0. The SA messages resolve an actual synchronous interface-operation allocation; Replies derive it from their exact Calls. OA uses a bound Interaction carrying an Operation item without SA-only OperationUse. The reentrant case uses an explicit reverse Interaction for C2/R2. Check unselected bars, both reply ends, each bar's selection, Properties values/correlation, source parity and save/reopen. scenario-identities.tsv lists every UI target UUID. diagnostics.txt records completeness warnings. Generator validation and roundtrip are not desktop paint or native acceptance. diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-preflight/bound-nested-calls.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-preflight/bound-nested-calls.arcadia new file mode 100644 index 00000000..45d95f6d --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-preflight/bound-nested-calls.arcadia @@ -0,0 +1,486 @@ +arcadia 7; +project bound_nested_calls "Bound nested pressure checks" id "21b00d00-0000-4000-8000-000000000001" { + description "Native activation acceptance. Requested 420/380 kPa, measured 418/378 kPa. Unicode readback: Δ pressure · 戻り値."; + + oa_activity bound_100 "Review pressure demand" id "21b00d00-0000-4000-8000-000000000064" { + description ""; + parent none; + } + + oa_activity bound_101 "Inspect pressure" id "21b00d00-0000-4000-8000-000000000065" { + description ""; + parent none; + } + + oa_exchange_item bound_110 "Check pressure" id "21b00d00-0000-4000-8000-00000000006e" { + description ""; + kind Information; + mechanism Operation; + parent none; + supertype none; + } + + oa_data_field bound_111 "requested_pressure" id "21b00d00-0000-4000-8000-00000000006f" { + default none; + description ""; + direction In; + maximum 1; + minimum 1; + parent @bound_110; + storage Value; + type_ref Real; + unit "kPa"; + } + + oa_data_field bound_112 "measured_pressure" id "21b00d00-0000-4000-8000-000000000070" { + default none; + description ""; + direction Return; + maximum 1; + minimum 1; + parent @bound_110; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_actor bound_200 "Operator console" id "21b00d00-0000-4000-8000-0000000000c8" { + description ""; + parent none; + } + + sa_system bound_201 "Pressure service" id "21b00d00-0000-4000-8000-0000000000c9" { + description ""; + parent none; + } + + sa_port bound_202 "Client socket" id "21b00d00-0000-4000-8000-0000000000ca" { + contract { + Component { + kind Standard; + orientation Unset; + }; + }; + description ""; + legacy none; + parent @bound_200; + } + + sa_port bound_203 "Service socket" id "21b00d00-0000-4000-8000-0000000000cb" { + contract { + Component { + kind Standard; + orientation Unset; + }; + }; + description ""; + legacy none; + parent @bound_201; + } + + sa_exchange_item bound_210 "Check pressure" id "21b00d00-0000-4000-8000-0000000000d2" { + description ""; + kind Information; + mechanism Operation; + parent none; + supertype none; + } + + sa_data_field bound_211 "requested_pressure" id "21b00d00-0000-4000-8000-0000000000d3" { + default none; + description ""; + direction In; + maximum 1; + minimum 1; + parent @bound_210; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_data_field bound_212 "measured_pressure" id "21b00d00-0000-4000-8000-0000000000d4" { + default none; + description ""; + direction Return; + maximum 1; + minimum 1; + parent @bound_210; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_interface bound_213 "Pressure check API" id "21b00d00-0000-4000-8000-0000000000d5" { + description ""; + parent none; + supertype none; + } + + oa_scenario bound_1000 "OA Nested pressure checks" id "21b00d00-0000-4000-8000-0000000003e8" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_1040, @bound_1030, @bound_1060, @bound_1050]; + viewpoint OperationalActivity; + } + + oa_lifeline bound_1001 "L1 Console" id "21b00d00-0000-4000-8000-0000000003e9" { + description ""; + parent @bound_1000; + represented @bound_100; + } + + oa_lifeline bound_1002 "L2 Inspector" id "21b00d00-0000-4000-8000-0000000003ea" { + description ""; + parent @bound_1000; + represented @bound_101; + } + + oa_occurrence bound_1030 "C2 380 kPa" id "21b00d00-0000-4000-8000-000000000406" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_1002; + reply_to none; + sender @bound_1001; + values [{ + expression "380.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1040 "C1 420 kPa" id "21b00d00-0000-4000-8000-000000000410" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_1002; + reply_to none; + sender @bound_1001; + values [{ + expression "420.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1050 "R1 418 kPa" id "21b00d00-0000-4000-8000-00000000041a" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_1001; + reply_to @bound_1040; + sender @bound_1002; + values [{ + expression "418.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1060 "R2 378 kPa" id "21b00d00-0000-4000-8000-000000000424" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_1001; + reply_to @bound_1030; + sender @bound_1002; + values [{ + expression "378.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + sa_scenario bound_2000 "SA Nested pressure checks" id "21b00d00-0000-4000-8000-0000000007d0" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_2040, @bound_2030, @bound_2060, @bound_2050]; + viewpoint BoundaryInterface; + } + + sa_lifeline bound_2001 "L1 Console" id "21b00d00-0000-4000-8000-0000000007d1" { + description ""; + parent @bound_2000; + represented @bound_200; + } + + sa_lifeline bound_2002 "L2 Inspector" id "21b00d00-0000-4000-8000-0000000007d2" { + description ""; + parent @bound_2000; + represented @bound_201; + } + + sa_occurrence bound_2030 "C2 380 kPa" id "21b00d00-0000-4000-8000-0000000007ee" { + body { + Exchange { + exchange @bound_223; + message_kind Call; + operation { + allocation @bound_220; + }; + receiver @bound_2002; + reply_to none; + sender @bound_2001; + values [{ + expression "380.0"; + field @bound_211; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2040 "C1 420 kPa" id "21b00d00-0000-4000-8000-0000000007f8" { + body { + Exchange { + exchange @bound_223; + message_kind Call; + operation { + allocation @bound_220; + }; + receiver @bound_2002; + reply_to none; + sender @bound_2001; + values [{ + expression "420.0"; + field @bound_211; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2050 "R1 418 kPa" id "21b00d00-0000-4000-8000-000000000802" { + body { + Exchange { + exchange @bound_223; + message_kind Reply; + receiver @bound_2001; + reply_to @bound_2040; + sender @bound_2002; + values [{ + expression "418.0"; + field @bound_212; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2060 "R2 378 kPa" id "21b00d00-0000-4000-8000-00000000080c" { + body { + Exchange { + exchange @bound_223; + message_kind Reply; + receiver @bound_2001; + reply_to @bound_2030; + sender @bound_2002; + values [{ + expression "378.0"; + field @bound_212; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + oa_scenario bound_3000 "OA Reentrant pressure review" id "21b00d00-0000-4000-8000-000000000bb8" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_3040, @bound_3030, @bound_3060, @bound_3050]; + viewpoint OperationalActivity; + } + + oa_lifeline bound_3001 "L1 Console" id "21b00d00-0000-4000-8000-000000000bb9" { + description ""; + parent @bound_3000; + represented @bound_100; + } + + oa_lifeline bound_3002 "L2 Inspector" id "21b00d00-0000-4000-8000-000000000bba" { + description ""; + parent @bound_3000; + represented @bound_101; + } + + oa_occurrence bound_3030 "C2 380 kPa" id "21b00d00-0000-4000-8000-000000000bd6" { + body { + Exchange { + exchange @bound_121; + message_kind Call; + receiver @bound_3001; + reply_to none; + sender @bound_3002; + values [{ + expression "380.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3040 "C1 420 kPa" id "21b00d00-0000-4000-8000-000000000be0" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_3002; + reply_to none; + sender @bound_3001; + values [{ + expression "420.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3050 "R1 418 kPa" id "21b00d00-0000-4000-8000-000000000bea" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_3001; + reply_to @bound_3040; + sender @bound_3002; + values [{ + expression "418.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3060 "R2 378 kPa" id "21b00d00-0000-4000-8000-000000000bf4" { + body { + Exchange { + exchange @bound_121; + message_kind Reply; + receiver @bound_3002; + reply_to @bound_3030; + sender @bound_3001; + values [{ + expression "378.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + interaction bound_120 "Pressure check" id "21b00d00-0000-4000-8000-000000000078" { + description ""; + items [@bound_110]; + source @bound_100; + target @bound_101; + } + + interaction bound_121 "Demand review callback" id "21b00d00-0000-4000-8000-000000000079" { + description ""; + items [@bound_110]; + source @bound_101; + target @bound_100; + } + + interface_item_allocation bound_220 "Synchronous pressure check" id "21b00d00-0000-4000-8000-0000000000dc" { + acquisition Unspecified; + description ""; + order 0; + source @bound_213; + target @bound_210; + transmission Synchronous; + } + + interface_requirement bound_221 "Console requires check" id "21b00d00-0000-4000-8000-0000000000dd" { + description ""; + source @bound_202; + target @bound_213; + } + + interface_provision bound_222 "Service provides check" id "21b00d00-0000-4000-8000-0000000000de" { + description ""; + source @bound_203; + target @bound_213; + } + + boundary_exchange bound_223 "Pressure channel" id "21b00d00-0000-4000-8000-0000000000df" { + description ""; + items [@bound_210]; + oriented false; + source @bound_202; + target @bound_203; + } + +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-preflight/diagnostics.txt b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-preflight/diagnostics.txt new file mode 100644 index 00000000..b026a721 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-preflight/diagnostics.txt @@ -0,0 +1,24 @@ +[ + Issue { + severity: Warning, + element: Some( + 21b00d00-0000-4000-8000-000000000064, + ), + code: "unallocated_leaf", + field: Some( + "allocation", + ), + message: "Allocate leaf 'Review pressure demand' to a performer.", + }, + Issue { + severity: Warning, + element: Some( + 21b00d00-0000-4000-8000-000000000065, + ), + code: "unallocated_leaf", + field: Some( + "allocation", + ), + message: "Allocate leaf 'Inspect pressure' to a performer.", + }, +] diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-preflight/scenario-identities.tsv b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-preflight/scenario-identities.tsv new file mode 100644 index 00000000..7cd0cd19 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-preflight/scenario-identities.tsv @@ -0,0 +1,4 @@ +scenario owner L1 L2 C1 C2 R2 R1 +OA Nested pressure checks 21b00d00-0000-4000-8000-0000000003e8 21b00d00-0000-4000-8000-0000000003e9 21b00d00-0000-4000-8000-0000000003ea 21b00d00-0000-4000-8000-000000000410 21b00d00-0000-4000-8000-000000000406 21b00d00-0000-4000-8000-000000000424 21b00d00-0000-4000-8000-00000000041a +SA Nested pressure checks 21b00d00-0000-4000-8000-0000000007d0 21b00d00-0000-4000-8000-0000000007d1 21b00d00-0000-4000-8000-0000000007d2 21b00d00-0000-4000-8000-0000000007f8 21b00d00-0000-4000-8000-0000000007ee 21b00d00-0000-4000-8000-00000000080c 21b00d00-0000-4000-8000-000000000802 +OA Reentrant pressure review 21b00d00-0000-4000-8000-000000000bb8 21b00d00-0000-4000-8000-000000000bb9 21b00d00-0000-4000-8000-000000000bba 21b00d00-0000-4000-8000-000000000be0 21b00d00-0000-4000-8000-000000000bd6 21b00d00-0000-4000-8000-000000000bf4 21b00d00-0000-4000-8000-000000000bea diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-reopen-save/README.md b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-reopen-save/README.md new file mode 100644 index 00000000..0d1642e3 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-reopen-save/README.md @@ -0,0 +1 @@ +Open bound-nested-calls.arcadia. In Behavior select OA Nested pressure checks, SA Nested pressure checks, or OA Reentrant pressure review. Each has two lifelines and four rows ordered C1,C2,R2,R1. C1 requests 420.0 kPa and R1 returns 418.0; C2 requests 380.0 and R2 returns 378.0. The SA messages resolve an actual synchronous interface-operation allocation; Replies derive it from their exact Calls. OA uses a bound Interaction carrying an Operation item without SA-only OperationUse. The reentrant case uses an explicit reverse Interaction for C2/R2. Check unselected bars, both reply ends, each bar's selection, Properties values/correlation, source parity and save/reopen. scenario-identities.tsv lists every UI target UUID. diagnostics.txt records completeness warnings. Generator validation and roundtrip are not desktop paint or native acceptance. diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-reopen-save/bound-nested-calls.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-reopen-save/bound-nested-calls.arcadia new file mode 100644 index 00000000..45d95f6d --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-reopen-save/bound-nested-calls.arcadia @@ -0,0 +1,486 @@ +arcadia 7; +project bound_nested_calls "Bound nested pressure checks" id "21b00d00-0000-4000-8000-000000000001" { + description "Native activation acceptance. Requested 420/380 kPa, measured 418/378 kPa. Unicode readback: Δ pressure · 戻り値."; + + oa_activity bound_100 "Review pressure demand" id "21b00d00-0000-4000-8000-000000000064" { + description ""; + parent none; + } + + oa_activity bound_101 "Inspect pressure" id "21b00d00-0000-4000-8000-000000000065" { + description ""; + parent none; + } + + oa_exchange_item bound_110 "Check pressure" id "21b00d00-0000-4000-8000-00000000006e" { + description ""; + kind Information; + mechanism Operation; + parent none; + supertype none; + } + + oa_data_field bound_111 "requested_pressure" id "21b00d00-0000-4000-8000-00000000006f" { + default none; + description ""; + direction In; + maximum 1; + minimum 1; + parent @bound_110; + storage Value; + type_ref Real; + unit "kPa"; + } + + oa_data_field bound_112 "measured_pressure" id "21b00d00-0000-4000-8000-000000000070" { + default none; + description ""; + direction Return; + maximum 1; + minimum 1; + parent @bound_110; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_actor bound_200 "Operator console" id "21b00d00-0000-4000-8000-0000000000c8" { + description ""; + parent none; + } + + sa_system bound_201 "Pressure service" id "21b00d00-0000-4000-8000-0000000000c9" { + description ""; + parent none; + } + + sa_port bound_202 "Client socket" id "21b00d00-0000-4000-8000-0000000000ca" { + contract { + Component { + kind Standard; + orientation Unset; + }; + }; + description ""; + legacy none; + parent @bound_200; + } + + sa_port bound_203 "Service socket" id "21b00d00-0000-4000-8000-0000000000cb" { + contract { + Component { + kind Standard; + orientation Unset; + }; + }; + description ""; + legacy none; + parent @bound_201; + } + + sa_exchange_item bound_210 "Check pressure" id "21b00d00-0000-4000-8000-0000000000d2" { + description ""; + kind Information; + mechanism Operation; + parent none; + supertype none; + } + + sa_data_field bound_211 "requested_pressure" id "21b00d00-0000-4000-8000-0000000000d3" { + default none; + description ""; + direction In; + maximum 1; + minimum 1; + parent @bound_210; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_data_field bound_212 "measured_pressure" id "21b00d00-0000-4000-8000-0000000000d4" { + default none; + description ""; + direction Return; + maximum 1; + minimum 1; + parent @bound_210; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_interface bound_213 "Pressure check API" id "21b00d00-0000-4000-8000-0000000000d5" { + description ""; + parent none; + supertype none; + } + + oa_scenario bound_1000 "OA Nested pressure checks" id "21b00d00-0000-4000-8000-0000000003e8" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_1040, @bound_1030, @bound_1060, @bound_1050]; + viewpoint OperationalActivity; + } + + oa_lifeline bound_1001 "L1 Console" id "21b00d00-0000-4000-8000-0000000003e9" { + description ""; + parent @bound_1000; + represented @bound_100; + } + + oa_lifeline bound_1002 "L2 Inspector" id "21b00d00-0000-4000-8000-0000000003ea" { + description ""; + parent @bound_1000; + represented @bound_101; + } + + oa_occurrence bound_1030 "C2 380 kPa" id "21b00d00-0000-4000-8000-000000000406" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_1002; + reply_to none; + sender @bound_1001; + values [{ + expression "380.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1040 "C1 420 kPa" id "21b00d00-0000-4000-8000-000000000410" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_1002; + reply_to none; + sender @bound_1001; + values [{ + expression "420.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1050 "R1 418 kPa" id "21b00d00-0000-4000-8000-00000000041a" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_1001; + reply_to @bound_1040; + sender @bound_1002; + values [{ + expression "418.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1060 "R2 378 kPa" id "21b00d00-0000-4000-8000-000000000424" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_1001; + reply_to @bound_1030; + sender @bound_1002; + values [{ + expression "378.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + sa_scenario bound_2000 "SA Nested pressure checks" id "21b00d00-0000-4000-8000-0000000007d0" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_2040, @bound_2030, @bound_2060, @bound_2050]; + viewpoint BoundaryInterface; + } + + sa_lifeline bound_2001 "L1 Console" id "21b00d00-0000-4000-8000-0000000007d1" { + description ""; + parent @bound_2000; + represented @bound_200; + } + + sa_lifeline bound_2002 "L2 Inspector" id "21b00d00-0000-4000-8000-0000000007d2" { + description ""; + parent @bound_2000; + represented @bound_201; + } + + sa_occurrence bound_2030 "C2 380 kPa" id "21b00d00-0000-4000-8000-0000000007ee" { + body { + Exchange { + exchange @bound_223; + message_kind Call; + operation { + allocation @bound_220; + }; + receiver @bound_2002; + reply_to none; + sender @bound_2001; + values [{ + expression "380.0"; + field @bound_211; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2040 "C1 420 kPa" id "21b00d00-0000-4000-8000-0000000007f8" { + body { + Exchange { + exchange @bound_223; + message_kind Call; + operation { + allocation @bound_220; + }; + receiver @bound_2002; + reply_to none; + sender @bound_2001; + values [{ + expression "420.0"; + field @bound_211; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2050 "R1 418 kPa" id "21b00d00-0000-4000-8000-000000000802" { + body { + Exchange { + exchange @bound_223; + message_kind Reply; + receiver @bound_2001; + reply_to @bound_2040; + sender @bound_2002; + values [{ + expression "418.0"; + field @bound_212; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2060 "R2 378 kPa" id "21b00d00-0000-4000-8000-00000000080c" { + body { + Exchange { + exchange @bound_223; + message_kind Reply; + receiver @bound_2001; + reply_to @bound_2030; + sender @bound_2002; + values [{ + expression "378.0"; + field @bound_212; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + oa_scenario bound_3000 "OA Reentrant pressure review" id "21b00d00-0000-4000-8000-000000000bb8" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_3040, @bound_3030, @bound_3060, @bound_3050]; + viewpoint OperationalActivity; + } + + oa_lifeline bound_3001 "L1 Console" id "21b00d00-0000-4000-8000-000000000bb9" { + description ""; + parent @bound_3000; + represented @bound_100; + } + + oa_lifeline bound_3002 "L2 Inspector" id "21b00d00-0000-4000-8000-000000000bba" { + description ""; + parent @bound_3000; + represented @bound_101; + } + + oa_occurrence bound_3030 "C2 380 kPa" id "21b00d00-0000-4000-8000-000000000bd6" { + body { + Exchange { + exchange @bound_121; + message_kind Call; + receiver @bound_3001; + reply_to none; + sender @bound_3002; + values [{ + expression "380.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3040 "C1 420 kPa" id "21b00d00-0000-4000-8000-000000000be0" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_3002; + reply_to none; + sender @bound_3001; + values [{ + expression "420.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3050 "R1 418 kPa" id "21b00d00-0000-4000-8000-000000000bea" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_3001; + reply_to @bound_3040; + sender @bound_3002; + values [{ + expression "418.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3060 "R2 378 kPa" id "21b00d00-0000-4000-8000-000000000bf4" { + body { + Exchange { + exchange @bound_121; + message_kind Reply; + receiver @bound_3002; + reply_to @bound_3030; + sender @bound_3001; + values [{ + expression "378.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + interaction bound_120 "Pressure check" id "21b00d00-0000-4000-8000-000000000078" { + description ""; + items [@bound_110]; + source @bound_100; + target @bound_101; + } + + interaction bound_121 "Demand review callback" id "21b00d00-0000-4000-8000-000000000079" { + description ""; + items [@bound_110]; + source @bound_101; + target @bound_100; + } + + interface_item_allocation bound_220 "Synchronous pressure check" id "21b00d00-0000-4000-8000-0000000000dc" { + acquisition Unspecified; + description ""; + order 0; + source @bound_213; + target @bound_210; + transmission Synchronous; + } + + interface_requirement bound_221 "Console requires check" id "21b00d00-0000-4000-8000-0000000000dd" { + description ""; + source @bound_202; + target @bound_213; + } + + interface_provision bound_222 "Service provides check" id "21b00d00-0000-4000-8000-0000000000de" { + description ""; + source @bound_203; + target @bound_213; + } + + boundary_exchange bound_223 "Pressure channel" id "21b00d00-0000-4000-8000-0000000000df" { + description ""; + items [@bound_210]; + oriented false; + source @bound_202; + target @bound_203; + } + +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-reopen-save/diagnostics.txt b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-reopen-save/diagnostics.txt new file mode 100644 index 00000000..b026a721 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-reopen-save/diagnostics.txt @@ -0,0 +1,24 @@ +[ + Issue { + severity: Warning, + element: Some( + 21b00d00-0000-4000-8000-000000000064, + ), + code: "unallocated_leaf", + field: Some( + "allocation", + ), + message: "Allocate leaf 'Review pressure demand' to a performer.", + }, + Issue { + severity: Warning, + element: Some( + 21b00d00-0000-4000-8000-000000000065, + ), + code: "unallocated_leaf", + field: Some( + "allocation", + ), + message: "Allocate leaf 'Inspect pressure' to a performer.", + }, +] diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-reopen-save/scenario-identities.tsv b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-reopen-save/scenario-identities.tsv new file mode 100644 index 00000000..7cd0cd19 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-reopen-save/scenario-identities.tsv @@ -0,0 +1,4 @@ +scenario owner L1 L2 C1 C2 R2 R1 +OA Nested pressure checks 21b00d00-0000-4000-8000-0000000003e8 21b00d00-0000-4000-8000-0000000003e9 21b00d00-0000-4000-8000-0000000003ea 21b00d00-0000-4000-8000-000000000410 21b00d00-0000-4000-8000-000000000406 21b00d00-0000-4000-8000-000000000424 21b00d00-0000-4000-8000-00000000041a +SA Nested pressure checks 21b00d00-0000-4000-8000-0000000007d0 21b00d00-0000-4000-8000-0000000007d1 21b00d00-0000-4000-8000-0000000007d2 21b00d00-0000-4000-8000-0000000007f8 21b00d00-0000-4000-8000-0000000007ee 21b00d00-0000-4000-8000-00000000080c 21b00d00-0000-4000-8000-000000000802 +OA Reentrant pressure review 21b00d00-0000-4000-8000-000000000bb8 21b00d00-0000-4000-8000-000000000bb9 21b00d00-0000-4000-8000-000000000bba 21b00d00-0000-4000-8000-000000000be0 21b00d00-0000-4000-8000-000000000bd6 21b00d00-0000-4000-8000-000000000bf4 21b00d00-0000-4000-8000-000000000bea diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-save/README.md b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-save/README.md new file mode 100644 index 00000000..0d1642e3 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-save/README.md @@ -0,0 +1 @@ +Open bound-nested-calls.arcadia. In Behavior select OA Nested pressure checks, SA Nested pressure checks, or OA Reentrant pressure review. Each has two lifelines and four rows ordered C1,C2,R2,R1. C1 requests 420.0 kPa and R1 returns 418.0; C2 requests 380.0 and R2 returns 378.0. The SA messages resolve an actual synchronous interface-operation allocation; Replies derive it from their exact Calls. OA uses a bound Interaction carrying an Operation item without SA-only OperationUse. The reentrant case uses an explicit reverse Interaction for C2/R2. Check unselected bars, both reply ends, each bar's selection, Properties values/correlation, source parity and save/reopen. scenario-identities.tsv lists every UI target UUID. diagnostics.txt records completeness warnings. Generator validation and roundtrip are not desktop paint or native acceptance. diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-save/bound-nested-calls.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-save/bound-nested-calls.arcadia new file mode 100644 index 00000000..45d95f6d --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-save/bound-nested-calls.arcadia @@ -0,0 +1,486 @@ +arcadia 7; +project bound_nested_calls "Bound nested pressure checks" id "21b00d00-0000-4000-8000-000000000001" { + description "Native activation acceptance. Requested 420/380 kPa, measured 418/378 kPa. Unicode readback: Δ pressure · 戻り値."; + + oa_activity bound_100 "Review pressure demand" id "21b00d00-0000-4000-8000-000000000064" { + description ""; + parent none; + } + + oa_activity bound_101 "Inspect pressure" id "21b00d00-0000-4000-8000-000000000065" { + description ""; + parent none; + } + + oa_exchange_item bound_110 "Check pressure" id "21b00d00-0000-4000-8000-00000000006e" { + description ""; + kind Information; + mechanism Operation; + parent none; + supertype none; + } + + oa_data_field bound_111 "requested_pressure" id "21b00d00-0000-4000-8000-00000000006f" { + default none; + description ""; + direction In; + maximum 1; + minimum 1; + parent @bound_110; + storage Value; + type_ref Real; + unit "kPa"; + } + + oa_data_field bound_112 "measured_pressure" id "21b00d00-0000-4000-8000-000000000070" { + default none; + description ""; + direction Return; + maximum 1; + minimum 1; + parent @bound_110; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_actor bound_200 "Operator console" id "21b00d00-0000-4000-8000-0000000000c8" { + description ""; + parent none; + } + + sa_system bound_201 "Pressure service" id "21b00d00-0000-4000-8000-0000000000c9" { + description ""; + parent none; + } + + sa_port bound_202 "Client socket" id "21b00d00-0000-4000-8000-0000000000ca" { + contract { + Component { + kind Standard; + orientation Unset; + }; + }; + description ""; + legacy none; + parent @bound_200; + } + + sa_port bound_203 "Service socket" id "21b00d00-0000-4000-8000-0000000000cb" { + contract { + Component { + kind Standard; + orientation Unset; + }; + }; + description ""; + legacy none; + parent @bound_201; + } + + sa_exchange_item bound_210 "Check pressure" id "21b00d00-0000-4000-8000-0000000000d2" { + description ""; + kind Information; + mechanism Operation; + parent none; + supertype none; + } + + sa_data_field bound_211 "requested_pressure" id "21b00d00-0000-4000-8000-0000000000d3" { + default none; + description ""; + direction In; + maximum 1; + minimum 1; + parent @bound_210; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_data_field bound_212 "measured_pressure" id "21b00d00-0000-4000-8000-0000000000d4" { + default none; + description ""; + direction Return; + maximum 1; + minimum 1; + parent @bound_210; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_interface bound_213 "Pressure check API" id "21b00d00-0000-4000-8000-0000000000d5" { + description ""; + parent none; + supertype none; + } + + oa_scenario bound_1000 "OA Nested pressure checks" id "21b00d00-0000-4000-8000-0000000003e8" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_1040, @bound_1030, @bound_1060, @bound_1050]; + viewpoint OperationalActivity; + } + + oa_lifeline bound_1001 "L1 Console" id "21b00d00-0000-4000-8000-0000000003e9" { + description ""; + parent @bound_1000; + represented @bound_100; + } + + oa_lifeline bound_1002 "L2 Inspector" id "21b00d00-0000-4000-8000-0000000003ea" { + description ""; + parent @bound_1000; + represented @bound_101; + } + + oa_occurrence bound_1030 "C2 380 kPa" id "21b00d00-0000-4000-8000-000000000406" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_1002; + reply_to none; + sender @bound_1001; + values [{ + expression "380.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1040 "C1 420 kPa" id "21b00d00-0000-4000-8000-000000000410" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_1002; + reply_to none; + sender @bound_1001; + values [{ + expression "420.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1050 "R1 418 kPa" id "21b00d00-0000-4000-8000-00000000041a" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_1001; + reply_to @bound_1040; + sender @bound_1002; + values [{ + expression "418.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1060 "R2 378 kPa" id "21b00d00-0000-4000-8000-000000000424" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_1001; + reply_to @bound_1030; + sender @bound_1002; + values [{ + expression "378.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + sa_scenario bound_2000 "SA Nested pressure checks" id "21b00d00-0000-4000-8000-0000000007d0" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_2040, @bound_2030, @bound_2060, @bound_2050]; + viewpoint BoundaryInterface; + } + + sa_lifeline bound_2001 "L1 Console" id "21b00d00-0000-4000-8000-0000000007d1" { + description ""; + parent @bound_2000; + represented @bound_200; + } + + sa_lifeline bound_2002 "L2 Inspector" id "21b00d00-0000-4000-8000-0000000007d2" { + description ""; + parent @bound_2000; + represented @bound_201; + } + + sa_occurrence bound_2030 "C2 380 kPa" id "21b00d00-0000-4000-8000-0000000007ee" { + body { + Exchange { + exchange @bound_223; + message_kind Call; + operation { + allocation @bound_220; + }; + receiver @bound_2002; + reply_to none; + sender @bound_2001; + values [{ + expression "380.0"; + field @bound_211; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2040 "C1 420 kPa" id "21b00d00-0000-4000-8000-0000000007f8" { + body { + Exchange { + exchange @bound_223; + message_kind Call; + operation { + allocation @bound_220; + }; + receiver @bound_2002; + reply_to none; + sender @bound_2001; + values [{ + expression "420.0"; + field @bound_211; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2050 "R1 418 kPa" id "21b00d00-0000-4000-8000-000000000802" { + body { + Exchange { + exchange @bound_223; + message_kind Reply; + receiver @bound_2001; + reply_to @bound_2040; + sender @bound_2002; + values [{ + expression "418.0"; + field @bound_212; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2060 "R2 378 kPa" id "21b00d00-0000-4000-8000-00000000080c" { + body { + Exchange { + exchange @bound_223; + message_kind Reply; + receiver @bound_2001; + reply_to @bound_2030; + sender @bound_2002; + values [{ + expression "378.0"; + field @bound_212; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + oa_scenario bound_3000 "OA Reentrant pressure review" id "21b00d00-0000-4000-8000-000000000bb8" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_3040, @bound_3030, @bound_3060, @bound_3050]; + viewpoint OperationalActivity; + } + + oa_lifeline bound_3001 "L1 Console" id "21b00d00-0000-4000-8000-000000000bb9" { + description ""; + parent @bound_3000; + represented @bound_100; + } + + oa_lifeline bound_3002 "L2 Inspector" id "21b00d00-0000-4000-8000-000000000bba" { + description ""; + parent @bound_3000; + represented @bound_101; + } + + oa_occurrence bound_3030 "C2 380 kPa" id "21b00d00-0000-4000-8000-000000000bd6" { + body { + Exchange { + exchange @bound_121; + message_kind Call; + receiver @bound_3001; + reply_to none; + sender @bound_3002; + values [{ + expression "380.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3040 "C1 420 kPa" id "21b00d00-0000-4000-8000-000000000be0" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_3002; + reply_to none; + sender @bound_3001; + values [{ + expression "420.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3050 "R1 418 kPa" id "21b00d00-0000-4000-8000-000000000bea" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_3001; + reply_to @bound_3040; + sender @bound_3002; + values [{ + expression "418.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3060 "R2 378 kPa" id "21b00d00-0000-4000-8000-000000000bf4" { + body { + Exchange { + exchange @bound_121; + message_kind Reply; + receiver @bound_3002; + reply_to @bound_3030; + sender @bound_3001; + values [{ + expression "378.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + interaction bound_120 "Pressure check" id "21b00d00-0000-4000-8000-000000000078" { + description ""; + items [@bound_110]; + source @bound_100; + target @bound_101; + } + + interaction bound_121 "Demand review callback" id "21b00d00-0000-4000-8000-000000000079" { + description ""; + items [@bound_110]; + source @bound_101; + target @bound_100; + } + + interface_item_allocation bound_220 "Synchronous pressure check" id "21b00d00-0000-4000-8000-0000000000dc" { + acquisition Unspecified; + description ""; + order 0; + source @bound_213; + target @bound_210; + transmission Synchronous; + } + + interface_requirement bound_221 "Console requires check" id "21b00d00-0000-4000-8000-0000000000dd" { + description ""; + source @bound_202; + target @bound_213; + } + + interface_provision bound_222 "Service provides check" id "21b00d00-0000-4000-8000-0000000000de" { + description ""; + source @bound_203; + target @bound_213; + } + + boundary_exchange bound_223 "Pressure channel" id "21b00d00-0000-4000-8000-0000000000df" { + description ""; + items [@bound_210]; + oriented false; + source @bound_202; + target @bound_203; + } + +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-save/diagnostics.txt b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-save/diagnostics.txt new file mode 100644 index 00000000..b026a721 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-save/diagnostics.txt @@ -0,0 +1,24 @@ +[ + Issue { + severity: Warning, + element: Some( + 21b00d00-0000-4000-8000-000000000064, + ), + code: "unallocated_leaf", + field: Some( + "allocation", + ), + message: "Allocate leaf 'Review pressure demand' to a performer.", + }, + Issue { + severity: Warning, + element: Some( + 21b00d00-0000-4000-8000-000000000065, + ), + code: "unallocated_leaf", + field: Some( + "allocation", + ), + message: "Allocate leaf 'Inspect pressure' to a performer.", + }, +] diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-save/scenario-identities.tsv b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-save/scenario-identities.tsv new file mode 100644 index 00000000..7cd0cd19 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/bound-save/scenario-identities.tsv @@ -0,0 +1,4 @@ +scenario owner L1 L2 C1 C2 R2 R1 +OA Nested pressure checks 21b00d00-0000-4000-8000-0000000003e8 21b00d00-0000-4000-8000-0000000003e9 21b00d00-0000-4000-8000-0000000003ea 21b00d00-0000-4000-8000-000000000410 21b00d00-0000-4000-8000-000000000406 21b00d00-0000-4000-8000-000000000424 21b00d00-0000-4000-8000-00000000041a +SA Nested pressure checks 21b00d00-0000-4000-8000-0000000007d0 21b00d00-0000-4000-8000-0000000007d1 21b00d00-0000-4000-8000-0000000007d2 21b00d00-0000-4000-8000-0000000007f8 21b00d00-0000-4000-8000-0000000007ee 21b00d00-0000-4000-8000-00000000080c 21b00d00-0000-4000-8000-000000000802 +OA Reentrant pressure review 21b00d00-0000-4000-8000-000000000bb8 21b00d00-0000-4000-8000-000000000bb9 21b00d00-0000-4000-8000-000000000bba 21b00d00-0000-4000-8000-000000000be0 21b00d00-0000-4000-8000-000000000bd6 21b00d00-0000-4000-8000-000000000bf4 21b00d00-0000-4000-8000-000000000bea diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/state-delete-save/notes.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/state-delete-save/notes.arcadia new file mode 100644 index 00000000..e65a1fc7 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/state-delete-save/notes.arcadia @@ -0,0 +1,2 @@ +// Preserve deletion evidence 雨. +// Exact bytes matter. diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/state-delete-save/project.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/state-delete-save/project.arcadia new file mode 100644 index 00000000..096163b6 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/state-delete-save/project.arcadia @@ -0,0 +1,228 @@ +arcadia 7; +project delete_oracle "Delete oracle" id "de1e7e00-0000-4000-8000-000000000001" { + include "notes.arcadia"; + description ""; + + oa_activity delete_10 "Target work" id "de1e7e00-0000-4000-8000-00000000000a" { + description ""; + parent none; + } + + oa_activity delete_11 "Untouched work" id "de1e7e00-0000-4000-8000-00000000000b" { + description ""; + parent none; + } + + oa_entity delete_12 "OA Dispatch team" id "de1e7e00-0000-4000-8000-00000000000c" { + description ""; + parent none; + } + + oa_scenario delete_20 "Reference scenario" id "de1e7e00-0000-4000-8000-000000000014" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps []; + viewpoint OperationalActivity; + } + + oa_lifeline delete_21 "Target reference" id "de1e7e00-0000-4000-8000-000000000015" { + description ""; + parent @delete_20; + represented @delete_10; + } + + sa_function delete_50 "SA Initialize controller" id "de1e7e00-0000-4000-8000-000000000032" { + description ""; + parent none; + } + + sa_state_machine delete_51 "SA Controller modes" id "de1e7e00-0000-4000-8000-000000000033" { + description ""; + parent none; + } + + sa_region delete_52 "SA Main region" id "de1e7e00-0000-4000-8000-000000000034" { + description ""; + parent @delete_51; + } + + sa_state delete_53 "SA Ready" id "de1e7e00-0000-4000-8000-000000000035" { + description ""; + do_activity ""; + entry ""; + exit ""; + kind State; + parent @delete_52; + } + + allocation delete_13 "OA performs target work" id "de1e7e00-0000-4000-8000-00000000000d" { + description ""; + source @delete_12; + target @delete_10; + } + + state_action delete_54 "SA Entry initialize" id "de1e7e00-0000-4000-8000-000000000036" { + description ""; + phase Entry; + source @delete_53; + target @delete_50; + } + + diagram view_30 "Work view 30" id "de1e7e00-0000-4000-8000-00000000001e" { + description ""; + layer Oa; + projection Allocation; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_31 id "de1e7e00-0000-4000-8000-00000000001f" { + collapsed false; + diagram @view_30; + element @delete_10; + position { + x 80.0; + y 80.0; + }; + size { + height 90.0; + width 180.0; + }; + } + + node node_32 id "de1e7e00-0000-4000-8000-000000000020" { + collapsed false; + diagram @view_30; + element @delete_12; + position { + x 40.0; + y 40.0; + }; + size { + height 230.0; + width 380.0; + }; + } + + diagram view_40 "Work view 40" id "de1e7e00-0000-4000-8000-000000000028" { + description ""; + layer Oa; + projection Allocation; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_41 id "de1e7e00-0000-4000-8000-000000000029" { + collapsed false; + diagram @view_40; + element @delete_10; + position { + x 80.0; + y 80.0; + }; + size { + height 90.0; + width 180.0; + }; + } + + node node_42 id "de1e7e00-0000-4000-8000-00000000002a" { + collapsed false; + diagram @view_40; + element @delete_12; + position { + x 40.0; + y 40.0; + }; + size { + height 230.0; + width 380.0; + }; + } + + diagram sa_modes_view "SA Controller modes view" id "de1e7e00-0000-4000-8000-00000000003c" { + description ""; + layer Sa; + projection { + StateMachine { + machine @delete_51; + }; + }; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_61 id "de1e7e00-0000-4000-8000-00000000003d" { + collapsed false; + diagram @sa_modes_view; + element @delete_51; + position { + x 40.0; + y 40.0; + }; + size { + height 460.0; + width 620.0; + }; + } + + node node_62 id "de1e7e00-0000-4000-8000-00000000003e" { + collapsed false; + diagram @sa_modes_view; + element @delete_52; + position { + x 60.0; + y 95.0; + }; + size { + height 380.0; + width 580.0; + }; + } + + + + + + + + + + + + + + + + + + + +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/state-undo-save/notes.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/state-undo-save/notes.arcadia new file mode 100644 index 00000000..e65a1fc7 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/state-undo-save/notes.arcadia @@ -0,0 +1,2 @@ +// Preserve deletion evidence 雨. +// Exact bytes matter. diff --git a/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/state-undo-save/project.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/state-undo-save/project.arcadia new file mode 100644 index 00000000..80374746 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/checkpoints/state-undo-save/project.arcadia @@ -0,0 +1,224 @@ +arcadia 7; +project delete_oracle "Delete oracle" id "de1e7e00-0000-4000-8000-000000000001" { + include "notes.arcadia"; + description ""; + + oa_activity delete_10 "Target work" id "de1e7e00-0000-4000-8000-00000000000a" { + description ""; + parent none; + } + + oa_activity delete_11 "Untouched work" id "de1e7e00-0000-4000-8000-00000000000b" { + description ""; + parent none; + } + + oa_entity delete_12 "OA Dispatch team" id "de1e7e00-0000-4000-8000-00000000000c" { + description ""; + parent none; + } + + oa_scenario delete_20 "Reference scenario" id "de1e7e00-0000-4000-8000-000000000014" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps []; + viewpoint OperationalActivity; + } + + oa_lifeline delete_21 "Target reference" id "de1e7e00-0000-4000-8000-000000000015" { + description ""; + parent @delete_20; + represented @delete_10; + } + + sa_function delete_50 "SA Initialize controller" id "de1e7e00-0000-4000-8000-000000000032" { + description ""; + parent none; + } + + sa_state_machine delete_51 "SA Controller modes" id "de1e7e00-0000-4000-8000-000000000033" { + description ""; + parent none; + } + + sa_region delete_52 "SA Main region" id "de1e7e00-0000-4000-8000-000000000034" { + description ""; + parent @delete_51; + } + + sa_state delete_53 "SA Ready" id "de1e7e00-0000-4000-8000-000000000035" { + description ""; + do_activity ""; + entry ""; + exit ""; + kind State; + parent @delete_52; + } + + allocation delete_13 "OA performs target work" id "de1e7e00-0000-4000-8000-00000000000d" { + description ""; + source @delete_12; + target @delete_10; + } + + state_action delete_54 "SA Entry initialize" id "de1e7e00-0000-4000-8000-000000000036" { + description ""; + phase Entry; + source @delete_53; + target @delete_50; + } + + diagram view_30 "Work view 30" id "de1e7e00-0000-4000-8000-00000000001e" { + description ""; + layer Oa; + projection Allocation; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_31 id "de1e7e00-0000-4000-8000-00000000001f" { + collapsed false; + diagram @view_30; + element @delete_10; + position { + x 80.0; + y 80.0; + }; + size { + height 90.0; + width 180.0; + }; + } + + node node_32 id "de1e7e00-0000-4000-8000-000000000020" { + collapsed false; + diagram @view_30; + element @delete_12; + position { + x 40.0; + y 40.0; + }; + size { + height 230.0; + width 380.0; + }; + } + + diagram view_40 "Work view 40" id "de1e7e00-0000-4000-8000-000000000028" { + description ""; + layer Oa; + projection Allocation; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_41 id "de1e7e00-0000-4000-8000-000000000029" { + collapsed false; + diagram @view_40; + element @delete_10; + position { + x 80.0; + y 80.0; + }; + size { + height 90.0; + width 180.0; + }; + } + + node node_42 id "de1e7e00-0000-4000-8000-00000000002a" { + collapsed false; + diagram @view_40; + element @delete_12; + position { + x 40.0; + y 40.0; + }; + size { + height 230.0; + width 380.0; + }; + } + + diagram sa_modes_view "SA Controller modes view" id "de1e7e00-0000-4000-8000-00000000003c" { + description ""; + layer Sa; + projection { + StateMachine { + machine @delete_51; + }; + }; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_61 id "de1e7e00-0000-4000-8000-00000000003d" { + collapsed false; + diagram @sa_modes_view; + element @delete_51; + position { + x 40.0; + y 40.0; + }; + size { + height 460.0; + width 620.0; + }; + } + + node node_62 id "de1e7e00-0000-4000-8000-00000000003e" { + collapsed false; + diagram @sa_modes_view; + element @delete_52; + position { + x 60.0; + y 95.0; + }; + size { + height 380.0; + width 580.0; + }; + } + + node node_63 id "de1e7e00-0000-4000-8000-00000000003f" { + collapsed false; + diagram @sa_modes_view; + element @delete_53; + position { + x 100.0; + y 155.0; + }; + size { + height 190.0; + width 320.0; + }; + } + +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/closure.json b/harness/experiments/canvas-native-83f53c7-20260912/closure.json new file mode 100644 index 00000000..4dec5367 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/closure.json @@ -0,0 +1,5 @@ +{ + "utc": "2026-09-12T22:58:28.728800+00:00", + "pid": 4900, + "exit": 0 +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/compact-baseline/notes.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/compact-baseline/notes.arcadia new file mode 100644 index 00000000..e65a1fc7 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/compact-baseline/notes.arcadia @@ -0,0 +1,2 @@ +// Preserve deletion evidence 雨. +// Exact bytes matter. diff --git a/harness/experiments/canvas-native-83f53c7-20260912/compact-baseline/project.arcadia b/harness/experiments/canvas-native-83f53c7-20260912/compact-baseline/project.arcadia new file mode 100644 index 00000000..80374746 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/compact-baseline/project.arcadia @@ -0,0 +1,224 @@ +arcadia 7; +project delete_oracle "Delete oracle" id "de1e7e00-0000-4000-8000-000000000001" { + include "notes.arcadia"; + description ""; + + oa_activity delete_10 "Target work" id "de1e7e00-0000-4000-8000-00000000000a" { + description ""; + parent none; + } + + oa_activity delete_11 "Untouched work" id "de1e7e00-0000-4000-8000-00000000000b" { + description ""; + parent none; + } + + oa_entity delete_12 "OA Dispatch team" id "de1e7e00-0000-4000-8000-00000000000c" { + description ""; + parent none; + } + + oa_scenario delete_20 "Reference scenario" id "de1e7e00-0000-4000-8000-000000000014" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps []; + viewpoint OperationalActivity; + } + + oa_lifeline delete_21 "Target reference" id "de1e7e00-0000-4000-8000-000000000015" { + description ""; + parent @delete_20; + represented @delete_10; + } + + sa_function delete_50 "SA Initialize controller" id "de1e7e00-0000-4000-8000-000000000032" { + description ""; + parent none; + } + + sa_state_machine delete_51 "SA Controller modes" id "de1e7e00-0000-4000-8000-000000000033" { + description ""; + parent none; + } + + sa_region delete_52 "SA Main region" id "de1e7e00-0000-4000-8000-000000000034" { + description ""; + parent @delete_51; + } + + sa_state delete_53 "SA Ready" id "de1e7e00-0000-4000-8000-000000000035" { + description ""; + do_activity ""; + entry ""; + exit ""; + kind State; + parent @delete_52; + } + + allocation delete_13 "OA performs target work" id "de1e7e00-0000-4000-8000-00000000000d" { + description ""; + source @delete_12; + target @delete_10; + } + + state_action delete_54 "SA Entry initialize" id "de1e7e00-0000-4000-8000-000000000036" { + description ""; + phase Entry; + source @delete_53; + target @delete_50; + } + + diagram view_30 "Work view 30" id "de1e7e00-0000-4000-8000-00000000001e" { + description ""; + layer Oa; + projection Allocation; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_31 id "de1e7e00-0000-4000-8000-00000000001f" { + collapsed false; + diagram @view_30; + element @delete_10; + position { + x 80.0; + y 80.0; + }; + size { + height 90.0; + width 180.0; + }; + } + + node node_32 id "de1e7e00-0000-4000-8000-000000000020" { + collapsed false; + diagram @view_30; + element @delete_12; + position { + x 40.0; + y 40.0; + }; + size { + height 230.0; + width 380.0; + }; + } + + diagram view_40 "Work view 40" id "de1e7e00-0000-4000-8000-000000000028" { + description ""; + layer Oa; + projection Allocation; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_41 id "de1e7e00-0000-4000-8000-000000000029" { + collapsed false; + diagram @view_40; + element @delete_10; + position { + x 80.0; + y 80.0; + }; + size { + height 90.0; + width 180.0; + }; + } + + node node_42 id "de1e7e00-0000-4000-8000-00000000002a" { + collapsed false; + diagram @view_40; + element @delete_12; + position { + x 40.0; + y 40.0; + }; + size { + height 230.0; + width 380.0; + }; + } + + diagram sa_modes_view "SA Controller modes view" id "de1e7e00-0000-4000-8000-00000000003c" { + description ""; + layer Sa; + projection { + StateMachine { + machine @delete_51; + }; + }; + routes []; + view_options { + coverage "All"; + exchange_labels "Name"; + hidden_edges []; + participant_categories "All"; + relation_kinds "All"; + work_categories "All"; + work_contexts "All"; + }; + } + + node node_61 id "de1e7e00-0000-4000-8000-00000000003d" { + collapsed false; + diagram @sa_modes_view; + element @delete_51; + position { + x 40.0; + y 40.0; + }; + size { + height 460.0; + width 620.0; + }; + } + + node node_62 id "de1e7e00-0000-4000-8000-00000000003e" { + collapsed false; + diagram @sa_modes_view; + element @delete_52; + position { + x 60.0; + y 95.0; + }; + size { + height 380.0; + width 580.0; + }; + } + + node node_63 id "de1e7e00-0000-4000-8000-00000000003f" { + collapsed false; + diagram @sa_modes_view; + element @delete_53; + position { + x 100.0; + y 155.0; + }; + size { + height 190.0; + width 320.0; + }; + } + +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-delete-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-delete-0.png new file mode 100644 index 00000000..787e9e7d Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-delete-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-delete-save.json b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-delete-save.json new file mode 100644 index 00000000..99e22fcb --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-delete-save.json @@ -0,0 +1,25 @@ +{ + "utc": "2026-09-12T22:45:16.119605+00:00", + "snapshot": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\arch-delete-save", + "command": [ + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\delete-oracle-warning-fix-42511f0\\delete-oracle-warning-fix-42511f0.exe", + "removed", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\compact-baseline\\project.arcadia", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\arch-delete-save\\project.arcadia", + "de1e7e00-0000-4000-8000-00000000001f" + ], + "checker_sha256": "9796aa73544c6414003e6230a668a6cf1435978a310187ef2560af67e35f3466", + "exit": 0, + "files": [ + { + "path": "notes.arcadia", + "bytes": 60, + "sha256": "adb1445555f1f47cf2ac92e2271e54df7c5d2eaf1d9363fe5a79d02298670a4e" + }, + { + "path": "project.arcadia", + "bytes": 5416, + "sha256": "9f41161fd7fd014ed0744bb45a223958c6fd2b6e94a76cb6ddb468360f723726" + } + ] +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-delete-save.log b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-delete-save.log new file mode 100644 index 00000000..d3d41aa7 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-delete-save.log @@ -0,0 +1,21 @@ +PASS removed de1e7e00-0000-4000-8000-00000000001f: exact baseline-derived Delete candidate and normal source patch +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_system", object_id: Some(de1e7e00-0000-4000-8000-000000000001), field: Some("elements"), line: 2, column: 1, message: "Identify the SA system of interest.", span: Span { start: 11, end: 91 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: Some("allocation"), line: 11, column: 5, message: "Allocate leaf 'Untouched work' to a performer.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "empty_sequence", object_id: Some(de1e7e00-0000-4000-8000-000000000014), field: Some("steps"), line: 27, column: 15, message: "Add ordered occurrences.", span: Span { start: 780, end: 782 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: Some("allocation"), line: 37, column: 5, message: "Allocate leaf 'SA Initialize controller' to a performer.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "machine_owner", object_id: Some(de1e7e00-0000-4000-8000-000000000033), field: Some("parent"), line: 44, column: 16, message: "Assign a state-machine owner.", span: Span { start: 1294, end: 1298 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unreachable_state", object_id: Some(de1e7e00-0000-4000-8000-000000000035), field: Some("body"), line: 52, column: 5, message: "No structural path from a machine entry reaches this vertex; review entry, nesting and transitions (guards are not executed).", span: Span { start: 1454, end: 1663 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_initial", object_id: Some(de1e7e00-0000-4000-8000-000000000034), field: Some("parent"), line: 49, column: 16, message: "Add an Initial default entry or an explicit incoming entry path for this region.", span: Span { start: 1431, end: 1441 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000a), field: None, line: 6, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 147, end: 277 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: None, line: 11, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: None, line: 37, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_system", object_id: Some(de1e7e00-0000-4000-8000-000000000001), field: Some("elements"), line: 2, column: 1, message: "Identify the SA system of interest.", span: Span { start: 11, end: 91 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: Some("allocation"), line: 11, column: 5, message: "Allocate leaf 'Untouched work' to a performer.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "empty_sequence", object_id: Some(de1e7e00-0000-4000-8000-000000000014), field: Some("steps"), line: 27, column: 15, message: "Add ordered occurrences.", span: Span { start: 780, end: 782 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: Some("allocation"), line: 37, column: 5, message: "Allocate leaf 'SA Initialize controller' to a performer.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "machine_owner", object_id: Some(de1e7e00-0000-4000-8000-000000000033), field: Some("parent"), line: 44, column: 16, message: "Assign a state-machine owner.", span: Span { start: 1294, end: 1298 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unreachable_state", object_id: Some(de1e7e00-0000-4000-8000-000000000035), field: Some("body"), line: 52, column: 5, message: "No structural path from a machine entry reaches this vertex; review entry, nesting and transitions (guards are not executed).", span: Span { start: 1454, end: 1663 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_initial", object_id: Some(de1e7e00-0000-4000-8000-000000000034), field: Some("parent"), line: 49, column: 16, message: "Add an Initial default entry or an explicit incoming entry path for this region.", span: Span { start: 1431, end: 1441 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000a), field: None, line: 6, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 147, end: 277 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: None, line: 11, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: None, line: 37, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 1013, end: 1156 } }, related: [] } diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-delete-saved-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-delete-saved-0.png new file mode 100644 index 00000000..a0d5c969 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-delete-saved-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-final-restored.json b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-final-restored.json new file mode 100644 index 00000000..edf4ab89 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-final-restored.json @@ -0,0 +1,24 @@ +{ + "utc": "2026-09-12T22:47:03.676481+00:00", + "snapshot": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\arch-final-restored", + "command": [ + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\delete-oracle-warning-fix-42511f0\\delete-oracle-warning-fix-42511f0.exe", + "same", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\compact-baseline\\project.arcadia", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\arch-final-restored\\project.arcadia" + ], + "checker_sha256": "9796aa73544c6414003e6230a668a6cf1435978a310187ef2560af67e35f3466", + "exit": 0, + "files": [ + { + "path": "notes.arcadia", + "bytes": 60, + "sha256": "adb1445555f1f47cf2ac92e2271e54df7c5d2eaf1d9363fe5a79d02298670a4e" + }, + { + "path": "project.arcadia", + "bytes": 5566, + "sha256": "246e7316f3932df2bc64c70459352ecef2a7fe2b5d8ead03d1f5664587c813bf" + } + ] +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-final-restored.log b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-final-restored.log new file mode 100644 index 00000000..6ccda311 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-final-restored.log @@ -0,0 +1,21 @@ +PASS same: complete Project and exact SourceBundle restored +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_system", object_id: Some(de1e7e00-0000-4000-8000-000000000001), field: Some("elements"), line: 2, column: 1, message: "Identify the SA system of interest.", span: Span { start: 11, end: 91 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: Some("allocation"), line: 11, column: 5, message: "Allocate leaf 'Untouched work' to a performer.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "empty_sequence", object_id: Some(de1e7e00-0000-4000-8000-000000000014), field: Some("steps"), line: 27, column: 15, message: "Add ordered occurrences.", span: Span { start: 780, end: 782 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: Some("allocation"), line: 37, column: 5, message: "Allocate leaf 'SA Initialize controller' to a performer.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "machine_owner", object_id: Some(de1e7e00-0000-4000-8000-000000000033), field: Some("parent"), line: 44, column: 16, message: "Assign a state-machine owner.", span: Span { start: 1294, end: 1298 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unreachable_state", object_id: Some(de1e7e00-0000-4000-8000-000000000035), field: Some("body"), line: 52, column: 5, message: "No structural path from a machine entry reaches this vertex; review entry, nesting and transitions (guards are not executed).", span: Span { start: 1454, end: 1663 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_initial", object_id: Some(de1e7e00-0000-4000-8000-000000000034), field: Some("parent"), line: 49, column: 16, message: "Add an Initial default entry or an explicit incoming entry path for this region.", span: Span { start: 1431, end: 1441 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000a), field: None, line: 6, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 147, end: 277 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: None, line: 11, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: None, line: 37, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-final-restored\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_system", object_id: Some(de1e7e00-0000-4000-8000-000000000001), field: Some("elements"), line: 2, column: 1, message: "Identify the SA system of interest.", span: Span { start: 11, end: 91 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-final-restored\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: Some("allocation"), line: 11, column: 5, message: "Allocate leaf 'Untouched work' to a performer.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-final-restored\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "empty_sequence", object_id: Some(de1e7e00-0000-4000-8000-000000000014), field: Some("steps"), line: 27, column: 15, message: "Add ordered occurrences.", span: Span { start: 780, end: 782 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-final-restored\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: Some("allocation"), line: 37, column: 5, message: "Allocate leaf 'SA Initialize controller' to a performer.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-final-restored\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "machine_owner", object_id: Some(de1e7e00-0000-4000-8000-000000000033), field: Some("parent"), line: 44, column: 16, message: "Assign a state-machine owner.", span: Span { start: 1294, end: 1298 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-final-restored\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unreachable_state", object_id: Some(de1e7e00-0000-4000-8000-000000000035), field: Some("body"), line: 52, column: 5, message: "No structural path from a machine entry reaches this vertex; review entry, nesting and transitions (guards are not executed).", span: Span { start: 1454, end: 1663 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-final-restored\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_initial", object_id: Some(de1e7e00-0000-4000-8000-000000000034), field: Some("parent"), line: 49, column: 16, message: "Add an Initial default entry or an explicit incoming entry path for this region.", span: Span { start: 1431, end: 1441 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-final-restored\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000a), field: None, line: 6, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 147, end: 277 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-final-restored\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: None, line: 11, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-final-restored\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: None, line: 37, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 1013, end: 1156 } }, related: [] } diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-redo-save.json b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-redo-save.json new file mode 100644 index 00000000..c6fa6abe --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-redo-save.json @@ -0,0 +1,25 @@ +{ + "utc": "2026-09-12T22:46:16.599067+00:00", + "snapshot": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\arch-redo-save", + "command": [ + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\delete-oracle-warning-fix-42511f0\\delete-oracle-warning-fix-42511f0.exe", + "removed", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\compact-baseline\\project.arcadia", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\arch-redo-save\\project.arcadia", + "de1e7e00-0000-4000-8000-00000000001f" + ], + "checker_sha256": "9796aa73544c6414003e6230a668a6cf1435978a310187ef2560af67e35f3466", + "exit": 0, + "files": [ + { + "path": "notes.arcadia", + "bytes": 60, + "sha256": "adb1445555f1f47cf2ac92e2271e54df7c5d2eaf1d9363fe5a79d02298670a4e" + }, + { + "path": "project.arcadia", + "bytes": 5416, + "sha256": "9f41161fd7fd014ed0744bb45a223958c6fd2b6e94a76cb6ddb468360f723726" + } + ] +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-redo-save.log b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-redo-save.log new file mode 100644 index 00000000..c35359b4 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-redo-save.log @@ -0,0 +1,21 @@ +PASS removed de1e7e00-0000-4000-8000-00000000001f: exact baseline-derived Delete candidate and normal source patch +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_system", object_id: Some(de1e7e00-0000-4000-8000-000000000001), field: Some("elements"), line: 2, column: 1, message: "Identify the SA system of interest.", span: Span { start: 11, end: 91 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: Some("allocation"), line: 11, column: 5, message: "Allocate leaf 'Untouched work' to a performer.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "empty_sequence", object_id: Some(de1e7e00-0000-4000-8000-000000000014), field: Some("steps"), line: 27, column: 15, message: "Add ordered occurrences.", span: Span { start: 780, end: 782 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: Some("allocation"), line: 37, column: 5, message: "Allocate leaf 'SA Initialize controller' to a performer.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "machine_owner", object_id: Some(de1e7e00-0000-4000-8000-000000000033), field: Some("parent"), line: 44, column: 16, message: "Assign a state-machine owner.", span: Span { start: 1294, end: 1298 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unreachable_state", object_id: Some(de1e7e00-0000-4000-8000-000000000035), field: Some("body"), line: 52, column: 5, message: "No structural path from a machine entry reaches this vertex; review entry, nesting and transitions (guards are not executed).", span: Span { start: 1454, end: 1663 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_initial", object_id: Some(de1e7e00-0000-4000-8000-000000000034), field: Some("parent"), line: 49, column: 16, message: "Add an Initial default entry or an explicit incoming entry path for this region.", span: Span { start: 1431, end: 1441 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000a), field: None, line: 6, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 147, end: 277 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: None, line: 11, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: None, line: 37, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-redo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_system", object_id: Some(de1e7e00-0000-4000-8000-000000000001), field: Some("elements"), line: 2, column: 1, message: "Identify the SA system of interest.", span: Span { start: 11, end: 91 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-redo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: Some("allocation"), line: 11, column: 5, message: "Allocate leaf 'Untouched work' to a performer.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-redo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "empty_sequence", object_id: Some(de1e7e00-0000-4000-8000-000000000014), field: Some("steps"), line: 27, column: 15, message: "Add ordered occurrences.", span: Span { start: 780, end: 782 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-redo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: Some("allocation"), line: 37, column: 5, message: "Allocate leaf 'SA Initialize controller' to a performer.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-redo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "machine_owner", object_id: Some(de1e7e00-0000-4000-8000-000000000033), field: Some("parent"), line: 44, column: 16, message: "Assign a state-machine owner.", span: Span { start: 1294, end: 1298 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-redo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unreachable_state", object_id: Some(de1e7e00-0000-4000-8000-000000000035), field: Some("body"), line: 52, column: 5, message: "No structural path from a machine entry reaches this vertex; review entry, nesting and transitions (guards are not executed).", span: Span { start: 1454, end: 1663 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-redo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_initial", object_id: Some(de1e7e00-0000-4000-8000-000000000034), field: Some("parent"), line: 49, column: 16, message: "Add an Initial default entry or an explicit incoming entry path for this region.", span: Span { start: 1431, end: 1441 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-redo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000a), field: None, line: 6, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 147, end: 277 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-redo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: None, line: 11, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-redo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: None, line: 37, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 1013, end: 1156 } }, related: [] } diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-redo-saved-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-redo-saved-0.png new file mode 100644 index 00000000..a0d5c969 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-redo-saved-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-shift-delete-confirmation-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-shift-delete-confirmation-0.png new file mode 100644 index 00000000..a0c00585 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-shift-delete-confirmation-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-undo-save.json b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-undo-save.json new file mode 100644 index 00000000..b811ed3c --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-undo-save.json @@ -0,0 +1,24 @@ +{ + "utc": "2026-09-12T22:45:45.063927+00:00", + "snapshot": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\arch-undo-save", + "command": [ + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\delete-oracle-warning-fix-42511f0\\delete-oracle-warning-fix-42511f0.exe", + "same", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\compact-baseline\\project.arcadia", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\arch-undo-save\\project.arcadia" + ], + "checker_sha256": "9796aa73544c6414003e6230a668a6cf1435978a310187ef2560af67e35f3466", + "exit": 0, + "files": [ + { + "path": "notes.arcadia", + "bytes": 60, + "sha256": "adb1445555f1f47cf2ac92e2271e54df7c5d2eaf1d9363fe5a79d02298670a4e" + }, + { + "path": "project.arcadia", + "bytes": 5566, + "sha256": "246e7316f3932df2bc64c70459352ecef2a7fe2b5d8ead03d1f5664587c813bf" + } + ] +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-undo-save.log b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-undo-save.log new file mode 100644 index 00000000..859abae6 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-undo-save.log @@ -0,0 +1,21 @@ +PASS same: complete Project and exact SourceBundle restored +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_system", object_id: Some(de1e7e00-0000-4000-8000-000000000001), field: Some("elements"), line: 2, column: 1, message: "Identify the SA system of interest.", span: Span { start: 11, end: 91 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: Some("allocation"), line: 11, column: 5, message: "Allocate leaf 'Untouched work' to a performer.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "empty_sequence", object_id: Some(de1e7e00-0000-4000-8000-000000000014), field: Some("steps"), line: 27, column: 15, message: "Add ordered occurrences.", span: Span { start: 780, end: 782 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: Some("allocation"), line: 37, column: 5, message: "Allocate leaf 'SA Initialize controller' to a performer.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "machine_owner", object_id: Some(de1e7e00-0000-4000-8000-000000000033), field: Some("parent"), line: 44, column: 16, message: "Assign a state-machine owner.", span: Span { start: 1294, end: 1298 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unreachable_state", object_id: Some(de1e7e00-0000-4000-8000-000000000035), field: Some("body"), line: 52, column: 5, message: "No structural path from a machine entry reaches this vertex; review entry, nesting and transitions (guards are not executed).", span: Span { start: 1454, end: 1663 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_initial", object_id: Some(de1e7e00-0000-4000-8000-000000000034), field: Some("parent"), line: 49, column: 16, message: "Add an Initial default entry or an explicit incoming entry path for this region.", span: Span { start: 1431, end: 1441 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000a), field: None, line: 6, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 147, end: 277 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: None, line: 11, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: None, line: 37, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_system", object_id: Some(de1e7e00-0000-4000-8000-000000000001), field: Some("elements"), line: 2, column: 1, message: "Identify the SA system of interest.", span: Span { start: 11, end: 91 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: Some("allocation"), line: 11, column: 5, message: "Allocate leaf 'Untouched work' to a performer.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "empty_sequence", object_id: Some(de1e7e00-0000-4000-8000-000000000014), field: Some("steps"), line: 27, column: 15, message: "Add ordered occurrences.", span: Span { start: 780, end: 782 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: Some("allocation"), line: 37, column: 5, message: "Allocate leaf 'SA Initialize controller' to a performer.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "machine_owner", object_id: Some(de1e7e00-0000-4000-8000-000000000033), field: Some("parent"), line: 44, column: 16, message: "Assign a state-machine owner.", span: Span { start: 1294, end: 1298 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unreachable_state", object_id: Some(de1e7e00-0000-4000-8000-000000000035), field: Some("body"), line: 52, column: 5, message: "No structural path from a machine entry reaches this vertex; review entry, nesting and transitions (guards are not executed).", span: Span { start: 1454, end: 1663 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_initial", object_id: Some(de1e7e00-0000-4000-8000-000000000034), field: Some("parent"), line: 49, column: 16, message: "Add an Initial default entry or an explicit incoming entry path for this region.", span: Span { start: 1431, end: 1441 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000a), field: None, line: 6, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 147, end: 277 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: None, line: 11, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\arch-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: None, line: 37, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 1013, end: 1156 } }, related: [] } diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-undo-saved-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-undo-saved-0.png new file mode 100644 index 00000000..b467f62c Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/arch-undo-saved-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/baseline-preflight.json b/harness/experiments/canvas-native-83f53c7-20260912/evidence/baseline-preflight.json new file mode 100644 index 00000000..eaeddde0 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/baseline-preflight.json @@ -0,0 +1,24 @@ +{ + "utc": "2026-09-12T22:03:22.260588+00:00", + "snapshot": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\baseline-preflight", + "command": [ + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\delete-oracle-warning-fix-42511f0\\delete-oracle-warning-fix-42511f0.exe", + "same", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\compact-baseline\\project.arcadia", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\baseline-preflight\\project.arcadia" + ], + "checker_sha256": "9796aa73544c6414003e6230a668a6cf1435978a310187ef2560af67e35f3466", + "exit": 0, + "files": [ + { + "path": "notes.arcadia", + "bytes": 60, + "sha256": "adb1445555f1f47cf2ac92e2271e54df7c5d2eaf1d9363fe5a79d02298670a4e" + }, + { + "path": "project.arcadia", + "bytes": 5566, + "sha256": "246e7316f3932df2bc64c70459352ecef2a7fe2b5d8ead03d1f5664587c813bf" + } + ] +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/baseline-preflight.log b/harness/experiments/canvas-native-83f53c7-20260912/evidence/baseline-preflight.log new file mode 100644 index 00000000..d9222999 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/baseline-preflight.log @@ -0,0 +1,21 @@ +PASS same: complete Project and exact SourceBundle restored +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_system", object_id: Some(de1e7e00-0000-4000-8000-000000000001), field: Some("elements"), line: 2, column: 1, message: "Identify the SA system of interest.", span: Span { start: 11, end: 91 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: Some("allocation"), line: 11, column: 5, message: "Allocate leaf 'Untouched work' to a performer.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "empty_sequence", object_id: Some(de1e7e00-0000-4000-8000-000000000014), field: Some("steps"), line: 27, column: 15, message: "Add ordered occurrences.", span: Span { start: 780, end: 782 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: Some("allocation"), line: 37, column: 5, message: "Allocate leaf 'SA Initialize controller' to a performer.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "machine_owner", object_id: Some(de1e7e00-0000-4000-8000-000000000033), field: Some("parent"), line: 44, column: 16, message: "Assign a state-machine owner.", span: Span { start: 1294, end: 1298 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unreachable_state", object_id: Some(de1e7e00-0000-4000-8000-000000000035), field: Some("body"), line: 52, column: 5, message: "No structural path from a machine entry reaches this vertex; review entry, nesting and transitions (guards are not executed).", span: Span { start: 1454, end: 1663 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_initial", object_id: Some(de1e7e00-0000-4000-8000-000000000034), field: Some("parent"), line: 49, column: 16, message: "Add an Initial default entry or an explicit incoming entry path for this region.", span: Span { start: 1431, end: 1441 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000a), field: None, line: 6, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 147, end: 277 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: None, line: 11, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: None, line: 37, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\baseline-preflight\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_system", object_id: Some(de1e7e00-0000-4000-8000-000000000001), field: Some("elements"), line: 2, column: 1, message: "Identify the SA system of interest.", span: Span { start: 11, end: 91 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\baseline-preflight\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: Some("allocation"), line: 11, column: 5, message: "Allocate leaf 'Untouched work' to a performer.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\baseline-preflight\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "empty_sequence", object_id: Some(de1e7e00-0000-4000-8000-000000000014), field: Some("steps"), line: 27, column: 15, message: "Add ordered occurrences.", span: Span { start: 780, end: 782 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\baseline-preflight\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: Some("allocation"), line: 37, column: 5, message: "Allocate leaf 'SA Initialize controller' to a performer.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\baseline-preflight\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "machine_owner", object_id: Some(de1e7e00-0000-4000-8000-000000000033), field: Some("parent"), line: 44, column: 16, message: "Assign a state-machine owner.", span: Span { start: 1294, end: 1298 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\baseline-preflight\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unreachable_state", object_id: Some(de1e7e00-0000-4000-8000-000000000035), field: Some("body"), line: 52, column: 5, message: "No structural path from a machine entry reaches this vertex; review entry, nesting and transitions (guards are not executed).", span: Span { start: 1454, end: 1663 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\baseline-preflight\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_initial", object_id: Some(de1e7e00-0000-4000-8000-000000000034), field: Some("parent"), line: 49, column: 16, message: "Add an Initial default entry or an explicit incoming entry path for this region.", span: Span { start: 1431, end: 1441 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\baseline-preflight\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000a), field: None, line: 6, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 147, end: 277 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\baseline-preflight\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: None, line: 11, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\baseline-preflight\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: None, line: 37, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 1013, end: 1156 } }, related: [] } diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-open-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-open-0.png new file mode 100644 index 00000000..da5fa8c4 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-open-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-preflight.json b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-preflight.json new file mode 100644 index 00000000..aae7c046 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-preflight.json @@ -0,0 +1,34 @@ +{ + "utc": "2026-09-12T22:03:23.717149+00:00", + "snapshot": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\bound-preflight", + "command": [ + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\delete-oracle-warning-fix-42511f0\\delete-oracle-warning-fix-42511f0.exe", + "same", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\bound-baseline\\bound-nested-calls.arcadia", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\bound-preflight\\bound-nested-calls.arcadia" + ], + "checker_sha256": "9796aa73544c6414003e6230a668a6cf1435978a310187ef2560af67e35f3466", + "exit": 0, + "files": [ + { + "path": "bound-nested-calls.arcadia", + "bytes": 14219, + "sha256": "7531ec264ad3f4b343997e3c0b0ac3b539163908b117e32197876decf3dee3dd" + }, + { + "path": "diagnostics.txt", + "bytes": 592, + "sha256": "e2df3656e0fe6185465aced67f6649fc02bd6e584e7cb38b51ad226c9624da00" + }, + { + "path": "README.md", + "bytes": 855, + "sha256": "f5b4e5090ecf28b230bb96f24c58c0566542aae1032c32bbba058aa4eaf79ac5" + }, + { + "path": "scenario-identities.tsv", + "bytes": 891, + "sha256": "fa9cd8bd17a0d16d70e72e76a670e060e64d92ca3bd4a5bd6b92a363393108b0" + } + ] +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-preflight.log b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-preflight.log new file mode 100644 index 00000000..8cc5ef2d --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-preflight.log @@ -0,0 +1,5 @@ +PASS same: complete Project and exact SourceBundle restored +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\bound-baseline\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000064), field: Some("allocation"), line: 5, column: 5, message: "Allocate leaf 'Review pressure demand' to a performer.", span: Span { start: 256, end: 397 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\bound-baseline\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000065), field: Some("allocation"), line: 10, column: 5, message: "Allocate leaf 'Inspect pressure' to a performer.", span: Span { start: 403, end: 538 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\bound-preflight\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000064), field: Some("allocation"), line: 5, column: 5, message: "Allocate leaf 'Review pressure demand' to a performer.", span: Span { start: 256, end: 397 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\bound-preflight\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000065), field: Some("allocation"), line: 10, column: 5, message: "Allocate leaf 'Inspect pressure' to a performer.", span: Span { start: 403, end: 538 } }, related: [] } diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-reopen-save.json b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-reopen-save.json new file mode 100644 index 00000000..cc572058 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-reopen-save.json @@ -0,0 +1,34 @@ +{ + "utc": "2026-09-12T22:58:26.515219+00:00", + "snapshot": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\bound-reopen-save", + "command": [ + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\delete-oracle-warning-fix-42511f0\\delete-oracle-warning-fix-42511f0.exe", + "same", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\bound-baseline\\bound-nested-calls.arcadia", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\bound-reopen-save\\bound-nested-calls.arcadia" + ], + "checker_sha256": "9796aa73544c6414003e6230a668a6cf1435978a310187ef2560af67e35f3466", + "exit": 0, + "files": [ + { + "path": "bound-nested-calls.arcadia", + "bytes": 14219, + "sha256": "7531ec264ad3f4b343997e3c0b0ac3b539163908b117e32197876decf3dee3dd" + }, + { + "path": "diagnostics.txt", + "bytes": 592, + "sha256": "e2df3656e0fe6185465aced67f6649fc02bd6e584e7cb38b51ad226c9624da00" + }, + { + "path": "README.md", + "bytes": 855, + "sha256": "f5b4e5090ecf28b230bb96f24c58c0566542aae1032c32bbba058aa4eaf79ac5" + }, + { + "path": "scenario-identities.tsv", + "bytes": 891, + "sha256": "fa9cd8bd17a0d16d70e72e76a670e060e64d92ca3bd4a5bd6b92a363393108b0" + } + ] +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-reopen-save.log b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-reopen-save.log new file mode 100644 index 00000000..c37e8bdd --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-reopen-save.log @@ -0,0 +1,5 @@ +PASS same: complete Project and exact SourceBundle restored +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\bound-baseline\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000064), field: Some("allocation"), line: 5, column: 5, message: "Allocate leaf 'Review pressure demand' to a performer.", span: Span { start: 256, end: 397 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\bound-baseline\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000065), field: Some("allocation"), line: 10, column: 5, message: "Allocate leaf 'Inspect pressure' to a performer.", span: Span { start: 403, end: 538 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\bound-reopen-save\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000064), field: Some("allocation"), line: 5, column: 5, message: "Allocate leaf 'Review pressure demand' to a performer.", span: Span { start: 256, end: 397 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\bound-reopen-save\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000065), field: Some("allocation"), line: 10, column: 5, message: "Allocate leaf 'Inspect pressure' to a performer.", span: Span { start: 403, end: 538 } }, related: [] } diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-reopened-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-reopened-0.png new file mode 100644 index 00000000..c2c19f16 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-reopened-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-reopened-saved-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-reopened-saved-0.png new file mode 100644 index 00000000..202e0df7 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-reopened-saved-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-reopened-scenario-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-reopened-scenario-0.png new file mode 100644 index 00000000..8b2e2e4d Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-reopened-scenario-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-save.json b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-save.json new file mode 100644 index 00000000..85bd2a21 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-save.json @@ -0,0 +1,34 @@ +{ + "utc": "2026-09-12T22:57:01.901404+00:00", + "snapshot": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\bound-save", + "command": [ + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\delete-oracle-warning-fix-42511f0\\delete-oracle-warning-fix-42511f0.exe", + "same", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\bound-baseline\\bound-nested-calls.arcadia", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\bound-save\\bound-nested-calls.arcadia" + ], + "checker_sha256": "9796aa73544c6414003e6230a668a6cf1435978a310187ef2560af67e35f3466", + "exit": 0, + "files": [ + { + "path": "bound-nested-calls.arcadia", + "bytes": 14219, + "sha256": "7531ec264ad3f4b343997e3c0b0ac3b539163908b117e32197876decf3dee3dd" + }, + { + "path": "diagnostics.txt", + "bytes": 592, + "sha256": "e2df3656e0fe6185465aced67f6649fc02bd6e584e7cb38b51ad226c9624da00" + }, + { + "path": "README.md", + "bytes": 855, + "sha256": "f5b4e5090ecf28b230bb96f24c58c0566542aae1032c32bbba058aa4eaf79ac5" + }, + { + "path": "scenario-identities.tsv", + "bytes": 891, + "sha256": "fa9cd8bd17a0d16d70e72e76a670e060e64d92ca3bd4a5bd6b92a363393108b0" + } + ] +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-save.log b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-save.log new file mode 100644 index 00000000..2f067e34 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-save.log @@ -0,0 +1,5 @@ +PASS same: complete Project and exact SourceBundle restored +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\bound-baseline\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000064), field: Some("allocation"), line: 5, column: 5, message: "Allocate leaf 'Review pressure demand' to a performer.", span: Span { start: 256, end: 397 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\bound-baseline\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000065), field: Some("allocation"), line: 10, column: 5, message: "Allocate leaf 'Inspect pressure' to a performer.", span: Span { start: 403, end: 538 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\bound-save\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000064), field: Some("allocation"), line: 5, column: 5, message: "Allocate leaf 'Review pressure demand' to a performer.", span: Span { start: 256, end: 397 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\bound-save\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000065), field: Some("allocation"), line: 10, column: 5, message: "Allocate leaf 'Inspect pressure' to a performer.", span: Span { start: 403, end: 538 } }, related: [] } diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-saved-minimum-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-saved-minimum-0.png new file mode 100644 index 00000000..e4f9daf6 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/bound-saved-minimum-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/compact-open-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/compact-open-0.png new file mode 100644 index 00000000..7cc8710d Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/compact-open-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/inspector-delete-text-only-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/inspector-delete-text-only-0.png new file mode 100644 index 00000000..a478ae2c Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/inspector-delete-text-only-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/inspector-shift-delete-protected-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/inspector-shift-delete-protected-0.png new file mode 100644 index 00000000..6b7f8503 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/inspector-shift-delete-protected-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-c1-binding-value-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-c1-binding-value-0.png new file mode 100644 index 00000000..fa892ca7 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-c1-binding-value-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-inner-activation-selected-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-inner-activation-selected-0.png new file mode 100644 index 00000000..6e425956 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-inner-activation-selected-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-nested-full-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-nested-full-0.png new file mode 100644 index 00000000..95bb3b53 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-nested-full-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-outer-activation-selected-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-outer-activation-selected-0.png new file mode 100644 index 00000000..fac6c657 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-outer-activation-selected-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-r1-actual-correlation-value-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-r1-actual-correlation-value-0.png new file mode 100644 index 00000000..06b0e0c3 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-r1-actual-correlation-value-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-r1-correlated-value-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-r1-correlated-value-0.png new file mode 100644 index 00000000..7160068b Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-r1-correlated-value-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-reentrant-full-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-reentrant-full-0.png new file mode 100644 index 00000000..afe3ba03 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-reentrant-full-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-reentrant-inner-selected-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-reentrant-inner-selected-0.png new file mode 100644 index 00000000..e4a4302e Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/oa-reentrant-inner-selected-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-c2-operation-binding-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-c2-operation-binding-0.png new file mode 100644 index 00000000..358e03c8 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-c2-operation-binding-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-c2-request-value-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-c2-request-value-0.png new file mode 100644 index 00000000..3e63931a Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-c2-request-value-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-inner-activation-selected-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-inner-activation-selected-0.png new file mode 100644 index 00000000..f6e2ed59 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-inner-activation-selected-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-nested-1100x700-client-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-nested-1100x700-client-0.png new file mode 100644 index 00000000..9aa889c4 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-nested-1100x700-client-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-nested-full-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-nested-full-0.png new file mode 100644 index 00000000..70e3d984 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-nested-full-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-nested-minimum-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-nested-minimum-0.png new file mode 100644 index 00000000..3d233673 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-nested-minimum-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-nested-minimum-fit-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-nested-minimum-fit-0.png new file mode 100644 index 00000000..73e77b65 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-nested-minimum-fit-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-r2-correlation-value-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-r2-correlation-value-0.png new file mode 100644 index 00000000..723d1322 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/sa-r2-correlation-value-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/scenario-f6-focus-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/scenario-f6-focus-0.png new file mode 100644 index 00000000..fe1b5ceb Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/scenario-f6-focus-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/scenario-f6-from-inspector-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/scenario-f6-from-inspector-0.png new file mode 100644 index 00000000..6f2d9dfb Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/scenario-f6-from-inspector-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/scenario-f6-tab-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/scenario-f6-tab-0.png new file mode 100644 index 00000000..6406407f Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/scenario-f6-tab-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/scenario-traversed-from-reply-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/scenario-traversed-from-reply-0.png new file mode 100644 index 00000000..9907b9df Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/scenario-traversed-from-reply-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-delete-picker-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-delete-picker-0.png new file mode 100644 index 00000000..88d1ab90 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-delete-picker-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-delete-save.json b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-delete-save.json new file mode 100644 index 00000000..27062459 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-delete-save.json @@ -0,0 +1,25 @@ +{ + "utc": "2026-09-12T22:47:43.803902+00:00", + "snapshot": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\state-delete-save", + "command": [ + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\delete-oracle-warning-fix-42511f0\\delete-oracle-warning-fix-42511f0.exe", + "removed", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\compact-baseline\\project.arcadia", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\state-delete-save\\project.arcadia", + "de1e7e00-0000-4000-8000-00000000003f" + ], + "checker_sha256": "9796aa73544c6414003e6230a668a6cf1435978a310187ef2560af67e35f3466", + "exit": 0, + "files": [ + { + "path": "notes.arcadia", + "bytes": 60, + "sha256": "adb1445555f1f47cf2ac92e2271e54df7c5d2eaf1d9363fe5a79d02298670a4e" + }, + { + "path": "project.arcadia", + "bytes": 5407, + "sha256": "46452525c1a4bc118b4818f394853e016777fc0c7ad262ebcf50f4d76fc547ec" + } + ] +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-delete-save.log b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-delete-save.log new file mode 100644 index 00000000..57e4a5b6 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-delete-save.log @@ -0,0 +1,21 @@ +PASS removed de1e7e00-0000-4000-8000-00000000003f: exact baseline-derived Delete candidate and normal source patch +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_system", object_id: Some(de1e7e00-0000-4000-8000-000000000001), field: Some("elements"), line: 2, column: 1, message: "Identify the SA system of interest.", span: Span { start: 11, end: 91 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: Some("allocation"), line: 11, column: 5, message: "Allocate leaf 'Untouched work' to a performer.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "empty_sequence", object_id: Some(de1e7e00-0000-4000-8000-000000000014), field: Some("steps"), line: 27, column: 15, message: "Add ordered occurrences.", span: Span { start: 780, end: 782 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: Some("allocation"), line: 37, column: 5, message: "Allocate leaf 'SA Initialize controller' to a performer.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "machine_owner", object_id: Some(de1e7e00-0000-4000-8000-000000000033), field: Some("parent"), line: 44, column: 16, message: "Assign a state-machine owner.", span: Span { start: 1294, end: 1298 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unreachable_state", object_id: Some(de1e7e00-0000-4000-8000-000000000035), field: Some("body"), line: 52, column: 5, message: "No structural path from a machine entry reaches this vertex; review entry, nesting and transitions (guards are not executed).", span: Span { start: 1454, end: 1663 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_initial", object_id: Some(de1e7e00-0000-4000-8000-000000000034), field: Some("parent"), line: 49, column: 16, message: "Add an Initial default entry or an explicit incoming entry path for this region.", span: Span { start: 1431, end: 1441 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000a), field: None, line: 6, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 147, end: 277 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: None, line: 11, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: None, line: 37, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_system", object_id: Some(de1e7e00-0000-4000-8000-000000000001), field: Some("elements"), line: 2, column: 1, message: "Identify the SA system of interest.", span: Span { start: 11, end: 91 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: Some("allocation"), line: 11, column: 5, message: "Allocate leaf 'Untouched work' to a performer.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "empty_sequence", object_id: Some(de1e7e00-0000-4000-8000-000000000014), field: Some("steps"), line: 27, column: 15, message: "Add ordered occurrences.", span: Span { start: 780, end: 782 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: Some("allocation"), line: 37, column: 5, message: "Allocate leaf 'SA Initialize controller' to a performer.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "machine_owner", object_id: Some(de1e7e00-0000-4000-8000-000000000033), field: Some("parent"), line: 44, column: 16, message: "Assign a state-machine owner.", span: Span { start: 1294, end: 1298 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unreachable_state", object_id: Some(de1e7e00-0000-4000-8000-000000000035), field: Some("body"), line: 52, column: 5, message: "No structural path from a machine entry reaches this vertex; review entry, nesting and transitions (guards are not executed).", span: Span { start: 1454, end: 1663 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_initial", object_id: Some(de1e7e00-0000-4000-8000-000000000034), field: Some("parent"), line: 49, column: 16, message: "Add an Initial default entry or an explicit incoming entry path for this region.", span: Span { start: 1431, end: 1441 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000a), field: None, line: 6, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 147, end: 277 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: None, line: 11, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-delete-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: None, line: 37, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 1013, end: 1156 } }, related: [] } diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-delete-saved-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-delete-saved-0.png new file mode 100644 index 00000000..ceafde6f Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-delete-saved-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-f6-tab-navigation-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-f6-tab-navigation-0.png new file mode 100644 index 00000000..0a582f29 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-f6-tab-navigation-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-restored-saved-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-restored-saved-0.png new file mode 100644 index 00000000..7257977d Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-restored-saved-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-selected-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-selected-0.png new file mode 100644 index 00000000..0f5cd3c6 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-selected-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-shift-delete-after-save-undo-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-shift-delete-after-save-undo-0.png new file mode 100644 index 00000000..933f0181 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-shift-delete-after-save-undo-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-undo-picker-removed-0.png b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-undo-picker-removed-0.png new file mode 100644 index 00000000..529fdb97 Binary files /dev/null and b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-undo-picker-removed-0.png differ diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-undo-save.json b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-undo-save.json new file mode 100644 index 00000000..7e8bad67 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-undo-save.json @@ -0,0 +1,24 @@ +{ + "utc": "2026-09-12T22:48:52.751588+00:00", + "snapshot": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\state-undo-save", + "command": [ + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\delete-oracle-warning-fix-42511f0\\delete-oracle-warning-fix-42511f0.exe", + "same", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\compact-baseline\\project.arcadia", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\checkpoints\\state-undo-save\\project.arcadia" + ], + "checker_sha256": "9796aa73544c6414003e6230a668a6cf1435978a310187ef2560af67e35f3466", + "exit": 0, + "files": [ + { + "path": "notes.arcadia", + "bytes": 60, + "sha256": "adb1445555f1f47cf2ac92e2271e54df7c5d2eaf1d9363fe5a79d02298670a4e" + }, + { + "path": "project.arcadia", + "bytes": 5566, + "sha256": "246e7316f3932df2bc64c70459352ecef2a7fe2b5d8ead03d1f5664587c813bf" + } + ] +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-undo-save.log b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-undo-save.log new file mode 100644 index 00000000..63561dd0 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/evidence/state-undo-save.log @@ -0,0 +1,21 @@ +PASS same: complete Project and exact SourceBundle restored +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_system", object_id: Some(de1e7e00-0000-4000-8000-000000000001), field: Some("elements"), line: 2, column: 1, message: "Identify the SA system of interest.", span: Span { start: 11, end: 91 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: Some("allocation"), line: 11, column: 5, message: "Allocate leaf 'Untouched work' to a performer.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "empty_sequence", object_id: Some(de1e7e00-0000-4000-8000-000000000014), field: Some("steps"), line: 27, column: 15, message: "Add ordered occurrences.", span: Span { start: 780, end: 782 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: Some("allocation"), line: 37, column: 5, message: "Allocate leaf 'SA Initialize controller' to a performer.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "machine_owner", object_id: Some(de1e7e00-0000-4000-8000-000000000033), field: Some("parent"), line: 44, column: 16, message: "Assign a state-machine owner.", span: Span { start: 1294, end: 1298 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unreachable_state", object_id: Some(de1e7e00-0000-4000-8000-000000000035), field: Some("body"), line: 52, column: 5, message: "No structural path from a machine entry reaches this vertex; review entry, nesting and transitions (guards are not executed).", span: Span { start: 1454, end: 1663 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_initial", object_id: Some(de1e7e00-0000-4000-8000-000000000034), field: Some("parent"), line: 49, column: 16, message: "Add an Initial default entry or an explicit incoming entry path for this region.", span: Span { start: 1431, end: 1441 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000a), field: None, line: 6, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 147, end: 277 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: None, line: 11, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\compact-baseline\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: None, line: 37, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_system", object_id: Some(de1e7e00-0000-4000-8000-000000000001), field: Some("elements"), line: 2, column: 1, message: "Identify the SA system of interest.", span: Span { start: 11, end: 91 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: Some("allocation"), line: 11, column: 5, message: "Allocate leaf 'Untouched work' to a performer.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "empty_sequence", object_id: Some(de1e7e00-0000-4000-8000-000000000014), field: Some("steps"), line: 27, column: 15, message: "Add ordered occurrences.", span: Span { start: 780, end: 782 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: Some("allocation"), line: 37, column: 5, message: "Allocate leaf 'SA Initialize controller' to a performer.", span: Span { start: 1013, end: 1156 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "machine_owner", object_id: Some(de1e7e00-0000-4000-8000-000000000033), field: Some("parent"), line: 44, column: 16, message: "Assign a state-machine owner.", span: Span { start: 1294, end: 1298 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unreachable_state", object_id: Some(de1e7e00-0000-4000-8000-000000000035), field: Some("body"), line: 52, column: 5, message: "No structural path from a machine entry reaches this vertex; review entry, nesting and transitions (guards are not executed).", span: Span { start: 1454, end: 1663 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "missing_initial", object_id: Some(de1e7e00-0000-4000-8000-000000000034), field: Some("parent"), line: 49, column: 16, message: "Add an Initial default entry or an explicit incoming entry path for this region.", span: Span { start: 1431, end: 1441 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000a), field: None, line: 6, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 147, end: 277 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-00000000000b), field: None, line: 11, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 283, end: 416 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-followup-20260912-01\checkpoints\state-undo-save\project.arcadia: SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Warning, code: "work_without_behavior_context", object_id: Some(de1e7e00-0000-4000-8000-000000000032), field: None, line: 37, column: 5, message: "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.", span: Span { start: 1013, end: 1156 } }, related: [] } diff --git a/harness/experiments/canvas-native-83f53c7-20260912/launch.json b/harness/experiments/canvas-native-83f53c7-20260912/launch.json new file mode 100644 index 00000000..8ece83aa --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/launch.json @@ -0,0 +1,8 @@ +{ + "utc": "2026-09-12T22:41:22.744747+00:00", + "pid": 4900, + "source": "83f53c7c6e277e250f06d2ae6bfa6a7988bd2e4b", + "binary": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\studio-83f53c7\\arcadia-studio.exe", + "sha256": "49eb87b4a239c586a16b9efbfd036b3823adc8b62a8992feeaa934bca4f5743b", + "private_profile": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-followup-20260912-01\\profile" +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/manifest.json b/harness/experiments/canvas-native-83f53c7-20260912/manifest.json new file mode 100644 index 00000000..5989c2be --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/manifest.json @@ -0,0 +1,657 @@ +{ + "archived_utc": "2026-09-12T23:02:15.289380+00:00", + "source": "83f53c7c6e277e250f06d2ae6bfa6a7988bd2e4b", + "native_trial": ".local/native-qa/canvas-followup-20260912-01", + "native_pid": 4900, + "native_exit": 0, + "payload_count": 101, + "payload_bytes": 5127325, + "verified_checkpoint_records": [ + "evidence/arch-delete-save.json", + "evidence/arch-final-restored.json", + "evidence/arch-redo-save.json", + "evidence/arch-undo-save.json", + "evidence/baseline-preflight.json", + "evidence/bound-preflight.json", + "evidence/bound-reopen-save.json", + "evidence/bound-save.json", + "evidence/state-delete-save.json", + "evidence/state-undo-save.json" + ], + "verified_baseline_files": 6, + "oracle_binary_identities_not_native_app_source": { + ".local\\native-qa\\delete-oracle-warning-fix-42511f0\\delete-oracle-warning-fix-42511f0.exe": { + "bytes": 20894720, + "sha256": "9796aa73544c6414003e6230a668a6cf1435978a310187ef2560af67e35f3466" + } + }, + "exclusions": [ + "profile", + "temp", + "compact-work", + "bound-work", + "draft-work", + "process-work" + ], + "byte_policy": "Copied source bytes exactly, including CRLF; originals unmodified. Source paths are provenance, not portable execution paths.", + "attributes": { + "rule": "harness/experiments/canvas-native-83f53c7-20260912/** -text whitespace=-blank-at-eol,-blank-at-eof,cr-at-eol", + "appended": true, + "before": { + "bytes": 4903, + "sha256": "628228371d50e32e7ac5df3fb22840243753c7e17a59edf12a931705b2d6d1c2" + }, + "after": { + "bytes": 5012, + "sha256": "ed2488d67a2477f483af57a63cec0c19169e13dca34eb9f740943056dfd81ea1" + } + }, + "files": [ + { + "path": "preparation.json", + "source_path": ".local/native-qa/canvas-followup-20260912-01/preparation.json", + "bytes": 4762, + "sha256": "f5bc6cd32de6b9e272654c88c74ebb0db8bbf3c241cd9746a411993d57a6b4b4" + }, + { + "path": "launch.json", + "source_path": ".local/native-qa/canvas-followup-20260912-01/launch.json", + "bytes": 446, + "sha256": "d7e81b0912d4816abb2bf0d86fc484a686eb18c9a146a4b4037dbb0d15b1f30a" + }, + { + "path": "closure.json", + "source_path": ".local/native-qa/canvas-followup-20260912-01/closure.json", + "bytes": 76, + "sha256": "7962cd892187479ab692d0918f0bfd979ed522df3cd1b58307565acae74ea53f" + }, + { + "path": "stdout.log", + "source_path": ".local/native-qa/canvas-followup-20260912-01/stdout.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "stderr.log", + "source_path": ".local/native-qa/canvas-followup-20260912-01/stderr.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "evidence/arch-delete-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/arch-delete-0.png", + "bytes": 109932, + "sha256": "939585f0d57e9114b178ded6609e80fdbb05b6999085103b04e1925c8814803f" + }, + { + "path": "evidence/arch-delete-save.json", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/arch-delete-save.json", + "bytes": 1121, + "sha256": "5fdd564330092cb5988a0177e0ee6c10b732d41d63ce825e495c2745894c82c4" + }, + { + "path": "evidence/arch-delete-save.log", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/arch-delete-save.log", + "bytes": 10433, + "sha256": "c67cc6fd3fe34ddf1eaf71539f60891a65780668d65093f4de5f0aa1f9da6bcb" + }, + { + "path": "evidence/arch-delete-saved-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/arch-delete-saved-0.png", + "bytes": 107668, + "sha256": "4ec6d096989f0cd1fc62468acb9e6dc576bf7c501ef9cff05775887a66b265d0" + }, + { + "path": "evidence/arch-final-restored.json", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/arch-final-restored.json", + "bytes": 1080, + "sha256": "cc7c5e99d530982dda482fa2b2980d7e7094cea40a032f8d88cefdaf02123543" + }, + { + "path": "evidence/arch-final-restored.log", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/arch-final-restored.log", + "bytes": 10408, + "sha256": "77881a8ba74db5f01c602546d8b1e45a19b310952c085bab54ed0759f0784889" + }, + { + "path": "evidence/arch-redo-save.json", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/arch-redo-save.json", + "bytes": 1117, + "sha256": "c23f57ba60f72e39613f7da27617e3081ecfd53d03d1f445678aa534d8c13426" + }, + { + "path": "evidence/arch-redo-save.log", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/arch-redo-save.log", + "bytes": 10413, + "sha256": "d040e6f8a8e3ba6dca9f4acfd6d43fd97a48577849a912c6bacd3b9e8fb6ea58" + }, + { + "path": "evidence/arch-redo-saved-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/arch-redo-saved-0.png", + "bytes": 107668, + "sha256": "4ec6d096989f0cd1fc62468acb9e6dc576bf7c501ef9cff05775887a66b265d0" + }, + { + "path": "evidence/arch-shift-delete-confirmation-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/arch-shift-delete-confirmation-0.png", + "bytes": 112573, + "sha256": "536e34a8ed43c67511a69895d1ff6d54d1d6d59316c57a1c675116f13de9a587" + }, + { + "path": "evidence/arch-undo-save.json", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/arch-undo-save.json", + "bytes": 1070, + "sha256": "bfa76e32b9a89400dbf5a7bce668bedbe9c4630a20219c07e2a5899c2b9ce8f6" + }, + { + "path": "evidence/arch-undo-save.log", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/arch-undo-save.log", + "bytes": 10358, + "sha256": "163c8b0bc267873f429f2e56155317b095883bfd0333a30f22f8706b39d02f52" + }, + { + "path": "evidence/arch-undo-saved-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/arch-undo-saved-0.png", + "bytes": 112096, + "sha256": "982f649812b368143e00bd2d20069275543cce303f1260be54fa7bf0c2111b44" + }, + { + "path": "evidence/baseline-preflight.json", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/baseline-preflight.json", + "bytes": 1078, + "sha256": "fb052c21a3857e4fe69ef91580551289de6d8c90f72ce9050ae56795fb49aab6" + }, + { + "path": "evidence/baseline-preflight.log", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/baseline-preflight.log", + "bytes": 10398, + "sha256": "40c4f99a6e3157baabd4c4c7839911989f257e00664c30d4075dabfa70b25096" + }, + { + "path": "evidence/bound-open-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/bound-open-0.png", + "bytes": 101541, + "sha256": "8a449c1d870c218b36e75e99830679a45f13e1a5620455ab97434888abd2daf2" + }, + { + "path": "evidence/bound-preflight.json", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/bound-preflight.json", + "bytes": 1407, + "sha256": "364af3ee75cbb59587beb0a7e297196bdd841ff887b5620831e82ef9546d5b1c" + }, + { + "path": "evidence/bound-preflight.log", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/bound-preflight.log", + "bytes": 2124, + "sha256": "84f68a4ce8e3c9b78770a72b7ee379b70a1b2a8452f63700c6374b90a1890896" + }, + { + "path": "evidence/bound-reopen-save.json", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/bound-reopen-save.json", + "bytes": 1411, + "sha256": "b2504dbe9ff9440d953b035c95ecf714a52be1b46305448b5e50ff836154c1eb" + }, + { + "path": "evidence/bound-reopen-save.log", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/bound-reopen-save.log", + "bytes": 2128, + "sha256": "48e02ab15e7c17a313edb9e95f2ee9775bb4b2dcd29bfc6b44a18bb99bc28098" + }, + { + "path": "evidence/bound-reopened-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/bound-reopened-0.png", + "bytes": 88581, + "sha256": "9e3ef13e8e216d857ebd747d6662399b3e1f41487fee1d355a5d355dc30da7e8" + }, + { + "path": "evidence/bound-reopened-saved-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/bound-reopened-saved-0.png", + "bytes": 98152, + "sha256": "a8a971848f4870305209190fc9cbc4fde253816c256d9abcc0b42ddd73424dc1" + }, + { + "path": "evidence/bound-reopened-scenario-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/bound-reopened-scenario-0.png", + "bytes": 99777, + "sha256": "47588cbbfdcb390130f9fea418fccbd5f4bccea820f77e245531f2299529a372" + }, + { + "path": "evidence/bound-save.json", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/bound-save.json", + "bytes": 1397, + "sha256": "8cecb224e89ac84772a596867799b54413643a3871705171d9e912e2bd420a23" + }, + { + "path": "evidence/bound-save.log", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/bound-save.log", + "bytes": 2114, + "sha256": "cb39657e921ad4685c830ae37279c8b9a03d2f750f6bc716d4e809b6ebecb9bd" + }, + { + "path": "evidence/bound-saved-minimum-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/bound-saved-minimum-0.png", + "bytes": 97645, + "sha256": "4ccf207b81cd6829962458eef6ca8f5fdc0618e7932a69f6895eaac8038f69c2" + }, + { + "path": "evidence/compact-open-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/compact-open-0.png", + "bytes": 105581, + "sha256": "072a4cb0782b1d58ecce344905916bdea3b7464a56dcf874c8831b53a0f1dd36" + }, + { + "path": "evidence/inspector-delete-text-only-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/inspector-delete-text-only-0.png", + "bytes": 127236, + "sha256": "500a94284f3162b35a3b84371179832556bedc20d56bf9ab569d986be05eb458" + }, + { + "path": "evidence/inspector-shift-delete-protected-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/inspector-shift-delete-protected-0.png", + "bytes": 127196, + "sha256": "b1b23d4b72ce2c3d8652e07f30867ee3976569bc1d32180c4443b92e23dc2710" + }, + { + "path": "evidence/oa-c1-binding-value-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/oa-c1-binding-value-0.png", + "bytes": 130591, + "sha256": "2129d512540c7413bc807186b85ba92d94c00264bebc546f38f96eea4370cf6d" + }, + { + "path": "evidence/oa-inner-activation-selected-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/oa-inner-activation-selected-0.png", + "bytes": 127916, + "sha256": "0720345c507d62e795970f1d4f85c09304d93b4e5c03d599f0c6bc6ca53b8568" + }, + { + "path": "evidence/oa-nested-full-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/oa-nested-full-0.png", + "bytes": 119109, + "sha256": "a7712234aaf8686d7ab93353fb8710dd288b517f0c6828a23579ec5a2ab2611a" + }, + { + "path": "evidence/oa-outer-activation-selected-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/oa-outer-activation-selected-0.png", + "bytes": 128468, + "sha256": "63d85e7c13b688594d8cd429e5631bcf55f2d4528b3837316a9ae542f2e7cba4" + }, + { + "path": "evidence/oa-r1-actual-correlation-value-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/oa-r1-actual-correlation-value-0.png", + "bytes": 129841, + "sha256": "c93bee13c71fd49c244256cd74a6936c93568513072a4f25c74ca6631cfb5ad4" + }, + { + "path": "evidence/oa-r1-correlated-value-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/oa-r1-correlated-value-0.png", + "bytes": 127947, + "sha256": "ea580651f381eae325e204be850b18c17e8549e92b1fbb3d086918e1476d3b2a" + }, + { + "path": "evidence/oa-reentrant-full-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/oa-reentrant-full-0.png", + "bytes": 126877, + "sha256": "8362f9afebd14d7d5d74e2f52997d59cd0dc4575f0ba495d8d5ea61b129ef8fd" + }, + { + "path": "evidence/oa-reentrant-inner-selected-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/oa-reentrant-inner-selected-0.png", + "bytes": 127967, + "sha256": "810bd173dabe62946a33e1a01189e28b8b6e5d67b99e8075a625819f89b39b41" + }, + { + "path": "evidence/sa-c2-operation-binding-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/sa-c2-operation-binding-0.png", + "bytes": 134916, + "sha256": "8a4b0ce7d3672fe2065058dba5d1f4add6fd22b9ec6eeeaf0bc1644de313b455" + }, + { + "path": "evidence/sa-c2-request-value-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/sa-c2-request-value-0.png", + "bytes": 130565, + "sha256": "90a34ac7df3e12422fe5215b7c59ee12d1f1dad7e1eeeb13de5f7bfe6234d2e1" + }, + { + "path": "evidence/sa-inner-activation-selected-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/sa-inner-activation-selected-0.png", + "bytes": 126667, + "sha256": "3037adab85afaa22fbceefe6226274d2e155179c4ce061d4552531058646e78b" + }, + { + "path": "evidence/sa-nested-1100x700-client-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/sa-nested-1100x700-client-0.png", + "bytes": 101383, + "sha256": "d84ab6461ccc94a215272294d10b524104b27e5e9f13882f47116826f4391546" + }, + { + "path": "evidence/sa-nested-full-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/sa-nested-full-0.png", + "bytes": 112485, + "sha256": "bb43f198b7cc5727963c2a792f5fc4cba53467f4860fba19a31a82b84e1de787" + }, + { + "path": "evidence/sa-nested-minimum-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/sa-nested-minimum-0.png", + "bytes": 128581, + "sha256": "d6fa760a2e85d8ecbedfafbe1138c508d1af46548dcd0d80f81ef628512e8c9b" + }, + { + "path": "evidence/sa-nested-minimum-fit-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/sa-nested-minimum-fit-0.png", + "bytes": 99355, + "sha256": "b322bf788d7a2bb33edc1a9c6febbb5b156459d5975ca06f4001013fc7491e56" + }, + { + "path": "evidence/sa-r2-correlation-value-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/sa-r2-correlation-value-0.png", + "bytes": 130031, + "sha256": "f226544054114349679420524c034f4ad3607d37497edbf7a7b8768cc6cf31a2" + }, + { + "path": "evidence/scenario-f6-focus-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/scenario-f6-focus-0.png", + "bytes": 129033, + "sha256": "3423a7378e73c61b9f10e9d9cc354c46f3dfd17472ee99ac7cd7207a533320fc" + }, + { + "path": "evidence/scenario-f6-from-inspector-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/scenario-f6-from-inspector-0.png", + "bytes": 135711, + "sha256": "ceea05d321e426efef5699ba78aab18bd8cc1bf1825d5e1de24a459b5ac50b56" + }, + { + "path": "evidence/scenario-f6-tab-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/scenario-f6-tab-0.png", + "bytes": 135327, + "sha256": "f10841bd6c024033435c97d46742f6a7376fc0852953fbc6231f05b42e7668a3" + }, + { + "path": "evidence/scenario-traversed-from-reply-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/scenario-traversed-from-reply-0.png", + "bytes": 135432, + "sha256": "73f9ab82931b73da1640382cd2ea7a763e1c04c478591f107adb3a490f31b7bd" + }, + { + "path": "evidence/state-delete-picker-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/state-delete-picker-0.png", + "bytes": 128554, + "sha256": "a8816fe1b6ab410d990af9d1874af0089af470392cc629f6c51bb9516b1c5d32" + }, + { + "path": "evidence/state-delete-save.json", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/state-delete-save.json", + "bytes": 1123, + "sha256": "c26d2ef208274892bc47adb30b171a6057208653361b66983e6db8e5da4095b3" + }, + { + "path": "evidence/state-delete-save.log", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/state-delete-save.log", + "bytes": 10443, + "sha256": "967f5aa4e24a6aea5c30bb424e79da3b4db16c9863d6cca3746ec36846b7e2df" + }, + { + "path": "evidence/state-delete-saved-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/state-delete-saved-0.png", + "bytes": 126169, + "sha256": "fa4b823a0037e33315c8fd705b6ce503a32de95d515c51f3a4f348cadd55bd19" + }, + { + "path": "evidence/state-f6-tab-navigation-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/state-f6-tab-navigation-0.png", + "bytes": 128147, + "sha256": "3d3b7798cfa1b67b48617d116700aabf67fe76fdae0b1213836b683d365d9cb4" + }, + { + "path": "evidence/state-restored-saved-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/state-restored-saved-0.png", + "bytes": 126969, + "sha256": "8c2529525217bc4963d2df702853815fce610a929ae8417dc14754efabdd0655" + }, + { + "path": "evidence/state-selected-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/state-selected-0.png", + "bytes": 128297, + "sha256": "6fb5518ef24e103166c09d7f3a05afd9a185347d8069da6aa62ef0375d7f8a0c" + }, + { + "path": "evidence/state-shift-delete-after-save-undo-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/state-shift-delete-after-save-undo-0.png", + "bytes": 123866, + "sha256": "575d3f4c825f3a49cfbae4dd9a44fb13fa3721942052580ab3947d5395365c10" + }, + { + "path": "evidence/state-undo-picker-removed-0.png", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/state-undo-picker-removed-0.png", + "bytes": 128431, + "sha256": "9e25a1047e96038577ed0eceb0f0f26ba22baa33d2b8ac17511fc9a615696c3d" + }, + { + "path": "evidence/state-undo-save.json", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/state-undo-save.json", + "bytes": 1072, + "sha256": "643661dc1e07c556f0164a60019230e4d47503bf59c7dda203d00806a61e0dcc" + }, + { + "path": "evidence/state-undo-save.log", + "source_path": ".local/native-qa/canvas-followup-20260912-01/evidence/state-undo-save.log", + "bytes": 10368, + "sha256": "03d848ea501d8e6f4ee615f1b04340eb93167364a13417753b7fe2097ae4cf29" + }, + { + "path": "checkpoints/arch-delete-save/notes.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/arch-delete-save/notes.arcadia", + "bytes": 60, + "sha256": "adb1445555f1f47cf2ac92e2271e54df7c5d2eaf1d9363fe5a79d02298670a4e" + }, + { + "path": "checkpoints/arch-delete-save/project.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/arch-delete-save/project.arcadia", + "bytes": 5416, + "sha256": "9f41161fd7fd014ed0744bb45a223958c6fd2b6e94a76cb6ddb468360f723726" + }, + { + "path": "checkpoints/arch-final-restored/notes.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/arch-final-restored/notes.arcadia", + "bytes": 60, + "sha256": "adb1445555f1f47cf2ac92e2271e54df7c5d2eaf1d9363fe5a79d02298670a4e" + }, + { + "path": "checkpoints/arch-final-restored/project.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/arch-final-restored/project.arcadia", + "bytes": 5566, + "sha256": "246e7316f3932df2bc64c70459352ecef2a7fe2b5d8ead03d1f5664587c813bf" + }, + { + "path": "checkpoints/arch-redo-save/notes.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/arch-redo-save/notes.arcadia", + "bytes": 60, + "sha256": "adb1445555f1f47cf2ac92e2271e54df7c5d2eaf1d9363fe5a79d02298670a4e" + }, + { + "path": "checkpoints/arch-redo-save/project.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/arch-redo-save/project.arcadia", + "bytes": 5416, + "sha256": "9f41161fd7fd014ed0744bb45a223958c6fd2b6e94a76cb6ddb468360f723726" + }, + { + "path": "checkpoints/arch-undo-save/notes.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/arch-undo-save/notes.arcadia", + "bytes": 60, + "sha256": "adb1445555f1f47cf2ac92e2271e54df7c5d2eaf1d9363fe5a79d02298670a4e" + }, + { + "path": "checkpoints/arch-undo-save/project.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/arch-undo-save/project.arcadia", + "bytes": 5566, + "sha256": "246e7316f3932df2bc64c70459352ecef2a7fe2b5d8ead03d1f5664587c813bf" + }, + { + "path": "checkpoints/baseline-preflight/notes.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/baseline-preflight/notes.arcadia", + "bytes": 60, + "sha256": "adb1445555f1f47cf2ac92e2271e54df7c5d2eaf1d9363fe5a79d02298670a4e" + }, + { + "path": "checkpoints/baseline-preflight/project.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/baseline-preflight/project.arcadia", + "bytes": 5566, + "sha256": "246e7316f3932df2bc64c70459352ecef2a7fe2b5d8ead03d1f5664587c813bf" + }, + { + "path": "checkpoints/bound-preflight/bound-nested-calls.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/bound-preflight/bound-nested-calls.arcadia", + "bytes": 14219, + "sha256": "7531ec264ad3f4b343997e3c0b0ac3b539163908b117e32197876decf3dee3dd" + }, + { + "path": "checkpoints/bound-preflight/diagnostics.txt", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/bound-preflight/diagnostics.txt", + "bytes": 592, + "sha256": "e2df3656e0fe6185465aced67f6649fc02bd6e584e7cb38b51ad226c9624da00" + }, + { + "path": "checkpoints/bound-preflight/README.md", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/bound-preflight/README.md", + "bytes": 855, + "sha256": "f5b4e5090ecf28b230bb96f24c58c0566542aae1032c32bbba058aa4eaf79ac5" + }, + { + "path": "checkpoints/bound-preflight/scenario-identities.tsv", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/bound-preflight/scenario-identities.tsv", + "bytes": 891, + "sha256": "fa9cd8bd17a0d16d70e72e76a670e060e64d92ca3bd4a5bd6b92a363393108b0" + }, + { + "path": "checkpoints/bound-reopen-save/bound-nested-calls.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/bound-reopen-save/bound-nested-calls.arcadia", + "bytes": 14219, + "sha256": "7531ec264ad3f4b343997e3c0b0ac3b539163908b117e32197876decf3dee3dd" + }, + { + "path": "checkpoints/bound-reopen-save/diagnostics.txt", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/bound-reopen-save/diagnostics.txt", + "bytes": 592, + "sha256": "e2df3656e0fe6185465aced67f6649fc02bd6e584e7cb38b51ad226c9624da00" + }, + { + "path": "checkpoints/bound-reopen-save/README.md", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/bound-reopen-save/README.md", + "bytes": 855, + "sha256": "f5b4e5090ecf28b230bb96f24c58c0566542aae1032c32bbba058aa4eaf79ac5" + }, + { + "path": "checkpoints/bound-reopen-save/scenario-identities.tsv", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/bound-reopen-save/scenario-identities.tsv", + "bytes": 891, + "sha256": "fa9cd8bd17a0d16d70e72e76a670e060e64d92ca3bd4a5bd6b92a363393108b0" + }, + { + "path": "checkpoints/bound-save/bound-nested-calls.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/bound-save/bound-nested-calls.arcadia", + "bytes": 14219, + "sha256": "7531ec264ad3f4b343997e3c0b0ac3b539163908b117e32197876decf3dee3dd" + }, + { + "path": "checkpoints/bound-save/diagnostics.txt", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/bound-save/diagnostics.txt", + "bytes": 592, + "sha256": "e2df3656e0fe6185465aced67f6649fc02bd6e584e7cb38b51ad226c9624da00" + }, + { + "path": "checkpoints/bound-save/README.md", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/bound-save/README.md", + "bytes": 855, + "sha256": "f5b4e5090ecf28b230bb96f24c58c0566542aae1032c32bbba058aa4eaf79ac5" + }, + { + "path": "checkpoints/bound-save/scenario-identities.tsv", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/bound-save/scenario-identities.tsv", + "bytes": 891, + "sha256": "fa9cd8bd17a0d16d70e72e76a670e060e64d92ca3bd4a5bd6b92a363393108b0" + }, + { + "path": "checkpoints/state-delete-save/notes.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/state-delete-save/notes.arcadia", + "bytes": 60, + "sha256": "adb1445555f1f47cf2ac92e2271e54df7c5d2eaf1d9363fe5a79d02298670a4e" + }, + { + "path": "checkpoints/state-delete-save/project.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/state-delete-save/project.arcadia", + "bytes": 5407, + "sha256": "46452525c1a4bc118b4818f394853e016777fc0c7ad262ebcf50f4d76fc547ec" + }, + { + "path": "checkpoints/state-undo-save/notes.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/state-undo-save/notes.arcadia", + "bytes": 60, + "sha256": "adb1445555f1f47cf2ac92e2271e54df7c5d2eaf1d9363fe5a79d02298670a4e" + }, + { + "path": "checkpoints/state-undo-save/project.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/checkpoints/state-undo-save/project.arcadia", + "bytes": 5566, + "sha256": "246e7316f3932df2bc64c70459352ecef2a7fe2b5d8ead03d1f5664587c813bf" + }, + { + "path": "compact-baseline/notes.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/compact-baseline/notes.arcadia", + "bytes": 60, + "sha256": "adb1445555f1f47cf2ac92e2271e54df7c5d2eaf1d9363fe5a79d02298670a4e" + }, + { + "path": "compact-baseline/project.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/compact-baseline/project.arcadia", + "bytes": 5566, + "sha256": "246e7316f3932df2bc64c70459352ecef2a7fe2b5d8ead03d1f5664587c813bf" + }, + { + "path": "bound-baseline/bound-nested-calls.arcadia", + "source_path": ".local/native-qa/canvas-followup-20260912-01/bound-baseline/bound-nested-calls.arcadia", + "bytes": 14219, + "sha256": "7531ec264ad3f4b343997e3c0b0ac3b539163908b117e32197876decf3dee3dd" + }, + { + "path": "bound-baseline/diagnostics.txt", + "source_path": ".local/native-qa/canvas-followup-20260912-01/bound-baseline/diagnostics.txt", + "bytes": 592, + "sha256": "e2df3656e0fe6185465aced67f6649fc02bd6e584e7cb38b51ad226c9624da00" + }, + { + "path": "bound-baseline/README.md", + "source_path": ".local/native-qa/canvas-followup-20260912-01/bound-baseline/README.md", + "bytes": 855, + "sha256": "f5b4e5090ecf28b230bb96f24c58c0566542aae1032c32bbba058aa4eaf79ac5" + }, + { + "path": "bound-baseline/scenario-identities.tsv", + "source_path": ".local/native-qa/canvas-followup-20260912-01/bound-baseline/scenario-identities.tsv", + "bytes": 891, + "sha256": "fa9cd8bd17a0d16d70e72e76a670e060e64d92ca3bd4a5bd6b92a363393108b0" + }, + { + "path": "tools/canvas-native-session.py", + "source_path": ".local/canvas-native-session.py", + "bytes": 4528, + "sha256": "29c47001035de93dcce62b88062c31eeebfda41403952ca67bf81f634cce944d" + }, + { + "path": "tools/canvas-native-checkpoint.py", + "source_path": ".local/canvas-native-checkpoint.py", + "bytes": 2063, + "sha256": "c342ed76271bf698b34f1879df695c0c9e1564e03b9459f9f6f9d857d680c6c5" + }, + { + "path": "tools/archive-canvas-native-83f53c7.py", + "source_path": ".local/archive-canvas-native-83f53c7.py", + "bytes": 7625, + "sha256": "bcc23e5fce90b7f2f0cea0ed2e397aeed6aad7b125226081e936e3a8c464575d" + }, + { + "path": "stage/manifest.json", + "source_path": ".local/native-qa/studio-83f53c7/manifest.json", + "bytes": 101704, + "sha256": "6867399ab8b0198a9505c13f41f50a7950c6b8fc54df87404a19c24d08c84e80" + } + ] +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/preparation.json b/harness/experiments/canvas-native-83f53c7-20260912/preparation.json new file mode 100644 index 00000000..f4445ce7 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/preparation.json @@ -0,0 +1,107 @@ +{ + "utc": "2026-09-12T22:01:52.584055+00:00", + "files": [ + { + "path": "compact-baseline/notes.arcadia", + "source": ".local\\native-qa\\delete-20260912\\compact-baseline-v2\\notes.arcadia", + "bytes": 60, + "sha256": "adb1445555f1f47cf2ac92e2271e54df7c5d2eaf1d9363fe5a79d02298670a4e" + }, + { + "path": "compact-baseline/project.arcadia", + "source": ".local\\native-qa\\delete-20260912\\compact-baseline-v2\\project.arcadia", + "bytes": 5566, + "sha256": "246e7316f3932df2bc64c70459352ecef2a7fe2b5d8ead03d1f5664587c813bf" + }, + { + "path": "compact-work/notes.arcadia", + "source": ".local\\native-qa\\delete-20260912\\compact-baseline-v2\\notes.arcadia", + "bytes": 60, + "sha256": "adb1445555f1f47cf2ac92e2271e54df7c5d2eaf1d9363fe5a79d02298670a4e" + }, + { + "path": "compact-work/project.arcadia", + "source": ".local\\native-qa\\delete-20260912\\compact-baseline-v2\\project.arcadia", + "bytes": 5566, + "sha256": "246e7316f3932df2bc64c70459352ecef2a7fe2b5d8ead03d1f5664587c813bf" + }, + { + "path": "bound-baseline/bound-nested-calls.arcadia", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\bound-nested-fixture-r1-20260912\\bound-nested-calls.arcadia", + "bytes": 14219, + "sha256": "7531ec264ad3f4b343997e3c0b0ac3b539163908b117e32197876decf3dee3dd" + }, + { + "path": "bound-baseline/diagnostics.txt", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\bound-nested-fixture-r1-20260912\\diagnostics.txt", + "bytes": 592, + "sha256": "e2df3656e0fe6185465aced67f6649fc02bd6e584e7cb38b51ad226c9624da00" + }, + { + "path": "bound-baseline/README.md", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\bound-nested-fixture-r1-20260912\\README.md", + "bytes": 855, + "sha256": "f5b4e5090ecf28b230bb96f24c58c0566542aae1032c32bbba058aa4eaf79ac5" + }, + { + "path": "bound-baseline/scenario-identities.tsv", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\bound-nested-fixture-r1-20260912\\scenario-identities.tsv", + "bytes": 891, + "sha256": "fa9cd8bd17a0d16d70e72e76a670e060e64d92ca3bd4a5bd6b92a363393108b0" + }, + { + "path": "bound-work/bound-nested-calls.arcadia", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\bound-nested-fixture-r1-20260912\\bound-nested-calls.arcadia", + "bytes": 14219, + "sha256": "7531ec264ad3f4b343997e3c0b0ac3b539163908b117e32197876decf3dee3dd" + }, + { + "path": "bound-work/diagnostics.txt", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\bound-nested-fixture-r1-20260912\\diagnostics.txt", + "bytes": 592, + "sha256": "e2df3656e0fe6185465aced67f6649fc02bd6e584e7cb38b51ad226c9624da00" + }, + { + "path": "bound-work/README.md", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\bound-nested-fixture-r1-20260912\\README.md", + "bytes": 855, + "sha256": "f5b4e5090ecf28b230bb96f24c58c0566542aae1032c32bbba058aa4eaf79ac5" + }, + { + "path": "bound-work/scenario-identities.tsv", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\bound-nested-fixture-r1-20260912\\scenario-identities.tsv", + "bytes": 891, + "sha256": "fa9cd8bd17a0d16d70e72e76a670e060e64d92ca3bd4a5bd6b92a363393108b0" + }, + { + "path": "draft-work/diagnostics.txt", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\nested-call-fixture-20260912\\diagnostics.txt", + "bytes": 20426, + "sha256": "2651c90057ba8ce46b9331a0fb05206e3d744928d40c63232775123282c52698" + }, + { + "path": "draft-work/nested-call-evaluator.arcadia", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\nested-call-fixture-20260912\\nested-call-evaluator.arcadia", + "bytes": 50095, + "sha256": "ee8eec6459f28a11dcd25736e3147d6a0e153e22ecc8a4c8a3c61e4494ca2835" + }, + { + "path": "process-work/expected-baseline.json", + "source": "harness\\fixtures\\source7-native\\base\\expected-baseline.json", + "bytes": 26428, + "sha256": "e2882a58f841f460f45d9d67db1606440e0d7997b9b29a784569ae48e4b23bfb" + }, + { + "path": "process-work/project.arcadia", + "source": "harness\\fixtures\\source7-native\\base\\project.arcadia", + "bytes": 13616, + "sha256": "5474d8ca05fd1375220dc0ad40d913631fde51159e9632bb9f290d1ecdab8dd7" + }, + { + "path": "process-work/rationale.arcadia", + "source": "harness\\fixtures\\source7-native\\base\\rationale.arcadia", + "bytes": 59, + "sha256": "e6a600e13036d4ad594a65380ed1b3d82d1772d583041bb0a624c9588a73047a" + } + ] +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/stage/manifest.json b/harness/experiments/canvas-native-83f53c7-20260912/stage/manifest.json new file mode 100644 index 00000000..7ce61253 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/stage/manifest.json @@ -0,0 +1,2754 @@ +{ + "source": "83f53c7c6e277e250f06d2ae6bfa6a7988bd2e4b", + "full_test_source": "83f53c7c6e277e250f06d2ae6bfa6a7988bd2e4b", + "staged_utc": "2026-09-12T22:41:08.545717+00:00", + "test_only_correction": null, + "toolchain": "Rust/Cargo 1.98.1 Windows gnullvm; LLVM-MinGW 20260908; jobs 1", + "results": { + "clippy": { + "source": "83f53c7c6e277e250f06d2ae6bfa6a7988bd2e4b", + "start": "2026-09-12T22:31:23.471288+00:00", + "end": "2026-09-12T22:32:41.409152+00:00", + "exit": 0, + "command": [ + "cargo", + "clippy", + "--locked", + "-p", + "oa-desktop", + "--all-targets", + "--", + "-D", + "warnings" + ], + "inputs": "clippy-83f53c7.inputs.json", + "changed_inputs": [] + }, + "gui": { + "source": "83f53c7c6e277e250f06d2ae6bfa6a7988bd2e4b", + "start": "2026-09-12T22:32:42.945457+00:00", + "end": "2026-09-12T22:35:05.719491+00:00", + "exit": 0, + "command": [ + "cargo", + "build", + "--locked", + "-p", + "oa-desktop", + "--bin", + "arcadia-studio" + ], + "inputs": "gui-83f53c7.inputs.json", + "changed_inputs": [] + }, + "full": { + "source": "83f53c7c6e277e250f06d2ae6bfa6a7988bd2e4b", + "start": "2026-09-12T22:23:32.558376+00:00", + "end": "2026-09-12T22:30:30.706219+00:00", + "exit": 0, + "command": [ + "cargo", + "test", + "--locked", + "-p", + "oa-desktop", + "--bin", + "arcadia-studio", + "--", + "--test-threads=1" + ], + "inputs": "full-83f53c7.inputs.json", + "changed_inputs": [] + } + }, + "inputs": [ + { + "path": "Cargo.lock", + "bytes": 119973, + "sha256": "065c23c94908fe499d32ed91d55a70946ed5b08ecfda3b483ec1e635572257bf" + }, + { + "path": "Cargo.toml", + "bytes": 400, + "sha256": "369f5b4b2b60705a94623c8c0b68f8e0b048f263280ce07ae0629ad353797d62" + }, + { + "path": "build/windows.manifest", + "bytes": 354, + "sha256": "9c19c5a02f858ece84c44839ad2b145d9c1d90442da0b15c87fd045f975974eb" + }, + { + "path": "build/windows.rc", + "bytes": 24, + "sha256": "a27385edcae0bcf96f55361056cb7be5f36d76fcddcaefd20647c91959563e1e" + }, + { + "path": "build/windows_manifest.rs", + "bytes": 1460, + "sha256": "168da2c42ecccfebc11ee3e1b455e653a68fe9c6d30a9842a8b9e7441d086c80" + }, + { + "path": "crates/oa-cli/Cargo.toml", + "bytes": 279, + "sha256": "49c567f1af74a826683b4d96845feb3806fd9bcb7dc2767e16b5509d4e5e1cde" + }, + { + "path": "crates/oa-cli/src/lib.rs", + "bytes": 15498, + "sha256": "97bebab63b4a611a1d36ad0c20fe452cbe1985fe3a6fbd39c954603da11410fc" + }, + { + "path": "crates/oa-cli/src/main.rs", + "bytes": 2984, + "sha256": "de964f9b6c59c0f31c080afbd3b31d442b07b1b44f6a187a248d3409c45d35fb" + }, + { + "path": "crates/oa-cli/tests/source_cli.rs", + "bytes": 16600, + "sha256": "a3a1b856c7a9fd3d80bc8074150a24fbb0ef0e9ddf736c7cea036725fc3dc2b8" + }, + { + "path": "crates/oa-core/Cargo.toml", + "bytes": 408, + "sha256": "6b5c062474ebb62d5082e07dabed99ee85e4a833edf26690fb4f887028d3416f" + }, + { + "path": "crates/oa-core/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-core/examples/generate_demo.rs", + "bytes": 795, + "sha256": "e26f432c95331aeca50985dbb3ad2c558affd43023b585811f0f7bfaa59f6661" + }, + { + "path": "crates/oa-core/examples/generate_release1.rs", + "bytes": 1798, + "sha256": "1d5f11165d74893e4bc18dbf3a2f2111f4026bd89fd06ee7f0bae69e45c4d4b5" + }, + { + "path": "crates/oa-core/examples/release_dense_views.rs", + "bytes": 14664, + "sha256": "a83158488ef9b7394f136c52b1496719be935c4e5bdfe457cab5c9894f5f9412" + }, + { + "path": "crates/oa-core/examples/routing_workshop.rs", + "bytes": 17248, + "sha256": "571307b18b6d4fa04700c5a4d4b0c2154c419e93a21292b2028e7b6f46a2faa7" + }, + { + "path": "crates/oa-core/src/analysis_numeric.rs", + "bytes": 3735, + "sha256": "6c88eef3119162aeb6c07b9e75812c3af9fbfe75554b0503ad00f103cb478408" + }, + { + "path": "crates/oa-core/src/analysis_numeric/dimension.rs", + "bytes": 3045, + "sha256": "d4ad8e5307a1620e31791d724a0e31fdba860d00dc83e3e1f2209d9c5e22a340" + }, + { + "path": "crates/oa-core/src/analysis_numeric/exact.rs", + "bytes": 17338, + "sha256": "4eb8cb0f66b10e5da204899af82ee26adfec74bab47b1a6c9842b5488ee04c4d" + }, + { + "path": "crates/oa-core/src/analysis_numeric/fixtures/r7-literal-boundaries.json", + "bytes": 6085, + "sha256": "3b959dec5e100a6f03817f5314bef497347ba579ebd235476516d4bd83399181" + }, + { + "path": "crates/oa-core/src/analysis_numeric/meter.rs", + "bytes": 7129, + "sha256": "1f7174beb992935b4c399acdef91114af73faf041070feab968455ac827e8ee4" + }, + { + "path": "crates/oa-core/src/analysis_numeric/quantity.rs", + "bytes": 12257, + "sha256": "ead5142d6eeea8f99399d57e02d8f7d819980923de76387cd454694d6a747aee" + }, + { + "path": "crates/oa-core/src/analysis_numeric/tests.rs", + "bytes": 27486, + "sha256": "323ce82fc057d36f44463569fd8ea324c7d700fddfbf32bce15e04bd2a66970b" + }, + { + "path": "crates/oa-core/src/data.rs", + "bytes": 42696, + "sha256": "7f9c7c7dd8353cb5a38597b92cde6d3e890203d392473187eb387d41ff37414a" + }, + { + "path": "crates/oa-core/src/demo.rs", + "bytes": 20657, + "sha256": "ad62123f96c20ff023cafc1a9849b0fa06bc62edd1fb9701799e4599b458600c" + }, + { + "path": "crates/oa-core/src/language.rs", + "bytes": 99938, + "sha256": "638f08a42e9cf4996b5d07f69b4d6f517a518369f3604d25be1006e40e080765" + }, + { + "path": "crates/oa-core/src/language/semantic_source.rs", + "bytes": 7326, + "sha256": "584b5bb59d87a7b8d44d5dd2d124c3a1323b21492b138a17bc9526c0087c9e29" + }, + { + "path": "crates/oa-core/src/language_nesting_tests.rs", + "bytes": 20639, + "sha256": "bd061611e8cb6f28ab203c73e544ac98bf275eb464cd314ad5fbd25f773df33b" + }, + { + "path": "crates/oa-core/src/lib.rs", + "bytes": 549, + "sha256": "ea1d9bf5acba8381ba204db12ff5b5fe1f320417d17af517e46b90fd6bcb241c" + }, + { + "path": "crates/oa-core/src/migration_v2/README.md", + "bytes": 1515, + "sha256": "fb61d3faa33d7bdfba73415415a0882c0fbd3e0b45df42f972a19aec6da927b9" + }, + { + "path": "crates/oa-core/src/migration_v2/adapter.rs", + "bytes": 9490, + "sha256": "66741b4c8354a23b8a932ecc5bf1bc3bb6e74279558757b8c35bc2157a7e51b5" + }, + { + "path": "crates/oa-core/src/migration_v2/mod.rs", + "bytes": 1158, + "sha256": "857d8bb13b6814daba6780ca770c16352943c01cb130245d055f11b3b957b3e9" + }, + { + "path": "crates/oa-core/src/migration_v2/model.rs", + "bytes": 52059, + "sha256": "8ac63eb59b2e57bdecff2477ee0634096090924d3dd1851e1c454880a889dacb" + }, + { + "path": "crates/oa-core/src/migration_v2/references.rs", + "bytes": 13369, + "sha256": "33a6819abc83139fdaebeebd1b553238a328637106cce7dd5a535f1791d43e20" + }, + { + "path": "crates/oa-core/src/migration_v2/source.rs", + "bytes": 21946, + "sha256": "74fee9b24e7c912182c998ab9d9aeec125e2009c3214959229e844c67afe2bf6" + }, + { + "path": "crates/oa-core/src/migration_v2/state_validation.rs", + "bytes": 15769, + "sha256": "e29ef071bab0a68460ddf55c46131c6f66c022d52c3c602c37c013c3649da1b0" + }, + { + "path": "crates/oa-core/src/migration_v2/transitions.rs", + "bytes": 704, + "sha256": "f74174c532ba56b57c80b719a11fb4adea0a78ccc2828fff72fe2b9eda5a10b1" + }, + { + "path": "crates/oa-core/src/migration_v2/validation.rs", + "bytes": 98736, + "sha256": "6d5e4a4e2805ae5045bf789a0485e14a61c63346587bace2b4a91173a688f780" + }, + { + "path": "crates/oa-core/src/migration_v3/README.md", + "bytes": 2128, + "sha256": "3755a63f840d7f0eadf68afa7a9d587877a9468ff982d3610539e8a0bb067a82" + }, + { + "path": "crates/oa-core/src/migration_v3/mod.rs", + "bytes": 23023, + "sha256": "f4edb6a0b50ecfe8670973776d703047b064420cb1f05913129c00fc656b3722" + }, + { + "path": "crates/oa-core/src/migration_v4.rs", + "bytes": 4020, + "sha256": "50c652964f0f309e7f3f54b6ef12c40d42fcecc0490f005995c713df1179af70" + }, + { + "path": "crates/oa-core/src/model.rs", + "bytes": 66352, + "sha256": "4585c895c64c4a183941c92cf047a9e52ff0cbe41971e16e78d229ea9dc101fb" + }, + { + "path": "crates/oa-core/src/operations.rs", + "bytes": 11405, + "sha256": "a5ffbbf54cd440316a106d1188bfb699b57dae59f466edcb33618c333cd19f41" + }, + { + "path": "crates/oa-core/src/persistence.rs", + "bytes": 31774, + "sha256": "1c01474f906a63e552c0d590b272c95821c00a100b3e79e58e67dbbeac341a14" + }, + { + "path": "crates/oa-core/src/ports.rs", + "bytes": 45413, + "sha256": "5cac12eea70a54ebebbd6be77b63ce92e3195325c4bc7d27705c518686cbac80" + }, + { + "path": "crates/oa-core/src/projection.rs", + "bytes": 21374, + "sha256": "69ed12bace2cc5024e151752a174ab14034ac2d05eb741fcf13e9a27521c059b" + }, + { + "path": "crates/oa-core/src/projection/port_layout.rs", + "bytes": 13474, + "sha256": "a08d17d10a58bb8b206dd001b19b91d5aa3a9f743b298a4da57d503223c20079" + }, + { + "path": "crates/oa-core/src/projection/state.rs", + "bytes": 5233, + "sha256": "73a607bac713ec7ff49a509fefb1a53c7686dca93ee241ffc835564d743afb28" + }, + { + "path": "crates/oa-core/src/references.rs", + "bytes": 21957, + "sha256": "93553c234f32da35f1f41a7b83ad81c471c9803efa78ca222cf7de3c2f86c0bb" + }, + { + "path": "crates/oa-core/src/routing.rs", + "bytes": 50309, + "sha256": "c5ebb350ba76f731f5c48d968bfbba4b6ef68ec046eb5893d116c4637ef15080" + }, + { + "path": "crates/oa-core/src/semantic.rs", + "bytes": 540, + "sha256": "f9895dd5b8fb27d10d4cfbb41c3542ef2018365a589b8d5778e5674ae5a1f239" + }, + { + "path": "crates/oa-core/src/semantic/catalog.rs", + "bytes": 49407, + "sha256": "1ff74fcca18084d178681d7ff38ee1ccac632c27c4de0595ba1ceab8067ab3a4" + }, + { + "path": "crates/oa-core/src/semantic/historical.rs", + "bytes": 15271, + "sha256": "eaf3284bf234312698514cdb636bc8348e1b5d746cb16b18df777e77d312abfb" + }, + { + "path": "crates/oa-core/src/semantic/linked.rs", + "bytes": 6035, + "sha256": "6f335b14e809aecfc35defcaf77cb821b080d1506dbc46297912b25af98c07a2" + }, + { + "path": "crates/oa-core/src/semantic/mutate.rs", + "bytes": 22683, + "sha256": "dc2b4c4a6eb156fe468eaa8c85fd37a505c0cd8ea1f226cb69cd01689afd3d9d" + }, + { + "path": "crates/oa-core/src/semantic/review.rs", + "bytes": 51116, + "sha256": "0c157d2c327e72e89cca3b423e71ee73798105c5bb7271439c1a101642c91e3e" + }, + { + "path": "crates/oa-core/src/semantic/types.rs", + "bytes": 10405, + "sha256": "6922fe35089f12fad43ab0ce1c6886d01a3855f90b8e2543e99802ac5e6f1bbb" + }, + { + "path": "crates/oa-core/src/session.rs", + "bytes": 35237, + "sha256": "1eb77b329b2986fc6f5dc0171e77fd860375cdfd8c769a1367b445d6c49ebe00" + }, + { + "path": "crates/oa-core/src/source_files.rs", + "bytes": 74803, + "sha256": "669491dbddb8e8e6556161426dffa1a49ac1c826d31020bff0956d81a4d84683" + }, + { + "path": "crates/oa-core/src/source_project.rs", + "bytes": 61843, + "sha256": "1394370bcc5908873b830c2c11312e6e1611af41f46c4f43ca0a6bcb713bb466" + }, + { + "path": "crates/oa-core/src/source_project/source_migration.rs", + "bytes": 4700, + "sha256": "add463ae85c420f853d324b00a221f0f874164cc3f3ed6bbb07557a9ed7a8c95" + }, + { + "path": "crates/oa-core/src/source_project/source_structure.rs", + "bytes": 20225, + "sha256": "9f1f83315856a7025fe662c0fbb13452f31613224a03663150d6225d1ddc162f" + }, + { + "path": "crates/oa-core/src/state_validation.rs", + "bytes": 15665, + "sha256": "e28d7f74385e2a78763716b34491bd73a00bfeccc085970ceb130627e3faee18" + }, + { + "path": "crates/oa-core/src/topology_context.rs", + "bytes": 13734, + "sha256": "16de69b297de95d93c73808621607833b713af811dd082f0169186ae1e5c3e2d" + }, + { + "path": "crates/oa-core/src/topology_context/analysis.rs", + "bytes": 20036, + "sha256": "dead6194f0aa60cc46045c0e5ee10dbdbb689158c38634dfbbbc45d2ba88ac65" + }, + { + "path": "crates/oa-core/src/topology_context/analysis_tests.rs", + "bytes": 5258, + "sha256": "17839263410815e96fe027d4eba3aae0a9ab3b82b16947e2b29ebe0d09782b56" + }, + { + "path": "crates/oa-core/src/transitions.rs", + "bytes": 51998, + "sha256": "fadd1b07b89cae4117b91abb4f1ac9ea81ff818ef20f2175e76ee8cf21fb708d" + }, + { + "path": "crates/oa-core/src/transitions/communication.rs", + "bytes": 8634, + "sha256": "2b476630a88edd9021b9156ca12a5402e01604095f0d4002afb452671903a028" + }, + { + "path": "crates/oa-core/src/validation.rs", + "bytes": 112792, + "sha256": "7c1b4ae5e4ebba13e99af9158ccde138dfc5e9a7afb580e76fba72d0b64ba74e" + }, + { + "path": "crates/oa-core/src/validation/coverage.rs", + "bytes": 6478, + "sha256": "b08e4b344ecad055714168c83beff7fe29ba4edc53edbffa2eae04e5580a4d5f" + }, + { + "path": "crates/oa-core/src/view_options.rs", + "bytes": 24481, + "sha256": "421ede0a04c593ca1df0e6e0d06fabcfcc8113cdbcfb0adc7f5c8ef4d1724208" + }, + { + "path": "crates/oa-core/src/view_options_tests.rs", + "bytes": 21433, + "sha256": "64aac44de2df42a1012239a3dd75c473daf0c8990b3170b7bf7e78a556080208" + }, + { + "path": "crates/oa-core/tests/communication_boundary_scenarios.rs", + "bytes": 8816, + "sha256": "e1100b8f363910a487d90c73acc7df543dc6d532158c3c63ad11cd3d40d8e12b" + }, + { + "path": "crates/oa-core/tests/communication_means.rs", + "bytes": 18102, + "sha256": "a25f2749180bc6f4beb1445bfad3351eedf0669131a7439b633ab804439e95a4" + }, + { + "path": "crates/oa-core/tests/coverage_diagnostics.rs", + "bytes": 20527, + "sha256": "e2e9c3996daab47f2bd23f5d8c48b4e372af33331152f5fc85b76f06d04fcdf4" + }, + { + "path": "crates/oa-core/tests/fixtures/v2-coastal-rescue.arcadia", + "bytes": 29220, + "sha256": "f0df129c1914bfc01d0b047b0cd4b520d8cf0c249ea9ced085de400c0be87ff3" + }, + { + "path": "crates/oa-core/tests/fixtures/v2-coastal-rescue.json", + "bytes": 43990, + "sha256": "3ed53508eb544bbd788832f7bebea2ec31b3d66191f24f45098cc9750ec4c005" + }, + { + "path": "crates/oa-core/tests/fixtures/v3-data-contract.arcadia", + "bytes": 2450, + "sha256": "305f19d1b79f99f8d4cf627ba2e9ca6836bb7959cc0070227815937a699eafea" + }, + { + "path": "crates/oa-core/tests/fixtures/v3-data-contract.json", + "bytes": 8240, + "sha256": "1b41299c53204e6232397d25a58d5bccdbbc16e770c75e8edb55ce36ccfe58a2" + }, + { + "path": "crates/oa-core/tests/fixtures/v4-reviewed-prose.arcadia", + "bytes": 1222, + "sha256": "5fa53a26a5ad010c8e59eb56d9b2b52003569e66c0377ffb58840590168ad0c1" + }, + { + "path": "crates/oa-core/tests/fixtures/v4-reviewed-prose.json", + "bytes": 1734, + "sha256": "2808088afcc165f4bd6da5129151143411c997041c3de61d600ab76e05d24a47" + }, + { + "path": "crates/oa-core/tests/language.rs", + "bytes": 56482, + "sha256": "77f6cb2a69976bfb5f60b243b71c07fb0edc7505002c1e9e73fcd6ddf6d9496e" + }, + { + "path": "crates/oa-core/tests/port_anchors.rs", + "bytes": 26893, + "sha256": "efbc0fa18733b1aaac501f9785a4c392fc49c05c45a5778d26e9b5dd951ca6fa" + }, + { + "path": "crates/oa-core/tests/port_migration.rs", + "bytes": 15620, + "sha256": "1801c376a5435ac7efb2a8342348b2c7ffef930bba65deca4acb66b06e0483d7" + }, + { + "path": "crates/oa-core/tests/port_source.rs", + "bytes": 4858, + "sha256": "8d2ddaca4045d330f6eda2591561497b858aad53769a823249d0bea4f5916e12" + }, + { + "path": "crates/oa-core/tests/prepared_commands.rs", + "bytes": 9555, + "sha256": "52cab1c668064777412df0a6a3c20d74d579b33794b4b00525b9f151c06eac9b" + }, + { + "path": "crates/oa-core/tests/process_diagnostics.rs", + "bytes": 1104, + "sha256": "1dbbc590239ef7542be4a2bdc9543aaa64d108417b03dd312a0894e364745906" + }, + { + "path": "crates/oa-core/tests/r3_constructor_ack.rs", + "bytes": 24163, + "sha256": "e5c44676ea0aab97f2e091ddac2f4bc4a4a90f5877f7bbf08b61229600944dd0" + }, + { + "path": "crates/oa-core/tests/r3_migration.rs", + "bytes": 6590, + "sha256": "ebd04120f5215b3956fdc79ee78f6e38734c7d13392f1fc28aaba957912265bd" + }, + { + "path": "crates/oa-core/tests/r3_semantic.rs", + "bytes": 77473, + "sha256": "49c3763eaf2131070a7c46cc23a84f917d292d41610b6404510e5607f8890c32" + }, + { + "path": "crates/oa-core/tests/r3_source.rs", + "bytes": 15311, + "sha256": "f31f60659df3c7ef601650d1cff140589d8729f01a3f65a4a6a6c2272f15c408" + }, + { + "path": "crates/oa-core/tests/r6_data.rs", + "bytes": 41437, + "sha256": "5f7ffb3bc73c3c85423623fe56f8680646dc97040327bdbead9d47a37e80f155" + }, + { + "path": "crates/oa-core/tests/r6_migration.rs", + "bytes": 9174, + "sha256": "81519bc1512f5e069432e9a1cdad04c10216d492df01b4b75b02102480ebd6a1" + }, + { + "path": "crates/oa-core/tests/r6_source.rs", + "bytes": 9519, + "sha256": "88a0aa087a7678e2898ff6057538072ca92072190712f05fff08372cc56ebed6" + }, + { + "path": "crates/oa-core/tests/release1_teaching.rs", + "bytes": 10010, + "sha256": "be179290d871125dc97cfd2a3067c7ac89c8a538fdb0afafc5b825bcdfb2bef2" + }, + { + "path": "crates/oa-core/tests/release_capabilities.rs", + "bytes": 19422, + "sha256": "b92cba2a562e78287ddd7dc3e94557848d17faa0c8a102601b50286b9af48a30" + }, + { + "path": "crates/oa-core/tests/release_diagrams.rs", + "bytes": 7689, + "sha256": "cefcc0582d91266d5de6ee5daefcfe41b606ab971ab235b59034a8e1dbc24b7d" + }, + { + "path": "crates/oa-core/tests/release_language_limits.rs", + "bytes": 5204, + "sha256": "8578da4f76bbd2d0e1bfe295ab1259e2162a3fe3d0d2ba8901915d7a40942806" + }, + { + "path": "crates/oa-core/tests/release_ports.rs", + "bytes": 32740, + "sha256": "506e62beab0c7ec0cece83e9e0c1a810fa1f99285c9e1cab0c77f06de55a40e1" + }, + { + "path": "crates/oa-core/tests/release_routing.rs", + "bytes": 23165, + "sha256": "ae168faaba23769b7ca1fd65f217b9db671726e67276eb5a04e5e72b1447a462" + }, + { + "path": "crates/oa-core/tests/release_scenarios.rs", + "bytes": 41067, + "sha256": "0f5d876badeec653fc7b12610a77d867e9a53582e605253deff8d379da21572f" + }, + { + "path": "crates/oa-core/tests/release_states.rs", + "bytes": 26873, + "sha256": "b1a26acee95eaba7f9920f9da738a1e33606552eb078e6d298895daff7e3d811" + }, + { + "path": "crates/oa-core/tests/release_topology.rs", + "bytes": 17643, + "sha256": "c51dbe5aa5a038f9ed830daa02aa67714472179eb7fd6da5ce36dc6931c8b3a9" + }, + { + "path": "crates/oa-core/tests/review_regressions.rs", + "bytes": 21823, + "sha256": "f154e5c88d35e31512e2b07733a1327ea3e2fcfd1ef8eb23066a4e9573f387c1" + }, + { + "path": "crates/oa-core/tests/route_source.rs", + "bytes": 7270, + "sha256": "1a73fdbac0d0ae0e84d8d67b6ad398e11223958f5dca007f73757c91827decfb" + }, + { + "path": "crates/oa-core/tests/routing_geometry.rs", + "bytes": 31890, + "sha256": "2d8eea4a2bba535ed0ea6daabccdaf87b375828c404baa10518c7bd7fd6253d3" + }, + { + "path": "crates/oa-core/tests/routing_labels.rs", + "bytes": 5530, + "sha256": "dff884d799c3c5c9257210248c55767e294e3cb317c605cbd0ddc9600c216eb6" + }, + { + "path": "crates/oa-core/tests/semantic_artifact_absence_oracle.rs", + "bytes": 4640, + "sha256": "d93eaf9667f4221232168bef0fe9f069e5be1b1f23410bda5dd67010b96e5c8a" + }, + { + "path": "crates/oa-core/tests/semantic_attachments_gui_oracle.rs", + "bytes": 14957, + "sha256": "7f526d363ba05e7ac89faf0fead0796e419c34ee204edf44a1b46c78308b0970" + }, + { + "path": "crates/oa-core/tests/source6_view_contract.rs", + "bytes": 14307, + "sha256": "fa566de53946d40bbbd9033edfeed177180c4dc44afa2f2f4667ffdc622eb3bb" + }, + { + "path": "crates/oa-core/tests/source7_contract.rs", + "bytes": 43262, + "sha256": "cad4f1a135ddbd947bdf3c71d1b44f1e438725095ea8c4d893464bc721c2363f" + }, + { + "path": "crates/oa-core/tests/source_files.rs", + "bytes": 13168, + "sha256": "f0429a0b89a443458ea9af7083c1e4e7411417a7e6b47e618bfbb9266dc164f9" + }, + { + "path": "crates/oa-core/tests/source_identity_updates.rs", + "bytes": 5139, + "sha256": "f52aa38b4d317e532c641ad7463472e4b40e802e60052cf0017556ffc63da06c" + }, + { + "path": "crates/oa-core/tests/source_nested_updates.rs", + "bytes": 16892, + "sha256": "9ac3390936c0d250651ea94a1b8faf0adfb680f061ececc56f2a52909b5ba855" + }, + { + "path": "crates/oa-core/tests/source_project.rs", + "bytes": 45910, + "sha256": "cef58adb16aa4d2527ddc0628aec3e26f0b42b4be70014a7e360fafdac13a942" + }, + { + "path": "crates/oa-core/tests/state_diagrams.rs", + "bytes": 23973, + "sha256": "6b02b387a3ae559cb3ad72de24292a5abcb76aaac0adbab5d2aa5211b22cd2e5" + }, + { + "path": "crates/oa-core/tests/workflows.rs", + "bytes": 33426, + "sha256": "bd843dfddbd5724ec08f657571f887496203056fe2fa5864ef50a168a613b89b" + }, + { + "path": "crates/oa-desktop/Cargo.toml", + "bytes": 842, + "sha256": "f3547b2b924d5db6706c0a8e069014b440ff65315d82fc8aced0360af4b3cdc9" + }, + { + "path": "crates/oa-desktop/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-desktop/src/allocation_drag.rs", + "bytes": 29634, + "sha256": "6b93290627a8697dd529ecf12b6e99196a11783afff1ca7aaf75c6e2762f3d94" + }, + { + "path": "crates/oa-desktop/src/allocation_drag/tests.rs", + "bytes": 60311, + "sha256": "13b7d055a516c8a9f0bd13f03abe3b81423bde9d121c51778a129ff485f4f102" + }, + { + "path": "crates/oa-desktop/src/allocation_input.rs", + "bytes": 8391, + "sha256": "c7825c43383e81b7eb1b78bd902950c8a2206e0387d26002a80ddbe4dc2b6c73" + }, + { + "path": "crates/oa-desktop/src/app.rs", + "bytes": 220614, + "sha256": "99447bba4810135834663681447a03061a948db2661395b9b4c4924738a38f18" + }, + { + "path": "crates/oa-desktop/src/app/allocation_drag.rs", + "bytes": 24452, + "sha256": "218726dcd2e6809cb6f3660f575e586806360456e6b4fac61b9e361b411aeee9" + }, + { + "path": "crates/oa-desktop/src/app/allocation_drag_full_tree_tests.rs", + "bytes": 28288, + "sha256": "ff4c3d07f885f242b71160c09e2c457c4a746073fd89030781da306730c5db44" + }, + { + "path": "crates/oa-desktop/src/app/allocation_drag_tests.rs", + "bytes": 42677, + "sha256": "3c6908f8a677921245932252ab38806f16012becbbc082ac11e7871ff7bdeeb4" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring.rs", + "bytes": 27835, + "sha256": "37c7db33e99dd4adcc5a51f09ee4878af94fd32413359890a541690080885f65" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring/palette.rs", + "bytes": 8887, + "sha256": "8f9937cb30b48b83759fd084a8a5990a2daa3920280f1210abe048560241985a" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring/tests.rs", + "bytes": 14565, + "sha256": "174e184f1baf872c3be1cf70d9a7f4bc5569a9623000b3ab0e71e2b82e249cf5" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring_tests.rs", + "bytes": 18551, + "sha256": "ba913f7d7cbf586708d65c9f1db25b9b9ed7846f9d2e75a546b4ac69d8d19c6a" + }, + { + "path": "crates/oa-desktop/src/app/behavior_lifecycle_tests.rs", + "bytes": 13672, + "sha256": "f9a0b030faca5deaf3f55d9f5efcafdf1a7cb1a663001aa20a61baba4f92d080" + }, + { + "path": "crates/oa-desktop/src/app/behavior_removal_tests.rs", + "bytes": 23958, + "sha256": "ef09843a7daeb91afab0b76e83c5679351a1635a84a26d80a194dea744ea5874" + }, + { + "path": "crates/oa-desktop/src/app/checkpoints.rs", + "bytes": 29576, + "sha256": "55e5babdcabef767af3bc8be9cc3153b3f5cc0695701b890820ec0225643852e" + }, + { + "path": "crates/oa-desktop/src/app/diagram_focus_tests.rs", + "bytes": 6047, + "sha256": "65f3f841e1295ae4878b3ae2cf45ff64003d42e26e450e9a1de1c36dbd771bd8" + }, + { + "path": "crates/oa-desktop/src/app/diagram_removal.rs", + "bytes": 8778, + "sha256": "addb51604f41d680b06586bb362362ee3c2603a334f33022ce9abc281295ac85" + }, + { + "path": "crates/oa-desktop/src/app/diagram_removal_tests.rs", + "bytes": 47336, + "sha256": "70f9eb53d8995a23a53535b3941fc0c0b81a340f9fbbb371f0d705cfa775bd9e" + }, + { + "path": "crates/oa-desktop/src/app/diagram_selection_tests.rs", + "bytes": 5582, + "sha256": "4fa507adbc23db3a6eb202d809c695ec0ebd6181356930c4fa7528a9a0c7be57" + }, + { + "path": "crates/oa-desktop/src/app/hosted.rs", + "bytes": 25059, + "sha256": "2f7094c078e1d7cbccd6c0d310afa6c400a7e031f12918bbfce65ba62754e316" + }, + { + "path": "crates/oa-desktop/src/app/hosted/tests.rs", + "bytes": 30344, + "sha256": "fa118f64d04b400ccc01e4e67adaf3541975288882afa265a9e7f092cdbda232" + }, + { + "path": "crates/oa-desktop/src/app/process_canvas.rs", + "bytes": 31560, + "sha256": "7e05f4899a0b24df9ab355b6484e94997c7bc66c873342d975aed0b6a56acf04" + }, + { + "path": "crates/oa-desktop/src/app/reference_authoring.rs", + "bytes": 11250, + "sha256": "38e033e23e8135032f70117a376a5fe7bc68127c466559a35d7ec200932e3f77" + }, + { + "path": "crates/oa-desktop/src/app/reference_authoring/tests.rs", + "bytes": 20067, + "sha256": "b96ddc6bff7f8fde97720e18a92070f891c1340348d2e19c7c9c5a7bda650ce8" + }, + { + "path": "crates/oa-desktop/src/app/reference_authoring/tests/mounted.rs", + "bytes": 32805, + "sha256": "14a4914a1c86e50c395672dab8fe80d7af679a79c9082890b509fad7b7c543d9" + }, + { + "path": "crates/oa-desktop/src/app/repair_save_state_tests.rs", + "bytes": 10745, + "sha256": "5543dcba853bb1513acf824b860249729a6004747e7e320b46efe60ea19e2d83" + }, + { + "path": "crates/oa-desktop/src/app/review_navigation_tests.rs", + "bytes": 7049, + "sha256": "872fa91479dad5436e139ffcaece270323e9f5daeeb7a4d80c2c2534f48bc21b" + }, + { + "path": "crates/oa-desktop/src/app/save_as_tests.rs", + "bytes": 4113, + "sha256": "f8b915793f1a36fd152569c4781a4bdc17f4af404a8ceb373330053413087a1c" + }, + { + "path": "crates/oa-desktop/src/app/state_diagram.rs", + "bytes": 10050, + "sha256": "9ae3d533a20963a2bd1d485d357ac04319f336cd9f4c16305aa2a67d833573a8" + }, + { + "path": "crates/oa-desktop/src/app/state_diagram_tests.rs", + "bytes": 39957, + "sha256": "612e414b1a2cab12cbfd8fce23745559ff27577700694d53af67ad1f2883ee2c" + }, + { + "path": "crates/oa-desktop/src/app/transition_context_tests.rs", + "bytes": 11508, + "sha256": "47002fb025f3a2f8c53871f9509bfe8611a61db6fb0e1b3125eb6e875425cb1d" + }, + { + "path": "crates/oa-desktop/src/app/view_copy_tests.rs", + "bytes": 7846, + "sha256": "296821c51dcde568e7d717039aa26bfc1b56a9074aa16051007bb351b33a4d44" + }, + { + "path": "crates/oa-desktop/src/behavior.rs", + "bytes": 130007, + "sha256": "3089d88a8fa66ecaa2151f2f55a85c71de30e556457fcd52fdbd0ca1184b59d8" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace.rs", + "bytes": 7903, + "sha256": "b6e06b9d29f1a5677f99bebcb0e53a3795b4bcd957796a85fd800db4279aed03" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/control.rs", + "bytes": 7804, + "sha256": "2b8d97b8c0e3ff1b1a2c32187b1d0eb25edf39ba582b5fb3303bc880f674f7ba" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/focus.rs", + "bytes": 8901, + "sha256": "33447003980847033e40550f9926d8617fa61e2c3e73ec9c6121d1afed946c33" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/tests.rs", + "bytes": 27101, + "sha256": "b33361c6569354aa2df9b1ba1b60d68e4703800be80f815e0f0505064ea323c3" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/viewport.rs", + "bytes": 15164, + "sha256": "41ff9c50fa9fb89ab9fdb2d18dadc21585aafa1ee008cfcd1e0b731dce645eaf" + }, + { + "path": "crates/oa-desktop/src/behavior/contextual_source_tests.rs", + "bytes": 49518, + "sha256": "044bd412dc45ffe440b1e251993946942dc3759dcb2d5dfe71bd8d6ef61cbcc7" + }, + { + "path": "crates/oa-desktop/src/behavior/creation.rs", + "bytes": 28978, + "sha256": "33ae9aaf4ba90de9432870cc8e99708ef39e3638ae8283a9253c333785c91299" + }, + { + "path": "crates/oa-desktop/src/behavior/creation/app_tests.rs", + "bytes": 13181, + "sha256": "e9c5bf2b07357b7a2f679ae0d8f6904c1c1461aaeb94fa0db478b54d4641ae3e" + }, + { + "path": "crates/oa-desktop/src/behavior/creation/tests.rs", + "bytes": 22793, + "sha256": "a0d1daf9fb3920f7e6181a9802d84fbe056cbf0043b9e41dba5fdda687d9818a" + }, + { + "path": "crates/oa-desktop/src/behavior/form_session.rs", + "bytes": 3941, + "sha256": "f5027fb3a5a5599a182e7d1a10dba56dd66eb1f23a4ba4c4a1744c9a6a5b6e61" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario.rs", + "bytes": 154707, + "sha256": "ffac8821977488ecd1cd9084ad7c0c9fbf8de3d5031c5d4f5d033f0348d3e887" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/focus.rs", + "bytes": 9728, + "sha256": "73a9ea10ad7312086081b8688396a21ab4251c9faecc2df6d984b702f3963533" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/workspace.rs", + "bytes": 24960, + "sha256": "5aec4cb2ceb00ab25900d919a5bec71ab96848b4f14504f51790e3fe8801d3bc" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/workspace/tests.rs", + "bytes": 80542, + "sha256": "f2f6acd93ecf4e9ffee56abc1de28f71da8cb1353cdc3e67cf0c0cf7a619fec5" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_activation.rs", + "bytes": 14095, + "sha256": "77199dcb08ec8697f779d2560f6b716aed8d8f33965237a4934934954f4e805a" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_activation/tests.rs", + "bytes": 24665, + "sha256": "5b3f1d2144f405e492686731cc35d05f21b87ada60e426014e6b5f5e5f103298" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_lifecycle.rs", + "bytes": 9324, + "sha256": "758d244c2e8de61f515d540baa4d967275f49720e0253c6c9159eb9acd71c859" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_lifecycle/tests.rs", + "bytes": 15430, + "sha256": "01b576993b329810cd78a859b45ac52c66f5a14549065661dd1308196e0b724d" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_operation_tests.rs", + "bytes": 10087, + "sha256": "89fb71c690e07eac314f7a5e05862d5c1e2f9c21039673bf22c4ac894d21c977" + }, + { + "path": "crates/oa-desktop/src/behavior/source_draft.rs", + "bytes": 18031, + "sha256": "08190823090bd8b0305809099abadcc0de431175f7044f1d5abdceda52612ee1" + }, + { + "path": "crates/oa-desktop/src/behavior/state_canvas.rs", + "bytes": 96098, + "sha256": "5844d2abf4a3fe3bb07c707865ee3f8303d213b0fe1871765ac468c11e140da7" + }, + { + "path": "crates/oa-desktop/src/behavior/state_edit.rs", + "bytes": 35843, + "sha256": "4e67321ab0cf88e6200061873086841244c4d610ddd5f88d70c69ac0cc6bf270" + }, + { + "path": "crates/oa-desktop/src/behavior/state_menu.rs", + "bytes": 8530, + "sha256": "9d0a3c29516efa79553c559274848f12101330dbf93ffbbefab398cbc1906790" + }, + { + "path": "crates/oa-desktop/src/behavior/state_view.rs", + "bytes": 7637, + "sha256": "3d01c853663385fc1b760401bbebe3f691fcc289a779a8e63cd0733ff0c8007f" + }, + { + "path": "crates/oa-desktop/src/behavior/states.rs", + "bytes": 26986, + "sha256": "8986ed9492960e20f1254e9dfe3ff91d79ce9fef66f3bda738f9933278043954" + }, + { + "path": "crates/oa-desktop/src/behavior/topology.rs", + "bytes": 84224, + "sha256": "66c81c4d4f2613263f13ae90cea61895c1aeed1f6278880789ec56f8c42433e0" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/contextual.rs", + "bytes": 28432, + "sha256": "5d0ac5b3e258fc70987a00ede1e603681d99746596f2fcc46ad2b3667d65203a" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/contextual_routing.rs", + "bytes": 16731, + "sha256": "d914b0e82aa8d253fe64be2ef74443d1fd2e6cec26d1cf30620a57646e1d426c" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/direct.rs", + "bytes": 39059, + "sha256": "5cca649870f54abdd2eb098954bcc0a2a5ca456b7ee11b5f653edbdf2ed55905" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/direct_tests.rs", + "bytes": 51170, + "sha256": "edccfe3ce8b224065a3540aa53c6340f13db0cecd48ecc0a3904cd832a483964" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/layout_tests.rs", + "bytes": 37846, + "sha256": "f27203866e22aee80daad2811113341684b0cbd59885b36d64243c4317f29f84" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/view.rs", + "bytes": 22009, + "sha256": "29e29c2a0667baa429ae44dbb400e67c86f24f88959d5e7dd22894473bdd1f09" + }, + { + "path": "crates/oa-desktop/src/connection_edit.rs", + "bytes": 5301, + "sha256": "020581e077f82b43c936b623cc51733b02b88428df4e5f25df74b9705819fa37" + }, + { + "path": "crates/oa-desktop/src/connection_tool.rs", + "bytes": 27023, + "sha256": "649da93677d52dae495b0e19bc32f3122ab05a6d84de8402578ff5ce3f6ee1d3" + }, + { + "path": "crates/oa-desktop/src/context_menu.rs", + "bytes": 52955, + "sha256": "629354b34dc232763700251f2695b4d4e53d6251c0b1432ecc0dfe424f7dfeac" + }, + { + "path": "crates/oa-desktop/src/data_values.rs", + "bytes": 23877, + "sha256": "e1deb1cad551f0a9fdef9653aad257cfb36e6d9c0f93b6245061ec3fab8fd365" + }, + { + "path": "crates/oa-desktop/src/data_view.rs", + "bytes": 38871, + "sha256": "158b852be5d3db450aa5cda8b68a35bd96bddce1d8d053a7a23582095c06362d" + }, + { + "path": "crates/oa-desktop/src/diagram.rs", + "bytes": 111242, + "sha256": "e5260a39e19fc3df19bd16898ff1f0abd60ede7584f595c035b5e86a12ecef93" + }, + { + "path": "crates/oa-desktop/src/diagram/focus.rs", + "bytes": 9197, + "sha256": "b88a7c43123b08cf6228d8e32257f6ed7fe361f7278f427ec138e233e1ea6ccf" + }, + { + "path": "crates/oa-desktop/src/diagram/lifecycle_tests.rs", + "bytes": 9342, + "sha256": "03dd13106f3fdd06a26699bfdfba006fad086a0711cad2ba1aeb09a4e8f8656e" + }, + { + "path": "crates/oa-desktop/src/diagram/pointer_tests.rs", + "bytes": 11859, + "sha256": "ae68e091032fe2cf71559ff7e671b3b6d657ee8279330345f0c7a57edfa472ef" + }, + { + "path": "crates/oa-desktop/src/diagram/port_hit_tests.rs", + "bytes": 5650, + "sha256": "c3728f127711cb6d7f80a4670a798808b6e4239dd29c273445de81706ab6f39e" + }, + { + "path": "crates/oa-desktop/src/diagram/port_labels.rs", + "bytes": 13574, + "sha256": "6643f0cbde7a59d4772ae5284a488083e3b81f2fefabc43619d75738f474646f" + }, + { + "path": "crates/oa-desktop/src/diagram/view_options_tests.rs", + "bytes": 2815, + "sha256": "cf0c98a7715558baf17b59f67a80556f98ad30262b4434635e617c6601775433" + }, + { + "path": "crates/oa-desktop/src/diagram/work_drag.rs", + "bytes": 7059, + "sha256": "9757534a7ba47dc0df5d41c8d7366b1d90f3d50b24344580ff3c783667bf66f0" + }, + { + "path": "crates/oa-desktop/src/document.rs", + "bytes": 31807, + "sha256": "7c87280b5b8d112c34865253f8ba0f80d43bc9897771943b15dc7b5608eb17a4" + }, + { + "path": "crates/oa-desktop/src/document_save_as_tests.rs", + "bytes": 5781, + "sha256": "83dc243a25f4e97674ff0d86c794a490cc923e98f1f9fb05bb038f622f11e20b" + }, + { + "path": "crates/oa-desktop/src/explorer.rs", + "bytes": 14764, + "sha256": "fa01c59219564ba9ae5553abc2b6f94e9849f9148d5812ef99b40318fe5dcf9a" + }, + { + "path": "crates/oa-desktop/src/explorer_view.rs", + "bytes": 13773, + "sha256": "a720d7484bcc3a24729332a00e005d1cc6f5f945a9cc3965134e0024dffb581f" + }, + { + "path": "crates/oa-desktop/src/forms.rs", + "bytes": 105544, + "sha256": "ea124f479fcd2d3978ac3cb8eb81fec4a7aae5e4f4414c4bdd54849e954dedf9" + }, + { + "path": "crates/oa-desktop/src/forms/context_fields.rs", + "bytes": 10831, + "sha256": "eaacd474f6500dd344d5a8b63ccb1d1dd86fe2aea78ab708afa8a80d62ce69bf" + }, + { + "path": "crates/oa-desktop/src/forms/data_fields.rs", + "bytes": 49285, + "sha256": "a540a0d451bff56a96b1d28643b2e8c0649f3846350c25c5b154729c0538e77c" + }, + { + "path": "crates/oa-desktop/src/forms/history_fields.rs", + "bytes": 27414, + "sha256": "e7100474cde18bdfe95562bcb3c055f29b4b15aa64788a578194464aebcd046e" + }, + { + "path": "crates/oa-desktop/src/forms/history_fields/tests.rs", + "bytes": 33950, + "sha256": "16d3c308138c063f45986d53c621ad83c7dc2ce853edd31b7204e2939a382df9" + }, + { + "path": "crates/oa-desktop/src/forms/port_fields.rs", + "bytes": 30554, + "sha256": "3fe684d651d5be6203fd9db3979c772913e1af5ac1514e67be386ffd88dc8127" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser.rs", + "bytes": 12130, + "sha256": "b60af363be333af048859e51c28e8c989cb5c95d696cad16c8eec15f78d57a12" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/adapter.rs", + "bytes": 10447, + "sha256": "87ab4bc3bf27fd4b5a458791cf62c7ba8e44e9ebf846d8b851b8b6ffb454cd64" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/tests.rs", + "bytes": 27835, + "sha256": "8e98f8a3fcb814d4a201cc85b3db87a689fd3d2ce487f8a2fe312fc296f93377" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/trigger.rs", + "bytes": 13336, + "sha256": "34d0acecfe6bed193970aa473cc3313984971264b86d7b362a6b84c23d013c0a" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/trigger/focus.rs", + "bytes": 9923, + "sha256": "f1e79f4b03b2f9fd1cdc335054d4ae177dc9e759b6ea3d334b2bcca39b57191b" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/widget.rs", + "bytes": 33804, + "sha256": "d66cc17af7a48bb8598be683f084bb08fa7af7304f9636f0a1bea94c5cf6c727" + }, + { + "path": "crates/oa-desktop/src/forms/view_fields.rs", + "bytes": 24987, + "sha256": "5184d438f0dfd4e29f284ff048e19da73e71be1f24a6e9f123c7e922aecb85fa" + }, + { + "path": "crates/oa-desktop/src/guide.rs", + "bytes": 118110, + "sha256": "ab4b47050e6d57dccdcc264ee5752766bd5013fccdc35eeeb9c9037bb5eb9a67" + }, + { + "path": "crates/oa-desktop/src/highlight.rs", + "bytes": 2751, + "sha256": "da7c254fff7052e5fd9ec7469f473b91a819406028d7c304f6e22c4169561600" + }, + { + "path": "crates/oa-desktop/src/home.rs", + "bytes": 17587, + "sha256": "f03c1071334894f586a5a7c86026602a694db3c2faf902822e1dbe5156a859c2" + }, + { + "path": "crates/oa-desktop/src/home/tests.rs", + "bytes": 8167, + "sha256": "3b03ccfc97dfb75954e1e0ed568bb87a632295c07b96cedc05ed381f87b378f3" + }, + { + "path": "crates/oa-desktop/src/hosted/client.rs", + "bytes": 21912, + "sha256": "54b24b4b50f8d87d7c92946ea5a2cff4c98760e70555b3ce3d90be27115e95d4" + }, + { + "path": "crates/oa-desktop/src/hosted/client_tests.rs", + "bytes": 23009, + "sha256": "3ef70907ca75e098d631c41b90badd4cff1e1eb1b3c78e15a9f811c13ba8ffbe" + }, + { + "path": "crates/oa-desktop/src/hosted/mod.rs", + "bytes": 3744, + "sha256": "1b75e11c80fcb38fd20bb3487e3f88729fdac73e471c5ae64da28c249f77c63b" + }, + { + "path": "crates/oa-desktop/src/hosted/view.rs", + "bytes": 9281, + "sha256": "fc0c7b7ce3a5f05c49713df6661067751f81e810af11c614ca265ea9490e6463" + }, + { + "path": "crates/oa-desktop/src/main.rs", + "bytes": 1554, + "sha256": "5228743f361f9239e4584780bfa9b65d36207d0288624e1fb42b721146bcff1c" + }, + { + "path": "crates/oa-desktop/src/model_menu.rs", + "bytes": 36340, + "sha256": "d2f836661f43fa1bc8830b1e51cc736948b3d261796c3fa877df02ae15568c4b" + }, + { + "path": "crates/oa-desktop/src/navigation.rs", + "bytes": 8839, + "sha256": "71355a12e1b4791106426d83fe5ebf0b29bce8e1dc594f0655ab85695469669e" + }, + { + "path": "crates/oa-desktop/src/port_edit.rs", + "bytes": 7809, + "sha256": "70b99f577c4fdeda8780c8dc1ee7b1639fd77aaca06658f06d725139fb3efb6d" + }, + { + "path": "crates/oa-desktop/src/port_preview.rs", + "bytes": 35855, + "sha256": "069487c4ece737d52e8ae4a84dcfb132236aca6799e841c91c8e7244320cf871" + }, + { + "path": "crates/oa-desktop/src/port_workflow.rs", + "bytes": 40582, + "sha256": "ccc15f97c3272145a67bb5857b4faeaf7437561bd61912fa27ab26e8824146a0" + }, + { + "path": "crates/oa-desktop/src/recovery.rs", + "bytes": 21041, + "sha256": "57e22e5fbb0e994e64ae03e69450271fe9f04a951db1670c2a018abe99db4489" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/README.md", + "bytes": 1587, + "sha256": "a90002df1e087d2dac7be26926864243568a0de7c4103e4927435b34178e8016" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/profiles.json", + "bytes": 473, + "sha256": "2c12ae96b50e6da5d60ce2b7fa00204be71dfbe2fd51311fc337a0de6a4332ff" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source5-bundle.json", + "bytes": 80974, + "sha256": "12715995e6f7f35414aea53b3ad720b9b31873ffdeaf4444231db1a5ac3c463e" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source5-model.json", + "bytes": 86191, + "sha256": "5535a706df9ec21715e8b6a5aa6dbd79636ae461450aee61305559016167612b" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source6-bundle.json", + "bytes": 85286, + "sha256": "ea88890a33f47d67dfb06d6dbbcc179058cf28dad76ae7d615c00aaf30dbbbfe" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source6-model.json", + "bytes": 90629, + "sha256": "5bb8db0b6394276666323483f977ac3586f88554c81a148c6d508fca0ef4576f" + }, + { + "path": "crates/oa-desktop/src/recovery/source5.rs", + "bytes": 6956, + "sha256": "0f0a763f0c98c2c908d4c2b95d8a4c042b6a255ee1cc16260e5404669691f642" + }, + { + "path": "crates/oa-desktop/src/recovery/source5_tests.rs", + "bytes": 12146, + "sha256": "cfd17a742f1f27b523fce7cd9309f0a07a30413395f6c58659fb91d02834a7a3" + }, + { + "path": "crates/oa-desktop/src/recovery/source7_tests.rs", + "bytes": 18213, + "sha256": "7ee61de66c75bf949489ba51ddc9677e2b4efc68801cf27909c9b894bfdc9288" + }, + { + "path": "crates/oa-desktop/src/route_edit.rs", + "bytes": 2941, + "sha256": "457ae59c2761a43a8620b4d336a7cf0f54b965997110ecaf968756a88b6b0374" + }, + { + "path": "crates/oa-desktop/src/semantic_review.rs", + "bytes": 3432, + "sha256": "8dd1e93783d63a663c7e56c28775a5c389cfd7a6b562013d6a95c891afa21ed8" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts.rs", + "bytes": 24201, + "sha256": "a79236a8150597ff808597e59cf4f1e9e61c74c4901d9c8cf42d3427bb52a9a8" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_recovery_falsifier_tests.rs", + "bytes": 11034, + "sha256": "3f255d04e4bffa5a467b75e3cbf6f7149aa3269a02f2a89fbaa1db0e5df9ae62" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_tests.rs", + "bytes": 20798, + "sha256": "04d0dd2ac453705185663f705282aa4a3a31433466a5be305764248da1a03c32" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_view.rs", + "bytes": 6447, + "sha256": "2100ff73565765d8293c84f6ce2d8e566610c1524c50e32ce3c37dc33b6686e4" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments.rs", + "bytes": 18160, + "sha256": "de0ec0c740895b160ff5b847332c087c3f1a48931583464069470cc61315ed59" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments_tests.rs", + "bytes": 29389, + "sha256": "8b26be0324e0f33b1e7cf7af340350df8ed98963002d6da8589ee0e6f6900bea" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments_view.rs", + "bytes": 3032, + "sha256": "932f231554d77c7cb119d33bb06b9879db5e12127aed187e67013e77b6458e78" + }, + { + "path": "crates/oa-desktop/src/semantic_review/batch.rs", + "bytes": 34485, + "sha256": "a462eb627ae19348072775cf8e60b17d62f6b682b74cc413906d493fba1f0b3c" + }, + { + "path": "crates/oa-desktop/src/semantic_review/batch_tests.rs", + "bytes": 27546, + "sha256": "b67c4d7dcabac710cf3d30730a8db323180a558a415e2d117c868cdfa4804619" + }, + { + "path": "crates/oa-desktop/src/semantic_review/compose.rs", + "bytes": 27155, + "sha256": "c6adcc9882dde65e9f04f6eda7f0c855c5cbb285cf421123029169112793ce9b" + }, + { + "path": "crates/oa-desktop/src/semantic_review/compose_diagnostic_tests.rs", + "bytes": 9809, + "sha256": "440daf8d43278ef981c620d1818d0daaed8fb83193b8e8ff67b2e42fbf882938" + }, + { + "path": "crates/oa-desktop/src/semantic_review/constructor_tests.rs", + "bytes": 54132, + "sha256": "85149521ad7df62918f6f2fab6da2b3346c342ab4bce7100de3f6206c1e81096" + }, + { + "path": "crates/oa-desktop/src/semantic_review/constructors.rs", + "bytes": 12258, + "sha256": "0982163439b06a42d9af1643530364109282e63f05b323a35a76d8241f3caa32" + }, + { + "path": "crates/oa-desktop/src/semantic_review/history.rs", + "bytes": 3211, + "sha256": "df038c2464eab8093a983f3104f0d04ca8f602010a50e1d3eeb8e53f2309e201" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed.rs", + "bytes": 14175, + "sha256": "bdd6c0fdc7108056bc5d7433254503449eed2209813680e717ead24b9d0ce834" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_rows.rs", + "bytes": 13222, + "sha256": "4b7bf25806471ad22d89253b9af8000f5acff53b4cc0aa1c1a83138e7b270eca" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_rows_tests.rs", + "bytes": 30804, + "sha256": "1a3b09e7ed100411cdf8043f9a78defc664a873ee0201117709185c201a5c57f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_tests.rs", + "bytes": 31163, + "sha256": "9dc9b989e5a9d408427ca1baf86b2454f9dd3baf40a551c70ca2359dc18a1227" + }, + { + "path": "crates/oa-desktop/src/semantic_review/message_kind.rs", + "bytes": 789, + "sha256": "4ed19952ea511d1b3226564a138e3322f994371d6b49794c14bc3689d1393e7f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/message_kind_tests.rs", + "bytes": 23424, + "sha256": "5fcf9930e949aebeb12eab0327264f32a2388d62dbf098bd2365711e22623c52" + }, + { + "path": "crates/oa-desktop/src/semantic_review/ordered.rs", + "bytes": 9705, + "sha256": "6a1ed894d1b9d0110bc784a75c49444f1d14f1f74620d701f22203b2d8d0a813" + }, + { + "path": "crates/oa-desktop/src/semantic_review/ordered_tests.rs", + "bytes": 22383, + "sha256": "5c8ea3a69e3da3b94d13f50f12aa7dc53246ccba25ffcace9552a0eb76b0bf36" + }, + { + "path": "crates/oa-desktop/src/semantic_review/recovery.rs", + "bytes": 28769, + "sha256": "88e69044d90c481593bab7cc125f0401c05202fccdde07698cec9483947fe8be" + }, + { + "path": "crates/oa-desktop/src/semantic_review/row.rs", + "bytes": 38159, + "sha256": "b08fdc503c6c4d2ff99adac7e18c9baa861bf86155e00b55d1e492430980d0f2" + }, + { + "path": "crates/oa-desktop/src/semantic_review/scalar.rs", + "bytes": 15153, + "sha256": "9ad202174934dd9a63fbf9cba43135aead571db60846c8b7b1d3019a11df26c2" + }, + { + "path": "crates/oa-desktop/src/semantic_review/source7_tests.rs", + "bytes": 11665, + "sha256": "5e8221d77b068fa30c1571988448cb8829711735881d810f3d333cbc95d34a9f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/tests.rs", + "bytes": 32480, + "sha256": "077ec6501dfaab0b05ea3987943b204f08352952296d313555051d998ccd232e" + }, + { + "path": "crates/oa-desktop/src/semantic_review/view.rs", + "bytes": 57626, + "sha256": "7cc7dd213ab01dadad5debaee868c30a1099466602869a799ebdf9b680e8eaf0" + }, + { + "path": "crates/oa-desktop/src/semantic_review/view_reserved_artifact_tests.rs", + "bytes": 4737, + "sha256": "6c766b29c8664d15cb113d2cc71bba9b60ae4ccf7e44c9c5d3c41e1dc4b7ed90" + }, + { + "path": "crates/oa-desktop/src/source_navigation.rs", + "bytes": 3938, + "sha256": "c1da10882f35f8eb0675e68c642c9a209dde09679cded414cfb9903a4e49ec77" + }, + { + "path": "crates/oa-desktop/src/source_tree.rs", + "bytes": 21816, + "sha256": "4d55e0110a1eb128a5d26c28f3aae5853d79b7245812b7c82bd275f38440a5aa" + }, + { + "path": "crates/oa-desktop/src/source_workspace.rs", + "bytes": 15522, + "sha256": "30f63a6b8d65a38d66061f90d864b5746cbacc0fbd65abc028a8f3071c47d358" + }, + { + "path": "crates/oa-desktop/src/style.rs", + "bytes": 3015, + "sha256": "05d61bec16141612ccafa0988e8c4827f41754509efdb3b961eab69127ded896" + }, + { + "path": "crates/oa-desktop/src/tests.rs", + "bytes": 58557, + "sha256": "b017218195eea2c96aba12eba8a99a38945c8ca910a652e272d34883bdb98691" + }, + { + "path": "crates/oa-desktop/src/view_copy.rs", + "bytes": 9043, + "sha256": "5630f31c942e1226aafd67eabdace6a5c5494875bdc6f7f077019e8110ba41a9" + }, + { + "path": "crates/oa-desktop/src/views.rs", + "bytes": 50668, + "sha256": "9b53126d19b2ae34f170a1422c9f5ea5a833489274cbfa04546279058e289f9b" + }, + { + "path": "crates/oa-desktop/src/views/traceability.rs", + "bytes": 7501, + "sha256": "4c89dcf35c25e737d8cce4d543a5989ca104a5678e6cf40df47e457773d2ef94" + }, + { + "path": "crates/oa-desktop/src/workflow.rs", + "bytes": 82963, + "sha256": "d9e7b11a86fd3ec79d91f0c9bc9cebd5a2043cdaa7261622454fb7730ad8e060" + }, + { + "path": "crates/oa-desktop/src/workflow/communication.rs", + "bytes": 11084, + "sha256": "34d121ad97706012722e4bb6210072ecc3a5b4718b0ceab0c3d0f14d4cd780a1" + }, + { + "path": "crates/oa-desktop/src/workflow/recovery.rs", + "bytes": 9859, + "sha256": "0849b0f34dba5e8761be5fa05784d134ac74e4e9db395d6b9b7d6cff71e3f3dc" + }, + { + "path": "crates/oa-desktop/src/workflow/transition_tests.rs", + "bytes": 8553, + "sha256": "589b1b2dbadca74a52c2cfcfd4fe620bd4790abd113ac02182e91616c52d793c" + }, + { + "path": "crates/oa-server/Cargo.toml", + "bytes": 778, + "sha256": "527ff5e15010a8b560a6659aa1ae4bf0c8df0d9e019f03c47529ec6a750c0982" + }, + { + "path": "crates/oa-server/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-server/src/error.rs", + "bytes": 5610, + "sha256": "93817f1502386e4662c96ee1c7d1c4afc4e33bda6fd64e46c86c8e1afd5a9368" + }, + { + "path": "crates/oa-server/src/lib.rs", + "bytes": 7743, + "sha256": "20bef350350ed6339588b23af684abf745f97916c7edf3853ee042abe687e664" + }, + { + "path": "crates/oa-server/src/main.rs", + "bytes": 4163, + "sha256": "d59a6a2b5c7034bd2e00a516d2d49abb16391bf0316c1c357ddafb9c82d2d1e3" + }, + { + "path": "crates/oa-server/src/preparation_http_tests.rs", + "bytes": 5523, + "sha256": "454b90d0055d35644c8d990cd7576ddf675a9b271ca07fe9b0efce25d8ddbc07" + }, + { + "path": "crates/oa-server/src/routes.rs", + "bytes": 46053, + "sha256": "3f9a0c22043dbf28f7a8e587d2fc3abf869f76f4d23a46fe0aeb9c4392454a4b" + }, + { + "path": "crates/oa-server/src/store.rs", + "bytes": 25524, + "sha256": "37dcfb845b7993d5bced2bcf25fedfcd2a9c20a748f9315afe6cca1f41f89ae5" + }, + { + "path": "crates/oa-server/src/store_preparation_gate.rs", + "bytes": 4440, + "sha256": "427c390da3c0281ba1fe115a93ea90800e3b45fce6bcb9185e71982ddd885fec" + }, + { + "path": "crates/oa-server/tests/http.rs", + "bytes": 71892, + "sha256": "50daa6a90e96ad6fe3c6a27df2eaebe486270599c203892d09769c547a194975" + }, + { + "path": "crates/oa-server/tests/http/communication_limits.rs", + "bytes": 5790, + "sha256": "ba5474dd8e494a0176fffb4548c8e3deb2081b15de33bfce82394c764e0a2c16" + }, + { + "path": "crates/oa-server/tests/http/data_contracts.rs", + "bytes": 25949, + "sha256": "8cd456db83f301baca380acf025a5a99db4edf7d8839537dfbd02c4307e10e6b" + }, + { + "path": "crates/oa-server/tests/http/port_anchors.rs", + "bytes": 15086, + "sha256": "7199d0a208ddad9e1518b6e3fb390d64da111716d7505ba5c995deae19ad1258" + }, + { + "path": "crates/oa-server/tests/http/semantic_transitions.rs", + "bytes": 22832, + "sha256": "856d1c9b633ffb581e3e631f4e5a607789a02181dbf060667f208a569bfa4920" + }, + { + "path": "crates/oa-server/tests/http/source6_views.rs", + "bytes": 13023, + "sha256": "867bccda0e030eeeb9976b4ceeb47b21ab5044d700278022d5fb495bbb64ca07" + }, + { + "path": "crates/oa-server/tests/http/source7_contracts.rs", + "bytes": 11000, + "sha256": "0e0a467186da7263c0754890aff69ebd0d92d36b5224e4865bb6854b18dab7e8" + }, + { + "path": "crates/oa-server/tests/http/source_projects.rs", + "bytes": 30907, + "sha256": "8ff580f317ec267d1cd72ae14d8638f74a77cdf99ca4c78f66f4290c2d77460a" + }, + { + "path": "crates/oa-server/tests/semantic_http_contract.py", + "bytes": 7251, + "sha256": "4737ff94f10761f94151a694414c5c62737e0391ec820bca132830652bc4cca2" + }, + { + "path": "crates/oa-server/tests/semantic_schema.py", + "bytes": 25111, + "sha256": "cacca116c42ffbc097f1419c0f89921fa0dfd3faa864d46820ff744cfe6967f9" + }, + { + "path": "crates/oa-server/tests/state_representation.rs", + "bytes": 12241, + "sha256": "6686c826f28248ae4b63ec3f2112e193d4a347724b87974483217fcfee49cd61" + }, + { + "path": "docs/acceptance.md", + "bytes": 3463, + "sha256": "32ed3e4fed63f5c464e0937221f401d71623b276dd70f083531ac6ccebbf9050" + }, + { + "path": "docs/api.html", + "bytes": 72515, + "sha256": "a06126cb741da57e9c06e83fc4137ccde0de05562673546bc9d405878f51ea07" + }, + { + "path": "docs/api.rst", + "bytes": 41929, + "sha256": "ca7d310138c3b4d429d80a1d03d1ac8d4a9296069e205da573034256d10438a7" + }, + { + "path": "docs/architecture.md", + "bytes": 10974, + "sha256": "a50bd1645222ef3e574fa07a6ab9aa213431ee8833c6c0158ad91ce0f799543c" + }, + { + "path": "docs/language.html", + "bytes": 175111, + "sha256": "67dcfa3477b48a0b07298ec81741840cc3ccff12c7d58164873d746d41d611c8" + }, + { + "path": "docs/language.rst", + "bytes": 134663, + "sha256": "12229dd7d52fbaba80fe599d499f29b535f4c37c7be0585664d17edf0466ba33" + }, + { + "path": "docs/linux-packaging.md", + "bytes": 8671, + "sha256": "41a1bb1095801df37a1411341c5791d55ea8c365739314d599a60269ac4bc7a0" + }, + { + "path": "docs/openapi.json", + "bytes": 346920, + "sha256": "bc5825a3182a4df5f6710a80262f4a09b4c15f0e4cda7ca74e1746ceca81a89b" + }, + { + "path": "docs/research-v2-architecture.md", + "bytes": 40445, + "sha256": "1b3809f2dabe6b1805dbf3d3f2625c471cd21356c7bd603916466a8c4ced8090" + }, + { + "path": "docs/research-v2-semantics.md", + "bytes": 31535, + "sha256": "b7ec3677300248926a88b84da3e7ffe52f5b73524c7712c927a0e951569db04f" + }, + { + "path": "docs/research-v2-service.md", + "bytes": 36209, + "sha256": "4828df5bc679e7c71f49b4b85c9e7dacbec52f46d416fed48af70e08886d4e4e" + }, + { + "path": "docs/research-v2-ui.md", + "bytes": 3245, + "sha256": "894e721b59a8ca85f0d95b6706ed5f130a0372def460cf33aeefc9e5e38cde0a" + }, + { + "path": "docs/scope.md", + "bytes": 16690, + "sha256": "a1d0cfbfc06fc8bc2bf0f71343aacc8853cbbbfc00a1fc9852ddf41c8245ffca" + }, + { + "path": "docs/server.md", + "bytes": 23361, + "sha256": "4eb24937d424ba8b384e1734e02a6f8e963ae11d2715889c92b14b39ff2e4a48" + }, + { + "path": "docs/source-cli.md", + "bytes": 3374, + "sha256": "34f12b72cc6d6ead4f47c7818c1897db592f8ad493c70776db2ab48c24d8f051" + }, + { + "path": "docs/v2-interface.md", + "bytes": 11807, + "sha256": "c7fbaf0ebd3fc9f6c11f818db2b0b9d68a33f580cfced22bde83ce08ae790bc7" + }, + { + "path": "docs/validation.md", + "bytes": 6505, + "sha256": "f46ea950ed1a54409aa07c4f9e90f39f8e2d00c1dd1b6cb805caa3993845967f" + }, + { + "path": "docs/windows-packaging.md", + "bytes": 10406, + "sha256": "2c852ff7041713ffbff3c951ac98df647c51fb70b0feba9000f7bfd5bc2703a8" + }, + { + "path": "examples/coastal-rescue.arcadia", + "bytes": 33107, + "sha256": "7e183ef9fd8154d3074303f1956cd0d9871c19e3ffc630d333b0bffbd6e30e17" + }, + { + "path": "examples/coastal-rescue.json", + "bytes": 49715, + "sha256": "242f0b031229a87af5c4ebe5d651defe59c191a6b7a69dc0a77f7e203411f195" + }, + { + "path": "examples/legacy-v1-coastal-rescue.arcadia", + "bytes": 3449, + "sha256": "4dbbbdf8bc7e6cb8e0a81dd678069dae585a9e5187c59bc3665e1fdab3f1a86a" + }, + { + "path": "examples/legacy-v1-coastal-rescue.oa.json", + "bytes": 5976, + "sha256": "fd0e9dedfb7adb922dc0575cc2b820d40344d639f1d8052bd70363aa59de9c24" + }, + { + "path": "examples/release1/README.md", + "bytes": 11137, + "sha256": "113cfb1cf38a98b51bff60442d86a35d636a3d80ef206bece7d53d0aae67f2d5" + }, + { + "path": "examples/release1/evidence/repair-check.md", + "bytes": 1419, + "sha256": "f4db17bdca4ecbb1bf0caef01b2da5f1f7f798ab3152b648ce6dd8696a6a68e5" + }, + { + "path": "examples/release1/expected-diagnostics.json", + "bytes": 288, + "sha256": "3700393d76b940cfc076bf52861bd7b1f43370f8eabce3594531bd0bf1fc851e" + }, + { + "path": "examples/release1/model.json", + "bytes": 134520, + "sha256": "ef0ef4006c3e09d5db6e1b621256b3f7d6642f3a7b09cc34607cfbcca830c727" + }, + { + "path": "examples/release1/model.rs", + "bytes": 28762, + "sha256": "15f30f6bde655808fe754665c26d560e36f2a9bad340f346b09137d0d05045f5" + }, + { + "path": "examples/release1/oa/activities/activity_oa_restore_work.arcadia", + "bytes": 1307, + "sha256": "83e73d0a013d5c3e1a4af0d9139ab0cfa362d25a846671fc2dac59181061a9d4" + }, + { + "path": "examples/release1/oa/behavior/process_oa_assessment_procedure.arcadia", + "bytes": 697, + "sha256": "172c32c044ef4b5bc58a1f4635cc81f48dabb4014479b47dce7b25fedf2dbd0d" + }, + { + "path": "examples/release1/oa/behavior/process_oa_field_procedure.arcadia", + "bytes": 1781, + "sha256": "d2552dc5383e2e91cb302a790364e197f663c2edc013a2ab1978789825c9c324" + }, + { + "path": "examples/release1/oa/behavior/process_oa_response.arcadia", + "bytes": 3225, + "sha256": "cf86f46fa5c5d70592ef43f1bc1cb4d968efd8add384ba88036bef6b88aa4abc" + }, + { + "path": "examples/release1/oa/behavior/scenario_oa_conversation.arcadia", + "bytes": 1795, + "sha256": "b25be524e98a35ebac5e4481b7609c027b32baf9605e8097f807560f94a77ca6" + }, + { + "path": "examples/release1/oa/behavior/scenario_oa_full_scenario.arcadia", + "bytes": 1261, + "sha256": "00a1edf2c9707a0eb62ac070c2d02467874f2c9c1f273cc6ddb53d6d65999a1c" + }, + { + "path": "examples/release1/oa/behavior/state_machine_oa_monitor.arcadia", + "bytes": 2022, + "sha256": "447c9ad1359f4a31ecf975ad07c0b08d8e7e03191fb0858e2fc56f377b223cd5" + }, + { + "path": "examples/release1/oa/capabilities.arcadia", + "bytes": 781, + "sha256": "fc8012e5554350b12e1cb80080f8feab80d933c9b33c0f2a7bb500cb7d609936" + }, + { + "path": "examples/release1/oa/model.arcadia", + "bytes": 661, + "sha256": "f7cf914766ea73ec53b85e32d117ea9a9dba52d3e038246863541ae7069b1a15" + }, + { + "path": "examples/release1/oa/participants.arcadia", + "bytes": 1834, + "sha256": "951764c14179f27c10e315acf2ea37d1fff54c77b8441e23addd239e8c715ce3" + }, + { + "path": "examples/release1/oa/types.arcadia", + "bytes": 788, + "sha256": "9d0396fb82dd5733edd8d1cf52f968ca84906927c704f9cf0944a7fae215cf49" + }, + { + "path": "examples/release1/project.arcadia", + "bytes": 1958, + "sha256": "b2674e6bf77cfe0f6f0ba79c81d2e96d92f39c02ca2c6266d80e91723bfb9fda" + }, + { + "path": "examples/release1/sa/behavior/process_sa_assessment_procedure.arcadia", + "bytes": 706, + "sha256": "73928ced61c06cbc08728d7956676a50fd4c05aa5b7f1ff4f29ce27a0b0f2088" + }, + { + "path": "examples/release1/sa/behavior/process_sa_field_procedure.arcadia", + "bytes": 1790, + "sha256": "886d462af83110cbfa55dd232a667ea1446761234471357cbb878794e98e8768" + }, + { + "path": "examples/release1/sa/behavior/process_sa_response.arcadia", + "bytes": 3234, + "sha256": "041785fc22842423822431bd5e6e8d16094ebd0716965e7c765fb8c1d7549e8a" + }, + { + "path": "examples/release1/sa/behavior/scenario_sa_conversation.arcadia", + "bytes": 2127, + "sha256": "97276f5757ee9aa12a0dbd9d3ccd58174b3091162bb8bcce357cec20a45f5d85" + }, + { + "path": "examples/release1/sa/behavior/scenario_sa_full_scenario.arcadia", + "bytes": 1256, + "sha256": "e12fc406b99d60a2f7768aaa0b25ba560e8605f0b8e37f3a7cdd3b8443562b74" + }, + { + "path": "examples/release1/sa/behavior/state_machine_sa_monitor.arcadia", + "bytes": 2022, + "sha256": "05ce29af99424c491c47fe2450dc6f5f8ce995511c01ec7e17bb5855be3c9736" + }, + { + "path": "examples/release1/sa/capabilities.arcadia", + "bytes": 781, + "sha256": "b6912fb3ece439912345fa71724acd462e716a1e5a88203a1058a5c3b2c20a4f" + }, + { + "path": "examples/release1/sa/functions/function_sa_audit_thresholds.arcadia", + "bytes": 297, + "sha256": "e5a04325d52183956dca814dd90f4e56c96c6b7db0f4f202f203ecb49c3e0f4f" + }, + { + "path": "examples/release1/sa/functions/function_sa_restore_work.arcadia", + "bytes": 2576, + "sha256": "fddeb67308051325041fee641fe758ddf43345b7c47b66d433616ad07fdccdd6" + }, + { + "path": "examples/release1/sa/model.arcadia", + "bytes": 661, + "sha256": "d431509251acb859fbb98733b6d18add952495e10a78703fbe8f31e40bc083c4" + }, + { + "path": "examples/release1/sa/participants.arcadia", + "bytes": 4012, + "sha256": "780d2eb08b217b67b55febb3d34846f727b8ee9018df6c5741748647e36b2ff8" + }, + { + "path": "examples/release1/sa/types.arcadia", + "bytes": 1227, + "sha256": "101fc0fbd99f1101514aa7b6da4f8e535aae0bb94c9e2b9e7e6c151135b28660" + }, + { + "path": "examples/release1/traceability.arcadia", + "bytes": 29506, + "sha256": "48a96f543456c9b5a5798fc795594e4119147fe45f11a6f109f141b7f514560f" + }, + { + "path": "examples/release1/transition-before.json", + "bytes": 35801, + "sha256": "2253e6434f741687e22327c37d520ed15c043bc36025498650bc2366bb6a874d" + }, + { + "path": "examples/release1/transition-request.json", + "bytes": 4276, + "sha256": "43b9a22e5f95ad3bc0ebd2478ead0e14406854abc989ae94ded9367b013d812a" + }, + { + "path": "examples/release1/views/diagram_oa_allocation_view.arcadia", + "bytes": 2176, + "sha256": "dfc0eb61e0e2aa5bda45524571fbfa3494f44ce19696f3e15e07438074a07bc7" + }, + { + "path": "examples/release1/views/diagram_sa_allocation_view.arcadia", + "bytes": 2173, + "sha256": "b78b43a26a82efb8fbd5374b09c329fa341f57b29f635d397b9ef8aede71d389" + }, + { + "path": "examples/release1/views/diagram_sa_capability_view.arcadia", + "bytes": 1620, + "sha256": "75e8dc9fb30f25d6f8fd3c6b595593ab4f98958a25798f961e336e0fac557649" + }, + { + "path": "examples/release1/views/diagram_sa_service_view.arcadia", + "bytes": 2209, + "sha256": "b08c84f3ea633e7c78dfdad3272f75415f6256cf3614b6d99bfd4f0269076c9b" + }, + { + "path": "examples/release1/views/diagram_sa_state_view.arcadia", + "bytes": 1931, + "sha256": "5f42f4c605e57b817d8400ed21f2b14bfc4e1592aebe941ff113767504c2b869" + }, + { + "path": "examples/routing-workshop.arcadia", + "bytes": 66431, + "sha256": "dc6b75da72884d399132ed9e300fa5a26b73d802bb526c9af986ae9eeb0a646a" + }, + { + "path": "examples/routing-workshop.json", + "bytes": 100281, + "sha256": "8592714f75b271133f21ce017d87896b6cf91ea0e4837f1c2ed453e21be26b14" + }, + { + "path": "examples/source-project/oa.arcadia", + "bytes": 2142, + "sha256": "5f60642f211b2d352a951092faeeb7503d4fb7f6f7fca99e810347231101d31c" + }, + { + "path": "examples/source-project/project.arcadia", + "bytes": 606, + "sha256": "787f6b67b179ffd221f7e5faf1a4edd74cfd116aa1e3b5e9ed9f22fbff612d8d" + }, + { + "path": "examples/source-project/sa/assurance.arcadia", + "bytes": 682, + "sha256": "ab76044836e4dcd42a82d316846ec87da2108939aa2037640c5bca1d2ecdee0f" + }, + { + "path": "examples/source-project/sa/participants.arcadia", + "bytes": 1231, + "sha256": "1abad579812e77877b45a3d8e3c3e9da734be2d04a0254cc730a5257ebd2dc88" + }, + { + "path": "examples/source-project/sa/reporting.arcadia", + "bytes": 2839, + "sha256": "f0b7443f728912ca163de39b6055876b533a77feaa3219b2d40a2dd65712e058" + }, + { + "path": "examples/source-project/views.arcadia", + "bytes": 3508, + "sha256": "e29ad3f406a6a50d2f0ae2ca2a53ee3b0c18222cd4098704a46d4f48b64ea17f" + }, + { + "path": "examples/text-first/README.md", + "bytes": 1367, + "sha256": "4ec8250d5ed556f1d496e8c85137e973e802ecb11df1a36488411e8cdc5a9f9e" + }, + { + "path": "examples/text-first/project.arcadia", + "bytes": 480, + "sha256": "f441535c623e0cf20e1875eb2cd33b587ed00e078c37af39cb36d89bb5edc19a" + }, + { + "path": "harness/fixtures/basic-editing/README.md", + "bytes": 12012, + "sha256": "3545d9695e7c62e0caa818efd7f4dc426f04876a3626e0f3b1bad606b258cb26" + }, + { + "path": "harness/fixtures/basic-editing/base/expected-baseline.json", + "bytes": 4524, + "sha256": "f239e728d650b0af32bb8f3dcaf6b27c99b9c5041132ac14e51756ea6563d978" + }, + { + "path": "harness/fixtures/basic-editing/base/project.arcadia", + "bytes": 3077, + "sha256": "045cb047d7bfbca72c3fb30db4c81a30ad463d3af7fc51604906ad7fa75a1ff8" + }, + { + "path": "harness/fixtures/basic-editing/base/rationale.arcadia", + "bytes": 57, + "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f" + }, + { + "path": "harness/fixtures/basic-editing/manifest.json", + "bytes": 447, + "sha256": "d23c21b02064ddb85e051e10e16ff089daba8d9910bb1a695dfabe2db3757734" + }, + { + "path": "harness/fixtures/behavior-creation/README.md", + "bytes": 5954, + "sha256": "9e5fc751424d12cfe76a84abb1da45b2d38947409179451bb90ffe7e7ddc8723" + }, + { + "path": "harness/fixtures/interface-operation-probe/README.md", + "bytes": 2604, + "sha256": "088f0bdb3375deb8f2c7e3b749ca8d210ea828ca4dece69b3871b674e3110175" + }, + { + "path": "harness/fixtures/interface-operation-probe/hashes.json", + "bytes": 977, + "sha256": "f6d3e8aa42f40f64ce2ecba7b9cf112eb9091f3cccde3a592b0434e834cf2a6a" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/after-reset-deletion.arcadia", + "bytes": 4218, + "sha256": "c0fe9570684c0061efc4cad65e339fede6961b04ca90c6f324c787bd65e61226" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/after-reset-deletion.json", + "bytes": 7835, + "sha256": "93187f7a1b476a44185725c6b15f2e1767482b6911ab1280144348d033eb51f0" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/boundary-only.arcadia", + "bytes": 4771, + "sha256": "02f85e39957ebe6d56336fa729a5c8b10f51865face9d3b2c9679200571fcfc7" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/boundary-only.json", + "bytes": 8840, + "sha256": "756f9710336e6734ce3592ca774c6f104bba5a37c9e165540eb39326682393d1" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/explicit-functional-refinement.arcadia", + "bytes": 8635, + "sha256": "ac5b629ba5596464f9f8a975b8bc2764e3007ceb7342de3f828d4b18e4f069b7" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/explicit-functional-refinement.json", + "bytes": 16160, + "sha256": "78a47c978dc667aa1c45af711f06aa2a0d3c581003013e30c3e02fb0faae2e64" + }, + { + "path": "harness/fixtures/interface-operation-probe/probe.rs", + "bytes": 11274, + "sha256": "72b1b443e25eb20420dec4477b0fb5ef5d1c705e3882c81df88dd578ab96a426" + }, + { + "path": "harness/fixtures/release1-native/README.md", + "bytes": 2564, + "sha256": "5f5ba040fd2df9261a29bcab3f9a7ae27c3683265411ad3dda0b467d5df8590e" + }, + { + "path": "harness/fixtures/release1-native/artifacts/README.md", + "bytes": 4155, + "sha256": "24200c84ccc2ef3e17c029744074e5cea785188f5549ac54e44cf89682643f81" + }, + { + "path": "harness/fixtures/release1-native/artifacts/generate-semantic-artifacts.rs", + "bytes": 9275, + "sha256": "444f360b78df52c5e42046f77b148781e0c9bddc2a09c0b7bd65c7a4f376cfe6" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.after.arcadia", + "bytes": 7768, + "sha256": "84b22e95c213018612e6e8a84cad68b35a8b495ff3515b0f978c5e7a3d196d79" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.after.json", + "bytes": 7330, + "sha256": "13a6f99ec2df1dd35ee8b2613f183918cd9537eda4a5da085ad52e65c033db59" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.arcadia", + "bytes": 1446, + "sha256": "1e0d662ba33071b122ad9206d2d559a8e748c9431eb3ac1b759bde3760ca877c" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.json", + "bytes": 2216, + "sha256": "fa6a2e3643c0f909b92407abec3edc897033162eeaa501f8d4616f79d41fa044" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.manifest.json", + "bytes": 567, + "sha256": "65cb70b0d697a055363ba01bf30bed7e412d43c9978a033549c378d117719ae7" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.request.json", + "bytes": 3991, + "sha256": "ed905267263e7f8a0cd2dbe833196b30118b6a246815216932fae661ad650699" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.after.arcadia", + "bytes": 6837, + "sha256": "e50fc462ec22dbf98011929931dd2489430001c3e6433608685b9d88bceb9acb" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.after.json", + "bytes": 6433, + "sha256": "f27a7b38d59c7cefe58cb36783d3d4dd8d8ae1168d9aed1eb61d343c18758908" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.arcadia", + "bytes": 1807, + "sha256": "eba2aec39e6efb405eace4bc8ab0c5563907c26d449e71a4aa750df9f73233b4" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.json", + "bytes": 2673, + "sha256": "2ef777f19b94f08b5e5ca2ef727777897e1018f1426eee291408b3c69101f596" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.manifest.json", + "bytes": 519, + "sha256": "3af7232ed3056ca84dcaf0f266ead3faaa512a0dc0051c7ba68791c20dbae0cf" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.request.json", + "bytes": 1246, + "sha256": "8af21b00b62e620256fbf50e47c6c5836cdb6922d9549cc4b3d86bc03b008073" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.after.arcadia", + "bytes": 4200, + "sha256": "20bb30473830e44228958e78fb7480269cdcc0580c6c90c718da75f34ca5a43f" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.after.json", + "bytes": 4552, + "sha256": "44f4b05db49758dcf344788f57cecc0250fd029099b1c54e4e1e3e972f6cf039" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.arcadia", + "bytes": 1808, + "sha256": "b0fd031671c9f755756922ec5c40a0ce3f40164d22c3c389aec9fd0705344da7" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.json", + "bytes": 2673, + "sha256": "1acf81e08c51c85aceb14a3efbc39ec680552a19c7824aab4611ac3cf71b9c6d" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.manifest.json", + "bytes": 610, + "sha256": "a07978f4b0a3ca83e5ae5f35e7b66b26473b24431fc90e5889d755f1816d52dd" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.request.json", + "bytes": 2352, + "sha256": "5ff844a038b0030adb5a83d13d81e60f30627543388f6199b6a0e026fc42ea58" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-native.md", + "bytes": 4075, + "sha256": "a51ffbc45b6c172cbfed3b16c249296e6a28d457fea57393dd958cdcfbafbca1" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts.hashes.json", + "bytes": 2367, + "sha256": "3ad8b7428b3ed7585a91e7f5d9d5f4880caccfd0b08dca25d05af523e62e0a10" + }, + { + "path": "harness/fixtures/release1-native/communication-means/README.md", + "bytes": 15091, + "sha256": "015c16010c212af283f9def118c6d263ba65a3bc6e81a750f180624ca69bb311" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/entry.arcadia", + "bytes": 6098, + "sha256": "a6976e7c21031e7cc3cb731e20c3075cf89cf85144dc8d3f52930f8521ea196f" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/expected.json", + "bytes": 10480, + "sha256": "60c4419415c546f06c9972ac7bb0e530ada7b30a200b59e75ddda231a24f9a3d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/traceability.arcadia", + "bytes": 407, + "sha256": "3c41459f2b0706a767988738bf8126f76540415bb5940d9c5db19cbe8c18182d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.request.json", + "bytes": 1331, + "sha256": "b16e673b29c96b5aed681389ff7669110abe552939e86dd0ec6011c9a45ed860" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-draw.arcadia", + "bytes": 5239, + "sha256": "a511a4d817d9c5c80233bce83e84a7056b7dce7afd9fcc25696e333f8f4df055" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-draw.json", + "bytes": 8424, + "sha256": "7140114926228b1c378c450535f7a70992c71a879a8d2270c49e8d5f04a2f484" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/entry.arcadia", + "bytes": 5710, + "sha256": "910e6dfe609467047ce629ec9c626f4e927cada74bfbfa164414a8fe6783ea87" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/expected.json", + "bytes": 9868, + "sha256": "567259e20c9f6278776e8fa99b8b2fdbbc9a883ad875c5d39dae1b53de3a2924" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/traceability.arcadia", + "bytes": 407, + "sha256": "997f72fe9258012df66e88344cf39c1a2cebf2327f604056b67f7f2a8ebcfbfa" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.request.json", + "bytes": 1127, + "sha256": "cb3fe05859cfffec6f8846c19983dc462413bc0ea4f6e19204f09c259919c4b1" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/cm-reverse-scenario.arcadia", + "bytes": 8209, + "sha256": "ec826b9b84616507490ac30e4d57100dd6338dba2f7071e879a8fb58820a85c5" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/expected.json", + "bytes": 19735, + "sha256": "ef07e4d2d3fc36004ff01739838281581d9a703c747611eacc01bb9cc672489f" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/oa/behavior/scenario_oa_cm_200.arcadia", + "bytes": 1488, + "sha256": "0ec8d7e38f5a5cd56ccf3979757b3a9f412ad0ae36ee6c2690b7872129046d70" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/request.json", + "bytes": 1090, + "sha256": "c0ac99ee186d126fe3ec57f2c0a4072984d39d36ad21ead357ab66a08ac0065c" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/traceability.arcadia", + "bytes": 2068, + "sha256": "dd5d356390089e4ec474374956f6219502733987e60ef8ff32920d8b33dce858" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/entry.arcadia", + "bytes": 9827, + "sha256": "86dd8a355f6c9dadfea56d06e5247c9b0f820819d7df17ef5690671c7c81324b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/expected.json", + "bytes": 21877, + "sha256": "980489ec2c483d4f9efada61358c1f29bafb2572fd5b804c656b91b8e9bb4f9a" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/oa/behavior/scenario_oa_cm_200.arcadia", + "bytes": 1488, + "sha256": "0ec8d7e38f5a5cd56ccf3979757b3a9f412ad0ae36ee6c2690b7872129046d70" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/traceability.arcadia", + "bytes": 2068, + "sha256": "dd5d356390089e4ec474374956f6219502733987e60ef8ff32920d8b33dce858" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.arcadia", + "bytes": 7698, + "sha256": "1abc4c4cac37cfb06ed3b12a115f9e7e6a2d3affd34b25c355309e5ee465fa40" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.json", + "bytes": 13130, + "sha256": "a5cf4cb2ef390113dd752f4054d43fb789da2ca77799efb5782805ae8aa2dfd5" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.request.json", + "bytes": 1090, + "sha256": "c0ac99ee186d126fe3ec57f2c0a4072984d39d36ad21ead357ab66a08ac0065c" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-transition-ready.arcadia", + "bytes": 5454, + "sha256": "b761c4c2af5f7064aaf1f887ffd6094eb6ae834b2c8057ecdbc4aa97c042066b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-transition-ready.json", + "bytes": 8852, + "sha256": "2536b000de361fb131787e32b466b9123d4e98abf00c099ad32f6cb8e7fb530b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/generate-communication-means.rs", + "bytes": 28035, + "sha256": "003521404b702332082e01f2be7676fda1dd7b5bcf220bb81d25120c8984c75d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/hashes.json", + "bytes": 3133, + "sha256": "39b4dc02fc8b074015c59354fd1c1061c25832fde25065c7151f36eb0455e6f6" + }, + { + "path": "harness/fixtures/release1-native/communication-means/manifest.json", + "bytes": 1237, + "sha256": "fb921f42f2c4a4f8a67d1266f17f8c7750b6a2619554b713aa92b17918f0c43e" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40-oracle.json", + "bytes": 26264, + "sha256": "74edca148583f42c269e51f135662f65ef1c9ea1c94516d63e2a5091967dc99b" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40.arcadia", + "bytes": 28947, + "sha256": "00b87736b82c5afd33b311df7aebe9a6c8c51b6de66221181b5ea8bc8ca221a3" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40.json", + "bytes": 54938, + "sha256": "5dd4f22453330cab3abc059881660190e689a22619853f77cf6d0b52735d97ad" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments-native.md", + "bytes": 2624, + "sha256": "28906924b05f75bbf432389517aef65f1df474d2f2bff79a3586564f7f7328ef" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.after.arcadia", + "bytes": 6795, + "sha256": "9d084dd75a0251d349cc31f9ee98df58d0bc76859dc3cb1503f242e2f759888a" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.after.json", + "bytes": 9618, + "sha256": "f09be41afd85c18fd52fdf997e9b81c4b7cb2c41e78d167abcd14caea8110333" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.arcadia", + "bytes": 4990, + "sha256": "8740f27be99624013d9be876639c0411e1b8c14f0f9a843f43dc71d769efd79a" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.hashes.json", + "bytes": 963, + "sha256": "00fc9e2c709bdcd9ee98012176cb0edb635c112153d963cd169bf4bf69a9e010" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.json", + "bytes": 8146, + "sha256": "9c188f2890630c7feec2be719a7104af9690da7ea836df18fa78da3ff2acfc1b" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.manifest.json", + "bytes": 1045, + "sha256": "46b40f221ffad614733b615208814ace63947e96b80bbfdec63853ccd4f4e8c8" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.request.json", + "bytes": 3075, + "sha256": "b57f656f0b9cf2c595e83150c683301909e20f15684d35d108d3c57ee0dc5909" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch-native.md", + "bytes": 2637, + "sha256": "dddca2b85f892b05881c75ef3cd62437396cc086a09909b621e02bad0cbe56ff" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.after.arcadia", + "bytes": 3134, + "sha256": "d3315bba762395205ae761e6e64029e8b4070c15a1299c6114075581db7b0974" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.after.json", + "bytes": 3927, + "sha256": "8f36119c7e893a4af374b13b85b1c2cb3df0196df8d06a551386628fc8b8646d" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.arcadia", + "bytes": 1787, + "sha256": "5e1f433e04621424edac43e53411624059e873f88dd531bfdb39093953485ed7" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.hashes.json", + "bytes": 933, + "sha256": "1bd87700b04e4f169ab5f8aceaa3b0c3ec3a1cc43e1bce135a1cee506fc75d38" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.json", + "bytes": 2816, + "sha256": "1972242d2a8677d004dc3af1081feb292de65fe26128d877dded8661f9906619" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.manifest.json", + "bytes": 647, + "sha256": "1e440efa02e2ccc27585d9a49c7864d53e3e3e7645ccb219f040e00d95331b8e" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.request.json", + "bytes": 2197, + "sha256": "71f23474614aab90398ce24f00f2cf61d6cb9a3a34faa3e12e0c8104e0a71073" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-repair.arcadia", + "bytes": 15635, + "sha256": "e3ce0347746584f503b825a8b6bd23a7eebf0827940112ef8f36d500c1d0a043" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-repair.json", + "bytes": 25736, + "sha256": "29736f2a619f7f2d0e795229f6e8c3645a1b4eca6292043cd604aa01b1ec9170" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-take.arcadia", + "bytes": 15631, + "sha256": "9ab573c92be66e3bae659dd826923ba6066979b1651edda7bd469056632cd77e" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-take.json", + "bytes": 25736, + "sha256": "828c990c6129692cd31c7f6ed0dd6c952f9cfffdd90bc80171df82d4d929afba" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.arcadia", + "bytes": 15617, + "sha256": "49214be2ca9c8bb6195c3b39737c053847021839f70f0bb2921d35a1fbd2ac83" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.invalid-request.json", + "bytes": 2225, + "sha256": "8b02d4739b1be2c8a64da76423b4a6cae7d89c60f4d30723b94f1da3779cbcca" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.invalid.txt", + "bytes": 78, + "sha256": "aa536e18bc65325163e9b645a4ad031ab599fcb05948dcf741b725d0f0c8b602" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.json", + "bytes": 25722, + "sha256": "995dd72f5c1f07f998233ae9847e337cb82de0c2a9053d3905be021d5f8124b9" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.manifest.json", + "bytes": 1059, + "sha256": "ad315359bfd68ce0d265976dc9e4ea6a502ebbb87d7339dd1af5ef27dd01e433" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.repair-plan.json", + "bytes": 15016, + "sha256": "27bf316ad66ffa91f6323e75b0c280baf5caec298645793dea72c5d42aa3b782" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.repair-request.json", + "bytes": 2225, + "sha256": "f4f6b5480ec8927033ea469ea82c1e8411cb6dba95d2da680f15bc193914c9b4" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.steps.md", + "bytes": 3897, + "sha256": "7d7e38d93641a5f22a2738baa4dbacc392eebb477a855cdce0641961980a19ad" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.take-plan.json", + "bytes": 18557, + "sha256": "74dd68ba686b8928054480f0bfed55aad91f6f1208803399dc9878e894f57ecb" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.take-request.json", + "bytes": 1508, + "sha256": "d19a53002a6bf95af3123a3ef9f78baaf7ce1085d4f06f0f4a9d5e5d5accbc0e" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.after-order.arcadia", + "bytes": 6935, + "sha256": "90277f1780d43a6f0b2184bf00b87e7a4f3518d67c6f10d4793daafe1aabf493" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.after-order.json", + "bytes": 11286, + "sha256": "5a3c8494f6976c23b990c14b40760fb2f32ca9973caf6f31dab5632310663591" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.ambiguous-request.json", + "bytes": 1379, + "sha256": "6a86fde194faa55f2d1bdb982571e0e711e5401b53a960e6acb8cf3e17f506c8" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.arcadia", + "bytes": 6195, + "sha256": "e7c30c5a5c3ba7209c8e223f02da55821d7af10a2f09844a7065ae6cd8f22aa5" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.final-plan.json", + "bytes": 19156, + "sha256": "d1e5c2ed08e0aa6274a0421a39876d1ba99f4e441c7a0a68660a83b9e017da14" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.final-request.json", + "bytes": 2418, + "sha256": "433f723252598994dac7184da61f95344b528156cc5a0fba1a7864b2ec9f002b" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.json", + "bytes": 10441, + "sha256": "9e4e2ce1c7879935ad0860a3ae720506c929a8422b51491b719d88af3fd3ff2d" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.manifest.json", + "bytes": 1042, + "sha256": "87e8899c7d4e54faedeef32afb7592fb65278d1bd7390850ab198dcf62068329" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.after-order.arcadia", + "bytes": 6280, + "sha256": "6c77ed42bbf9f4ebe08bfa233197a4020e5587ce33747f7914430aa0c662d9a3" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.after-order.json", + "bytes": 10009, + "sha256": "1dd7ca2bcfc84ac23369c506302b39569d2ebc41e5a4edc99378a1fe01923b7e" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.ambiguous-request.json", + "bytes": 1390, + "sha256": "e0ea7aeb25687ae63c65128f1aab78273f14030d179d3fbea63fe91ab5430136" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.arcadia", + "bytes": 5529, + "sha256": "563c36162050c8564ffa25a85c726462ecdaebdb87659b3f3610506bfd5581e6" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.final-plan.json", + "bytes": 18821, + "sha256": "f96c43fc58dbe48a044b628b31bb3f0b59171dad5b6982ec6c34a5597e474130" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.final-request.json", + "bytes": 2438, + "sha256": "d38fdb13612b07254edad80848f79c1e097d5f868c020feae9ba072aa697a50d" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.json", + "bytes": 9153, + "sha256": "2ed0daed118f2df13dcad738dab174ad34d44a15921cf8097415e707978b0968" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.manifest.json", + "bytes": 1058, + "sha256": "c79bd12a85d8d4f25cc3ee43581b3e5e74ae9ad7e4de0c72764975ba2b89c279" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.after-order.arcadia", + "bytes": 5026, + "sha256": "98020e048ac01f285c6ad8c10ce22bef05e193b5ba0f5558be1fb26a7bf82620" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.after-order.json", + "bytes": 7851, + "sha256": "ea3783992488bc6ee944eb91a26ccf3dbc05a3909528fc32ec8023a76765cee6" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.ambiguous-request.json", + "bytes": 1379, + "sha256": "ea3cfd25f7a50481805956fb88ab851516dcd602dd6564502a0cc55f7de6a54f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.arcadia", + "bytes": 4295, + "sha256": "2b7c3694623bbea3e36dcc6f674d4adcd91e23c8e1005ded21e5a69648a048e5" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.final-plan.json", + "bytes": 17912, + "sha256": "95a23bd334cffcaef0c3b1012b7555efd2a077ef6f9140d58020910ef8a76723" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.final-request.json", + "bytes": 2081, + "sha256": "1e2433ed5821bf65443f56cb27381ee935db81b1955d3a539b7952898312a410" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.json", + "bytes": 7012, + "sha256": "0033f8780c2ba69779b811bca792340c25a092f887e5811c6839f0a691d744f2" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.manifest.json", + "bytes": 1046, + "sha256": "e3b4a60a56abee779ca8356605c968aa2d99256a3bd3c5601b14b5c5502a1a05" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.after-order.arcadia", + "bytes": 5467, + "sha256": "e265cab35097acc46f5123107c13bc35b9f71931ff650557fc1c85779141b327" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.after-order.json", + "bytes": 8482, + "sha256": "9b777828d3681138de6bbd08de8bf922bed92c27be60b103d8ff73ce7ddd0a48" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.ambiguous-request.json", + "bytes": 1379, + "sha256": "7d124256730bf2feee772c7d0118b87eb288e8aaa9179d69ceb9259dbceb2c71" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.arcadia", + "bytes": 4727, + "sha256": "87a5a3665dab2dd6e595867dcebb1586e93dd067c85d6e24b1a4d3ff0ad6d4ba" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.final-plan.json", + "bytes": 18803, + "sha256": "1888ca51e0923866a9afea99cad069fe5d3f19f0a1b24328e20ac1b9f52d8bad" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.final-request.json", + "bytes": 2294, + "sha256": "5070a5b85feb1bc7b1fc648cd5d35ef26663492c8666dcd471950c06ec3a6052" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.json", + "bytes": 7641, + "sha256": "725b35e36640c81c70c7efea5c3304bf61b49ef9664194ca0d491782cc62191a" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.manifest.json", + "bytes": 1038, + "sha256": "1b43abf8fed3061c65a7b7cb103d31ea7ece333a2da83c645f8d228448c4dbb2" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.after-order.arcadia", + "bytes": 5019, + "sha256": "65a6217f474b5085f37b511151185c2c08ff7a1998e924f1fe01f29c410f6ced" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.after-order.json", + "bytes": 7835, + "sha256": "8a53bb9b43eab5b6dca5e08deef20c14c96e134b9ee816a99b7960bb5255e008" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.ambiguous-request.json", + "bytes": 1379, + "sha256": "c704f99245f00d5c3be0562d91931b4e7f1fb3fb36f41991eb76656ffbd6129f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.arcadia", + "bytes": 4279, + "sha256": "c59ec1233d5a9fbb8e386f6d9b13f398be21baf813ba215efb51bfc1bb98db36" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.final-plan.json", + "bytes": 17938, + "sha256": "30c5c3f614a74708763df612016483623792f4c65e2ed2fa662ac417cfb852eb" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.final-request.json", + "bytes": 2098, + "sha256": "3b6c35ef78133f0980cb6fb53fbc29c5d3c4deb5dc4be01c2c3384e221987b9b" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.json", + "bytes": 6996, + "sha256": "c159c60403abcf8fefab7f19cbad9989488e8ccc20b82c57597b22a0ae254802" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.manifest.json", + "bytes": 1038, + "sha256": "af8a314a9b1d85a8f98affa5a6649f43d252851158798e1ad687bb1b6966b14f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.steps.md", + "bytes": 4549, + "sha256": "6004894e9d9f478b7fe1c3c3e0706dcc546d5df8557cff91b4cf26f8a4badf24" + }, + { + "path": "harness/fixtures/release1-native/source5-recovery/15000000-0000-4000-8000-000000000010.json", + "bytes": 1933, + "sha256": "71cca2a59f36b2a07d11dedbe9101226aa1a4a00d8ac244b5565202e56709f51" + }, + { + "path": "harness/fixtures/release1-native/source5-recovery/generate.py", + "bytes": 1496, + "sha256": "e44986c1d563499f25917441220b23883fc9cb0f89faf409873191f0212fbd2f" + }, + { + "path": "harness/fixtures/release1-native/state-actions.arcadia", + "bytes": 6224, + "sha256": "9cde82608110e56aa9e14c9e33eb38976f53aed74ab013145d411d5743a0ec26" + }, + { + "path": "harness/fixtures/rest-coverage/README.md", + "bytes": 1870, + "sha256": "df4a391312e0c8b20ccdcc850199443b08547be1b10b1f2447a067bf4bf544e6" + }, + { + "path": "harness/fixtures/rest-coverage/coverage-probe.json", + "bytes": 7951, + "sha256": "2d1ef7bdb5d7bf17b9fda33b1d1790d1d88289b3fd1e725f89b83a69771f9a43" + }, + { + "path": "harness/fixtures/rest-coverage/run-coverage-probe.ps1", + "bytes": 9381, + "sha256": "f24f19fca418b76a7249894a08c116e16b465a02f8f899d12b808ccfdd90a3bd" + }, + { + "path": "harness/fixtures/run-timed-bundle-oracle.ps1", + "bytes": 7466, + "sha256": "fab696486a574f9867c6e69a8a8b960e7e9722206441b9cc5f36d41f285f1a25" + }, + { + "path": "harness/fixtures/scenario-authoring/README.md", + "bytes": 14700, + "sha256": "6b651b180b76d10b00bc49d77a8f5e0b3ba0317446978f41b541f5bb23fedad8" + }, + { + "path": "harness/fixtures/scenario-authoring/base/expected-baseline.json", + "bytes": 38589, + "sha256": "abd8246c939ebb8a2162ef82e23d0fb322ee1a8b4d0d7c28a34037e42e86e841" + }, + { + "path": "harness/fixtures/scenario-authoring/base/project.arcadia", + "bytes": 19470, + "sha256": "9b1afbe96b0bf8fa613451b00929492f05a59b9eb2ca74c2c374a8b7bb7cba9e" + }, + { + "path": "harness/fixtures/scenario-authoring/base/rationale.arcadia", + "bytes": 86, + "sha256": "82df210f22f6aa336a3e7e00240977d671c7c3923db7bc58fb29e6d98b67ef49" + }, + { + "path": "harness/fixtures/source7-native/README.md", + "bytes": 7235, + "sha256": "7abccbc3da0980d1d099761d1a66d12c403a0f543954134537ecd4930d182b4b" + }, + { + "path": "harness/fixtures/source7-native/base/expected-baseline.json", + "bytes": 26428, + "sha256": "e2882a58f841f460f45d9d67db1606440e0d7997b9b29a784569ae48e4b23bfb" + }, + { + "path": "harness/fixtures/source7-native/base/project.arcadia", + "bytes": 13616, + "sha256": "5474d8ca05fd1375220dc0ad40d913631fde51159e9632bb9f290d1ecdab8dd7" + }, + { + "path": "harness/fixtures/source7-native/base/rationale.arcadia", + "bytes": 59, + "sha256": "e6a600e13036d4ad594a65380ed1b3d82d1772d583041bb0a624c9588a73047a" + }, + { + "path": "harness/fixtures/source7-native/manifest.json", + "bytes": 410, + "sha256": "6c57164a796234d83818d462d0a25f10e77062d405769e602ae2a7bec251e3b6" + }, + { + "path": "harness/fixtures/staged-source-authoring/README.md", + "bytes": 6876, + "sha256": "502be5e3bf9112447dc07b1a51fe0fa301754b47128a9b81877c185c6e797fee" + }, + { + "path": "harness/fixtures/staged-source-authoring/base/notes.arcadia", + "bytes": 63, + "sha256": "ad9de02963c20d1f43856455a797deb05ca674659e45f2c4b96b52783024f8bd" + }, + { + "path": "harness/fixtures/staged-source-authoring/base/project.arcadia", + "bytes": 593, + "sha256": "aa844950ec4fb86f262a257e1fc370a26557ea7978d8a4cab78265037660234c" + }, + { + "path": "rust-toolchain.toml", + "bytes": 66, + "sha256": "a6a0bbd29ffaa8182dc22d1d9149709f1091e47df40ed96eb8a78a711c66a4ce" + } + ], + "artifacts": { + "arcadia-studio.exe": { + "bytes": 113935360, + "sha256": "49eb87b4a239c586a16b9efbfd036b3823adc8b62a8992feeaa934bca4f5743b" + }, + "libunwind.dll": { + "bytes": 190464, + "sha256": "aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a" + }, + "gui.log": { + "bytes": 155, + "sha256": "c54a55cd082f0e7ab4ee3e8378783bbdca40a240168a33bfec21a9ac6f05b2e0" + }, + "full.log": { + "bytes": 95079, + "sha256": "5d10262da23a15d1a01bbc0c36de643350769dd0029e36d7256851f666edd7df" + }, + "clippy.log": { + "bytes": 155, + "sha256": "559782d369ac2415d1773fcd2c5c638ffa0000f50435eeb957d7b185eeb8b473" + } + }, + "acceptance": "Matching Windows gates closed; native GUI acceptance pending. Linux/WSL paused." +} diff --git a/harness/experiments/canvas-native-83f53c7-20260912/stderr.log b/harness/experiments/canvas-native-83f53c7-20260912/stderr.log new file mode 100644 index 00000000..e69de29b diff --git a/harness/experiments/canvas-native-83f53c7-20260912/stdout.log b/harness/experiments/canvas-native-83f53c7-20260912/stdout.log new file mode 100644 index 00000000..e69de29b diff --git a/harness/experiments/canvas-native-83f53c7-20260912/tools/archive-canvas-native-83f53c7.py b/harness/experiments/canvas-native-83f53c7-20260912/tools/archive-canvas-native-83f53c7.py new file mode 100644 index 00000000..78effb3e --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/tools/archive-canvas-native-83f53c7.py @@ -0,0 +1,155 @@ +"""Archive only the closed, identified canvas native trial; never stage/commit.""" +from pathlib import Path +from datetime import datetime, timezone +import hashlib +import json + +root = Path(__file__).resolve().parent.parent +trial = root / '.local/native-qa/canvas-followup-20260912-01' +stage = root / '.local/native-qa/studio-83f53c7' +prefix = 'harness/experiments/canvas-native-83f53c7-20260912' +destination = root / prefix +source = '83f53c7c6e277e250f06d2ae6bfa6a7988bd2e4b' +result_path = root / '.local/canvas-native-83f53c7-archive-result.json' +assert not destination.exists() and not result_path.exists(), 'Never overwrite an archive/run' +assert destination.resolve().is_relative_to(root / 'harness/experiments') + + +def digest(path): + raw = path.read_bytes() + return {'bytes': len(raw), 'sha256': hashlib.sha256(raw).hexdigest()} + + +def read(path): + return json.loads(path.read_bytes()) + + +def verify(path, record): + actual = digest(path) + assert actual['sha256'] == record['sha256'], str(path) + if 'bytes' in record: + assert actual['bytes'] == record['bytes'], str(path) + + +def write_new(path, record): + with path.open('x', encoding='utf-8', newline='\n') as stream: + stream.write(json.dumps(record, indent=2) + '\n') + + +launch = read(trial / 'launch.json') +closure = read(trial / 'closure.json') +prepared = read(trial / 'preparation.json') +staged = read(stage / 'manifest.json') +assert launch['source'] == staged['source'] == staged['full_test_source'] == source +assert closure['pid'] == launch['pid'] and closure['exit'] == 0 +assert prepared['utc'] < launch['utc'] < closure['utc'] +assert Path(launch['binary']).resolve() == (stage / 'arcadia-studio.exe').resolve() +assert launch['sha256'] == staged['artifacts']['arcadia-studio.exe']['sha256'] +for name in ['arcadia-studio.exe', 'libunwind.dll']: + verify(stage / name, staged['artifacts'][name]) +for name in ['full', 'clippy', 'gui']: + gate = staged['results'][name] + assert gate['source'] == source and gate['exit'] == 0 and not gate['changed_inputs'] + +baseline_names = ['compact-baseline', 'bound-baseline'] +baseline_records = [row for row in prepared['files'] if Path(row['path']).parts[0] in baseline_names] +for row in baseline_records: + verify(trial / row['path'], row) + # Original baseline sources are independently retained elsewhere too. + verify(root / row['source'], row) +assert {row['path'] for row in baseline_records} == { + path.relative_to(trial).as_posix() for name in baseline_names + for path in (trial / name).rglob('*') if path.is_file()} + +checkpoint_records = [] +checkpoint_files = set() +oracle_identities = {} +for path in sorted((trial / 'evidence').glob('*.json')): + record = read(path) + assert set(['snapshot', 'command', 'checker_sha256', 'exit', 'files']) <= record.keys(), str(path) + assert record['exit'] == 0 + snapshot = Path(record['snapshot']).resolve() + assert snapshot == (trial / 'checkpoints' / path.stem).resolve() + assert record['utc'] <= closure['utc'] + actual = {p.resolve() for p in snapshot.rglob('*') if p.is_file()} + declared = {(snapshot / row['path']).resolve() for row in record['files']} + assert actual == declared + for row in record['files']: + item = (snapshot / row['path']).resolve() + assert item.is_relative_to(snapshot) + verify(item, row) + checker = Path(record['command'][0]) + verify(checker, {'sha256': record['checker_sha256']}) + oracle_identities[str(checker.relative_to(root))] = digest(checker) + assert (trial / 'evidence' / (path.stem + '.log')).is_file() + checkpoint_files.update(actual) + checkpoint_records.append(path.relative_to(trial).as_posix()) +assert checkpoint_files == {p.resolve() for p in (trial / 'checkpoints').rglob('*') if p.is_file()} + +payloads = [] +for name in ['preparation.json', 'launch.json', 'closure.json', 'stdout.log', 'stderr.log']: + payloads.append((trial / name, Path(name))) +for name in ['evidence', 'checkpoints', *baseline_names]: + for path in sorted((trial / name).rglob('*')): + if path.is_file(): + assert path.resolve().is_relative_to(trial) and not path.is_symlink() + if name == 'evidence': + assert path.suffix.lower() in ['.png', '.json', '.log'], path + payloads.append((path, path.relative_to(trial))) +for name in ['canvas-native-session.py', 'canvas-native-checkpoint.py', Path(__file__).name]: + payloads.append((root / '.local' / name, Path('tools') / name)) +payloads.append((stage / 'manifest.json', Path('stage/manifest.json'))) +assert len({relative.as_posix() for _, relative in payloads}) == len(payloads) +assert not any(relative.parts[0] in ['profile', 'temp', 'compact-work', 'bound-work', + 'draft-work', 'process-work'] for _, relative in payloads) +before = {str(path): digest(path) for path, _ in payloads} + +destination.mkdir() +rows = [] +for path, relative in payloads: + target = destination / relative + target.parent.mkdir(parents=True, exist_ok=True) + raw = path.read_bytes() + with target.open('xb') as stream: + stream.write(raw) + verify(target, before[str(path)]) + rows.append({'path': relative.as_posix(), 'source_path': path.relative_to(root).as_posix(), + **before[str(path)]}) +for path, _ in payloads: + verify(path, before[str(path)]) + +# Only append a scoped rule; never rewrite or normalize existing attributes. +attributes = root / '.gitattributes' +attribute_before = digest(attributes) +rule = prefix + '/** -text whitespace=-blank-at-eol,-blank-at-eof,cr-at-eol' +current = attributes.read_bytes() +added = rule.encode() not in current.splitlines() +if added: + assert (prefix + '/').encode() not in current, 'Review an existing prefix rule instead of replacing it' + with attributes.open('ab') as stream: + if current and not current.endswith(b'\n'): + stream.write(b'\n') + stream.write(rule.encode() + b'\n') + +manifest = {'archived_utc': datetime.now(timezone.utc).isoformat(), 'source': source, + 'native_trial': trial.relative_to(root).as_posix(), 'native_pid': launch['pid'], + 'native_exit': closure['exit'], 'payload_count': len(rows), + 'payload_bytes': sum(row['bytes'] for row in rows), + 'verified_checkpoint_records': checkpoint_records, 'verified_baseline_files': len(baseline_records), + 'oracle_binary_identities_not_native_app_source': oracle_identities, + 'exclusions': ['profile', 'temp', 'compact-work', 'bound-work', 'draft-work', 'process-work'], + 'byte_policy': 'Copied source bytes exactly, including CRLF; originals unmodified. Source paths are provenance, not portable execution paths.', + 'attributes': {'rule': rule, 'appended': added, 'before': attribute_before, 'after': digest(attributes)}, + 'files': rows} +write_new(destination / 'manifest.json', manifest) +assert {p.relative_to(destination).as_posix() for p in destination.rglob('*') if p.is_file()} == { + row['path'] for row in rows} | {'manifest.json'} +result = {'archive': prefix, 'source': source, 'native_exit': closure['exit'], + 'payload_count': len(rows), 'archive_file_count_including_manifest': len(rows) + 1, + 'screenshots': sum(row['path'].endswith('.png') for row in rows), + 'checkpoint_count': len(checkpoint_records), 'payload_bytes': manifest['payload_bytes'], + 'all_payload_source_and_destination_hashes_equal': True, + 'manifest': digest(destination / 'manifest.json'), 'helper': digest(Path(__file__)), + 'attributes_rule_appended': added, 'git_staging_or_commit_performed': False} +write_new(result_path, result) +print(json.dumps(result, indent=2)) diff --git a/harness/experiments/canvas-native-83f53c7-20260912/tools/canvas-native-checkpoint.py b/harness/experiments/canvas-native-83f53c7-20260912/tools/canvas-native-checkpoint.py new file mode 100644 index 00000000..cc002fa1 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/tools/canvas-native-checkpoint.py @@ -0,0 +1,40 @@ +from pathlib import Path +from datetime import datetime, timezone +import hashlib +import json +import shutil +import subprocess +import sys + +root = Path(__file__).resolve().parent.parent +trial = root / '.local/native-qa/canvas-followup-20260912-01' +name, work_name, mode, baseline_name, entry, *extra = sys.argv[1:] +assert name.replace('-', '').isalnum() and mode in ['same', 'removed'] +source = (trial / work_name).resolve() +baseline = (trial / baseline_name).resolve() +assert source.is_relative_to(trial) and baseline.is_relative_to(trial) +assert source.is_dir() and baseline.is_dir() +assert (source / entry).resolve().is_relative_to(source) +assert (baseline / entry).resolve().is_relative_to(baseline) +assert (source / entry).is_file() and (baseline / entry).is_file() +dest = trial / 'checkpoints' / name +assert not dest.exists() +assert not (trial / 'evidence' / (name + '.json')).exists() +shutil.copytree(source, dest) +checker = root / '.local/native-qa/delete-oracle-warning-fix-42511f0/delete-oracle-warning-fix-42511f0.exe' +command = [str(checker), mode, str(baseline / entry), str(dest / entry), *extra] +run = subprocess.run(command, cwd=root, capture_output=True) +files = [] +for file in sorted(dest.rglob('*')): + if file.is_file(): + raw = file.read_bytes() + rel = file.relative_to(dest) + assert (source / rel).read_bytes() == raw + files.append({'path': rel.as_posix(), 'bytes': len(raw), 'sha256': hashlib.sha256(raw).hexdigest()}) +log = trial / 'evidence' / (name + '.log') +log.write_bytes(run.stdout + run.stderr) +record = {'utc': datetime.now(timezone.utc).isoformat(), 'snapshot': str(dest), 'command': command, 'checker_sha256': hashlib.sha256(checker.read_bytes()).hexdigest(), 'exit': run.returncode, 'files': files} +(trial / 'evidence' / (name + '.json')).write_text(json.dumps(record, indent=2) + '\n', encoding='utf-8', newline='\n') +print(run.stdout.decode('utf-8', errors='replace')) +print(json.dumps({'name': name, 'exit': run.returncode, 'files': len(files), 'diagnostic_log': str(log)})) +sys.exit(run.returncode) diff --git a/harness/experiments/canvas-native-83f53c7-20260912/tools/canvas-native-session.py b/harness/experiments/canvas-native-83f53c7-20260912/tools/canvas-native-session.py new file mode 100644 index 00000000..d8954ad8 --- /dev/null +++ b/harness/experiments/canvas-native-83f53c7-20260912/tools/canvas-native-session.py @@ -0,0 +1,68 @@ +"""Prepare a new disposable canvas trial; retain the real GUI process exit code.""" +from pathlib import Path +from datetime import datetime, timezone +import hashlib +import json +import os +import shutil +import subprocess +import sys + +root = Path(__file__).resolve().parent.parent +trial = root / '.local/native-qa/canvas-followup-20260912-01' +mode = sys.argv[1] +if mode == 'prepare': + assert not trial.exists(), 'Never overwrite a native trial' + sources = { + 'compact-baseline': root / '.local/native-qa/delete-20260912/compact-baseline-v2', + 'compact-work': root / '.local/native-qa/delete-20260912/compact-baseline-v2', + 'bound-baseline': root / 'harness/experiments/canvas-editing-followup-20260912/bound-nested-fixture-r1-20260912', + 'bound-work': root / 'harness/experiments/canvas-editing-followup-20260912/bound-nested-fixture-r1-20260912', + 'draft-work': root / 'harness/experiments/canvas-editing-followup-20260912/nested-call-fixture-20260912', + 'process-work': root / 'harness/fixtures/source7-native/base', + } + assert all(path.is_dir() for path in sources.values()) + trial.mkdir() + rows = [] + for label, source in sources.items(): + shutil.copytree(source, trial / label) + for path in sorted(source.rglob('*')): + if path.is_file(): + relative = path.relative_to(source) + raw = path.read_bytes() + assert (trial / label / relative).read_bytes() == raw + rows.append({'path': f'{label}/{relative.as_posix()}', 'source': str(path.relative_to(root)), 'bytes': len(raw), 'sha256': hashlib.sha256(raw).hexdigest()}) + for label in ['profile/Desktop', 'profile/Documents', 'profile/AppData/Local', 'profile/AppData/Roaming', 'temp', 'evidence']: + (trial / label).mkdir(parents=True, exist_ok=True) + (trial / 'preparation.json').write_text(json.dumps({'utc': datetime.now(timezone.utc).isoformat(), 'files': rows}, indent=2) + '\n', encoding='utf-8', newline='\n') + print(json.dumps({'trial': str(trial), 'identical_fixture_files': len(rows)})) +elif mode == 'launch': + assert (trial / 'preparation.json').is_file() + assert not (trial / 'launch.json').exists() + stage = Path(sys.argv[2]).resolve() + assert stage.is_relative_to(root / '.local/native-qa') + record = json.loads((stage / 'manifest.json').read_bytes()) + for gate in ['full', 'clippy', 'gui']: + result = record['results'][gate] + assert result['exit'] == 0 and not result['changed_inputs'] + assert result['source'] == record['source'], 'Require same-source gates for this production correction' + for name in ['arcadia-studio.exe', 'libunwind.dll']: + raw = (stage / name).read_bytes() + assert len(raw) == record['artifacts'][name]['bytes'] + assert hashlib.sha256(raw).hexdigest() == record['artifacts'][name]['sha256'] + env = {key: os.environ[key] for key in ['SystemRoot', 'WINDIR', 'SystemDrive', 'ProgramData', 'ALLUSERSPROFILE', 'PUBLIC', 'COMSPEC', 'PATHEXT', 'NUMBER_OF_PROCESSORS', 'PROCESSOR_ARCHITECTURE', 'OS'] if key in os.environ} + profile = trial / 'profile' + windows = Path(env['SystemRoot']) + env.update({'PATH': os.pathsep.join(map(str, [stage, windows / 'System32', windows])), 'USERPROFILE': str(profile), 'LOCALAPPDATA': str(profile / 'AppData/Local'), 'APPDATA': str(profile / 'AppData/Roaming'), 'TEMP': str(trial / 'temp'), 'TMP': str(trial / 'temp')}) + with (trial / 'stdout.log').open('xb') as out, (trial / 'stderr.log').open('xb') as err: + process = subprocess.Popen([str(stage / 'arcadia-studio.exe')], cwd=trial, env=env, stdin=subprocess.DEVNULL, stdout=out, stderr=err, creationflags=subprocess.CREATE_NO_WINDOW) + launch = {'utc': datetime.now(timezone.utc).isoformat(), 'pid': process.pid, 'source': record['source'], 'binary': str(stage / 'arcadia-studio.exe'), 'sha256': record['artifacts']['arcadia-studio.exe']['sha256'], 'private_profile': str(profile)} + (trial / 'launch.json').write_text(json.dumps(launch, indent=2) + '\n', encoding='utf-8', newline='\n') + print(json.dumps(launch), flush=True) + code = process.wait() + closure = {'utc': datetime.now(timezone.utc).isoformat(), 'pid': process.pid, 'exit': code} + (trial / 'closure.json').write_text(json.dumps(closure, indent=2) + '\n', encoding='utf-8', newline='\n') + print(json.dumps(closure), flush=True) + sys.exit(code) +else: + raise SystemExit('Expected prepare or launch STAGED_DIRECTORY') diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/bound-baseline/README.md b/harness/experiments/canvas-native-d61f1f3-20260912/bound-baseline/README.md new file mode 100644 index 00000000..0d1642e3 --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/bound-baseline/README.md @@ -0,0 +1 @@ +Open bound-nested-calls.arcadia. In Behavior select OA Nested pressure checks, SA Nested pressure checks, or OA Reentrant pressure review. Each has two lifelines and four rows ordered C1,C2,R2,R1. C1 requests 420.0 kPa and R1 returns 418.0; C2 requests 380.0 and R2 returns 378.0. The SA messages resolve an actual synchronous interface-operation allocation; Replies derive it from their exact Calls. OA uses a bound Interaction carrying an Operation item without SA-only OperationUse. The reentrant case uses an explicit reverse Interaction for C2/R2. Check unselected bars, both reply ends, each bar's selection, Properties values/correlation, source parity and save/reopen. scenario-identities.tsv lists every UI target UUID. diagnostics.txt records completeness warnings. Generator validation and roundtrip are not desktop paint or native acceptance. diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/bound-baseline/bound-nested-calls.arcadia b/harness/experiments/canvas-native-d61f1f3-20260912/bound-baseline/bound-nested-calls.arcadia new file mode 100644 index 00000000..45d95f6d --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/bound-baseline/bound-nested-calls.arcadia @@ -0,0 +1,486 @@ +arcadia 7; +project bound_nested_calls "Bound nested pressure checks" id "21b00d00-0000-4000-8000-000000000001" { + description "Native activation acceptance. Requested 420/380 kPa, measured 418/378 kPa. Unicode readback: Δ pressure · 戻り値."; + + oa_activity bound_100 "Review pressure demand" id "21b00d00-0000-4000-8000-000000000064" { + description ""; + parent none; + } + + oa_activity bound_101 "Inspect pressure" id "21b00d00-0000-4000-8000-000000000065" { + description ""; + parent none; + } + + oa_exchange_item bound_110 "Check pressure" id "21b00d00-0000-4000-8000-00000000006e" { + description ""; + kind Information; + mechanism Operation; + parent none; + supertype none; + } + + oa_data_field bound_111 "requested_pressure" id "21b00d00-0000-4000-8000-00000000006f" { + default none; + description ""; + direction In; + maximum 1; + minimum 1; + parent @bound_110; + storage Value; + type_ref Real; + unit "kPa"; + } + + oa_data_field bound_112 "measured_pressure" id "21b00d00-0000-4000-8000-000000000070" { + default none; + description ""; + direction Return; + maximum 1; + minimum 1; + parent @bound_110; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_actor bound_200 "Operator console" id "21b00d00-0000-4000-8000-0000000000c8" { + description ""; + parent none; + } + + sa_system bound_201 "Pressure service" id "21b00d00-0000-4000-8000-0000000000c9" { + description ""; + parent none; + } + + sa_port bound_202 "Client socket" id "21b00d00-0000-4000-8000-0000000000ca" { + contract { + Component { + kind Standard; + orientation Unset; + }; + }; + description ""; + legacy none; + parent @bound_200; + } + + sa_port bound_203 "Service socket" id "21b00d00-0000-4000-8000-0000000000cb" { + contract { + Component { + kind Standard; + orientation Unset; + }; + }; + description ""; + legacy none; + parent @bound_201; + } + + sa_exchange_item bound_210 "Check pressure" id "21b00d00-0000-4000-8000-0000000000d2" { + description ""; + kind Information; + mechanism Operation; + parent none; + supertype none; + } + + sa_data_field bound_211 "requested_pressure" id "21b00d00-0000-4000-8000-0000000000d3" { + default none; + description ""; + direction In; + maximum 1; + minimum 1; + parent @bound_210; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_data_field bound_212 "measured_pressure" id "21b00d00-0000-4000-8000-0000000000d4" { + default none; + description ""; + direction Return; + maximum 1; + minimum 1; + parent @bound_210; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_interface bound_213 "Pressure check API" id "21b00d00-0000-4000-8000-0000000000d5" { + description ""; + parent none; + supertype none; + } + + oa_scenario bound_1000 "OA Nested pressure checks" id "21b00d00-0000-4000-8000-0000000003e8" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_1040, @bound_1030, @bound_1060, @bound_1050]; + viewpoint OperationalActivity; + } + + oa_lifeline bound_1001 "L1 Console" id "21b00d00-0000-4000-8000-0000000003e9" { + description ""; + parent @bound_1000; + represented @bound_100; + } + + oa_lifeline bound_1002 "L2 Inspector" id "21b00d00-0000-4000-8000-0000000003ea" { + description ""; + parent @bound_1000; + represented @bound_101; + } + + oa_occurrence bound_1030 "C2 380 kPa" id "21b00d00-0000-4000-8000-000000000406" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_1002; + reply_to none; + sender @bound_1001; + values [{ + expression "380.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1040 "C1 420 kPa" id "21b00d00-0000-4000-8000-000000000410" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_1002; + reply_to none; + sender @bound_1001; + values [{ + expression "420.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1050 "R1 418 kPa" id "21b00d00-0000-4000-8000-00000000041a" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_1001; + reply_to @bound_1040; + sender @bound_1002; + values [{ + expression "418.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1060 "R2 378 kPa" id "21b00d00-0000-4000-8000-000000000424" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_1001; + reply_to @bound_1030; + sender @bound_1002; + values [{ + expression "378.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + sa_scenario bound_2000 "SA Nested pressure checks" id "21b00d00-0000-4000-8000-0000000007d0" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_2040, @bound_2030, @bound_2060, @bound_2050]; + viewpoint BoundaryInterface; + } + + sa_lifeline bound_2001 "L1 Console" id "21b00d00-0000-4000-8000-0000000007d1" { + description ""; + parent @bound_2000; + represented @bound_200; + } + + sa_lifeline bound_2002 "L2 Inspector" id "21b00d00-0000-4000-8000-0000000007d2" { + description ""; + parent @bound_2000; + represented @bound_201; + } + + sa_occurrence bound_2030 "C2 380 kPa" id "21b00d00-0000-4000-8000-0000000007ee" { + body { + Exchange { + exchange @bound_223; + message_kind Call; + operation { + allocation @bound_220; + }; + receiver @bound_2002; + reply_to none; + sender @bound_2001; + values [{ + expression "380.0"; + field @bound_211; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2040 "C1 420 kPa" id "21b00d00-0000-4000-8000-0000000007f8" { + body { + Exchange { + exchange @bound_223; + message_kind Call; + operation { + allocation @bound_220; + }; + receiver @bound_2002; + reply_to none; + sender @bound_2001; + values [{ + expression "420.0"; + field @bound_211; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2050 "R1 418 kPa" id "21b00d00-0000-4000-8000-000000000802" { + body { + Exchange { + exchange @bound_223; + message_kind Reply; + receiver @bound_2001; + reply_to @bound_2040; + sender @bound_2002; + values [{ + expression "418.0"; + field @bound_212; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2060 "R2 378 kPa" id "21b00d00-0000-4000-8000-00000000080c" { + body { + Exchange { + exchange @bound_223; + message_kind Reply; + receiver @bound_2001; + reply_to @bound_2030; + sender @bound_2002; + values [{ + expression "378.0"; + field @bound_212; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + oa_scenario bound_3000 "OA Reentrant pressure review" id "21b00d00-0000-4000-8000-000000000bb8" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_3040, @bound_3030, @bound_3060, @bound_3050]; + viewpoint OperationalActivity; + } + + oa_lifeline bound_3001 "L1 Console" id "21b00d00-0000-4000-8000-000000000bb9" { + description ""; + parent @bound_3000; + represented @bound_100; + } + + oa_lifeline bound_3002 "L2 Inspector" id "21b00d00-0000-4000-8000-000000000bba" { + description ""; + parent @bound_3000; + represented @bound_101; + } + + oa_occurrence bound_3030 "C2 380 kPa" id "21b00d00-0000-4000-8000-000000000bd6" { + body { + Exchange { + exchange @bound_121; + message_kind Call; + receiver @bound_3001; + reply_to none; + sender @bound_3002; + values [{ + expression "380.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3040 "C1 420 kPa" id "21b00d00-0000-4000-8000-000000000be0" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_3002; + reply_to none; + sender @bound_3001; + values [{ + expression "420.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3050 "R1 418 kPa" id "21b00d00-0000-4000-8000-000000000bea" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_3001; + reply_to @bound_3040; + sender @bound_3002; + values [{ + expression "418.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3060 "R2 378 kPa" id "21b00d00-0000-4000-8000-000000000bf4" { + body { + Exchange { + exchange @bound_121; + message_kind Reply; + receiver @bound_3002; + reply_to @bound_3030; + sender @bound_3001; + values [{ + expression "378.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + interaction bound_120 "Pressure check" id "21b00d00-0000-4000-8000-000000000078" { + description ""; + items [@bound_110]; + source @bound_100; + target @bound_101; + } + + interaction bound_121 "Demand review callback" id "21b00d00-0000-4000-8000-000000000079" { + description ""; + items [@bound_110]; + source @bound_101; + target @bound_100; + } + + interface_item_allocation bound_220 "Synchronous pressure check" id "21b00d00-0000-4000-8000-0000000000dc" { + acquisition Unspecified; + description ""; + order 0; + source @bound_213; + target @bound_210; + transmission Synchronous; + } + + interface_requirement bound_221 "Console requires check" id "21b00d00-0000-4000-8000-0000000000dd" { + description ""; + source @bound_202; + target @bound_213; + } + + interface_provision bound_222 "Service provides check" id "21b00d00-0000-4000-8000-0000000000de" { + description ""; + source @bound_203; + target @bound_213; + } + + boundary_exchange bound_223 "Pressure channel" id "21b00d00-0000-4000-8000-0000000000df" { + description ""; + items [@bound_210]; + oriented false; + source @bound_202; + target @bound_203; + } + +} diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/bound-baseline/diagnostics.txt b/harness/experiments/canvas-native-d61f1f3-20260912/bound-baseline/diagnostics.txt new file mode 100644 index 00000000..b026a721 --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/bound-baseline/diagnostics.txt @@ -0,0 +1,24 @@ +[ + Issue { + severity: Warning, + element: Some( + 21b00d00-0000-4000-8000-000000000064, + ), + code: "unallocated_leaf", + field: Some( + "allocation", + ), + message: "Allocate leaf 'Review pressure demand' to a performer.", + }, + Issue { + severity: Warning, + element: Some( + 21b00d00-0000-4000-8000-000000000065, + ), + code: "unallocated_leaf", + field: Some( + "allocation", + ), + message: "Allocate leaf 'Inspect pressure' to a performer.", + }, +] diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/bound-baseline/scenario-identities.tsv b/harness/experiments/canvas-native-d61f1f3-20260912/bound-baseline/scenario-identities.tsv new file mode 100644 index 00000000..7cd0cd19 --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/bound-baseline/scenario-identities.tsv @@ -0,0 +1,4 @@ +scenario owner L1 L2 C1 C2 R2 R1 +OA Nested pressure checks 21b00d00-0000-4000-8000-0000000003e8 21b00d00-0000-4000-8000-0000000003e9 21b00d00-0000-4000-8000-0000000003ea 21b00d00-0000-4000-8000-000000000410 21b00d00-0000-4000-8000-000000000406 21b00d00-0000-4000-8000-000000000424 21b00d00-0000-4000-8000-00000000041a +SA Nested pressure checks 21b00d00-0000-4000-8000-0000000007d0 21b00d00-0000-4000-8000-0000000007d1 21b00d00-0000-4000-8000-0000000007d2 21b00d00-0000-4000-8000-0000000007f8 21b00d00-0000-4000-8000-0000000007ee 21b00d00-0000-4000-8000-00000000080c 21b00d00-0000-4000-8000-000000000802 +OA Reentrant pressure review 21b00d00-0000-4000-8000-000000000bb8 21b00d00-0000-4000-8000-000000000bb9 21b00d00-0000-4000-8000-000000000bba 21b00d00-0000-4000-8000-000000000be0 21b00d00-0000-4000-8000-000000000bd6 21b00d00-0000-4000-8000-000000000bf4 21b00d00-0000-4000-8000-000000000bea diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-preflight/README.md b/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-preflight/README.md new file mode 100644 index 00000000..0d1642e3 --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-preflight/README.md @@ -0,0 +1 @@ +Open bound-nested-calls.arcadia. In Behavior select OA Nested pressure checks, SA Nested pressure checks, or OA Reentrant pressure review. Each has two lifelines and four rows ordered C1,C2,R2,R1. C1 requests 420.0 kPa and R1 returns 418.0; C2 requests 380.0 and R2 returns 378.0. The SA messages resolve an actual synchronous interface-operation allocation; Replies derive it from their exact Calls. OA uses a bound Interaction carrying an Operation item without SA-only OperationUse. The reentrant case uses an explicit reverse Interaction for C2/R2. Check unselected bars, both reply ends, each bar's selection, Properties values/correlation, source parity and save/reopen. scenario-identities.tsv lists every UI target UUID. diagnostics.txt records completeness warnings. Generator validation and roundtrip are not desktop paint or native acceptance. diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-preflight/bound-nested-calls.arcadia b/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-preflight/bound-nested-calls.arcadia new file mode 100644 index 00000000..45d95f6d --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-preflight/bound-nested-calls.arcadia @@ -0,0 +1,486 @@ +arcadia 7; +project bound_nested_calls "Bound nested pressure checks" id "21b00d00-0000-4000-8000-000000000001" { + description "Native activation acceptance. Requested 420/380 kPa, measured 418/378 kPa. Unicode readback: Δ pressure · 戻り値."; + + oa_activity bound_100 "Review pressure demand" id "21b00d00-0000-4000-8000-000000000064" { + description ""; + parent none; + } + + oa_activity bound_101 "Inspect pressure" id "21b00d00-0000-4000-8000-000000000065" { + description ""; + parent none; + } + + oa_exchange_item bound_110 "Check pressure" id "21b00d00-0000-4000-8000-00000000006e" { + description ""; + kind Information; + mechanism Operation; + parent none; + supertype none; + } + + oa_data_field bound_111 "requested_pressure" id "21b00d00-0000-4000-8000-00000000006f" { + default none; + description ""; + direction In; + maximum 1; + minimum 1; + parent @bound_110; + storage Value; + type_ref Real; + unit "kPa"; + } + + oa_data_field bound_112 "measured_pressure" id "21b00d00-0000-4000-8000-000000000070" { + default none; + description ""; + direction Return; + maximum 1; + minimum 1; + parent @bound_110; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_actor bound_200 "Operator console" id "21b00d00-0000-4000-8000-0000000000c8" { + description ""; + parent none; + } + + sa_system bound_201 "Pressure service" id "21b00d00-0000-4000-8000-0000000000c9" { + description ""; + parent none; + } + + sa_port bound_202 "Client socket" id "21b00d00-0000-4000-8000-0000000000ca" { + contract { + Component { + kind Standard; + orientation Unset; + }; + }; + description ""; + legacy none; + parent @bound_200; + } + + sa_port bound_203 "Service socket" id "21b00d00-0000-4000-8000-0000000000cb" { + contract { + Component { + kind Standard; + orientation Unset; + }; + }; + description ""; + legacy none; + parent @bound_201; + } + + sa_exchange_item bound_210 "Check pressure" id "21b00d00-0000-4000-8000-0000000000d2" { + description ""; + kind Information; + mechanism Operation; + parent none; + supertype none; + } + + sa_data_field bound_211 "requested_pressure" id "21b00d00-0000-4000-8000-0000000000d3" { + default none; + description ""; + direction In; + maximum 1; + minimum 1; + parent @bound_210; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_data_field bound_212 "measured_pressure" id "21b00d00-0000-4000-8000-0000000000d4" { + default none; + description ""; + direction Return; + maximum 1; + minimum 1; + parent @bound_210; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_interface bound_213 "Pressure check API" id "21b00d00-0000-4000-8000-0000000000d5" { + description ""; + parent none; + supertype none; + } + + oa_scenario bound_1000 "OA Nested pressure checks" id "21b00d00-0000-4000-8000-0000000003e8" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_1040, @bound_1030, @bound_1060, @bound_1050]; + viewpoint OperationalActivity; + } + + oa_lifeline bound_1001 "L1 Console" id "21b00d00-0000-4000-8000-0000000003e9" { + description ""; + parent @bound_1000; + represented @bound_100; + } + + oa_lifeline bound_1002 "L2 Inspector" id "21b00d00-0000-4000-8000-0000000003ea" { + description ""; + parent @bound_1000; + represented @bound_101; + } + + oa_occurrence bound_1030 "C2 380 kPa" id "21b00d00-0000-4000-8000-000000000406" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_1002; + reply_to none; + sender @bound_1001; + values [{ + expression "380.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1040 "C1 420 kPa" id "21b00d00-0000-4000-8000-000000000410" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_1002; + reply_to none; + sender @bound_1001; + values [{ + expression "420.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1050 "R1 418 kPa" id "21b00d00-0000-4000-8000-00000000041a" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_1001; + reply_to @bound_1040; + sender @bound_1002; + values [{ + expression "418.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1060 "R2 378 kPa" id "21b00d00-0000-4000-8000-000000000424" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_1001; + reply_to @bound_1030; + sender @bound_1002; + values [{ + expression "378.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + sa_scenario bound_2000 "SA Nested pressure checks" id "21b00d00-0000-4000-8000-0000000007d0" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_2040, @bound_2030, @bound_2060, @bound_2050]; + viewpoint BoundaryInterface; + } + + sa_lifeline bound_2001 "L1 Console" id "21b00d00-0000-4000-8000-0000000007d1" { + description ""; + parent @bound_2000; + represented @bound_200; + } + + sa_lifeline bound_2002 "L2 Inspector" id "21b00d00-0000-4000-8000-0000000007d2" { + description ""; + parent @bound_2000; + represented @bound_201; + } + + sa_occurrence bound_2030 "C2 380 kPa" id "21b00d00-0000-4000-8000-0000000007ee" { + body { + Exchange { + exchange @bound_223; + message_kind Call; + operation { + allocation @bound_220; + }; + receiver @bound_2002; + reply_to none; + sender @bound_2001; + values [{ + expression "380.0"; + field @bound_211; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2040 "C1 420 kPa" id "21b00d00-0000-4000-8000-0000000007f8" { + body { + Exchange { + exchange @bound_223; + message_kind Call; + operation { + allocation @bound_220; + }; + receiver @bound_2002; + reply_to none; + sender @bound_2001; + values [{ + expression "420.0"; + field @bound_211; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2050 "R1 418 kPa" id "21b00d00-0000-4000-8000-000000000802" { + body { + Exchange { + exchange @bound_223; + message_kind Reply; + receiver @bound_2001; + reply_to @bound_2040; + sender @bound_2002; + values [{ + expression "418.0"; + field @bound_212; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2060 "R2 378 kPa" id "21b00d00-0000-4000-8000-00000000080c" { + body { + Exchange { + exchange @bound_223; + message_kind Reply; + receiver @bound_2001; + reply_to @bound_2030; + sender @bound_2002; + values [{ + expression "378.0"; + field @bound_212; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + oa_scenario bound_3000 "OA Reentrant pressure review" id "21b00d00-0000-4000-8000-000000000bb8" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_3040, @bound_3030, @bound_3060, @bound_3050]; + viewpoint OperationalActivity; + } + + oa_lifeline bound_3001 "L1 Console" id "21b00d00-0000-4000-8000-000000000bb9" { + description ""; + parent @bound_3000; + represented @bound_100; + } + + oa_lifeline bound_3002 "L2 Inspector" id "21b00d00-0000-4000-8000-000000000bba" { + description ""; + parent @bound_3000; + represented @bound_101; + } + + oa_occurrence bound_3030 "C2 380 kPa" id "21b00d00-0000-4000-8000-000000000bd6" { + body { + Exchange { + exchange @bound_121; + message_kind Call; + receiver @bound_3001; + reply_to none; + sender @bound_3002; + values [{ + expression "380.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3040 "C1 420 kPa" id "21b00d00-0000-4000-8000-000000000be0" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_3002; + reply_to none; + sender @bound_3001; + values [{ + expression "420.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3050 "R1 418 kPa" id "21b00d00-0000-4000-8000-000000000bea" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_3001; + reply_to @bound_3040; + sender @bound_3002; + values [{ + expression "418.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3060 "R2 378 kPa" id "21b00d00-0000-4000-8000-000000000bf4" { + body { + Exchange { + exchange @bound_121; + message_kind Reply; + receiver @bound_3002; + reply_to @bound_3030; + sender @bound_3001; + values [{ + expression "378.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + interaction bound_120 "Pressure check" id "21b00d00-0000-4000-8000-000000000078" { + description ""; + items [@bound_110]; + source @bound_100; + target @bound_101; + } + + interaction bound_121 "Demand review callback" id "21b00d00-0000-4000-8000-000000000079" { + description ""; + items [@bound_110]; + source @bound_101; + target @bound_100; + } + + interface_item_allocation bound_220 "Synchronous pressure check" id "21b00d00-0000-4000-8000-0000000000dc" { + acquisition Unspecified; + description ""; + order 0; + source @bound_213; + target @bound_210; + transmission Synchronous; + } + + interface_requirement bound_221 "Console requires check" id "21b00d00-0000-4000-8000-0000000000dd" { + description ""; + source @bound_202; + target @bound_213; + } + + interface_provision bound_222 "Service provides check" id "21b00d00-0000-4000-8000-0000000000de" { + description ""; + source @bound_203; + target @bound_213; + } + + boundary_exchange bound_223 "Pressure channel" id "21b00d00-0000-4000-8000-0000000000df" { + description ""; + items [@bound_210]; + oriented false; + source @bound_202; + target @bound_203; + } + +} diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-preflight/diagnostics.txt b/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-preflight/diagnostics.txt new file mode 100644 index 00000000..b026a721 --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-preflight/diagnostics.txt @@ -0,0 +1,24 @@ +[ + Issue { + severity: Warning, + element: Some( + 21b00d00-0000-4000-8000-000000000064, + ), + code: "unallocated_leaf", + field: Some( + "allocation", + ), + message: "Allocate leaf 'Review pressure demand' to a performer.", + }, + Issue { + severity: Warning, + element: Some( + 21b00d00-0000-4000-8000-000000000065, + ), + code: "unallocated_leaf", + field: Some( + "allocation", + ), + message: "Allocate leaf 'Inspect pressure' to a performer.", + }, +] diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-preflight/scenario-identities.tsv b/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-preflight/scenario-identities.tsv new file mode 100644 index 00000000..7cd0cd19 --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-preflight/scenario-identities.tsv @@ -0,0 +1,4 @@ +scenario owner L1 L2 C1 C2 R2 R1 +OA Nested pressure checks 21b00d00-0000-4000-8000-0000000003e8 21b00d00-0000-4000-8000-0000000003e9 21b00d00-0000-4000-8000-0000000003ea 21b00d00-0000-4000-8000-000000000410 21b00d00-0000-4000-8000-000000000406 21b00d00-0000-4000-8000-000000000424 21b00d00-0000-4000-8000-00000000041a +SA Nested pressure checks 21b00d00-0000-4000-8000-0000000007d0 21b00d00-0000-4000-8000-0000000007d1 21b00d00-0000-4000-8000-0000000007d2 21b00d00-0000-4000-8000-0000000007f8 21b00d00-0000-4000-8000-0000000007ee 21b00d00-0000-4000-8000-00000000080c 21b00d00-0000-4000-8000-000000000802 +OA Reentrant pressure review 21b00d00-0000-4000-8000-000000000bb8 21b00d00-0000-4000-8000-000000000bb9 21b00d00-0000-4000-8000-000000000bba 21b00d00-0000-4000-8000-000000000be0 21b00d00-0000-4000-8000-000000000bd6 21b00d00-0000-4000-8000-000000000bf4 21b00d00-0000-4000-8000-000000000bea diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-save/README.md b/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-save/README.md new file mode 100644 index 00000000..0d1642e3 --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-save/README.md @@ -0,0 +1 @@ +Open bound-nested-calls.arcadia. In Behavior select OA Nested pressure checks, SA Nested pressure checks, or OA Reentrant pressure review. Each has two lifelines and four rows ordered C1,C2,R2,R1. C1 requests 420.0 kPa and R1 returns 418.0; C2 requests 380.0 and R2 returns 378.0. The SA messages resolve an actual synchronous interface-operation allocation; Replies derive it from their exact Calls. OA uses a bound Interaction carrying an Operation item without SA-only OperationUse. The reentrant case uses an explicit reverse Interaction for C2/R2. Check unselected bars, both reply ends, each bar's selection, Properties values/correlation, source parity and save/reopen. scenario-identities.tsv lists every UI target UUID. diagnostics.txt records completeness warnings. Generator validation and roundtrip are not desktop paint or native acceptance. diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-save/bound-nested-calls.arcadia b/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-save/bound-nested-calls.arcadia new file mode 100644 index 00000000..45d95f6d --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-save/bound-nested-calls.arcadia @@ -0,0 +1,486 @@ +arcadia 7; +project bound_nested_calls "Bound nested pressure checks" id "21b00d00-0000-4000-8000-000000000001" { + description "Native activation acceptance. Requested 420/380 kPa, measured 418/378 kPa. Unicode readback: Δ pressure · 戻り値."; + + oa_activity bound_100 "Review pressure demand" id "21b00d00-0000-4000-8000-000000000064" { + description ""; + parent none; + } + + oa_activity bound_101 "Inspect pressure" id "21b00d00-0000-4000-8000-000000000065" { + description ""; + parent none; + } + + oa_exchange_item bound_110 "Check pressure" id "21b00d00-0000-4000-8000-00000000006e" { + description ""; + kind Information; + mechanism Operation; + parent none; + supertype none; + } + + oa_data_field bound_111 "requested_pressure" id "21b00d00-0000-4000-8000-00000000006f" { + default none; + description ""; + direction In; + maximum 1; + minimum 1; + parent @bound_110; + storage Value; + type_ref Real; + unit "kPa"; + } + + oa_data_field bound_112 "measured_pressure" id "21b00d00-0000-4000-8000-000000000070" { + default none; + description ""; + direction Return; + maximum 1; + minimum 1; + parent @bound_110; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_actor bound_200 "Operator console" id "21b00d00-0000-4000-8000-0000000000c8" { + description ""; + parent none; + } + + sa_system bound_201 "Pressure service" id "21b00d00-0000-4000-8000-0000000000c9" { + description ""; + parent none; + } + + sa_port bound_202 "Client socket" id "21b00d00-0000-4000-8000-0000000000ca" { + contract { + Component { + kind Standard; + orientation Unset; + }; + }; + description ""; + legacy none; + parent @bound_200; + } + + sa_port bound_203 "Service socket" id "21b00d00-0000-4000-8000-0000000000cb" { + contract { + Component { + kind Standard; + orientation Unset; + }; + }; + description ""; + legacy none; + parent @bound_201; + } + + sa_exchange_item bound_210 "Check pressure" id "21b00d00-0000-4000-8000-0000000000d2" { + description ""; + kind Information; + mechanism Operation; + parent none; + supertype none; + } + + sa_data_field bound_211 "requested_pressure" id "21b00d00-0000-4000-8000-0000000000d3" { + default none; + description ""; + direction In; + maximum 1; + minimum 1; + parent @bound_210; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_data_field bound_212 "measured_pressure" id "21b00d00-0000-4000-8000-0000000000d4" { + default none; + description ""; + direction Return; + maximum 1; + minimum 1; + parent @bound_210; + storage Value; + type_ref Real; + unit "kPa"; + } + + sa_interface bound_213 "Pressure check API" id "21b00d00-0000-4000-8000-0000000000d5" { + description ""; + parent none; + supertype none; + } + + oa_scenario bound_1000 "OA Nested pressure checks" id "21b00d00-0000-4000-8000-0000000003e8" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_1040, @bound_1030, @bound_1060, @bound_1050]; + viewpoint OperationalActivity; + } + + oa_lifeline bound_1001 "L1 Console" id "21b00d00-0000-4000-8000-0000000003e9" { + description ""; + parent @bound_1000; + represented @bound_100; + } + + oa_lifeline bound_1002 "L2 Inspector" id "21b00d00-0000-4000-8000-0000000003ea" { + description ""; + parent @bound_1000; + represented @bound_101; + } + + oa_occurrence bound_1030 "C2 380 kPa" id "21b00d00-0000-4000-8000-000000000406" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_1002; + reply_to none; + sender @bound_1001; + values [{ + expression "380.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1040 "C1 420 kPa" id "21b00d00-0000-4000-8000-000000000410" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_1002; + reply_to none; + sender @bound_1001; + values [{ + expression "420.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1050 "R1 418 kPa" id "21b00d00-0000-4000-8000-00000000041a" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_1001; + reply_to @bound_1040; + sender @bound_1002; + values [{ + expression "418.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_1060 "R2 378 kPa" id "21b00d00-0000-4000-8000-000000000424" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_1001; + reply_to @bound_1030; + sender @bound_1002; + values [{ + expression "378.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_1000; + postcondition ""; + precondition ""; + } + + sa_scenario bound_2000 "SA Nested pressure checks" id "21b00d00-0000-4000-8000-0000000007d0" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_2040, @bound_2030, @bound_2060, @bound_2050]; + viewpoint BoundaryInterface; + } + + sa_lifeline bound_2001 "L1 Console" id "21b00d00-0000-4000-8000-0000000007d1" { + description ""; + parent @bound_2000; + represented @bound_200; + } + + sa_lifeline bound_2002 "L2 Inspector" id "21b00d00-0000-4000-8000-0000000007d2" { + description ""; + parent @bound_2000; + represented @bound_201; + } + + sa_occurrence bound_2030 "C2 380 kPa" id "21b00d00-0000-4000-8000-0000000007ee" { + body { + Exchange { + exchange @bound_223; + message_kind Call; + operation { + allocation @bound_220; + }; + receiver @bound_2002; + reply_to none; + sender @bound_2001; + values [{ + expression "380.0"; + field @bound_211; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2040 "C1 420 kPa" id "21b00d00-0000-4000-8000-0000000007f8" { + body { + Exchange { + exchange @bound_223; + message_kind Call; + operation { + allocation @bound_220; + }; + receiver @bound_2002; + reply_to none; + sender @bound_2001; + values [{ + expression "420.0"; + field @bound_211; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2050 "R1 418 kPa" id "21b00d00-0000-4000-8000-000000000802" { + body { + Exchange { + exchange @bound_223; + message_kind Reply; + receiver @bound_2001; + reply_to @bound_2040; + sender @bound_2002; + values [{ + expression "418.0"; + field @bound_212; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + sa_occurrence bound_2060 "R2 378 kPa" id "21b00d00-0000-4000-8000-00000000080c" { + body { + Exchange { + exchange @bound_223; + message_kind Reply; + receiver @bound_2001; + reply_to @bound_2030; + sender @bound_2002; + values [{ + expression "378.0"; + field @bound_212; + path []; + }]; + }; + }; + description ""; + parent @bound_2000; + postcondition ""; + precondition ""; + } + + oa_scenario bound_3000 "OA Reentrant pressure review" id "21b00d00-0000-4000-8000-000000000bb8" { + context none; + description ""; + parent none; + postcondition "Each reply retains its own requested and measured values"; + precondition "Two pressure checks are reviewed before the outer reply"; + steps [@bound_3040, @bound_3030, @bound_3060, @bound_3050]; + viewpoint OperationalActivity; + } + + oa_lifeline bound_3001 "L1 Console" id "21b00d00-0000-4000-8000-000000000bb9" { + description ""; + parent @bound_3000; + represented @bound_100; + } + + oa_lifeline bound_3002 "L2 Inspector" id "21b00d00-0000-4000-8000-000000000bba" { + description ""; + parent @bound_3000; + represented @bound_101; + } + + oa_occurrence bound_3030 "C2 380 kPa" id "21b00d00-0000-4000-8000-000000000bd6" { + body { + Exchange { + exchange @bound_121; + message_kind Call; + receiver @bound_3001; + reply_to none; + sender @bound_3002; + values [{ + expression "380.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3040 "C1 420 kPa" id "21b00d00-0000-4000-8000-000000000be0" { + body { + Exchange { + exchange @bound_120; + message_kind Call; + receiver @bound_3002; + reply_to none; + sender @bound_3001; + values [{ + expression "420.0"; + field @bound_111; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3050 "R1 418 kPa" id "21b00d00-0000-4000-8000-000000000bea" { + body { + Exchange { + exchange @bound_120; + message_kind Reply; + receiver @bound_3001; + reply_to @bound_3040; + sender @bound_3002; + values [{ + expression "418.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + oa_occurrence bound_3060 "R2 378 kPa" id "21b00d00-0000-4000-8000-000000000bf4" { + body { + Exchange { + exchange @bound_121; + message_kind Reply; + receiver @bound_3002; + reply_to @bound_3030; + sender @bound_3001; + values [{ + expression "378.0"; + field @bound_112; + path []; + }]; + }; + }; + description ""; + parent @bound_3000; + postcondition ""; + precondition ""; + } + + interaction bound_120 "Pressure check" id "21b00d00-0000-4000-8000-000000000078" { + description ""; + items [@bound_110]; + source @bound_100; + target @bound_101; + } + + interaction bound_121 "Demand review callback" id "21b00d00-0000-4000-8000-000000000079" { + description ""; + items [@bound_110]; + source @bound_101; + target @bound_100; + } + + interface_item_allocation bound_220 "Synchronous pressure check" id "21b00d00-0000-4000-8000-0000000000dc" { + acquisition Unspecified; + description ""; + order 0; + source @bound_213; + target @bound_210; + transmission Synchronous; + } + + interface_requirement bound_221 "Console requires check" id "21b00d00-0000-4000-8000-0000000000dd" { + description ""; + source @bound_202; + target @bound_213; + } + + interface_provision bound_222 "Service provides check" id "21b00d00-0000-4000-8000-0000000000de" { + description ""; + source @bound_203; + target @bound_213; + } + + boundary_exchange bound_223 "Pressure channel" id "21b00d00-0000-4000-8000-0000000000df" { + description ""; + items [@bound_210]; + oriented false; + source @bound_202; + target @bound_203; + } + +} diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-save/diagnostics.txt b/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-save/diagnostics.txt new file mode 100644 index 00000000..b026a721 --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-save/diagnostics.txt @@ -0,0 +1,24 @@ +[ + Issue { + severity: Warning, + element: Some( + 21b00d00-0000-4000-8000-000000000064, + ), + code: "unallocated_leaf", + field: Some( + "allocation", + ), + message: "Allocate leaf 'Review pressure demand' to a performer.", + }, + Issue { + severity: Warning, + element: Some( + 21b00d00-0000-4000-8000-000000000065, + ), + code: "unallocated_leaf", + field: Some( + "allocation", + ), + message: "Allocate leaf 'Inspect pressure' to a performer.", + }, +] diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-save/scenario-identities.tsv b/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-save/scenario-identities.tsv new file mode 100644 index 00000000..7cd0cd19 --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/checkpoints/bound-save/scenario-identities.tsv @@ -0,0 +1,4 @@ +scenario owner L1 L2 C1 C2 R2 R1 +OA Nested pressure checks 21b00d00-0000-4000-8000-0000000003e8 21b00d00-0000-4000-8000-0000000003e9 21b00d00-0000-4000-8000-0000000003ea 21b00d00-0000-4000-8000-000000000410 21b00d00-0000-4000-8000-000000000406 21b00d00-0000-4000-8000-000000000424 21b00d00-0000-4000-8000-00000000041a +SA Nested pressure checks 21b00d00-0000-4000-8000-0000000007d0 21b00d00-0000-4000-8000-0000000007d1 21b00d00-0000-4000-8000-0000000007d2 21b00d00-0000-4000-8000-0000000007f8 21b00d00-0000-4000-8000-0000000007ee 21b00d00-0000-4000-8000-00000000080c 21b00d00-0000-4000-8000-000000000802 +OA Reentrant pressure review 21b00d00-0000-4000-8000-000000000bb8 21b00d00-0000-4000-8000-000000000bb9 21b00d00-0000-4000-8000-000000000bba 21b00d00-0000-4000-8000-000000000be0 21b00d00-0000-4000-8000-000000000bd6 21b00d00-0000-4000-8000-000000000bf4 21b00d00-0000-4000-8000-000000000bea diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/closure.json b/harness/experiments/canvas-native-d61f1f3-20260912/closure.json new file mode 100644 index 00000000..1b20a21a --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/closure.json @@ -0,0 +1,5 @@ +{ + "utc": "2026-09-12T23:51:20.117333+00:00", + "pid": 10792, + "exit": 0 +} diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/bound-preflight.json b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/bound-preflight.json new file mode 100644 index 00000000..c570ecae --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/bound-preflight.json @@ -0,0 +1,34 @@ +{ + "utc": "2026-09-12T23:25:43.455454+00:00", + "snapshot": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-paint-d61f1f3-20260912-01\\checkpoints\\bound-preflight", + "command": [ + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\delete-oracle-warning-fix-42511f0\\delete-oracle-warning-fix-42511f0.exe", + "same", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-paint-d61f1f3-20260912-01\\bound-baseline\\bound-nested-calls.arcadia", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-paint-d61f1f3-20260912-01\\checkpoints\\bound-preflight\\bound-nested-calls.arcadia" + ], + "checker_sha256": "9796aa73544c6414003e6230a668a6cf1435978a310187ef2560af67e35f3466", + "exit": 0, + "files": [ + { + "path": "bound-nested-calls.arcadia", + "bytes": 14219, + "sha256": "7531ec264ad3f4b343997e3c0b0ac3b539163908b117e32197876decf3dee3dd" + }, + { + "path": "diagnostics.txt", + "bytes": 592, + "sha256": "e2df3656e0fe6185465aced67f6649fc02bd6e584e7cb38b51ad226c9624da00" + }, + { + "path": "README.md", + "bytes": 855, + "sha256": "f5b4e5090ecf28b230bb96f24c58c0566542aae1032c32bbba058aa4eaf79ac5" + }, + { + "path": "scenario-identities.tsv", + "bytes": 891, + "sha256": "fa9cd8bd17a0d16d70e72e76a670e060e64d92ca3bd4a5bd6b92a363393108b0" + } + ] +} diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/bound-preflight.log b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/bound-preflight.log new file mode 100644 index 00000000..586a195b --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/bound-preflight.log @@ -0,0 +1,5 @@ +PASS same: complete Project and exact SourceBundle restored +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-paint-d61f1f3-20260912-01\bound-baseline\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000064), field: Some("allocation"), line: 5, column: 5, message: "Allocate leaf 'Review pressure demand' to a performer.", span: Span { start: 256, end: 397 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-paint-d61f1f3-20260912-01\bound-baseline\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000065), field: Some("allocation"), line: 10, column: 5, message: "Allocate leaf 'Inspect pressure' to a performer.", span: Span { start: 403, end: 538 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-paint-d61f1f3-20260912-01\checkpoints\bound-preflight\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000064), field: Some("allocation"), line: 5, column: 5, message: "Allocate leaf 'Review pressure demand' to a performer.", span: Span { start: 256, end: 397 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-paint-d61f1f3-20260912-01\checkpoints\bound-preflight\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000065), field: Some("allocation"), line: 10, column: 5, message: "Allocate leaf 'Inspect pressure' to a performer.", span: Span { start: 403, end: 538 } }, related: [] } diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/bound-save.json b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/bound-save.json new file mode 100644 index 00000000..0c5c85da --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/bound-save.json @@ -0,0 +1,34 @@ +{ + "utc": "2026-09-12T23:51:02.762212+00:00", + "snapshot": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-paint-d61f1f3-20260912-01\\checkpoints\\bound-save", + "command": [ + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\delete-oracle-warning-fix-42511f0\\delete-oracle-warning-fix-42511f0.exe", + "same", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-paint-d61f1f3-20260912-01\\bound-baseline\\bound-nested-calls.arcadia", + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-paint-d61f1f3-20260912-01\\checkpoints\\bound-save\\bound-nested-calls.arcadia" + ], + "checker_sha256": "9796aa73544c6414003e6230a668a6cf1435978a310187ef2560af67e35f3466", + "exit": 0, + "files": [ + { + "path": "bound-nested-calls.arcadia", + "bytes": 14219, + "sha256": "7531ec264ad3f4b343997e3c0b0ac3b539163908b117e32197876decf3dee3dd" + }, + { + "path": "diagnostics.txt", + "bytes": 592, + "sha256": "e2df3656e0fe6185465aced67f6649fc02bd6e584e7cb38b51ad226c9624da00" + }, + { + "path": "README.md", + "bytes": 855, + "sha256": "f5b4e5090ecf28b230bb96f24c58c0566542aae1032c32bbba058aa4eaf79ac5" + }, + { + "path": "scenario-identities.tsv", + "bytes": 891, + "sha256": "fa9cd8bd17a0d16d70e72e76a670e060e64d92ca3bd4a5bd6b92a363393108b0" + } + ] +} diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/bound-save.log b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/bound-save.log new file mode 100644 index 00000000..23d00db6 --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/bound-save.log @@ -0,0 +1,5 @@ +PASS same: complete Project and exact SourceBundle restored +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-paint-d61f1f3-20260912-01\bound-baseline\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000064), field: Some("allocation"), line: 5, column: 5, message: "Allocate leaf 'Review pressure demand' to a performer.", span: Span { start: 256, end: 397 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-paint-d61f1f3-20260912-01\bound-baseline\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000065), field: Some("allocation"), line: 10, column: 5, message: "Allocate leaf 'Inspect pressure' to a performer.", span: Span { start: 403, end: 538 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-paint-d61f1f3-20260912-01\checkpoints\bound-save\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000064), field: Some("allocation"), line: 5, column: 5, message: "Allocate leaf 'Review pressure demand' to a performer.", span: Span { start: 256, end: 397 } }, related: [] } +Permitted non-error diagnostic in C:\Users\User\Documents\Git\ARCADIA-Studio\.local\native-qa\canvas-paint-d61f1f3-20260912-01\checkpoints\bound-save\bound-nested-calls.arcadia: SourceDiagnostic { path: "bound-nested-calls.arcadia", diagnostic: Diagnostic { severity: Warning, code: "unallocated_leaf", object_id: Some(21b00d00-0000-4000-8000-000000000065), field: Some("allocation"), line: 10, column: 5, message: "Allocate leaf 'Inspect pressure' to a performer.", span: Span { start: 403, end: 538 } }, related: [] } diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/bound-saved-0.png b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/bound-saved-0.png new file mode 100644 index 00000000..33a14f62 Binary files /dev/null and b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/bound-saved-0.png differ diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-c2-exact-receive-endpoint-0.png b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-c2-exact-receive-endpoint-0.png new file mode 100644 index 00000000..d0fc04d7 Binary files /dev/null and b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-c2-exact-receive-endpoint-0.png differ diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-nested-open-0.png b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-nested-open-0.png new file mode 100644 index 00000000..d5ad1d31 Binary files /dev/null and b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-nested-open-0.png differ diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-outer-former-label-shoulder-0.png b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-outer-former-label-shoulder-0.png new file mode 100644 index 00000000..c98c4f71 Binary files /dev/null and b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-outer-former-label-shoulder-0.png differ diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-outer-r1-label-shoulder-0.png b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-outer-r1-label-shoulder-0.png new file mode 100644 index 00000000..4bd42d0f Binary files /dev/null and b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-outer-r1-label-shoulder-0.png differ diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-outer-r2-label-shoulder-0.png b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-outer-r2-label-shoulder-0.png new file mode 100644 index 00000000..6fbefa0d Binary files /dev/null and b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-outer-r2-label-shoulder-0.png differ diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-r1-exact-send-endpoint-0.png b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-r1-exact-send-endpoint-0.png new file mode 100644 index 00000000..b42d71d1 Binary files /dev/null and b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-r1-exact-send-endpoint-0.png differ diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-r2-exact-send-endpoint-0.png b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-r2-exact-send-endpoint-0.png new file mode 100644 index 00000000..88dc2a1e Binary files /dev/null and b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-r2-exact-send-endpoint-0.png differ diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-reentrant-inner-0.png b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-reentrant-inner-0.png new file mode 100644 index 00000000..41c1e961 Binary files /dev/null and b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-reentrant-inner-0.png differ diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-reentrant-open-0.png b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-reentrant-open-0.png new file mode 100644 index 00000000..3ab54a6c Binary files /dev/null and b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-reentrant-open-0.png differ diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-reentrant-outer-label-shoulder-0.png b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-reentrant-outer-label-shoulder-0.png new file mode 100644 index 00000000..43b35886 Binary files /dev/null and b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/oa-reentrant-outer-label-shoulder-0.png differ diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/sa-minimum-100-0.png b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/sa-minimum-100-0.png new file mode 100644 index 00000000..9689157d Binary files /dev/null and b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/sa-minimum-100-0.png differ diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/sa-minimum-fit-0.png b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/sa-minimum-fit-0.png new file mode 100644 index 00000000..90a4f47e Binary files /dev/null and b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/sa-minimum-fit-0.png differ diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/sa-minimum-fit-outer-shoulder-0.png b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/sa-minimum-fit-outer-shoulder-0.png new file mode 100644 index 00000000..00c6cdeb Binary files /dev/null and b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/sa-minimum-fit-outer-shoulder-0.png differ diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/sa-nested-open-0.png b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/sa-nested-open-0.png new file mode 100644 index 00000000..f9097393 Binary files /dev/null and b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/sa-nested-open-0.png differ diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/sa-outer-former-label-shoulder-0.png b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/sa-outer-former-label-shoulder-0.png new file mode 100644 index 00000000..f44049c4 Binary files /dev/null and b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/sa-outer-former-label-shoulder-0.png differ diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/evidence/sa-r2-exact-send-endpoint-0.png b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/sa-r2-exact-send-endpoint-0.png new file mode 100644 index 00000000..d689e852 Binary files /dev/null and b/harness/experiments/canvas-native-d61f1f3-20260912/evidence/sa-r2-exact-send-endpoint-0.png differ diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/launch.json b/harness/experiments/canvas-native-d61f1f3-20260912/launch.json new file mode 100644 index 00000000..ea34ccbf --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/launch.json @@ -0,0 +1,8 @@ +{ + "utc": "2026-09-12T23:46:20.558648+00:00", + "pid": 10792, + "source": "d61f1f38779ab70a77efcde523ae31c432aefcfd", + "binary": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\studio-d61f1f3\\arcadia-studio.exe", + "sha256": "c990fa05772c60666ecf96ab808e6140e57542ad448ddd092b977be0b587136f", + "private_profile": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\canvas-paint-d61f1f3-20260912-01\\profile" +} diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/manifest.json b/harness/experiments/canvas-native-d61f1f3-20260912/manifest.json new file mode 100644 index 00000000..5c2a8889 --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/manifest.json @@ -0,0 +1,301 @@ +{ + "archived_utc": "2026-09-12T23:52:29.397664+00:00", + "source": "d61f1f38779ab70a77efcde523ae31c432aefcfd", + "native_trial": ".local/native-qa/canvas-paint-d61f1f3-20260912-01", + "native_pid": 10792, + "native_exit": 0, + "payload_count": 43, + "payload_bytes": 2197526, + "verified_checkpoint_records": [ + "evidence/bound-preflight.json", + "evidence/bound-save.json" + ], + "verified_baseline_files": 4, + "oracle_binary_identities_not_native_app_source": { + ".local\\native-qa\\delete-oracle-warning-fix-42511f0\\delete-oracle-warning-fix-42511f0.exe": { + "bytes": 20894720, + "sha256": "9796aa73544c6414003e6230a668a6cf1435978a310187ef2560af67e35f3466" + } + }, + "exclusions": [ + "profile", + "temp", + "compact-work", + "bound-work", + "draft-work", + "process-work" + ], + "byte_policy": "Copied source bytes exactly, including CRLF; originals unmodified. Source paths are provenance, not portable execution paths.", + "attributes": { + "rule": "harness/experiments/canvas-native-d61f1f3-20260912/** -text whitespace=-blank-at-eol,-blank-at-eof,cr-at-eol", + "appended": true, + "before": { + "bytes": 5122, + "sha256": "5cbe2b56244991337d230a6372cb5b883bec5cc4a5befa0eeb911d4f8e94103c" + }, + "after": { + "bytes": 5231, + "sha256": "f9be5abd223ea7b344f1ef448ff698591fe082dd5a156eee9c21da97956b6959" + } + }, + "files": [ + { + "path": "preparation.json", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/preparation.json", + "bytes": 4762, + "sha256": "25a6bfe79aa664c5699010eb3b3027a6fa0211d572513c80723812458db27e87" + }, + { + "path": "launch.json", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/launch.json", + "bytes": 452, + "sha256": "7e3f9aa0a39e6ecd22bb0e2fc0eb8b859c2522c2497a62b9f1ed8edb1d4d6d38" + }, + { + "path": "closure.json", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/closure.json", + "bytes": 77, + "sha256": "0d16d4feece158bdc3ac69370f3f0c55fed9c455cab03b203eebceef94a3c7f3" + }, + { + "path": "stdout.log", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/stdout.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "stderr.log", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/stderr.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "evidence/bound-preflight.json", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/bound-preflight.json", + "bytes": 1422, + "sha256": "70299b0695db9df0685ad3ed1429f76c070b827a1a1c6a7e6aa8bec0b1f7e754" + }, + { + "path": "evidence/bound-preflight.log", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/bound-preflight.log", + "bytes": 2144, + "sha256": "0824efede4fdbe3e9bd3bd016bad943894a4d48350445ba4d2ff39f5d0205ca0" + }, + { + "path": "evidence/bound-save.json", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/bound-save.json", + "bytes": 1412, + "sha256": "7f8eba05d62025bcd7c4f4cb2eff39cbf4212bffebf5786e5bcfb3a6c33698a6" + }, + { + "path": "evidence/bound-save.log", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/bound-save.log", + "bytes": 2134, + "sha256": "3981a3c0d3968965fd616b1954754d78557844200ad564a099953a3df536679d" + }, + { + "path": "evidence/bound-saved-0.png", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/bound-saved-0.png", + "bytes": 95264, + "sha256": "3d53c1adc140f3ac1827f4cdc66ff3ee6dee7af565395719e31c6c3f0a31840a" + }, + { + "path": "evidence/oa-c2-exact-receive-endpoint-0.png", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/oa-c2-exact-receive-endpoint-0.png", + "bytes": 127788, + "sha256": "03b2dc8528106a5ee91cc27122060f484045d226d92453269f50dd53507804d6" + }, + { + "path": "evidence/oa-nested-open-0.png", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/oa-nested-open-0.png", + "bytes": 113284, + "sha256": "74c6fa4c51f3505acbf84ab4d418f39efabac93355dd18d6c076b612ca747691" + }, + { + "path": "evidence/oa-outer-former-label-shoulder-0.png", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/oa-outer-former-label-shoulder-0.png", + "bytes": 128308, + "sha256": "76644f3ca1556ffce975da43f4b7a72bd29dbdfa9ed31a119bfca2dd034d403b" + }, + { + "path": "evidence/oa-outer-r1-label-shoulder-0.png", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/oa-outer-r1-label-shoulder-0.png", + "bytes": 128380, + "sha256": "8009cc858594c806c0ffa35b11a25422746d18c0d8fb6eb781094aa8c12a87f0" + }, + { + "path": "evidence/oa-outer-r2-label-shoulder-0.png", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/oa-outer-r2-label-shoulder-0.png", + "bytes": 128425, + "sha256": "0cb0a639568fb818384350afcd64ec28ebc2d0c335428bf4ae42d945a2d51cc7" + }, + { + "path": "evidence/oa-r1-exact-send-endpoint-0.png", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/oa-r1-exact-send-endpoint-0.png", + "bytes": 127600, + "sha256": "1cc3a5dc93eec147967cd47a0b017c1e04f3726495d4d85d90aa18aa39df9747" + }, + { + "path": "evidence/oa-r2-exact-send-endpoint-0.png", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/oa-r2-exact-send-endpoint-0.png", + "bytes": 127597, + "sha256": "7362063ebc1eef40b65f0ffb196e69f7fddc49b9b4acfb998572911c24ed1aa3" + }, + { + "path": "evidence/oa-reentrant-inner-0.png", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/oa-reentrant-inner-0.png", + "bytes": 127485, + "sha256": "c9a0e4015a685a096d21fd327a9823f17fb5f2626ed082a28d2ef43ccddbd2b7" + }, + { + "path": "evidence/oa-reentrant-open-0.png", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/oa-reentrant-open-0.png", + "bytes": 124034, + "sha256": "8973dc2f53f6f2c09554dc5a3aaab14838bb89d87fb7b1bb91f29f0503afeea9" + }, + { + "path": "evidence/oa-reentrant-outer-label-shoulder-0.png", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/oa-reentrant-outer-label-shoulder-0.png", + "bytes": 128322, + "sha256": "90d392b8810397de393185cfa348e4732e3e0cb5c2df20ea78e4e19053f6e146" + }, + { + "path": "evidence/sa-minimum-100-0.png", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/sa-minimum-100-0.png", + "bytes": 100472, + "sha256": "a5cac454e4260006721c25814861b58a7184fd8af826ba2607ba5ffbaa312b37" + }, + { + "path": "evidence/sa-minimum-fit-0.png", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/sa-minimum-fit-0.png", + "bytes": 98600, + "sha256": "4598f7d76e44ced05f4ae001f953f6b8cf239c6e59ea5a1ca3dd3ab8b6007202" + }, + { + "path": "evidence/sa-minimum-fit-outer-shoulder-0.png", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/sa-minimum-fit-outer-shoulder-0.png", + "bytes": 97409, + "sha256": "72c69c67d2caf8882c6aa30e154ef0dee019cdf61863b006c49b9f9a530e7c93" + }, + { + "path": "evidence/sa-nested-open-0.png", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/sa-nested-open-0.png", + "bytes": 112458, + "sha256": "1c366fb9b8b0fa6eba38caf41d1f3a178d7fb50b96c7d0ba33141d5208954293" + }, + { + "path": "evidence/sa-outer-former-label-shoulder-0.png", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/sa-outer-former-label-shoulder-0.png", + "bytes": 127185, + "sha256": "2ec44dca9200f942883cb37acb8651ef0b5f07dbced84c78b9c6e582df157dfb" + }, + { + "path": "evidence/sa-r2-exact-send-endpoint-0.png", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/evidence/sa-r2-exact-send-endpoint-0.png", + "bytes": 126469, + "sha256": "aa50d6c2d2dd29170d267eaf369bec5a176f939941c9ad3460cb8c55c5c26401" + }, + { + "path": "checkpoints/bound-preflight/bound-nested-calls.arcadia", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/checkpoints/bound-preflight/bound-nested-calls.arcadia", + "bytes": 14219, + "sha256": "7531ec264ad3f4b343997e3c0b0ac3b539163908b117e32197876decf3dee3dd" + }, + { + "path": "checkpoints/bound-preflight/diagnostics.txt", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/checkpoints/bound-preflight/diagnostics.txt", + "bytes": 592, + "sha256": "e2df3656e0fe6185465aced67f6649fc02bd6e584e7cb38b51ad226c9624da00" + }, + { + "path": "checkpoints/bound-preflight/README.md", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/checkpoints/bound-preflight/README.md", + "bytes": 855, + "sha256": "f5b4e5090ecf28b230bb96f24c58c0566542aae1032c32bbba058aa4eaf79ac5" + }, + { + "path": "checkpoints/bound-preflight/scenario-identities.tsv", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/checkpoints/bound-preflight/scenario-identities.tsv", + "bytes": 891, + "sha256": "fa9cd8bd17a0d16d70e72e76a670e060e64d92ca3bd4a5bd6b92a363393108b0" + }, + { + "path": "checkpoints/bound-save/bound-nested-calls.arcadia", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/checkpoints/bound-save/bound-nested-calls.arcadia", + "bytes": 14219, + "sha256": "7531ec264ad3f4b343997e3c0b0ac3b539163908b117e32197876decf3dee3dd" + }, + { + "path": "checkpoints/bound-save/diagnostics.txt", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/checkpoints/bound-save/diagnostics.txt", + "bytes": 592, + "sha256": "e2df3656e0fe6185465aced67f6649fc02bd6e584e7cb38b51ad226c9624da00" + }, + { + "path": "checkpoints/bound-save/README.md", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/checkpoints/bound-save/README.md", + "bytes": 855, + "sha256": "f5b4e5090ecf28b230bb96f24c58c0566542aae1032c32bbba058aa4eaf79ac5" + }, + { + "path": "checkpoints/bound-save/scenario-identities.tsv", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/checkpoints/bound-save/scenario-identities.tsv", + "bytes": 891, + "sha256": "fa9cd8bd17a0d16d70e72e76a670e060e64d92ca3bd4a5bd6b92a363393108b0" + }, + { + "path": "bound-baseline/bound-nested-calls.arcadia", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/bound-baseline/bound-nested-calls.arcadia", + "bytes": 14219, + "sha256": "7531ec264ad3f4b343997e3c0b0ac3b539163908b117e32197876decf3dee3dd" + }, + { + "path": "bound-baseline/diagnostics.txt", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/bound-baseline/diagnostics.txt", + "bytes": 592, + "sha256": "e2df3656e0fe6185465aced67f6649fc02bd6e584e7cb38b51ad226c9624da00" + }, + { + "path": "bound-baseline/README.md", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/bound-baseline/README.md", + "bytes": 855, + "sha256": "f5b4e5090ecf28b230bb96f24c58c0566542aae1032c32bbba058aa4eaf79ac5" + }, + { + "path": "bound-baseline/scenario-identities.tsv", + "source_path": ".local/native-qa/canvas-paint-d61f1f3-20260912-01/bound-baseline/scenario-identities.tsv", + "bytes": 891, + "sha256": "fa9cd8bd17a0d16d70e72e76a670e060e64d92ca3bd4a5bd6b92a363393108b0" + }, + { + "path": "tools/canvas-native-paint-session.py", + "source_path": ".local/canvas-native-paint-session.py", + "bytes": 4533, + "sha256": "11ac1c2ea1f5833100e2bd025503167fa12708c8c1dec0fc34c9f6c8a4577777" + }, + { + "path": "tools/canvas-paint-checkpoint.py", + "source_path": ".local/canvas-paint-checkpoint.py", + "bytes": 426, + "sha256": "9d96e3b142af80e056765598e3a335ec9c57af44df10b371489561513cc3fec2" + }, + { + "path": "tools/canvas-native-checkpoint.py", + "source_path": ".local/canvas-native-checkpoint.py", + "bytes": 2063, + "sha256": "c342ed76271bf698b34f1879df695c0c9e1564e03b9459f9f6f9d857d680c6c5" + }, + { + "path": "tools/archive-canvas-native-d61f1f3.py", + "source_path": ".local/archive-canvas-native-d61f1f3.py", + "bytes": 7646, + "sha256": "1c1cefa2007dbd15171ee4fab9a7ffa1641da0d32c500934c8ea5a0f25af1dc0" + }, + { + "path": "stage/manifest.json", + "source_path": ".local/native-qa/studio-d61f1f3/manifest.json", + "bytes": 101704, + "sha256": "61127e68a03aa8ee3883dee04e0f1f3d5f5c01f48f1b637ed5f007de04fa44cc" + } + ] +} diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/preparation.json b/harness/experiments/canvas-native-d61f1f3-20260912/preparation.json new file mode 100644 index 00000000..1327de8f --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/preparation.json @@ -0,0 +1,107 @@ +{ + "utc": "2026-09-12T23:09:12.709493+00:00", + "files": [ + { + "path": "compact-baseline/notes.arcadia", + "source": ".local\\native-qa\\delete-20260912\\compact-baseline-v2\\notes.arcadia", + "bytes": 60, + "sha256": "adb1445555f1f47cf2ac92e2271e54df7c5d2eaf1d9363fe5a79d02298670a4e" + }, + { + "path": "compact-baseline/project.arcadia", + "source": ".local\\native-qa\\delete-20260912\\compact-baseline-v2\\project.arcadia", + "bytes": 5566, + "sha256": "246e7316f3932df2bc64c70459352ecef2a7fe2b5d8ead03d1f5664587c813bf" + }, + { + "path": "compact-work/notes.arcadia", + "source": ".local\\native-qa\\delete-20260912\\compact-baseline-v2\\notes.arcadia", + "bytes": 60, + "sha256": "adb1445555f1f47cf2ac92e2271e54df7c5d2eaf1d9363fe5a79d02298670a4e" + }, + { + "path": "compact-work/project.arcadia", + "source": ".local\\native-qa\\delete-20260912\\compact-baseline-v2\\project.arcadia", + "bytes": 5566, + "sha256": "246e7316f3932df2bc64c70459352ecef2a7fe2b5d8ead03d1f5664587c813bf" + }, + { + "path": "bound-baseline/bound-nested-calls.arcadia", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\bound-nested-fixture-r1-20260912\\bound-nested-calls.arcadia", + "bytes": 14219, + "sha256": "7531ec264ad3f4b343997e3c0b0ac3b539163908b117e32197876decf3dee3dd" + }, + { + "path": "bound-baseline/diagnostics.txt", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\bound-nested-fixture-r1-20260912\\diagnostics.txt", + "bytes": 592, + "sha256": "e2df3656e0fe6185465aced67f6649fc02bd6e584e7cb38b51ad226c9624da00" + }, + { + "path": "bound-baseline/README.md", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\bound-nested-fixture-r1-20260912\\README.md", + "bytes": 855, + "sha256": "f5b4e5090ecf28b230bb96f24c58c0566542aae1032c32bbba058aa4eaf79ac5" + }, + { + "path": "bound-baseline/scenario-identities.tsv", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\bound-nested-fixture-r1-20260912\\scenario-identities.tsv", + "bytes": 891, + "sha256": "fa9cd8bd17a0d16d70e72e76a670e060e64d92ca3bd4a5bd6b92a363393108b0" + }, + { + "path": "bound-work/bound-nested-calls.arcadia", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\bound-nested-fixture-r1-20260912\\bound-nested-calls.arcadia", + "bytes": 14219, + "sha256": "7531ec264ad3f4b343997e3c0b0ac3b539163908b117e32197876decf3dee3dd" + }, + { + "path": "bound-work/diagnostics.txt", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\bound-nested-fixture-r1-20260912\\diagnostics.txt", + "bytes": 592, + "sha256": "e2df3656e0fe6185465aced67f6649fc02bd6e584e7cb38b51ad226c9624da00" + }, + { + "path": "bound-work/README.md", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\bound-nested-fixture-r1-20260912\\README.md", + "bytes": 855, + "sha256": "f5b4e5090ecf28b230bb96f24c58c0566542aae1032c32bbba058aa4eaf79ac5" + }, + { + "path": "bound-work/scenario-identities.tsv", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\bound-nested-fixture-r1-20260912\\scenario-identities.tsv", + "bytes": 891, + "sha256": "fa9cd8bd17a0d16d70e72e76a670e060e64d92ca3bd4a5bd6b92a363393108b0" + }, + { + "path": "draft-work/diagnostics.txt", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\nested-call-fixture-20260912\\diagnostics.txt", + "bytes": 20426, + "sha256": "2651c90057ba8ce46b9331a0fb05206e3d744928d40c63232775123282c52698" + }, + { + "path": "draft-work/nested-call-evaluator.arcadia", + "source": "harness\\experiments\\canvas-editing-followup-20260912\\nested-call-fixture-20260912\\nested-call-evaluator.arcadia", + "bytes": 50095, + "sha256": "ee8eec6459f28a11dcd25736e3147d6a0e153e22ecc8a4c8a3c61e4494ca2835" + }, + { + "path": "process-work/expected-baseline.json", + "source": "harness\\fixtures\\source7-native\\base\\expected-baseline.json", + "bytes": 26428, + "sha256": "e2882a58f841f460f45d9d67db1606440e0d7997b9b29a784569ae48e4b23bfb" + }, + { + "path": "process-work/project.arcadia", + "source": "harness\\fixtures\\source7-native\\base\\project.arcadia", + "bytes": 13616, + "sha256": "5474d8ca05fd1375220dc0ad40d913631fde51159e9632bb9f290d1ecdab8dd7" + }, + { + "path": "process-work/rationale.arcadia", + "source": "harness\\fixtures\\source7-native\\base\\rationale.arcadia", + "bytes": 59, + "sha256": "e6a600e13036d4ad594a65380ed1b3d82d1772d583041bb0a624c9588a73047a" + } + ] +} diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/stage/manifest.json b/harness/experiments/canvas-native-d61f1f3-20260912/stage/manifest.json new file mode 100644 index 00000000..5fb348df --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/stage/manifest.json @@ -0,0 +1,2754 @@ +{ + "source": "d61f1f38779ab70a77efcde523ae31c432aefcfd", + "full_test_source": "d61f1f38779ab70a77efcde523ae31c432aefcfd", + "staged_utc": "2026-09-12T23:45:49.098192+00:00", + "test_only_correction": null, + "toolchain": "Rust/Cargo 1.98.1 Windows gnullvm; LLVM-MinGW 20260908; jobs 1", + "results": { + "clippy": { + "source": "d61f1f38779ab70a77efcde523ae31c432aefcfd", + "start": "2026-09-12T23:39:55.430462+00:00", + "end": "2026-09-12T23:42:36.745359+00:00", + "exit": 0, + "command": [ + "cargo", + "clippy", + "--locked", + "-p", + "oa-desktop", + "--all-targets", + "--", + "-D", + "warnings" + ], + "inputs": "clippy-d61f1f3.inputs.json", + "changed_inputs": [] + }, + "gui": { + "source": "d61f1f38779ab70a77efcde523ae31c432aefcfd", + "start": "2026-09-12T23:42:43.604131+00:00", + "end": "2026-09-12T23:45:13.257180+00:00", + "exit": 0, + "command": [ + "cargo", + "build", + "--locked", + "-p", + "oa-desktop", + "--bin", + "arcadia-studio" + ], + "inputs": "gui-d61f1f3.inputs.json", + "changed_inputs": [] + }, + "full": { + "source": "d61f1f38779ab70a77efcde523ae31c432aefcfd", + "start": "2026-09-12T23:00:48.242126+00:00", + "end": "2026-09-12T23:39:26.440552+00:00", + "exit": 0, + "command": [ + "cargo", + "test", + "--locked", + "-p", + "oa-desktop", + "--bin", + "arcadia-studio", + "--", + "--test-threads=1" + ], + "inputs": "full-d61f1f3.inputs.json", + "changed_inputs": [] + } + }, + "inputs": [ + { + "path": "Cargo.lock", + "bytes": 119973, + "sha256": "065c23c94908fe499d32ed91d55a70946ed5b08ecfda3b483ec1e635572257bf" + }, + { + "path": "Cargo.toml", + "bytes": 400, + "sha256": "369f5b4b2b60705a94623c8c0b68f8e0b048f263280ce07ae0629ad353797d62" + }, + { + "path": "build/windows.manifest", + "bytes": 354, + "sha256": "9c19c5a02f858ece84c44839ad2b145d9c1d90442da0b15c87fd045f975974eb" + }, + { + "path": "build/windows.rc", + "bytes": 24, + "sha256": "a27385edcae0bcf96f55361056cb7be5f36d76fcddcaefd20647c91959563e1e" + }, + { + "path": "build/windows_manifest.rs", + "bytes": 1460, + "sha256": "168da2c42ecccfebc11ee3e1b455e653a68fe9c6d30a9842a8b9e7441d086c80" + }, + { + "path": "crates/oa-cli/Cargo.toml", + "bytes": 279, + "sha256": "49c567f1af74a826683b4d96845feb3806fd9bcb7dc2767e16b5509d4e5e1cde" + }, + { + "path": "crates/oa-cli/src/lib.rs", + "bytes": 15498, + "sha256": "97bebab63b4a611a1d36ad0c20fe452cbe1985fe3a6fbd39c954603da11410fc" + }, + { + "path": "crates/oa-cli/src/main.rs", + "bytes": 2984, + "sha256": "de964f9b6c59c0f31c080afbd3b31d442b07b1b44f6a187a248d3409c45d35fb" + }, + { + "path": "crates/oa-cli/tests/source_cli.rs", + "bytes": 16600, + "sha256": "a3a1b856c7a9fd3d80bc8074150a24fbb0ef0e9ddf736c7cea036725fc3dc2b8" + }, + { + "path": "crates/oa-core/Cargo.toml", + "bytes": 408, + "sha256": "6b5c062474ebb62d5082e07dabed99ee85e4a833edf26690fb4f887028d3416f" + }, + { + "path": "crates/oa-core/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-core/examples/generate_demo.rs", + "bytes": 795, + "sha256": "e26f432c95331aeca50985dbb3ad2c558affd43023b585811f0f7bfaa59f6661" + }, + { + "path": "crates/oa-core/examples/generate_release1.rs", + "bytes": 1798, + "sha256": "1d5f11165d74893e4bc18dbf3a2f2111f4026bd89fd06ee7f0bae69e45c4d4b5" + }, + { + "path": "crates/oa-core/examples/release_dense_views.rs", + "bytes": 14664, + "sha256": "a83158488ef9b7394f136c52b1496719be935c4e5bdfe457cab5c9894f5f9412" + }, + { + "path": "crates/oa-core/examples/routing_workshop.rs", + "bytes": 17248, + "sha256": "571307b18b6d4fa04700c5a4d4b0c2154c419e93a21292b2028e7b6f46a2faa7" + }, + { + "path": "crates/oa-core/src/analysis_numeric.rs", + "bytes": 3735, + "sha256": "6c88eef3119162aeb6c07b9e75812c3af9fbfe75554b0503ad00f103cb478408" + }, + { + "path": "crates/oa-core/src/analysis_numeric/dimension.rs", + "bytes": 3045, + "sha256": "d4ad8e5307a1620e31791d724a0e31fdba860d00dc83e3e1f2209d9c5e22a340" + }, + { + "path": "crates/oa-core/src/analysis_numeric/exact.rs", + "bytes": 17338, + "sha256": "4eb8cb0f66b10e5da204899af82ee26adfec74bab47b1a6c9842b5488ee04c4d" + }, + { + "path": "crates/oa-core/src/analysis_numeric/fixtures/r7-literal-boundaries.json", + "bytes": 6085, + "sha256": "3b959dec5e100a6f03817f5314bef497347ba579ebd235476516d4bd83399181" + }, + { + "path": "crates/oa-core/src/analysis_numeric/meter.rs", + "bytes": 7129, + "sha256": "1f7174beb992935b4c399acdef91114af73faf041070feab968455ac827e8ee4" + }, + { + "path": "crates/oa-core/src/analysis_numeric/quantity.rs", + "bytes": 12257, + "sha256": "ead5142d6eeea8f99399d57e02d8f7d819980923de76387cd454694d6a747aee" + }, + { + "path": "crates/oa-core/src/analysis_numeric/tests.rs", + "bytes": 27486, + "sha256": "323ce82fc057d36f44463569fd8ea324c7d700fddfbf32bce15e04bd2a66970b" + }, + { + "path": "crates/oa-core/src/data.rs", + "bytes": 42696, + "sha256": "7f9c7c7dd8353cb5a38597b92cde6d3e890203d392473187eb387d41ff37414a" + }, + { + "path": "crates/oa-core/src/demo.rs", + "bytes": 20657, + "sha256": "ad62123f96c20ff023cafc1a9849b0fa06bc62edd1fb9701799e4599b458600c" + }, + { + "path": "crates/oa-core/src/language.rs", + "bytes": 99938, + "sha256": "638f08a42e9cf4996b5d07f69b4d6f517a518369f3604d25be1006e40e080765" + }, + { + "path": "crates/oa-core/src/language/semantic_source.rs", + "bytes": 7326, + "sha256": "584b5bb59d87a7b8d44d5dd2d124c3a1323b21492b138a17bc9526c0087c9e29" + }, + { + "path": "crates/oa-core/src/language_nesting_tests.rs", + "bytes": 20639, + "sha256": "bd061611e8cb6f28ab203c73e544ac98bf275eb464cd314ad5fbd25f773df33b" + }, + { + "path": "crates/oa-core/src/lib.rs", + "bytes": 549, + "sha256": "ea1d9bf5acba8381ba204db12ff5b5fe1f320417d17af517e46b90fd6bcb241c" + }, + { + "path": "crates/oa-core/src/migration_v2/README.md", + "bytes": 1515, + "sha256": "fb61d3faa33d7bdfba73415415a0882c0fbd3e0b45df42f972a19aec6da927b9" + }, + { + "path": "crates/oa-core/src/migration_v2/adapter.rs", + "bytes": 9490, + "sha256": "66741b4c8354a23b8a932ecc5bf1bc3bb6e74279558757b8c35bc2157a7e51b5" + }, + { + "path": "crates/oa-core/src/migration_v2/mod.rs", + "bytes": 1158, + "sha256": "857d8bb13b6814daba6780ca770c16352943c01cb130245d055f11b3b957b3e9" + }, + { + "path": "crates/oa-core/src/migration_v2/model.rs", + "bytes": 52059, + "sha256": "8ac63eb59b2e57bdecff2477ee0634096090924d3dd1851e1c454880a889dacb" + }, + { + "path": "crates/oa-core/src/migration_v2/references.rs", + "bytes": 13369, + "sha256": "33a6819abc83139fdaebeebd1b553238a328637106cce7dd5a535f1791d43e20" + }, + { + "path": "crates/oa-core/src/migration_v2/source.rs", + "bytes": 21946, + "sha256": "74fee9b24e7c912182c998ab9d9aeec125e2009c3214959229e844c67afe2bf6" + }, + { + "path": "crates/oa-core/src/migration_v2/state_validation.rs", + "bytes": 15769, + "sha256": "e29ef071bab0a68460ddf55c46131c6f66c022d52c3c602c37c013c3649da1b0" + }, + { + "path": "crates/oa-core/src/migration_v2/transitions.rs", + "bytes": 704, + "sha256": "f74174c532ba56b57c80b719a11fb4adea0a78ccc2828fff72fe2b9eda5a10b1" + }, + { + "path": "crates/oa-core/src/migration_v2/validation.rs", + "bytes": 98736, + "sha256": "6d5e4a4e2805ae5045bf789a0485e14a61c63346587bace2b4a91173a688f780" + }, + { + "path": "crates/oa-core/src/migration_v3/README.md", + "bytes": 2128, + "sha256": "3755a63f840d7f0eadf68afa7a9d587877a9468ff982d3610539e8a0bb067a82" + }, + { + "path": "crates/oa-core/src/migration_v3/mod.rs", + "bytes": 23023, + "sha256": "f4edb6a0b50ecfe8670973776d703047b064420cb1f05913129c00fc656b3722" + }, + { + "path": "crates/oa-core/src/migration_v4.rs", + "bytes": 4020, + "sha256": "50c652964f0f309e7f3f54b6ef12c40d42fcecc0490f005995c713df1179af70" + }, + { + "path": "crates/oa-core/src/model.rs", + "bytes": 66352, + "sha256": "4585c895c64c4a183941c92cf047a9e52ff0cbe41971e16e78d229ea9dc101fb" + }, + { + "path": "crates/oa-core/src/operations.rs", + "bytes": 11405, + "sha256": "a5ffbbf54cd440316a106d1188bfb699b57dae59f466edcb33618c333cd19f41" + }, + { + "path": "crates/oa-core/src/persistence.rs", + "bytes": 31774, + "sha256": "1c01474f906a63e552c0d590b272c95821c00a100b3e79e58e67dbbeac341a14" + }, + { + "path": "crates/oa-core/src/ports.rs", + "bytes": 45413, + "sha256": "5cac12eea70a54ebebbd6be77b63ce92e3195325c4bc7d27705c518686cbac80" + }, + { + "path": "crates/oa-core/src/projection.rs", + "bytes": 21374, + "sha256": "69ed12bace2cc5024e151752a174ab14034ac2d05eb741fcf13e9a27521c059b" + }, + { + "path": "crates/oa-core/src/projection/port_layout.rs", + "bytes": 13474, + "sha256": "a08d17d10a58bb8b206dd001b19b91d5aa3a9f743b298a4da57d503223c20079" + }, + { + "path": "crates/oa-core/src/projection/state.rs", + "bytes": 5233, + "sha256": "73a607bac713ec7ff49a509fefb1a53c7686dca93ee241ffc835564d743afb28" + }, + { + "path": "crates/oa-core/src/references.rs", + "bytes": 21957, + "sha256": "93553c234f32da35f1f41a7b83ad81c471c9803efa78ca222cf7de3c2f86c0bb" + }, + { + "path": "crates/oa-core/src/routing.rs", + "bytes": 50309, + "sha256": "c5ebb350ba76f731f5c48d968bfbba4b6ef68ec046eb5893d116c4637ef15080" + }, + { + "path": "crates/oa-core/src/semantic.rs", + "bytes": 540, + "sha256": "f9895dd5b8fb27d10d4cfbb41c3542ef2018365a589b8d5778e5674ae5a1f239" + }, + { + "path": "crates/oa-core/src/semantic/catalog.rs", + "bytes": 49407, + "sha256": "1ff74fcca18084d178681d7ff38ee1ccac632c27c4de0595ba1ceab8067ab3a4" + }, + { + "path": "crates/oa-core/src/semantic/historical.rs", + "bytes": 15271, + "sha256": "eaf3284bf234312698514cdb636bc8348e1b5d746cb16b18df777e77d312abfb" + }, + { + "path": "crates/oa-core/src/semantic/linked.rs", + "bytes": 6035, + "sha256": "6f335b14e809aecfc35defcaf77cb821b080d1506dbc46297912b25af98c07a2" + }, + { + "path": "crates/oa-core/src/semantic/mutate.rs", + "bytes": 22683, + "sha256": "dc2b4c4a6eb156fe468eaa8c85fd37a505c0cd8ea1f226cb69cd01689afd3d9d" + }, + { + "path": "crates/oa-core/src/semantic/review.rs", + "bytes": 51116, + "sha256": "0c157d2c327e72e89cca3b423e71ee73798105c5bb7271439c1a101642c91e3e" + }, + { + "path": "crates/oa-core/src/semantic/types.rs", + "bytes": 10405, + "sha256": "6922fe35089f12fad43ab0ce1c6886d01a3855f90b8e2543e99802ac5e6f1bbb" + }, + { + "path": "crates/oa-core/src/session.rs", + "bytes": 35237, + "sha256": "1eb77b329b2986fc6f5dc0171e77fd860375cdfd8c769a1367b445d6c49ebe00" + }, + { + "path": "crates/oa-core/src/source_files.rs", + "bytes": 74803, + "sha256": "669491dbddb8e8e6556161426dffa1a49ac1c826d31020bff0956d81a4d84683" + }, + { + "path": "crates/oa-core/src/source_project.rs", + "bytes": 61843, + "sha256": "1394370bcc5908873b830c2c11312e6e1611af41f46c4f43ca0a6bcb713bb466" + }, + { + "path": "crates/oa-core/src/source_project/source_migration.rs", + "bytes": 4700, + "sha256": "add463ae85c420f853d324b00a221f0f874164cc3f3ed6bbb07557a9ed7a8c95" + }, + { + "path": "crates/oa-core/src/source_project/source_structure.rs", + "bytes": 20225, + "sha256": "9f1f83315856a7025fe662c0fbb13452f31613224a03663150d6225d1ddc162f" + }, + { + "path": "crates/oa-core/src/state_validation.rs", + "bytes": 15665, + "sha256": "e28d7f74385e2a78763716b34491bd73a00bfeccc085970ceb130627e3faee18" + }, + { + "path": "crates/oa-core/src/topology_context.rs", + "bytes": 13734, + "sha256": "16de69b297de95d93c73808621607833b713af811dd082f0169186ae1e5c3e2d" + }, + { + "path": "crates/oa-core/src/topology_context/analysis.rs", + "bytes": 20036, + "sha256": "dead6194f0aa60cc46045c0e5ee10dbdbb689158c38634dfbbbc45d2ba88ac65" + }, + { + "path": "crates/oa-core/src/topology_context/analysis_tests.rs", + "bytes": 5258, + "sha256": "17839263410815e96fe027d4eba3aae0a9ab3b82b16947e2b29ebe0d09782b56" + }, + { + "path": "crates/oa-core/src/transitions.rs", + "bytes": 51998, + "sha256": "fadd1b07b89cae4117b91abb4f1ac9ea81ff818ef20f2175e76ee8cf21fb708d" + }, + { + "path": "crates/oa-core/src/transitions/communication.rs", + "bytes": 8634, + "sha256": "2b476630a88edd9021b9156ca12a5402e01604095f0d4002afb452671903a028" + }, + { + "path": "crates/oa-core/src/validation.rs", + "bytes": 112792, + "sha256": "7c1b4ae5e4ebba13e99af9158ccde138dfc5e9a7afb580e76fba72d0b64ba74e" + }, + { + "path": "crates/oa-core/src/validation/coverage.rs", + "bytes": 6478, + "sha256": "b08e4b344ecad055714168c83beff7fe29ba4edc53edbffa2eae04e5580a4d5f" + }, + { + "path": "crates/oa-core/src/view_options.rs", + "bytes": 24481, + "sha256": "421ede0a04c593ca1df0e6e0d06fabcfcc8113cdbcfb0adc7f5c8ef4d1724208" + }, + { + "path": "crates/oa-core/src/view_options_tests.rs", + "bytes": 21433, + "sha256": "64aac44de2df42a1012239a3dd75c473daf0c8990b3170b7bf7e78a556080208" + }, + { + "path": "crates/oa-core/tests/communication_boundary_scenarios.rs", + "bytes": 8816, + "sha256": "e1100b8f363910a487d90c73acc7df543dc6d532158c3c63ad11cd3d40d8e12b" + }, + { + "path": "crates/oa-core/tests/communication_means.rs", + "bytes": 18102, + "sha256": "a25f2749180bc6f4beb1445bfad3351eedf0669131a7439b633ab804439e95a4" + }, + { + "path": "crates/oa-core/tests/coverage_diagnostics.rs", + "bytes": 20527, + "sha256": "e2e9c3996daab47f2bd23f5d8c48b4e372af33331152f5fc85b76f06d04fcdf4" + }, + { + "path": "crates/oa-core/tests/fixtures/v2-coastal-rescue.arcadia", + "bytes": 29220, + "sha256": "f0df129c1914bfc01d0b047b0cd4b520d8cf0c249ea9ced085de400c0be87ff3" + }, + { + "path": "crates/oa-core/tests/fixtures/v2-coastal-rescue.json", + "bytes": 43990, + "sha256": "3ed53508eb544bbd788832f7bebea2ec31b3d66191f24f45098cc9750ec4c005" + }, + { + "path": "crates/oa-core/tests/fixtures/v3-data-contract.arcadia", + "bytes": 2450, + "sha256": "305f19d1b79f99f8d4cf627ba2e9ca6836bb7959cc0070227815937a699eafea" + }, + { + "path": "crates/oa-core/tests/fixtures/v3-data-contract.json", + "bytes": 8240, + "sha256": "1b41299c53204e6232397d25a58d5bccdbbc16e770c75e8edb55ce36ccfe58a2" + }, + { + "path": "crates/oa-core/tests/fixtures/v4-reviewed-prose.arcadia", + "bytes": 1222, + "sha256": "5fa53a26a5ad010c8e59eb56d9b2b52003569e66c0377ffb58840590168ad0c1" + }, + { + "path": "crates/oa-core/tests/fixtures/v4-reviewed-prose.json", + "bytes": 1734, + "sha256": "2808088afcc165f4bd6da5129151143411c997041c3de61d600ab76e05d24a47" + }, + { + "path": "crates/oa-core/tests/language.rs", + "bytes": 56482, + "sha256": "77f6cb2a69976bfb5f60b243b71c07fb0edc7505002c1e9e73fcd6ddf6d9496e" + }, + { + "path": "crates/oa-core/tests/port_anchors.rs", + "bytes": 26893, + "sha256": "efbc0fa18733b1aaac501f9785a4c392fc49c05c45a5778d26e9b5dd951ca6fa" + }, + { + "path": "crates/oa-core/tests/port_migration.rs", + "bytes": 15620, + "sha256": "1801c376a5435ac7efb2a8342348b2c7ffef930bba65deca4acb66b06e0483d7" + }, + { + "path": "crates/oa-core/tests/port_source.rs", + "bytes": 4858, + "sha256": "8d2ddaca4045d330f6eda2591561497b858aad53769a823249d0bea4f5916e12" + }, + { + "path": "crates/oa-core/tests/prepared_commands.rs", + "bytes": 9555, + "sha256": "52cab1c668064777412df0a6a3c20d74d579b33794b4b00525b9f151c06eac9b" + }, + { + "path": "crates/oa-core/tests/process_diagnostics.rs", + "bytes": 1104, + "sha256": "1dbbc590239ef7542be4a2bdc9543aaa64d108417b03dd312a0894e364745906" + }, + { + "path": "crates/oa-core/tests/r3_constructor_ack.rs", + "bytes": 24163, + "sha256": "e5c44676ea0aab97f2e091ddac2f4bc4a4a90f5877f7bbf08b61229600944dd0" + }, + { + "path": "crates/oa-core/tests/r3_migration.rs", + "bytes": 6590, + "sha256": "ebd04120f5215b3956fdc79ee78f6e38734c7d13392f1fc28aaba957912265bd" + }, + { + "path": "crates/oa-core/tests/r3_semantic.rs", + "bytes": 77473, + "sha256": "49c3763eaf2131070a7c46cc23a84f917d292d41610b6404510e5607f8890c32" + }, + { + "path": "crates/oa-core/tests/r3_source.rs", + "bytes": 15311, + "sha256": "f31f60659df3c7ef601650d1cff140589d8729f01a3f65a4a6a6c2272f15c408" + }, + { + "path": "crates/oa-core/tests/r6_data.rs", + "bytes": 41437, + "sha256": "5f7ffb3bc73c3c85423623fe56f8680646dc97040327bdbead9d47a37e80f155" + }, + { + "path": "crates/oa-core/tests/r6_migration.rs", + "bytes": 9174, + "sha256": "81519bc1512f5e069432e9a1cdad04c10216d492df01b4b75b02102480ebd6a1" + }, + { + "path": "crates/oa-core/tests/r6_source.rs", + "bytes": 9519, + "sha256": "88a0aa087a7678e2898ff6057538072ca92072190712f05fff08372cc56ebed6" + }, + { + "path": "crates/oa-core/tests/release1_teaching.rs", + "bytes": 10010, + "sha256": "be179290d871125dc97cfd2a3067c7ac89c8a538fdb0afafc5b825bcdfb2bef2" + }, + { + "path": "crates/oa-core/tests/release_capabilities.rs", + "bytes": 19422, + "sha256": "b92cba2a562e78287ddd7dc3e94557848d17faa0c8a102601b50286b9af48a30" + }, + { + "path": "crates/oa-core/tests/release_diagrams.rs", + "bytes": 7689, + "sha256": "cefcc0582d91266d5de6ee5daefcfe41b606ab971ab235b59034a8e1dbc24b7d" + }, + { + "path": "crates/oa-core/tests/release_language_limits.rs", + "bytes": 5204, + "sha256": "8578da4f76bbd2d0e1bfe295ab1259e2162a3fe3d0d2ba8901915d7a40942806" + }, + { + "path": "crates/oa-core/tests/release_ports.rs", + "bytes": 32740, + "sha256": "506e62beab0c7ec0cece83e9e0c1a810fa1f99285c9e1cab0c77f06de55a40e1" + }, + { + "path": "crates/oa-core/tests/release_routing.rs", + "bytes": 23165, + "sha256": "ae168faaba23769b7ca1fd65f217b9db671726e67276eb5a04e5e72b1447a462" + }, + { + "path": "crates/oa-core/tests/release_scenarios.rs", + "bytes": 41067, + "sha256": "0f5d876badeec653fc7b12610a77d867e9a53582e605253deff8d379da21572f" + }, + { + "path": "crates/oa-core/tests/release_states.rs", + "bytes": 26873, + "sha256": "b1a26acee95eaba7f9920f9da738a1e33606552eb078e6d298895daff7e3d811" + }, + { + "path": "crates/oa-core/tests/release_topology.rs", + "bytes": 17643, + "sha256": "c51dbe5aa5a038f9ed830daa02aa67714472179eb7fd6da5ce36dc6931c8b3a9" + }, + { + "path": "crates/oa-core/tests/review_regressions.rs", + "bytes": 21823, + "sha256": "f154e5c88d35e31512e2b07733a1327ea3e2fcfd1ef8eb23066a4e9573f387c1" + }, + { + "path": "crates/oa-core/tests/route_source.rs", + "bytes": 7270, + "sha256": "1a73fdbac0d0ae0e84d8d67b6ad398e11223958f5dca007f73757c91827decfb" + }, + { + "path": "crates/oa-core/tests/routing_geometry.rs", + "bytes": 31890, + "sha256": "2d8eea4a2bba535ed0ea6daabccdaf87b375828c404baa10518c7bd7fd6253d3" + }, + { + "path": "crates/oa-core/tests/routing_labels.rs", + "bytes": 5530, + "sha256": "dff884d799c3c5c9257210248c55767e294e3cb317c605cbd0ddc9600c216eb6" + }, + { + "path": "crates/oa-core/tests/semantic_artifact_absence_oracle.rs", + "bytes": 4640, + "sha256": "d93eaf9667f4221232168bef0fe9f069e5be1b1f23410bda5dd67010b96e5c8a" + }, + { + "path": "crates/oa-core/tests/semantic_attachments_gui_oracle.rs", + "bytes": 14957, + "sha256": "7f526d363ba05e7ac89faf0fead0796e419c34ee204edf44a1b46c78308b0970" + }, + { + "path": "crates/oa-core/tests/source6_view_contract.rs", + "bytes": 14307, + "sha256": "fa566de53946d40bbbd9033edfeed177180c4dc44afa2f2f4667ffdc622eb3bb" + }, + { + "path": "crates/oa-core/tests/source7_contract.rs", + "bytes": 43262, + "sha256": "cad4f1a135ddbd947bdf3c71d1b44f1e438725095ea8c4d893464bc721c2363f" + }, + { + "path": "crates/oa-core/tests/source_files.rs", + "bytes": 13168, + "sha256": "f0429a0b89a443458ea9af7083c1e4e7411417a7e6b47e618bfbb9266dc164f9" + }, + { + "path": "crates/oa-core/tests/source_identity_updates.rs", + "bytes": 5139, + "sha256": "f52aa38b4d317e532c641ad7463472e4b40e802e60052cf0017556ffc63da06c" + }, + { + "path": "crates/oa-core/tests/source_nested_updates.rs", + "bytes": 16892, + "sha256": "9ac3390936c0d250651ea94a1b8faf0adfb680f061ececc56f2a52909b5ba855" + }, + { + "path": "crates/oa-core/tests/source_project.rs", + "bytes": 45910, + "sha256": "cef58adb16aa4d2527ddc0628aec3e26f0b42b4be70014a7e360fafdac13a942" + }, + { + "path": "crates/oa-core/tests/state_diagrams.rs", + "bytes": 23973, + "sha256": "6b02b387a3ae559cb3ad72de24292a5abcb76aaac0adbab5d2aa5211b22cd2e5" + }, + { + "path": "crates/oa-core/tests/workflows.rs", + "bytes": 33426, + "sha256": "bd843dfddbd5724ec08f657571f887496203056fe2fa5864ef50a168a613b89b" + }, + { + "path": "crates/oa-desktop/Cargo.toml", + "bytes": 842, + "sha256": "f3547b2b924d5db6706c0a8e069014b440ff65315d82fc8aced0360af4b3cdc9" + }, + { + "path": "crates/oa-desktop/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-desktop/src/allocation_drag.rs", + "bytes": 29634, + "sha256": "6b93290627a8697dd529ecf12b6e99196a11783afff1ca7aaf75c6e2762f3d94" + }, + { + "path": "crates/oa-desktop/src/allocation_drag/tests.rs", + "bytes": 60311, + "sha256": "13b7d055a516c8a9f0bd13f03abe3b81423bde9d121c51778a129ff485f4f102" + }, + { + "path": "crates/oa-desktop/src/allocation_input.rs", + "bytes": 8391, + "sha256": "c7825c43383e81b7eb1b78bd902950c8a2206e0387d26002a80ddbe4dc2b6c73" + }, + { + "path": "crates/oa-desktop/src/app.rs", + "bytes": 220614, + "sha256": "99447bba4810135834663681447a03061a948db2661395b9b4c4924738a38f18" + }, + { + "path": "crates/oa-desktop/src/app/allocation_drag.rs", + "bytes": 24452, + "sha256": "218726dcd2e6809cb6f3660f575e586806360456e6b4fac61b9e361b411aeee9" + }, + { + "path": "crates/oa-desktop/src/app/allocation_drag_full_tree_tests.rs", + "bytes": 28288, + "sha256": "ff4c3d07f885f242b71160c09e2c457c4a746073fd89030781da306730c5db44" + }, + { + "path": "crates/oa-desktop/src/app/allocation_drag_tests.rs", + "bytes": 42677, + "sha256": "3c6908f8a677921245932252ab38806f16012becbbc082ac11e7871ff7bdeeb4" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring.rs", + "bytes": 27835, + "sha256": "37c7db33e99dd4adcc5a51f09ee4878af94fd32413359890a541690080885f65" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring/palette.rs", + "bytes": 8887, + "sha256": "8f9937cb30b48b83759fd084a8a5990a2daa3920280f1210abe048560241985a" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring/tests.rs", + "bytes": 14565, + "sha256": "174e184f1baf872c3be1cf70d9a7f4bc5569a9623000b3ab0e71e2b82e249cf5" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring_tests.rs", + "bytes": 18551, + "sha256": "ba913f7d7cbf586708d65c9f1db25b9b9ed7846f9d2e75a546b4ac69d8d19c6a" + }, + { + "path": "crates/oa-desktop/src/app/behavior_lifecycle_tests.rs", + "bytes": 13672, + "sha256": "f9a0b030faca5deaf3f55d9f5efcafdf1a7cb1a663001aa20a61baba4f92d080" + }, + { + "path": "crates/oa-desktop/src/app/behavior_removal_tests.rs", + "bytes": 23958, + "sha256": "ef09843a7daeb91afab0b76e83c5679351a1635a84a26d80a194dea744ea5874" + }, + { + "path": "crates/oa-desktop/src/app/checkpoints.rs", + "bytes": 29576, + "sha256": "55e5babdcabef767af3bc8be9cc3153b3f5cc0695701b890820ec0225643852e" + }, + { + "path": "crates/oa-desktop/src/app/diagram_focus_tests.rs", + "bytes": 6047, + "sha256": "65f3f841e1295ae4878b3ae2cf45ff64003d42e26e450e9a1de1c36dbd771bd8" + }, + { + "path": "crates/oa-desktop/src/app/diagram_removal.rs", + "bytes": 8778, + "sha256": "addb51604f41d680b06586bb362362ee3c2603a334f33022ce9abc281295ac85" + }, + { + "path": "crates/oa-desktop/src/app/diagram_removal_tests.rs", + "bytes": 47336, + "sha256": "70f9eb53d8995a23a53535b3941fc0c0b81a340f9fbbb371f0d705cfa775bd9e" + }, + { + "path": "crates/oa-desktop/src/app/diagram_selection_tests.rs", + "bytes": 5582, + "sha256": "4fa507adbc23db3a6eb202d809c695ec0ebd6181356930c4fa7528a9a0c7be57" + }, + { + "path": "crates/oa-desktop/src/app/hosted.rs", + "bytes": 25059, + "sha256": "2f7094c078e1d7cbccd6c0d310afa6c400a7e031f12918bbfce65ba62754e316" + }, + { + "path": "crates/oa-desktop/src/app/hosted/tests.rs", + "bytes": 30344, + "sha256": "fa118f64d04b400ccc01e4e67adaf3541975288882afa265a9e7f092cdbda232" + }, + { + "path": "crates/oa-desktop/src/app/process_canvas.rs", + "bytes": 31560, + "sha256": "7e05f4899a0b24df9ab355b6484e94997c7bc66c873342d975aed0b6a56acf04" + }, + { + "path": "crates/oa-desktop/src/app/reference_authoring.rs", + "bytes": 11250, + "sha256": "38e033e23e8135032f70117a376a5fe7bc68127c466559a35d7ec200932e3f77" + }, + { + "path": "crates/oa-desktop/src/app/reference_authoring/tests.rs", + "bytes": 20067, + "sha256": "b96ddc6bff7f8fde97720e18a92070f891c1340348d2e19c7c9c5a7bda650ce8" + }, + { + "path": "crates/oa-desktop/src/app/reference_authoring/tests/mounted.rs", + "bytes": 32805, + "sha256": "14a4914a1c86e50c395672dab8fe80d7af679a79c9082890b509fad7b7c543d9" + }, + { + "path": "crates/oa-desktop/src/app/repair_save_state_tests.rs", + "bytes": 10745, + "sha256": "5543dcba853bb1513acf824b860249729a6004747e7e320b46efe60ea19e2d83" + }, + { + "path": "crates/oa-desktop/src/app/review_navigation_tests.rs", + "bytes": 7049, + "sha256": "872fa91479dad5436e139ffcaece270323e9f5daeeb7a4d80c2c2534f48bc21b" + }, + { + "path": "crates/oa-desktop/src/app/save_as_tests.rs", + "bytes": 4113, + "sha256": "f8b915793f1a36fd152569c4781a4bdc17f4af404a8ceb373330053413087a1c" + }, + { + "path": "crates/oa-desktop/src/app/state_diagram.rs", + "bytes": 10050, + "sha256": "9ae3d533a20963a2bd1d485d357ac04319f336cd9f4c16305aa2a67d833573a8" + }, + { + "path": "crates/oa-desktop/src/app/state_diagram_tests.rs", + "bytes": 39957, + "sha256": "612e414b1a2cab12cbfd8fce23745559ff27577700694d53af67ad1f2883ee2c" + }, + { + "path": "crates/oa-desktop/src/app/transition_context_tests.rs", + "bytes": 11508, + "sha256": "47002fb025f3a2f8c53871f9509bfe8611a61db6fb0e1b3125eb6e875425cb1d" + }, + { + "path": "crates/oa-desktop/src/app/view_copy_tests.rs", + "bytes": 7846, + "sha256": "296821c51dcde568e7d717039aa26bfc1b56a9074aa16051007bb351b33a4d44" + }, + { + "path": "crates/oa-desktop/src/behavior.rs", + "bytes": 130523, + "sha256": "96c6e784640fd19a65c93346d21cb184ca721d7649812bd4c68a479391e38127" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace.rs", + "bytes": 7903, + "sha256": "b6e06b9d29f1a5677f99bebcb0e53a3795b4bcd957796a85fd800db4279aed03" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/control.rs", + "bytes": 7804, + "sha256": "2b8d97b8c0e3ff1b1a2c32187b1d0eb25edf39ba582b5fb3303bc880f674f7ba" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/focus.rs", + "bytes": 8901, + "sha256": "33447003980847033e40550f9926d8617fa61e2c3e73ec9c6121d1afed946c33" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/tests.rs", + "bytes": 27101, + "sha256": "b33361c6569354aa2df9b1ba1b60d68e4703800be80f815e0f0505064ea323c3" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/viewport.rs", + "bytes": 15164, + "sha256": "41ff9c50fa9fb89ab9fdb2d18dadc21585aafa1ee008cfcd1e0b731dce645eaf" + }, + { + "path": "crates/oa-desktop/src/behavior/contextual_source_tests.rs", + "bytes": 49518, + "sha256": "044bd412dc45ffe440b1e251993946942dc3759dcb2d5dfe71bd8d6ef61cbcc7" + }, + { + "path": "crates/oa-desktop/src/behavior/creation.rs", + "bytes": 28978, + "sha256": "33ae9aaf4ba90de9432870cc8e99708ef39e3638ae8283a9253c333785c91299" + }, + { + "path": "crates/oa-desktop/src/behavior/creation/app_tests.rs", + "bytes": 13181, + "sha256": "e9c5bf2b07357b7a2f679ae0d8f6904c1c1461aaeb94fa0db478b54d4641ae3e" + }, + { + "path": "crates/oa-desktop/src/behavior/creation/tests.rs", + "bytes": 22793, + "sha256": "a0d1daf9fb3920f7e6181a9802d84fbe056cbf0043b9e41dba5fdda687d9818a" + }, + { + "path": "crates/oa-desktop/src/behavior/form_session.rs", + "bytes": 3941, + "sha256": "f5027fb3a5a5599a182e7d1a10dba56dd66eb1f23a4ba4c4a1744c9a6a5b6e61" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario.rs", + "bytes": 154707, + "sha256": "ffac8821977488ecd1cd9084ad7c0c9fbf8de3d5031c5d4f5d033f0348d3e887" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/focus.rs", + "bytes": 9728, + "sha256": "73a9ea10ad7312086081b8688396a21ab4251c9faecc2df6d984b702f3963533" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/workspace.rs", + "bytes": 24960, + "sha256": "5aec4cb2ceb00ab25900d919a5bec71ab96848b4f14504f51790e3fe8801d3bc" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/workspace/tests.rs", + "bytes": 80542, + "sha256": "f2f6acd93ecf4e9ffee56abc1de28f71da8cb1353cdc3e67cf0c0cf7a619fec5" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_activation.rs", + "bytes": 14095, + "sha256": "77199dcb08ec8697f779d2560f6b716aed8d8f33965237a4934934954f4e805a" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_activation/tests.rs", + "bytes": 28464, + "sha256": "8b855dc067f1b15aed79c7eddf52c89001a8b961d9de4887f235c03b46264a1b" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_lifecycle.rs", + "bytes": 9324, + "sha256": "758d244c2e8de61f515d540baa4d967275f49720e0253c6c9159eb9acd71c859" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_lifecycle/tests.rs", + "bytes": 15430, + "sha256": "01b576993b329810cd78a859b45ac52c66f5a14549065661dd1308196e0b724d" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_operation_tests.rs", + "bytes": 10087, + "sha256": "89fb71c690e07eac314f7a5e05862d5c1e2f9c21039673bf22c4ac894d21c977" + }, + { + "path": "crates/oa-desktop/src/behavior/source_draft.rs", + "bytes": 18031, + "sha256": "08190823090bd8b0305809099abadcc0de431175f7044f1d5abdceda52612ee1" + }, + { + "path": "crates/oa-desktop/src/behavior/state_canvas.rs", + "bytes": 96098, + "sha256": "5844d2abf4a3fe3bb07c707865ee3f8303d213b0fe1871765ac468c11e140da7" + }, + { + "path": "crates/oa-desktop/src/behavior/state_edit.rs", + "bytes": 35843, + "sha256": "4e67321ab0cf88e6200061873086841244c4d610ddd5f88d70c69ac0cc6bf270" + }, + { + "path": "crates/oa-desktop/src/behavior/state_menu.rs", + "bytes": 8530, + "sha256": "9d0a3c29516efa79553c559274848f12101330dbf93ffbbefab398cbc1906790" + }, + { + "path": "crates/oa-desktop/src/behavior/state_view.rs", + "bytes": 7637, + "sha256": "3d01c853663385fc1b760401bbebe3f691fcc289a779a8e63cd0733ff0c8007f" + }, + { + "path": "crates/oa-desktop/src/behavior/states.rs", + "bytes": 26986, + "sha256": "8986ed9492960e20f1254e9dfe3ff91d79ce9fef66f3bda738f9933278043954" + }, + { + "path": "crates/oa-desktop/src/behavior/topology.rs", + "bytes": 84224, + "sha256": "66c81c4d4f2613263f13ae90cea61895c1aeed1f6278880789ec56f8c42433e0" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/contextual.rs", + "bytes": 28432, + "sha256": "5d0ac5b3e258fc70987a00ede1e603681d99746596f2fcc46ad2b3667d65203a" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/contextual_routing.rs", + "bytes": 16731, + "sha256": "d914b0e82aa8d253fe64be2ef74443d1fd2e6cec26d1cf30620a57646e1d426c" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/direct.rs", + "bytes": 39059, + "sha256": "5cca649870f54abdd2eb098954bcc0a2a5ca456b7ee11b5f653edbdf2ed55905" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/direct_tests.rs", + "bytes": 51170, + "sha256": "edccfe3ce8b224065a3540aa53c6340f13db0cecd48ecc0a3904cd832a483964" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/layout_tests.rs", + "bytes": 37846, + "sha256": "f27203866e22aee80daad2811113341684b0cbd59885b36d64243c4317f29f84" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/view.rs", + "bytes": 22009, + "sha256": "29e29c2a0667baa429ae44dbb400e67c86f24f88959d5e7dd22894473bdd1f09" + }, + { + "path": "crates/oa-desktop/src/connection_edit.rs", + "bytes": 5301, + "sha256": "020581e077f82b43c936b623cc51733b02b88428df4e5f25df74b9705819fa37" + }, + { + "path": "crates/oa-desktop/src/connection_tool.rs", + "bytes": 27023, + "sha256": "649da93677d52dae495b0e19bc32f3122ab05a6d84de8402578ff5ce3f6ee1d3" + }, + { + "path": "crates/oa-desktop/src/context_menu.rs", + "bytes": 52955, + "sha256": "629354b34dc232763700251f2695b4d4e53d6251c0b1432ecc0dfe424f7dfeac" + }, + { + "path": "crates/oa-desktop/src/data_values.rs", + "bytes": 23877, + "sha256": "e1deb1cad551f0a9fdef9653aad257cfb36e6d9c0f93b6245061ec3fab8fd365" + }, + { + "path": "crates/oa-desktop/src/data_view.rs", + "bytes": 38871, + "sha256": "158b852be5d3db450aa5cda8b68a35bd96bddce1d8d053a7a23582095c06362d" + }, + { + "path": "crates/oa-desktop/src/diagram.rs", + "bytes": 111242, + "sha256": "e5260a39e19fc3df19bd16898ff1f0abd60ede7584f595c035b5e86a12ecef93" + }, + { + "path": "crates/oa-desktop/src/diagram/focus.rs", + "bytes": 9197, + "sha256": "b88a7c43123b08cf6228d8e32257f6ed7fe361f7278f427ec138e233e1ea6ccf" + }, + { + "path": "crates/oa-desktop/src/diagram/lifecycle_tests.rs", + "bytes": 9342, + "sha256": "03dd13106f3fdd06a26699bfdfba006fad086a0711cad2ba1aeb09a4e8f8656e" + }, + { + "path": "crates/oa-desktop/src/diagram/pointer_tests.rs", + "bytes": 11859, + "sha256": "ae68e091032fe2cf71559ff7e671b3b6d657ee8279330345f0c7a57edfa472ef" + }, + { + "path": "crates/oa-desktop/src/diagram/port_hit_tests.rs", + "bytes": 5650, + "sha256": "c3728f127711cb6d7f80a4670a798808b6e4239dd29c273445de81706ab6f39e" + }, + { + "path": "crates/oa-desktop/src/diagram/port_labels.rs", + "bytes": 13574, + "sha256": "6643f0cbde7a59d4772ae5284a488083e3b81f2fefabc43619d75738f474646f" + }, + { + "path": "crates/oa-desktop/src/diagram/view_options_tests.rs", + "bytes": 2815, + "sha256": "cf0c98a7715558baf17b59f67a80556f98ad30262b4434635e617c6601775433" + }, + { + "path": "crates/oa-desktop/src/diagram/work_drag.rs", + "bytes": 7059, + "sha256": "9757534a7ba47dc0df5d41c8d7366b1d90f3d50b24344580ff3c783667bf66f0" + }, + { + "path": "crates/oa-desktop/src/document.rs", + "bytes": 31807, + "sha256": "7c87280b5b8d112c34865253f8ba0f80d43bc9897771943b15dc7b5608eb17a4" + }, + { + "path": "crates/oa-desktop/src/document_save_as_tests.rs", + "bytes": 5781, + "sha256": "83dc243a25f4e97674ff0d86c794a490cc923e98f1f9fb05bb038f622f11e20b" + }, + { + "path": "crates/oa-desktop/src/explorer.rs", + "bytes": 14764, + "sha256": "fa01c59219564ba9ae5553abc2b6f94e9849f9148d5812ef99b40318fe5dcf9a" + }, + { + "path": "crates/oa-desktop/src/explorer_view.rs", + "bytes": 13773, + "sha256": "a720d7484bcc3a24729332a00e005d1cc6f5f945a9cc3965134e0024dffb581f" + }, + { + "path": "crates/oa-desktop/src/forms.rs", + "bytes": 105544, + "sha256": "ea124f479fcd2d3978ac3cb8eb81fec4a7aae5e4f4414c4bdd54849e954dedf9" + }, + { + "path": "crates/oa-desktop/src/forms/context_fields.rs", + "bytes": 10831, + "sha256": "eaacd474f6500dd344d5a8b63ccb1d1dd86fe2aea78ab708afa8a80d62ce69bf" + }, + { + "path": "crates/oa-desktop/src/forms/data_fields.rs", + "bytes": 49285, + "sha256": "a540a0d451bff56a96b1d28643b2e8c0649f3846350c25c5b154729c0538e77c" + }, + { + "path": "crates/oa-desktop/src/forms/history_fields.rs", + "bytes": 27414, + "sha256": "e7100474cde18bdfe95562bcb3c055f29b4b15aa64788a578194464aebcd046e" + }, + { + "path": "crates/oa-desktop/src/forms/history_fields/tests.rs", + "bytes": 33950, + "sha256": "16d3c308138c063f45986d53c621ad83c7dc2ce853edd31b7204e2939a382df9" + }, + { + "path": "crates/oa-desktop/src/forms/port_fields.rs", + "bytes": 30554, + "sha256": "3fe684d651d5be6203fd9db3979c772913e1af5ac1514e67be386ffd88dc8127" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser.rs", + "bytes": 12130, + "sha256": "b60af363be333af048859e51c28e8c989cb5c95d696cad16c8eec15f78d57a12" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/adapter.rs", + "bytes": 10447, + "sha256": "87ab4bc3bf27fd4b5a458791cf62c7ba8e44e9ebf846d8b851b8b6ffb454cd64" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/tests.rs", + "bytes": 27835, + "sha256": "8e98f8a3fcb814d4a201cc85b3db87a689fd3d2ce487f8a2fe312fc296f93377" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/trigger.rs", + "bytes": 13336, + "sha256": "34d0acecfe6bed193970aa473cc3313984971264b86d7b362a6b84c23d013c0a" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/trigger/focus.rs", + "bytes": 9923, + "sha256": "f1e79f4b03b2f9fd1cdc335054d4ae177dc9e759b6ea3d334b2bcca39b57191b" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/widget.rs", + "bytes": 33804, + "sha256": "d66cc17af7a48bb8598be683f084bb08fa7af7304f9636f0a1bea94c5cf6c727" + }, + { + "path": "crates/oa-desktop/src/forms/view_fields.rs", + "bytes": 24987, + "sha256": "5184d438f0dfd4e29f284ff048e19da73e71be1f24a6e9f123c7e922aecb85fa" + }, + { + "path": "crates/oa-desktop/src/guide.rs", + "bytes": 118110, + "sha256": "ab4b47050e6d57dccdcc264ee5752766bd5013fccdc35eeeb9c9037bb5eb9a67" + }, + { + "path": "crates/oa-desktop/src/highlight.rs", + "bytes": 2751, + "sha256": "da7c254fff7052e5fd9ec7469f473b91a819406028d7c304f6e22c4169561600" + }, + { + "path": "crates/oa-desktop/src/home.rs", + "bytes": 17587, + "sha256": "f03c1071334894f586a5a7c86026602a694db3c2faf902822e1dbe5156a859c2" + }, + { + "path": "crates/oa-desktop/src/home/tests.rs", + "bytes": 8167, + "sha256": "3b03ccfc97dfb75954e1e0ed568bb87a632295c07b96cedc05ed381f87b378f3" + }, + { + "path": "crates/oa-desktop/src/hosted/client.rs", + "bytes": 21912, + "sha256": "54b24b4b50f8d87d7c92946ea5a2cff4c98760e70555b3ce3d90be27115e95d4" + }, + { + "path": "crates/oa-desktop/src/hosted/client_tests.rs", + "bytes": 23009, + "sha256": "3ef70907ca75e098d631c41b90badd4cff1e1eb1b3c78e15a9f811c13ba8ffbe" + }, + { + "path": "crates/oa-desktop/src/hosted/mod.rs", + "bytes": 3744, + "sha256": "1b75e11c80fcb38fd20bb3487e3f88729fdac73e471c5ae64da28c249f77c63b" + }, + { + "path": "crates/oa-desktop/src/hosted/view.rs", + "bytes": 9281, + "sha256": "fc0c7b7ce3a5f05c49713df6661067751f81e810af11c614ca265ea9490e6463" + }, + { + "path": "crates/oa-desktop/src/main.rs", + "bytes": 1554, + "sha256": "5228743f361f9239e4584780bfa9b65d36207d0288624e1fb42b721146bcff1c" + }, + { + "path": "crates/oa-desktop/src/model_menu.rs", + "bytes": 36340, + "sha256": "d2f836661f43fa1bc8830b1e51cc736948b3d261796c3fa877df02ae15568c4b" + }, + { + "path": "crates/oa-desktop/src/navigation.rs", + "bytes": 8839, + "sha256": "71355a12e1b4791106426d83fe5ebf0b29bce8e1dc594f0655ab85695469669e" + }, + { + "path": "crates/oa-desktop/src/port_edit.rs", + "bytes": 7809, + "sha256": "70b99f577c4fdeda8780c8dc1ee7b1639fd77aaca06658f06d725139fb3efb6d" + }, + { + "path": "crates/oa-desktop/src/port_preview.rs", + "bytes": 35855, + "sha256": "069487c4ece737d52e8ae4a84dcfb132236aca6799e841c91c8e7244320cf871" + }, + { + "path": "crates/oa-desktop/src/port_workflow.rs", + "bytes": 40582, + "sha256": "ccc15f97c3272145a67bb5857b4faeaf7437561bd61912fa27ab26e8824146a0" + }, + { + "path": "crates/oa-desktop/src/recovery.rs", + "bytes": 21041, + "sha256": "57e22e5fbb0e994e64ae03e69450271fe9f04a951db1670c2a018abe99db4489" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/README.md", + "bytes": 1587, + "sha256": "a90002df1e087d2dac7be26926864243568a0de7c4103e4927435b34178e8016" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/profiles.json", + "bytes": 473, + "sha256": "2c12ae96b50e6da5d60ce2b7fa00204be71dfbe2fd51311fc337a0de6a4332ff" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source5-bundle.json", + "bytes": 80974, + "sha256": "12715995e6f7f35414aea53b3ad720b9b31873ffdeaf4444231db1a5ac3c463e" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source5-model.json", + "bytes": 86191, + "sha256": "5535a706df9ec21715e8b6a5aa6dbd79636ae461450aee61305559016167612b" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source6-bundle.json", + "bytes": 85286, + "sha256": "ea88890a33f47d67dfb06d6dbbcc179058cf28dad76ae7d615c00aaf30dbbbfe" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source6-model.json", + "bytes": 90629, + "sha256": "5bb8db0b6394276666323483f977ac3586f88554c81a148c6d508fca0ef4576f" + }, + { + "path": "crates/oa-desktop/src/recovery/source5.rs", + "bytes": 6956, + "sha256": "0f0a763f0c98c2c908d4c2b95d8a4c042b6a255ee1cc16260e5404669691f642" + }, + { + "path": "crates/oa-desktop/src/recovery/source5_tests.rs", + "bytes": 12146, + "sha256": "cfd17a742f1f27b523fce7cd9309f0a07a30413395f6c58659fb91d02834a7a3" + }, + { + "path": "crates/oa-desktop/src/recovery/source7_tests.rs", + "bytes": 18213, + "sha256": "7ee61de66c75bf949489ba51ddc9677e2b4efc68801cf27909c9b894bfdc9288" + }, + { + "path": "crates/oa-desktop/src/route_edit.rs", + "bytes": 2941, + "sha256": "457ae59c2761a43a8620b4d336a7cf0f54b965997110ecaf968756a88b6b0374" + }, + { + "path": "crates/oa-desktop/src/semantic_review.rs", + "bytes": 3432, + "sha256": "8dd1e93783d63a663c7e56c28775a5c389cfd7a6b562013d6a95c891afa21ed8" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts.rs", + "bytes": 24201, + "sha256": "a79236a8150597ff808597e59cf4f1e9e61c74c4901d9c8cf42d3427bb52a9a8" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_recovery_falsifier_tests.rs", + "bytes": 11034, + "sha256": "3f255d04e4bffa5a467b75e3cbf6f7149aa3269a02f2a89fbaa1db0e5df9ae62" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_tests.rs", + "bytes": 20798, + "sha256": "04d0dd2ac453705185663f705282aa4a3a31433466a5be305764248da1a03c32" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_view.rs", + "bytes": 6447, + "sha256": "2100ff73565765d8293c84f6ce2d8e566610c1524c50e32ce3c37dc33b6686e4" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments.rs", + "bytes": 18160, + "sha256": "de0ec0c740895b160ff5b847332c087c3f1a48931583464069470cc61315ed59" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments_tests.rs", + "bytes": 29389, + "sha256": "8b26be0324e0f33b1e7cf7af340350df8ed98963002d6da8589ee0e6f6900bea" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments_view.rs", + "bytes": 3032, + "sha256": "932f231554d77c7cb119d33bb06b9879db5e12127aed187e67013e77b6458e78" + }, + { + "path": "crates/oa-desktop/src/semantic_review/batch.rs", + "bytes": 34485, + "sha256": "a462eb627ae19348072775cf8e60b17d62f6b682b74cc413906d493fba1f0b3c" + }, + { + "path": "crates/oa-desktop/src/semantic_review/batch_tests.rs", + "bytes": 27546, + "sha256": "b67c4d7dcabac710cf3d30730a8db323180a558a415e2d117c868cdfa4804619" + }, + { + "path": "crates/oa-desktop/src/semantic_review/compose.rs", + "bytes": 27155, + "sha256": "c6adcc9882dde65e9f04f6eda7f0c855c5cbb285cf421123029169112793ce9b" + }, + { + "path": "crates/oa-desktop/src/semantic_review/compose_diagnostic_tests.rs", + "bytes": 9809, + "sha256": "440daf8d43278ef981c620d1818d0daaed8fb83193b8e8ff67b2e42fbf882938" + }, + { + "path": "crates/oa-desktop/src/semantic_review/constructor_tests.rs", + "bytes": 54132, + "sha256": "85149521ad7df62918f6f2fab6da2b3346c342ab4bce7100de3f6206c1e81096" + }, + { + "path": "crates/oa-desktop/src/semantic_review/constructors.rs", + "bytes": 12258, + "sha256": "0982163439b06a42d9af1643530364109282e63f05b323a35a76d8241f3caa32" + }, + { + "path": "crates/oa-desktop/src/semantic_review/history.rs", + "bytes": 3211, + "sha256": "df038c2464eab8093a983f3104f0d04ca8f602010a50e1d3eeb8e53f2309e201" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed.rs", + "bytes": 14175, + "sha256": "bdd6c0fdc7108056bc5d7433254503449eed2209813680e717ead24b9d0ce834" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_rows.rs", + "bytes": 13222, + "sha256": "4b7bf25806471ad22d89253b9af8000f5acff53b4cc0aa1c1a83138e7b270eca" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_rows_tests.rs", + "bytes": 30804, + "sha256": "1a3b09e7ed100411cdf8043f9a78defc664a873ee0201117709185c201a5c57f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_tests.rs", + "bytes": 31163, + "sha256": "9dc9b989e5a9d408427ca1baf86b2454f9dd3baf40a551c70ca2359dc18a1227" + }, + { + "path": "crates/oa-desktop/src/semantic_review/message_kind.rs", + "bytes": 789, + "sha256": "4ed19952ea511d1b3226564a138e3322f994371d6b49794c14bc3689d1393e7f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/message_kind_tests.rs", + "bytes": 23424, + "sha256": "5fcf9930e949aebeb12eab0327264f32a2388d62dbf098bd2365711e22623c52" + }, + { + "path": "crates/oa-desktop/src/semantic_review/ordered.rs", + "bytes": 9705, + "sha256": "6a1ed894d1b9d0110bc784a75c49444f1d14f1f74620d701f22203b2d8d0a813" + }, + { + "path": "crates/oa-desktop/src/semantic_review/ordered_tests.rs", + "bytes": 22383, + "sha256": "5c8ea3a69e3da3b94d13f50f12aa7dc53246ccba25ffcace9552a0eb76b0bf36" + }, + { + "path": "crates/oa-desktop/src/semantic_review/recovery.rs", + "bytes": 28769, + "sha256": "88e69044d90c481593bab7cc125f0401c05202fccdde07698cec9483947fe8be" + }, + { + "path": "crates/oa-desktop/src/semantic_review/row.rs", + "bytes": 38159, + "sha256": "b08fdc503c6c4d2ff99adac7e18c9baa861bf86155e00b55d1e492430980d0f2" + }, + { + "path": "crates/oa-desktop/src/semantic_review/scalar.rs", + "bytes": 15153, + "sha256": "9ad202174934dd9a63fbf9cba43135aead571db60846c8b7b1d3019a11df26c2" + }, + { + "path": "crates/oa-desktop/src/semantic_review/source7_tests.rs", + "bytes": 11665, + "sha256": "5e8221d77b068fa30c1571988448cb8829711735881d810f3d333cbc95d34a9f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/tests.rs", + "bytes": 32480, + "sha256": "077ec6501dfaab0b05ea3987943b204f08352952296d313555051d998ccd232e" + }, + { + "path": "crates/oa-desktop/src/semantic_review/view.rs", + "bytes": 57626, + "sha256": "7cc7dd213ab01dadad5debaee868c30a1099466602869a799ebdf9b680e8eaf0" + }, + { + "path": "crates/oa-desktop/src/semantic_review/view_reserved_artifact_tests.rs", + "bytes": 4737, + "sha256": "6c766b29c8664d15cb113d2cc71bba9b60ae4ccf7e44c9c5d3c41e1dc4b7ed90" + }, + { + "path": "crates/oa-desktop/src/source_navigation.rs", + "bytes": 3938, + "sha256": "c1da10882f35f8eb0675e68c642c9a209dde09679cded414cfb9903a4e49ec77" + }, + { + "path": "crates/oa-desktop/src/source_tree.rs", + "bytes": 21816, + "sha256": "4d55e0110a1eb128a5d26c28f3aae5853d79b7245812b7c82bd275f38440a5aa" + }, + { + "path": "crates/oa-desktop/src/source_workspace.rs", + "bytes": 15522, + "sha256": "30f63a6b8d65a38d66061f90d864b5746cbacc0fbd65abc028a8f3071c47d358" + }, + { + "path": "crates/oa-desktop/src/style.rs", + "bytes": 3015, + "sha256": "05d61bec16141612ccafa0988e8c4827f41754509efdb3b961eab69127ded896" + }, + { + "path": "crates/oa-desktop/src/tests.rs", + "bytes": 58557, + "sha256": "b017218195eea2c96aba12eba8a99a38945c8ca910a652e272d34883bdb98691" + }, + { + "path": "crates/oa-desktop/src/view_copy.rs", + "bytes": 9043, + "sha256": "5630f31c942e1226aafd67eabdace6a5c5494875bdc6f7f077019e8110ba41a9" + }, + { + "path": "crates/oa-desktop/src/views.rs", + "bytes": 50668, + "sha256": "9b53126d19b2ae34f170a1422c9f5ea5a833489274cbfa04546279058e289f9b" + }, + { + "path": "crates/oa-desktop/src/views/traceability.rs", + "bytes": 7501, + "sha256": "4c89dcf35c25e737d8cce4d543a5989ca104a5678e6cf40df47e457773d2ef94" + }, + { + "path": "crates/oa-desktop/src/workflow.rs", + "bytes": 82963, + "sha256": "d9e7b11a86fd3ec79d91f0c9bc9cebd5a2043cdaa7261622454fb7730ad8e060" + }, + { + "path": "crates/oa-desktop/src/workflow/communication.rs", + "bytes": 11084, + "sha256": "34d121ad97706012722e4bb6210072ecc3a5b4718b0ceab0c3d0f14d4cd780a1" + }, + { + "path": "crates/oa-desktop/src/workflow/recovery.rs", + "bytes": 9859, + "sha256": "0849b0f34dba5e8761be5fa05784d134ac74e4e9db395d6b9b7d6cff71e3f3dc" + }, + { + "path": "crates/oa-desktop/src/workflow/transition_tests.rs", + "bytes": 8553, + "sha256": "589b1b2dbadca74a52c2cfcfd4fe620bd4790abd113ac02182e91616c52d793c" + }, + { + "path": "crates/oa-server/Cargo.toml", + "bytes": 778, + "sha256": "527ff5e15010a8b560a6659aa1ae4bf0c8df0d9e019f03c47529ec6a750c0982" + }, + { + "path": "crates/oa-server/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-server/src/error.rs", + "bytes": 5610, + "sha256": "93817f1502386e4662c96ee1c7d1c4afc4e33bda6fd64e46c86c8e1afd5a9368" + }, + { + "path": "crates/oa-server/src/lib.rs", + "bytes": 7743, + "sha256": "20bef350350ed6339588b23af684abf745f97916c7edf3853ee042abe687e664" + }, + { + "path": "crates/oa-server/src/main.rs", + "bytes": 4163, + "sha256": "d59a6a2b5c7034bd2e00a516d2d49abb16391bf0316c1c357ddafb9c82d2d1e3" + }, + { + "path": "crates/oa-server/src/preparation_http_tests.rs", + "bytes": 5523, + "sha256": "454b90d0055d35644c8d990cd7576ddf675a9b271ca07fe9b0efce25d8ddbc07" + }, + { + "path": "crates/oa-server/src/routes.rs", + "bytes": 46053, + "sha256": "3f9a0c22043dbf28f7a8e587d2fc3abf869f76f4d23a46fe0aeb9c4392454a4b" + }, + { + "path": "crates/oa-server/src/store.rs", + "bytes": 25524, + "sha256": "37dcfb845b7993d5bced2bcf25fedfcd2a9c20a748f9315afe6cca1f41f89ae5" + }, + { + "path": "crates/oa-server/src/store_preparation_gate.rs", + "bytes": 4440, + "sha256": "427c390da3c0281ba1fe115a93ea90800e3b45fce6bcb9185e71982ddd885fec" + }, + { + "path": "crates/oa-server/tests/http.rs", + "bytes": 71892, + "sha256": "50daa6a90e96ad6fe3c6a27df2eaebe486270599c203892d09769c547a194975" + }, + { + "path": "crates/oa-server/tests/http/communication_limits.rs", + "bytes": 5790, + "sha256": "ba5474dd8e494a0176fffb4548c8e3deb2081b15de33bfce82394c764e0a2c16" + }, + { + "path": "crates/oa-server/tests/http/data_contracts.rs", + "bytes": 25949, + "sha256": "8cd456db83f301baca380acf025a5a99db4edf7d8839537dfbd02c4307e10e6b" + }, + { + "path": "crates/oa-server/tests/http/port_anchors.rs", + "bytes": 15086, + "sha256": "7199d0a208ddad9e1518b6e3fb390d64da111716d7505ba5c995deae19ad1258" + }, + { + "path": "crates/oa-server/tests/http/semantic_transitions.rs", + "bytes": 22832, + "sha256": "856d1c9b633ffb581e3e631f4e5a607789a02181dbf060667f208a569bfa4920" + }, + { + "path": "crates/oa-server/tests/http/source6_views.rs", + "bytes": 13023, + "sha256": "867bccda0e030eeeb9976b4ceeb47b21ab5044d700278022d5fb495bbb64ca07" + }, + { + "path": "crates/oa-server/tests/http/source7_contracts.rs", + "bytes": 11000, + "sha256": "0e0a467186da7263c0754890aff69ebd0d92d36b5224e4865bb6854b18dab7e8" + }, + { + "path": "crates/oa-server/tests/http/source_projects.rs", + "bytes": 30907, + "sha256": "8ff580f317ec267d1cd72ae14d8638f74a77cdf99ca4c78f66f4290c2d77460a" + }, + { + "path": "crates/oa-server/tests/semantic_http_contract.py", + "bytes": 7251, + "sha256": "4737ff94f10761f94151a694414c5c62737e0391ec820bca132830652bc4cca2" + }, + { + "path": "crates/oa-server/tests/semantic_schema.py", + "bytes": 25111, + "sha256": "cacca116c42ffbc097f1419c0f89921fa0dfd3faa864d46820ff744cfe6967f9" + }, + { + "path": "crates/oa-server/tests/state_representation.rs", + "bytes": 12241, + "sha256": "6686c826f28248ae4b63ec3f2112e193d4a347724b87974483217fcfee49cd61" + }, + { + "path": "docs/acceptance.md", + "bytes": 3463, + "sha256": "32ed3e4fed63f5c464e0937221f401d71623b276dd70f083531ac6ccebbf9050" + }, + { + "path": "docs/api.html", + "bytes": 72515, + "sha256": "a06126cb741da57e9c06e83fc4137ccde0de05562673546bc9d405878f51ea07" + }, + { + "path": "docs/api.rst", + "bytes": 41929, + "sha256": "ca7d310138c3b4d429d80a1d03d1ac8d4a9296069e205da573034256d10438a7" + }, + { + "path": "docs/architecture.md", + "bytes": 10974, + "sha256": "a50bd1645222ef3e574fa07a6ab9aa213431ee8833c6c0158ad91ce0f799543c" + }, + { + "path": "docs/language.html", + "bytes": 175111, + "sha256": "67dcfa3477b48a0b07298ec81741840cc3ccff12c7d58164873d746d41d611c8" + }, + { + "path": "docs/language.rst", + "bytes": 134663, + "sha256": "12229dd7d52fbaba80fe599d499f29b535f4c37c7be0585664d17edf0466ba33" + }, + { + "path": "docs/linux-packaging.md", + "bytes": 8671, + "sha256": "41a1bb1095801df37a1411341c5791d55ea8c365739314d599a60269ac4bc7a0" + }, + { + "path": "docs/openapi.json", + "bytes": 346920, + "sha256": "bc5825a3182a4df5f6710a80262f4a09b4c15f0e4cda7ca74e1746ceca81a89b" + }, + { + "path": "docs/research-v2-architecture.md", + "bytes": 40445, + "sha256": "1b3809f2dabe6b1805dbf3d3f2625c471cd21356c7bd603916466a8c4ced8090" + }, + { + "path": "docs/research-v2-semantics.md", + "bytes": 31535, + "sha256": "b7ec3677300248926a88b84da3e7ffe52f5b73524c7712c927a0e951569db04f" + }, + { + "path": "docs/research-v2-service.md", + "bytes": 36209, + "sha256": "4828df5bc679e7c71f49b4b85c9e7dacbec52f46d416fed48af70e08886d4e4e" + }, + { + "path": "docs/research-v2-ui.md", + "bytes": 3245, + "sha256": "894e721b59a8ca85f0d95b6706ed5f130a0372def460cf33aeefc9e5e38cde0a" + }, + { + "path": "docs/scope.md", + "bytes": 16690, + "sha256": "a1d0cfbfc06fc8bc2bf0f71343aacc8853cbbbfc00a1fc9852ddf41c8245ffca" + }, + { + "path": "docs/server.md", + "bytes": 23361, + "sha256": "4eb24937d424ba8b384e1734e02a6f8e963ae11d2715889c92b14b39ff2e4a48" + }, + { + "path": "docs/source-cli.md", + "bytes": 3374, + "sha256": "34f12b72cc6d6ead4f47c7818c1897db592f8ad493c70776db2ab48c24d8f051" + }, + { + "path": "docs/v2-interface.md", + "bytes": 11807, + "sha256": "c7fbaf0ebd3fc9f6c11f818db2b0b9d68a33f580cfced22bde83ce08ae790bc7" + }, + { + "path": "docs/validation.md", + "bytes": 6505, + "sha256": "f46ea950ed1a54409aa07c4f9e90f39f8e2d00c1dd1b6cb805caa3993845967f" + }, + { + "path": "docs/windows-packaging.md", + "bytes": 10406, + "sha256": "2c852ff7041713ffbff3c951ac98df647c51fb70b0feba9000f7bfd5bc2703a8" + }, + { + "path": "examples/coastal-rescue.arcadia", + "bytes": 33107, + "sha256": "7e183ef9fd8154d3074303f1956cd0d9871c19e3ffc630d333b0bffbd6e30e17" + }, + { + "path": "examples/coastal-rescue.json", + "bytes": 49715, + "sha256": "242f0b031229a87af5c4ebe5d651defe59c191a6b7a69dc0a77f7e203411f195" + }, + { + "path": "examples/legacy-v1-coastal-rescue.arcadia", + "bytes": 3449, + "sha256": "4dbbbdf8bc7e6cb8e0a81dd678069dae585a9e5187c59bc3665e1fdab3f1a86a" + }, + { + "path": "examples/legacy-v1-coastal-rescue.oa.json", + "bytes": 5976, + "sha256": "fd0e9dedfb7adb922dc0575cc2b820d40344d639f1d8052bd70363aa59de9c24" + }, + { + "path": "examples/release1/README.md", + "bytes": 11137, + "sha256": "113cfb1cf38a98b51bff60442d86a35d636a3d80ef206bece7d53d0aae67f2d5" + }, + { + "path": "examples/release1/evidence/repair-check.md", + "bytes": 1419, + "sha256": "f4db17bdca4ecbb1bf0caef01b2da5f1f7f798ab3152b648ce6dd8696a6a68e5" + }, + { + "path": "examples/release1/expected-diagnostics.json", + "bytes": 288, + "sha256": "3700393d76b940cfc076bf52861bd7b1f43370f8eabce3594531bd0bf1fc851e" + }, + { + "path": "examples/release1/model.json", + "bytes": 134520, + "sha256": "ef0ef4006c3e09d5db6e1b621256b3f7d6642f3a7b09cc34607cfbcca830c727" + }, + { + "path": "examples/release1/model.rs", + "bytes": 28762, + "sha256": "15f30f6bde655808fe754665c26d560e36f2a9bad340f346b09137d0d05045f5" + }, + { + "path": "examples/release1/oa/activities/activity_oa_restore_work.arcadia", + "bytes": 1307, + "sha256": "83e73d0a013d5c3e1a4af0d9139ab0cfa362d25a846671fc2dac59181061a9d4" + }, + { + "path": "examples/release1/oa/behavior/process_oa_assessment_procedure.arcadia", + "bytes": 697, + "sha256": "172c32c044ef4b5bc58a1f4635cc81f48dabb4014479b47dce7b25fedf2dbd0d" + }, + { + "path": "examples/release1/oa/behavior/process_oa_field_procedure.arcadia", + "bytes": 1781, + "sha256": "d2552dc5383e2e91cb302a790364e197f663c2edc013a2ab1978789825c9c324" + }, + { + "path": "examples/release1/oa/behavior/process_oa_response.arcadia", + "bytes": 3225, + "sha256": "cf86f46fa5c5d70592ef43f1bc1cb4d968efd8add384ba88036bef6b88aa4abc" + }, + { + "path": "examples/release1/oa/behavior/scenario_oa_conversation.arcadia", + "bytes": 1795, + "sha256": "b25be524e98a35ebac5e4481b7609c027b32baf9605e8097f807560f94a77ca6" + }, + { + "path": "examples/release1/oa/behavior/scenario_oa_full_scenario.arcadia", + "bytes": 1261, + "sha256": "00a1edf2c9707a0eb62ac070c2d02467874f2c9c1f273cc6ddb53d6d65999a1c" + }, + { + "path": "examples/release1/oa/behavior/state_machine_oa_monitor.arcadia", + "bytes": 2022, + "sha256": "447c9ad1359f4a31ecf975ad07c0b08d8e7e03191fb0858e2fc56f377b223cd5" + }, + { + "path": "examples/release1/oa/capabilities.arcadia", + "bytes": 781, + "sha256": "fc8012e5554350b12e1cb80080f8feab80d933c9b33c0f2a7bb500cb7d609936" + }, + { + "path": "examples/release1/oa/model.arcadia", + "bytes": 661, + "sha256": "f7cf914766ea73ec53b85e32d117ea9a9dba52d3e038246863541ae7069b1a15" + }, + { + "path": "examples/release1/oa/participants.arcadia", + "bytes": 1834, + "sha256": "951764c14179f27c10e315acf2ea37d1fff54c77b8441e23addd239e8c715ce3" + }, + { + "path": "examples/release1/oa/types.arcadia", + "bytes": 788, + "sha256": "9d0396fb82dd5733edd8d1cf52f968ca84906927c704f9cf0944a7fae215cf49" + }, + { + "path": "examples/release1/project.arcadia", + "bytes": 1958, + "sha256": "b2674e6bf77cfe0f6f0ba79c81d2e96d92f39c02ca2c6266d80e91723bfb9fda" + }, + { + "path": "examples/release1/sa/behavior/process_sa_assessment_procedure.arcadia", + "bytes": 706, + "sha256": "73928ced61c06cbc08728d7956676a50fd4c05aa5b7f1ff4f29ce27a0b0f2088" + }, + { + "path": "examples/release1/sa/behavior/process_sa_field_procedure.arcadia", + "bytes": 1790, + "sha256": "886d462af83110cbfa55dd232a667ea1446761234471357cbb878794e98e8768" + }, + { + "path": "examples/release1/sa/behavior/process_sa_response.arcadia", + "bytes": 3234, + "sha256": "041785fc22842423822431bd5e6e8d16094ebd0716965e7c765fb8c1d7549e8a" + }, + { + "path": "examples/release1/sa/behavior/scenario_sa_conversation.arcadia", + "bytes": 2127, + "sha256": "97276f5757ee9aa12a0dbd9d3ccd58174b3091162bb8bcce357cec20a45f5d85" + }, + { + "path": "examples/release1/sa/behavior/scenario_sa_full_scenario.arcadia", + "bytes": 1256, + "sha256": "e12fc406b99d60a2f7768aaa0b25ba560e8605f0b8e37f3a7cdd3b8443562b74" + }, + { + "path": "examples/release1/sa/behavior/state_machine_sa_monitor.arcadia", + "bytes": 2022, + "sha256": "05ce29af99424c491c47fe2450dc6f5f8ce995511c01ec7e17bb5855be3c9736" + }, + { + "path": "examples/release1/sa/capabilities.arcadia", + "bytes": 781, + "sha256": "b6912fb3ece439912345fa71724acd462e716a1e5a88203a1058a5c3b2c20a4f" + }, + { + "path": "examples/release1/sa/functions/function_sa_audit_thresholds.arcadia", + "bytes": 297, + "sha256": "e5a04325d52183956dca814dd90f4e56c96c6b7db0f4f202f203ecb49c3e0f4f" + }, + { + "path": "examples/release1/sa/functions/function_sa_restore_work.arcadia", + "bytes": 2576, + "sha256": "fddeb67308051325041fee641fe758ddf43345b7c47b66d433616ad07fdccdd6" + }, + { + "path": "examples/release1/sa/model.arcadia", + "bytes": 661, + "sha256": "d431509251acb859fbb98733b6d18add952495e10a78703fbe8f31e40bc083c4" + }, + { + "path": "examples/release1/sa/participants.arcadia", + "bytes": 4012, + "sha256": "780d2eb08b217b67b55febb3d34846f727b8ee9018df6c5741748647e36b2ff8" + }, + { + "path": "examples/release1/sa/types.arcadia", + "bytes": 1227, + "sha256": "101fc0fbd99f1101514aa7b6da4f8e535aae0bb94c9e2b9e7e6c151135b28660" + }, + { + "path": "examples/release1/traceability.arcadia", + "bytes": 29506, + "sha256": "48a96f543456c9b5a5798fc795594e4119147fe45f11a6f109f141b7f514560f" + }, + { + "path": "examples/release1/transition-before.json", + "bytes": 35801, + "sha256": "2253e6434f741687e22327c37d520ed15c043bc36025498650bc2366bb6a874d" + }, + { + "path": "examples/release1/transition-request.json", + "bytes": 4276, + "sha256": "43b9a22e5f95ad3bc0ebd2478ead0e14406854abc989ae94ded9367b013d812a" + }, + { + "path": "examples/release1/views/diagram_oa_allocation_view.arcadia", + "bytes": 2176, + "sha256": "dfc0eb61e0e2aa5bda45524571fbfa3494f44ce19696f3e15e07438074a07bc7" + }, + { + "path": "examples/release1/views/diagram_sa_allocation_view.arcadia", + "bytes": 2173, + "sha256": "b78b43a26a82efb8fbd5374b09c329fa341f57b29f635d397b9ef8aede71d389" + }, + { + "path": "examples/release1/views/diagram_sa_capability_view.arcadia", + "bytes": 1620, + "sha256": "75e8dc9fb30f25d6f8fd3c6b595593ab4f98958a25798f961e336e0fac557649" + }, + { + "path": "examples/release1/views/diagram_sa_service_view.arcadia", + "bytes": 2209, + "sha256": "b08c84f3ea633e7c78dfdad3272f75415f6256cf3614b6d99bfd4f0269076c9b" + }, + { + "path": "examples/release1/views/diagram_sa_state_view.arcadia", + "bytes": 1931, + "sha256": "5f42f4c605e57b817d8400ed21f2b14bfc4e1592aebe941ff113767504c2b869" + }, + { + "path": "examples/routing-workshop.arcadia", + "bytes": 66431, + "sha256": "dc6b75da72884d399132ed9e300fa5a26b73d802bb526c9af986ae9eeb0a646a" + }, + { + "path": "examples/routing-workshop.json", + "bytes": 100281, + "sha256": "8592714f75b271133f21ce017d87896b6cf91ea0e4837f1c2ed453e21be26b14" + }, + { + "path": "examples/source-project/oa.arcadia", + "bytes": 2142, + "sha256": "5f60642f211b2d352a951092faeeb7503d4fb7f6f7fca99e810347231101d31c" + }, + { + "path": "examples/source-project/project.arcadia", + "bytes": 606, + "sha256": "787f6b67b179ffd221f7e5faf1a4edd74cfd116aa1e3b5e9ed9f22fbff612d8d" + }, + { + "path": "examples/source-project/sa/assurance.arcadia", + "bytes": 682, + "sha256": "ab76044836e4dcd42a82d316846ec87da2108939aa2037640c5bca1d2ecdee0f" + }, + { + "path": "examples/source-project/sa/participants.arcadia", + "bytes": 1231, + "sha256": "1abad579812e77877b45a3d8e3c3e9da734be2d04a0254cc730a5257ebd2dc88" + }, + { + "path": "examples/source-project/sa/reporting.arcadia", + "bytes": 2839, + "sha256": "f0b7443f728912ca163de39b6055876b533a77feaa3219b2d40a2dd65712e058" + }, + { + "path": "examples/source-project/views.arcadia", + "bytes": 3508, + "sha256": "e29ad3f406a6a50d2f0ae2ca2a53ee3b0c18222cd4098704a46d4f48b64ea17f" + }, + { + "path": "examples/text-first/README.md", + "bytes": 1367, + "sha256": "4ec8250d5ed556f1d496e8c85137e973e802ecb11df1a36488411e8cdc5a9f9e" + }, + { + "path": "examples/text-first/project.arcadia", + "bytes": 480, + "sha256": "f441535c623e0cf20e1875eb2cd33b587ed00e078c37af39cb36d89bb5edc19a" + }, + { + "path": "harness/fixtures/basic-editing/README.md", + "bytes": 12012, + "sha256": "3545d9695e7c62e0caa818efd7f4dc426f04876a3626e0f3b1bad606b258cb26" + }, + { + "path": "harness/fixtures/basic-editing/base/expected-baseline.json", + "bytes": 4524, + "sha256": "f239e728d650b0af32bb8f3dcaf6b27c99b9c5041132ac14e51756ea6563d978" + }, + { + "path": "harness/fixtures/basic-editing/base/project.arcadia", + "bytes": 3077, + "sha256": "045cb047d7bfbca72c3fb30db4c81a30ad463d3af7fc51604906ad7fa75a1ff8" + }, + { + "path": "harness/fixtures/basic-editing/base/rationale.arcadia", + "bytes": 57, + "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f" + }, + { + "path": "harness/fixtures/basic-editing/manifest.json", + "bytes": 447, + "sha256": "d23c21b02064ddb85e051e10e16ff089daba8d9910bb1a695dfabe2db3757734" + }, + { + "path": "harness/fixtures/behavior-creation/README.md", + "bytes": 5954, + "sha256": "9e5fc751424d12cfe76a84abb1da45b2d38947409179451bb90ffe7e7ddc8723" + }, + { + "path": "harness/fixtures/interface-operation-probe/README.md", + "bytes": 2604, + "sha256": "088f0bdb3375deb8f2c7e3b749ca8d210ea828ca4dece69b3871b674e3110175" + }, + { + "path": "harness/fixtures/interface-operation-probe/hashes.json", + "bytes": 977, + "sha256": "f6d3e8aa42f40f64ce2ecba7b9cf112eb9091f3cccde3a592b0434e834cf2a6a" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/after-reset-deletion.arcadia", + "bytes": 4218, + "sha256": "c0fe9570684c0061efc4cad65e339fede6961b04ca90c6f324c787bd65e61226" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/after-reset-deletion.json", + "bytes": 7835, + "sha256": "93187f7a1b476a44185725c6b15f2e1767482b6911ab1280144348d033eb51f0" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/boundary-only.arcadia", + "bytes": 4771, + "sha256": "02f85e39957ebe6d56336fa729a5c8b10f51865face9d3b2c9679200571fcfc7" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/boundary-only.json", + "bytes": 8840, + "sha256": "756f9710336e6734ce3592ca774c6f104bba5a37c9e165540eb39326682393d1" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/explicit-functional-refinement.arcadia", + "bytes": 8635, + "sha256": "ac5b629ba5596464f9f8a975b8bc2764e3007ceb7342de3f828d4b18e4f069b7" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/explicit-functional-refinement.json", + "bytes": 16160, + "sha256": "78a47c978dc667aa1c45af711f06aa2a0d3c581003013e30c3e02fb0faae2e64" + }, + { + "path": "harness/fixtures/interface-operation-probe/probe.rs", + "bytes": 11274, + "sha256": "72b1b443e25eb20420dec4477b0fb5ef5d1c705e3882c81df88dd578ab96a426" + }, + { + "path": "harness/fixtures/release1-native/README.md", + "bytes": 2564, + "sha256": "5f5ba040fd2df9261a29bcab3f9a7ae27c3683265411ad3dda0b467d5df8590e" + }, + { + "path": "harness/fixtures/release1-native/artifacts/README.md", + "bytes": 4155, + "sha256": "24200c84ccc2ef3e17c029744074e5cea785188f5549ac54e44cf89682643f81" + }, + { + "path": "harness/fixtures/release1-native/artifacts/generate-semantic-artifacts.rs", + "bytes": 9275, + "sha256": "444f360b78df52c5e42046f77b148781e0c9bddc2a09c0b7bd65c7a4f376cfe6" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.after.arcadia", + "bytes": 7768, + "sha256": "84b22e95c213018612e6e8a84cad68b35a8b495ff3515b0f978c5e7a3d196d79" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.after.json", + "bytes": 7330, + "sha256": "13a6f99ec2df1dd35ee8b2613f183918cd9537eda4a5da085ad52e65c033db59" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.arcadia", + "bytes": 1446, + "sha256": "1e0d662ba33071b122ad9206d2d559a8e748c9431eb3ac1b759bde3760ca877c" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.json", + "bytes": 2216, + "sha256": "fa6a2e3643c0f909b92407abec3edc897033162eeaa501f8d4616f79d41fa044" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.manifest.json", + "bytes": 567, + "sha256": "65cb70b0d697a055363ba01bf30bed7e412d43c9978a033549c378d117719ae7" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.request.json", + "bytes": 3991, + "sha256": "ed905267263e7f8a0cd2dbe833196b30118b6a246815216932fae661ad650699" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.after.arcadia", + "bytes": 6837, + "sha256": "e50fc462ec22dbf98011929931dd2489430001c3e6433608685b9d88bceb9acb" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.after.json", + "bytes": 6433, + "sha256": "f27a7b38d59c7cefe58cb36783d3d4dd8d8ae1168d9aed1eb61d343c18758908" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.arcadia", + "bytes": 1807, + "sha256": "eba2aec39e6efb405eace4bc8ab0c5563907c26d449e71a4aa750df9f73233b4" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.json", + "bytes": 2673, + "sha256": "2ef777f19b94f08b5e5ca2ef727777897e1018f1426eee291408b3c69101f596" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.manifest.json", + "bytes": 519, + "sha256": "3af7232ed3056ca84dcaf0f266ead3faaa512a0dc0051c7ba68791c20dbae0cf" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.request.json", + "bytes": 1246, + "sha256": "8af21b00b62e620256fbf50e47c6c5836cdb6922d9549cc4b3d86bc03b008073" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.after.arcadia", + "bytes": 4200, + "sha256": "20bb30473830e44228958e78fb7480269cdcc0580c6c90c718da75f34ca5a43f" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.after.json", + "bytes": 4552, + "sha256": "44f4b05db49758dcf344788f57cecc0250fd029099b1c54e4e1e3e972f6cf039" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.arcadia", + "bytes": 1808, + "sha256": "b0fd031671c9f755756922ec5c40a0ce3f40164d22c3c389aec9fd0705344da7" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.json", + "bytes": 2673, + "sha256": "1acf81e08c51c85aceb14a3efbc39ec680552a19c7824aab4611ac3cf71b9c6d" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.manifest.json", + "bytes": 610, + "sha256": "a07978f4b0a3ca83e5ae5f35e7b66b26473b24431fc90e5889d755f1816d52dd" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.request.json", + "bytes": 2352, + "sha256": "5ff844a038b0030adb5a83d13d81e60f30627543388f6199b6a0e026fc42ea58" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-native.md", + "bytes": 4075, + "sha256": "a51ffbc45b6c172cbfed3b16c249296e6a28d457fea57393dd958cdcfbafbca1" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts.hashes.json", + "bytes": 2367, + "sha256": "3ad8b7428b3ed7585a91e7f5d9d5f4880caccfd0b08dca25d05af523e62e0a10" + }, + { + "path": "harness/fixtures/release1-native/communication-means/README.md", + "bytes": 15091, + "sha256": "015c16010c212af283f9def118c6d263ba65a3bc6e81a750f180624ca69bb311" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/entry.arcadia", + "bytes": 6098, + "sha256": "a6976e7c21031e7cc3cb731e20c3075cf89cf85144dc8d3f52930f8521ea196f" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/expected.json", + "bytes": 10480, + "sha256": "60c4419415c546f06c9972ac7bb0e530ada7b30a200b59e75ddda231a24f9a3d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/traceability.arcadia", + "bytes": 407, + "sha256": "3c41459f2b0706a767988738bf8126f76540415bb5940d9c5db19cbe8c18182d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.request.json", + "bytes": 1331, + "sha256": "b16e673b29c96b5aed681389ff7669110abe552939e86dd0ec6011c9a45ed860" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-draw.arcadia", + "bytes": 5239, + "sha256": "a511a4d817d9c5c80233bce83e84a7056b7dce7afd9fcc25696e333f8f4df055" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-draw.json", + "bytes": 8424, + "sha256": "7140114926228b1c378c450535f7a70992c71a879a8d2270c49e8d5f04a2f484" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/entry.arcadia", + "bytes": 5710, + "sha256": "910e6dfe609467047ce629ec9c626f4e927cada74bfbfa164414a8fe6783ea87" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/expected.json", + "bytes": 9868, + "sha256": "567259e20c9f6278776e8fa99b8b2fdbbc9a883ad875c5d39dae1b53de3a2924" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/traceability.arcadia", + "bytes": 407, + "sha256": "997f72fe9258012df66e88344cf39c1a2cebf2327f604056b67f7f2a8ebcfbfa" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.request.json", + "bytes": 1127, + "sha256": "cb3fe05859cfffec6f8846c19983dc462413bc0ea4f6e19204f09c259919c4b1" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/cm-reverse-scenario.arcadia", + "bytes": 8209, + "sha256": "ec826b9b84616507490ac30e4d57100dd6338dba2f7071e879a8fb58820a85c5" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/expected.json", + "bytes": 19735, + "sha256": "ef07e4d2d3fc36004ff01739838281581d9a703c747611eacc01bb9cc672489f" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/oa/behavior/scenario_oa_cm_200.arcadia", + "bytes": 1488, + "sha256": "0ec8d7e38f5a5cd56ccf3979757b3a9f412ad0ae36ee6c2690b7872129046d70" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/request.json", + "bytes": 1090, + "sha256": "c0ac99ee186d126fe3ec57f2c0a4072984d39d36ad21ead357ab66a08ac0065c" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/traceability.arcadia", + "bytes": 2068, + "sha256": "dd5d356390089e4ec474374956f6219502733987e60ef8ff32920d8b33dce858" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/entry.arcadia", + "bytes": 9827, + "sha256": "86dd8a355f6c9dadfea56d06e5247c9b0f820819d7df17ef5690671c7c81324b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/expected.json", + "bytes": 21877, + "sha256": "980489ec2c483d4f9efada61358c1f29bafb2572fd5b804c656b91b8e9bb4f9a" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/oa/behavior/scenario_oa_cm_200.arcadia", + "bytes": 1488, + "sha256": "0ec8d7e38f5a5cd56ccf3979757b3a9f412ad0ae36ee6c2690b7872129046d70" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/traceability.arcadia", + "bytes": 2068, + "sha256": "dd5d356390089e4ec474374956f6219502733987e60ef8ff32920d8b33dce858" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.arcadia", + "bytes": 7698, + "sha256": "1abc4c4cac37cfb06ed3b12a115f9e7e6a2d3affd34b25c355309e5ee465fa40" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.json", + "bytes": 13130, + "sha256": "a5cf4cb2ef390113dd752f4054d43fb789da2ca77799efb5782805ae8aa2dfd5" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.request.json", + "bytes": 1090, + "sha256": "c0ac99ee186d126fe3ec57f2c0a4072984d39d36ad21ead357ab66a08ac0065c" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-transition-ready.arcadia", + "bytes": 5454, + "sha256": "b761c4c2af5f7064aaf1f887ffd6094eb6ae834b2c8057ecdbc4aa97c042066b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-transition-ready.json", + "bytes": 8852, + "sha256": "2536b000de361fb131787e32b466b9123d4e98abf00c099ad32f6cb8e7fb530b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/generate-communication-means.rs", + "bytes": 28035, + "sha256": "003521404b702332082e01f2be7676fda1dd7b5bcf220bb81d25120c8984c75d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/hashes.json", + "bytes": 3133, + "sha256": "39b4dc02fc8b074015c59354fd1c1061c25832fde25065c7151f36eb0455e6f6" + }, + { + "path": "harness/fixtures/release1-native/communication-means/manifest.json", + "bytes": 1237, + "sha256": "fb921f42f2c4a4f8a67d1266f17f8c7750b6a2619554b713aa92b17918f0c43e" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40-oracle.json", + "bytes": 26264, + "sha256": "74edca148583f42c269e51f135662f65ef1c9ea1c94516d63e2a5091967dc99b" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40.arcadia", + "bytes": 28947, + "sha256": "00b87736b82c5afd33b311df7aebe9a6c8c51b6de66221181b5ea8bc8ca221a3" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40.json", + "bytes": 54938, + "sha256": "5dd4f22453330cab3abc059881660190e689a22619853f77cf6d0b52735d97ad" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments-native.md", + "bytes": 2624, + "sha256": "28906924b05f75bbf432389517aef65f1df474d2f2bff79a3586564f7f7328ef" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.after.arcadia", + "bytes": 6795, + "sha256": "9d084dd75a0251d349cc31f9ee98df58d0bc76859dc3cb1503f242e2f759888a" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.after.json", + "bytes": 9618, + "sha256": "f09be41afd85c18fd52fdf997e9b81c4b7cb2c41e78d167abcd14caea8110333" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.arcadia", + "bytes": 4990, + "sha256": "8740f27be99624013d9be876639c0411e1b8c14f0f9a843f43dc71d769efd79a" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.hashes.json", + "bytes": 963, + "sha256": "00fc9e2c709bdcd9ee98012176cb0edb635c112153d963cd169bf4bf69a9e010" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.json", + "bytes": 8146, + "sha256": "9c188f2890630c7feec2be719a7104af9690da7ea836df18fa78da3ff2acfc1b" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.manifest.json", + "bytes": 1045, + "sha256": "46b40f221ffad614733b615208814ace63947e96b80bbfdec63853ccd4f4e8c8" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.request.json", + "bytes": 3075, + "sha256": "b57f656f0b9cf2c595e83150c683301909e20f15684d35d108d3c57ee0dc5909" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch-native.md", + "bytes": 2637, + "sha256": "dddca2b85f892b05881c75ef3cd62437396cc086a09909b621e02bad0cbe56ff" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.after.arcadia", + "bytes": 3134, + "sha256": "d3315bba762395205ae761e6e64029e8b4070c15a1299c6114075581db7b0974" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.after.json", + "bytes": 3927, + "sha256": "8f36119c7e893a4af374b13b85b1c2cb3df0196df8d06a551386628fc8b8646d" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.arcadia", + "bytes": 1787, + "sha256": "5e1f433e04621424edac43e53411624059e873f88dd531bfdb39093953485ed7" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.hashes.json", + "bytes": 933, + "sha256": "1bd87700b04e4f169ab5f8aceaa3b0c3ec3a1cc43e1bce135a1cee506fc75d38" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.json", + "bytes": 2816, + "sha256": "1972242d2a8677d004dc3af1081feb292de65fe26128d877dded8661f9906619" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.manifest.json", + "bytes": 647, + "sha256": "1e440efa02e2ccc27585d9a49c7864d53e3e3e7645ccb219f040e00d95331b8e" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.request.json", + "bytes": 2197, + "sha256": "71f23474614aab90398ce24f00f2cf61d6cb9a3a34faa3e12e0c8104e0a71073" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-repair.arcadia", + "bytes": 15635, + "sha256": "e3ce0347746584f503b825a8b6bd23a7eebf0827940112ef8f36d500c1d0a043" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-repair.json", + "bytes": 25736, + "sha256": "29736f2a619f7f2d0e795229f6e8c3645a1b4eca6292043cd604aa01b1ec9170" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-take.arcadia", + "bytes": 15631, + "sha256": "9ab573c92be66e3bae659dd826923ba6066979b1651edda7bd469056632cd77e" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-take.json", + "bytes": 25736, + "sha256": "828c990c6129692cd31c7f6ed0dd6c952f9cfffdd90bc80171df82d4d929afba" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.arcadia", + "bytes": 15617, + "sha256": "49214be2ca9c8bb6195c3b39737c053847021839f70f0bb2921d35a1fbd2ac83" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.invalid-request.json", + "bytes": 2225, + "sha256": "8b02d4739b1be2c8a64da76423b4a6cae7d89c60f4d30723b94f1da3779cbcca" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.invalid.txt", + "bytes": 78, + "sha256": "aa536e18bc65325163e9b645a4ad031ab599fcb05948dcf741b725d0f0c8b602" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.json", + "bytes": 25722, + "sha256": "995dd72f5c1f07f998233ae9847e337cb82de0c2a9053d3905be021d5f8124b9" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.manifest.json", + "bytes": 1059, + "sha256": "ad315359bfd68ce0d265976dc9e4ea6a502ebbb87d7339dd1af5ef27dd01e433" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.repair-plan.json", + "bytes": 15016, + "sha256": "27bf316ad66ffa91f6323e75b0c280baf5caec298645793dea72c5d42aa3b782" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.repair-request.json", + "bytes": 2225, + "sha256": "f4f6b5480ec8927033ea469ea82c1e8411cb6dba95d2da680f15bc193914c9b4" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.steps.md", + "bytes": 3897, + "sha256": "7d7e38d93641a5f22a2738baa4dbacc392eebb477a855cdce0641961980a19ad" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.take-plan.json", + "bytes": 18557, + "sha256": "74dd68ba686b8928054480f0bfed55aad91f6f1208803399dc9878e894f57ecb" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.take-request.json", + "bytes": 1508, + "sha256": "d19a53002a6bf95af3123a3ef9f78baaf7ce1085d4f06f0f4a9d5e5d5accbc0e" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.after-order.arcadia", + "bytes": 6935, + "sha256": "90277f1780d43a6f0b2184bf00b87e7a4f3518d67c6f10d4793daafe1aabf493" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.after-order.json", + "bytes": 11286, + "sha256": "5a3c8494f6976c23b990c14b40760fb2f32ca9973caf6f31dab5632310663591" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.ambiguous-request.json", + "bytes": 1379, + "sha256": "6a86fde194faa55f2d1bdb982571e0e711e5401b53a960e6acb8cf3e17f506c8" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.arcadia", + "bytes": 6195, + "sha256": "e7c30c5a5c3ba7209c8e223f02da55821d7af10a2f09844a7065ae6cd8f22aa5" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.final-plan.json", + "bytes": 19156, + "sha256": "d1e5c2ed08e0aa6274a0421a39876d1ba99f4e441c7a0a68660a83b9e017da14" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.final-request.json", + "bytes": 2418, + "sha256": "433f723252598994dac7184da61f95344b528156cc5a0fba1a7864b2ec9f002b" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.json", + "bytes": 10441, + "sha256": "9e4e2ce1c7879935ad0860a3ae720506c929a8422b51491b719d88af3fd3ff2d" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.manifest.json", + "bytes": 1042, + "sha256": "87e8899c7d4e54faedeef32afb7592fb65278d1bd7390850ab198dcf62068329" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.after-order.arcadia", + "bytes": 6280, + "sha256": "6c77ed42bbf9f4ebe08bfa233197a4020e5587ce33747f7914430aa0c662d9a3" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.after-order.json", + "bytes": 10009, + "sha256": "1dd7ca2bcfc84ac23369c506302b39569d2ebc41e5a4edc99378a1fe01923b7e" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.ambiguous-request.json", + "bytes": 1390, + "sha256": "e0ea7aeb25687ae63c65128f1aab78273f14030d179d3fbea63fe91ab5430136" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.arcadia", + "bytes": 5529, + "sha256": "563c36162050c8564ffa25a85c726462ecdaebdb87659b3f3610506bfd5581e6" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.final-plan.json", + "bytes": 18821, + "sha256": "f96c43fc58dbe48a044b628b31bb3f0b59171dad5b6982ec6c34a5597e474130" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.final-request.json", + "bytes": 2438, + "sha256": "d38fdb13612b07254edad80848f79c1e097d5f868c020feae9ba072aa697a50d" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.json", + "bytes": 9153, + "sha256": "2ed0daed118f2df13dcad738dab174ad34d44a15921cf8097415e707978b0968" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.manifest.json", + "bytes": 1058, + "sha256": "c79bd12a85d8d4f25cc3ee43581b3e5e74ae9ad7e4de0c72764975ba2b89c279" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.after-order.arcadia", + "bytes": 5026, + "sha256": "98020e048ac01f285c6ad8c10ce22bef05e193b5ba0f5558be1fb26a7bf82620" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.after-order.json", + "bytes": 7851, + "sha256": "ea3783992488bc6ee944eb91a26ccf3dbc05a3909528fc32ec8023a76765cee6" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.ambiguous-request.json", + "bytes": 1379, + "sha256": "ea3cfd25f7a50481805956fb88ab851516dcd602dd6564502a0cc55f7de6a54f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.arcadia", + "bytes": 4295, + "sha256": "2b7c3694623bbea3e36dcc6f674d4adcd91e23c8e1005ded21e5a69648a048e5" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.final-plan.json", + "bytes": 17912, + "sha256": "95a23bd334cffcaef0c3b1012b7555efd2a077ef6f9140d58020910ef8a76723" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.final-request.json", + "bytes": 2081, + "sha256": "1e2433ed5821bf65443f56cb27381ee935db81b1955d3a539b7952898312a410" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.json", + "bytes": 7012, + "sha256": "0033f8780c2ba69779b811bca792340c25a092f887e5811c6839f0a691d744f2" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.manifest.json", + "bytes": 1046, + "sha256": "e3b4a60a56abee779ca8356605c968aa2d99256a3bd3c5601b14b5c5502a1a05" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.after-order.arcadia", + "bytes": 5467, + "sha256": "e265cab35097acc46f5123107c13bc35b9f71931ff650557fc1c85779141b327" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.after-order.json", + "bytes": 8482, + "sha256": "9b777828d3681138de6bbd08de8bf922bed92c27be60b103d8ff73ce7ddd0a48" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.ambiguous-request.json", + "bytes": 1379, + "sha256": "7d124256730bf2feee772c7d0118b87eb288e8aaa9179d69ceb9259dbceb2c71" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.arcadia", + "bytes": 4727, + "sha256": "87a5a3665dab2dd6e595867dcebb1586e93dd067c85d6e24b1a4d3ff0ad6d4ba" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.final-plan.json", + "bytes": 18803, + "sha256": "1888ca51e0923866a9afea99cad069fe5d3f19f0a1b24328e20ac1b9f52d8bad" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.final-request.json", + "bytes": 2294, + "sha256": "5070a5b85feb1bc7b1fc648cd5d35ef26663492c8666dcd471950c06ec3a6052" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.json", + "bytes": 7641, + "sha256": "725b35e36640c81c70c7efea5c3304bf61b49ef9664194ca0d491782cc62191a" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.manifest.json", + "bytes": 1038, + "sha256": "1b43abf8fed3061c65a7b7cb103d31ea7ece333a2da83c645f8d228448c4dbb2" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.after-order.arcadia", + "bytes": 5019, + "sha256": "65a6217f474b5085f37b511151185c2c08ff7a1998e924f1fe01f29c410f6ced" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.after-order.json", + "bytes": 7835, + "sha256": "8a53bb9b43eab5b6dca5e08deef20c14c96e134b9ee816a99b7960bb5255e008" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.ambiguous-request.json", + "bytes": 1379, + "sha256": "c704f99245f00d5c3be0562d91931b4e7f1fb3fb36f41991eb76656ffbd6129f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.arcadia", + "bytes": 4279, + "sha256": "c59ec1233d5a9fbb8e386f6d9b13f398be21baf813ba215efb51bfc1bb98db36" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.final-plan.json", + "bytes": 17938, + "sha256": "30c5c3f614a74708763df612016483623792f4c65e2ed2fa662ac417cfb852eb" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.final-request.json", + "bytes": 2098, + "sha256": "3b6c35ef78133f0980cb6fb53fbc29c5d3c4deb5dc4be01c2c3384e221987b9b" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.json", + "bytes": 6996, + "sha256": "c159c60403abcf8fefab7f19cbad9989488e8ccc20b82c57597b22a0ae254802" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.manifest.json", + "bytes": 1038, + "sha256": "af8a314a9b1d85a8f98affa5a6649f43d252851158798e1ad687bb1b6966b14f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.steps.md", + "bytes": 4549, + "sha256": "6004894e9d9f478b7fe1c3c3e0706dcc546d5df8557cff91b4cf26f8a4badf24" + }, + { + "path": "harness/fixtures/release1-native/source5-recovery/15000000-0000-4000-8000-000000000010.json", + "bytes": 1933, + "sha256": "71cca2a59f36b2a07d11dedbe9101226aa1a4a00d8ac244b5565202e56709f51" + }, + { + "path": "harness/fixtures/release1-native/source5-recovery/generate.py", + "bytes": 1496, + "sha256": "e44986c1d563499f25917441220b23883fc9cb0f89faf409873191f0212fbd2f" + }, + { + "path": "harness/fixtures/release1-native/state-actions.arcadia", + "bytes": 6224, + "sha256": "9cde82608110e56aa9e14c9e33eb38976f53aed74ab013145d411d5743a0ec26" + }, + { + "path": "harness/fixtures/rest-coverage/README.md", + "bytes": 1870, + "sha256": "df4a391312e0c8b20ccdcc850199443b08547be1b10b1f2447a067bf4bf544e6" + }, + { + "path": "harness/fixtures/rest-coverage/coverage-probe.json", + "bytes": 7951, + "sha256": "2d1ef7bdb5d7bf17b9fda33b1d1790d1d88289b3fd1e725f89b83a69771f9a43" + }, + { + "path": "harness/fixtures/rest-coverage/run-coverage-probe.ps1", + "bytes": 9381, + "sha256": "f24f19fca418b76a7249894a08c116e16b465a02f8f899d12b808ccfdd90a3bd" + }, + { + "path": "harness/fixtures/run-timed-bundle-oracle.ps1", + "bytes": 7466, + "sha256": "fab696486a574f9867c6e69a8a8b960e7e9722206441b9cc5f36d41f285f1a25" + }, + { + "path": "harness/fixtures/scenario-authoring/README.md", + "bytes": 14700, + "sha256": "6b651b180b76d10b00bc49d77a8f5e0b3ba0317446978f41b541f5bb23fedad8" + }, + { + "path": "harness/fixtures/scenario-authoring/base/expected-baseline.json", + "bytes": 38589, + "sha256": "abd8246c939ebb8a2162ef82e23d0fb322ee1a8b4d0d7c28a34037e42e86e841" + }, + { + "path": "harness/fixtures/scenario-authoring/base/project.arcadia", + "bytes": 19470, + "sha256": "9b1afbe96b0bf8fa613451b00929492f05a59b9eb2ca74c2c374a8b7bb7cba9e" + }, + { + "path": "harness/fixtures/scenario-authoring/base/rationale.arcadia", + "bytes": 86, + "sha256": "82df210f22f6aa336a3e7e00240977d671c7c3923db7bc58fb29e6d98b67ef49" + }, + { + "path": "harness/fixtures/source7-native/README.md", + "bytes": 7235, + "sha256": "7abccbc3da0980d1d099761d1a66d12c403a0f543954134537ecd4930d182b4b" + }, + { + "path": "harness/fixtures/source7-native/base/expected-baseline.json", + "bytes": 26428, + "sha256": "e2882a58f841f460f45d9d67db1606440e0d7997b9b29a784569ae48e4b23bfb" + }, + { + "path": "harness/fixtures/source7-native/base/project.arcadia", + "bytes": 13616, + "sha256": "5474d8ca05fd1375220dc0ad40d913631fde51159e9632bb9f290d1ecdab8dd7" + }, + { + "path": "harness/fixtures/source7-native/base/rationale.arcadia", + "bytes": 59, + "sha256": "e6a600e13036d4ad594a65380ed1b3d82d1772d583041bb0a624c9588a73047a" + }, + { + "path": "harness/fixtures/source7-native/manifest.json", + "bytes": 410, + "sha256": "6c57164a796234d83818d462d0a25f10e77062d405769e602ae2a7bec251e3b6" + }, + { + "path": "harness/fixtures/staged-source-authoring/README.md", + "bytes": 6876, + "sha256": "502be5e3bf9112447dc07b1a51fe0fa301754b47128a9b81877c185c6e797fee" + }, + { + "path": "harness/fixtures/staged-source-authoring/base/notes.arcadia", + "bytes": 63, + "sha256": "ad9de02963c20d1f43856455a797deb05ca674659e45f2c4b96b52783024f8bd" + }, + { + "path": "harness/fixtures/staged-source-authoring/base/project.arcadia", + "bytes": 593, + "sha256": "aa844950ec4fb86f262a257e1fc370a26557ea7978d8a4cab78265037660234c" + }, + { + "path": "rust-toolchain.toml", + "bytes": 66, + "sha256": "a6a0bbd29ffaa8182dc22d1d9149709f1091e47df40ed96eb8a78a711c66a4ce" + } + ], + "artifacts": { + "arcadia-studio.exe": { + "bytes": 113939456, + "sha256": "c990fa05772c60666ecf96ab808e6140e57542ad448ddd092b977be0b587136f" + }, + "libunwind.dll": { + "bytes": 190464, + "sha256": "aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a" + }, + "gui.log": { + "bytes": 155, + "sha256": "b9c4bb81ce6356efb1a7ea16336872ec1563e1ed8affb7311330cee275b832f9" + }, + "full.log": { + "bytes": 95313, + "sha256": "0c4a9b5ad67e779c755e4fc86dc16c5c99f5d05ddd19844e3a0f133b8ab6467a" + }, + "clippy.log": { + "bytes": 155, + "sha256": "7bf483369325f031c89a43e05984dbc287ac8d9c3354a21be44ca34b2101c572" + } + }, + "acceptance": "Matching Windows gates closed; native GUI acceptance pending. Linux/WSL paused." +} diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/stderr.log b/harness/experiments/canvas-native-d61f1f3-20260912/stderr.log new file mode 100644 index 00000000..e69de29b diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/stdout.log b/harness/experiments/canvas-native-d61f1f3-20260912/stdout.log new file mode 100644 index 00000000..e69de29b diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/tools/archive-canvas-native-d61f1f3.py b/harness/experiments/canvas-native-d61f1f3-20260912/tools/archive-canvas-native-d61f1f3.py new file mode 100644 index 00000000..42351a87 --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/tools/archive-canvas-native-d61f1f3.py @@ -0,0 +1,155 @@ +"""Archive only the closed, identified canvas native trial; never stage/commit.""" +from pathlib import Path +from datetime import datetime, timezone +import hashlib +import json + +root = Path(__file__).resolve().parent.parent +trial = root / '.local/native-qa/canvas-paint-d61f1f3-20260912-01' +stage = root / '.local/native-qa/studio-d61f1f3' +prefix = 'harness/experiments/canvas-native-d61f1f3-20260912' +destination = root / prefix +source = 'd61f1f38779ab70a77efcde523ae31c432aefcfd' +result_path = root / '.local/canvas-native-d61f1f3-archive-result.json' +assert not destination.exists() and not result_path.exists(), 'Never overwrite an archive/run' +assert destination.resolve().is_relative_to(root / 'harness/experiments') + + +def digest(path): + raw = path.read_bytes() + return {'bytes': len(raw), 'sha256': hashlib.sha256(raw).hexdigest()} + + +def read(path): + return json.loads(path.read_bytes()) + + +def verify(path, record): + actual = digest(path) + assert actual['sha256'] == record['sha256'], str(path) + if 'bytes' in record: + assert actual['bytes'] == record['bytes'], str(path) + + +def write_new(path, record): + with path.open('x', encoding='utf-8', newline='\n') as stream: + stream.write(json.dumps(record, indent=2) + '\n') + + +launch = read(trial / 'launch.json') +closure = read(trial / 'closure.json') +prepared = read(trial / 'preparation.json') +staged = read(stage / 'manifest.json') +assert launch['source'] == staged['source'] == staged['full_test_source'] == source +assert closure['pid'] == launch['pid'] and closure['exit'] == 0 +assert prepared['utc'] < launch['utc'] < closure['utc'] +assert Path(launch['binary']).resolve() == (stage / 'arcadia-studio.exe').resolve() +assert launch['sha256'] == staged['artifacts']['arcadia-studio.exe']['sha256'] +for name in ['arcadia-studio.exe', 'libunwind.dll']: + verify(stage / name, staged['artifacts'][name]) +for name in ['full', 'clippy', 'gui']: + gate = staged['results'][name] + assert gate['source'] == source and gate['exit'] == 0 and not gate['changed_inputs'] + +baseline_names = ['bound-baseline'] +baseline_records = [row for row in prepared['files'] if Path(row['path']).parts[0] in baseline_names] +for row in baseline_records: + verify(trial / row['path'], row) + # Original baseline sources are independently retained elsewhere too. + verify(root / row['source'], row) +assert {row['path'] for row in baseline_records} == { + path.relative_to(trial).as_posix() for name in baseline_names + for path in (trial / name).rglob('*') if path.is_file()} + +checkpoint_records = [] +checkpoint_files = set() +oracle_identities = {} +for path in sorted((trial / 'evidence').glob('*.json')): + record = read(path) + assert set(['snapshot', 'command', 'checker_sha256', 'exit', 'files']) <= record.keys(), str(path) + assert record['exit'] == 0 + snapshot = Path(record['snapshot']).resolve() + assert snapshot == (trial / 'checkpoints' / path.stem).resolve() + assert record['utc'] <= closure['utc'] + actual = {p.resolve() for p in snapshot.rglob('*') if p.is_file()} + declared = {(snapshot / row['path']).resolve() for row in record['files']} + assert actual == declared + for row in record['files']: + item = (snapshot / row['path']).resolve() + assert item.is_relative_to(snapshot) + verify(item, row) + checker = Path(record['command'][0]) + verify(checker, {'sha256': record['checker_sha256']}) + oracle_identities[str(checker.relative_to(root))] = digest(checker) + assert (trial / 'evidence' / (path.stem + '.log')).is_file() + checkpoint_files.update(actual) + checkpoint_records.append(path.relative_to(trial).as_posix()) +assert checkpoint_files == {p.resolve() for p in (trial / 'checkpoints').rglob('*') if p.is_file()} + +payloads = [] +for name in ['preparation.json', 'launch.json', 'closure.json', 'stdout.log', 'stderr.log']: + payloads.append((trial / name, Path(name))) +for name in ['evidence', 'checkpoints', *baseline_names]: + for path in sorted((trial / name).rglob('*')): + if path.is_file(): + assert path.resolve().is_relative_to(trial) and not path.is_symlink() + if name == 'evidence': + assert path.suffix.lower() in ['.png', '.json', '.log'], path + payloads.append((path, path.relative_to(trial))) +for name in ['canvas-native-paint-session.py', 'canvas-paint-checkpoint.py', 'canvas-native-checkpoint.py', Path(__file__).name]: + payloads.append((root / '.local' / name, Path('tools') / name)) +payloads.append((stage / 'manifest.json', Path('stage/manifest.json'))) +assert len({relative.as_posix() for _, relative in payloads}) == len(payloads) +assert not any(relative.parts[0] in ['profile', 'temp', 'compact-work', 'bound-work', + 'draft-work', 'process-work'] for _, relative in payloads) +before = {str(path): digest(path) for path, _ in payloads} + +destination.mkdir() +rows = [] +for path, relative in payloads: + target = destination / relative + target.parent.mkdir(parents=True, exist_ok=True) + raw = path.read_bytes() + with target.open('xb') as stream: + stream.write(raw) + verify(target, before[str(path)]) + rows.append({'path': relative.as_posix(), 'source_path': path.relative_to(root).as_posix(), + **before[str(path)]}) +for path, _ in payloads: + verify(path, before[str(path)]) + +# Only append a scoped rule; never rewrite or normalize existing attributes. +attributes = root / '.gitattributes' +attribute_before = digest(attributes) +rule = prefix + '/** -text whitespace=-blank-at-eol,-blank-at-eof,cr-at-eol' +current = attributes.read_bytes() +added = rule.encode() not in current.splitlines() +if added: + assert (prefix + '/').encode() not in current, 'Review an existing prefix rule instead of replacing it' + with attributes.open('ab') as stream: + if current and not current.endswith(b'\n'): + stream.write(b'\n') + stream.write(rule.encode() + b'\n') + +manifest = {'archived_utc': datetime.now(timezone.utc).isoformat(), 'source': source, + 'native_trial': trial.relative_to(root).as_posix(), 'native_pid': launch['pid'], + 'native_exit': closure['exit'], 'payload_count': len(rows), + 'payload_bytes': sum(row['bytes'] for row in rows), + 'verified_checkpoint_records': checkpoint_records, 'verified_baseline_files': len(baseline_records), + 'oracle_binary_identities_not_native_app_source': oracle_identities, + 'exclusions': ['profile', 'temp', 'compact-work', 'bound-work', 'draft-work', 'process-work'], + 'byte_policy': 'Copied source bytes exactly, including CRLF; originals unmodified. Source paths are provenance, not portable execution paths.', + 'attributes': {'rule': rule, 'appended': added, 'before': attribute_before, 'after': digest(attributes)}, + 'files': rows} +write_new(destination / 'manifest.json', manifest) +assert {p.relative_to(destination).as_posix() for p in destination.rglob('*') if p.is_file()} == { + row['path'] for row in rows} | {'manifest.json'} +result = {'archive': prefix, 'source': source, 'native_exit': closure['exit'], + 'payload_count': len(rows), 'archive_file_count_including_manifest': len(rows) + 1, + 'screenshots': sum(row['path'].endswith('.png') for row in rows), + 'checkpoint_count': len(checkpoint_records), 'payload_bytes': manifest['payload_bytes'], + 'all_payload_source_and_destination_hashes_equal': True, + 'manifest': digest(destination / 'manifest.json'), 'helper': digest(Path(__file__)), + 'attributes_rule_appended': added, 'git_staging_or_commit_performed': False} +write_new(result_path, result) +print(json.dumps(result, indent=2)) diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/tools/canvas-native-checkpoint.py b/harness/experiments/canvas-native-d61f1f3-20260912/tools/canvas-native-checkpoint.py new file mode 100644 index 00000000..cc002fa1 --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/tools/canvas-native-checkpoint.py @@ -0,0 +1,40 @@ +from pathlib import Path +from datetime import datetime, timezone +import hashlib +import json +import shutil +import subprocess +import sys + +root = Path(__file__).resolve().parent.parent +trial = root / '.local/native-qa/canvas-followup-20260912-01' +name, work_name, mode, baseline_name, entry, *extra = sys.argv[1:] +assert name.replace('-', '').isalnum() and mode in ['same', 'removed'] +source = (trial / work_name).resolve() +baseline = (trial / baseline_name).resolve() +assert source.is_relative_to(trial) and baseline.is_relative_to(trial) +assert source.is_dir() and baseline.is_dir() +assert (source / entry).resolve().is_relative_to(source) +assert (baseline / entry).resolve().is_relative_to(baseline) +assert (source / entry).is_file() and (baseline / entry).is_file() +dest = trial / 'checkpoints' / name +assert not dest.exists() +assert not (trial / 'evidence' / (name + '.json')).exists() +shutil.copytree(source, dest) +checker = root / '.local/native-qa/delete-oracle-warning-fix-42511f0/delete-oracle-warning-fix-42511f0.exe' +command = [str(checker), mode, str(baseline / entry), str(dest / entry), *extra] +run = subprocess.run(command, cwd=root, capture_output=True) +files = [] +for file in sorted(dest.rglob('*')): + if file.is_file(): + raw = file.read_bytes() + rel = file.relative_to(dest) + assert (source / rel).read_bytes() == raw + files.append({'path': rel.as_posix(), 'bytes': len(raw), 'sha256': hashlib.sha256(raw).hexdigest()}) +log = trial / 'evidence' / (name + '.log') +log.write_bytes(run.stdout + run.stderr) +record = {'utc': datetime.now(timezone.utc).isoformat(), 'snapshot': str(dest), 'command': command, 'checker_sha256': hashlib.sha256(checker.read_bytes()).hexdigest(), 'exit': run.returncode, 'files': files} +(trial / 'evidence' / (name + '.json')).write_text(json.dumps(record, indent=2) + '\n', encoding='utf-8', newline='\n') +print(run.stdout.decode('utf-8', errors='replace')) +print(json.dumps({'name': name, 'exit': run.returncode, 'files': len(files), 'diagnostic_log': str(log)})) +sys.exit(run.returncode) diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/tools/canvas-native-paint-session.py b/harness/experiments/canvas-native-d61f1f3-20260912/tools/canvas-native-paint-session.py new file mode 100644 index 00000000..24bc2fe7 --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/tools/canvas-native-paint-session.py @@ -0,0 +1,68 @@ +"""Prepare a new disposable canvas trial; retain the real GUI process exit code.""" +from pathlib import Path +from datetime import datetime, timezone +import hashlib +import json +import os +import shutil +import subprocess +import sys + +root = Path(__file__).resolve().parent.parent +trial = root / '.local/native-qa/canvas-paint-d61f1f3-20260912-01' +mode = sys.argv[1] +if mode == 'prepare': + assert not trial.exists(), 'Never overwrite a native trial' + sources = { + 'compact-baseline': root / '.local/native-qa/delete-20260912/compact-baseline-v2', + 'compact-work': root / '.local/native-qa/delete-20260912/compact-baseline-v2', + 'bound-baseline': root / 'harness/experiments/canvas-editing-followup-20260912/bound-nested-fixture-r1-20260912', + 'bound-work': root / 'harness/experiments/canvas-editing-followup-20260912/bound-nested-fixture-r1-20260912', + 'draft-work': root / 'harness/experiments/canvas-editing-followup-20260912/nested-call-fixture-20260912', + 'process-work': root / 'harness/fixtures/source7-native/base', + } + assert all(path.is_dir() for path in sources.values()) + trial.mkdir() + rows = [] + for label, source in sources.items(): + shutil.copytree(source, trial / label) + for path in sorted(source.rglob('*')): + if path.is_file(): + relative = path.relative_to(source) + raw = path.read_bytes() + assert (trial / label / relative).read_bytes() == raw + rows.append({'path': f'{label}/{relative.as_posix()}', 'source': str(path.relative_to(root)), 'bytes': len(raw), 'sha256': hashlib.sha256(raw).hexdigest()}) + for label in ['profile/Desktop', 'profile/Documents', 'profile/AppData/Local', 'profile/AppData/Roaming', 'temp', 'evidence']: + (trial / label).mkdir(parents=True, exist_ok=True) + (trial / 'preparation.json').write_text(json.dumps({'utc': datetime.now(timezone.utc).isoformat(), 'files': rows}, indent=2) + '\n', encoding='utf-8', newline='\n') + print(json.dumps({'trial': str(trial), 'identical_fixture_files': len(rows)})) +elif mode == 'launch': + assert (trial / 'preparation.json').is_file() + assert not (trial / 'launch.json').exists() + stage = Path(sys.argv[2]).resolve() + assert stage.is_relative_to(root / '.local/native-qa') + record = json.loads((stage / 'manifest.json').read_bytes()) + for gate in ['full', 'clippy', 'gui']: + result = record['results'][gate] + assert result['exit'] == 0 and not result['changed_inputs'] + assert result['source'] == record['source'], 'Require same-source gates for this production correction' + for name in ['arcadia-studio.exe', 'libunwind.dll']: + raw = (stage / name).read_bytes() + assert len(raw) == record['artifacts'][name]['bytes'] + assert hashlib.sha256(raw).hexdigest() == record['artifacts'][name]['sha256'] + env = {key: os.environ[key] for key in ['SystemRoot', 'WINDIR', 'SystemDrive', 'ProgramData', 'ALLUSERSPROFILE', 'PUBLIC', 'COMSPEC', 'PATHEXT', 'NUMBER_OF_PROCESSORS', 'PROCESSOR_ARCHITECTURE', 'OS'] if key in os.environ} + profile = trial / 'profile' + windows = Path(env['SystemRoot']) + env.update({'PATH': os.pathsep.join(map(str, [stage, windows / 'System32', windows])), 'USERPROFILE': str(profile), 'LOCALAPPDATA': str(profile / 'AppData/Local'), 'APPDATA': str(profile / 'AppData/Roaming'), 'TEMP': str(trial / 'temp'), 'TMP': str(trial / 'temp')}) + with (trial / 'stdout.log').open('xb') as out, (trial / 'stderr.log').open('xb') as err: + process = subprocess.Popen([str(stage / 'arcadia-studio.exe')], cwd=trial, env=env, stdin=subprocess.DEVNULL, stdout=out, stderr=err, creationflags=subprocess.CREATE_NO_WINDOW) + launch = {'utc': datetime.now(timezone.utc).isoformat(), 'pid': process.pid, 'source': record['source'], 'binary': str(stage / 'arcadia-studio.exe'), 'sha256': record['artifacts']['arcadia-studio.exe']['sha256'], 'private_profile': str(profile)} + (trial / 'launch.json').write_text(json.dumps(launch, indent=2) + '\n', encoding='utf-8', newline='\n') + print(json.dumps(launch), flush=True) + code = process.wait() + closure = {'utc': datetime.now(timezone.utc).isoformat(), 'pid': process.pid, 'exit': code} + (trial / 'closure.json').write_text(json.dumps(closure, indent=2) + '\n', encoding='utf-8', newline='\n') + print(json.dumps(closure), flush=True) + sys.exit(code) +else: + raise SystemExit('Expected prepare or launch STAGED_DIRECTORY') diff --git a/harness/experiments/canvas-native-d61f1f3-20260912/tools/canvas-paint-checkpoint.py b/harness/experiments/canvas-native-d61f1f3-20260912/tools/canvas-paint-checkpoint.py new file mode 100644 index 00000000..1c83923b --- /dev/null +++ b/harness/experiments/canvas-native-d61f1f3-20260912/tools/canvas-paint-checkpoint.py @@ -0,0 +1,8 @@ +from pathlib import Path + +# Reuse the identified exact-source oracle procedure with this fresh trial's path. +original = Path(__file__).with_name('canvas-native-checkpoint.py') +source = original.read_text(encoding='utf-8') +assert source.count('canvas-followup-20260912-01') == 1 +exec(compile(source.replace('canvas-followup-20260912-01', + 'canvas-paint-d61f1f3-20260912-01'), str(original), 'exec')) diff --git a/harness/experiments/diagram-removal-windows-20260912/archive-manifest.json b/harness/experiments/diagram-removal-windows-20260912/archive-manifest.json index 4c9fb311..89a92c20 100644 --- a/harness/experiments/diagram-removal-windows-20260912/archive-manifest.json +++ b/harness/experiments/diagram-removal-windows-20260912/archive-manifest.json @@ -273,5 +273,50 @@ "file": "gui-83f53c7.result.json", "bytes": 351, "sha256": "bdd88cf0817b2e51a89b9289f066bf59da01e2ace2bc5e4b625086e02ef7e3de" + }, + { + "file": "full-d61f1f3.log", + "bytes": 95313, + "sha256": "0c4a9b5ad67e779c755e4fc86dc16c5c99f5d05ddd19844e3a0f133b8ab6467a" + }, + { + "file": "full-d61f1f3.inputs.json", + "bytes": 99306, + "sha256": "67ce23fbbcc30ff8c4d78898e9d12030ac07dc507c41d7598c5fe38e88c055bf" + }, + { + "file": "full-d61f1f3.result.json", + "bytes": 385, + "sha256": "32085ca557a09331e179783a7fa16d63bd650c7e66d864f0657d2740d0a7daa3" + }, + { + "file": "clippy-d61f1f3.log", + "bytes": 155, + "sha256": "7bf483369325f031c89a43e05984dbc287ac8d9c3354a21be44ca34b2101c572" + }, + { + "file": "clippy-d61f1f3.inputs.json", + "bytes": 99306, + "sha256": "67ce23fbbcc30ff8c4d78898e9d12030ac07dc507c41d7598c5fe38e88c055bf" + }, + { + "file": "clippy-d61f1f3.result.json", + "bytes": 377, + "sha256": "d57197582185c9191bdd1426b463063ffd7584dfb3e1573f1613590fe0703d4c" + }, + { + "file": "gui-d61f1f3.log", + "bytes": 155, + "sha256": "b9c4bb81ce6356efb1a7ea16336872ec1563e1ed8affb7311330cee275b832f9" + }, + { + "file": "gui-d61f1f3.inputs.json", + "bytes": 99306, + "sha256": "67ce23fbbcc30ff8c4d78898e9d12030ac07dc507c41d7598c5fe38e88c055bf" + }, + { + "file": "gui-d61f1f3.result.json", + "bytes": 351, + "sha256": "244535cd3032d71b9755ccd97c1102c7f0da3c9d64f8ceea6836271870bff771" } ] diff --git a/harness/experiments/diagram-removal-windows-20260912/clippy-d61f1f3.inputs.json b/harness/experiments/diagram-removal-windows-20260912/clippy-d61f1f3.inputs.json new file mode 100644 index 00000000..0bb4c429 --- /dev/null +++ b/harness/experiments/diagram-removal-windows-20260912/clippy-d61f1f3.inputs.json @@ -0,0 +1,2670 @@ +{ + "source": "d61f1f38779ab70a77efcde523ae31c432aefcfd", + "inputs": [ + { + "path": "Cargo.lock", + "bytes": 119973, + "sha256": "065c23c94908fe499d32ed91d55a70946ed5b08ecfda3b483ec1e635572257bf" + }, + { + "path": "Cargo.toml", + "bytes": 400, + "sha256": "369f5b4b2b60705a94623c8c0b68f8e0b048f263280ce07ae0629ad353797d62" + }, + { + "path": "build/windows.manifest", + "bytes": 354, + "sha256": "9c19c5a02f858ece84c44839ad2b145d9c1d90442da0b15c87fd045f975974eb" + }, + { + "path": "build/windows.rc", + "bytes": 24, + "sha256": "a27385edcae0bcf96f55361056cb7be5f36d76fcddcaefd20647c91959563e1e" + }, + { + "path": "build/windows_manifest.rs", + "bytes": 1460, + "sha256": "168da2c42ecccfebc11ee3e1b455e653a68fe9c6d30a9842a8b9e7441d086c80" + }, + { + "path": "crates/oa-cli/Cargo.toml", + "bytes": 279, + "sha256": "49c567f1af74a826683b4d96845feb3806fd9bcb7dc2767e16b5509d4e5e1cde" + }, + { + "path": "crates/oa-cli/src/lib.rs", + "bytes": 15498, + "sha256": "97bebab63b4a611a1d36ad0c20fe452cbe1985fe3a6fbd39c954603da11410fc" + }, + { + "path": "crates/oa-cli/src/main.rs", + "bytes": 2984, + "sha256": "de964f9b6c59c0f31c080afbd3b31d442b07b1b44f6a187a248d3409c45d35fb" + }, + { + "path": "crates/oa-cli/tests/source_cli.rs", + "bytes": 16600, + "sha256": "a3a1b856c7a9fd3d80bc8074150a24fbb0ef0e9ddf736c7cea036725fc3dc2b8" + }, + { + "path": "crates/oa-core/Cargo.toml", + "bytes": 408, + "sha256": "6b5c062474ebb62d5082e07dabed99ee85e4a833edf26690fb4f887028d3416f" + }, + { + "path": "crates/oa-core/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-core/examples/generate_demo.rs", + "bytes": 795, + "sha256": "e26f432c95331aeca50985dbb3ad2c558affd43023b585811f0f7bfaa59f6661" + }, + { + "path": "crates/oa-core/examples/generate_release1.rs", + "bytes": 1798, + "sha256": "1d5f11165d74893e4bc18dbf3a2f2111f4026bd89fd06ee7f0bae69e45c4d4b5" + }, + { + "path": "crates/oa-core/examples/release_dense_views.rs", + "bytes": 14664, + "sha256": "a83158488ef9b7394f136c52b1496719be935c4e5bdfe457cab5c9894f5f9412" + }, + { + "path": "crates/oa-core/examples/routing_workshop.rs", + "bytes": 17248, + "sha256": "571307b18b6d4fa04700c5a4d4b0c2154c419e93a21292b2028e7b6f46a2faa7" + }, + { + "path": "crates/oa-core/src/analysis_numeric.rs", + "bytes": 3735, + "sha256": "6c88eef3119162aeb6c07b9e75812c3af9fbfe75554b0503ad00f103cb478408" + }, + { + "path": "crates/oa-core/src/analysis_numeric/dimension.rs", + "bytes": 3045, + "sha256": "d4ad8e5307a1620e31791d724a0e31fdba860d00dc83e3e1f2209d9c5e22a340" + }, + { + "path": "crates/oa-core/src/analysis_numeric/exact.rs", + "bytes": 17338, + "sha256": "4eb8cb0f66b10e5da204899af82ee26adfec74bab47b1a6c9842b5488ee04c4d" + }, + { + "path": "crates/oa-core/src/analysis_numeric/fixtures/r7-literal-boundaries.json", + "bytes": 6085, + "sha256": "3b959dec5e100a6f03817f5314bef497347ba579ebd235476516d4bd83399181" + }, + { + "path": "crates/oa-core/src/analysis_numeric/meter.rs", + "bytes": 7129, + "sha256": "1f7174beb992935b4c399acdef91114af73faf041070feab968455ac827e8ee4" + }, + { + "path": "crates/oa-core/src/analysis_numeric/quantity.rs", + "bytes": 12257, + "sha256": "ead5142d6eeea8f99399d57e02d8f7d819980923de76387cd454694d6a747aee" + }, + { + "path": "crates/oa-core/src/analysis_numeric/tests.rs", + "bytes": 27486, + "sha256": "323ce82fc057d36f44463569fd8ea324c7d700fddfbf32bce15e04bd2a66970b" + }, + { + "path": "crates/oa-core/src/data.rs", + "bytes": 42696, + "sha256": "7f9c7c7dd8353cb5a38597b92cde6d3e890203d392473187eb387d41ff37414a" + }, + { + "path": "crates/oa-core/src/demo.rs", + "bytes": 20657, + "sha256": "ad62123f96c20ff023cafc1a9849b0fa06bc62edd1fb9701799e4599b458600c" + }, + { + "path": "crates/oa-core/src/language.rs", + "bytes": 99938, + "sha256": "638f08a42e9cf4996b5d07f69b4d6f517a518369f3604d25be1006e40e080765" + }, + { + "path": "crates/oa-core/src/language/semantic_source.rs", + "bytes": 7326, + "sha256": "584b5bb59d87a7b8d44d5dd2d124c3a1323b21492b138a17bc9526c0087c9e29" + }, + { + "path": "crates/oa-core/src/language_nesting_tests.rs", + "bytes": 20639, + "sha256": "bd061611e8cb6f28ab203c73e544ac98bf275eb464cd314ad5fbd25f773df33b" + }, + { + "path": "crates/oa-core/src/lib.rs", + "bytes": 549, + "sha256": "ea1d9bf5acba8381ba204db12ff5b5fe1f320417d17af517e46b90fd6bcb241c" + }, + { + "path": "crates/oa-core/src/migration_v2/README.md", + "bytes": 1515, + "sha256": "fb61d3faa33d7bdfba73415415a0882c0fbd3e0b45df42f972a19aec6da927b9" + }, + { + "path": "crates/oa-core/src/migration_v2/adapter.rs", + "bytes": 9490, + "sha256": "66741b4c8354a23b8a932ecc5bf1bc3bb6e74279558757b8c35bc2157a7e51b5" + }, + { + "path": "crates/oa-core/src/migration_v2/mod.rs", + "bytes": 1158, + "sha256": "857d8bb13b6814daba6780ca770c16352943c01cb130245d055f11b3b957b3e9" + }, + { + "path": "crates/oa-core/src/migration_v2/model.rs", + "bytes": 52059, + "sha256": "8ac63eb59b2e57bdecff2477ee0634096090924d3dd1851e1c454880a889dacb" + }, + { + "path": "crates/oa-core/src/migration_v2/references.rs", + "bytes": 13369, + "sha256": "33a6819abc83139fdaebeebd1b553238a328637106cce7dd5a535f1791d43e20" + }, + { + "path": "crates/oa-core/src/migration_v2/source.rs", + "bytes": 21946, + "sha256": "74fee9b24e7c912182c998ab9d9aeec125e2009c3214959229e844c67afe2bf6" + }, + { + "path": "crates/oa-core/src/migration_v2/state_validation.rs", + "bytes": 15769, + "sha256": "e29ef071bab0a68460ddf55c46131c6f66c022d52c3c602c37c013c3649da1b0" + }, + { + "path": "crates/oa-core/src/migration_v2/transitions.rs", + "bytes": 704, + "sha256": "f74174c532ba56b57c80b719a11fb4adea0a78ccc2828fff72fe2b9eda5a10b1" + }, + { + "path": "crates/oa-core/src/migration_v2/validation.rs", + "bytes": 98736, + "sha256": "6d5e4a4e2805ae5045bf789a0485e14a61c63346587bace2b4a91173a688f780" + }, + { + "path": "crates/oa-core/src/migration_v3/README.md", + "bytes": 2128, + "sha256": "3755a63f840d7f0eadf68afa7a9d587877a9468ff982d3610539e8a0bb067a82" + }, + { + "path": "crates/oa-core/src/migration_v3/mod.rs", + "bytes": 23023, + "sha256": "f4edb6a0b50ecfe8670973776d703047b064420cb1f05913129c00fc656b3722" + }, + { + "path": "crates/oa-core/src/migration_v4.rs", + "bytes": 4020, + "sha256": "50c652964f0f309e7f3f54b6ef12c40d42fcecc0490f005995c713df1179af70" + }, + { + "path": "crates/oa-core/src/model.rs", + "bytes": 66352, + "sha256": "4585c895c64c4a183941c92cf047a9e52ff0cbe41971e16e78d229ea9dc101fb" + }, + { + "path": "crates/oa-core/src/operations.rs", + "bytes": 11405, + "sha256": "a5ffbbf54cd440316a106d1188bfb699b57dae59f466edcb33618c333cd19f41" + }, + { + "path": "crates/oa-core/src/persistence.rs", + "bytes": 31774, + "sha256": "1c01474f906a63e552c0d590b272c95821c00a100b3e79e58e67dbbeac341a14" + }, + { + "path": "crates/oa-core/src/ports.rs", + "bytes": 45413, + "sha256": "5cac12eea70a54ebebbd6be77b63ce92e3195325c4bc7d27705c518686cbac80" + }, + { + "path": "crates/oa-core/src/projection.rs", + "bytes": 21374, + "sha256": "69ed12bace2cc5024e151752a174ab14034ac2d05eb741fcf13e9a27521c059b" + }, + { + "path": "crates/oa-core/src/projection/port_layout.rs", + "bytes": 13474, + "sha256": "a08d17d10a58bb8b206dd001b19b91d5aa3a9f743b298a4da57d503223c20079" + }, + { + "path": "crates/oa-core/src/projection/state.rs", + "bytes": 5233, + "sha256": "73a607bac713ec7ff49a509fefb1a53c7686dca93ee241ffc835564d743afb28" + }, + { + "path": "crates/oa-core/src/references.rs", + "bytes": 21957, + "sha256": "93553c234f32da35f1f41a7b83ad81c471c9803efa78ca222cf7de3c2f86c0bb" + }, + { + "path": "crates/oa-core/src/routing.rs", + "bytes": 50309, + "sha256": "c5ebb350ba76f731f5c48d968bfbba4b6ef68ec046eb5893d116c4637ef15080" + }, + { + "path": "crates/oa-core/src/semantic.rs", + "bytes": 540, + "sha256": "f9895dd5b8fb27d10d4cfbb41c3542ef2018365a589b8d5778e5674ae5a1f239" + }, + { + "path": "crates/oa-core/src/semantic/catalog.rs", + "bytes": 49407, + "sha256": "1ff74fcca18084d178681d7ff38ee1ccac632c27c4de0595ba1ceab8067ab3a4" + }, + { + "path": "crates/oa-core/src/semantic/historical.rs", + "bytes": 15271, + "sha256": "eaf3284bf234312698514cdb636bc8348e1b5d746cb16b18df777e77d312abfb" + }, + { + "path": "crates/oa-core/src/semantic/linked.rs", + "bytes": 6035, + "sha256": "6f335b14e809aecfc35defcaf77cb821b080d1506dbc46297912b25af98c07a2" + }, + { + "path": "crates/oa-core/src/semantic/mutate.rs", + "bytes": 22683, + "sha256": "dc2b4c4a6eb156fe468eaa8c85fd37a505c0cd8ea1f226cb69cd01689afd3d9d" + }, + { + "path": "crates/oa-core/src/semantic/review.rs", + "bytes": 51116, + "sha256": "0c157d2c327e72e89cca3b423e71ee73798105c5bb7271439c1a101642c91e3e" + }, + { + "path": "crates/oa-core/src/semantic/types.rs", + "bytes": 10405, + "sha256": "6922fe35089f12fad43ab0ce1c6886d01a3855f90b8e2543e99802ac5e6f1bbb" + }, + { + "path": "crates/oa-core/src/session.rs", + "bytes": 35237, + "sha256": "1eb77b329b2986fc6f5dc0171e77fd860375cdfd8c769a1367b445d6c49ebe00" + }, + { + "path": "crates/oa-core/src/source_files.rs", + "bytes": 74803, + "sha256": "669491dbddb8e8e6556161426dffa1a49ac1c826d31020bff0956d81a4d84683" + }, + { + "path": "crates/oa-core/src/source_project.rs", + "bytes": 61843, + "sha256": "1394370bcc5908873b830c2c11312e6e1611af41f46c4f43ca0a6bcb713bb466" + }, + { + "path": "crates/oa-core/src/source_project/source_migration.rs", + "bytes": 4700, + "sha256": "add463ae85c420f853d324b00a221f0f874164cc3f3ed6bbb07557a9ed7a8c95" + }, + { + "path": "crates/oa-core/src/source_project/source_structure.rs", + "bytes": 20225, + "sha256": "9f1f83315856a7025fe662c0fbb13452f31613224a03663150d6225d1ddc162f" + }, + { + "path": "crates/oa-core/src/state_validation.rs", + "bytes": 15665, + "sha256": "e28d7f74385e2a78763716b34491bd73a00bfeccc085970ceb130627e3faee18" + }, + { + "path": "crates/oa-core/src/topology_context.rs", + "bytes": 13734, + "sha256": "16de69b297de95d93c73808621607833b713af811dd082f0169186ae1e5c3e2d" + }, + { + "path": "crates/oa-core/src/topology_context/analysis.rs", + "bytes": 20036, + "sha256": "dead6194f0aa60cc46045c0e5ee10dbdbb689158c38634dfbbbc45d2ba88ac65" + }, + { + "path": "crates/oa-core/src/topology_context/analysis_tests.rs", + "bytes": 5258, + "sha256": "17839263410815e96fe027d4eba3aae0a9ab3b82b16947e2b29ebe0d09782b56" + }, + { + "path": "crates/oa-core/src/transitions.rs", + "bytes": 51998, + "sha256": "fadd1b07b89cae4117b91abb4f1ac9ea81ff818ef20f2175e76ee8cf21fb708d" + }, + { + "path": "crates/oa-core/src/transitions/communication.rs", + "bytes": 8634, + "sha256": "2b476630a88edd9021b9156ca12a5402e01604095f0d4002afb452671903a028" + }, + { + "path": "crates/oa-core/src/validation.rs", + "bytes": 112792, + "sha256": "7c1b4ae5e4ebba13e99af9158ccde138dfc5e9a7afb580e76fba72d0b64ba74e" + }, + { + "path": "crates/oa-core/src/validation/coverage.rs", + "bytes": 6478, + "sha256": "b08e4b344ecad055714168c83beff7fe29ba4edc53edbffa2eae04e5580a4d5f" + }, + { + "path": "crates/oa-core/src/view_options.rs", + "bytes": 24481, + "sha256": "421ede0a04c593ca1df0e6e0d06fabcfcc8113cdbcfb0adc7f5c8ef4d1724208" + }, + { + "path": "crates/oa-core/src/view_options_tests.rs", + "bytes": 21433, + "sha256": "64aac44de2df42a1012239a3dd75c473daf0c8990b3170b7bf7e78a556080208" + }, + { + "path": "crates/oa-core/tests/communication_boundary_scenarios.rs", + "bytes": 8816, + "sha256": "e1100b8f363910a487d90c73acc7df543dc6d532158c3c63ad11cd3d40d8e12b" + }, + { + "path": "crates/oa-core/tests/communication_means.rs", + "bytes": 18102, + "sha256": "a25f2749180bc6f4beb1445bfad3351eedf0669131a7439b633ab804439e95a4" + }, + { + "path": "crates/oa-core/tests/coverage_diagnostics.rs", + "bytes": 20527, + "sha256": "e2e9c3996daab47f2bd23f5d8c48b4e372af33331152f5fc85b76f06d04fcdf4" + }, + { + "path": "crates/oa-core/tests/fixtures/v2-coastal-rescue.arcadia", + "bytes": 29220, + "sha256": "f0df129c1914bfc01d0b047b0cd4b520d8cf0c249ea9ced085de400c0be87ff3" + }, + { + "path": "crates/oa-core/tests/fixtures/v2-coastal-rescue.json", + "bytes": 43990, + "sha256": "3ed53508eb544bbd788832f7bebea2ec31b3d66191f24f45098cc9750ec4c005" + }, + { + "path": "crates/oa-core/tests/fixtures/v3-data-contract.arcadia", + "bytes": 2450, + "sha256": "305f19d1b79f99f8d4cf627ba2e9ca6836bb7959cc0070227815937a699eafea" + }, + { + "path": "crates/oa-core/tests/fixtures/v3-data-contract.json", + "bytes": 8240, + "sha256": "1b41299c53204e6232397d25a58d5bccdbbc16e770c75e8edb55ce36ccfe58a2" + }, + { + "path": "crates/oa-core/tests/fixtures/v4-reviewed-prose.arcadia", + "bytes": 1222, + "sha256": "5fa53a26a5ad010c8e59eb56d9b2b52003569e66c0377ffb58840590168ad0c1" + }, + { + "path": "crates/oa-core/tests/fixtures/v4-reviewed-prose.json", + "bytes": 1734, + "sha256": "2808088afcc165f4bd6da5129151143411c997041c3de61d600ab76e05d24a47" + }, + { + "path": "crates/oa-core/tests/language.rs", + "bytes": 56482, + "sha256": "77f6cb2a69976bfb5f60b243b71c07fb0edc7505002c1e9e73fcd6ddf6d9496e" + }, + { + "path": "crates/oa-core/tests/port_anchors.rs", + "bytes": 26893, + "sha256": "efbc0fa18733b1aaac501f9785a4c392fc49c05c45a5778d26e9b5dd951ca6fa" + }, + { + "path": "crates/oa-core/tests/port_migration.rs", + "bytes": 15620, + "sha256": "1801c376a5435ac7efb2a8342348b2c7ffef930bba65deca4acb66b06e0483d7" + }, + { + "path": "crates/oa-core/tests/port_source.rs", + "bytes": 4858, + "sha256": "8d2ddaca4045d330f6eda2591561497b858aad53769a823249d0bea4f5916e12" + }, + { + "path": "crates/oa-core/tests/prepared_commands.rs", + "bytes": 9555, + "sha256": "52cab1c668064777412df0a6a3c20d74d579b33794b4b00525b9f151c06eac9b" + }, + { + "path": "crates/oa-core/tests/process_diagnostics.rs", + "bytes": 1104, + "sha256": "1dbbc590239ef7542be4a2bdc9543aaa64d108417b03dd312a0894e364745906" + }, + { + "path": "crates/oa-core/tests/r3_constructor_ack.rs", + "bytes": 24163, + "sha256": "e5c44676ea0aab97f2e091ddac2f4bc4a4a90f5877f7bbf08b61229600944dd0" + }, + { + "path": "crates/oa-core/tests/r3_migration.rs", + "bytes": 6590, + "sha256": "ebd04120f5215b3956fdc79ee78f6e38734c7d13392f1fc28aaba957912265bd" + }, + { + "path": "crates/oa-core/tests/r3_semantic.rs", + "bytes": 77473, + "sha256": "49c3763eaf2131070a7c46cc23a84f917d292d41610b6404510e5607f8890c32" + }, + { + "path": "crates/oa-core/tests/r3_source.rs", + "bytes": 15311, + "sha256": "f31f60659df3c7ef601650d1cff140589d8729f01a3f65a4a6a6c2272f15c408" + }, + { + "path": "crates/oa-core/tests/r6_data.rs", + "bytes": 41437, + "sha256": "5f7ffb3bc73c3c85423623fe56f8680646dc97040327bdbead9d47a37e80f155" + }, + { + "path": "crates/oa-core/tests/r6_migration.rs", + "bytes": 9174, + "sha256": "81519bc1512f5e069432e9a1cdad04c10216d492df01b4b75b02102480ebd6a1" + }, + { + "path": "crates/oa-core/tests/r6_source.rs", + "bytes": 9519, + "sha256": "88a0aa087a7678e2898ff6057538072ca92072190712f05fff08372cc56ebed6" + }, + { + "path": "crates/oa-core/tests/release1_teaching.rs", + "bytes": 10010, + "sha256": "be179290d871125dc97cfd2a3067c7ac89c8a538fdb0afafc5b825bcdfb2bef2" + }, + { + "path": "crates/oa-core/tests/release_capabilities.rs", + "bytes": 19422, + "sha256": "b92cba2a562e78287ddd7dc3e94557848d17faa0c8a102601b50286b9af48a30" + }, + { + "path": "crates/oa-core/tests/release_diagrams.rs", + "bytes": 7689, + "sha256": "cefcc0582d91266d5de6ee5daefcfe41b606ab971ab235b59034a8e1dbc24b7d" + }, + { + "path": "crates/oa-core/tests/release_language_limits.rs", + "bytes": 5204, + "sha256": "8578da4f76bbd2d0e1bfe295ab1259e2162a3fe3d0d2ba8901915d7a40942806" + }, + { + "path": "crates/oa-core/tests/release_ports.rs", + "bytes": 32740, + "sha256": "506e62beab0c7ec0cece83e9e0c1a810fa1f99285c9e1cab0c77f06de55a40e1" + }, + { + "path": "crates/oa-core/tests/release_routing.rs", + "bytes": 23165, + "sha256": "ae168faaba23769b7ca1fd65f217b9db671726e67276eb5a04e5e72b1447a462" + }, + { + "path": "crates/oa-core/tests/release_scenarios.rs", + "bytes": 41067, + "sha256": "0f5d876badeec653fc7b12610a77d867e9a53582e605253deff8d379da21572f" + }, + { + "path": "crates/oa-core/tests/release_states.rs", + "bytes": 26873, + "sha256": "b1a26acee95eaba7f9920f9da738a1e33606552eb078e6d298895daff7e3d811" + }, + { + "path": "crates/oa-core/tests/release_topology.rs", + "bytes": 17643, + "sha256": "c51dbe5aa5a038f9ed830daa02aa67714472179eb7fd6da5ce36dc6931c8b3a9" + }, + { + "path": "crates/oa-core/tests/review_regressions.rs", + "bytes": 21823, + "sha256": "f154e5c88d35e31512e2b07733a1327ea3e2fcfd1ef8eb23066a4e9573f387c1" + }, + { + "path": "crates/oa-core/tests/route_source.rs", + "bytes": 7270, + "sha256": "1a73fdbac0d0ae0e84d8d67b6ad398e11223958f5dca007f73757c91827decfb" + }, + { + "path": "crates/oa-core/tests/routing_geometry.rs", + "bytes": 31890, + "sha256": "2d8eea4a2bba535ed0ea6daabccdaf87b375828c404baa10518c7bd7fd6253d3" + }, + { + "path": "crates/oa-core/tests/routing_labels.rs", + "bytes": 5530, + "sha256": "dff884d799c3c5c9257210248c55767e294e3cb317c605cbd0ddc9600c216eb6" + }, + { + "path": "crates/oa-core/tests/semantic_artifact_absence_oracle.rs", + "bytes": 4640, + "sha256": "d93eaf9667f4221232168bef0fe9f069e5be1b1f23410bda5dd67010b96e5c8a" + }, + { + "path": "crates/oa-core/tests/semantic_attachments_gui_oracle.rs", + "bytes": 14957, + "sha256": "7f526d363ba05e7ac89faf0fead0796e419c34ee204edf44a1b46c78308b0970" + }, + { + "path": "crates/oa-core/tests/source6_view_contract.rs", + "bytes": 14307, + "sha256": "fa566de53946d40bbbd9033edfeed177180c4dc44afa2f2f4667ffdc622eb3bb" + }, + { + "path": "crates/oa-core/tests/source7_contract.rs", + "bytes": 43262, + "sha256": "cad4f1a135ddbd947bdf3c71d1b44f1e438725095ea8c4d893464bc721c2363f" + }, + { + "path": "crates/oa-core/tests/source_files.rs", + "bytes": 13168, + "sha256": "f0429a0b89a443458ea9af7083c1e4e7411417a7e6b47e618bfbb9266dc164f9" + }, + { + "path": "crates/oa-core/tests/source_identity_updates.rs", + "bytes": 5139, + "sha256": "f52aa38b4d317e532c641ad7463472e4b40e802e60052cf0017556ffc63da06c" + }, + { + "path": "crates/oa-core/tests/source_nested_updates.rs", + "bytes": 16892, + "sha256": "9ac3390936c0d250651ea94a1b8faf0adfb680f061ececc56f2a52909b5ba855" + }, + { + "path": "crates/oa-core/tests/source_project.rs", + "bytes": 45910, + "sha256": "cef58adb16aa4d2527ddc0628aec3e26f0b42b4be70014a7e360fafdac13a942" + }, + { + "path": "crates/oa-core/tests/state_diagrams.rs", + "bytes": 23973, + "sha256": "6b02b387a3ae559cb3ad72de24292a5abcb76aaac0adbab5d2aa5211b22cd2e5" + }, + { + "path": "crates/oa-core/tests/workflows.rs", + "bytes": 33426, + "sha256": "bd843dfddbd5724ec08f657571f887496203056fe2fa5864ef50a168a613b89b" + }, + { + "path": "crates/oa-desktop/Cargo.toml", + "bytes": 842, + "sha256": "f3547b2b924d5db6706c0a8e069014b440ff65315d82fc8aced0360af4b3cdc9" + }, + { + "path": "crates/oa-desktop/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-desktop/src/allocation_drag.rs", + "bytes": 29634, + "sha256": "6b93290627a8697dd529ecf12b6e99196a11783afff1ca7aaf75c6e2762f3d94" + }, + { + "path": "crates/oa-desktop/src/allocation_drag/tests.rs", + "bytes": 60311, + "sha256": "13b7d055a516c8a9f0bd13f03abe3b81423bde9d121c51778a129ff485f4f102" + }, + { + "path": "crates/oa-desktop/src/allocation_input.rs", + "bytes": 8391, + "sha256": "c7825c43383e81b7eb1b78bd902950c8a2206e0387d26002a80ddbe4dc2b6c73" + }, + { + "path": "crates/oa-desktop/src/app.rs", + "bytes": 220614, + "sha256": "99447bba4810135834663681447a03061a948db2661395b9b4c4924738a38f18" + }, + { + "path": "crates/oa-desktop/src/app/allocation_drag.rs", + "bytes": 24452, + "sha256": "218726dcd2e6809cb6f3660f575e586806360456e6b4fac61b9e361b411aeee9" + }, + { + "path": "crates/oa-desktop/src/app/allocation_drag_full_tree_tests.rs", + "bytes": 28288, + "sha256": "ff4c3d07f885f242b71160c09e2c457c4a746073fd89030781da306730c5db44" + }, + { + "path": "crates/oa-desktop/src/app/allocation_drag_tests.rs", + "bytes": 42677, + "sha256": "3c6908f8a677921245932252ab38806f16012becbbc082ac11e7871ff7bdeeb4" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring.rs", + "bytes": 27835, + "sha256": "37c7db33e99dd4adcc5a51f09ee4878af94fd32413359890a541690080885f65" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring/palette.rs", + "bytes": 8887, + "sha256": "8f9937cb30b48b83759fd084a8a5990a2daa3920280f1210abe048560241985a" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring/tests.rs", + "bytes": 14565, + "sha256": "174e184f1baf872c3be1cf70d9a7f4bc5569a9623000b3ab0e71e2b82e249cf5" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring_tests.rs", + "bytes": 18551, + "sha256": "ba913f7d7cbf586708d65c9f1db25b9b9ed7846f9d2e75a546b4ac69d8d19c6a" + }, + { + "path": "crates/oa-desktop/src/app/behavior_lifecycle_tests.rs", + "bytes": 13672, + "sha256": "f9a0b030faca5deaf3f55d9f5efcafdf1a7cb1a663001aa20a61baba4f92d080" + }, + { + "path": "crates/oa-desktop/src/app/behavior_removal_tests.rs", + "bytes": 23958, + "sha256": "ef09843a7daeb91afab0b76e83c5679351a1635a84a26d80a194dea744ea5874" + }, + { + "path": "crates/oa-desktop/src/app/checkpoints.rs", + "bytes": 29576, + "sha256": "55e5babdcabef767af3bc8be9cc3153b3f5cc0695701b890820ec0225643852e" + }, + { + "path": "crates/oa-desktop/src/app/diagram_focus_tests.rs", + "bytes": 6047, + "sha256": "65f3f841e1295ae4878b3ae2cf45ff64003d42e26e450e9a1de1c36dbd771bd8" + }, + { + "path": "crates/oa-desktop/src/app/diagram_removal.rs", + "bytes": 8778, + "sha256": "addb51604f41d680b06586bb362362ee3c2603a334f33022ce9abc281295ac85" + }, + { + "path": "crates/oa-desktop/src/app/diagram_removal_tests.rs", + "bytes": 47336, + "sha256": "70f9eb53d8995a23a53535b3941fc0c0b81a340f9fbbb371f0d705cfa775bd9e" + }, + { + "path": "crates/oa-desktop/src/app/diagram_selection_tests.rs", + "bytes": 5582, + "sha256": "4fa507adbc23db3a6eb202d809c695ec0ebd6181356930c4fa7528a9a0c7be57" + }, + { + "path": "crates/oa-desktop/src/app/hosted.rs", + "bytes": 25059, + "sha256": "2f7094c078e1d7cbccd6c0d310afa6c400a7e031f12918bbfce65ba62754e316" + }, + { + "path": "crates/oa-desktop/src/app/hosted/tests.rs", + "bytes": 30344, + "sha256": "fa118f64d04b400ccc01e4e67adaf3541975288882afa265a9e7f092cdbda232" + }, + { + "path": "crates/oa-desktop/src/app/process_canvas.rs", + "bytes": 31560, + "sha256": "7e05f4899a0b24df9ab355b6484e94997c7bc66c873342d975aed0b6a56acf04" + }, + { + "path": "crates/oa-desktop/src/app/reference_authoring.rs", + "bytes": 11250, + "sha256": "38e033e23e8135032f70117a376a5fe7bc68127c466559a35d7ec200932e3f77" + }, + { + "path": "crates/oa-desktop/src/app/reference_authoring/tests.rs", + "bytes": 20067, + "sha256": "b96ddc6bff7f8fde97720e18a92070f891c1340348d2e19c7c9c5a7bda650ce8" + }, + { + "path": "crates/oa-desktop/src/app/reference_authoring/tests/mounted.rs", + "bytes": 32805, + "sha256": "14a4914a1c86e50c395672dab8fe80d7af679a79c9082890b509fad7b7c543d9" + }, + { + "path": "crates/oa-desktop/src/app/repair_save_state_tests.rs", + "bytes": 10745, + "sha256": "5543dcba853bb1513acf824b860249729a6004747e7e320b46efe60ea19e2d83" + }, + { + "path": "crates/oa-desktop/src/app/review_navigation_tests.rs", + "bytes": 7049, + "sha256": "872fa91479dad5436e139ffcaece270323e9f5daeeb7a4d80c2c2534f48bc21b" + }, + { + "path": "crates/oa-desktop/src/app/save_as_tests.rs", + "bytes": 4113, + "sha256": "f8b915793f1a36fd152569c4781a4bdc17f4af404a8ceb373330053413087a1c" + }, + { + "path": "crates/oa-desktop/src/app/state_diagram.rs", + "bytes": 10050, + "sha256": "9ae3d533a20963a2bd1d485d357ac04319f336cd9f4c16305aa2a67d833573a8" + }, + { + "path": "crates/oa-desktop/src/app/state_diagram_tests.rs", + "bytes": 39957, + "sha256": "612e414b1a2cab12cbfd8fce23745559ff27577700694d53af67ad1f2883ee2c" + }, + { + "path": "crates/oa-desktop/src/app/transition_context_tests.rs", + "bytes": 11508, + "sha256": "47002fb025f3a2f8c53871f9509bfe8611a61db6fb0e1b3125eb6e875425cb1d" + }, + { + "path": "crates/oa-desktop/src/app/view_copy_tests.rs", + "bytes": 7846, + "sha256": "296821c51dcde568e7d717039aa26bfc1b56a9074aa16051007bb351b33a4d44" + }, + { + "path": "crates/oa-desktop/src/behavior.rs", + "bytes": 130523, + "sha256": "96c6e784640fd19a65c93346d21cb184ca721d7649812bd4c68a479391e38127" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace.rs", + "bytes": 7903, + "sha256": "b6e06b9d29f1a5677f99bebcb0e53a3795b4bcd957796a85fd800db4279aed03" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/control.rs", + "bytes": 7804, + "sha256": "2b8d97b8c0e3ff1b1a2c32187b1d0eb25edf39ba582b5fb3303bc880f674f7ba" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/focus.rs", + "bytes": 8901, + "sha256": "33447003980847033e40550f9926d8617fa61e2c3e73ec9c6121d1afed946c33" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/tests.rs", + "bytes": 27101, + "sha256": "b33361c6569354aa2df9b1ba1b60d68e4703800be80f815e0f0505064ea323c3" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/viewport.rs", + "bytes": 15164, + "sha256": "41ff9c50fa9fb89ab9fdb2d18dadc21585aafa1ee008cfcd1e0b731dce645eaf" + }, + { + "path": "crates/oa-desktop/src/behavior/contextual_source_tests.rs", + "bytes": 49518, + "sha256": "044bd412dc45ffe440b1e251993946942dc3759dcb2d5dfe71bd8d6ef61cbcc7" + }, + { + "path": "crates/oa-desktop/src/behavior/creation.rs", + "bytes": 28978, + "sha256": "33ae9aaf4ba90de9432870cc8e99708ef39e3638ae8283a9253c333785c91299" + }, + { + "path": "crates/oa-desktop/src/behavior/creation/app_tests.rs", + "bytes": 13181, + "sha256": "e9c5bf2b07357b7a2f679ae0d8f6904c1c1461aaeb94fa0db478b54d4641ae3e" + }, + { + "path": "crates/oa-desktop/src/behavior/creation/tests.rs", + "bytes": 22793, + "sha256": "a0d1daf9fb3920f7e6181a9802d84fbe056cbf0043b9e41dba5fdda687d9818a" + }, + { + "path": "crates/oa-desktop/src/behavior/form_session.rs", + "bytes": 3941, + "sha256": "f5027fb3a5a5599a182e7d1a10dba56dd66eb1f23a4ba4c4a1744c9a6a5b6e61" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario.rs", + "bytes": 154707, + "sha256": "ffac8821977488ecd1cd9084ad7c0c9fbf8de3d5031c5d4f5d033f0348d3e887" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/focus.rs", + "bytes": 9728, + "sha256": "73a9ea10ad7312086081b8688396a21ab4251c9faecc2df6d984b702f3963533" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/workspace.rs", + "bytes": 24960, + "sha256": "5aec4cb2ceb00ab25900d919a5bec71ab96848b4f14504f51790e3fe8801d3bc" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/workspace/tests.rs", + "bytes": 80542, + "sha256": "f2f6acd93ecf4e9ffee56abc1de28f71da8cb1353cdc3e67cf0c0cf7a619fec5" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_activation.rs", + "bytes": 14095, + "sha256": "77199dcb08ec8697f779d2560f6b716aed8d8f33965237a4934934954f4e805a" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_activation/tests.rs", + "bytes": 28464, + "sha256": "8b855dc067f1b15aed79c7eddf52c89001a8b961d9de4887f235c03b46264a1b" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_lifecycle.rs", + "bytes": 9324, + "sha256": "758d244c2e8de61f515d540baa4d967275f49720e0253c6c9159eb9acd71c859" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_lifecycle/tests.rs", + "bytes": 15430, + "sha256": "01b576993b329810cd78a859b45ac52c66f5a14549065661dd1308196e0b724d" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_operation_tests.rs", + "bytes": 10087, + "sha256": "89fb71c690e07eac314f7a5e05862d5c1e2f9c21039673bf22c4ac894d21c977" + }, + { + "path": "crates/oa-desktop/src/behavior/source_draft.rs", + "bytes": 18031, + "sha256": "08190823090bd8b0305809099abadcc0de431175f7044f1d5abdceda52612ee1" + }, + { + "path": "crates/oa-desktop/src/behavior/state_canvas.rs", + "bytes": 96098, + "sha256": "5844d2abf4a3fe3bb07c707865ee3f8303d213b0fe1871765ac468c11e140da7" + }, + { + "path": "crates/oa-desktop/src/behavior/state_edit.rs", + "bytes": 35843, + "sha256": "4e67321ab0cf88e6200061873086841244c4d610ddd5f88d70c69ac0cc6bf270" + }, + { + "path": "crates/oa-desktop/src/behavior/state_menu.rs", + "bytes": 8530, + "sha256": "9d0a3c29516efa79553c559274848f12101330dbf93ffbbefab398cbc1906790" + }, + { + "path": "crates/oa-desktop/src/behavior/state_view.rs", + "bytes": 7637, + "sha256": "3d01c853663385fc1b760401bbebe3f691fcc289a779a8e63cd0733ff0c8007f" + }, + { + "path": "crates/oa-desktop/src/behavior/states.rs", + "bytes": 26986, + "sha256": "8986ed9492960e20f1254e9dfe3ff91d79ce9fef66f3bda738f9933278043954" + }, + { + "path": "crates/oa-desktop/src/behavior/topology.rs", + "bytes": 84224, + "sha256": "66c81c4d4f2613263f13ae90cea61895c1aeed1f6278880789ec56f8c42433e0" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/contextual.rs", + "bytes": 28432, + "sha256": "5d0ac5b3e258fc70987a00ede1e603681d99746596f2fcc46ad2b3667d65203a" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/contextual_routing.rs", + "bytes": 16731, + "sha256": "d914b0e82aa8d253fe64be2ef74443d1fd2e6cec26d1cf30620a57646e1d426c" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/direct.rs", + "bytes": 39059, + "sha256": "5cca649870f54abdd2eb098954bcc0a2a5ca456b7ee11b5f653edbdf2ed55905" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/direct_tests.rs", + "bytes": 51170, + "sha256": "edccfe3ce8b224065a3540aa53c6340f13db0cecd48ecc0a3904cd832a483964" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/layout_tests.rs", + "bytes": 37846, + "sha256": "f27203866e22aee80daad2811113341684b0cbd59885b36d64243c4317f29f84" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/view.rs", + "bytes": 22009, + "sha256": "29e29c2a0667baa429ae44dbb400e67c86f24f88959d5e7dd22894473bdd1f09" + }, + { + "path": "crates/oa-desktop/src/connection_edit.rs", + "bytes": 5301, + "sha256": "020581e077f82b43c936b623cc51733b02b88428df4e5f25df74b9705819fa37" + }, + { + "path": "crates/oa-desktop/src/connection_tool.rs", + "bytes": 27023, + "sha256": "649da93677d52dae495b0e19bc32f3122ab05a6d84de8402578ff5ce3f6ee1d3" + }, + { + "path": "crates/oa-desktop/src/context_menu.rs", + "bytes": 52955, + "sha256": "629354b34dc232763700251f2695b4d4e53d6251c0b1432ecc0dfe424f7dfeac" + }, + { + "path": "crates/oa-desktop/src/data_values.rs", + "bytes": 23877, + "sha256": "e1deb1cad551f0a9fdef9653aad257cfb36e6d9c0f93b6245061ec3fab8fd365" + }, + { + "path": "crates/oa-desktop/src/data_view.rs", + "bytes": 38871, + "sha256": "158b852be5d3db450aa5cda8b68a35bd96bddce1d8d053a7a23582095c06362d" + }, + { + "path": "crates/oa-desktop/src/diagram.rs", + "bytes": 111242, + "sha256": "e5260a39e19fc3df19bd16898ff1f0abd60ede7584f595c035b5e86a12ecef93" + }, + { + "path": "crates/oa-desktop/src/diagram/focus.rs", + "bytes": 9197, + "sha256": "b88a7c43123b08cf6228d8e32257f6ed7fe361f7278f427ec138e233e1ea6ccf" + }, + { + "path": "crates/oa-desktop/src/diagram/lifecycle_tests.rs", + "bytes": 9342, + "sha256": "03dd13106f3fdd06a26699bfdfba006fad086a0711cad2ba1aeb09a4e8f8656e" + }, + { + "path": "crates/oa-desktop/src/diagram/pointer_tests.rs", + "bytes": 11859, + "sha256": "ae68e091032fe2cf71559ff7e671b3b6d657ee8279330345f0c7a57edfa472ef" + }, + { + "path": "crates/oa-desktop/src/diagram/port_hit_tests.rs", + "bytes": 5650, + "sha256": "c3728f127711cb6d7f80a4670a798808b6e4239dd29c273445de81706ab6f39e" + }, + { + "path": "crates/oa-desktop/src/diagram/port_labels.rs", + "bytes": 13574, + "sha256": "6643f0cbde7a59d4772ae5284a488083e3b81f2fefabc43619d75738f474646f" + }, + { + "path": "crates/oa-desktop/src/diagram/view_options_tests.rs", + "bytes": 2815, + "sha256": "cf0c98a7715558baf17b59f67a80556f98ad30262b4434635e617c6601775433" + }, + { + "path": "crates/oa-desktop/src/diagram/work_drag.rs", + "bytes": 7059, + "sha256": "9757534a7ba47dc0df5d41c8d7366b1d90f3d50b24344580ff3c783667bf66f0" + }, + { + "path": "crates/oa-desktop/src/document.rs", + "bytes": 31807, + "sha256": "7c87280b5b8d112c34865253f8ba0f80d43bc9897771943b15dc7b5608eb17a4" + }, + { + "path": "crates/oa-desktop/src/document_save_as_tests.rs", + "bytes": 5781, + "sha256": "83dc243a25f4e97674ff0d86c794a490cc923e98f1f9fb05bb038f622f11e20b" + }, + { + "path": "crates/oa-desktop/src/explorer.rs", + "bytes": 14764, + "sha256": "fa01c59219564ba9ae5553abc2b6f94e9849f9148d5812ef99b40318fe5dcf9a" + }, + { + "path": "crates/oa-desktop/src/explorer_view.rs", + "bytes": 13773, + "sha256": "a720d7484bcc3a24729332a00e005d1cc6f5f945a9cc3965134e0024dffb581f" + }, + { + "path": "crates/oa-desktop/src/forms.rs", + "bytes": 105544, + "sha256": "ea124f479fcd2d3978ac3cb8eb81fec4a7aae5e4f4414c4bdd54849e954dedf9" + }, + { + "path": "crates/oa-desktop/src/forms/context_fields.rs", + "bytes": 10831, + "sha256": "eaacd474f6500dd344d5a8b63ccb1d1dd86fe2aea78ab708afa8a80d62ce69bf" + }, + { + "path": "crates/oa-desktop/src/forms/data_fields.rs", + "bytes": 49285, + "sha256": "a540a0d451bff56a96b1d28643b2e8c0649f3846350c25c5b154729c0538e77c" + }, + { + "path": "crates/oa-desktop/src/forms/history_fields.rs", + "bytes": 27414, + "sha256": "e7100474cde18bdfe95562bcb3c055f29b4b15aa64788a578194464aebcd046e" + }, + { + "path": "crates/oa-desktop/src/forms/history_fields/tests.rs", + "bytes": 33950, + "sha256": "16d3c308138c063f45986d53c621ad83c7dc2ce853edd31b7204e2939a382df9" + }, + { + "path": "crates/oa-desktop/src/forms/port_fields.rs", + "bytes": 30554, + "sha256": "3fe684d651d5be6203fd9db3979c772913e1af5ac1514e67be386ffd88dc8127" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser.rs", + "bytes": 12130, + "sha256": "b60af363be333af048859e51c28e8c989cb5c95d696cad16c8eec15f78d57a12" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/adapter.rs", + "bytes": 10447, + "sha256": "87ab4bc3bf27fd4b5a458791cf62c7ba8e44e9ebf846d8b851b8b6ffb454cd64" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/tests.rs", + "bytes": 27835, + "sha256": "8e98f8a3fcb814d4a201cc85b3db87a689fd3d2ce487f8a2fe312fc296f93377" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/trigger.rs", + "bytes": 13336, + "sha256": "34d0acecfe6bed193970aa473cc3313984971264b86d7b362a6b84c23d013c0a" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/trigger/focus.rs", + "bytes": 9923, + "sha256": "f1e79f4b03b2f9fd1cdc335054d4ae177dc9e759b6ea3d334b2bcca39b57191b" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/widget.rs", + "bytes": 33804, + "sha256": "d66cc17af7a48bb8598be683f084bb08fa7af7304f9636f0a1bea94c5cf6c727" + }, + { + "path": "crates/oa-desktop/src/forms/view_fields.rs", + "bytes": 24987, + "sha256": "5184d438f0dfd4e29f284ff048e19da73e71be1f24a6e9f123c7e922aecb85fa" + }, + { + "path": "crates/oa-desktop/src/guide.rs", + "bytes": 118110, + "sha256": "ab4b47050e6d57dccdcc264ee5752766bd5013fccdc35eeeb9c9037bb5eb9a67" + }, + { + "path": "crates/oa-desktop/src/highlight.rs", + "bytes": 2751, + "sha256": "da7c254fff7052e5fd9ec7469f473b91a819406028d7c304f6e22c4169561600" + }, + { + "path": "crates/oa-desktop/src/home.rs", + "bytes": 17587, + "sha256": "f03c1071334894f586a5a7c86026602a694db3c2faf902822e1dbe5156a859c2" + }, + { + "path": "crates/oa-desktop/src/home/tests.rs", + "bytes": 8167, + "sha256": "3b03ccfc97dfb75954e1e0ed568bb87a632295c07b96cedc05ed381f87b378f3" + }, + { + "path": "crates/oa-desktop/src/hosted/client.rs", + "bytes": 21912, + "sha256": "54b24b4b50f8d87d7c92946ea5a2cff4c98760e70555b3ce3d90be27115e95d4" + }, + { + "path": "crates/oa-desktop/src/hosted/client_tests.rs", + "bytes": 23009, + "sha256": "3ef70907ca75e098d631c41b90badd4cff1e1eb1b3c78e15a9f811c13ba8ffbe" + }, + { + "path": "crates/oa-desktop/src/hosted/mod.rs", + "bytes": 3744, + "sha256": "1b75e11c80fcb38fd20bb3487e3f88729fdac73e471c5ae64da28c249f77c63b" + }, + { + "path": "crates/oa-desktop/src/hosted/view.rs", + "bytes": 9281, + "sha256": "fc0c7b7ce3a5f05c49713df6661067751f81e810af11c614ca265ea9490e6463" + }, + { + "path": "crates/oa-desktop/src/main.rs", + "bytes": 1554, + "sha256": "5228743f361f9239e4584780bfa9b65d36207d0288624e1fb42b721146bcff1c" + }, + { + "path": "crates/oa-desktop/src/model_menu.rs", + "bytes": 36340, + "sha256": "d2f836661f43fa1bc8830b1e51cc736948b3d261796c3fa877df02ae15568c4b" + }, + { + "path": "crates/oa-desktop/src/navigation.rs", + "bytes": 8839, + "sha256": "71355a12e1b4791106426d83fe5ebf0b29bce8e1dc594f0655ab85695469669e" + }, + { + "path": "crates/oa-desktop/src/port_edit.rs", + "bytes": 7809, + "sha256": "70b99f577c4fdeda8780c8dc1ee7b1639fd77aaca06658f06d725139fb3efb6d" + }, + { + "path": "crates/oa-desktop/src/port_preview.rs", + "bytes": 35855, + "sha256": "069487c4ece737d52e8ae4a84dcfb132236aca6799e841c91c8e7244320cf871" + }, + { + "path": "crates/oa-desktop/src/port_workflow.rs", + "bytes": 40582, + "sha256": "ccc15f97c3272145a67bb5857b4faeaf7437561bd61912fa27ab26e8824146a0" + }, + { + "path": "crates/oa-desktop/src/recovery.rs", + "bytes": 21041, + "sha256": "57e22e5fbb0e994e64ae03e69450271fe9f04a951db1670c2a018abe99db4489" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/README.md", + "bytes": 1587, + "sha256": "a90002df1e087d2dac7be26926864243568a0de7c4103e4927435b34178e8016" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/profiles.json", + "bytes": 473, + "sha256": "2c12ae96b50e6da5d60ce2b7fa00204be71dfbe2fd51311fc337a0de6a4332ff" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source5-bundle.json", + "bytes": 80974, + "sha256": "12715995e6f7f35414aea53b3ad720b9b31873ffdeaf4444231db1a5ac3c463e" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source5-model.json", + "bytes": 86191, + "sha256": "5535a706df9ec21715e8b6a5aa6dbd79636ae461450aee61305559016167612b" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source6-bundle.json", + "bytes": 85286, + "sha256": "ea88890a33f47d67dfb06d6dbbcc179058cf28dad76ae7d615c00aaf30dbbbfe" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source6-model.json", + "bytes": 90629, + "sha256": "5bb8db0b6394276666323483f977ac3586f88554c81a148c6d508fca0ef4576f" + }, + { + "path": "crates/oa-desktop/src/recovery/source5.rs", + "bytes": 6956, + "sha256": "0f0a763f0c98c2c908d4c2b95d8a4c042b6a255ee1cc16260e5404669691f642" + }, + { + "path": "crates/oa-desktop/src/recovery/source5_tests.rs", + "bytes": 12146, + "sha256": "cfd17a742f1f27b523fce7cd9309f0a07a30413395f6c58659fb91d02834a7a3" + }, + { + "path": "crates/oa-desktop/src/recovery/source7_tests.rs", + "bytes": 18213, + "sha256": "7ee61de66c75bf949489ba51ddc9677e2b4efc68801cf27909c9b894bfdc9288" + }, + { + "path": "crates/oa-desktop/src/route_edit.rs", + "bytes": 2941, + "sha256": "457ae59c2761a43a8620b4d336a7cf0f54b965997110ecaf968756a88b6b0374" + }, + { + "path": "crates/oa-desktop/src/semantic_review.rs", + "bytes": 3432, + "sha256": "8dd1e93783d63a663c7e56c28775a5c389cfd7a6b562013d6a95c891afa21ed8" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts.rs", + "bytes": 24201, + "sha256": "a79236a8150597ff808597e59cf4f1e9e61c74c4901d9c8cf42d3427bb52a9a8" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_recovery_falsifier_tests.rs", + "bytes": 11034, + "sha256": "3f255d04e4bffa5a467b75e3cbf6f7149aa3269a02f2a89fbaa1db0e5df9ae62" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_tests.rs", + "bytes": 20798, + "sha256": "04d0dd2ac453705185663f705282aa4a3a31433466a5be305764248da1a03c32" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_view.rs", + "bytes": 6447, + "sha256": "2100ff73565765d8293c84f6ce2d8e566610c1524c50e32ce3c37dc33b6686e4" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments.rs", + "bytes": 18160, + "sha256": "de0ec0c740895b160ff5b847332c087c3f1a48931583464069470cc61315ed59" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments_tests.rs", + "bytes": 29389, + "sha256": "8b26be0324e0f33b1e7cf7af340350df8ed98963002d6da8589ee0e6f6900bea" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments_view.rs", + "bytes": 3032, + "sha256": "932f231554d77c7cb119d33bb06b9879db5e12127aed187e67013e77b6458e78" + }, + { + "path": "crates/oa-desktop/src/semantic_review/batch.rs", + "bytes": 34485, + "sha256": "a462eb627ae19348072775cf8e60b17d62f6b682b74cc413906d493fba1f0b3c" + }, + { + "path": "crates/oa-desktop/src/semantic_review/batch_tests.rs", + "bytes": 27546, + "sha256": "b67c4d7dcabac710cf3d30730a8db323180a558a415e2d117c868cdfa4804619" + }, + { + "path": "crates/oa-desktop/src/semantic_review/compose.rs", + "bytes": 27155, + "sha256": "c6adcc9882dde65e9f04f6eda7f0c855c5cbb285cf421123029169112793ce9b" + }, + { + "path": "crates/oa-desktop/src/semantic_review/compose_diagnostic_tests.rs", + "bytes": 9809, + "sha256": "440daf8d43278ef981c620d1818d0daaed8fb83193b8e8ff67b2e42fbf882938" + }, + { + "path": "crates/oa-desktop/src/semantic_review/constructor_tests.rs", + "bytes": 54132, + "sha256": "85149521ad7df62918f6f2fab6da2b3346c342ab4bce7100de3f6206c1e81096" + }, + { + "path": "crates/oa-desktop/src/semantic_review/constructors.rs", + "bytes": 12258, + "sha256": "0982163439b06a42d9af1643530364109282e63f05b323a35a76d8241f3caa32" + }, + { + "path": "crates/oa-desktop/src/semantic_review/history.rs", + "bytes": 3211, + "sha256": "df038c2464eab8093a983f3104f0d04ca8f602010a50e1d3eeb8e53f2309e201" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed.rs", + "bytes": 14175, + "sha256": "bdd6c0fdc7108056bc5d7433254503449eed2209813680e717ead24b9d0ce834" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_rows.rs", + "bytes": 13222, + "sha256": "4b7bf25806471ad22d89253b9af8000f5acff53b4cc0aa1c1a83138e7b270eca" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_rows_tests.rs", + "bytes": 30804, + "sha256": "1a3b09e7ed100411cdf8043f9a78defc664a873ee0201117709185c201a5c57f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_tests.rs", + "bytes": 31163, + "sha256": "9dc9b989e5a9d408427ca1baf86b2454f9dd3baf40a551c70ca2359dc18a1227" + }, + { + "path": "crates/oa-desktop/src/semantic_review/message_kind.rs", + "bytes": 789, + "sha256": "4ed19952ea511d1b3226564a138e3322f994371d6b49794c14bc3689d1393e7f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/message_kind_tests.rs", + "bytes": 23424, + "sha256": "5fcf9930e949aebeb12eab0327264f32a2388d62dbf098bd2365711e22623c52" + }, + { + "path": "crates/oa-desktop/src/semantic_review/ordered.rs", + "bytes": 9705, + "sha256": "6a1ed894d1b9d0110bc784a75c49444f1d14f1f74620d701f22203b2d8d0a813" + }, + { + "path": "crates/oa-desktop/src/semantic_review/ordered_tests.rs", + "bytes": 22383, + "sha256": "5c8ea3a69e3da3b94d13f50f12aa7dc53246ccba25ffcace9552a0eb76b0bf36" + }, + { + "path": "crates/oa-desktop/src/semantic_review/recovery.rs", + "bytes": 28769, + "sha256": "88e69044d90c481593bab7cc125f0401c05202fccdde07698cec9483947fe8be" + }, + { + "path": "crates/oa-desktop/src/semantic_review/row.rs", + "bytes": 38159, + "sha256": "b08fdc503c6c4d2ff99adac7e18c9baa861bf86155e00b55d1e492430980d0f2" + }, + { + "path": "crates/oa-desktop/src/semantic_review/scalar.rs", + "bytes": 15153, + "sha256": "9ad202174934dd9a63fbf9cba43135aead571db60846c8b7b1d3019a11df26c2" + }, + { + "path": "crates/oa-desktop/src/semantic_review/source7_tests.rs", + "bytes": 11665, + "sha256": "5e8221d77b068fa30c1571988448cb8829711735881d810f3d333cbc95d34a9f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/tests.rs", + "bytes": 32480, + "sha256": "077ec6501dfaab0b05ea3987943b204f08352952296d313555051d998ccd232e" + }, + { + "path": "crates/oa-desktop/src/semantic_review/view.rs", + "bytes": 57626, + "sha256": "7cc7dd213ab01dadad5debaee868c30a1099466602869a799ebdf9b680e8eaf0" + }, + { + "path": "crates/oa-desktop/src/semantic_review/view_reserved_artifact_tests.rs", + "bytes": 4737, + "sha256": "6c766b29c8664d15cb113d2cc71bba9b60ae4ccf7e44c9c5d3c41e1dc4b7ed90" + }, + { + "path": "crates/oa-desktop/src/source_navigation.rs", + "bytes": 3938, + "sha256": "c1da10882f35f8eb0675e68c642c9a209dde09679cded414cfb9903a4e49ec77" + }, + { + "path": "crates/oa-desktop/src/source_tree.rs", + "bytes": 21816, + "sha256": "4d55e0110a1eb128a5d26c28f3aae5853d79b7245812b7c82bd275f38440a5aa" + }, + { + "path": "crates/oa-desktop/src/source_workspace.rs", + "bytes": 15522, + "sha256": "30f63a6b8d65a38d66061f90d864b5746cbacc0fbd65abc028a8f3071c47d358" + }, + { + "path": "crates/oa-desktop/src/style.rs", + "bytes": 3015, + "sha256": "05d61bec16141612ccafa0988e8c4827f41754509efdb3b961eab69127ded896" + }, + { + "path": "crates/oa-desktop/src/tests.rs", + "bytes": 58557, + "sha256": "b017218195eea2c96aba12eba8a99a38945c8ca910a652e272d34883bdb98691" + }, + { + "path": "crates/oa-desktop/src/view_copy.rs", + "bytes": 9043, + "sha256": "5630f31c942e1226aafd67eabdace6a5c5494875bdc6f7f077019e8110ba41a9" + }, + { + "path": "crates/oa-desktop/src/views.rs", + "bytes": 50668, + "sha256": "9b53126d19b2ae34f170a1422c9f5ea5a833489274cbfa04546279058e289f9b" + }, + { + "path": "crates/oa-desktop/src/views/traceability.rs", + "bytes": 7501, + "sha256": "4c89dcf35c25e737d8cce4d543a5989ca104a5678e6cf40df47e457773d2ef94" + }, + { + "path": "crates/oa-desktop/src/workflow.rs", + "bytes": 82963, + "sha256": "d9e7b11a86fd3ec79d91f0c9bc9cebd5a2043cdaa7261622454fb7730ad8e060" + }, + { + "path": "crates/oa-desktop/src/workflow/communication.rs", + "bytes": 11084, + "sha256": "34d121ad97706012722e4bb6210072ecc3a5b4718b0ceab0c3d0f14d4cd780a1" + }, + { + "path": "crates/oa-desktop/src/workflow/recovery.rs", + "bytes": 9859, + "sha256": "0849b0f34dba5e8761be5fa05784d134ac74e4e9db395d6b9b7d6cff71e3f3dc" + }, + { + "path": "crates/oa-desktop/src/workflow/transition_tests.rs", + "bytes": 8553, + "sha256": "589b1b2dbadca74a52c2cfcfd4fe620bd4790abd113ac02182e91616c52d793c" + }, + { + "path": "crates/oa-server/Cargo.toml", + "bytes": 778, + "sha256": "527ff5e15010a8b560a6659aa1ae4bf0c8df0d9e019f03c47529ec6a750c0982" + }, + { + "path": "crates/oa-server/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-server/src/error.rs", + "bytes": 5610, + "sha256": "93817f1502386e4662c96ee1c7d1c4afc4e33bda6fd64e46c86c8e1afd5a9368" + }, + { + "path": "crates/oa-server/src/lib.rs", + "bytes": 7743, + "sha256": "20bef350350ed6339588b23af684abf745f97916c7edf3853ee042abe687e664" + }, + { + "path": "crates/oa-server/src/main.rs", + "bytes": 4163, + "sha256": "d59a6a2b5c7034bd2e00a516d2d49abb16391bf0316c1c357ddafb9c82d2d1e3" + }, + { + "path": "crates/oa-server/src/preparation_http_tests.rs", + "bytes": 5523, + "sha256": "454b90d0055d35644c8d990cd7576ddf675a9b271ca07fe9b0efce25d8ddbc07" + }, + { + "path": "crates/oa-server/src/routes.rs", + "bytes": 46053, + "sha256": "3f9a0c22043dbf28f7a8e587d2fc3abf869f76f4d23a46fe0aeb9c4392454a4b" + }, + { + "path": "crates/oa-server/src/store.rs", + "bytes": 25524, + "sha256": "37dcfb845b7993d5bced2bcf25fedfcd2a9c20a748f9315afe6cca1f41f89ae5" + }, + { + "path": "crates/oa-server/src/store_preparation_gate.rs", + "bytes": 4440, + "sha256": "427c390da3c0281ba1fe115a93ea90800e3b45fce6bcb9185e71982ddd885fec" + }, + { + "path": "crates/oa-server/tests/http.rs", + "bytes": 71892, + "sha256": "50daa6a90e96ad6fe3c6a27df2eaebe486270599c203892d09769c547a194975" + }, + { + "path": "crates/oa-server/tests/http/communication_limits.rs", + "bytes": 5790, + "sha256": "ba5474dd8e494a0176fffb4548c8e3deb2081b15de33bfce82394c764e0a2c16" + }, + { + "path": "crates/oa-server/tests/http/data_contracts.rs", + "bytes": 25949, + "sha256": "8cd456db83f301baca380acf025a5a99db4edf7d8839537dfbd02c4307e10e6b" + }, + { + "path": "crates/oa-server/tests/http/port_anchors.rs", + "bytes": 15086, + "sha256": "7199d0a208ddad9e1518b6e3fb390d64da111716d7505ba5c995deae19ad1258" + }, + { + "path": "crates/oa-server/tests/http/semantic_transitions.rs", + "bytes": 22832, + "sha256": "856d1c9b633ffb581e3e631f4e5a607789a02181dbf060667f208a569bfa4920" + }, + { + "path": "crates/oa-server/tests/http/source6_views.rs", + "bytes": 13023, + "sha256": "867bccda0e030eeeb9976b4ceeb47b21ab5044d700278022d5fb495bbb64ca07" + }, + { + "path": "crates/oa-server/tests/http/source7_contracts.rs", + "bytes": 11000, + "sha256": "0e0a467186da7263c0754890aff69ebd0d92d36b5224e4865bb6854b18dab7e8" + }, + { + "path": "crates/oa-server/tests/http/source_projects.rs", + "bytes": 30907, + "sha256": "8ff580f317ec267d1cd72ae14d8638f74a77cdf99ca4c78f66f4290c2d77460a" + }, + { + "path": "crates/oa-server/tests/semantic_http_contract.py", + "bytes": 7251, + "sha256": "4737ff94f10761f94151a694414c5c62737e0391ec820bca132830652bc4cca2" + }, + { + "path": "crates/oa-server/tests/semantic_schema.py", + "bytes": 25111, + "sha256": "cacca116c42ffbc097f1419c0f89921fa0dfd3faa864d46820ff744cfe6967f9" + }, + { + "path": "crates/oa-server/tests/state_representation.rs", + "bytes": 12241, + "sha256": "6686c826f28248ae4b63ec3f2112e193d4a347724b87974483217fcfee49cd61" + }, + { + "path": "docs/acceptance.md", + "bytes": 3463, + "sha256": "32ed3e4fed63f5c464e0937221f401d71623b276dd70f083531ac6ccebbf9050" + }, + { + "path": "docs/api.html", + "bytes": 72515, + "sha256": "a06126cb741da57e9c06e83fc4137ccde0de05562673546bc9d405878f51ea07" + }, + { + "path": "docs/api.rst", + "bytes": 41929, + "sha256": "ca7d310138c3b4d429d80a1d03d1ac8d4a9296069e205da573034256d10438a7" + }, + { + "path": "docs/architecture.md", + "bytes": 10974, + "sha256": "a50bd1645222ef3e574fa07a6ab9aa213431ee8833c6c0158ad91ce0f799543c" + }, + { + "path": "docs/language.html", + "bytes": 175111, + "sha256": "67dcfa3477b48a0b07298ec81741840cc3ccff12c7d58164873d746d41d611c8" + }, + { + "path": "docs/language.rst", + "bytes": 134663, + "sha256": "12229dd7d52fbaba80fe599d499f29b535f4c37c7be0585664d17edf0466ba33" + }, + { + "path": "docs/linux-packaging.md", + "bytes": 8671, + "sha256": "41a1bb1095801df37a1411341c5791d55ea8c365739314d599a60269ac4bc7a0" + }, + { + "path": "docs/openapi.json", + "bytes": 346920, + "sha256": "bc5825a3182a4df5f6710a80262f4a09b4c15f0e4cda7ca74e1746ceca81a89b" + }, + { + "path": "docs/research-v2-architecture.md", + "bytes": 40445, + "sha256": "1b3809f2dabe6b1805dbf3d3f2625c471cd21356c7bd603916466a8c4ced8090" + }, + { + "path": "docs/research-v2-semantics.md", + "bytes": 31535, + "sha256": "b7ec3677300248926a88b84da3e7ffe52f5b73524c7712c927a0e951569db04f" + }, + { + "path": "docs/research-v2-service.md", + "bytes": 36209, + "sha256": "4828df5bc679e7c71f49b4b85c9e7dacbec52f46d416fed48af70e08886d4e4e" + }, + { + "path": "docs/research-v2-ui.md", + "bytes": 3245, + "sha256": "894e721b59a8ca85f0d95b6706ed5f130a0372def460cf33aeefc9e5e38cde0a" + }, + { + "path": "docs/scope.md", + "bytes": 16690, + "sha256": "a1d0cfbfc06fc8bc2bf0f71343aacc8853cbbbfc00a1fc9852ddf41c8245ffca" + }, + { + "path": "docs/server.md", + "bytes": 23361, + "sha256": "4eb24937d424ba8b384e1734e02a6f8e963ae11d2715889c92b14b39ff2e4a48" + }, + { + "path": "docs/source-cli.md", + "bytes": 3374, + "sha256": "34f12b72cc6d6ead4f47c7818c1897db592f8ad493c70776db2ab48c24d8f051" + }, + { + "path": "docs/v2-interface.md", + "bytes": 11807, + "sha256": "c7fbaf0ebd3fc9f6c11f818db2b0b9d68a33f580cfced22bde83ce08ae790bc7" + }, + { + "path": "docs/validation.md", + "bytes": 6505, + "sha256": "f46ea950ed1a54409aa07c4f9e90f39f8e2d00c1dd1b6cb805caa3993845967f" + }, + { + "path": "docs/windows-packaging.md", + "bytes": 10406, + "sha256": "2c852ff7041713ffbff3c951ac98df647c51fb70b0feba9000f7bfd5bc2703a8" + }, + { + "path": "examples/coastal-rescue.arcadia", + "bytes": 33107, + "sha256": "7e183ef9fd8154d3074303f1956cd0d9871c19e3ffc630d333b0bffbd6e30e17" + }, + { + "path": "examples/coastal-rescue.json", + "bytes": 49715, + "sha256": "242f0b031229a87af5c4ebe5d651defe59c191a6b7a69dc0a77f7e203411f195" + }, + { + "path": "examples/legacy-v1-coastal-rescue.arcadia", + "bytes": 3449, + "sha256": "4dbbbdf8bc7e6cb8e0a81dd678069dae585a9e5187c59bc3665e1fdab3f1a86a" + }, + { + "path": "examples/legacy-v1-coastal-rescue.oa.json", + "bytes": 5976, + "sha256": "fd0e9dedfb7adb922dc0575cc2b820d40344d639f1d8052bd70363aa59de9c24" + }, + { + "path": "examples/release1/README.md", + "bytes": 11137, + "sha256": "113cfb1cf38a98b51bff60442d86a35d636a3d80ef206bece7d53d0aae67f2d5" + }, + { + "path": "examples/release1/evidence/repair-check.md", + "bytes": 1419, + "sha256": "f4db17bdca4ecbb1bf0caef01b2da5f1f7f798ab3152b648ce6dd8696a6a68e5" + }, + { + "path": "examples/release1/expected-diagnostics.json", + "bytes": 288, + "sha256": "3700393d76b940cfc076bf52861bd7b1f43370f8eabce3594531bd0bf1fc851e" + }, + { + "path": "examples/release1/model.json", + "bytes": 134520, + "sha256": "ef0ef4006c3e09d5db6e1b621256b3f7d6642f3a7b09cc34607cfbcca830c727" + }, + { + "path": "examples/release1/model.rs", + "bytes": 28762, + "sha256": "15f30f6bde655808fe754665c26d560e36f2a9bad340f346b09137d0d05045f5" + }, + { + "path": "examples/release1/oa/activities/activity_oa_restore_work.arcadia", + "bytes": 1307, + "sha256": "83e73d0a013d5c3e1a4af0d9139ab0cfa362d25a846671fc2dac59181061a9d4" + }, + { + "path": "examples/release1/oa/behavior/process_oa_assessment_procedure.arcadia", + "bytes": 697, + "sha256": "172c32c044ef4b5bc58a1f4635cc81f48dabb4014479b47dce7b25fedf2dbd0d" + }, + { + "path": "examples/release1/oa/behavior/process_oa_field_procedure.arcadia", + "bytes": 1781, + "sha256": "d2552dc5383e2e91cb302a790364e197f663c2edc013a2ab1978789825c9c324" + }, + { + "path": "examples/release1/oa/behavior/process_oa_response.arcadia", + "bytes": 3225, + "sha256": "cf86f46fa5c5d70592ef43f1bc1cb4d968efd8add384ba88036bef6b88aa4abc" + }, + { + "path": "examples/release1/oa/behavior/scenario_oa_conversation.arcadia", + "bytes": 1795, + "sha256": "b25be524e98a35ebac5e4481b7609c027b32baf9605e8097f807560f94a77ca6" + }, + { + "path": "examples/release1/oa/behavior/scenario_oa_full_scenario.arcadia", + "bytes": 1261, + "sha256": "00a1edf2c9707a0eb62ac070c2d02467874f2c9c1f273cc6ddb53d6d65999a1c" + }, + { + "path": "examples/release1/oa/behavior/state_machine_oa_monitor.arcadia", + "bytes": 2022, + "sha256": "447c9ad1359f4a31ecf975ad07c0b08d8e7e03191fb0858e2fc56f377b223cd5" + }, + { + "path": "examples/release1/oa/capabilities.arcadia", + "bytes": 781, + "sha256": "fc8012e5554350b12e1cb80080f8feab80d933c9b33c0f2a7bb500cb7d609936" + }, + { + "path": "examples/release1/oa/model.arcadia", + "bytes": 661, + "sha256": "f7cf914766ea73ec53b85e32d117ea9a9dba52d3e038246863541ae7069b1a15" + }, + { + "path": "examples/release1/oa/participants.arcadia", + "bytes": 1834, + "sha256": "951764c14179f27c10e315acf2ea37d1fff54c77b8441e23addd239e8c715ce3" + }, + { + "path": "examples/release1/oa/types.arcadia", + "bytes": 788, + "sha256": "9d0396fb82dd5733edd8d1cf52f968ca84906927c704f9cf0944a7fae215cf49" + }, + { + "path": "examples/release1/project.arcadia", + "bytes": 1958, + "sha256": "b2674e6bf77cfe0f6f0ba79c81d2e96d92f39c02ca2c6266d80e91723bfb9fda" + }, + { + "path": "examples/release1/sa/behavior/process_sa_assessment_procedure.arcadia", + "bytes": 706, + "sha256": "73928ced61c06cbc08728d7956676a50fd4c05aa5b7f1ff4f29ce27a0b0f2088" + }, + { + "path": "examples/release1/sa/behavior/process_sa_field_procedure.arcadia", + "bytes": 1790, + "sha256": "886d462af83110cbfa55dd232a667ea1446761234471357cbb878794e98e8768" + }, + { + "path": "examples/release1/sa/behavior/process_sa_response.arcadia", + "bytes": 3234, + "sha256": "041785fc22842423822431bd5e6e8d16094ebd0716965e7c765fb8c1d7549e8a" + }, + { + "path": "examples/release1/sa/behavior/scenario_sa_conversation.arcadia", + "bytes": 2127, + "sha256": "97276f5757ee9aa12a0dbd9d3ccd58174b3091162bb8bcce357cec20a45f5d85" + }, + { + "path": "examples/release1/sa/behavior/scenario_sa_full_scenario.arcadia", + "bytes": 1256, + "sha256": "e12fc406b99d60a2f7768aaa0b25ba560e8605f0b8e37f3a7cdd3b8443562b74" + }, + { + "path": "examples/release1/sa/behavior/state_machine_sa_monitor.arcadia", + "bytes": 2022, + "sha256": "05ce29af99424c491c47fe2450dc6f5f8ce995511c01ec7e17bb5855be3c9736" + }, + { + "path": "examples/release1/sa/capabilities.arcadia", + "bytes": 781, + "sha256": "b6912fb3ece439912345fa71724acd462e716a1e5a88203a1058a5c3b2c20a4f" + }, + { + "path": "examples/release1/sa/functions/function_sa_audit_thresholds.arcadia", + "bytes": 297, + "sha256": "e5a04325d52183956dca814dd90f4e56c96c6b7db0f4f202f203ecb49c3e0f4f" + }, + { + "path": "examples/release1/sa/functions/function_sa_restore_work.arcadia", + "bytes": 2576, + "sha256": "fddeb67308051325041fee641fe758ddf43345b7c47b66d433616ad07fdccdd6" + }, + { + "path": "examples/release1/sa/model.arcadia", + "bytes": 661, + "sha256": "d431509251acb859fbb98733b6d18add952495e10a78703fbe8f31e40bc083c4" + }, + { + "path": "examples/release1/sa/participants.arcadia", + "bytes": 4012, + "sha256": "780d2eb08b217b67b55febb3d34846f727b8ee9018df6c5741748647e36b2ff8" + }, + { + "path": "examples/release1/sa/types.arcadia", + "bytes": 1227, + "sha256": "101fc0fbd99f1101514aa7b6da4f8e535aae0bb94c9e2b9e7e6c151135b28660" + }, + { + "path": "examples/release1/traceability.arcadia", + "bytes": 29506, + "sha256": "48a96f543456c9b5a5798fc795594e4119147fe45f11a6f109f141b7f514560f" + }, + { + "path": "examples/release1/transition-before.json", + "bytes": 35801, + "sha256": "2253e6434f741687e22327c37d520ed15c043bc36025498650bc2366bb6a874d" + }, + { + "path": "examples/release1/transition-request.json", + "bytes": 4276, + "sha256": "43b9a22e5f95ad3bc0ebd2478ead0e14406854abc989ae94ded9367b013d812a" + }, + { + "path": "examples/release1/views/diagram_oa_allocation_view.arcadia", + "bytes": 2176, + "sha256": "dfc0eb61e0e2aa5bda45524571fbfa3494f44ce19696f3e15e07438074a07bc7" + }, + { + "path": "examples/release1/views/diagram_sa_allocation_view.arcadia", + "bytes": 2173, + "sha256": "b78b43a26a82efb8fbd5374b09c329fa341f57b29f635d397b9ef8aede71d389" + }, + { + "path": "examples/release1/views/diagram_sa_capability_view.arcadia", + "bytes": 1620, + "sha256": "75e8dc9fb30f25d6f8fd3c6b595593ab4f98958a25798f961e336e0fac557649" + }, + { + "path": "examples/release1/views/diagram_sa_service_view.arcadia", + "bytes": 2209, + "sha256": "b08c84f3ea633e7c78dfdad3272f75415f6256cf3614b6d99bfd4f0269076c9b" + }, + { + "path": "examples/release1/views/diagram_sa_state_view.arcadia", + "bytes": 1931, + "sha256": "5f42f4c605e57b817d8400ed21f2b14bfc4e1592aebe941ff113767504c2b869" + }, + { + "path": "examples/routing-workshop.arcadia", + "bytes": 66431, + "sha256": "dc6b75da72884d399132ed9e300fa5a26b73d802bb526c9af986ae9eeb0a646a" + }, + { + "path": "examples/routing-workshop.json", + "bytes": 100281, + "sha256": "8592714f75b271133f21ce017d87896b6cf91ea0e4837f1c2ed453e21be26b14" + }, + { + "path": "examples/source-project/oa.arcadia", + "bytes": 2142, + "sha256": "5f60642f211b2d352a951092faeeb7503d4fb7f6f7fca99e810347231101d31c" + }, + { + "path": "examples/source-project/project.arcadia", + "bytes": 606, + "sha256": "787f6b67b179ffd221f7e5faf1a4edd74cfd116aa1e3b5e9ed9f22fbff612d8d" + }, + { + "path": "examples/source-project/sa/assurance.arcadia", + "bytes": 682, + "sha256": "ab76044836e4dcd42a82d316846ec87da2108939aa2037640c5bca1d2ecdee0f" + }, + { + "path": "examples/source-project/sa/participants.arcadia", + "bytes": 1231, + "sha256": "1abad579812e77877b45a3d8e3c3e9da734be2d04a0254cc730a5257ebd2dc88" + }, + { + "path": "examples/source-project/sa/reporting.arcadia", + "bytes": 2839, + "sha256": "f0b7443f728912ca163de39b6055876b533a77feaa3219b2d40a2dd65712e058" + }, + { + "path": "examples/source-project/views.arcadia", + "bytes": 3508, + "sha256": "e29ad3f406a6a50d2f0ae2ca2a53ee3b0c18222cd4098704a46d4f48b64ea17f" + }, + { + "path": "examples/text-first/README.md", + "bytes": 1367, + "sha256": "4ec8250d5ed556f1d496e8c85137e973e802ecb11df1a36488411e8cdc5a9f9e" + }, + { + "path": "examples/text-first/project.arcadia", + "bytes": 480, + "sha256": "f441535c623e0cf20e1875eb2cd33b587ed00e078c37af39cb36d89bb5edc19a" + }, + { + "path": "harness/fixtures/basic-editing/README.md", + "bytes": 12012, + "sha256": "3545d9695e7c62e0caa818efd7f4dc426f04876a3626e0f3b1bad606b258cb26" + }, + { + "path": "harness/fixtures/basic-editing/base/expected-baseline.json", + "bytes": 4524, + "sha256": "f239e728d650b0af32bb8f3dcaf6b27c99b9c5041132ac14e51756ea6563d978" + }, + { + "path": "harness/fixtures/basic-editing/base/project.arcadia", + "bytes": 3077, + "sha256": "045cb047d7bfbca72c3fb30db4c81a30ad463d3af7fc51604906ad7fa75a1ff8" + }, + { + "path": "harness/fixtures/basic-editing/base/rationale.arcadia", + "bytes": 57, + "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f" + }, + { + "path": "harness/fixtures/basic-editing/manifest.json", + "bytes": 447, + "sha256": "d23c21b02064ddb85e051e10e16ff089daba8d9910bb1a695dfabe2db3757734" + }, + { + "path": "harness/fixtures/behavior-creation/README.md", + "bytes": 5954, + "sha256": "9e5fc751424d12cfe76a84abb1da45b2d38947409179451bb90ffe7e7ddc8723" + }, + { + "path": "harness/fixtures/interface-operation-probe/README.md", + "bytes": 2604, + "sha256": "088f0bdb3375deb8f2c7e3b749ca8d210ea828ca4dece69b3871b674e3110175" + }, + { + "path": "harness/fixtures/interface-operation-probe/hashes.json", + "bytes": 977, + "sha256": "f6d3e8aa42f40f64ce2ecba7b9cf112eb9091f3cccde3a592b0434e834cf2a6a" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/after-reset-deletion.arcadia", + "bytes": 4218, + "sha256": "c0fe9570684c0061efc4cad65e339fede6961b04ca90c6f324c787bd65e61226" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/after-reset-deletion.json", + "bytes": 7835, + "sha256": "93187f7a1b476a44185725c6b15f2e1767482b6911ab1280144348d033eb51f0" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/boundary-only.arcadia", + "bytes": 4771, + "sha256": "02f85e39957ebe6d56336fa729a5c8b10f51865face9d3b2c9679200571fcfc7" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/boundary-only.json", + "bytes": 8840, + "sha256": "756f9710336e6734ce3592ca774c6f104bba5a37c9e165540eb39326682393d1" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/explicit-functional-refinement.arcadia", + "bytes": 8635, + "sha256": "ac5b629ba5596464f9f8a975b8bc2764e3007ceb7342de3f828d4b18e4f069b7" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/explicit-functional-refinement.json", + "bytes": 16160, + "sha256": "78a47c978dc667aa1c45af711f06aa2a0d3c581003013e30c3e02fb0faae2e64" + }, + { + "path": "harness/fixtures/interface-operation-probe/probe.rs", + "bytes": 11274, + "sha256": "72b1b443e25eb20420dec4477b0fb5ef5d1c705e3882c81df88dd578ab96a426" + }, + { + "path": "harness/fixtures/release1-native/README.md", + "bytes": 2564, + "sha256": "5f5ba040fd2df9261a29bcab3f9a7ae27c3683265411ad3dda0b467d5df8590e" + }, + { + "path": "harness/fixtures/release1-native/artifacts/README.md", + "bytes": 4155, + "sha256": "24200c84ccc2ef3e17c029744074e5cea785188f5549ac54e44cf89682643f81" + }, + { + "path": "harness/fixtures/release1-native/artifacts/generate-semantic-artifacts.rs", + "bytes": 9275, + "sha256": "444f360b78df52c5e42046f77b148781e0c9bddc2a09c0b7bd65c7a4f376cfe6" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.after.arcadia", + "bytes": 7768, + "sha256": "84b22e95c213018612e6e8a84cad68b35a8b495ff3515b0f978c5e7a3d196d79" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.after.json", + "bytes": 7330, + "sha256": "13a6f99ec2df1dd35ee8b2613f183918cd9537eda4a5da085ad52e65c033db59" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.arcadia", + "bytes": 1446, + "sha256": "1e0d662ba33071b122ad9206d2d559a8e748c9431eb3ac1b759bde3760ca877c" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.json", + "bytes": 2216, + "sha256": "fa6a2e3643c0f909b92407abec3edc897033162eeaa501f8d4616f79d41fa044" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.manifest.json", + "bytes": 567, + "sha256": "65cb70b0d697a055363ba01bf30bed7e412d43c9978a033549c378d117719ae7" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.request.json", + "bytes": 3991, + "sha256": "ed905267263e7f8a0cd2dbe833196b30118b6a246815216932fae661ad650699" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.after.arcadia", + "bytes": 6837, + "sha256": "e50fc462ec22dbf98011929931dd2489430001c3e6433608685b9d88bceb9acb" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.after.json", + "bytes": 6433, + "sha256": "f27a7b38d59c7cefe58cb36783d3d4dd8d8ae1168d9aed1eb61d343c18758908" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.arcadia", + "bytes": 1807, + "sha256": "eba2aec39e6efb405eace4bc8ab0c5563907c26d449e71a4aa750df9f73233b4" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.json", + "bytes": 2673, + "sha256": "2ef777f19b94f08b5e5ca2ef727777897e1018f1426eee291408b3c69101f596" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.manifest.json", + "bytes": 519, + "sha256": "3af7232ed3056ca84dcaf0f266ead3faaa512a0dc0051c7ba68791c20dbae0cf" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.request.json", + "bytes": 1246, + "sha256": "8af21b00b62e620256fbf50e47c6c5836cdb6922d9549cc4b3d86bc03b008073" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.after.arcadia", + "bytes": 4200, + "sha256": "20bb30473830e44228958e78fb7480269cdcc0580c6c90c718da75f34ca5a43f" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.after.json", + "bytes": 4552, + "sha256": "44f4b05db49758dcf344788f57cecc0250fd029099b1c54e4e1e3e972f6cf039" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.arcadia", + "bytes": 1808, + "sha256": "b0fd031671c9f755756922ec5c40a0ce3f40164d22c3c389aec9fd0705344da7" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.json", + "bytes": 2673, + "sha256": "1acf81e08c51c85aceb14a3efbc39ec680552a19c7824aab4611ac3cf71b9c6d" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.manifest.json", + "bytes": 610, + "sha256": "a07978f4b0a3ca83e5ae5f35e7b66b26473b24431fc90e5889d755f1816d52dd" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.request.json", + "bytes": 2352, + "sha256": "5ff844a038b0030adb5a83d13d81e60f30627543388f6199b6a0e026fc42ea58" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-native.md", + "bytes": 4075, + "sha256": "a51ffbc45b6c172cbfed3b16c249296e6a28d457fea57393dd958cdcfbafbca1" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts.hashes.json", + "bytes": 2367, + "sha256": "3ad8b7428b3ed7585a91e7f5d9d5f4880caccfd0b08dca25d05af523e62e0a10" + }, + { + "path": "harness/fixtures/release1-native/communication-means/README.md", + "bytes": 15091, + "sha256": "015c16010c212af283f9def118c6d263ba65a3bc6e81a750f180624ca69bb311" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/entry.arcadia", + "bytes": 6098, + "sha256": "a6976e7c21031e7cc3cb731e20c3075cf89cf85144dc8d3f52930f8521ea196f" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/expected.json", + "bytes": 10480, + "sha256": "60c4419415c546f06c9972ac7bb0e530ada7b30a200b59e75ddda231a24f9a3d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/traceability.arcadia", + "bytes": 407, + "sha256": "3c41459f2b0706a767988738bf8126f76540415bb5940d9c5db19cbe8c18182d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.request.json", + "bytes": 1331, + "sha256": "b16e673b29c96b5aed681389ff7669110abe552939e86dd0ec6011c9a45ed860" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-draw.arcadia", + "bytes": 5239, + "sha256": "a511a4d817d9c5c80233bce83e84a7056b7dce7afd9fcc25696e333f8f4df055" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-draw.json", + "bytes": 8424, + "sha256": "7140114926228b1c378c450535f7a70992c71a879a8d2270c49e8d5f04a2f484" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/entry.arcadia", + "bytes": 5710, + "sha256": "910e6dfe609467047ce629ec9c626f4e927cada74bfbfa164414a8fe6783ea87" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/expected.json", + "bytes": 9868, + "sha256": "567259e20c9f6278776e8fa99b8b2fdbbc9a883ad875c5d39dae1b53de3a2924" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/traceability.arcadia", + "bytes": 407, + "sha256": "997f72fe9258012df66e88344cf39c1a2cebf2327f604056b67f7f2a8ebcfbfa" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.request.json", + "bytes": 1127, + "sha256": "cb3fe05859cfffec6f8846c19983dc462413bc0ea4f6e19204f09c259919c4b1" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/cm-reverse-scenario.arcadia", + "bytes": 8209, + "sha256": "ec826b9b84616507490ac30e4d57100dd6338dba2f7071e879a8fb58820a85c5" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/expected.json", + "bytes": 19735, + "sha256": "ef07e4d2d3fc36004ff01739838281581d9a703c747611eacc01bb9cc672489f" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/oa/behavior/scenario_oa_cm_200.arcadia", + "bytes": 1488, + "sha256": "0ec8d7e38f5a5cd56ccf3979757b3a9f412ad0ae36ee6c2690b7872129046d70" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/request.json", + "bytes": 1090, + "sha256": "c0ac99ee186d126fe3ec57f2c0a4072984d39d36ad21ead357ab66a08ac0065c" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/traceability.arcadia", + "bytes": 2068, + "sha256": "dd5d356390089e4ec474374956f6219502733987e60ef8ff32920d8b33dce858" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/entry.arcadia", + "bytes": 9827, + "sha256": "86dd8a355f6c9dadfea56d06e5247c9b0f820819d7df17ef5690671c7c81324b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/expected.json", + "bytes": 21877, + "sha256": "980489ec2c483d4f9efada61358c1f29bafb2572fd5b804c656b91b8e9bb4f9a" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/oa/behavior/scenario_oa_cm_200.arcadia", + "bytes": 1488, + "sha256": "0ec8d7e38f5a5cd56ccf3979757b3a9f412ad0ae36ee6c2690b7872129046d70" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/traceability.arcadia", + "bytes": 2068, + "sha256": "dd5d356390089e4ec474374956f6219502733987e60ef8ff32920d8b33dce858" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.arcadia", + "bytes": 7698, + "sha256": "1abc4c4cac37cfb06ed3b12a115f9e7e6a2d3affd34b25c355309e5ee465fa40" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.json", + "bytes": 13130, + "sha256": "a5cf4cb2ef390113dd752f4054d43fb789da2ca77799efb5782805ae8aa2dfd5" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.request.json", + "bytes": 1090, + "sha256": "c0ac99ee186d126fe3ec57f2c0a4072984d39d36ad21ead357ab66a08ac0065c" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-transition-ready.arcadia", + "bytes": 5454, + "sha256": "b761c4c2af5f7064aaf1f887ffd6094eb6ae834b2c8057ecdbc4aa97c042066b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-transition-ready.json", + "bytes": 8852, + "sha256": "2536b000de361fb131787e32b466b9123d4e98abf00c099ad32f6cb8e7fb530b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/generate-communication-means.rs", + "bytes": 28035, + "sha256": "003521404b702332082e01f2be7676fda1dd7b5bcf220bb81d25120c8984c75d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/hashes.json", + "bytes": 3133, + "sha256": "39b4dc02fc8b074015c59354fd1c1061c25832fde25065c7151f36eb0455e6f6" + }, + { + "path": "harness/fixtures/release1-native/communication-means/manifest.json", + "bytes": 1237, + "sha256": "fb921f42f2c4a4f8a67d1266f17f8c7750b6a2619554b713aa92b17918f0c43e" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40-oracle.json", + "bytes": 26264, + "sha256": "74edca148583f42c269e51f135662f65ef1c9ea1c94516d63e2a5091967dc99b" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40.arcadia", + "bytes": 28947, + "sha256": "00b87736b82c5afd33b311df7aebe9a6c8c51b6de66221181b5ea8bc8ca221a3" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40.json", + "bytes": 54938, + "sha256": "5dd4f22453330cab3abc059881660190e689a22619853f77cf6d0b52735d97ad" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments-native.md", + "bytes": 2624, + "sha256": "28906924b05f75bbf432389517aef65f1df474d2f2bff79a3586564f7f7328ef" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.after.arcadia", + "bytes": 6795, + "sha256": "9d084dd75a0251d349cc31f9ee98df58d0bc76859dc3cb1503f242e2f759888a" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.after.json", + "bytes": 9618, + "sha256": "f09be41afd85c18fd52fdf997e9b81c4b7cb2c41e78d167abcd14caea8110333" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.arcadia", + "bytes": 4990, + "sha256": "8740f27be99624013d9be876639c0411e1b8c14f0f9a843f43dc71d769efd79a" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.hashes.json", + "bytes": 963, + "sha256": "00fc9e2c709bdcd9ee98012176cb0edb635c112153d963cd169bf4bf69a9e010" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.json", + "bytes": 8146, + "sha256": "9c188f2890630c7feec2be719a7104af9690da7ea836df18fa78da3ff2acfc1b" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.manifest.json", + "bytes": 1045, + "sha256": "46b40f221ffad614733b615208814ace63947e96b80bbfdec63853ccd4f4e8c8" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.request.json", + "bytes": 3075, + "sha256": "b57f656f0b9cf2c595e83150c683301909e20f15684d35d108d3c57ee0dc5909" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch-native.md", + "bytes": 2637, + "sha256": "dddca2b85f892b05881c75ef3cd62437396cc086a09909b621e02bad0cbe56ff" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.after.arcadia", + "bytes": 3134, + "sha256": "d3315bba762395205ae761e6e64029e8b4070c15a1299c6114075581db7b0974" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.after.json", + "bytes": 3927, + "sha256": "8f36119c7e893a4af374b13b85b1c2cb3df0196df8d06a551386628fc8b8646d" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.arcadia", + "bytes": 1787, + "sha256": "5e1f433e04621424edac43e53411624059e873f88dd531bfdb39093953485ed7" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.hashes.json", + "bytes": 933, + "sha256": "1bd87700b04e4f169ab5f8aceaa3b0c3ec3a1cc43e1bce135a1cee506fc75d38" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.json", + "bytes": 2816, + "sha256": "1972242d2a8677d004dc3af1081feb292de65fe26128d877dded8661f9906619" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.manifest.json", + "bytes": 647, + "sha256": "1e440efa02e2ccc27585d9a49c7864d53e3e3e7645ccb219f040e00d95331b8e" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.request.json", + "bytes": 2197, + "sha256": "71f23474614aab90398ce24f00f2cf61d6cb9a3a34faa3e12e0c8104e0a71073" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-repair.arcadia", + "bytes": 15635, + "sha256": "e3ce0347746584f503b825a8b6bd23a7eebf0827940112ef8f36d500c1d0a043" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-repair.json", + "bytes": 25736, + "sha256": "29736f2a619f7f2d0e795229f6e8c3645a1b4eca6292043cd604aa01b1ec9170" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-take.arcadia", + "bytes": 15631, + "sha256": "9ab573c92be66e3bae659dd826923ba6066979b1651edda7bd469056632cd77e" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-take.json", + "bytes": 25736, + "sha256": "828c990c6129692cd31c7f6ed0dd6c952f9cfffdd90bc80171df82d4d929afba" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.arcadia", + "bytes": 15617, + "sha256": "49214be2ca9c8bb6195c3b39737c053847021839f70f0bb2921d35a1fbd2ac83" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.invalid-request.json", + "bytes": 2225, + "sha256": "8b02d4739b1be2c8a64da76423b4a6cae7d89c60f4d30723b94f1da3779cbcca" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.invalid.txt", + "bytes": 78, + "sha256": "aa536e18bc65325163e9b645a4ad031ab599fcb05948dcf741b725d0f0c8b602" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.json", + "bytes": 25722, + "sha256": "995dd72f5c1f07f998233ae9847e337cb82de0c2a9053d3905be021d5f8124b9" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.manifest.json", + "bytes": 1059, + "sha256": "ad315359bfd68ce0d265976dc9e4ea6a502ebbb87d7339dd1af5ef27dd01e433" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.repair-plan.json", + "bytes": 15016, + "sha256": "27bf316ad66ffa91f6323e75b0c280baf5caec298645793dea72c5d42aa3b782" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.repair-request.json", + "bytes": 2225, + "sha256": "f4f6b5480ec8927033ea469ea82c1e8411cb6dba95d2da680f15bc193914c9b4" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.steps.md", + "bytes": 3897, + "sha256": "7d7e38d93641a5f22a2738baa4dbacc392eebb477a855cdce0641961980a19ad" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.take-plan.json", + "bytes": 18557, + "sha256": "74dd68ba686b8928054480f0bfed55aad91f6f1208803399dc9878e894f57ecb" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.take-request.json", + "bytes": 1508, + "sha256": "d19a53002a6bf95af3123a3ef9f78baaf7ce1085d4f06f0f4a9d5e5d5accbc0e" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.after-order.arcadia", + "bytes": 6935, + "sha256": "90277f1780d43a6f0b2184bf00b87e7a4f3518d67c6f10d4793daafe1aabf493" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.after-order.json", + "bytes": 11286, + "sha256": "5a3c8494f6976c23b990c14b40760fb2f32ca9973caf6f31dab5632310663591" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.ambiguous-request.json", + "bytes": 1379, + "sha256": "6a86fde194faa55f2d1bdb982571e0e711e5401b53a960e6acb8cf3e17f506c8" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.arcadia", + "bytes": 6195, + "sha256": "e7c30c5a5c3ba7209c8e223f02da55821d7af10a2f09844a7065ae6cd8f22aa5" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.final-plan.json", + "bytes": 19156, + "sha256": "d1e5c2ed08e0aa6274a0421a39876d1ba99f4e441c7a0a68660a83b9e017da14" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.final-request.json", + "bytes": 2418, + "sha256": "433f723252598994dac7184da61f95344b528156cc5a0fba1a7864b2ec9f002b" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.json", + "bytes": 10441, + "sha256": "9e4e2ce1c7879935ad0860a3ae720506c929a8422b51491b719d88af3fd3ff2d" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.manifest.json", + "bytes": 1042, + "sha256": "87e8899c7d4e54faedeef32afb7592fb65278d1bd7390850ab198dcf62068329" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.after-order.arcadia", + "bytes": 6280, + "sha256": "6c77ed42bbf9f4ebe08bfa233197a4020e5587ce33747f7914430aa0c662d9a3" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.after-order.json", + "bytes": 10009, + "sha256": "1dd7ca2bcfc84ac23369c506302b39569d2ebc41e5a4edc99378a1fe01923b7e" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.ambiguous-request.json", + "bytes": 1390, + "sha256": "e0ea7aeb25687ae63c65128f1aab78273f14030d179d3fbea63fe91ab5430136" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.arcadia", + "bytes": 5529, + "sha256": "563c36162050c8564ffa25a85c726462ecdaebdb87659b3f3610506bfd5581e6" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.final-plan.json", + "bytes": 18821, + "sha256": "f96c43fc58dbe48a044b628b31bb3f0b59171dad5b6982ec6c34a5597e474130" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.final-request.json", + "bytes": 2438, + "sha256": "d38fdb13612b07254edad80848f79c1e097d5f868c020feae9ba072aa697a50d" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.json", + "bytes": 9153, + "sha256": "2ed0daed118f2df13dcad738dab174ad34d44a15921cf8097415e707978b0968" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.manifest.json", + "bytes": 1058, + "sha256": "c79bd12a85d8d4f25cc3ee43581b3e5e74ae9ad7e4de0c72764975ba2b89c279" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.after-order.arcadia", + "bytes": 5026, + "sha256": "98020e048ac01f285c6ad8c10ce22bef05e193b5ba0f5558be1fb26a7bf82620" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.after-order.json", + "bytes": 7851, + "sha256": "ea3783992488bc6ee944eb91a26ccf3dbc05a3909528fc32ec8023a76765cee6" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.ambiguous-request.json", + "bytes": 1379, + "sha256": "ea3cfd25f7a50481805956fb88ab851516dcd602dd6564502a0cc55f7de6a54f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.arcadia", + "bytes": 4295, + "sha256": "2b7c3694623bbea3e36dcc6f674d4adcd91e23c8e1005ded21e5a69648a048e5" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.final-plan.json", + "bytes": 17912, + "sha256": "95a23bd334cffcaef0c3b1012b7555efd2a077ef6f9140d58020910ef8a76723" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.final-request.json", + "bytes": 2081, + "sha256": "1e2433ed5821bf65443f56cb27381ee935db81b1955d3a539b7952898312a410" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.json", + "bytes": 7012, + "sha256": "0033f8780c2ba69779b811bca792340c25a092f887e5811c6839f0a691d744f2" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.manifest.json", + "bytes": 1046, + "sha256": "e3b4a60a56abee779ca8356605c968aa2d99256a3bd3c5601b14b5c5502a1a05" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.after-order.arcadia", + "bytes": 5467, + "sha256": "e265cab35097acc46f5123107c13bc35b9f71931ff650557fc1c85779141b327" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.after-order.json", + "bytes": 8482, + "sha256": "9b777828d3681138de6bbd08de8bf922bed92c27be60b103d8ff73ce7ddd0a48" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.ambiguous-request.json", + "bytes": 1379, + "sha256": "7d124256730bf2feee772c7d0118b87eb288e8aaa9179d69ceb9259dbceb2c71" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.arcadia", + "bytes": 4727, + "sha256": "87a5a3665dab2dd6e595867dcebb1586e93dd067c85d6e24b1a4d3ff0ad6d4ba" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.final-plan.json", + "bytes": 18803, + "sha256": "1888ca51e0923866a9afea99cad069fe5d3f19f0a1b24328e20ac1b9f52d8bad" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.final-request.json", + "bytes": 2294, + "sha256": "5070a5b85feb1bc7b1fc648cd5d35ef26663492c8666dcd471950c06ec3a6052" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.json", + "bytes": 7641, + "sha256": "725b35e36640c81c70c7efea5c3304bf61b49ef9664194ca0d491782cc62191a" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.manifest.json", + "bytes": 1038, + "sha256": "1b43abf8fed3061c65a7b7cb103d31ea7ece333a2da83c645f8d228448c4dbb2" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.after-order.arcadia", + "bytes": 5019, + "sha256": "65a6217f474b5085f37b511151185c2c08ff7a1998e924f1fe01f29c410f6ced" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.after-order.json", + "bytes": 7835, + "sha256": "8a53bb9b43eab5b6dca5e08deef20c14c96e134b9ee816a99b7960bb5255e008" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.ambiguous-request.json", + "bytes": 1379, + "sha256": "c704f99245f00d5c3be0562d91931b4e7f1fb3fb36f41991eb76656ffbd6129f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.arcadia", + "bytes": 4279, + "sha256": "c59ec1233d5a9fbb8e386f6d9b13f398be21baf813ba215efb51bfc1bb98db36" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.final-plan.json", + "bytes": 17938, + "sha256": "30c5c3f614a74708763df612016483623792f4c65e2ed2fa662ac417cfb852eb" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.final-request.json", + "bytes": 2098, + "sha256": "3b6c35ef78133f0980cb6fb53fbc29c5d3c4deb5dc4be01c2c3384e221987b9b" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.json", + "bytes": 6996, + "sha256": "c159c60403abcf8fefab7f19cbad9989488e8ccc20b82c57597b22a0ae254802" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.manifest.json", + "bytes": 1038, + "sha256": "af8a314a9b1d85a8f98affa5a6649f43d252851158798e1ad687bb1b6966b14f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.steps.md", + "bytes": 4549, + "sha256": "6004894e9d9f478b7fe1c3c3e0706dcc546d5df8557cff91b4cf26f8a4badf24" + }, + { + "path": "harness/fixtures/release1-native/source5-recovery/15000000-0000-4000-8000-000000000010.json", + "bytes": 1933, + "sha256": "71cca2a59f36b2a07d11dedbe9101226aa1a4a00d8ac244b5565202e56709f51" + }, + { + "path": "harness/fixtures/release1-native/source5-recovery/generate.py", + "bytes": 1496, + "sha256": "e44986c1d563499f25917441220b23883fc9cb0f89faf409873191f0212fbd2f" + }, + { + "path": "harness/fixtures/release1-native/state-actions.arcadia", + "bytes": 6224, + "sha256": "9cde82608110e56aa9e14c9e33eb38976f53aed74ab013145d411d5743a0ec26" + }, + { + "path": "harness/fixtures/rest-coverage/README.md", + "bytes": 1870, + "sha256": "df4a391312e0c8b20ccdcc850199443b08547be1b10b1f2447a067bf4bf544e6" + }, + { + "path": "harness/fixtures/rest-coverage/coverage-probe.json", + "bytes": 7951, + "sha256": "2d1ef7bdb5d7bf17b9fda33b1d1790d1d88289b3fd1e725f89b83a69771f9a43" + }, + { + "path": "harness/fixtures/rest-coverage/run-coverage-probe.ps1", + "bytes": 9381, + "sha256": "f24f19fca418b76a7249894a08c116e16b465a02f8f899d12b808ccfdd90a3bd" + }, + { + "path": "harness/fixtures/run-timed-bundle-oracle.ps1", + "bytes": 7466, + "sha256": "fab696486a574f9867c6e69a8a8b960e7e9722206441b9cc5f36d41f285f1a25" + }, + { + "path": "harness/fixtures/scenario-authoring/README.md", + "bytes": 14700, + "sha256": "6b651b180b76d10b00bc49d77a8f5e0b3ba0317446978f41b541f5bb23fedad8" + }, + { + "path": "harness/fixtures/scenario-authoring/base/expected-baseline.json", + "bytes": 38589, + "sha256": "abd8246c939ebb8a2162ef82e23d0fb322ee1a8b4d0d7c28a34037e42e86e841" + }, + { + "path": "harness/fixtures/scenario-authoring/base/project.arcadia", + "bytes": 19470, + "sha256": "9b1afbe96b0bf8fa613451b00929492f05a59b9eb2ca74c2c374a8b7bb7cba9e" + }, + { + "path": "harness/fixtures/scenario-authoring/base/rationale.arcadia", + "bytes": 86, + "sha256": "82df210f22f6aa336a3e7e00240977d671c7c3923db7bc58fb29e6d98b67ef49" + }, + { + "path": "harness/fixtures/source7-native/README.md", + "bytes": 7235, + "sha256": "7abccbc3da0980d1d099761d1a66d12c403a0f543954134537ecd4930d182b4b" + }, + { + "path": "harness/fixtures/source7-native/base/expected-baseline.json", + "bytes": 26428, + "sha256": "e2882a58f841f460f45d9d67db1606440e0d7997b9b29a784569ae48e4b23bfb" + }, + { + "path": "harness/fixtures/source7-native/base/project.arcadia", + "bytes": 13616, + "sha256": "5474d8ca05fd1375220dc0ad40d913631fde51159e9632bb9f290d1ecdab8dd7" + }, + { + "path": "harness/fixtures/source7-native/base/rationale.arcadia", + "bytes": 59, + "sha256": "e6a600e13036d4ad594a65380ed1b3d82d1772d583041bb0a624c9588a73047a" + }, + { + "path": "harness/fixtures/source7-native/manifest.json", + "bytes": 410, + "sha256": "6c57164a796234d83818d462d0a25f10e77062d405769e602ae2a7bec251e3b6" + }, + { + "path": "harness/fixtures/staged-source-authoring/README.md", + "bytes": 6876, + "sha256": "502be5e3bf9112447dc07b1a51fe0fa301754b47128a9b81877c185c6e797fee" + }, + { + "path": "harness/fixtures/staged-source-authoring/base/notes.arcadia", + "bytes": 63, + "sha256": "ad9de02963c20d1f43856455a797deb05ca674659e45f2c4b96b52783024f8bd" + }, + { + "path": "harness/fixtures/staged-source-authoring/base/project.arcadia", + "bytes": 593, + "sha256": "aa844950ec4fb86f262a257e1fc370a26557ea7978d8a4cab78265037660234c" + }, + { + "path": "rust-toolchain.toml", + "bytes": 66, + "sha256": "a6a0bbd29ffaa8182dc22d1d9149709f1091e47df40ed96eb8a78a711c66a4ce" + } + ] +} diff --git a/harness/experiments/diagram-removal-windows-20260912/clippy-d61f1f3.log b/harness/experiments/diagram-removal-windows-20260912/clippy-d61f1f3.log new file mode 100644 index 00000000..0da4791c --- /dev/null +++ b/harness/experiments/diagram-removal-windows-20260912/clippy-d61f1f3.log @@ -0,0 +1,2 @@ + Checking oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-desktop) + Finished `dev` profile [unoptimized] target(s) in 2m 36s diff --git a/harness/experiments/diagram-removal-windows-20260912/clippy-d61f1f3.result.json b/harness/experiments/diagram-removal-windows-20260912/clippy-d61f1f3.result.json new file mode 100644 index 00000000..35da9948 --- /dev/null +++ b/harness/experiments/diagram-removal-windows-20260912/clippy-d61f1f3.result.json @@ -0,0 +1,19 @@ +{ + "source": "d61f1f38779ab70a77efcde523ae31c432aefcfd", + "start": "2026-09-12T23:39:55.430462+00:00", + "end": "2026-09-12T23:42:36.745359+00:00", + "exit": 0, + "command": [ + "cargo", + "clippy", + "--locked", + "-p", + "oa-desktop", + "--all-targets", + "--", + "-D", + "warnings" + ], + "inputs": "clippy-d61f1f3.inputs.json", + "changed_inputs": [] +} diff --git a/harness/experiments/diagram-removal-windows-20260912/full-d61f1f3.inputs.json b/harness/experiments/diagram-removal-windows-20260912/full-d61f1f3.inputs.json new file mode 100644 index 00000000..0bb4c429 --- /dev/null +++ b/harness/experiments/diagram-removal-windows-20260912/full-d61f1f3.inputs.json @@ -0,0 +1,2670 @@ +{ + "source": "d61f1f38779ab70a77efcde523ae31c432aefcfd", + "inputs": [ + { + "path": "Cargo.lock", + "bytes": 119973, + "sha256": "065c23c94908fe499d32ed91d55a70946ed5b08ecfda3b483ec1e635572257bf" + }, + { + "path": "Cargo.toml", + "bytes": 400, + "sha256": "369f5b4b2b60705a94623c8c0b68f8e0b048f263280ce07ae0629ad353797d62" + }, + { + "path": "build/windows.manifest", + "bytes": 354, + "sha256": "9c19c5a02f858ece84c44839ad2b145d9c1d90442da0b15c87fd045f975974eb" + }, + { + "path": "build/windows.rc", + "bytes": 24, + "sha256": "a27385edcae0bcf96f55361056cb7be5f36d76fcddcaefd20647c91959563e1e" + }, + { + "path": "build/windows_manifest.rs", + "bytes": 1460, + "sha256": "168da2c42ecccfebc11ee3e1b455e653a68fe9c6d30a9842a8b9e7441d086c80" + }, + { + "path": "crates/oa-cli/Cargo.toml", + "bytes": 279, + "sha256": "49c567f1af74a826683b4d96845feb3806fd9bcb7dc2767e16b5509d4e5e1cde" + }, + { + "path": "crates/oa-cli/src/lib.rs", + "bytes": 15498, + "sha256": "97bebab63b4a611a1d36ad0c20fe452cbe1985fe3a6fbd39c954603da11410fc" + }, + { + "path": "crates/oa-cli/src/main.rs", + "bytes": 2984, + "sha256": "de964f9b6c59c0f31c080afbd3b31d442b07b1b44f6a187a248d3409c45d35fb" + }, + { + "path": "crates/oa-cli/tests/source_cli.rs", + "bytes": 16600, + "sha256": "a3a1b856c7a9fd3d80bc8074150a24fbb0ef0e9ddf736c7cea036725fc3dc2b8" + }, + { + "path": "crates/oa-core/Cargo.toml", + "bytes": 408, + "sha256": "6b5c062474ebb62d5082e07dabed99ee85e4a833edf26690fb4f887028d3416f" + }, + { + "path": "crates/oa-core/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-core/examples/generate_demo.rs", + "bytes": 795, + "sha256": "e26f432c95331aeca50985dbb3ad2c558affd43023b585811f0f7bfaa59f6661" + }, + { + "path": "crates/oa-core/examples/generate_release1.rs", + "bytes": 1798, + "sha256": "1d5f11165d74893e4bc18dbf3a2f2111f4026bd89fd06ee7f0bae69e45c4d4b5" + }, + { + "path": "crates/oa-core/examples/release_dense_views.rs", + "bytes": 14664, + "sha256": "a83158488ef9b7394f136c52b1496719be935c4e5bdfe457cab5c9894f5f9412" + }, + { + "path": "crates/oa-core/examples/routing_workshop.rs", + "bytes": 17248, + "sha256": "571307b18b6d4fa04700c5a4d4b0c2154c419e93a21292b2028e7b6f46a2faa7" + }, + { + "path": "crates/oa-core/src/analysis_numeric.rs", + "bytes": 3735, + "sha256": "6c88eef3119162aeb6c07b9e75812c3af9fbfe75554b0503ad00f103cb478408" + }, + { + "path": "crates/oa-core/src/analysis_numeric/dimension.rs", + "bytes": 3045, + "sha256": "d4ad8e5307a1620e31791d724a0e31fdba860d00dc83e3e1f2209d9c5e22a340" + }, + { + "path": "crates/oa-core/src/analysis_numeric/exact.rs", + "bytes": 17338, + "sha256": "4eb8cb0f66b10e5da204899af82ee26adfec74bab47b1a6c9842b5488ee04c4d" + }, + { + "path": "crates/oa-core/src/analysis_numeric/fixtures/r7-literal-boundaries.json", + "bytes": 6085, + "sha256": "3b959dec5e100a6f03817f5314bef497347ba579ebd235476516d4bd83399181" + }, + { + "path": "crates/oa-core/src/analysis_numeric/meter.rs", + "bytes": 7129, + "sha256": "1f7174beb992935b4c399acdef91114af73faf041070feab968455ac827e8ee4" + }, + { + "path": "crates/oa-core/src/analysis_numeric/quantity.rs", + "bytes": 12257, + "sha256": "ead5142d6eeea8f99399d57e02d8f7d819980923de76387cd454694d6a747aee" + }, + { + "path": "crates/oa-core/src/analysis_numeric/tests.rs", + "bytes": 27486, + "sha256": "323ce82fc057d36f44463569fd8ea324c7d700fddfbf32bce15e04bd2a66970b" + }, + { + "path": "crates/oa-core/src/data.rs", + "bytes": 42696, + "sha256": "7f9c7c7dd8353cb5a38597b92cde6d3e890203d392473187eb387d41ff37414a" + }, + { + "path": "crates/oa-core/src/demo.rs", + "bytes": 20657, + "sha256": "ad62123f96c20ff023cafc1a9849b0fa06bc62edd1fb9701799e4599b458600c" + }, + { + "path": "crates/oa-core/src/language.rs", + "bytes": 99938, + "sha256": "638f08a42e9cf4996b5d07f69b4d6f517a518369f3604d25be1006e40e080765" + }, + { + "path": "crates/oa-core/src/language/semantic_source.rs", + "bytes": 7326, + "sha256": "584b5bb59d87a7b8d44d5dd2d124c3a1323b21492b138a17bc9526c0087c9e29" + }, + { + "path": "crates/oa-core/src/language_nesting_tests.rs", + "bytes": 20639, + "sha256": "bd061611e8cb6f28ab203c73e544ac98bf275eb464cd314ad5fbd25f773df33b" + }, + { + "path": "crates/oa-core/src/lib.rs", + "bytes": 549, + "sha256": "ea1d9bf5acba8381ba204db12ff5b5fe1f320417d17af517e46b90fd6bcb241c" + }, + { + "path": "crates/oa-core/src/migration_v2/README.md", + "bytes": 1515, + "sha256": "fb61d3faa33d7bdfba73415415a0882c0fbd3e0b45df42f972a19aec6da927b9" + }, + { + "path": "crates/oa-core/src/migration_v2/adapter.rs", + "bytes": 9490, + "sha256": "66741b4c8354a23b8a932ecc5bf1bc3bb6e74279558757b8c35bc2157a7e51b5" + }, + { + "path": "crates/oa-core/src/migration_v2/mod.rs", + "bytes": 1158, + "sha256": "857d8bb13b6814daba6780ca770c16352943c01cb130245d055f11b3b957b3e9" + }, + { + "path": "crates/oa-core/src/migration_v2/model.rs", + "bytes": 52059, + "sha256": "8ac63eb59b2e57bdecff2477ee0634096090924d3dd1851e1c454880a889dacb" + }, + { + "path": "crates/oa-core/src/migration_v2/references.rs", + "bytes": 13369, + "sha256": "33a6819abc83139fdaebeebd1b553238a328637106cce7dd5a535f1791d43e20" + }, + { + "path": "crates/oa-core/src/migration_v2/source.rs", + "bytes": 21946, + "sha256": "74fee9b24e7c912182c998ab9d9aeec125e2009c3214959229e844c67afe2bf6" + }, + { + "path": "crates/oa-core/src/migration_v2/state_validation.rs", + "bytes": 15769, + "sha256": "e29ef071bab0a68460ddf55c46131c6f66c022d52c3c602c37c013c3649da1b0" + }, + { + "path": "crates/oa-core/src/migration_v2/transitions.rs", + "bytes": 704, + "sha256": "f74174c532ba56b57c80b719a11fb4adea0a78ccc2828fff72fe2b9eda5a10b1" + }, + { + "path": "crates/oa-core/src/migration_v2/validation.rs", + "bytes": 98736, + "sha256": "6d5e4a4e2805ae5045bf789a0485e14a61c63346587bace2b4a91173a688f780" + }, + { + "path": "crates/oa-core/src/migration_v3/README.md", + "bytes": 2128, + "sha256": "3755a63f840d7f0eadf68afa7a9d587877a9468ff982d3610539e8a0bb067a82" + }, + { + "path": "crates/oa-core/src/migration_v3/mod.rs", + "bytes": 23023, + "sha256": "f4edb6a0b50ecfe8670973776d703047b064420cb1f05913129c00fc656b3722" + }, + { + "path": "crates/oa-core/src/migration_v4.rs", + "bytes": 4020, + "sha256": "50c652964f0f309e7f3f54b6ef12c40d42fcecc0490f005995c713df1179af70" + }, + { + "path": "crates/oa-core/src/model.rs", + "bytes": 66352, + "sha256": "4585c895c64c4a183941c92cf047a9e52ff0cbe41971e16e78d229ea9dc101fb" + }, + { + "path": "crates/oa-core/src/operations.rs", + "bytes": 11405, + "sha256": "a5ffbbf54cd440316a106d1188bfb699b57dae59f466edcb33618c333cd19f41" + }, + { + "path": "crates/oa-core/src/persistence.rs", + "bytes": 31774, + "sha256": "1c01474f906a63e552c0d590b272c95821c00a100b3e79e58e67dbbeac341a14" + }, + { + "path": "crates/oa-core/src/ports.rs", + "bytes": 45413, + "sha256": "5cac12eea70a54ebebbd6be77b63ce92e3195325c4bc7d27705c518686cbac80" + }, + { + "path": "crates/oa-core/src/projection.rs", + "bytes": 21374, + "sha256": "69ed12bace2cc5024e151752a174ab14034ac2d05eb741fcf13e9a27521c059b" + }, + { + "path": "crates/oa-core/src/projection/port_layout.rs", + "bytes": 13474, + "sha256": "a08d17d10a58bb8b206dd001b19b91d5aa3a9f743b298a4da57d503223c20079" + }, + { + "path": "crates/oa-core/src/projection/state.rs", + "bytes": 5233, + "sha256": "73a607bac713ec7ff49a509fefb1a53c7686dca93ee241ffc835564d743afb28" + }, + { + "path": "crates/oa-core/src/references.rs", + "bytes": 21957, + "sha256": "93553c234f32da35f1f41a7b83ad81c471c9803efa78ca222cf7de3c2f86c0bb" + }, + { + "path": "crates/oa-core/src/routing.rs", + "bytes": 50309, + "sha256": "c5ebb350ba76f731f5c48d968bfbba4b6ef68ec046eb5893d116c4637ef15080" + }, + { + "path": "crates/oa-core/src/semantic.rs", + "bytes": 540, + "sha256": "f9895dd5b8fb27d10d4cfbb41c3542ef2018365a589b8d5778e5674ae5a1f239" + }, + { + "path": "crates/oa-core/src/semantic/catalog.rs", + "bytes": 49407, + "sha256": "1ff74fcca18084d178681d7ff38ee1ccac632c27c4de0595ba1ceab8067ab3a4" + }, + { + "path": "crates/oa-core/src/semantic/historical.rs", + "bytes": 15271, + "sha256": "eaf3284bf234312698514cdb636bc8348e1b5d746cb16b18df777e77d312abfb" + }, + { + "path": "crates/oa-core/src/semantic/linked.rs", + "bytes": 6035, + "sha256": "6f335b14e809aecfc35defcaf77cb821b080d1506dbc46297912b25af98c07a2" + }, + { + "path": "crates/oa-core/src/semantic/mutate.rs", + "bytes": 22683, + "sha256": "dc2b4c4a6eb156fe468eaa8c85fd37a505c0cd8ea1f226cb69cd01689afd3d9d" + }, + { + "path": "crates/oa-core/src/semantic/review.rs", + "bytes": 51116, + "sha256": "0c157d2c327e72e89cca3b423e71ee73798105c5bb7271439c1a101642c91e3e" + }, + { + "path": "crates/oa-core/src/semantic/types.rs", + "bytes": 10405, + "sha256": "6922fe35089f12fad43ab0ce1c6886d01a3855f90b8e2543e99802ac5e6f1bbb" + }, + { + "path": "crates/oa-core/src/session.rs", + "bytes": 35237, + "sha256": "1eb77b329b2986fc6f5dc0171e77fd860375cdfd8c769a1367b445d6c49ebe00" + }, + { + "path": "crates/oa-core/src/source_files.rs", + "bytes": 74803, + "sha256": "669491dbddb8e8e6556161426dffa1a49ac1c826d31020bff0956d81a4d84683" + }, + { + "path": "crates/oa-core/src/source_project.rs", + "bytes": 61843, + "sha256": "1394370bcc5908873b830c2c11312e6e1611af41f46c4f43ca0a6bcb713bb466" + }, + { + "path": "crates/oa-core/src/source_project/source_migration.rs", + "bytes": 4700, + "sha256": "add463ae85c420f853d324b00a221f0f874164cc3f3ed6bbb07557a9ed7a8c95" + }, + { + "path": "crates/oa-core/src/source_project/source_structure.rs", + "bytes": 20225, + "sha256": "9f1f83315856a7025fe662c0fbb13452f31613224a03663150d6225d1ddc162f" + }, + { + "path": "crates/oa-core/src/state_validation.rs", + "bytes": 15665, + "sha256": "e28d7f74385e2a78763716b34491bd73a00bfeccc085970ceb130627e3faee18" + }, + { + "path": "crates/oa-core/src/topology_context.rs", + "bytes": 13734, + "sha256": "16de69b297de95d93c73808621607833b713af811dd082f0169186ae1e5c3e2d" + }, + { + "path": "crates/oa-core/src/topology_context/analysis.rs", + "bytes": 20036, + "sha256": "dead6194f0aa60cc46045c0e5ee10dbdbb689158c38634dfbbbc45d2ba88ac65" + }, + { + "path": "crates/oa-core/src/topology_context/analysis_tests.rs", + "bytes": 5258, + "sha256": "17839263410815e96fe027d4eba3aae0a9ab3b82b16947e2b29ebe0d09782b56" + }, + { + "path": "crates/oa-core/src/transitions.rs", + "bytes": 51998, + "sha256": "fadd1b07b89cae4117b91abb4f1ac9ea81ff818ef20f2175e76ee8cf21fb708d" + }, + { + "path": "crates/oa-core/src/transitions/communication.rs", + "bytes": 8634, + "sha256": "2b476630a88edd9021b9156ca12a5402e01604095f0d4002afb452671903a028" + }, + { + "path": "crates/oa-core/src/validation.rs", + "bytes": 112792, + "sha256": "7c1b4ae5e4ebba13e99af9158ccde138dfc5e9a7afb580e76fba72d0b64ba74e" + }, + { + "path": "crates/oa-core/src/validation/coverage.rs", + "bytes": 6478, + "sha256": "b08e4b344ecad055714168c83beff7fe29ba4edc53edbffa2eae04e5580a4d5f" + }, + { + "path": "crates/oa-core/src/view_options.rs", + "bytes": 24481, + "sha256": "421ede0a04c593ca1df0e6e0d06fabcfcc8113cdbcfb0adc7f5c8ef4d1724208" + }, + { + "path": "crates/oa-core/src/view_options_tests.rs", + "bytes": 21433, + "sha256": "64aac44de2df42a1012239a3dd75c473daf0c8990b3170b7bf7e78a556080208" + }, + { + "path": "crates/oa-core/tests/communication_boundary_scenarios.rs", + "bytes": 8816, + "sha256": "e1100b8f363910a487d90c73acc7df543dc6d532158c3c63ad11cd3d40d8e12b" + }, + { + "path": "crates/oa-core/tests/communication_means.rs", + "bytes": 18102, + "sha256": "a25f2749180bc6f4beb1445bfad3351eedf0669131a7439b633ab804439e95a4" + }, + { + "path": "crates/oa-core/tests/coverage_diagnostics.rs", + "bytes": 20527, + "sha256": "e2e9c3996daab47f2bd23f5d8c48b4e372af33331152f5fc85b76f06d04fcdf4" + }, + { + "path": "crates/oa-core/tests/fixtures/v2-coastal-rescue.arcadia", + "bytes": 29220, + "sha256": "f0df129c1914bfc01d0b047b0cd4b520d8cf0c249ea9ced085de400c0be87ff3" + }, + { + "path": "crates/oa-core/tests/fixtures/v2-coastal-rescue.json", + "bytes": 43990, + "sha256": "3ed53508eb544bbd788832f7bebea2ec31b3d66191f24f45098cc9750ec4c005" + }, + { + "path": "crates/oa-core/tests/fixtures/v3-data-contract.arcadia", + "bytes": 2450, + "sha256": "305f19d1b79f99f8d4cf627ba2e9ca6836bb7959cc0070227815937a699eafea" + }, + { + "path": "crates/oa-core/tests/fixtures/v3-data-contract.json", + "bytes": 8240, + "sha256": "1b41299c53204e6232397d25a58d5bccdbbc16e770c75e8edb55ce36ccfe58a2" + }, + { + "path": "crates/oa-core/tests/fixtures/v4-reviewed-prose.arcadia", + "bytes": 1222, + "sha256": "5fa53a26a5ad010c8e59eb56d9b2b52003569e66c0377ffb58840590168ad0c1" + }, + { + "path": "crates/oa-core/tests/fixtures/v4-reviewed-prose.json", + "bytes": 1734, + "sha256": "2808088afcc165f4bd6da5129151143411c997041c3de61d600ab76e05d24a47" + }, + { + "path": "crates/oa-core/tests/language.rs", + "bytes": 56482, + "sha256": "77f6cb2a69976bfb5f60b243b71c07fb0edc7505002c1e9e73fcd6ddf6d9496e" + }, + { + "path": "crates/oa-core/tests/port_anchors.rs", + "bytes": 26893, + "sha256": "efbc0fa18733b1aaac501f9785a4c392fc49c05c45a5778d26e9b5dd951ca6fa" + }, + { + "path": "crates/oa-core/tests/port_migration.rs", + "bytes": 15620, + "sha256": "1801c376a5435ac7efb2a8342348b2c7ffef930bba65deca4acb66b06e0483d7" + }, + { + "path": "crates/oa-core/tests/port_source.rs", + "bytes": 4858, + "sha256": "8d2ddaca4045d330f6eda2591561497b858aad53769a823249d0bea4f5916e12" + }, + { + "path": "crates/oa-core/tests/prepared_commands.rs", + "bytes": 9555, + "sha256": "52cab1c668064777412df0a6a3c20d74d579b33794b4b00525b9f151c06eac9b" + }, + { + "path": "crates/oa-core/tests/process_diagnostics.rs", + "bytes": 1104, + "sha256": "1dbbc590239ef7542be4a2bdc9543aaa64d108417b03dd312a0894e364745906" + }, + { + "path": "crates/oa-core/tests/r3_constructor_ack.rs", + "bytes": 24163, + "sha256": "e5c44676ea0aab97f2e091ddac2f4bc4a4a90f5877f7bbf08b61229600944dd0" + }, + { + "path": "crates/oa-core/tests/r3_migration.rs", + "bytes": 6590, + "sha256": "ebd04120f5215b3956fdc79ee78f6e38734c7d13392f1fc28aaba957912265bd" + }, + { + "path": "crates/oa-core/tests/r3_semantic.rs", + "bytes": 77473, + "sha256": "49c3763eaf2131070a7c46cc23a84f917d292d41610b6404510e5607f8890c32" + }, + { + "path": "crates/oa-core/tests/r3_source.rs", + "bytes": 15311, + "sha256": "f31f60659df3c7ef601650d1cff140589d8729f01a3f65a4a6a6c2272f15c408" + }, + { + "path": "crates/oa-core/tests/r6_data.rs", + "bytes": 41437, + "sha256": "5f7ffb3bc73c3c85423623fe56f8680646dc97040327bdbead9d47a37e80f155" + }, + { + "path": "crates/oa-core/tests/r6_migration.rs", + "bytes": 9174, + "sha256": "81519bc1512f5e069432e9a1cdad04c10216d492df01b4b75b02102480ebd6a1" + }, + { + "path": "crates/oa-core/tests/r6_source.rs", + "bytes": 9519, + "sha256": "88a0aa087a7678e2898ff6057538072ca92072190712f05fff08372cc56ebed6" + }, + { + "path": "crates/oa-core/tests/release1_teaching.rs", + "bytes": 10010, + "sha256": "be179290d871125dc97cfd2a3067c7ac89c8a538fdb0afafc5b825bcdfb2bef2" + }, + { + "path": "crates/oa-core/tests/release_capabilities.rs", + "bytes": 19422, + "sha256": "b92cba2a562e78287ddd7dc3e94557848d17faa0c8a102601b50286b9af48a30" + }, + { + "path": "crates/oa-core/tests/release_diagrams.rs", + "bytes": 7689, + "sha256": "cefcc0582d91266d5de6ee5daefcfe41b606ab971ab235b59034a8e1dbc24b7d" + }, + { + "path": "crates/oa-core/tests/release_language_limits.rs", + "bytes": 5204, + "sha256": "8578da4f76bbd2d0e1bfe295ab1259e2162a3fe3d0d2ba8901915d7a40942806" + }, + { + "path": "crates/oa-core/tests/release_ports.rs", + "bytes": 32740, + "sha256": "506e62beab0c7ec0cece83e9e0c1a810fa1f99285c9e1cab0c77f06de55a40e1" + }, + { + "path": "crates/oa-core/tests/release_routing.rs", + "bytes": 23165, + "sha256": "ae168faaba23769b7ca1fd65f217b9db671726e67276eb5a04e5e72b1447a462" + }, + { + "path": "crates/oa-core/tests/release_scenarios.rs", + "bytes": 41067, + "sha256": "0f5d876badeec653fc7b12610a77d867e9a53582e605253deff8d379da21572f" + }, + { + "path": "crates/oa-core/tests/release_states.rs", + "bytes": 26873, + "sha256": "b1a26acee95eaba7f9920f9da738a1e33606552eb078e6d298895daff7e3d811" + }, + { + "path": "crates/oa-core/tests/release_topology.rs", + "bytes": 17643, + "sha256": "c51dbe5aa5a038f9ed830daa02aa67714472179eb7fd6da5ce36dc6931c8b3a9" + }, + { + "path": "crates/oa-core/tests/review_regressions.rs", + "bytes": 21823, + "sha256": "f154e5c88d35e31512e2b07733a1327ea3e2fcfd1ef8eb23066a4e9573f387c1" + }, + { + "path": "crates/oa-core/tests/route_source.rs", + "bytes": 7270, + "sha256": "1a73fdbac0d0ae0e84d8d67b6ad398e11223958f5dca007f73757c91827decfb" + }, + { + "path": "crates/oa-core/tests/routing_geometry.rs", + "bytes": 31890, + "sha256": "2d8eea4a2bba535ed0ea6daabccdaf87b375828c404baa10518c7bd7fd6253d3" + }, + { + "path": "crates/oa-core/tests/routing_labels.rs", + "bytes": 5530, + "sha256": "dff884d799c3c5c9257210248c55767e294e3cb317c605cbd0ddc9600c216eb6" + }, + { + "path": "crates/oa-core/tests/semantic_artifact_absence_oracle.rs", + "bytes": 4640, + "sha256": "d93eaf9667f4221232168bef0fe9f069e5be1b1f23410bda5dd67010b96e5c8a" + }, + { + "path": "crates/oa-core/tests/semantic_attachments_gui_oracle.rs", + "bytes": 14957, + "sha256": "7f526d363ba05e7ac89faf0fead0796e419c34ee204edf44a1b46c78308b0970" + }, + { + "path": "crates/oa-core/tests/source6_view_contract.rs", + "bytes": 14307, + "sha256": "fa566de53946d40bbbd9033edfeed177180c4dc44afa2f2f4667ffdc622eb3bb" + }, + { + "path": "crates/oa-core/tests/source7_contract.rs", + "bytes": 43262, + "sha256": "cad4f1a135ddbd947bdf3c71d1b44f1e438725095ea8c4d893464bc721c2363f" + }, + { + "path": "crates/oa-core/tests/source_files.rs", + "bytes": 13168, + "sha256": "f0429a0b89a443458ea9af7083c1e4e7411417a7e6b47e618bfbb9266dc164f9" + }, + { + "path": "crates/oa-core/tests/source_identity_updates.rs", + "bytes": 5139, + "sha256": "f52aa38b4d317e532c641ad7463472e4b40e802e60052cf0017556ffc63da06c" + }, + { + "path": "crates/oa-core/tests/source_nested_updates.rs", + "bytes": 16892, + "sha256": "9ac3390936c0d250651ea94a1b8faf0adfb680f061ececc56f2a52909b5ba855" + }, + { + "path": "crates/oa-core/tests/source_project.rs", + "bytes": 45910, + "sha256": "cef58adb16aa4d2527ddc0628aec3e26f0b42b4be70014a7e360fafdac13a942" + }, + { + "path": "crates/oa-core/tests/state_diagrams.rs", + "bytes": 23973, + "sha256": "6b02b387a3ae559cb3ad72de24292a5abcb76aaac0adbab5d2aa5211b22cd2e5" + }, + { + "path": "crates/oa-core/tests/workflows.rs", + "bytes": 33426, + "sha256": "bd843dfddbd5724ec08f657571f887496203056fe2fa5864ef50a168a613b89b" + }, + { + "path": "crates/oa-desktop/Cargo.toml", + "bytes": 842, + "sha256": "f3547b2b924d5db6706c0a8e069014b440ff65315d82fc8aced0360af4b3cdc9" + }, + { + "path": "crates/oa-desktop/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-desktop/src/allocation_drag.rs", + "bytes": 29634, + "sha256": "6b93290627a8697dd529ecf12b6e99196a11783afff1ca7aaf75c6e2762f3d94" + }, + { + "path": "crates/oa-desktop/src/allocation_drag/tests.rs", + "bytes": 60311, + "sha256": "13b7d055a516c8a9f0bd13f03abe3b81423bde9d121c51778a129ff485f4f102" + }, + { + "path": "crates/oa-desktop/src/allocation_input.rs", + "bytes": 8391, + "sha256": "c7825c43383e81b7eb1b78bd902950c8a2206e0387d26002a80ddbe4dc2b6c73" + }, + { + "path": "crates/oa-desktop/src/app.rs", + "bytes": 220614, + "sha256": "99447bba4810135834663681447a03061a948db2661395b9b4c4924738a38f18" + }, + { + "path": "crates/oa-desktop/src/app/allocation_drag.rs", + "bytes": 24452, + "sha256": "218726dcd2e6809cb6f3660f575e586806360456e6b4fac61b9e361b411aeee9" + }, + { + "path": "crates/oa-desktop/src/app/allocation_drag_full_tree_tests.rs", + "bytes": 28288, + "sha256": "ff4c3d07f885f242b71160c09e2c457c4a746073fd89030781da306730c5db44" + }, + { + "path": "crates/oa-desktop/src/app/allocation_drag_tests.rs", + "bytes": 42677, + "sha256": "3c6908f8a677921245932252ab38806f16012becbbc082ac11e7871ff7bdeeb4" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring.rs", + "bytes": 27835, + "sha256": "37c7db33e99dd4adcc5a51f09ee4878af94fd32413359890a541690080885f65" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring/palette.rs", + "bytes": 8887, + "sha256": "8f9937cb30b48b83759fd084a8a5990a2daa3920280f1210abe048560241985a" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring/tests.rs", + "bytes": 14565, + "sha256": "174e184f1baf872c3be1cf70d9a7f4bc5569a9623000b3ab0e71e2b82e249cf5" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring_tests.rs", + "bytes": 18551, + "sha256": "ba913f7d7cbf586708d65c9f1db25b9b9ed7846f9d2e75a546b4ac69d8d19c6a" + }, + { + "path": "crates/oa-desktop/src/app/behavior_lifecycle_tests.rs", + "bytes": 13672, + "sha256": "f9a0b030faca5deaf3f55d9f5efcafdf1a7cb1a663001aa20a61baba4f92d080" + }, + { + "path": "crates/oa-desktop/src/app/behavior_removal_tests.rs", + "bytes": 23958, + "sha256": "ef09843a7daeb91afab0b76e83c5679351a1635a84a26d80a194dea744ea5874" + }, + { + "path": "crates/oa-desktop/src/app/checkpoints.rs", + "bytes": 29576, + "sha256": "55e5babdcabef767af3bc8be9cc3153b3f5cc0695701b890820ec0225643852e" + }, + { + "path": "crates/oa-desktop/src/app/diagram_focus_tests.rs", + "bytes": 6047, + "sha256": "65f3f841e1295ae4878b3ae2cf45ff64003d42e26e450e9a1de1c36dbd771bd8" + }, + { + "path": "crates/oa-desktop/src/app/diagram_removal.rs", + "bytes": 8778, + "sha256": "addb51604f41d680b06586bb362362ee3c2603a334f33022ce9abc281295ac85" + }, + { + "path": "crates/oa-desktop/src/app/diagram_removal_tests.rs", + "bytes": 47336, + "sha256": "70f9eb53d8995a23a53535b3941fc0c0b81a340f9fbbb371f0d705cfa775bd9e" + }, + { + "path": "crates/oa-desktop/src/app/diagram_selection_tests.rs", + "bytes": 5582, + "sha256": "4fa507adbc23db3a6eb202d809c695ec0ebd6181356930c4fa7528a9a0c7be57" + }, + { + "path": "crates/oa-desktop/src/app/hosted.rs", + "bytes": 25059, + "sha256": "2f7094c078e1d7cbccd6c0d310afa6c400a7e031f12918bbfce65ba62754e316" + }, + { + "path": "crates/oa-desktop/src/app/hosted/tests.rs", + "bytes": 30344, + "sha256": "fa118f64d04b400ccc01e4e67adaf3541975288882afa265a9e7f092cdbda232" + }, + { + "path": "crates/oa-desktop/src/app/process_canvas.rs", + "bytes": 31560, + "sha256": "7e05f4899a0b24df9ab355b6484e94997c7bc66c873342d975aed0b6a56acf04" + }, + { + "path": "crates/oa-desktop/src/app/reference_authoring.rs", + "bytes": 11250, + "sha256": "38e033e23e8135032f70117a376a5fe7bc68127c466559a35d7ec200932e3f77" + }, + { + "path": "crates/oa-desktop/src/app/reference_authoring/tests.rs", + "bytes": 20067, + "sha256": "b96ddc6bff7f8fde97720e18a92070f891c1340348d2e19c7c9c5a7bda650ce8" + }, + { + "path": "crates/oa-desktop/src/app/reference_authoring/tests/mounted.rs", + "bytes": 32805, + "sha256": "14a4914a1c86e50c395672dab8fe80d7af679a79c9082890b509fad7b7c543d9" + }, + { + "path": "crates/oa-desktop/src/app/repair_save_state_tests.rs", + "bytes": 10745, + "sha256": "5543dcba853bb1513acf824b860249729a6004747e7e320b46efe60ea19e2d83" + }, + { + "path": "crates/oa-desktop/src/app/review_navigation_tests.rs", + "bytes": 7049, + "sha256": "872fa91479dad5436e139ffcaece270323e9f5daeeb7a4d80c2c2534f48bc21b" + }, + { + "path": "crates/oa-desktop/src/app/save_as_tests.rs", + "bytes": 4113, + "sha256": "f8b915793f1a36fd152569c4781a4bdc17f4af404a8ceb373330053413087a1c" + }, + { + "path": "crates/oa-desktop/src/app/state_diagram.rs", + "bytes": 10050, + "sha256": "9ae3d533a20963a2bd1d485d357ac04319f336cd9f4c16305aa2a67d833573a8" + }, + { + "path": "crates/oa-desktop/src/app/state_diagram_tests.rs", + "bytes": 39957, + "sha256": "612e414b1a2cab12cbfd8fce23745559ff27577700694d53af67ad1f2883ee2c" + }, + { + "path": "crates/oa-desktop/src/app/transition_context_tests.rs", + "bytes": 11508, + "sha256": "47002fb025f3a2f8c53871f9509bfe8611a61db6fb0e1b3125eb6e875425cb1d" + }, + { + "path": "crates/oa-desktop/src/app/view_copy_tests.rs", + "bytes": 7846, + "sha256": "296821c51dcde568e7d717039aa26bfc1b56a9074aa16051007bb351b33a4d44" + }, + { + "path": "crates/oa-desktop/src/behavior.rs", + "bytes": 130523, + "sha256": "96c6e784640fd19a65c93346d21cb184ca721d7649812bd4c68a479391e38127" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace.rs", + "bytes": 7903, + "sha256": "b6e06b9d29f1a5677f99bebcb0e53a3795b4bcd957796a85fd800db4279aed03" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/control.rs", + "bytes": 7804, + "sha256": "2b8d97b8c0e3ff1b1a2c32187b1d0eb25edf39ba582b5fb3303bc880f674f7ba" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/focus.rs", + "bytes": 8901, + "sha256": "33447003980847033e40550f9926d8617fa61e2c3e73ec9c6121d1afed946c33" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/tests.rs", + "bytes": 27101, + "sha256": "b33361c6569354aa2df9b1ba1b60d68e4703800be80f815e0f0505064ea323c3" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/viewport.rs", + "bytes": 15164, + "sha256": "41ff9c50fa9fb89ab9fdb2d18dadc21585aafa1ee008cfcd1e0b731dce645eaf" + }, + { + "path": "crates/oa-desktop/src/behavior/contextual_source_tests.rs", + "bytes": 49518, + "sha256": "044bd412dc45ffe440b1e251993946942dc3759dcb2d5dfe71bd8d6ef61cbcc7" + }, + { + "path": "crates/oa-desktop/src/behavior/creation.rs", + "bytes": 28978, + "sha256": "33ae9aaf4ba90de9432870cc8e99708ef39e3638ae8283a9253c333785c91299" + }, + { + "path": "crates/oa-desktop/src/behavior/creation/app_tests.rs", + "bytes": 13181, + "sha256": "e9c5bf2b07357b7a2f679ae0d8f6904c1c1461aaeb94fa0db478b54d4641ae3e" + }, + { + "path": "crates/oa-desktop/src/behavior/creation/tests.rs", + "bytes": 22793, + "sha256": "a0d1daf9fb3920f7e6181a9802d84fbe056cbf0043b9e41dba5fdda687d9818a" + }, + { + "path": "crates/oa-desktop/src/behavior/form_session.rs", + "bytes": 3941, + "sha256": "f5027fb3a5a5599a182e7d1a10dba56dd66eb1f23a4ba4c4a1744c9a6a5b6e61" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario.rs", + "bytes": 154707, + "sha256": "ffac8821977488ecd1cd9084ad7c0c9fbf8de3d5031c5d4f5d033f0348d3e887" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/focus.rs", + "bytes": 9728, + "sha256": "73a9ea10ad7312086081b8688396a21ab4251c9faecc2df6d984b702f3963533" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/workspace.rs", + "bytes": 24960, + "sha256": "5aec4cb2ceb00ab25900d919a5bec71ab96848b4f14504f51790e3fe8801d3bc" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/workspace/tests.rs", + "bytes": 80542, + "sha256": "f2f6acd93ecf4e9ffee56abc1de28f71da8cb1353cdc3e67cf0c0cf7a619fec5" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_activation.rs", + "bytes": 14095, + "sha256": "77199dcb08ec8697f779d2560f6b716aed8d8f33965237a4934934954f4e805a" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_activation/tests.rs", + "bytes": 28464, + "sha256": "8b855dc067f1b15aed79c7eddf52c89001a8b961d9de4887f235c03b46264a1b" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_lifecycle.rs", + "bytes": 9324, + "sha256": "758d244c2e8de61f515d540baa4d967275f49720e0253c6c9159eb9acd71c859" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_lifecycle/tests.rs", + "bytes": 15430, + "sha256": "01b576993b329810cd78a859b45ac52c66f5a14549065661dd1308196e0b724d" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_operation_tests.rs", + "bytes": 10087, + "sha256": "89fb71c690e07eac314f7a5e05862d5c1e2f9c21039673bf22c4ac894d21c977" + }, + { + "path": "crates/oa-desktop/src/behavior/source_draft.rs", + "bytes": 18031, + "sha256": "08190823090bd8b0305809099abadcc0de431175f7044f1d5abdceda52612ee1" + }, + { + "path": "crates/oa-desktop/src/behavior/state_canvas.rs", + "bytes": 96098, + "sha256": "5844d2abf4a3fe3bb07c707865ee3f8303d213b0fe1871765ac468c11e140da7" + }, + { + "path": "crates/oa-desktop/src/behavior/state_edit.rs", + "bytes": 35843, + "sha256": "4e67321ab0cf88e6200061873086841244c4d610ddd5f88d70c69ac0cc6bf270" + }, + { + "path": "crates/oa-desktop/src/behavior/state_menu.rs", + "bytes": 8530, + "sha256": "9d0a3c29516efa79553c559274848f12101330dbf93ffbbefab398cbc1906790" + }, + { + "path": "crates/oa-desktop/src/behavior/state_view.rs", + "bytes": 7637, + "sha256": "3d01c853663385fc1b760401bbebe3f691fcc289a779a8e63cd0733ff0c8007f" + }, + { + "path": "crates/oa-desktop/src/behavior/states.rs", + "bytes": 26986, + "sha256": "8986ed9492960e20f1254e9dfe3ff91d79ce9fef66f3bda738f9933278043954" + }, + { + "path": "crates/oa-desktop/src/behavior/topology.rs", + "bytes": 84224, + "sha256": "66c81c4d4f2613263f13ae90cea61895c1aeed1f6278880789ec56f8c42433e0" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/contextual.rs", + "bytes": 28432, + "sha256": "5d0ac5b3e258fc70987a00ede1e603681d99746596f2fcc46ad2b3667d65203a" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/contextual_routing.rs", + "bytes": 16731, + "sha256": "d914b0e82aa8d253fe64be2ef74443d1fd2e6cec26d1cf30620a57646e1d426c" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/direct.rs", + "bytes": 39059, + "sha256": "5cca649870f54abdd2eb098954bcc0a2a5ca456b7ee11b5f653edbdf2ed55905" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/direct_tests.rs", + "bytes": 51170, + "sha256": "edccfe3ce8b224065a3540aa53c6340f13db0cecd48ecc0a3904cd832a483964" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/layout_tests.rs", + "bytes": 37846, + "sha256": "f27203866e22aee80daad2811113341684b0cbd59885b36d64243c4317f29f84" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/view.rs", + "bytes": 22009, + "sha256": "29e29c2a0667baa429ae44dbb400e67c86f24f88959d5e7dd22894473bdd1f09" + }, + { + "path": "crates/oa-desktop/src/connection_edit.rs", + "bytes": 5301, + "sha256": "020581e077f82b43c936b623cc51733b02b88428df4e5f25df74b9705819fa37" + }, + { + "path": "crates/oa-desktop/src/connection_tool.rs", + "bytes": 27023, + "sha256": "649da93677d52dae495b0e19bc32f3122ab05a6d84de8402578ff5ce3f6ee1d3" + }, + { + "path": "crates/oa-desktop/src/context_menu.rs", + "bytes": 52955, + "sha256": "629354b34dc232763700251f2695b4d4e53d6251c0b1432ecc0dfe424f7dfeac" + }, + { + "path": "crates/oa-desktop/src/data_values.rs", + "bytes": 23877, + "sha256": "e1deb1cad551f0a9fdef9653aad257cfb36e6d9c0f93b6245061ec3fab8fd365" + }, + { + "path": "crates/oa-desktop/src/data_view.rs", + "bytes": 38871, + "sha256": "158b852be5d3db450aa5cda8b68a35bd96bddce1d8d053a7a23582095c06362d" + }, + { + "path": "crates/oa-desktop/src/diagram.rs", + "bytes": 111242, + "sha256": "e5260a39e19fc3df19bd16898ff1f0abd60ede7584f595c035b5e86a12ecef93" + }, + { + "path": "crates/oa-desktop/src/diagram/focus.rs", + "bytes": 9197, + "sha256": "b88a7c43123b08cf6228d8e32257f6ed7fe361f7278f427ec138e233e1ea6ccf" + }, + { + "path": "crates/oa-desktop/src/diagram/lifecycle_tests.rs", + "bytes": 9342, + "sha256": "03dd13106f3fdd06a26699bfdfba006fad086a0711cad2ba1aeb09a4e8f8656e" + }, + { + "path": "crates/oa-desktop/src/diagram/pointer_tests.rs", + "bytes": 11859, + "sha256": "ae68e091032fe2cf71559ff7e671b3b6d657ee8279330345f0c7a57edfa472ef" + }, + { + "path": "crates/oa-desktop/src/diagram/port_hit_tests.rs", + "bytes": 5650, + "sha256": "c3728f127711cb6d7f80a4670a798808b6e4239dd29c273445de81706ab6f39e" + }, + { + "path": "crates/oa-desktop/src/diagram/port_labels.rs", + "bytes": 13574, + "sha256": "6643f0cbde7a59d4772ae5284a488083e3b81f2fefabc43619d75738f474646f" + }, + { + "path": "crates/oa-desktop/src/diagram/view_options_tests.rs", + "bytes": 2815, + "sha256": "cf0c98a7715558baf17b59f67a80556f98ad30262b4434635e617c6601775433" + }, + { + "path": "crates/oa-desktop/src/diagram/work_drag.rs", + "bytes": 7059, + "sha256": "9757534a7ba47dc0df5d41c8d7366b1d90f3d50b24344580ff3c783667bf66f0" + }, + { + "path": "crates/oa-desktop/src/document.rs", + "bytes": 31807, + "sha256": "7c87280b5b8d112c34865253f8ba0f80d43bc9897771943b15dc7b5608eb17a4" + }, + { + "path": "crates/oa-desktop/src/document_save_as_tests.rs", + "bytes": 5781, + "sha256": "83dc243a25f4e97674ff0d86c794a490cc923e98f1f9fb05bb038f622f11e20b" + }, + { + "path": "crates/oa-desktop/src/explorer.rs", + "bytes": 14764, + "sha256": "fa01c59219564ba9ae5553abc2b6f94e9849f9148d5812ef99b40318fe5dcf9a" + }, + { + "path": "crates/oa-desktop/src/explorer_view.rs", + "bytes": 13773, + "sha256": "a720d7484bcc3a24729332a00e005d1cc6f5f945a9cc3965134e0024dffb581f" + }, + { + "path": "crates/oa-desktop/src/forms.rs", + "bytes": 105544, + "sha256": "ea124f479fcd2d3978ac3cb8eb81fec4a7aae5e4f4414c4bdd54849e954dedf9" + }, + { + "path": "crates/oa-desktop/src/forms/context_fields.rs", + "bytes": 10831, + "sha256": "eaacd474f6500dd344d5a8b63ccb1d1dd86fe2aea78ab708afa8a80d62ce69bf" + }, + { + "path": "crates/oa-desktop/src/forms/data_fields.rs", + "bytes": 49285, + "sha256": "a540a0d451bff56a96b1d28643b2e8c0649f3846350c25c5b154729c0538e77c" + }, + { + "path": "crates/oa-desktop/src/forms/history_fields.rs", + "bytes": 27414, + "sha256": "e7100474cde18bdfe95562bcb3c055f29b4b15aa64788a578194464aebcd046e" + }, + { + "path": "crates/oa-desktop/src/forms/history_fields/tests.rs", + "bytes": 33950, + "sha256": "16d3c308138c063f45986d53c621ad83c7dc2ce853edd31b7204e2939a382df9" + }, + { + "path": "crates/oa-desktop/src/forms/port_fields.rs", + "bytes": 30554, + "sha256": "3fe684d651d5be6203fd9db3979c772913e1af5ac1514e67be386ffd88dc8127" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser.rs", + "bytes": 12130, + "sha256": "b60af363be333af048859e51c28e8c989cb5c95d696cad16c8eec15f78d57a12" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/adapter.rs", + "bytes": 10447, + "sha256": "87ab4bc3bf27fd4b5a458791cf62c7ba8e44e9ebf846d8b851b8b6ffb454cd64" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/tests.rs", + "bytes": 27835, + "sha256": "8e98f8a3fcb814d4a201cc85b3db87a689fd3d2ce487f8a2fe312fc296f93377" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/trigger.rs", + "bytes": 13336, + "sha256": "34d0acecfe6bed193970aa473cc3313984971264b86d7b362a6b84c23d013c0a" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/trigger/focus.rs", + "bytes": 9923, + "sha256": "f1e79f4b03b2f9fd1cdc335054d4ae177dc9e759b6ea3d334b2bcca39b57191b" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/widget.rs", + "bytes": 33804, + "sha256": "d66cc17af7a48bb8598be683f084bb08fa7af7304f9636f0a1bea94c5cf6c727" + }, + { + "path": "crates/oa-desktop/src/forms/view_fields.rs", + "bytes": 24987, + "sha256": "5184d438f0dfd4e29f284ff048e19da73e71be1f24a6e9f123c7e922aecb85fa" + }, + { + "path": "crates/oa-desktop/src/guide.rs", + "bytes": 118110, + "sha256": "ab4b47050e6d57dccdcc264ee5752766bd5013fccdc35eeeb9c9037bb5eb9a67" + }, + { + "path": "crates/oa-desktop/src/highlight.rs", + "bytes": 2751, + "sha256": "da7c254fff7052e5fd9ec7469f473b91a819406028d7c304f6e22c4169561600" + }, + { + "path": "crates/oa-desktop/src/home.rs", + "bytes": 17587, + "sha256": "f03c1071334894f586a5a7c86026602a694db3c2faf902822e1dbe5156a859c2" + }, + { + "path": "crates/oa-desktop/src/home/tests.rs", + "bytes": 8167, + "sha256": "3b03ccfc97dfb75954e1e0ed568bb87a632295c07b96cedc05ed381f87b378f3" + }, + { + "path": "crates/oa-desktop/src/hosted/client.rs", + "bytes": 21912, + "sha256": "54b24b4b50f8d87d7c92946ea5a2cff4c98760e70555b3ce3d90be27115e95d4" + }, + { + "path": "crates/oa-desktop/src/hosted/client_tests.rs", + "bytes": 23009, + "sha256": "3ef70907ca75e098d631c41b90badd4cff1e1eb1b3c78e15a9f811c13ba8ffbe" + }, + { + "path": "crates/oa-desktop/src/hosted/mod.rs", + "bytes": 3744, + "sha256": "1b75e11c80fcb38fd20bb3487e3f88729fdac73e471c5ae64da28c249f77c63b" + }, + { + "path": "crates/oa-desktop/src/hosted/view.rs", + "bytes": 9281, + "sha256": "fc0c7b7ce3a5f05c49713df6661067751f81e810af11c614ca265ea9490e6463" + }, + { + "path": "crates/oa-desktop/src/main.rs", + "bytes": 1554, + "sha256": "5228743f361f9239e4584780bfa9b65d36207d0288624e1fb42b721146bcff1c" + }, + { + "path": "crates/oa-desktop/src/model_menu.rs", + "bytes": 36340, + "sha256": "d2f836661f43fa1bc8830b1e51cc736948b3d261796c3fa877df02ae15568c4b" + }, + { + "path": "crates/oa-desktop/src/navigation.rs", + "bytes": 8839, + "sha256": "71355a12e1b4791106426d83fe5ebf0b29bce8e1dc594f0655ab85695469669e" + }, + { + "path": "crates/oa-desktop/src/port_edit.rs", + "bytes": 7809, + "sha256": "70b99f577c4fdeda8780c8dc1ee7b1639fd77aaca06658f06d725139fb3efb6d" + }, + { + "path": "crates/oa-desktop/src/port_preview.rs", + "bytes": 35855, + "sha256": "069487c4ece737d52e8ae4a84dcfb132236aca6799e841c91c8e7244320cf871" + }, + { + "path": "crates/oa-desktop/src/port_workflow.rs", + "bytes": 40582, + "sha256": "ccc15f97c3272145a67bb5857b4faeaf7437561bd61912fa27ab26e8824146a0" + }, + { + "path": "crates/oa-desktop/src/recovery.rs", + "bytes": 21041, + "sha256": "57e22e5fbb0e994e64ae03e69450271fe9f04a951db1670c2a018abe99db4489" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/README.md", + "bytes": 1587, + "sha256": "a90002df1e087d2dac7be26926864243568a0de7c4103e4927435b34178e8016" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/profiles.json", + "bytes": 473, + "sha256": "2c12ae96b50e6da5d60ce2b7fa00204be71dfbe2fd51311fc337a0de6a4332ff" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source5-bundle.json", + "bytes": 80974, + "sha256": "12715995e6f7f35414aea53b3ad720b9b31873ffdeaf4444231db1a5ac3c463e" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source5-model.json", + "bytes": 86191, + "sha256": "5535a706df9ec21715e8b6a5aa6dbd79636ae461450aee61305559016167612b" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source6-bundle.json", + "bytes": 85286, + "sha256": "ea88890a33f47d67dfb06d6dbbcc179058cf28dad76ae7d615c00aaf30dbbbfe" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source6-model.json", + "bytes": 90629, + "sha256": "5bb8db0b6394276666323483f977ac3586f88554c81a148c6d508fca0ef4576f" + }, + { + "path": "crates/oa-desktop/src/recovery/source5.rs", + "bytes": 6956, + "sha256": "0f0a763f0c98c2c908d4c2b95d8a4c042b6a255ee1cc16260e5404669691f642" + }, + { + "path": "crates/oa-desktop/src/recovery/source5_tests.rs", + "bytes": 12146, + "sha256": "cfd17a742f1f27b523fce7cd9309f0a07a30413395f6c58659fb91d02834a7a3" + }, + { + "path": "crates/oa-desktop/src/recovery/source7_tests.rs", + "bytes": 18213, + "sha256": "7ee61de66c75bf949489ba51ddc9677e2b4efc68801cf27909c9b894bfdc9288" + }, + { + "path": "crates/oa-desktop/src/route_edit.rs", + "bytes": 2941, + "sha256": "457ae59c2761a43a8620b4d336a7cf0f54b965997110ecaf968756a88b6b0374" + }, + { + "path": "crates/oa-desktop/src/semantic_review.rs", + "bytes": 3432, + "sha256": "8dd1e93783d63a663c7e56c28775a5c389cfd7a6b562013d6a95c891afa21ed8" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts.rs", + "bytes": 24201, + "sha256": "a79236a8150597ff808597e59cf4f1e9e61c74c4901d9c8cf42d3427bb52a9a8" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_recovery_falsifier_tests.rs", + "bytes": 11034, + "sha256": "3f255d04e4bffa5a467b75e3cbf6f7149aa3269a02f2a89fbaa1db0e5df9ae62" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_tests.rs", + "bytes": 20798, + "sha256": "04d0dd2ac453705185663f705282aa4a3a31433466a5be305764248da1a03c32" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_view.rs", + "bytes": 6447, + "sha256": "2100ff73565765d8293c84f6ce2d8e566610c1524c50e32ce3c37dc33b6686e4" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments.rs", + "bytes": 18160, + "sha256": "de0ec0c740895b160ff5b847332c087c3f1a48931583464069470cc61315ed59" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments_tests.rs", + "bytes": 29389, + "sha256": "8b26be0324e0f33b1e7cf7af340350df8ed98963002d6da8589ee0e6f6900bea" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments_view.rs", + "bytes": 3032, + "sha256": "932f231554d77c7cb119d33bb06b9879db5e12127aed187e67013e77b6458e78" + }, + { + "path": "crates/oa-desktop/src/semantic_review/batch.rs", + "bytes": 34485, + "sha256": "a462eb627ae19348072775cf8e60b17d62f6b682b74cc413906d493fba1f0b3c" + }, + { + "path": "crates/oa-desktop/src/semantic_review/batch_tests.rs", + "bytes": 27546, + "sha256": "b67c4d7dcabac710cf3d30730a8db323180a558a415e2d117c868cdfa4804619" + }, + { + "path": "crates/oa-desktop/src/semantic_review/compose.rs", + "bytes": 27155, + "sha256": "c6adcc9882dde65e9f04f6eda7f0c855c5cbb285cf421123029169112793ce9b" + }, + { + "path": "crates/oa-desktop/src/semantic_review/compose_diagnostic_tests.rs", + "bytes": 9809, + "sha256": "440daf8d43278ef981c620d1818d0daaed8fb83193b8e8ff67b2e42fbf882938" + }, + { + "path": "crates/oa-desktop/src/semantic_review/constructor_tests.rs", + "bytes": 54132, + "sha256": "85149521ad7df62918f6f2fab6da2b3346c342ab4bce7100de3f6206c1e81096" + }, + { + "path": "crates/oa-desktop/src/semantic_review/constructors.rs", + "bytes": 12258, + "sha256": "0982163439b06a42d9af1643530364109282e63f05b323a35a76d8241f3caa32" + }, + { + "path": "crates/oa-desktop/src/semantic_review/history.rs", + "bytes": 3211, + "sha256": "df038c2464eab8093a983f3104f0d04ca8f602010a50e1d3eeb8e53f2309e201" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed.rs", + "bytes": 14175, + "sha256": "bdd6c0fdc7108056bc5d7433254503449eed2209813680e717ead24b9d0ce834" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_rows.rs", + "bytes": 13222, + "sha256": "4b7bf25806471ad22d89253b9af8000f5acff53b4cc0aa1c1a83138e7b270eca" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_rows_tests.rs", + "bytes": 30804, + "sha256": "1a3b09e7ed100411cdf8043f9a78defc664a873ee0201117709185c201a5c57f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_tests.rs", + "bytes": 31163, + "sha256": "9dc9b989e5a9d408427ca1baf86b2454f9dd3baf40a551c70ca2359dc18a1227" + }, + { + "path": "crates/oa-desktop/src/semantic_review/message_kind.rs", + "bytes": 789, + "sha256": "4ed19952ea511d1b3226564a138e3322f994371d6b49794c14bc3689d1393e7f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/message_kind_tests.rs", + "bytes": 23424, + "sha256": "5fcf9930e949aebeb12eab0327264f32a2388d62dbf098bd2365711e22623c52" + }, + { + "path": "crates/oa-desktop/src/semantic_review/ordered.rs", + "bytes": 9705, + "sha256": "6a1ed894d1b9d0110bc784a75c49444f1d14f1f74620d701f22203b2d8d0a813" + }, + { + "path": "crates/oa-desktop/src/semantic_review/ordered_tests.rs", + "bytes": 22383, + "sha256": "5c8ea3a69e3da3b94d13f50f12aa7dc53246ccba25ffcace9552a0eb76b0bf36" + }, + { + "path": "crates/oa-desktop/src/semantic_review/recovery.rs", + "bytes": 28769, + "sha256": "88e69044d90c481593bab7cc125f0401c05202fccdde07698cec9483947fe8be" + }, + { + "path": "crates/oa-desktop/src/semantic_review/row.rs", + "bytes": 38159, + "sha256": "b08fdc503c6c4d2ff99adac7e18c9baa861bf86155e00b55d1e492430980d0f2" + }, + { + "path": "crates/oa-desktop/src/semantic_review/scalar.rs", + "bytes": 15153, + "sha256": "9ad202174934dd9a63fbf9cba43135aead571db60846c8b7b1d3019a11df26c2" + }, + { + "path": "crates/oa-desktop/src/semantic_review/source7_tests.rs", + "bytes": 11665, + "sha256": "5e8221d77b068fa30c1571988448cb8829711735881d810f3d333cbc95d34a9f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/tests.rs", + "bytes": 32480, + "sha256": "077ec6501dfaab0b05ea3987943b204f08352952296d313555051d998ccd232e" + }, + { + "path": "crates/oa-desktop/src/semantic_review/view.rs", + "bytes": 57626, + "sha256": "7cc7dd213ab01dadad5debaee868c30a1099466602869a799ebdf9b680e8eaf0" + }, + { + "path": "crates/oa-desktop/src/semantic_review/view_reserved_artifact_tests.rs", + "bytes": 4737, + "sha256": "6c766b29c8664d15cb113d2cc71bba9b60ae4ccf7e44c9c5d3c41e1dc4b7ed90" + }, + { + "path": "crates/oa-desktop/src/source_navigation.rs", + "bytes": 3938, + "sha256": "c1da10882f35f8eb0675e68c642c9a209dde09679cded414cfb9903a4e49ec77" + }, + { + "path": "crates/oa-desktop/src/source_tree.rs", + "bytes": 21816, + "sha256": "4d55e0110a1eb128a5d26c28f3aae5853d79b7245812b7c82bd275f38440a5aa" + }, + { + "path": "crates/oa-desktop/src/source_workspace.rs", + "bytes": 15522, + "sha256": "30f63a6b8d65a38d66061f90d864b5746cbacc0fbd65abc028a8f3071c47d358" + }, + { + "path": "crates/oa-desktop/src/style.rs", + "bytes": 3015, + "sha256": "05d61bec16141612ccafa0988e8c4827f41754509efdb3b961eab69127ded896" + }, + { + "path": "crates/oa-desktop/src/tests.rs", + "bytes": 58557, + "sha256": "b017218195eea2c96aba12eba8a99a38945c8ca910a652e272d34883bdb98691" + }, + { + "path": "crates/oa-desktop/src/view_copy.rs", + "bytes": 9043, + "sha256": "5630f31c942e1226aafd67eabdace6a5c5494875bdc6f7f077019e8110ba41a9" + }, + { + "path": "crates/oa-desktop/src/views.rs", + "bytes": 50668, + "sha256": "9b53126d19b2ae34f170a1422c9f5ea5a833489274cbfa04546279058e289f9b" + }, + { + "path": "crates/oa-desktop/src/views/traceability.rs", + "bytes": 7501, + "sha256": "4c89dcf35c25e737d8cce4d543a5989ca104a5678e6cf40df47e457773d2ef94" + }, + { + "path": "crates/oa-desktop/src/workflow.rs", + "bytes": 82963, + "sha256": "d9e7b11a86fd3ec79d91f0c9bc9cebd5a2043cdaa7261622454fb7730ad8e060" + }, + { + "path": "crates/oa-desktop/src/workflow/communication.rs", + "bytes": 11084, + "sha256": "34d121ad97706012722e4bb6210072ecc3a5b4718b0ceab0c3d0f14d4cd780a1" + }, + { + "path": "crates/oa-desktop/src/workflow/recovery.rs", + "bytes": 9859, + "sha256": "0849b0f34dba5e8761be5fa05784d134ac74e4e9db395d6b9b7d6cff71e3f3dc" + }, + { + "path": "crates/oa-desktop/src/workflow/transition_tests.rs", + "bytes": 8553, + "sha256": "589b1b2dbadca74a52c2cfcfd4fe620bd4790abd113ac02182e91616c52d793c" + }, + { + "path": "crates/oa-server/Cargo.toml", + "bytes": 778, + "sha256": "527ff5e15010a8b560a6659aa1ae4bf0c8df0d9e019f03c47529ec6a750c0982" + }, + { + "path": "crates/oa-server/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-server/src/error.rs", + "bytes": 5610, + "sha256": "93817f1502386e4662c96ee1c7d1c4afc4e33bda6fd64e46c86c8e1afd5a9368" + }, + { + "path": "crates/oa-server/src/lib.rs", + "bytes": 7743, + "sha256": "20bef350350ed6339588b23af684abf745f97916c7edf3853ee042abe687e664" + }, + { + "path": "crates/oa-server/src/main.rs", + "bytes": 4163, + "sha256": "d59a6a2b5c7034bd2e00a516d2d49abb16391bf0316c1c357ddafb9c82d2d1e3" + }, + { + "path": "crates/oa-server/src/preparation_http_tests.rs", + "bytes": 5523, + "sha256": "454b90d0055d35644c8d990cd7576ddf675a9b271ca07fe9b0efce25d8ddbc07" + }, + { + "path": "crates/oa-server/src/routes.rs", + "bytes": 46053, + "sha256": "3f9a0c22043dbf28f7a8e587d2fc3abf869f76f4d23a46fe0aeb9c4392454a4b" + }, + { + "path": "crates/oa-server/src/store.rs", + "bytes": 25524, + "sha256": "37dcfb845b7993d5bced2bcf25fedfcd2a9c20a748f9315afe6cca1f41f89ae5" + }, + { + "path": "crates/oa-server/src/store_preparation_gate.rs", + "bytes": 4440, + "sha256": "427c390da3c0281ba1fe115a93ea90800e3b45fce6bcb9185e71982ddd885fec" + }, + { + "path": "crates/oa-server/tests/http.rs", + "bytes": 71892, + "sha256": "50daa6a90e96ad6fe3c6a27df2eaebe486270599c203892d09769c547a194975" + }, + { + "path": "crates/oa-server/tests/http/communication_limits.rs", + "bytes": 5790, + "sha256": "ba5474dd8e494a0176fffb4548c8e3deb2081b15de33bfce82394c764e0a2c16" + }, + { + "path": "crates/oa-server/tests/http/data_contracts.rs", + "bytes": 25949, + "sha256": "8cd456db83f301baca380acf025a5a99db4edf7d8839537dfbd02c4307e10e6b" + }, + { + "path": "crates/oa-server/tests/http/port_anchors.rs", + "bytes": 15086, + "sha256": "7199d0a208ddad9e1518b6e3fb390d64da111716d7505ba5c995deae19ad1258" + }, + { + "path": "crates/oa-server/tests/http/semantic_transitions.rs", + "bytes": 22832, + "sha256": "856d1c9b633ffb581e3e631f4e5a607789a02181dbf060667f208a569bfa4920" + }, + { + "path": "crates/oa-server/tests/http/source6_views.rs", + "bytes": 13023, + "sha256": "867bccda0e030eeeb9976b4ceeb47b21ab5044d700278022d5fb495bbb64ca07" + }, + { + "path": "crates/oa-server/tests/http/source7_contracts.rs", + "bytes": 11000, + "sha256": "0e0a467186da7263c0754890aff69ebd0d92d36b5224e4865bb6854b18dab7e8" + }, + { + "path": "crates/oa-server/tests/http/source_projects.rs", + "bytes": 30907, + "sha256": "8ff580f317ec267d1cd72ae14d8638f74a77cdf99ca4c78f66f4290c2d77460a" + }, + { + "path": "crates/oa-server/tests/semantic_http_contract.py", + "bytes": 7251, + "sha256": "4737ff94f10761f94151a694414c5c62737e0391ec820bca132830652bc4cca2" + }, + { + "path": "crates/oa-server/tests/semantic_schema.py", + "bytes": 25111, + "sha256": "cacca116c42ffbc097f1419c0f89921fa0dfd3faa864d46820ff744cfe6967f9" + }, + { + "path": "crates/oa-server/tests/state_representation.rs", + "bytes": 12241, + "sha256": "6686c826f28248ae4b63ec3f2112e193d4a347724b87974483217fcfee49cd61" + }, + { + "path": "docs/acceptance.md", + "bytes": 3463, + "sha256": "32ed3e4fed63f5c464e0937221f401d71623b276dd70f083531ac6ccebbf9050" + }, + { + "path": "docs/api.html", + "bytes": 72515, + "sha256": "a06126cb741da57e9c06e83fc4137ccde0de05562673546bc9d405878f51ea07" + }, + { + "path": "docs/api.rst", + "bytes": 41929, + "sha256": "ca7d310138c3b4d429d80a1d03d1ac8d4a9296069e205da573034256d10438a7" + }, + { + "path": "docs/architecture.md", + "bytes": 10974, + "sha256": "a50bd1645222ef3e574fa07a6ab9aa213431ee8833c6c0158ad91ce0f799543c" + }, + { + "path": "docs/language.html", + "bytes": 175111, + "sha256": "67dcfa3477b48a0b07298ec81741840cc3ccff12c7d58164873d746d41d611c8" + }, + { + "path": "docs/language.rst", + "bytes": 134663, + "sha256": "12229dd7d52fbaba80fe599d499f29b535f4c37c7be0585664d17edf0466ba33" + }, + { + "path": "docs/linux-packaging.md", + "bytes": 8671, + "sha256": "41a1bb1095801df37a1411341c5791d55ea8c365739314d599a60269ac4bc7a0" + }, + { + "path": "docs/openapi.json", + "bytes": 346920, + "sha256": "bc5825a3182a4df5f6710a80262f4a09b4c15f0e4cda7ca74e1746ceca81a89b" + }, + { + "path": "docs/research-v2-architecture.md", + "bytes": 40445, + "sha256": "1b3809f2dabe6b1805dbf3d3f2625c471cd21356c7bd603916466a8c4ced8090" + }, + { + "path": "docs/research-v2-semantics.md", + "bytes": 31535, + "sha256": "b7ec3677300248926a88b84da3e7ffe52f5b73524c7712c927a0e951569db04f" + }, + { + "path": "docs/research-v2-service.md", + "bytes": 36209, + "sha256": "4828df5bc679e7c71f49b4b85c9e7dacbec52f46d416fed48af70e08886d4e4e" + }, + { + "path": "docs/research-v2-ui.md", + "bytes": 3245, + "sha256": "894e721b59a8ca85f0d95b6706ed5f130a0372def460cf33aeefc9e5e38cde0a" + }, + { + "path": "docs/scope.md", + "bytes": 16690, + "sha256": "a1d0cfbfc06fc8bc2bf0f71343aacc8853cbbbfc00a1fc9852ddf41c8245ffca" + }, + { + "path": "docs/server.md", + "bytes": 23361, + "sha256": "4eb24937d424ba8b384e1734e02a6f8e963ae11d2715889c92b14b39ff2e4a48" + }, + { + "path": "docs/source-cli.md", + "bytes": 3374, + "sha256": "34f12b72cc6d6ead4f47c7818c1897db592f8ad493c70776db2ab48c24d8f051" + }, + { + "path": "docs/v2-interface.md", + "bytes": 11807, + "sha256": "c7fbaf0ebd3fc9f6c11f818db2b0b9d68a33f580cfced22bde83ce08ae790bc7" + }, + { + "path": "docs/validation.md", + "bytes": 6505, + "sha256": "f46ea950ed1a54409aa07c4f9e90f39f8e2d00c1dd1b6cb805caa3993845967f" + }, + { + "path": "docs/windows-packaging.md", + "bytes": 10406, + "sha256": "2c852ff7041713ffbff3c951ac98df647c51fb70b0feba9000f7bfd5bc2703a8" + }, + { + "path": "examples/coastal-rescue.arcadia", + "bytes": 33107, + "sha256": "7e183ef9fd8154d3074303f1956cd0d9871c19e3ffc630d333b0bffbd6e30e17" + }, + { + "path": "examples/coastal-rescue.json", + "bytes": 49715, + "sha256": "242f0b031229a87af5c4ebe5d651defe59c191a6b7a69dc0a77f7e203411f195" + }, + { + "path": "examples/legacy-v1-coastal-rescue.arcadia", + "bytes": 3449, + "sha256": "4dbbbdf8bc7e6cb8e0a81dd678069dae585a9e5187c59bc3665e1fdab3f1a86a" + }, + { + "path": "examples/legacy-v1-coastal-rescue.oa.json", + "bytes": 5976, + "sha256": "fd0e9dedfb7adb922dc0575cc2b820d40344d639f1d8052bd70363aa59de9c24" + }, + { + "path": "examples/release1/README.md", + "bytes": 11137, + "sha256": "113cfb1cf38a98b51bff60442d86a35d636a3d80ef206bece7d53d0aae67f2d5" + }, + { + "path": "examples/release1/evidence/repair-check.md", + "bytes": 1419, + "sha256": "f4db17bdca4ecbb1bf0caef01b2da5f1f7f798ab3152b648ce6dd8696a6a68e5" + }, + { + "path": "examples/release1/expected-diagnostics.json", + "bytes": 288, + "sha256": "3700393d76b940cfc076bf52861bd7b1f43370f8eabce3594531bd0bf1fc851e" + }, + { + "path": "examples/release1/model.json", + "bytes": 134520, + "sha256": "ef0ef4006c3e09d5db6e1b621256b3f7d6642f3a7b09cc34607cfbcca830c727" + }, + { + "path": "examples/release1/model.rs", + "bytes": 28762, + "sha256": "15f30f6bde655808fe754665c26d560e36f2a9bad340f346b09137d0d05045f5" + }, + { + "path": "examples/release1/oa/activities/activity_oa_restore_work.arcadia", + "bytes": 1307, + "sha256": "83e73d0a013d5c3e1a4af0d9139ab0cfa362d25a846671fc2dac59181061a9d4" + }, + { + "path": "examples/release1/oa/behavior/process_oa_assessment_procedure.arcadia", + "bytes": 697, + "sha256": "172c32c044ef4b5bc58a1f4635cc81f48dabb4014479b47dce7b25fedf2dbd0d" + }, + { + "path": "examples/release1/oa/behavior/process_oa_field_procedure.arcadia", + "bytes": 1781, + "sha256": "d2552dc5383e2e91cb302a790364e197f663c2edc013a2ab1978789825c9c324" + }, + { + "path": "examples/release1/oa/behavior/process_oa_response.arcadia", + "bytes": 3225, + "sha256": "cf86f46fa5c5d70592ef43f1bc1cb4d968efd8add384ba88036bef6b88aa4abc" + }, + { + "path": "examples/release1/oa/behavior/scenario_oa_conversation.arcadia", + "bytes": 1795, + "sha256": "b25be524e98a35ebac5e4481b7609c027b32baf9605e8097f807560f94a77ca6" + }, + { + "path": "examples/release1/oa/behavior/scenario_oa_full_scenario.arcadia", + "bytes": 1261, + "sha256": "00a1edf2c9707a0eb62ac070c2d02467874f2c9c1f273cc6ddb53d6d65999a1c" + }, + { + "path": "examples/release1/oa/behavior/state_machine_oa_monitor.arcadia", + "bytes": 2022, + "sha256": "447c9ad1359f4a31ecf975ad07c0b08d8e7e03191fb0858e2fc56f377b223cd5" + }, + { + "path": "examples/release1/oa/capabilities.arcadia", + "bytes": 781, + "sha256": "fc8012e5554350b12e1cb80080f8feab80d933c9b33c0f2a7bb500cb7d609936" + }, + { + "path": "examples/release1/oa/model.arcadia", + "bytes": 661, + "sha256": "f7cf914766ea73ec53b85e32d117ea9a9dba52d3e038246863541ae7069b1a15" + }, + { + "path": "examples/release1/oa/participants.arcadia", + "bytes": 1834, + "sha256": "951764c14179f27c10e315acf2ea37d1fff54c77b8441e23addd239e8c715ce3" + }, + { + "path": "examples/release1/oa/types.arcadia", + "bytes": 788, + "sha256": "9d0396fb82dd5733edd8d1cf52f968ca84906927c704f9cf0944a7fae215cf49" + }, + { + "path": "examples/release1/project.arcadia", + "bytes": 1958, + "sha256": "b2674e6bf77cfe0f6f0ba79c81d2e96d92f39c02ca2c6266d80e91723bfb9fda" + }, + { + "path": "examples/release1/sa/behavior/process_sa_assessment_procedure.arcadia", + "bytes": 706, + "sha256": "73928ced61c06cbc08728d7956676a50fd4c05aa5b7f1ff4f29ce27a0b0f2088" + }, + { + "path": "examples/release1/sa/behavior/process_sa_field_procedure.arcadia", + "bytes": 1790, + "sha256": "886d462af83110cbfa55dd232a667ea1446761234471357cbb878794e98e8768" + }, + { + "path": "examples/release1/sa/behavior/process_sa_response.arcadia", + "bytes": 3234, + "sha256": "041785fc22842423822431bd5e6e8d16094ebd0716965e7c765fb8c1d7549e8a" + }, + { + "path": "examples/release1/sa/behavior/scenario_sa_conversation.arcadia", + "bytes": 2127, + "sha256": "97276f5757ee9aa12a0dbd9d3ccd58174b3091162bb8bcce357cec20a45f5d85" + }, + { + "path": "examples/release1/sa/behavior/scenario_sa_full_scenario.arcadia", + "bytes": 1256, + "sha256": "e12fc406b99d60a2f7768aaa0b25ba560e8605f0b8e37f3a7cdd3b8443562b74" + }, + { + "path": "examples/release1/sa/behavior/state_machine_sa_monitor.arcadia", + "bytes": 2022, + "sha256": "05ce29af99424c491c47fe2450dc6f5f8ce995511c01ec7e17bb5855be3c9736" + }, + { + "path": "examples/release1/sa/capabilities.arcadia", + "bytes": 781, + "sha256": "b6912fb3ece439912345fa71724acd462e716a1e5a88203a1058a5c3b2c20a4f" + }, + { + "path": "examples/release1/sa/functions/function_sa_audit_thresholds.arcadia", + "bytes": 297, + "sha256": "e5a04325d52183956dca814dd90f4e56c96c6b7db0f4f202f203ecb49c3e0f4f" + }, + { + "path": "examples/release1/sa/functions/function_sa_restore_work.arcadia", + "bytes": 2576, + "sha256": "fddeb67308051325041fee641fe758ddf43345b7c47b66d433616ad07fdccdd6" + }, + { + "path": "examples/release1/sa/model.arcadia", + "bytes": 661, + "sha256": "d431509251acb859fbb98733b6d18add952495e10a78703fbe8f31e40bc083c4" + }, + { + "path": "examples/release1/sa/participants.arcadia", + "bytes": 4012, + "sha256": "780d2eb08b217b67b55febb3d34846f727b8ee9018df6c5741748647e36b2ff8" + }, + { + "path": "examples/release1/sa/types.arcadia", + "bytes": 1227, + "sha256": "101fc0fbd99f1101514aa7b6da4f8e535aae0bb94c9e2b9e7e6c151135b28660" + }, + { + "path": "examples/release1/traceability.arcadia", + "bytes": 29506, + "sha256": "48a96f543456c9b5a5798fc795594e4119147fe45f11a6f109f141b7f514560f" + }, + { + "path": "examples/release1/transition-before.json", + "bytes": 35801, + "sha256": "2253e6434f741687e22327c37d520ed15c043bc36025498650bc2366bb6a874d" + }, + { + "path": "examples/release1/transition-request.json", + "bytes": 4276, + "sha256": "43b9a22e5f95ad3bc0ebd2478ead0e14406854abc989ae94ded9367b013d812a" + }, + { + "path": "examples/release1/views/diagram_oa_allocation_view.arcadia", + "bytes": 2176, + "sha256": "dfc0eb61e0e2aa5bda45524571fbfa3494f44ce19696f3e15e07438074a07bc7" + }, + { + "path": "examples/release1/views/diagram_sa_allocation_view.arcadia", + "bytes": 2173, + "sha256": "b78b43a26a82efb8fbd5374b09c329fa341f57b29f635d397b9ef8aede71d389" + }, + { + "path": "examples/release1/views/diagram_sa_capability_view.arcadia", + "bytes": 1620, + "sha256": "75e8dc9fb30f25d6f8fd3c6b595593ab4f98958a25798f961e336e0fac557649" + }, + { + "path": "examples/release1/views/diagram_sa_service_view.arcadia", + "bytes": 2209, + "sha256": "b08c84f3ea633e7c78dfdad3272f75415f6256cf3614b6d99bfd4f0269076c9b" + }, + { + "path": "examples/release1/views/diagram_sa_state_view.arcadia", + "bytes": 1931, + "sha256": "5f42f4c605e57b817d8400ed21f2b14bfc4e1592aebe941ff113767504c2b869" + }, + { + "path": "examples/routing-workshop.arcadia", + "bytes": 66431, + "sha256": "dc6b75da72884d399132ed9e300fa5a26b73d802bb526c9af986ae9eeb0a646a" + }, + { + "path": "examples/routing-workshop.json", + "bytes": 100281, + "sha256": "8592714f75b271133f21ce017d87896b6cf91ea0e4837f1c2ed453e21be26b14" + }, + { + "path": "examples/source-project/oa.arcadia", + "bytes": 2142, + "sha256": "5f60642f211b2d352a951092faeeb7503d4fb7f6f7fca99e810347231101d31c" + }, + { + "path": "examples/source-project/project.arcadia", + "bytes": 606, + "sha256": "787f6b67b179ffd221f7e5faf1a4edd74cfd116aa1e3b5e9ed9f22fbff612d8d" + }, + { + "path": "examples/source-project/sa/assurance.arcadia", + "bytes": 682, + "sha256": "ab76044836e4dcd42a82d316846ec87da2108939aa2037640c5bca1d2ecdee0f" + }, + { + "path": "examples/source-project/sa/participants.arcadia", + "bytes": 1231, + "sha256": "1abad579812e77877b45a3d8e3c3e9da734be2d04a0254cc730a5257ebd2dc88" + }, + { + "path": "examples/source-project/sa/reporting.arcadia", + "bytes": 2839, + "sha256": "f0b7443f728912ca163de39b6055876b533a77feaa3219b2d40a2dd65712e058" + }, + { + "path": "examples/source-project/views.arcadia", + "bytes": 3508, + "sha256": "e29ad3f406a6a50d2f0ae2ca2a53ee3b0c18222cd4098704a46d4f48b64ea17f" + }, + { + "path": "examples/text-first/README.md", + "bytes": 1367, + "sha256": "4ec8250d5ed556f1d496e8c85137e973e802ecb11df1a36488411e8cdc5a9f9e" + }, + { + "path": "examples/text-first/project.arcadia", + "bytes": 480, + "sha256": "f441535c623e0cf20e1875eb2cd33b587ed00e078c37af39cb36d89bb5edc19a" + }, + { + "path": "harness/fixtures/basic-editing/README.md", + "bytes": 12012, + "sha256": "3545d9695e7c62e0caa818efd7f4dc426f04876a3626e0f3b1bad606b258cb26" + }, + { + "path": "harness/fixtures/basic-editing/base/expected-baseline.json", + "bytes": 4524, + "sha256": "f239e728d650b0af32bb8f3dcaf6b27c99b9c5041132ac14e51756ea6563d978" + }, + { + "path": "harness/fixtures/basic-editing/base/project.arcadia", + "bytes": 3077, + "sha256": "045cb047d7bfbca72c3fb30db4c81a30ad463d3af7fc51604906ad7fa75a1ff8" + }, + { + "path": "harness/fixtures/basic-editing/base/rationale.arcadia", + "bytes": 57, + "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f" + }, + { + "path": "harness/fixtures/basic-editing/manifest.json", + "bytes": 447, + "sha256": "d23c21b02064ddb85e051e10e16ff089daba8d9910bb1a695dfabe2db3757734" + }, + { + "path": "harness/fixtures/behavior-creation/README.md", + "bytes": 5954, + "sha256": "9e5fc751424d12cfe76a84abb1da45b2d38947409179451bb90ffe7e7ddc8723" + }, + { + "path": "harness/fixtures/interface-operation-probe/README.md", + "bytes": 2604, + "sha256": "088f0bdb3375deb8f2c7e3b749ca8d210ea828ca4dece69b3871b674e3110175" + }, + { + "path": "harness/fixtures/interface-operation-probe/hashes.json", + "bytes": 977, + "sha256": "f6d3e8aa42f40f64ce2ecba7b9cf112eb9091f3cccde3a592b0434e834cf2a6a" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/after-reset-deletion.arcadia", + "bytes": 4218, + "sha256": "c0fe9570684c0061efc4cad65e339fede6961b04ca90c6f324c787bd65e61226" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/after-reset-deletion.json", + "bytes": 7835, + "sha256": "93187f7a1b476a44185725c6b15f2e1767482b6911ab1280144348d033eb51f0" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/boundary-only.arcadia", + "bytes": 4771, + "sha256": "02f85e39957ebe6d56336fa729a5c8b10f51865face9d3b2c9679200571fcfc7" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/boundary-only.json", + "bytes": 8840, + "sha256": "756f9710336e6734ce3592ca774c6f104bba5a37c9e165540eb39326682393d1" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/explicit-functional-refinement.arcadia", + "bytes": 8635, + "sha256": "ac5b629ba5596464f9f8a975b8bc2764e3007ceb7342de3f828d4b18e4f069b7" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/explicit-functional-refinement.json", + "bytes": 16160, + "sha256": "78a47c978dc667aa1c45af711f06aa2a0d3c581003013e30c3e02fb0faae2e64" + }, + { + "path": "harness/fixtures/interface-operation-probe/probe.rs", + "bytes": 11274, + "sha256": "72b1b443e25eb20420dec4477b0fb5ef5d1c705e3882c81df88dd578ab96a426" + }, + { + "path": "harness/fixtures/release1-native/README.md", + "bytes": 2564, + "sha256": "5f5ba040fd2df9261a29bcab3f9a7ae27c3683265411ad3dda0b467d5df8590e" + }, + { + "path": "harness/fixtures/release1-native/artifacts/README.md", + "bytes": 4155, + "sha256": "24200c84ccc2ef3e17c029744074e5cea785188f5549ac54e44cf89682643f81" + }, + { + "path": "harness/fixtures/release1-native/artifacts/generate-semantic-artifacts.rs", + "bytes": 9275, + "sha256": "444f360b78df52c5e42046f77b148781e0c9bddc2a09c0b7bd65c7a4f376cfe6" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.after.arcadia", + "bytes": 7768, + "sha256": "84b22e95c213018612e6e8a84cad68b35a8b495ff3515b0f978c5e7a3d196d79" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.after.json", + "bytes": 7330, + "sha256": "13a6f99ec2df1dd35ee8b2613f183918cd9537eda4a5da085ad52e65c033db59" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.arcadia", + "bytes": 1446, + "sha256": "1e0d662ba33071b122ad9206d2d559a8e748c9431eb3ac1b759bde3760ca877c" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.json", + "bytes": 2216, + "sha256": "fa6a2e3643c0f909b92407abec3edc897033162eeaa501f8d4616f79d41fa044" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.manifest.json", + "bytes": 567, + "sha256": "65cb70b0d697a055363ba01bf30bed7e412d43c9978a033549c378d117719ae7" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.request.json", + "bytes": 3991, + "sha256": "ed905267263e7f8a0cd2dbe833196b30118b6a246815216932fae661ad650699" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.after.arcadia", + "bytes": 6837, + "sha256": "e50fc462ec22dbf98011929931dd2489430001c3e6433608685b9d88bceb9acb" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.after.json", + "bytes": 6433, + "sha256": "f27a7b38d59c7cefe58cb36783d3d4dd8d8ae1168d9aed1eb61d343c18758908" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.arcadia", + "bytes": 1807, + "sha256": "eba2aec39e6efb405eace4bc8ab0c5563907c26d449e71a4aa750df9f73233b4" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.json", + "bytes": 2673, + "sha256": "2ef777f19b94f08b5e5ca2ef727777897e1018f1426eee291408b3c69101f596" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.manifest.json", + "bytes": 519, + "sha256": "3af7232ed3056ca84dcaf0f266ead3faaa512a0dc0051c7ba68791c20dbae0cf" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.request.json", + "bytes": 1246, + "sha256": "8af21b00b62e620256fbf50e47c6c5836cdb6922d9549cc4b3d86bc03b008073" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.after.arcadia", + "bytes": 4200, + "sha256": "20bb30473830e44228958e78fb7480269cdcc0580c6c90c718da75f34ca5a43f" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.after.json", + "bytes": 4552, + "sha256": "44f4b05db49758dcf344788f57cecc0250fd029099b1c54e4e1e3e972f6cf039" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.arcadia", + "bytes": 1808, + "sha256": "b0fd031671c9f755756922ec5c40a0ce3f40164d22c3c389aec9fd0705344da7" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.json", + "bytes": 2673, + "sha256": "1acf81e08c51c85aceb14a3efbc39ec680552a19c7824aab4611ac3cf71b9c6d" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.manifest.json", + "bytes": 610, + "sha256": "a07978f4b0a3ca83e5ae5f35e7b66b26473b24431fc90e5889d755f1816d52dd" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.request.json", + "bytes": 2352, + "sha256": "5ff844a038b0030adb5a83d13d81e60f30627543388f6199b6a0e026fc42ea58" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-native.md", + "bytes": 4075, + "sha256": "a51ffbc45b6c172cbfed3b16c249296e6a28d457fea57393dd958cdcfbafbca1" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts.hashes.json", + "bytes": 2367, + "sha256": "3ad8b7428b3ed7585a91e7f5d9d5f4880caccfd0b08dca25d05af523e62e0a10" + }, + { + "path": "harness/fixtures/release1-native/communication-means/README.md", + "bytes": 15091, + "sha256": "015c16010c212af283f9def118c6d263ba65a3bc6e81a750f180624ca69bb311" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/entry.arcadia", + "bytes": 6098, + "sha256": "a6976e7c21031e7cc3cb731e20c3075cf89cf85144dc8d3f52930f8521ea196f" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/expected.json", + "bytes": 10480, + "sha256": "60c4419415c546f06c9972ac7bb0e530ada7b30a200b59e75ddda231a24f9a3d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/traceability.arcadia", + "bytes": 407, + "sha256": "3c41459f2b0706a767988738bf8126f76540415bb5940d9c5db19cbe8c18182d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.request.json", + "bytes": 1331, + "sha256": "b16e673b29c96b5aed681389ff7669110abe552939e86dd0ec6011c9a45ed860" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-draw.arcadia", + "bytes": 5239, + "sha256": "a511a4d817d9c5c80233bce83e84a7056b7dce7afd9fcc25696e333f8f4df055" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-draw.json", + "bytes": 8424, + "sha256": "7140114926228b1c378c450535f7a70992c71a879a8d2270c49e8d5f04a2f484" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/entry.arcadia", + "bytes": 5710, + "sha256": "910e6dfe609467047ce629ec9c626f4e927cada74bfbfa164414a8fe6783ea87" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/expected.json", + "bytes": 9868, + "sha256": "567259e20c9f6278776e8fa99b8b2fdbbc9a883ad875c5d39dae1b53de3a2924" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/traceability.arcadia", + "bytes": 407, + "sha256": "997f72fe9258012df66e88344cf39c1a2cebf2327f604056b67f7f2a8ebcfbfa" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.request.json", + "bytes": 1127, + "sha256": "cb3fe05859cfffec6f8846c19983dc462413bc0ea4f6e19204f09c259919c4b1" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/cm-reverse-scenario.arcadia", + "bytes": 8209, + "sha256": "ec826b9b84616507490ac30e4d57100dd6338dba2f7071e879a8fb58820a85c5" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/expected.json", + "bytes": 19735, + "sha256": "ef07e4d2d3fc36004ff01739838281581d9a703c747611eacc01bb9cc672489f" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/oa/behavior/scenario_oa_cm_200.arcadia", + "bytes": 1488, + "sha256": "0ec8d7e38f5a5cd56ccf3979757b3a9f412ad0ae36ee6c2690b7872129046d70" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/request.json", + "bytes": 1090, + "sha256": "c0ac99ee186d126fe3ec57f2c0a4072984d39d36ad21ead357ab66a08ac0065c" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/traceability.arcadia", + "bytes": 2068, + "sha256": "dd5d356390089e4ec474374956f6219502733987e60ef8ff32920d8b33dce858" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/entry.arcadia", + "bytes": 9827, + "sha256": "86dd8a355f6c9dadfea56d06e5247c9b0f820819d7df17ef5690671c7c81324b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/expected.json", + "bytes": 21877, + "sha256": "980489ec2c483d4f9efada61358c1f29bafb2572fd5b804c656b91b8e9bb4f9a" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/oa/behavior/scenario_oa_cm_200.arcadia", + "bytes": 1488, + "sha256": "0ec8d7e38f5a5cd56ccf3979757b3a9f412ad0ae36ee6c2690b7872129046d70" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/traceability.arcadia", + "bytes": 2068, + "sha256": "dd5d356390089e4ec474374956f6219502733987e60ef8ff32920d8b33dce858" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.arcadia", + "bytes": 7698, + "sha256": "1abc4c4cac37cfb06ed3b12a115f9e7e6a2d3affd34b25c355309e5ee465fa40" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.json", + "bytes": 13130, + "sha256": "a5cf4cb2ef390113dd752f4054d43fb789da2ca77799efb5782805ae8aa2dfd5" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.request.json", + "bytes": 1090, + "sha256": "c0ac99ee186d126fe3ec57f2c0a4072984d39d36ad21ead357ab66a08ac0065c" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-transition-ready.arcadia", + "bytes": 5454, + "sha256": "b761c4c2af5f7064aaf1f887ffd6094eb6ae834b2c8057ecdbc4aa97c042066b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-transition-ready.json", + "bytes": 8852, + "sha256": "2536b000de361fb131787e32b466b9123d4e98abf00c099ad32f6cb8e7fb530b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/generate-communication-means.rs", + "bytes": 28035, + "sha256": "003521404b702332082e01f2be7676fda1dd7b5bcf220bb81d25120c8984c75d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/hashes.json", + "bytes": 3133, + "sha256": "39b4dc02fc8b074015c59354fd1c1061c25832fde25065c7151f36eb0455e6f6" + }, + { + "path": "harness/fixtures/release1-native/communication-means/manifest.json", + "bytes": 1237, + "sha256": "fb921f42f2c4a4f8a67d1266f17f8c7750b6a2619554b713aa92b17918f0c43e" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40-oracle.json", + "bytes": 26264, + "sha256": "74edca148583f42c269e51f135662f65ef1c9ea1c94516d63e2a5091967dc99b" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40.arcadia", + "bytes": 28947, + "sha256": "00b87736b82c5afd33b311df7aebe9a6c8c51b6de66221181b5ea8bc8ca221a3" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40.json", + "bytes": 54938, + "sha256": "5dd4f22453330cab3abc059881660190e689a22619853f77cf6d0b52735d97ad" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments-native.md", + "bytes": 2624, + "sha256": "28906924b05f75bbf432389517aef65f1df474d2f2bff79a3586564f7f7328ef" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.after.arcadia", + "bytes": 6795, + "sha256": "9d084dd75a0251d349cc31f9ee98df58d0bc76859dc3cb1503f242e2f759888a" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.after.json", + "bytes": 9618, + "sha256": "f09be41afd85c18fd52fdf997e9b81c4b7cb2c41e78d167abcd14caea8110333" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.arcadia", + "bytes": 4990, + "sha256": "8740f27be99624013d9be876639c0411e1b8c14f0f9a843f43dc71d769efd79a" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.hashes.json", + "bytes": 963, + "sha256": "00fc9e2c709bdcd9ee98012176cb0edb635c112153d963cd169bf4bf69a9e010" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.json", + "bytes": 8146, + "sha256": "9c188f2890630c7feec2be719a7104af9690da7ea836df18fa78da3ff2acfc1b" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.manifest.json", + "bytes": 1045, + "sha256": "46b40f221ffad614733b615208814ace63947e96b80bbfdec63853ccd4f4e8c8" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.request.json", + "bytes": 3075, + "sha256": "b57f656f0b9cf2c595e83150c683301909e20f15684d35d108d3c57ee0dc5909" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch-native.md", + "bytes": 2637, + "sha256": "dddca2b85f892b05881c75ef3cd62437396cc086a09909b621e02bad0cbe56ff" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.after.arcadia", + "bytes": 3134, + "sha256": "d3315bba762395205ae761e6e64029e8b4070c15a1299c6114075581db7b0974" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.after.json", + "bytes": 3927, + "sha256": "8f36119c7e893a4af374b13b85b1c2cb3df0196df8d06a551386628fc8b8646d" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.arcadia", + "bytes": 1787, + "sha256": "5e1f433e04621424edac43e53411624059e873f88dd531bfdb39093953485ed7" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.hashes.json", + "bytes": 933, + "sha256": "1bd87700b04e4f169ab5f8aceaa3b0c3ec3a1cc43e1bce135a1cee506fc75d38" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.json", + "bytes": 2816, + "sha256": "1972242d2a8677d004dc3af1081feb292de65fe26128d877dded8661f9906619" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.manifest.json", + "bytes": 647, + "sha256": "1e440efa02e2ccc27585d9a49c7864d53e3e3e7645ccb219f040e00d95331b8e" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.request.json", + "bytes": 2197, + "sha256": "71f23474614aab90398ce24f00f2cf61d6cb9a3a34faa3e12e0c8104e0a71073" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-repair.arcadia", + "bytes": 15635, + "sha256": "e3ce0347746584f503b825a8b6bd23a7eebf0827940112ef8f36d500c1d0a043" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-repair.json", + "bytes": 25736, + "sha256": "29736f2a619f7f2d0e795229f6e8c3645a1b4eca6292043cd604aa01b1ec9170" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-take.arcadia", + "bytes": 15631, + "sha256": "9ab573c92be66e3bae659dd826923ba6066979b1651edda7bd469056632cd77e" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-take.json", + "bytes": 25736, + "sha256": "828c990c6129692cd31c7f6ed0dd6c952f9cfffdd90bc80171df82d4d929afba" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.arcadia", + "bytes": 15617, + "sha256": "49214be2ca9c8bb6195c3b39737c053847021839f70f0bb2921d35a1fbd2ac83" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.invalid-request.json", + "bytes": 2225, + "sha256": "8b02d4739b1be2c8a64da76423b4a6cae7d89c60f4d30723b94f1da3779cbcca" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.invalid.txt", + "bytes": 78, + "sha256": "aa536e18bc65325163e9b645a4ad031ab599fcb05948dcf741b725d0f0c8b602" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.json", + "bytes": 25722, + "sha256": "995dd72f5c1f07f998233ae9847e337cb82de0c2a9053d3905be021d5f8124b9" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.manifest.json", + "bytes": 1059, + "sha256": "ad315359bfd68ce0d265976dc9e4ea6a502ebbb87d7339dd1af5ef27dd01e433" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.repair-plan.json", + "bytes": 15016, + "sha256": "27bf316ad66ffa91f6323e75b0c280baf5caec298645793dea72c5d42aa3b782" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.repair-request.json", + "bytes": 2225, + "sha256": "f4f6b5480ec8927033ea469ea82c1e8411cb6dba95d2da680f15bc193914c9b4" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.steps.md", + "bytes": 3897, + "sha256": "7d7e38d93641a5f22a2738baa4dbacc392eebb477a855cdce0641961980a19ad" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.take-plan.json", + "bytes": 18557, + "sha256": "74dd68ba686b8928054480f0bfed55aad91f6f1208803399dc9878e894f57ecb" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.take-request.json", + "bytes": 1508, + "sha256": "d19a53002a6bf95af3123a3ef9f78baaf7ce1085d4f06f0f4a9d5e5d5accbc0e" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.after-order.arcadia", + "bytes": 6935, + "sha256": "90277f1780d43a6f0b2184bf00b87e7a4f3518d67c6f10d4793daafe1aabf493" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.after-order.json", + "bytes": 11286, + "sha256": "5a3c8494f6976c23b990c14b40760fb2f32ca9973caf6f31dab5632310663591" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.ambiguous-request.json", + "bytes": 1379, + "sha256": "6a86fde194faa55f2d1bdb982571e0e711e5401b53a960e6acb8cf3e17f506c8" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.arcadia", + "bytes": 6195, + "sha256": "e7c30c5a5c3ba7209c8e223f02da55821d7af10a2f09844a7065ae6cd8f22aa5" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.final-plan.json", + "bytes": 19156, + "sha256": "d1e5c2ed08e0aa6274a0421a39876d1ba99f4e441c7a0a68660a83b9e017da14" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.final-request.json", + "bytes": 2418, + "sha256": "433f723252598994dac7184da61f95344b528156cc5a0fba1a7864b2ec9f002b" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.json", + "bytes": 10441, + "sha256": "9e4e2ce1c7879935ad0860a3ae720506c929a8422b51491b719d88af3fd3ff2d" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.manifest.json", + "bytes": 1042, + "sha256": "87e8899c7d4e54faedeef32afb7592fb65278d1bd7390850ab198dcf62068329" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.after-order.arcadia", + "bytes": 6280, + "sha256": "6c77ed42bbf9f4ebe08bfa233197a4020e5587ce33747f7914430aa0c662d9a3" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.after-order.json", + "bytes": 10009, + "sha256": "1dd7ca2bcfc84ac23369c506302b39569d2ebc41e5a4edc99378a1fe01923b7e" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.ambiguous-request.json", + "bytes": 1390, + "sha256": "e0ea7aeb25687ae63c65128f1aab78273f14030d179d3fbea63fe91ab5430136" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.arcadia", + "bytes": 5529, + "sha256": "563c36162050c8564ffa25a85c726462ecdaebdb87659b3f3610506bfd5581e6" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.final-plan.json", + "bytes": 18821, + "sha256": "f96c43fc58dbe48a044b628b31bb3f0b59171dad5b6982ec6c34a5597e474130" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.final-request.json", + "bytes": 2438, + "sha256": "d38fdb13612b07254edad80848f79c1e097d5f868c020feae9ba072aa697a50d" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.json", + "bytes": 9153, + "sha256": "2ed0daed118f2df13dcad738dab174ad34d44a15921cf8097415e707978b0968" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.manifest.json", + "bytes": 1058, + "sha256": "c79bd12a85d8d4f25cc3ee43581b3e5e74ae9ad7e4de0c72764975ba2b89c279" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.after-order.arcadia", + "bytes": 5026, + "sha256": "98020e048ac01f285c6ad8c10ce22bef05e193b5ba0f5558be1fb26a7bf82620" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.after-order.json", + "bytes": 7851, + "sha256": "ea3783992488bc6ee944eb91a26ccf3dbc05a3909528fc32ec8023a76765cee6" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.ambiguous-request.json", + "bytes": 1379, + "sha256": "ea3cfd25f7a50481805956fb88ab851516dcd602dd6564502a0cc55f7de6a54f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.arcadia", + "bytes": 4295, + "sha256": "2b7c3694623bbea3e36dcc6f674d4adcd91e23c8e1005ded21e5a69648a048e5" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.final-plan.json", + "bytes": 17912, + "sha256": "95a23bd334cffcaef0c3b1012b7555efd2a077ef6f9140d58020910ef8a76723" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.final-request.json", + "bytes": 2081, + "sha256": "1e2433ed5821bf65443f56cb27381ee935db81b1955d3a539b7952898312a410" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.json", + "bytes": 7012, + "sha256": "0033f8780c2ba69779b811bca792340c25a092f887e5811c6839f0a691d744f2" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.manifest.json", + "bytes": 1046, + "sha256": "e3b4a60a56abee779ca8356605c968aa2d99256a3bd3c5601b14b5c5502a1a05" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.after-order.arcadia", + "bytes": 5467, + "sha256": "e265cab35097acc46f5123107c13bc35b9f71931ff650557fc1c85779141b327" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.after-order.json", + "bytes": 8482, + "sha256": "9b777828d3681138de6bbd08de8bf922bed92c27be60b103d8ff73ce7ddd0a48" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.ambiguous-request.json", + "bytes": 1379, + "sha256": "7d124256730bf2feee772c7d0118b87eb288e8aaa9179d69ceb9259dbceb2c71" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.arcadia", + "bytes": 4727, + "sha256": "87a5a3665dab2dd6e595867dcebb1586e93dd067c85d6e24b1a4d3ff0ad6d4ba" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.final-plan.json", + "bytes": 18803, + "sha256": "1888ca51e0923866a9afea99cad069fe5d3f19f0a1b24328e20ac1b9f52d8bad" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.final-request.json", + "bytes": 2294, + "sha256": "5070a5b85feb1bc7b1fc648cd5d35ef26663492c8666dcd471950c06ec3a6052" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.json", + "bytes": 7641, + "sha256": "725b35e36640c81c70c7efea5c3304bf61b49ef9664194ca0d491782cc62191a" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.manifest.json", + "bytes": 1038, + "sha256": "1b43abf8fed3061c65a7b7cb103d31ea7ece333a2da83c645f8d228448c4dbb2" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.after-order.arcadia", + "bytes": 5019, + "sha256": "65a6217f474b5085f37b511151185c2c08ff7a1998e924f1fe01f29c410f6ced" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.after-order.json", + "bytes": 7835, + "sha256": "8a53bb9b43eab5b6dca5e08deef20c14c96e134b9ee816a99b7960bb5255e008" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.ambiguous-request.json", + "bytes": 1379, + "sha256": "c704f99245f00d5c3be0562d91931b4e7f1fb3fb36f41991eb76656ffbd6129f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.arcadia", + "bytes": 4279, + "sha256": "c59ec1233d5a9fbb8e386f6d9b13f398be21baf813ba215efb51bfc1bb98db36" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.final-plan.json", + "bytes": 17938, + "sha256": "30c5c3f614a74708763df612016483623792f4c65e2ed2fa662ac417cfb852eb" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.final-request.json", + "bytes": 2098, + "sha256": "3b6c35ef78133f0980cb6fb53fbc29c5d3c4deb5dc4be01c2c3384e221987b9b" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.json", + "bytes": 6996, + "sha256": "c159c60403abcf8fefab7f19cbad9989488e8ccc20b82c57597b22a0ae254802" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.manifest.json", + "bytes": 1038, + "sha256": "af8a314a9b1d85a8f98affa5a6649f43d252851158798e1ad687bb1b6966b14f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.steps.md", + "bytes": 4549, + "sha256": "6004894e9d9f478b7fe1c3c3e0706dcc546d5df8557cff91b4cf26f8a4badf24" + }, + { + "path": "harness/fixtures/release1-native/source5-recovery/15000000-0000-4000-8000-000000000010.json", + "bytes": 1933, + "sha256": "71cca2a59f36b2a07d11dedbe9101226aa1a4a00d8ac244b5565202e56709f51" + }, + { + "path": "harness/fixtures/release1-native/source5-recovery/generate.py", + "bytes": 1496, + "sha256": "e44986c1d563499f25917441220b23883fc9cb0f89faf409873191f0212fbd2f" + }, + { + "path": "harness/fixtures/release1-native/state-actions.arcadia", + "bytes": 6224, + "sha256": "9cde82608110e56aa9e14c9e33eb38976f53aed74ab013145d411d5743a0ec26" + }, + { + "path": "harness/fixtures/rest-coverage/README.md", + "bytes": 1870, + "sha256": "df4a391312e0c8b20ccdcc850199443b08547be1b10b1f2447a067bf4bf544e6" + }, + { + "path": "harness/fixtures/rest-coverage/coverage-probe.json", + "bytes": 7951, + "sha256": "2d1ef7bdb5d7bf17b9fda33b1d1790d1d88289b3fd1e725f89b83a69771f9a43" + }, + { + "path": "harness/fixtures/rest-coverage/run-coverage-probe.ps1", + "bytes": 9381, + "sha256": "f24f19fca418b76a7249894a08c116e16b465a02f8f899d12b808ccfdd90a3bd" + }, + { + "path": "harness/fixtures/run-timed-bundle-oracle.ps1", + "bytes": 7466, + "sha256": "fab696486a574f9867c6e69a8a8b960e7e9722206441b9cc5f36d41f285f1a25" + }, + { + "path": "harness/fixtures/scenario-authoring/README.md", + "bytes": 14700, + "sha256": "6b651b180b76d10b00bc49d77a8f5e0b3ba0317446978f41b541f5bb23fedad8" + }, + { + "path": "harness/fixtures/scenario-authoring/base/expected-baseline.json", + "bytes": 38589, + "sha256": "abd8246c939ebb8a2162ef82e23d0fb322ee1a8b4d0d7c28a34037e42e86e841" + }, + { + "path": "harness/fixtures/scenario-authoring/base/project.arcadia", + "bytes": 19470, + "sha256": "9b1afbe96b0bf8fa613451b00929492f05a59b9eb2ca74c2c374a8b7bb7cba9e" + }, + { + "path": "harness/fixtures/scenario-authoring/base/rationale.arcadia", + "bytes": 86, + "sha256": "82df210f22f6aa336a3e7e00240977d671c7c3923db7bc58fb29e6d98b67ef49" + }, + { + "path": "harness/fixtures/source7-native/README.md", + "bytes": 7235, + "sha256": "7abccbc3da0980d1d099761d1a66d12c403a0f543954134537ecd4930d182b4b" + }, + { + "path": "harness/fixtures/source7-native/base/expected-baseline.json", + "bytes": 26428, + "sha256": "e2882a58f841f460f45d9d67db1606440e0d7997b9b29a784569ae48e4b23bfb" + }, + { + "path": "harness/fixtures/source7-native/base/project.arcadia", + "bytes": 13616, + "sha256": "5474d8ca05fd1375220dc0ad40d913631fde51159e9632bb9f290d1ecdab8dd7" + }, + { + "path": "harness/fixtures/source7-native/base/rationale.arcadia", + "bytes": 59, + "sha256": "e6a600e13036d4ad594a65380ed1b3d82d1772d583041bb0a624c9588a73047a" + }, + { + "path": "harness/fixtures/source7-native/manifest.json", + "bytes": 410, + "sha256": "6c57164a796234d83818d462d0a25f10e77062d405769e602ae2a7bec251e3b6" + }, + { + "path": "harness/fixtures/staged-source-authoring/README.md", + "bytes": 6876, + "sha256": "502be5e3bf9112447dc07b1a51fe0fa301754b47128a9b81877c185c6e797fee" + }, + { + "path": "harness/fixtures/staged-source-authoring/base/notes.arcadia", + "bytes": 63, + "sha256": "ad9de02963c20d1f43856455a797deb05ca674659e45f2c4b96b52783024f8bd" + }, + { + "path": "harness/fixtures/staged-source-authoring/base/project.arcadia", + "bytes": 593, + "sha256": "aa844950ec4fb86f262a257e1fc370a26557ea7978d8a4cab78265037660234c" + }, + { + "path": "rust-toolchain.toml", + "bytes": 66, + "sha256": "a6a0bbd29ffaa8182dc22d1d9149709f1091e47df40ed96eb8a78a711c66a4ce" + } + ] +} diff --git a/harness/experiments/diagram-removal-windows-20260912/full-d61f1f3.log b/harness/experiments/diagram-removal-windows-20260912/full-d61f1f3.log new file mode 100644 index 00000000..98fa55ed --- /dev/null +++ b/harness/experiments/diagram-removal-windows-20260912/full-d61f1f3.log @@ -0,0 +1,844 @@ + Compiling oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-desktop) + Finished `test` profile [unoptimized] target(s) in 8m 40s + Running unittests src\main.rs (target\debug\deps\arcadia_studio-e358a5ed59b1de41.exe) + +running 836 tests +test allocation_drag::tests::allocation_artifact_and_manual_trace_cascades_are_named_and_refused ... ok +test allocation_drag::tests::cache_plan_uses_candidate_index_and_same_pixel_different_target_changes_preview ... ok +test allocation_drag::tests::collapsed_target_unfold_is_explicit_and_no_other_fold_changes ... ok +test allocation_drag::tests::direct_exit_revealing_another_role_performer_has_truthful_refusal ... ok +test allocation_drag::tests::explicit_different_performer_retains_advisory_role_warning ... ok +test allocation_drag::tests::folded_subtree_cannot_hide_new_collision ... ok +test allocation_drag::tests::geometry_refuses_new_overlap_bounds_and_invisible_headers_and_preserves_existing_overlap ... ok +test allocation_drag::tests::malformed_scope_wrong_projection_duplicate_placement_and_stable_id_collision_refuse ... ok +test allocation_drag::tests::mixed_p_x_y_refuses_semantic_and_arrange_instead_of_stretching_destination ... ok +test allocation_drag::tests::oa_communication_incompleteness_remains_advisory_without_collateral_loss ... ok +test allocation_drag::tests::oa_sa_incoming_between_outgoing_preserve_identity_source_history_and_other_views ... ok +test allocation_drag::tests::oa_sa_one_leaf_move_refuses_when_ancestor_regrouping_introduces_unrelated_overlap ... ok +test allocation_drag::tests::oa_sa_one_leaf_reassignment_and_outward_move_regroup_ancestors_without_moving_sibling ... ok +test allocation_drag::tests::oa_sa_populated_collapsed_target_accepts_room_and_refuses_collision_without_relocating_contents ... ok +test allocation_drag::tests::oa_sa_state_owned_action_and_availability_reject_reassignment_atomically ... ok +test allocation_drag::tests::oa_sa_unfolding_prior_hidden_overlap_refuses_even_when_insertion_does_not_collide ... ok +test allocation_drag::tests::own_deleted_allocation_routes_may_disappear_in_every_diagram_only ... ok +test allocation_drag::tests::role_only_same_effective_performer_is_semantic_noop_and_outgoing_refuses ... ok +test allocation_drag::tests::sa_port_and_deferred_exchange_allocation_cascade_refuses_and_retarget_is_invalid ... ok +test allocation_drag::tests::same_performer_readability_preserves_snapped_noop_and_allocation_identity ... ok +test allocation_drag::tests::scope_detects_first_child_allocation_and_role_transfer_and_finish_rejects_live_edits ... ok +test allocation_drag::tests::selected_header_visibility_allows_viewport_edge_but_refuses_clipping ... ok +test allocation_drag::tests::snapped_noop_returns_no_command_and_keeps_source_revision_and_redo ... ok +test allocation_drag::tests::source_budget_refusal_keeps_project_bundle_history_and_retry_identity_exact ... ok +test allocation_drag::tests::surviving_constraint_mutation_is_refused_even_when_core_candidate_is_valid ... ok +test allocation_drag::tests::target_presentation_requires_accepted_identity_and_selected_header_visibility ... ok +test allocation_drag::tests::toolbar_identity_allows_exact_incoming_placement_at_old_label_overlap ... ok +test allocation_drag::tests::uniform_folded_grandchild_and_unplaced_scope_moves_exactly_q_and_all_l_oa_sa ... ok +test allocation_drag::tests::uniform_role_only_and_mixed_direct_role_composites_same_target_do_not_allocate ... ok +test allocation_drag::tests::uniformly_unassigned_composite_creates_only_stable_leaf_allocations_including_unplaced ... ok +test allocation_drag::tests::unrequested_view_option_cleanup_is_not_whitelisted ... ok +test allocation_drag::tests::unresolved_role_leaf_can_arrange_or_accept_explicit_target_without_guessing ... ok +test app::allocation_drag::tests::actual_canvas_origin_change_cancels_held_work_before_any_legacy_release ... ok +test app::allocation_drag::tests::arrange_is_one_gesture_and_snapped_noop_preserves_redo_and_source ... ok +test app::allocation_drag::tests::candidate_semantics_are_cached_per_destination_with_stable_ids_and_own_index ... ok +test app::allocation_drag::tests::destination_identity_does_not_describe_blocked_or_outside_viewport_as_unallocation ... ok +test app::allocation_drag::tests::frozen_collapsed_target_uses_only_visible_header_and_port_edge_controls_occlude ... ok +test app::allocation_drag::tests::frozen_targets_use_half_open_semantic_priority_and_refuse_incomparable_overlap ... ok +test app::allocation_drag::tests::full_tree::actual_app_tree_dirty_description_retains_focus_and_middle_caret_for_next_key ... ok +test app::allocation_drag::tests::full_tree::actual_app_tree_dirty_name_retains_focus_and_middle_caret_for_next_key ... ok +test app::allocation_drag::tests::full_tree::actual_app_tree_exact_incoming_drag_keeps_destination_visible_and_canvas_stable ... ok +test app::allocation_drag::tests::full_tree::actual_keyboard_arrange_shortcut_consumes_once_escape_cancels_and_dirty_owner_refuses ... ok +test app::allocation_drag::tests::full_tree::actual_rendered_canvas_pixels_do_not_change_when_toolbar_feedback_text_changes ... ok +test app::allocation_drag::tests::full_tree::actual_toolbar_hover_inspects_last_full_name_without_authorizing_an_outside_drop ... ok +test app::allocation_drag::tests::modal_roundtrip_equal_fit_undo_resize_and_focus_retire_press_before_replay ... ok +test app::allocation_drag::tests::mounted_clean_stationary_selects_exact_work_without_revision_or_legacy_apply ... ok +test app::allocation_drag::tests::mounted_dirty_port_press_cannot_fall_through_to_applying_port_selection ... ok +test app::allocation_drag::tests::mounted_dirty_property_press_does_not_select_apply_or_destroy_draft ... ok +test app::allocation_drag::tests::mounted_oa_sa_ordered_incoming_between_outgoing_are_exact_single_history_steps ... ok +test app::allocation_drag::tests::mounted_role_only_outgoing_refusal_retains_placement_and_same_performer_creates_no_allocation ... ok +test app::allocation_drag::tests::mounted_uniform_parent_moves_hidden_placements_and_assigns_only_leaves ... ok +test app::allocation_drag::tests::oa_sa_clipped_selected_header_refuses_preview_release_and_retries_without_partial_source_or_history ... ok +test app::allocation_drag::tests::oa_sa_toolbar_identity_accepts_exact_receiver_and_collapsed_header_drag ... ok +test app::allocation_drag::tests::outside_release_is_cancel_and_does_not_remove_an_assignment ... ok +test app::allocation_drag::tests::pending_behavior_draft_refuses_actual_work_press_and_equal_document_replacement_retires_packet ... ok +test app::allocation_drag::tests::release_uses_ordered_native_position_before_later_motion_in_same_batch ... ok +test app::allocation_drag::tests::same_snapped_position_on_opposite_shared_border_rebuilds_semantics_even_if_layout_refuses ... ok +test app::allocation_drag::tests::source_and_modal_admission_reject_prebuilt_clean_press_without_selecting ... ok +test app::allocation_drag::tests::source_refusal_is_atomic_and_a_new_gesture_can_retry_against_live_revision ... ok +test app::allocation_drag::tests::stale_packets_do_not_cancel_a_newer_token_and_each_release_is_consumed_once ... ok +test app::allocation_drag::tests::toolbar_destination_names_transformed_target_whose_header_is_clipped ... ok +test app::allocation_drag::tests::toolbar_status_leaves_transformed_top_edge_work_header_readable ... ok +test app::architecture_authoring::tests::architecture_allocated_work_is_root_owned_and_one_exact_history_change ... ok +test app::architecture_authoring::tests::architecture_blank_names_and_escape_never_accept_placeholder_or_rename ... ok +test app::architecture_authoring::tests::architecture_captured_escape_does_not_cancel_other_controls_or_placement ... ok +test app::architecture_authoring::tests::architecture_f2_routes_selected_node_to_inline_rename_and_exact_undo ... ok +test app::architecture_authoring::tests::architecture_first_focused_input_escape_cancels_create_and_rename ... ok +test app::architecture_authoring::tests::architecture_invalid_click_cannot_poison_inline_or_checkpoint_geometry ... ok +test app::architecture_authoring::tests::architecture_stale_submit_keeps_create_and_rename_visible_and_exact ... ok +test app::architecture_authoring_tests::architecture_cancelled_gesture_cannot_commit_a_later_named_draft ... ok +test app::architecture_authoring_tests::architecture_canvas_left_click_uses_world_coordinate_once_at_zoom_and_pan ... ok +test app::architecture_authoring_tests::architecture_checkpoint_retains_exact_name_point_and_fresh_binding_without_commands ... ok +test app::architecture_authoring_tests::architecture_context_choices_are_small_and_system_is_singleton ... ok +test app::architecture_authoring_tests::architecture_contextual_allocation_creates_work_relation_and_node_in_one_undo ... ok +test app::architecture_authoring_tests::architecture_creation_names_before_commit_preserves_camera_and_undoes_once ... ok +test app::architecture_authoring_tests::architecture_existing_inventory_is_contextual_and_placement_never_implies_allocation ... ok +test app::architecture_authoring_tests::architecture_f2_rename_preserves_identity_placement_and_atomic_history ... ok +test app::architecture_authoring_tests::architecture_name_survives_rejected_click_resize_navigation_and_escape_is_explicit ... ok +test app::architecture_authoring_tests::architecture_rejected_submission_keeps_inline_name_visible_and_invalid_click_is_ignored ... ok +test app::architecture_authoring_tests::basic_transition_explicit_overview_focus_wins_over_an_already_populated_architecture ... ok +test app::behavior_lifecycle_tests::incomplete_behavior_form_is_dirty_close_save_retains_it_and_cancel_allows_switching ... ok +test app::behavior_lifecycle_tests::passive_behavior_canvas_events_do_not_apply_property_drafts ... ok +test app::behavior_lifecycle_tests::pending_behavior_blocks_navigation_property_edits_and_model_history ... ok +test app::behavior_lifecycle_tests::pending_behavior_blocks_source_creation_and_source_history_replay ... ok +test app::behavior_lifecycle_tests::save_prepares_behavior_before_opening_destination_and_cancel_keeps_one_undo ... ok +test app::behavior_lifecycle_tests::source_writeback_failure_keeps_typed_behavior_form_for_repair_and_one_undo ... ok +test app::behavior_removal_tests::mounted_behavior_clean_inspector_click_and_tab_own_delete_then_f6_returns_to_canvas ... ok +test app::behavior_removal_tests::mounted_behavior_clean_text_focus_and_modifiers_cannot_delete_selected_occurrence ... ok +test app::behavior_removal_tests::mounted_behavior_pan_and_stale_removal_intent_do_not_delete ... ok +test app::behavior_removal_tests::mounted_behavior_tab_and_f6_retire_same_batch_delete_and_window_focus ... ok +test app::behavior_removal_tests::mounted_process_delete_occurrence_or_link_preserves_reusable_work_and_source_history ... ok +test app::behavior_removal_tests::mounted_qualified_process_child_delete_refuses_outer_reference_and_shared_definition ... ok +test app::behavior_removal_tests::mounted_scenario_delete_message_or_participant_preserves_reusable_targets ... ok +test app::behavior_removal_tests::mounted_scenario_fragment_and_branch_delete_only_owned_occurrences ... ok +test app::behavior_removal_tests::mounted_scenario_use_delete_keeps_definition_and_second_use_and_rejects_owner_replay ... ok +test app::checkpoints::tests::checkpoint_completion_releases_the_writer_while_a_context_menu_is_open ... ok +test app::checkpoints::tests::checkpoint_inline_create_and_rename_restore_focus_without_changing_drafts_or_history ... ok +test app::checkpoints::tests::checkpoint_noninline_contexts_keep_other_focus_and_still_lint ... ok +test app::checkpoints::tests::discard_and_close_waits_for_the_late_checkpoint_then_retires_it ... ok +test app::checkpoints::tests::home_resume_keeps_state_view_while_explicit_architecture_remains_reachable ... ok +test app::checkpoints::tests::home_resume_retains_invalid_source_and_property_drafts ... ok +test app::checkpoints::tests::home_resume_returns_to_each_actual_workspace_without_model_edits ... ok +test app::checkpoints::tests::malformed_checkpoint_does_not_replace_the_current_model ... ok +test app::checkpoints::tests::recent_and_recovery_navigation_respect_unsaved_decision ... ok +test app::checkpoints::tests::restored_copy_keeps_raw_property_and_requires_save_without_local_or_hosted_binding ... ok +test app::checkpoints::tests::saving_an_older_snapshot_keeps_recovery_for_newer_unsaved_work ... ok +test app::checkpoints::tests::stale_write_completion_cannot_recover_a_discarded_document ... ok +test app::checkpoints::tests::walkthrough_request_keeps_unfinished_source_behind_the_normal_pending_guard ... ok +test app::data_paging_lifecycle_tests::paging_preserves_same_context_and_resets_on_layer_or_document_replacement ... ok +test app::diagram_focus_tests::mounted_f2_requires_canvas_focus_and_yields_to_clean_inspector ... ok +test app::diagram_removal_tests::captured_confirmation_rejects_selection_document_revision_and_placement_changes ... ok +test app::diagram_removal_tests::mounted_allocation_work_click_then_delete_without_redraw_removes_placement_once ... ok +test app::diagram_removal_tests::mounted_bend_delete_has_priority_and_semantic_edge_delete_is_confirmed ... ok +test app::diagram_removal_tests::mounted_clean_text_programmatic_focus_and_tab_remove_canvas_keyboard_ownership ... ok +test app::diagram_removal_tests::mounted_inspector_can_take_focus_during_passive_save ... ok +test app::diagram_removal_tests::mounted_oa_sa_delete_hides_exact_placement_and_round_trips_source_and_model ... ok +test app::diagram_removal_tests::mounted_passive_save_never_grants_canvas_focus_or_restores_window_lost_focus ... ok +test app::diagram_removal_tests::mounted_passive_save_retires_held_canvas_drag_but_allows_a_fresh_drag ... ok +test app::diagram_removal_tests::mounted_placement_properties_selection_supports_hide_and_model_delete ... ok +test app::diagram_removal_tests::mounted_programmatic_canvas_entry_needs_no_mouse_focus_boolean ... ok +test app::diagram_removal_tests::mounted_removal_intents_reject_stale_selection_revision_owner_and_document ... ok +test app::diagram_removal_tests::mounted_revision_and_history_preserve_the_actual_canvas_or_inspector_focus_owner ... ok +test app::diagram_removal_tests::mounted_shift_delete_captures_target_cancel_escape_and_confirmation_replay ... ok +test app::diagram_removal_tests::mounted_state_action_and_internal_rows_delete_relations_and_preserve_reused_work ... ok +test app::diagram_removal_tests::mounted_state_delete_uses_state_placement_and_preserves_architecture_placement ... ok +test app::diagram_removal_tests::mounted_window_modal_dirty_and_modifier_boundaries_retire_delete_focus ... ok +test app::diagram_selection_tests::changing_visible_view_follows_its_clean_inspector_without_a_model_edit ... ok +test app::diagram_selection_tests::diagram_switch_preserves_an_independent_semantic_inspection ... ok +test app::diagram_selection_tests::diagram_uuid_edit_follows_the_same_view_or_a_different_picker_target ... ok +test app::diagram_selection_tests::invalid_view_draft_blocks_the_switch_and_retains_raw_input ... ok +test app::diagram_selection_tests::stale_diagram_choice_never_applies_an_unrelated_valid_draft ... ok +test app::diagram_selection_tests::valid_pending_view_edit_applies_to_old_view_then_inspects_the_new_view ... ok +test app::direct_scenario_tests::direct_scenario_camera_details_and_real_resize_invalidate_only_pointer_context ... ok +test app::direct_scenario_tests::direct_scenario_creation_and_reorder_preserve_selection_and_each_undo_once ... ok +test app::direct_scenario_tests::direct_scenario_rejects_every_stale_context_and_preserves_property_drafts ... ok +test app::direct_scenario_tests::direct_scenario_source_failure_and_navigation_keep_form_until_success ... ok +test app::hosted::tests::hosted_actual_app_tasks_publish_edit_conflict_correct_credentials_reload_and_open ... ok +test app::hosted::tests::hosted_catalog_invalidation_follows_service_writes_and_observed_revision_changes ... ok +test app::hosted::tests::hosted_catalog_search_credentials_and_failed_refresh_never_mix_result_scopes ... ok +test app::hosted::tests::hosted_changed_bound_head_does_not_invalidate_another_services_empty_filter ... ok +test app::hosted::tests::hosted_conflict_fetches_review_without_adoption_and_reload_is_undoable ... ok +test app::hosted::tests::hosted_detached_drafts_and_recovery_remain_available_after_rejected_publish ... ok +test app::hosted::tests::hosted_failed_cross_service_publication_checks_and_reloads_its_own_resource ... ok +test app::hosted::tests::hosted_failed_or_cancelled_local_open_keeps_the_existing_document_and_destination ... ok +test app::hosted::tests::hosted_invalid_and_detached_source_drafts_never_start_network_writes ... ok +test app::hosted::tests::hosted_invalid_local_open_repair_saves_locally_and_never_replaces_old_resource ... ok +test app::hosted::tests::hosted_modal_blocks_underlying_edits_and_credentials_are_redacted ... ok +test app::hosted::tests::hosted_new_revision_invalidates_filtered_catalog_even_without_a_displayed_row ... ok +test app::hosted::tests::hosted_only_successful_source_save_as_changes_the_active_destination ... ok +test app::hosted::tests::hosted_open_waits_for_unsaved_guard_and_failed_open_preserves_current_document ... ok +test app::hosted::tests::hosted_publish_acknowledges_only_the_sent_snapshot_and_retains_undo ... ok +test app::hosted::tests::hosted_stale_completions_do_not_clear_current_busy_or_adopt_another_document ... ok +test app::hosted::tests::hosted_unknown_save_is_acknowledged_by_exact_readback_without_retry ... ok +test app::lint_tests::committed_check_cache_follows_edit_and_undo_while_drafts_stay_separate ... ok +test app::lint_tests::lint_coalesces_work_and_rejects_obsolete_results ... ok +test app::lint_tests::prior_document_lint_cannot_enter_reopened_model_or_block_next_checks ... ok +test app::port_view_tests::catalog_creation_follows_the_new_port_and_keeps_group_browsing_explicit ... ok +test app::port_view_tests::filtered_active_view_cannot_hide_a_created_port_when_eligible_owner_view_is_folded ... ok +test app::process_canvas::direct_process_dirty_source_blocks_canvas_creation_without_losing_text ... ok +test app::process_canvas::tests::direct_process_app_open_source_and_back_preserve_local_reference_identity ... ok +test app::process_canvas::tests::direct_process_app_same_owner_selection_preserves_tool_but_owner_change_resets_it ... ok +test app::process_canvas::tests::direct_process_app_save_details_resize_and_passive_geometry_keep_drafts_and_camera ... ok +test app::process_canvas::tests::direct_process_app_source_failure_retains_form_then_commits_once_and_selects_occurrence ... ok +test app::process_canvas::tests::direct_process_app_stale_context_dirty_source_and_properties_never_mutate ... ok +test app::process_canvas::tests::direct_process_append_empty_first_second_exchange_has_exact_source_history ... ok +test app::process_canvas::tests::process_zoom_retains_rejected_draft_and_guards_selection ... ok +test app::reference_authoring::tests::chooser_rejects_old_results_after_context_recovery_reload_or_modal_and_keeps_history_text_out ... ok +test app::reference_authoring::tests::inspector_reference_browse_is_read_only_then_one_scoped_value_applies_with_exact_undo_redo ... ok +test app::reference_authoring::tests::inspector_reference_retains_invalid_missing_and_incompatible_current_until_explicit_clear ... ok +test app::reference_authoring::tests::mounted::mounted_delayed_return_cannot_focus_under_review_and_fresh_modal_tab_owns_its_form ... ok +test app::reference_authoring::tests::mounted::mounted_form_tab_enters_in_both_directions_and_cycles_boundaries_without_losing_focus ... ok +test app::reference_authoring::tests::mounted::mounted_fresh_tab_reveals_offscreen_reference_and_return_reveals_it_again ... ok +test app::reference_authoring::tests::mounted::mounted_reference_choice_stages_literal_identity_and_delayed_focus_cannot_hit_replacement_field ... ok +test app::reference_authoring::tests::mounted::mounted_reference_trigger_tabs_to_root_popup_search_escape_and_exact_adjacent_fields ... ok +test app::reference_authoring::tests::mounted::mounted_reverse_review_required_rationale_remains_editable_beside_candidate_reference_form ... ok +test app::reference_authoring::tests::mounted::mounted_review_pointer_open_and_outside_dismissal_keep_background_input_inactive ... ok +test app::reference_authoring::tests::mounted::mounted_scrolled_reference_anchor_uses_window_geometry_for_pointer_and_keyboard ... ok +test app::reference_authoring::tests::reference_array_row_reorder_and_constructor_switch_invalidate_exact_old_field ... ok +test app::reference_authoring::tests::review_reference_cannot_reopen_or_write_a_banked_row_after_another_row_takes_focus ... ok +test app::reference_authoring::tests::review_reference_facets_groups_and_attachment_hosts_browse_without_replanning_and_reject_old_facet ... ok +test app::repair_save_state_tests::recovering_applied_repair_rebinds_rolled_back_disk_bytes_without_changing_model ... ok +test app::repair_save_state_tests::recovery_missing_entry_or_failed_reload_preserves_current_destination_save_authority ... ok +test app::repair_save_state_tests::repair_history_compares_to_new_disk_baseline_and_then_successful_save ... ok +test app::repair_save_state_tests::repair_to_previous_saved_bytes_requires_save_at_new_destination_and_guards_close ... ok +test app::repair_save_state_tests::valid_equal_content_at_distinct_destinations_stays_clean ... ok +test app::review_navigation_tests::rejected_semantic_source_writeback_retains_review_camera_and_original_navigation ... ok +test app::review_navigation_tests::review_already_showing_the_target_keeps_its_camera_and_query ... ok +test app::review_navigation_tests::semantic_name_take_selects_the_counterpart_view_in_both_directions_with_one_exact_history_entry ... ok +test app::review_navigation_tests::semantic_review_without_a_destination_view_clears_the_old_layer_canvas_without_creating_a_view ... ok +test app::save_as_tests::save_as_late_receipt_preserves_newer_raw_source_draft_and_destination ... ok +test app::save_as_tests::save_as_preflight_rejects_historical_collision_before_starting_io ... ok +test app::save_as_tests::save_as_receipt_then_one_undo_restores_meaning_and_saving_preserves_redo ... ok +test app::source_project_tests::closed_detached_file_keeps_first_save_conflict_then_can_be_reloaded_fresh ... ok +test app::source_project_tests::inactive_invalid_draft_blocks_graphical_changes_and_diagnostic_switches_files ... ok +test app::source_project_tests::json_export_and_rejected_save_as_preserve_source_location_history_and_bytes ... ok +test app::source_project_tests::missing_include_open_keeps_old_model_and_can_be_repaired_and_saved ... ok +test app::source_project_tests::recovery_after_first_save_failure_retains_target_then_retries_without_reentering_path ... ok +test app::source_project_tests::recovery_of_previous_save_as_target_does_not_redirect_current_project ... ok +test app::source_project_tests::recovery_open_finds_first_save_journal_without_an_entry_file ... ok +test app::source_project_tests::recovery_target_survives_edit_lint_apply_and_rejected_recovery_until_success ... ok +test app::source_project_tests::source3_native_open_preserves_report_comments_nesting_and_save_reopen ... ok +test app::source_project_tests::two_file_apply_graphical_edit_exact_undo_save_as_and_reopen ... ok +test app::state_diagram_tests::all_context_dimensions_reject_stale_selection_camera_and_model_messages ... ok +test app::state_diagram_tests::create_view_places_only_its_machine_and_restores_exact_source_in_one_undo ... ok +test app::state_diagram_tests::direct_create_connect_select_and_move_keep_semantic_identity_and_atomic_history ... ok +test app::state_diagram_tests::fallback_owner_first_selection_keeps_the_captured_context_for_its_first_move ... ok +test app::state_diagram_tests::pending_drafts_block_every_direct_mutation_and_passive_camera_preserves_inputs ... ok +test app::state_diagram_tests::real_view_tool_and_history_changes_invalidate_old_release_events ... ok +test app::state_diagram_tests::rejected_creation_keeps_source_and_selection_then_valid_owner_can_retry ... ok +test app::state_diagram_tests::same_size_viewport_after_revision_or_tool_epoch_does_not_refit_the_camera ... ok +test app::state_diagram_tests::shared_semantic_states_keep_architecture_and_behavior_placements_independent ... ok +test app::state_diagram_tests::state_diagram_routes_constructor_and_source_open_to_the_existing_workspace_without_edits ... ok +test app::state_diagram_tests::state_diagram_routes_picker_and_reveal_but_explicit_architecture_does_not_bounce ... ok +test app::state_diagram_tests::state_diagram_routes_preserve_selected_raw_properties_and_pending_behavior_guards ... ok +test app::state_diagram_tests::state_navigation_catalog_selection_across_layers_resets_camera_and_tool ... ok +test app::state_diagram_tests::state_navigation_catalog_selection_of_another_machine_resets_camera_and_tool ... ok +test app::state_diagram_tests::state_navigation_layer_change_resets_the_new_machine_at_the_same_viewport_size ... ok +test app::state_diagram_tests::state_navigation_return_to_the_same_view_preserves_camera_tool_and_fit_mode ... ok +test app::state_diagram_tests::state_navigation_root_event_and_same_layer_keep_the_current_camera_and_tool ... ok +test app::transition_context_tests::explicit_behavior_internal_and_process_roots_keep_their_workspace_without_creating_a_view ... ok +test app::transition_context_tests::explicit_destination_is_honored_and_ordinary_work_transition_still_places_in_architecture ... ok +test app::transition_context_tests::machine_and_typed_action_transitions_resolve_the_owner_and_reusing_that_context_retains_camera ... ok +test app::transition_context_tests::rejected_source_writeback_keeps_review_and_navigation_and_invalid_draft_still_blocks_start ... ok +test app::transition_context_tests::scenario_transition_focuses_requested_counterpart_and_preserves_unrelated_views_in_both_directions ... ok +test app::view_copy_tests::copying_architecture_keeps_architecture_even_with_a_retained_state_view ... ok +test app::view_copy_tests::copying_the_current_state_view_uses_its_own_identity_and_is_one_source_undo ... ok +test app::view_copy_tests::duplicate_rejection_preserves_an_incomplete_source_buffer ... ok +test app::view_copy_tests::duplicate_rejection_preserves_invalid_property_and_pending_behavior_drafts ... ok +test app::view_copy_tests::stale_copy_does_not_apply_an_unrelated_valid_property_draft ... ok +test behavior::canvas_workspace::tests::relative_camera_zoom_keeps_the_cursor_world_point_and_rejects_nonfinite_inputs ... ok +test behavior::canvas_workspace::tests::viewport_ordered_batch_uses_each_event_position_and_cancels_before_camera_motion ... ok +test behavior::contextual_source_tests::contextual_source_app_checkpoint_restores_inner_raw_draft_without_model_adoption ... ok +test behavior::contextual_source_tests::contextual_source_app_empty_actions_and_child_open_refuse_other_raw_editors ... ok +test behavior::contextual_source_tests::contextual_source_app_modal_escape_then_child_back_then_parent_cancel_preserve_accepted_source ... ok +test behavior::contextual_source_tests::contextual_source_back_remains_available_after_owner_deletion_and_with_dirty_editors ... ok +test behavior::contextual_source_tests::contextual_source_back_retains_parent_and_rejects_late_child_event ... ok +test behavior::contextual_source_tests::contextual_source_default_consumer_name_has_stable_alias_and_correlated_selection ... ok +test behavior::contextual_source_tests::contextual_source_deleted_owner_view_retains_draft_instead_of_panicking_or_using_fallback ... ok +test behavior::contextual_source_tests::contextual_source_empty_history_reports_no_change_and_success_requires_a_real_history_step ... ok +test behavior::contextual_source_tests::contextual_source_empty_palette_lifeline_cannot_open_a_previous_owner_or_layer ... ok +test behavior::contextual_source_tests::contextual_source_existing_choice_prunes_staged_dependency ... ok +test behavior::contextual_source_tests::contextual_source_failed_source_budget_preserves_both_drafts_and_accepted_bytes ... ok +test behavior::contextual_source_tests::contextual_source_incomplete_recovered_kind_reports_error_without_panicking ... ok +test behavior::contextual_source_tests::contextual_source_inserts_work_on_the_exact_guarded_link_and_refuses_exchange_identity_conflict ... ok +test behavior::contextual_source_tests::contextual_source_lifelines_stage_exact_separate_records_and_one_history_entry ... ok +test behavior::contextual_source_tests::contextual_source_machine_before_any_owner_creates_optional_view_atomically ... ok +test behavior::contextual_source_tests::contextual_source_mounted_small_editor_keeps_back_and_use_outside_field_scroll ... ok +test behavior::contextual_source_tests::contextual_source_nested_semantic_parent_is_explicit_and_revalidated ... ok +test behavior::contextual_source_tests::contextual_source_new_callee_lifeline_preserves_caller_bindings_as_an_explicit_warning ... ok +test behavior::contextual_source_tests::contextual_source_original_document_remains_bound_after_back_or_choosing_existing ... ok +test behavior::contextual_source_tests::contextual_source_owner_first_can_return_to_an_unnamed_machine_without_losing_source ... ok +test behavior::contextual_source_tests::contextual_source_recovery_keeps_inner_raw_fields_and_refuses_deleted_or_changed_owner ... ok +test behavior::contextual_source_tests::contextual_source_second_system_and_role_machine_owner_refuse_without_fallback ... ok +test behavior::contextual_source_tests::contextual_source_work_uses_reserved_contribution_and_link_ids_and_one_undo ... ok +test behavior::creation::app_tests::app_choosing_another_behavior_or_layer_cannot_commit_a_creation_draft ... ok +test behavior::creation::app_tests::app_creation_opens_the_actual_new_owner_instead_of_first_or_previously_active_behavior ... ok +test behavior::creation::app_tests::app_first_captured_escape_dismisses_file_or_pending_overlay_before_creation ... ok +test behavior::creation::app_tests::app_lesson_request_cancel_retains_creation_then_escape_discards_only_the_draft ... ok +test behavior::creation::app_tests::app_machine_behavior_submit_opens_its_opted_in_view_as_one_undoable_transaction ... ok +test behavior::creation::app_tests::app_new_never_auto_applies_valid_or_invalid_property_and_source_drafts ... ok +test behavior::creation::app_tests::app_recovered_rootless_sa_creation_retains_layer_ids_and_other_raw_drafts ... ok +test behavior::creation::app_tests::app_stale_layer_open_never_starts_or_replaces_a_draft ... ok +test behavior::creation::tests::all_four_viewpoints_are_explicit_and_survive_source_history_reopen ... ok +test behavior::creation::tests::cancel_and_illegal_family_layer_switches_never_create_model_objects ... ok +test behavior::creation::tests::corrupted_recovery_and_reserved_identity_collision_refuse_without_repairing_raw_values ... ok +test behavior::creation::tests::creation_selection_rejects_changed_scenario_body_and_post_creation_operations ... ok +test behavior::creation::tests::machine_requires_valid_owner_and_first_view_adds_no_region_or_state ... ok +test behavior::creation::tests::mounted_creation_keeps_actions_visible_and_renders_only_six_owner_candidates ... ok +test behavior::creation::tests::oa_process_and_sa_chain_keep_exact_names_root_ownership_and_one_history_entry ... ok +test behavior::creation::tests::optional_context_collapses_without_losing_authored_reference_or_raw_search ... ok +test behavior::creation::tests::owner_search_is_name_ordered_filtered_and_page_sized_not_a_catalog ... ok +test behavior::creation::tests::post_commit_selection_is_correlated_with_exact_created_behavior_and_view ... ok +test behavior::creation::tests::recovery_preserves_exact_raw_inputs_reserved_ids_and_revalidates_stale_owner ... ok +test behavior::creation::tests::rejected_source_transaction_keeps_draft_and_every_accepted_source_byte ... ok +test behavior::creation::tests::repeated_owner_names_remain_distinguishable_by_searchable_parent_context_and_alias ... ok +test behavior::direct_canvas_tests::direct_alt_execution_stops_each_operand_at_its_reply_and_marks_open_operand ... ok +test behavior::direct_canvas_tests::direct_bounds_change_during_held_drag_never_commits_old_slot ... ok +test behavior::direct_canvas_tests::direct_clicked_occurrence_capture_cancels_on_view_and_context_changes ... ok +test behavior::direct_canvas_tests::direct_context_escape_unfocus_and_pending_form_cancel_gestures ... ok +test behavior::direct_canvas_tests::direct_drag_and_click_click_use_ordered_sources_and_publish_once ... ok +test behavior::direct_canvas_tests::direct_execution_span_ends_at_its_correlated_reply_and_marks_an_open_call ... ok +test behavior::direct_canvas_tests::direct_panned_canvas_maps_ordered_pointer_events_to_the_visible_slot ... ok +test behavior::direct_canvas_tests::direct_scroll_resize_and_bounds_changes_cancel_captured_slots ... ok +test behavior::direct_canvas_tests::direct_selected_handle_reorders_and_hits_keep_semantic_identity ... ok +test behavior::direct_canvas_tests::reused_exchange_messages_display_their_distinct_occurrence_names ... ok +test behavior::scenario::data_contract_tests::large_payload_has_one_editor_with_reachable_field_and_authored_pages ... ok +test behavior::scenario::data_contract_tests::recursive_browsing_up_and_root_keep_values_and_report_the_depth_limit ... ok +test behavior::scenario::data_contract_tests::recursive_value_focus_exposes_authored_leaf_and_phase_changes_retain_surviving_keys ... ok +test behavior::scenario::data_contract_tests::reply_call_picker_previews_the_same_value_reset_as_selecting_another_exchange ... ok +test behavior::scenario::data_contract_tests::scenario_form_commits_two_reused_record_values_and_correlated_reply_atomically ... ok +test behavior::scenario::direct_tests::direct_busy_save_keeps_details_current_and_camera_for_the_next_pointer_gesture ... ok +test behavior::scenario::direct_tests::direct_clicked_occurrence_rejects_stale_slots_and_retains_recoverable_drafts ... ok +test behavior::scenario::direct_tests::direct_clicked_occurrences_use_root_and_operand_slots_with_exact_source_history ... ok +test behavior::scenario::direct_tests::direct_exchange_compatibility_browsing_preserves_final_slot_validation ... ok +test behavior::scenario::direct_tests::direct_exchange_picker_is_bounded_and_browsing_keeps_pending_values ... ok +test behavior::scenario::direct_tests::direct_five_hundred_exchange_choice_render_probe ... ok +test behavior::scenario::direct_tests::direct_form_keeps_the_same_canvas_in_the_widget_tree ... ok +test behavior::scenario::direct_tests::direct_middle_pair_insertion_is_one_exact_source_and_model_undo ... ok +test behavior::scenario::direct_tests::direct_operand_pair_keeps_parent_sequence_and_cannot_reorder_across_operands ... ok +test behavior::scenario::direct_tests::direct_reply_choices_cache_keeps_typing_fast_and_revalidates_changed_contexts ... ok +test behavior::scenario::direct_tests::direct_reply_choices_validate_the_actual_slot_and_reorder_rejects_reverse_order ... ok +test behavior::scenario::direct_tests::direct_scenario_reference_navigation_blocks_pending_drafts_and_stale_contexts ... ok +test behavior::scenario::direct_tests::direct_scenario_reference_navigation_retains_each_exact_caller_without_history ... ok +test behavior::scenario::direct_tests::direct_scenario_reference_return_survives_rename_and_rejects_deleted_or_changed_use ... ok +test behavior::scenario::operation_tests::operation_gui_async_picker_uses_request_root_and_nested_directions_without_erasing_rejected_values ... ok +test behavior::scenario::operation_tests::operation_gui_selects_two_parameterless_allocations_without_inventing_refinement_and_reply_derives_call ... ok +test behavior::scenario::operation_tests::operation_gui_unresolved_and_disabled_selection_recovery_preserves_rejected_raw_values ... ok +test behavior::scenario::tests::fragment_operands_accept_paired_messages_through_normal_destination_picker ... ok +test behavior::scenario::tests::graphical_call_reply_is_atomic_correlated_and_source_equivalent ... ok +test behavior::scenario::tests::invalid_lifecycle_edit_keeps_draft_and_timer_has_no_global_exchange ... ok +test behavior::scenario::tests::lifeline_picker_uses_core_viewpoint_contract ... ok +test behavior::scenario::tests::reverse_communication_canvas_choices_and_correlated_reply_share_core_direction ... ok +test behavior::scenario::tests::scenario_reuse_requires_explicit_compatible_bindings ... ok +test behavior::scenario::tests::tagged_scenario_commit_is_not_redirected_by_other_editor_events ... ok +test behavior::scenario::workspace::tests::new_scenario_form_resets_only_its_scroll_and_recovery_gets_a_fresh_session ... ok +test behavior::scenario::workspace::tests::production_empty_scenario_lifeline_tool_keeps_staged_source_inside_stable_canvas ... ok +test behavior::scenario::workspace::tests::production_scenario_camera_external_controls_bounds_and_retained_deltas_cancel_old_drags ... ok +test behavior::scenario::workspace::tests::production_scenario_canvas_keeps_bounds_draft_identity_and_camera_through_editing ... ok +test behavior::scenario::workspace::tests::production_scenario_canvas_pan_invalidates_a_pressed_creation_and_caller_restores_once ... ok +test behavior::scenario::workspace::tests::production_scenario_keyboard_enters_activates_draws_focus_and_returns_to_inspector ... ok +test behavior::scenario::workspace::tests::production_scenario_keyboard_reveals_and_activates_initially_offscreen_last_tool ... ok +test behavior::scenario::workspace::tests::production_scenario_retained_toolbar_intents_reject_chooser_dirty_and_picker_lifetimes ... ok +test behavior::scenario::workspace::tests::production_scenario_whole_glyph_drag_moves_one_occurrence_and_rejects_other_operand ... ok +test behavior::scenario::workspace::tests::scenario_form_focus_chained_apply_rechecks_live_review_owner ... ok +test behavior::scenario::workspace::tests::scenario_form_focus_missing_exact_target_leaves_other_inputs_untouched ... ok +test behavior::scenario::workspace::tests::scenario_form_focus_returns_from_back_use_and_escape_after_initial_focus_is_consumed ... ok +test behavior::scenario::workspace::tests::scenario_form_focus_saved_action_is_inert_on_replacement_child_review_and_changed_context ... ok +test behavior::scenario::workspace::tests::scenario_form_focus_targets_the_name_and_rejects_stale_sessions_or_modals ... ok +test behavior::scenario::workspace::tests::scenario_workspace_choosing_tools_preserves_valid_and_invalid_pending_editors ... ok +test behavior::scenario::workspace::tests::scenario_workspace_fit_uses_measured_inner_viewport_and_rejects_nonfinite_inputs ... ok +test behavior::scenario::workspace::tests::scenario_workspace_open_and_back_restore_owner_and_mounted_camera_after_preselection ... ok +test behavior::scenario::workspace::tests::scenario_workspace_same_size_owner_and_document_changes_remeasure_fit_viewport ... ok +test behavior::scenario::workspace::tests::scenario_workspace_scaled_and_panned_scene_keeps_clicked_slots_and_message_endpoints ... ok +test behavior::scenario::workspace::tests::scenario_workspace_scaled_nested_occurrences_and_reorder_keep_exact_sequence_identity ... ok +test behavior::scenario::workspace::tests::scenario_workspace_viewport_events_are_passive_guarded_and_do_not_apply_raw_forms ... ok +test behavior::scenario_activation::tests::a_fragment_cannot_make_crossed_calls_an_unambiguous_caller_execution ... ok +test behavior::scenario_activation::tests::activation_shoulders_under_label_backplates_select_their_call ... ok +test behavior::scenario_activation::tests::actual_canvas_pointer_selects_each_exposed_shoulder_under_zoom_and_pan ... ok +test behavior::scenario_activation::tests::alternative_and_parallel_operand_local_calls_do_not_nest_from_screen_order ... ok +test behavior::scenario_activation::tests::an_inactive_self_call_has_no_fabricated_parent_and_three_nested_calls_expose_three_columns ... ok +test behavior::scenario_activation::tests::call_uuid_order_does_not_choose_activation_columns_or_message_anchors ... ok +test behavior::scenario_activation::tests::inherited_execution_anchors_a_self_call_inside_an_operand_before_returning_after_the_fragment ... ok +test behavior::scenario_activation::tests::long_message_backplates_do_not_erase_selected_activation_border_pixels ... ok +test behavior::scenario_activation::tests::missing_reply_is_a_short_explicit_open_span_and_an_uncorrelated_reply_closes_nothing ... ok +test behavior::scenario_activation::tests::nested_calls_expose_both_bars_and_end_at_their_exact_replies_in_both_directions ... ok +test behavior::scenario_activation::tests::nested_correlations_returning_in_alternative_operands_remain_nested_before_the_fragment ... ok +test behavior::scenario_activation::tests::reentrant_call_uses_the_other_receiver_without_inventing_a_caller_execution ... ok +test behavior::scenario_activation::tests::self_call_receives_at_lower_loop_end_and_self_reply_returns_to_the_parent ... ok +test behavior::scenario_activation::tests::sequential_calls_reuse_column_and_crossed_replies_keep_their_correlations ... ok +test behavior::scenario_lifecycle::tests::alternative_death_does_not_kill_its_displayed_sibling ... ok +test behavior::scenario_lifecycle::tests::conditional_birth_does_not_infer_absence_in_siblings_or_ancestors ... ok +test behavior::scenario_lifecycle::tests::explicit_receiver_is_authoritative_even_with_missing_exchange ... ok +test behavior::scenario_lifecycle::tests::lifecycle_free_fragments_do_not_poison_other_lanes ... ok +test behavior::scenario_lifecycle::tests::loop_lifetime_is_local_and_warning_bearing_loops_remain_drawable ... ok +test behavior::scenario_lifecycle::tests::missing_geometry_is_reported_without_nonfinite_or_guessed_markers ... ok +test behavior::scenario_lifecycle::tests::optional_cleanup_inside_loop_does_not_claim_balanced_or_definite_exit ... ok +test behavior::scenario_lifecycle::tests::projection_retains_exact_authored_source_and_does_not_enter_history ... ok +test behavior::scenario_lifecycle::tests::root_lifetime_has_exact_birth_death_boundaries_without_source_mutation ... ok +test behavior::scenario_lifecycle::tests::scenario_use_is_opaque_and_never_imports_callee_lifecycle_events ... ok +test behavior::scenario_scroll::tests::direct_scenario_caller_restores_mounted_scroll_once_with_clamping_and_app_receipt ... ok +test behavior::scenario_scroll::tests::direct_scenario_restore_cannot_scroll_another_document_owner_or_process_view ... ok +test behavior::scenario_scroll::tests::direct_scroll_mounted_identity_resets_navigation_but_preserves_edits_before_first_report ... ok +test behavior::scenario_scroll::tests::direct_scroll_observer_reports_actual_initial_clamped_and_remounted_offsets_once ... ok +test behavior::scenario_scroll::tests::independent_process_owner_change_resets_actual_scroll_offsets ... ok +test behavior::state_canvas::tests::context_menu_keeps_window_anchor_and_explicit_placement_identity ... ok +test behavior::state_canvas::tests::context_tool_and_pending_form_changes_cancel_mutating_gestures ... ok +test behavior::state_canvas::tests::creation_uses_the_explicit_deepest_owner_and_never_a_fallback_ancestor ... ok +test behavior::state_canvas::tests::drag_uses_ordered_release_at_each_zoom_and_moves_descendants_in_one_undo ... ok +test behavior::state_canvas::tests::escape_and_view_switch_discard_the_armed_transition_source ... ok +test behavior::state_canvas::tests::internal_rows_and_pseudostate_hits_use_shared_persisted_geometry ... ok +test behavior::state_canvas::tests::ordered_stationary_click_does_not_move_on_later_motion_in_the_same_batch ... ok +test behavior::state_canvas::tests::pan_is_button_scoped_read_only_and_hover_does_not_reproject_the_scene ... ok +test behavior::state_canvas::tests::pseudostate_names_avoid_rightward_and_downward_routes_and_share_hit_bounds ... ok +test behavior::state_canvas::tests::relayout_does_not_turn_a_transition_click_into_a_drag_or_pan ... ok +test behavior::state_canvas::tests::selected_endpoint_reconnect_preserves_identity_and_requires_handle_motion ... ok +test behavior::state_canvas::tests::selection_relayout_does_not_move_nodes_or_change_drag_distance ... ok +test behavior::state_canvas::tests::stacked_symbol_names_avoid_each_other_and_are_independent_of_input_order ... ok +test behavior::state_canvas::tests::transition_supports_click_click_and_drag_without_coalesced_accidental_edges ... ok +test behavior::state_canvas::tests::typed_state_actions_are_named_selectable_rows_before_internal_transitions_and_regions ... ok +test behavior::state_canvas::tests::viewport_uses_full_canvas_coordinates_and_republishes_for_a_new_context ... ok +test behavior::state_edit::tests::an_empty_machine_has_an_explicit_visible_owner_for_first_region_creation ... ok +test behavior::state_edit::tests::connect_preserves_self_loops_and_rejects_hidden_or_incompatible_vertices ... ok +test behavior::state_edit::tests::creation_places_missing_ancestry_and_unfolds_existing_owners_atomically ... ok +test behavior::state_edit::tests::every_context_component_and_invalid_ownership_are_checked_before_planning ... ok +test behavior::state_edit::tests::placing_existing_content_and_moving_a_folded_group_preserve_other_views_and_semantics ... ok +test behavior::state_edit::tests::reconnect_preserves_the_complete_record_and_replaces_cardinality_in_place ... ok +test behavior::state_edit::tests::view_initializes_only_its_machine_in_one_source_and_model_history_entry ... ok +test behavior::states::tests::internal_choice_targets_self_and_edit_preserves_identity_and_description ... ok +test behavior::states::tests::invalid_pseudo_trigger_keeps_draft_and_does_not_create_orphan_event ... ok +test behavior::states::tests::selected_composite_owns_new_region_and_history_uses_selected_region ... ok +test behavior::states::tests::timeout_and_work_trigger_commit_together_roundtrip_and_undo ... ok +test behavior::tests::failed_document_commit_retains_typed_transition_and_time_event_for_repair ... ok +test behavior::tests::legacy_process_and_chain_keep_their_ordered_exchange_scene ... ok +test behavior::tests::one_behavior_form_survives_start_edit_and_unrelated_cancel_until_commit ... ok +test behavior::tests::recovery_preserves_distinct_qualified_value_paths_and_rejects_invalid_payload_atomically ... ok +test behavior::tests::recovery_retains_each_incomplete_behavior_form_without_executing_it ... ok +test behavior::tests::selecting_state_transition_keeps_its_behavior_context ... ok +test behavior::topology::contextual::tests::qualified_link_gui_deleted_transient_selection_does_not_seed_or_hide_retained_authored_endpoint ... ok +test behavior::topology::contextual::tests::qualified_link_gui_nested_preview_folds_only_the_exact_reference_instance ... ok +test behavior::topology::contextual::tests::qualified_link_gui_rejected_endpoint_keeps_exact_raw_intent_after_recovery ... ok +test behavior::topology::contextual::tests::qualified_link_gui_repeated_sources_remain_distinct_and_apply_has_exact_source_history ... ok +test behavior::topology::contextual::tests::qualified_link_gui_scope_paging_and_search_reach_tail_beyond_512_without_losing_endpoints ... ok +test behavior::topology::contextual_routing::tests::contextual_route_native_x_to_first_b_keeps_visible_arrow_above_background_and_clear_of_other_references ... ok +test behavior::topology::contextual_routing::tests::contextual_route_nested_visible_hidden_and_parallel_paths_keep_exact_addresses_and_legacy_routes ... ok +test behavior::topology::contextual_routing::tests::contextual_route_shared_anchor_preserves_selected_direct_reconnect_at_fit_and_full_scale ... ok +test behavior::topology::direct_tests::direct_process_append_preserves_existing_order_and_rejects_incompatible_exchange ... ok +test behavior::topology::direct_tests::direct_process_controls_allow_incomplete_work_and_preserve_branch_semantics ... ok +test behavior::topology::direct_tests::direct_process_empty_first_and_second_exchange_keep_the_same_interactive_renderer ... ok +test behavior::topology::direct_tests::direct_process_imported_order_is_projected_without_mutation_and_first_canvas_edit_is_atomic ... ok +test behavior::topology::direct_tests::direct_process_incompatible_imported_order_rejects_conversion_without_losing_draft ... ok +test behavior::topology::direct_tests::direct_process_nested_source_reopen_and_api_command_use_one_transaction ... ok +test behavior::topology::direct_tests::direct_process_oa_sa_repeated_occurrences_share_sources_and_split_one_guarded_link ... ok +test behavior::topology::direct_tests::direct_process_palette_preserves_fit_and_manual_camera ... ok +test behavior::topology::direct_tests::direct_process_production_click_click_drag_insert_and_camera_coordinates ... ok +test behavior::topology::direct_tests::direct_process_production_endpoint_and_peer_reorder_handles_publish_exact_identity ... ok +test behavior::topology::direct_tests::direct_process_production_stale_focus_scroll_bounds_and_pending_cancel ... ok +test behavior::topology::direct_tests::direct_process_readable_default_fit_expansion_and_bounded_choices ... ok +test behavior::topology::direct_tests::direct_process_real_picker_stays_bounded_and_search_keeps_selection ... ok +test behavior::topology::direct_tests::direct_process_reconnect_delete_and_reorder_preserve_other_paths_and_sources ... ok +test behavior::topology::direct_tests::direct_process_reuse_preview_is_local_expandable_and_recursive_sources_are_rejected ... ok +test behavior::topology::direct_tests::direct_process_scaled_control_and_link_gestures_use_visible_positions ... ok +test behavior::topology::direct_tests::direct_process_specific_parallel_link_and_incompatible_adjacency ... ok +test behavior::topology::direct_tests::direct_process_three_ordered_exchanges_preserve_outer_paths_on_insertion ... ok +test behavior::topology::tests::cycle_projection_terminates_and_retains_actual_links ... ok +test behavior::topology::tests::empty_process_can_start_through_normal_authoring_events ... ok +test behavior::topology::tests::fitting_a_branch_keeps_all_nodes_visible_and_selection_uses_scaled_coordinates ... ok +test behavior::topology::tests::guarded_branch_is_one_transaction_with_distinct_source_identities ... ok +test behavior::topology::tests::insertion_picker_only_offers_work_matching_adjacent_exchanges ... ok +test behavior::topology::tests::legacy_branch_insertion_replaces_only_the_selected_implied_link ... ok +test behavior::topology::tests::legacy_edit_preserves_order_and_new_work_in_one_undo ... ok +test behavior::topology::tests::long_engineering_identifiers_stay_inside_label_width ... ok +test behavior::topology::tests::process_camera_selection_ignores_independent_details_scroll ... ok +test behavior::topology::tests::process_fit_uses_measured_height_and_reports_minimum_without_changing_manual_zoom ... ok +test behavior::topology::tests::process_zoom_and_disclosures_preserve_rejected_raw_draft_and_accepted_source ... ok +test behavior::topology::tests::reusable_preview_preserves_identity_and_filters_recursive_sources ... ok +test behavior::topology::tests::stale_or_invalid_submit_preserves_inputs_and_creates_nothing ... ok +test behavior::topology::tests::unlinked_contributions_do_not_gain_fictional_edges ... ok +test behavior::topology::view::layout_tests::production_canvas_keyboard_and_delayed_tasks_respect_real_chooser_and_review_owners ... ok +test behavior::topology::view::layout_tests::production_process_caller_return_rejects_its_previous_camera_lifetime ... ok +test behavior::topology::view::layout_tests::production_process_camera_external_controls_bounds_and_retained_deltas_cancel_old_drags ... ok +test behavior::topology::view::layout_tests::production_process_canvas_focus_wheel_fit_and_stale_camera_are_presentation_only ... ok +test behavior::topology::view::layout_tests::production_process_canvas_scaled_path_creation_preserves_source_and_editor_bounds ... ok +test behavior::topology::view::layout_tests::production_process_form_replacement_resets_scroll_without_a_closed_render ... ok +test behavior::topology::view::layout_tests::production_process_keyboard_enters_activates_draws_focus_and_returns_to_inspector ... ok +test behavior::topology::view::layout_tests::production_process_keyboard_reveals_and_activates_initially_offscreen_last_tool ... ok +test behavior::topology::view::layout_tests::production_process_retained_toolbar_intents_reject_chooser_dirty_and_picker_lifetimes ... ok +test connection_edit::tests::cancel_navigation_revision_and_dirty_drafts_cannot_commit_a_stale_connection ... ok +test connection_edit::tests::visible_endpoint_drawing_commits_ports_and_exchange_once_with_exact_history ... ok +test connection_tool::tests::boundary_candidates_match_core_orientation_and_reject_same_owner_or_mixed_kind ... ok +test connection_tool::tests::boundary_feasibility_keeps_interface_warnings_and_final_carried_item_checks ... ok +test connection_tool::tests::boundary_feasibility_rejects_dangling_identity_in_a_malformed_element_map ... ok +test connection_tool::tests::direct_connections_share_exact_source_history_and_model_parity ... ok +test connection_tool::tests::explicit_function_ports_keep_owners_contracts_and_do_not_invent_carried_items ... ok +test connection_tool::tests::final_command_validation_rejects_invalid_models_without_mutation ... ok +test connection_tool::tests::function_cards_use_unique_reuse_and_atomic_generation_when_ambiguous ... ok +test connection_tool::tests::mismatched_port_owners_layers_and_contract_kinds_are_not_candidates ... ok +test connection_tool::tests::operational_communication_uses_participants_without_creating_ports ... ok +test connection_tool::tests::operational_interaction_targets_only_distinct_oa_activities ... ok +test context_menu::tests::a_new_context_token_cannot_reuse_the_previous_mouse_press_or_scroll ... ok +test context_menu::tests::actions_area_does_not_swallow_first_independent_click_after_overlay_consumed_its_release ... ok +test context_menu::tests::anchors_outside_the_window_and_nonfinite_input_stay_bounded ... ok +test context_menu::tests::clicking_disabled_or_dragging_off_an_action_never_executes_it ... ok +test context_menu::tests::coalesced_dismissal_release_does_not_swallow_the_next_independent_click ... ok +test context_menu::tests::empty_and_disabled_only_menus_still_capture_keys_and_escape_closes ... ok +test context_menu::tests::keyboard_skips_headers_separators_and_disabled_actions_and_invokes_once ... ok +test context_menu::tests::outside_dismissal_consumes_press_and_release_across_controlled_close ... ok +test context_menu::tests::reconstructed_overlay_uses_retained_layout_for_rows_and_hit_testing ... ok +test context_menu::tests::retained_overlay_layout_keeps_measured_width_and_scrollbar_after_reconstruction ... ok +test context_menu::tests::tall_menu_clamps_to_viewport_and_keyboard_wheel_and_scrollbar_reach_the_end ... ok +test data_values::tests::phase_choices_keep_reused_record_addresses_distinct ... ok +test data_values::tests::recursive_picker_starts_with_distinct_leaf_names_and_sorts_them ... ok +test data_values::tests::recursive_records_can_be_drilled_into_and_valid_imported_paths_resolve ... ok +test data_values::tests::reference_parameter_stops_descent_and_unspecified_direction_remains_visible ... ok +test data_values::tests::roots_and_one_hop_children_do_not_expand_unrelated_payload_branches ... ok +test data_view::tests::allocation_rows_edit_relationship_identity_and_remove_only_that_allocation ... ok +test data_view::tests::association_creation_is_a_separate_relation_with_editable_end_contracts ... ok +test data_view::tests::browsing_pages_preserves_invalid_numeric_draft_and_inherited_allocation_identity ... ok +test data_view::tests::contextual_data_actions_use_typed_defaults_and_one_undo ... ok +test data_view::tests::large_inherited_dictionary_has_bounded_widgets_and_every_original_field_is_reachable ... ok +test diagram::lifecycle_tests::menu_reset_and_draw_use_fresh_open_context ... ok +test diagram::lifecycle_tests::middle_and_arrow_panning_preserve_source_and_history ... ok +test diagram::lifecycle_tests::motion_after_release_must_not_move_clicked_port ... ok +test diagram::lifecycle_tests::motion_after_source_click_release_must_not_create_connection ... ok +test diagram::pointer_tests::coalesced_fe_ports_commit_once_through_app_and_source_history ... ok +test diagram::pointer_tests::coalesced_port_drag_commits_once_through_app_and_source_history ... ok +test diagram::pointer_tests::drag_from_already_selected_stationary_port_keeps_source_between_batches ... ok +test diagram::pointer_tests::menu_captured_motion_must_not_turn_following_click_into_old_port_drag ... ok +test diagram::pointer_tests::modal_and_stale_epoch_block_queued_connection_and_port_commits ... ok +test diagram::port_hit_tests::coincident_ports_keep_selection_then_use_stable_identity ... ok +test diagram::port_hit_tests::nearest_port_center_wins_on_all_borders_and_zoom_levels ... ok +test diagram::port_hit_tests::nested_owner_palette_selection_drag_and_context_menu_pick_the_same_port ... ok +test diagram::port_labels::tests::leaving_and_reentering_keeps_suppression_until_each_held_button_releases ... ok +test diagram::port_labels::tests::menu_epoch_clears_suppression_when_the_overlay_consumes_release ... ok +test diagram::port_labels::tests::outside_presses_do_not_suppress_and_cancel_or_focus_loss_clear_held_buttons ... ok +test diagram::port_labels::tests::passive_layer_leaves_port_drag_selection_and_commit_with_the_interactive_canvas ... ok +test diagram::tests::association_end_contracts_share_svg_geometry_and_select_without_moving_name_label ... ok +test diagram::tests::bend_gestures_use_screen_hit_radius_and_commit_one_undo_at_three_zooms ... ok +test diagram::tests::coincident_line_hit_retains_the_selected_connection ... ok +test diagram::tests::connection_gestures_pick_real_ports_and_commit_coalesced_drag_at_every_zoom ... ok +test diagram::tests::detached_label_selects_connection_and_occluding_card_owns_its_hit ... ok +test diagram::tests::dragging_a_child_previews_the_same_enclosure_and_ports_as_commit ... ok +test diagram::tests::fast_drags_commit_the_release_cursor_without_a_final_motion_event ... ok +test diagram::tests::implicit_port_click_selects_semantics_and_drag_preview_svg_share_anchors ... ok +test diagram::tests::route_cache_ignores_pan_zoom_and_cancelled_drag_cannot_commit ... ok +test diagram::tests::routed_svg_has_same_polyline_label_and_bounds_as_canvas_scene ... ok +test diagram::tests::svg_distinguishes_inferred_work_allocation_from_direct_allocation ... ok +test diagram::tests::svg_preserves_visible_exchange_labels_and_capability_stereotypes ... ok +test diagram::tests::typed_function_glyphs_and_unoriented_standard_connections_have_distinct_svg ... ok +test diagram::view_options_tests::communication_svg_uses_saved_visibility_labels_and_direction ... ok +test document::save_as_tests::save_as_preserves_explicit_source_entry_changes_in_history ... ok +test document::save_as_tests::save_as_rebases_uniform_history_without_an_undo_step_or_lost_redo ... ok +test document::save_as_tests::save_as_rejects_included_filename_collisions_in_past_and_future_without_mutation ... ok +test document::save_as_tests::save_as_rejects_stale_or_content_changing_receipt_atomically ... ok +test document::tests::accepted_history_keeps_the_latest_hundred_complete_snapshots ... ok +test document::tests::altered_compiled_model_or_index_is_rejected_without_mutation ... ok +test document::tests::asynchronous_save_marks_its_snapshot_without_cleaning_later_edits ... ok +test document::tests::byte_budget_trims_oldest_history_without_discarding_a_large_current ... ok +test document::tests::cached_view_index_tracks_accepted_creation_undo_and_redo ... ok +test document::tests::comment_and_semantic_history_restore_exact_bytes_and_branch_together ... ok +test document::tests::creation_selects_the_single_uuid_persisted_in_source ... ok +test document::tests::invalid_project_is_rejected_before_format_can_normalize_it ... ok +test document::tests::nested_cross_file_reparent_and_source_edit_share_exact_history ... ok +test document::tests::no_op_command_or_source_apply_preserves_history_revision_and_redo ... ok +test document::tests::omitted_id_stabilization_remains_dirty_until_exact_source_is_saved ... ok +test document::tests::recreated_equal_record_does_not_inherit_deleted_source_ownership ... ok +test document::tests::rejected_compile_command_and_writeback_preserve_state_and_redo ... ok +test explorer::tests::collapse_and_search_retain_context_without_changing_collapse_state ... ok +test explorer::tests::deep_containment_and_search_keep_the_full_path_without_recursion ... ok +test explorer::tests::equal_names_have_stable_alias_and_identity_tie_breakers ... ok +test explorer::tests::perspective_isolation_and_allocations_do_not_change_containment ... ok +test explorer::tests::prefix_names_cannot_separate_a_parent_from_its_children ... ok +test forms::data_fields::tests::defaults_distinguish_absent_empty_and_typed_literals_with_escaped_unicode ... ok +test forms::data_fields::tests::field_browser_pages_every_direct_field_without_flattening_other_records ... ok +test forms::data_fields::tests::independent_review_combined_take_type_informs_actual_default_form_in_both_directions ... ok +test forms::data_fields::tests::numeric_bound_drafts_keep_partial_and_full_precision_values_out_of_accepted_state ... ok +test forms::data_fields::tests::selecting_qualified_path_preserves_expression_typed_before_the_next_render ... ok +test forms::data_fields::tests::semantic_reference_choices_follow_selected_mechanism_and_revert_on_keep ... ok +test forms::data_fields::tests::supertype_picker_excludes_descendants_and_keeps_original_inherited_field_identity ... ok +test forms::history_fields::tests::history_absent_baseline_and_empty_history_use_explicit_facts_and_exact_document_history ... ok +test forms::history_fields::tests::history_clear_discards_inactive_invalid_constructors_before_reusing_the_same_row ... ok +test forms::history_fields::tests::history_compound_value_and_constructor_variants_are_editable_without_live_context ... ok +test forms::history_fields::tests::history_deleted_keys_and_observation_uuids_remain_exact_and_duplicate_history_rejects ... ok +test forms::history_fields::tests::history_every_descriptor_fact_choice_matches_actual_closed_types_and_source_contract ... ok +test forms::history_fields::tests::history_exact_strings_do_not_confuse_uuid_shaped_prose_or_literal_keys_with_references ... ok +test forms::history_fields::tests::history_invalid_numbers_survive_constructor_switch_reorder_removal_and_recovery ... ok +test forms::history_fields::tests::history_missing_semantic_field_can_be_added_and_removed_without_touching_prose_or_live_objects ... ok +test forms::history_fields::tests::history_nested_optional_number_events_switch_absent_present_and_recover_invalid_raw ... ok +test forms::history_fields::tests::history_nested_uuid_and_list_events_preserve_present_values_and_tagged_item_branches ... ok +test forms::history_fields::tests::history_optional_uuid_and_text_seed_absence_without_inventing_observations ... ok +test forms::history_fields::tests::history_primitive_type_choices_remain_visible_inside_the_tagged_union ... ok +test forms::history_fields::tests::history_retained_text_constructors_follow_exact_mode_without_changing_the_observation ... ok +test forms::port_fields::tests::all_demo_records_roundtrip_through_graphical_and_escaped_string_drafts ... ok +test forms::port_fields::tests::boundary_choices_honor_draft_direction_same_kind_and_direct_interface_items ... ok +test forms::port_fields::tests::contract_choices_follow_owner_and_never_offer_legacy_or_oa_typed_ports ... ok +test forms::port_fields::tests::failed_shape_keeps_incomplete_text_and_saved_contract_payloads ... ok +test forms::port_fields::tests::functional_endpoints_require_owner_direction_and_items_but_retain_bad_current_choice ... ok +test forms::port_fields::tests::interface_roles_offer_participants_and_component_ports_independent_of_orientation ... ok +test forms::port_fields::tests::port_allocation_choices_use_actual_owner_direction_and_ignore_edited_relation ... ok +test forms::port_fields::tests::standard_switch_retains_incompatible_orientation_until_explicit_repair ... ok +test forms::port_fields::tests::switching_function_direction_preserves_invalid_items_and_each_authored_payload ... ok +test forms::reference_chooser::tests::captured_choice_cannot_cross_document_revision_draft_record_or_array_path ... ok +test forms::reference_chooser::tests::catalog_search_disambiguates_repeated_names_containment_alias_and_exact_placement_identity ... ok +test forms::reference_chooser::tests::dismissal_swallows_matching_release_across_closed_rebuild_but_next_click_reaches_parent ... ok +test forms::reference_chooser::tests::empty_search_escape_tab_and_optional_clear_do_not_silently_choose_nil ... ok +test forms::reference_chooser::tests::historical_paths_never_open_and_only_explicit_choice_or_clear_is_a_write ... ok +test forms::reference_chooser::tests::mounted_clipboard_paste_and_ime_commit_preserve_whole_strings_without_selecting ... ok +test forms::reference_chooser::tests::mounted_filtered_row_click_uses_the_displayed_identity_and_scoped_write_intent ... ok +test forms::reference_chooser::tests::mounted_input_preserves_rapid_same_batch_typing_and_cursor_across_controlled_rebuilds ... ok +test forms::reference_chooser::tests::mounted_keyboard_pages_and_selects_only_the_highlighted_visible_candidate_once ... ok +test forms::reference_chooser::tests::mounted_overlay_clamps_at_three_field_positions_and_keeps_results_and_query_bounded ... ok +test forms::reference_chooser::tests::mounted_query_change_rejects_old_release_and_old_result_events_without_locking_popup ... ok +test forms::reference_chooser::tests::mounted_query_then_escape_in_one_batch_closes_and_relative_keys_keep_input_order ... ok +test forms::reference_chooser::tests::out_of_order_query_serials_cannot_restore_obsolete_results ... ok +test forms::tests::data_and_port_choices_are_typed_but_retain_invalid_current_values ... ok +test forms::tests::editing_allocation_offers_other_performers_without_counting_itself_twice ... ok +test forms::tests::moving_placement_and_changing_identity_is_one_lossless_undoable_edit ... ok +test forms::tests::parent_choices_reject_cycles_without_removing_clear_or_current_choice ... ok +test forms::tests::reply_and_reuse_forms_offer_semantically_compatible_references ... ok +test forms::tests::scenario_choices_respect_owner_and_exchange_layer ... ok +test forms::tests::semantic_port_group_choices_use_combined_owner_and_retain_invalid_transferred_items ... ok +test forms::tests::shared_perspective_change_keeps_payload_and_rejects_incompatible_dependencies ... ok +test forms::tests::state_observation_picker_keeps_work_lifelines_allocated_to_machine_owner ... ok +test forms::tests::state_placement_form_uses_draft_destination_membership_without_changing_other_views ... ok +test forms::tests::state_projection_form_keeps_string_variants_and_requires_a_typed_context ... ok +test forms::view_fields::tests::category_family_change_retains_members_until_explicit_correction ... ok +test forms::view_fields::tests::selective_view_property_apply_recovery_and_undo_preserve_semantics_and_empty_choices ... ok +test guide::tests::filtering_and_related_navigation_keep_selection_visible ... ok +test guide::tests::guide_topic_navigation_resets_only_article_and_same_topic_search_keeps_scroll ... ok +test guide::tests::search_finds_concepts_in_walkthroughs_and_api_reference ... ok +test home::tests::corrupt_future_and_oversized_history_are_preserved_with_usable_session_history ... ok +test home::tests::failed_metadata_replace_keeps_previous_history_and_reports_memory_only_entry ... ok +test home::tests::first_and_replaced_metadata_are_parseable_and_contain_no_model_bytes ... ok +test home::tests::forgotten_and_missing_files_never_change_the_model_or_other_entries ... ok +test home::tests::loading_missing_history_does_not_create_files_or_directories ... ok +test home::tests::malformed_entries_and_unknown_fields_never_become_open_requests ... ok +test home::tests::successful_local_history_is_bounded_ordered_deduplicated_and_durable ... ok +test home::tests::unavailable_location_can_reappear_on_refresh_without_losing_identity ... ok +test home::tests::walkthrough_uses_packaged_bundle_before_development_and_reports_missing_assets ... ok +test hosted::client::tests::hosted_endpoint_validation_redacts_secrets_and_preserves_proxy_paths ... ok +test hosted::client::tests::hosted_lost_publication_response_is_uncertain_without_retry ... ok +test hosted::client::tests::hosted_open_rejects_incoherent_envelopes_missing_etags_and_unstable_ids ... ok +test hosted::client::tests::hosted_oversized_local_bundle_is_rejected_before_network_admission ... ok +test hosted::client::tests::hosted_production_auth_proxy_prefix_and_located_rejection ... ok +test hosted::client::tests::hosted_production_roundtrip_preserves_comments_noops_and_conflicts ... ok +test hosted::client::tests::hosted_publication_race_keeps_receipt_identity_for_review ... ok +test hosted::client::tests::hosted_publication_retains_known_resource_after_failed_followup ... ok +test hosted::client::tests::hosted_put_preserves_an_opaque_etag_and_compiles_the_accepted_bundle ... ok +test hosted::client::tests::hosted_redirect_is_not_followed_or_retried_and_problem_tokens_are_redacted ... ok +test hosted::client::tests::hosted_response_limits_cover_declared_and_chunked_bodies ... ok +test hosted::client::tests::hosted_structured_mutation_failures_distinguish_precommit_rejections ... ok +test hosted::client::tests::hosted_timeout_and_disconnect_leave_mutation_outcomes_explicit ... ok +test model_menu::tests::add_bend_here_uses_context_point_and_one_source_aware_history_change ... ok +test model_menu::tests::late_menu_actions_do_not_dismiss_new_menu_or_cross_view_context ... ok +test model_menu::tests::menu_preserves_pending_properties_and_rejects_delayed_mutations ... ok +test model_menu::tests::pending_source_allows_file_navigation_but_disables_model_actions ... ok +test model_menu::tests::right_click_targets_actor_without_changing_selection_until_action ... ok +test model_menu::tests::show_from_explorer_places_unfolds_and_keeps_semantic_selection ... ok +test model_menu::tests::state_menu_folds_and_hides_only_its_captured_placement_and_rejects_stale_views ... ok +test model_menu::tests::state_menu_keeps_typed_creation_reachable_and_preserves_pending_properties ... ok +test navigation::tests::semantic_browser_finds_behavior_users_without_confusing_containment ... ok +test port_edit::tests::all_border_drags_commit_exact_preview_and_restore_automatic_anchors_in_history ... ok +test port_edit::tests::graphical_port_reparent_clears_old_anchors_in_the_same_history_operation ... ok +test port_preview::tests::functional_creation_identifies_new_and_reused_endpoints_and_owners ... ok +test port_preview::tests::legacy_split_discloses_endpoint_routing_item_origins_and_retained_evidence ... ok +test port_preview::tests::reused_boundary_shows_item_union_and_existing_allocating_facts ... ok +test port_preview::tests::synchronization_preview_exposes_contract_shrinkage_and_current_declaration_origin ... ok +test port_workflow::recovery_tests::port_recovery_retains_authored_contract_and_identity_but_rebuilds_preview ... ok +test port_workflow::tests::creating_typed_port_and_rejecting_stale_preview_preserve_drafts_and_identity ... ok +test port_workflow::tests::graphical_function_exchange_and_component_generation_commit_and_undo_whole_contracts ... ok +test port_workflow::tests::legacy_resolution_preserves_original_record_and_applies_as_one_undo ... ok +test port_workflow::tests::port_creation_keeps_owner_diagram_and_unfolds_in_the_same_undo ... ok +test port_workflow::tests::synchronization_uses_active_contract_instead_of_preserved_direction ... ok +test recovery::source5::tests::source5_fingerprint_preserves_historical_field_order_and_diagram_shape ... ok +test recovery::source5_tests::source4_checkpoint_remains_explicitly_unsupported_without_touching_disk ... ok +test recovery::source5_tests::source5_checkpoint_does_not_refresh_unrelated_clean_buffer_baseline ... ok +test recovery::source5_tests::source5_checkpoint_missing_identity_is_not_a_lossless_upgrade ... ok +test recovery::source5_tests::source5_checkpoint_old_diagram_property_shape_remains_editable ... ok +test recovery::source5_tests::source5_checkpoint_port_draft_replans_and_rejects_stale_base ... ok +test recovery::source5_tests::source5_checkpoint_preserves_dirty_invalid_text_and_baseline_exactly ... ok +test recovery::source5_tests::source5_checkpoint_preserves_distinct_unapplied_open_workspace ... ok +test recovery::source5_tests::source5_checkpoint_property_preserves_invalid_raw_input ... ok +test recovery::source5_tests::source5_checkpoint_upgrade_never_rewrites_checkpoint_or_origin ... ok +test recovery::source5_tests::source5_checkpoint_upgrades_only_header_and_clean_editor_baseline ... ok +test recovery::source5_tests::source5_checkpoint_workflow_rebinds_only_the_proven_old_revision ... ok +test recovery::source7_tests::source7_current_combined_contextual_and_operation_drafts_survive_without_execution ... ok +test recovery::source7_tests::source7_explicit_new_fields_cannot_enter_frozen_old_model_profiles ... ok +test recovery::source7_tests::source7_legacy_inactive_constructor_path_is_structural_but_raw_prose_is_not ... ok +test recovery::source7_tests::source7_legacy_profile_workflow_and_semantic_drafts_replan_with_exact_base ... ok +test recovery::source7_tests::source7_legacy_profiles_preserve_dirty_source_property_and_behavior_raw_fields ... ok +test recovery::source7_tests::source7_legacy_structural_intent_rejects_even_null_but_never_scans_raw_strings ... ok +test recovery::source7_tests::source7_legacy_view_selector_refuses_new_relation_kind_without_rewriting_checkpoint ... ok +test recovery::source7_tests::source7_recovers_nonempty_frozen_5_and_6_profiles_with_exact_historical_binding ... ok +test recovery::tests::altered_accepted_identity_and_unrecognized_raw_property_fields_reject ... ok +test recovery::tests::exact_source_and_unfinished_invalid_buffers_restore_without_model_overwrite ... ok +test recovery::tests::excess_retained_buffers_cannot_replace_the_last_recoverable_checkpoint ... ok +test recovery::tests::invalid_open_retains_distinct_accepted_model_and_repair_workspace ... ok +test recovery::tests::missing_includes_remain_reachable_repair_targets_without_fabricated_buffers ... ok +test recovery::tests::multiple_sessions_replace_only_their_own_checkpoint_and_corruption_is_retained ... ok +test recovery::tests::raw_invalid_property_number_survives_and_stays_rejected_until_repaired ... ok +test semantic_review::artifacts_recovery_falsifier_tests::forged_artifact_draft_cannot_target_an_unreserved_or_non_artifact_identity ... ok +test semantic_review::artifacts_recovery_falsifier_tests::forged_artifact_raw_variants_duplicate_addresses_and_unknown_fields_are_refused ... ok +test semantic_review::artifacts_recovery_falsifier_tests::forged_artifact_reservations_cannot_duplicate_or_claim_an_existing_identity_or_another_owner ... ok +test semantic_review::artifacts_recovery_falsifier_tests::legitimate_invalid_artifact_checkpoint_round_trips_and_prepares_only_after_explicit_repair ... ok +test semantic_review::artifacts_tests::artifact_candidate_is_a_complete_record_not_a_tombstone_or_unattached_creation_shortcut ... ok +test semantic_review::artifacts_tests::artifact_creation_and_identified_source_deletion_follow_core_metadata_and_history_boundary_both_directions ... ok +test semantic_review::artifacts_tests::artifact_gui_reserves_recovers_and_creates_only_after_all_seven_metadata_reviews_both_directions ... ok +test semantic_review::artifacts_tests::artifact_metadata_apply_and_exact_history_reset_are_one_source_preserving_undo_redo ... ok +test semantic_review::artifacts_tests::artifact_move_metadata_none_empty_and_invalid_raw_recovery_are_independent_both_directions ... ok +test semantic_review::artifacts_tests::artifact_moved_source_absence_deletes_but_destination_only_take_retains_both_directions ... ok +test semantic_review::attachments::tests::absent_attachment_payloads_migrate_v1_and_v2_and_source5_upgrade_requires_exact_legacy_base ... ok +test semantic_review::attachments::tests::addressed_attachment_candidates_equal_direct_core_oracle_both_directions ... ok +test semantic_review::attachments::tests::attachment_apply_is_one_exact_source_and_history_undo_redo ... ok +test semantic_review::attachments::tests::attachment_candidate_and_direct_record_keep_conflict_on_actual_slot_without_losing_drafts ... ok +test semantic_review::attachments::tests::attachment_pair_drafts_survive_family_switch_and_restore_without_mutating_model ... ok +test semantic_review::attachments::tests::functional_incident_source_requires_explicit_matching_port_review_in_one_atomic_candidate ... ok +test semantic_review::attachments::tests::parent_and_each_endpoint_candidate_preserve_other_fields_and_match_core_both_directions ... ok +test semantic_review::attachments::tests::raw_rejected_attachment_reference_survives_recovery_and_wrong_scope_is_rejected ... ok +test semantic_review::attachments::tests::source_only_absence_and_explicit_absent_endpoint_are_different ... ok +test semantic_review::attachments::tests::two_incident_endpoint_candidates_form_one_complete_record_and_recover_invalid_excluded_draft ... ok +test semantic_review::batch_tests::batch_apply_is_one_exact_source_and_history_undo_redo_roundtrip ... ok +test semantic_review::batch_tests::batch_candidate_conflict_keeps_both_raw_values_and_keep_is_a_real_constraint ... ok +test semantic_review::batch_tests::batch_complete_constructor_cannot_erase_another_rows_new_literal ... ok +test semantic_review::batch_tests::batch_constructor_retirement_conflicts_with_another_rows_kept_bound_in_both_orders ... ok +test semantic_review::batch_tests::batch_delayed_text_targets_its_original_row_and_facet_without_switching_focus ... ok +test semantic_review::batch_tests::batch_excluded_invalid_row_survives_focus_reopen_and_v2_recovery ... ok +test semantic_review::batch_tests::batch_first_equal_constructor_acknowledgement_allows_an_independent_bound ... ok +test semantic_review::batch_tests::batch_joint_bounds_use_one_candidate_and_match_an_independent_atomic_core_oracle ... ok +test semantic_review::batch_tests::batch_reverse_distinct_targets_work_and_reverse_convergence_is_explicit ... ok +test semantic_review::batch_tests::batch_v2_rejects_duplicate_included_sources_bad_addresses_and_stale_model ... ok +test semantic_review::batch_tests::category_family_and_members_are_independent_core_checked_facets_both_directions ... ok +test semantic_review::batch_tests::recovered_trace_picker_names_existing_trace_instead_of_deleted_reference ... ok +test semantic_review::batch_tests::rejected_direction_switch_at_row_limit_preserves_every_recoverable_draft ... ok +test semantic_review::compose::diagnostic_tests::distinct_review_conflict_keeps_trace_aliases_even_when_names_are_equal ... ok +test semantic_review::compose::diagnostic_tests::reserved_creation_conflict_uses_its_rows_seed_instead_of_a_deleted_reference ... ok +test semantic_review::compose::diagnostic_tests::same_review_presence_and_owner_conflict_names_both_facets_and_owners_and_retains_drafts ... ok +test semantic_review::compose::diagnostic_tests::typed_owner_display_does_not_reinterpret_uuid_shaped_artifact_text ... ok +test semantic_review::constructor_tests::closed_data_and_event_take_composition_matches_core_across_every_kind_pair_and_direction ... ok +test semantic_review::constructor_tests::data_group_candidates_cover_every_definition_and_companion_default_both_directions ... ok +test semantic_review::constructor_tests::data_group_retains_invalid_sibling_drafts_companion_default_and_variant_editor_buffers ... ok +test semantic_review::constructor_tests::exchange_constructor_takes_qualified_annotation_addresses_without_remapping_expression_text ... ok +test semantic_review::constructor_tests::existing_fragment_and_branch_group_candidates_edit_complete_owned_order_without_deletion ... ok +test semantic_review::constructor_tests::group_take_reference_payload_and_scalar_candidate_match_core_and_one_document_batch ... ok +test semantic_review::constructor_tests::historical_event_keep_retires_only_obsolete_branch_and_unchanged_kind_acknowledges_no_payload ... ok +test semantic_review::constructor_tests::historical_same_kind_take_preserves_target_only_literals_when_composed_with_candidate ... ok +test semantic_review::constructor_tests::occurrence_and_event_candidate_variants_cover_closed_families_without_touching_headers ... ok +test semantic_review::constructor_tests::outer_and_nested_constructor_candidates_require_explicit_resolution_and_retain_both_drafts ... ok +test semantic_review::constructor_tests::port_group_companions_typed_owner_context_and_direction_restrictions_are_explicit ... ok +test semantic_review::constructor_tests::reverse_existing_typed_port_reviews_keep_or_candidate_legacy_without_permitting_typed_oa_write ... ok +test semantic_review::constructor_tests::scenario_use_group_takes_typed_binding_references_and_preserves_source_text_both_directions ... ok +test semantic_review::keyed_rows_tests::annotation_address_browser_descends_qualified_fields_without_changing_rows ... ok +test semantic_review::keyed_rows_tests::annotation_observations_keep_uuid_shaped_expression_text_in_both_sides_and_history ... ok +test semantic_review::keyed_rows_tests::batch_keyed_rows_compare_exact_target_slots_and_retain_independent_values ... ok +test semantic_review::keyed_rows_tests::binding_choices_separate_reused_keys_from_local_lifelines ... ok +test semantic_review::keyed_rows_tests::binding_local_picker_follows_a_candidate_parent_before_the_review_is_valid ... ok +test semantic_review::keyed_rows_tests::binding_take_requires_local_correspondence_and_candidate_rejects_wrong_scenario ... ok +test semantic_review::keyed_rows_tests::independent_rows_keep_take_candidate_match_core_and_preserve_siblings_both_directions ... ok +test semantic_review::keyed_rows_tests::keyed_recovery_retains_raw_rows_and_staged_pairs_both_directions_without_applying ... ok +test semantic_review::keyed_rows_tests::keyed_row_drafts_retain_expression_local_and_presence_across_decisions_and_staging ... ok +test semantic_review::keyed_rows_tests::keyed_rows_distinguish_unpaired_source_from_explicit_absence_and_require_exact_reset ... ok +test semantic_review::keyed_rows_tests::multiple_new_rows_compose_in_empty_collections_using_destination_key_order ... ok +test semantic_review::keyed_rows_tests::row_review_apply_preserves_exact_source_and_semantic_history_through_undo_redo ... ok +test semantic_review::keyed_tests::deleted_member_source_observation_removes_only_mapped_membership_both_directions ... ok +test semantic_review::keyed_tests::exact_literal_new_rows_and_removals_commit_both_directions_without_default_loss ... ok +test semantic_review::keyed_tests::exact_reset_only_is_one_history_source_transaction_and_undo_redo_both_directions ... ok +test semantic_review::keyed_tests::function_port_members_use_existing_typed_choices_and_preserve_oa_legacy ... ok +test semantic_review::keyed_tests::historical_one_sided_pair_migration_requires_exact_reset_and_explicit_overlap_resolution ... ok +test semantic_review::keyed_tests::invalid_literal_removal_and_unselected_scalar_buffers_are_retained_and_repairable ... ok +test semantic_review::keyed_tests::member_identity_labels_and_new_tabs_preserve_exact_names_and_deleted_keys ... ok +test semantic_review::keyed_tests::reset_precedes_equal_constructor_candidate_and_preserves_independent_literal_draft ... ok +test semantic_review::keyed_tests::staging_removal_and_obsolete_reset_recovery_keep_other_decisions_and_raw_presence ... ok +test semantic_review::keyed_tests::stale_or_source_failed_reset_and_membership_apply_retain_exact_choices ... ok +test semantic_review::keyed_tests::unordered_members_keep_take_candidate_preserve_other_rows_both_directions ... ok +test semantic_review::keyed_tests::unsupported_independent_families_and_missing_identities_do_not_gain_edit_authority ... ok +test semantic_review::message_kind_tests::message_group_candidate_closed_kinds_are_core_validated_in_both_directions ... ok +test semantic_review::message_kind_tests::message_group_candidate_timer_switches_preserve_both_drafts_and_overlap_is_explicit ... ok +test semantic_review::message_kind_tests::message_group_initial_equal_take_acknowledges_only_kind_and_checks_authored_timer_agreement ... ok +test semantic_review::message_kind_tests::message_group_keep_historical_switch_retires_timer_and_completed_no_switch_rejects ... ok +test semantic_review::message_kind_tests::message_group_rejects_protected_edits_stale_plan_and_source_failure_without_losing_timer ... ok +test semantic_review::message_kind_tests::message_group_reply_and_reference_take_require_explicit_call_mapping_both_directions ... ok +test semantic_review::message_kind_tests::message_group_take_full_timer_and_scalar_candidate_are_one_source_history_change_both_directions ... ok +test semantic_review::message_kind_tests::message_group_timer_does_not_erase_exchange_without_its_own_selected_decision ... ok +test semantic_review::ordered_tests::ambiguous_order_preserves_local_member_and_requires_explicit_candidate_positions ... ok +test semantic_review::ordered_tests::historical_pair_restore_uses_exact_member_keys_and_never_zips_order_observations ... ok +test semantic_review::ordered_tests::order_take_preserves_destination_only_positions_and_order_alone_cannot_add_members ... ok +test semantic_review::ordered_tests::ordered_membership_choices_stage_exact_pairs_in_all_owner_shapes ... ok +test semantic_review::ordered_tests::ordered_presence_keep_take_candidate_remove_only_selected_entry_and_order_take_reorders_only ... ok +test semantic_review::ordered_tests::ordered_review_apply_is_exact_source_history_transaction_with_reopen_and_undo_redo ... ok +test semantic_review::ordered_tests::ordered_take_uses_unique_anchors_and_matches_core_with_unrelated_candidate_both_directions ... ok +test semantic_review::ordered_tests::raw_order_survives_membership_changes_decisions_and_recovery_until_explicit_reconcile ... ok +test semantic_review::ordered_tests::several_incoming_members_follow_source_order_despite_independent_identity_sorting ... ok +test semantic_review::recovery::tests::raw_scalar_and_closed_constructor_drafts_recover_against_exact_model_only ... ok +test semantic_review::recovery::tests::version_one_without_orders_restores_raw_intent_and_replans_without_execution ... ok +test semantic_review::source7_tests::contextual_incident_leaf_keep_allows_path_change_but_conflicts_with_changed_leaf_both_directions ... ok +test semantic_review::source7_tests::reverse_operation_omission_gui_requires_raw_rationale_and_matches_one_core_batch_after_recovery ... ok +test semantic_review::source7_tests::semantic_operation_virtual_none_candidate_uses_exact_allocation_and_preserves_accepted_bytes ... ok +test semantic_review::tests::candidate_mixed_with_reference_take_uses_typed_correspondence_not_text_guessing ... ok +test semantic_review::tests::deselected_invalid_candidate_is_retained_but_does_not_poison_another_selected_scalar ... ok +test semantic_review::tests::explicit_trace_selection_updates_only_that_history ... ok +test semantic_review::tests::first_equal_constructor_acknowledges_only_kind_and_allows_independent_leaves ... ok +test semantic_review::tests::independent_review_clear_bound_ignores_retained_invalid_other_facet ... ok +test semantic_review::tests::independent_review_keyed_fact_titles_keep_live_deleted_and_qualified_identity ... ok +test semantic_review::tests::inherited_annotation_impact_requires_exact_acceptance_and_edits_clear_approval ... ok +test semantic_review::tests::invalid_numeric_draft_and_protected_edits_retain_workflow_and_source ... ok +test semantic_review::tests::read_only_structured_facts_and_partial_rollup_are_honest ... ok +test semantic_review::tests::relation_candidates_preserve_endpoints_and_combine_selected_roles_and_bounds ... ok +test semantic_review::tests::scalar_keep_take_candidate_commit_exact_source_and_history_in_both_directions ... ok +test semantic_review::tests::scoped_literal_list_edits_preserve_unfinished_values_and_other_facet_buffers ... ok +test semantic_review::tests::stale_plan_and_source_writeback_failure_do_not_lose_decisions_or_history ... ok +test semantic_review::tests::state_kind_scalar_uses_typed_candidate_and_core_validation ... ok +test semantic_review::view::reserved_artifact_tests::reserved_artifact_facet_and_reference_labels_survive_recovery_without_calling_it_deleted ... ok +test source_navigation::tests::search_uses_utf8_columns_wraps_and_refreshes_after_edits ... ok +test source_tree::tests::active_scroll_offset_uses_the_visible_order_and_retains_ancestor_context ... ok +test source_tree::tests::collapsed_folders_retain_active_dirty_and_diagnostic_markers ... ok +test source_tree::tests::deep_paths_build_expand_and_drop_on_a_small_stack ... ok +test source_tree::tests::detached_buffers_keep_paths_and_only_clean_buffers_are_closable ... ok +test source_tree::tests::exact_unicode_spaces_and_file_folder_name_collisions_are_not_normalized ... ok +test source_tree::tests::folders_are_compact_and_sorted_before_files_without_losing_duplicate_basenames ... ok +test source_workspace::tests::draft_history_budget_covers_inactive_files_without_discarding_drafts ... ok +test source_workspace::tests::switching_retains_invalid_drafts_and_independent_history ... ok +test tests::actor_port_creation_updates_containment_and_locate_reveals_its_owner ... ok +test tests::adding_bend_between_close_ports_stays_outside_owner_clearance ... ok +test tests::behavior_and_data_authoring_do_not_place_nodes_in_unrelated_architecture_views ... ok +test tests::bidirectional_transition_ui_commits_once_and_preserves_other_diagrams ... ok +test tests::counterpart_creation_focuses_visible_target_and_reuse_keeps_views ... ok +test tests::creation_from_capabilities_routes_work_to_architecture_and_folded_allocation_inserts_below_existing_work ... ok +test tests::dragging_keeps_semantic_selection_and_same_node_remains_editable ... ok +test tests::escaped_string_mode_preserves_exact_control_characters ... ok +test tests::every_demo_record_has_a_lossless_graphical_draft ... ok +test tests::explicit_relationship_builder_never_mutates_on_preview ... ok +test tests::explorer_and_creation_selection_follow_their_own_placement ... ok +test tests::fit_adapts_to_canvas_returning_after_help_but_preserves_manual_navigation ... ok +test tests::fit_uses_measured_canvas_bounds_and_preserves_them_on_open ... ok +test tests::focused_explorer_follows_reparenting_without_changing_identity ... ok +test tests::graphical_rename_keeps_aliases_and_references_and_undo ... ok +test tests::identity_property_change_is_atomic_and_rewrites_all_live_references ... ok +test tests::invalid_numeric_draft_survives_navigation_save_and_help ... ok +test tests::invalid_save_and_continue_returns_to_repairable_draft ... ok +test tests::malformed_source_preserves_model_and_is_recoverable ... ok +test tests::manual_trace_requires_target_and_selection_normalizes_creation_kind ... ok +test tests::mission_capability_authoring_is_contextual_atomic_and_text_equivalent ... ok +test tests::modal_owns_background_commands_and_shortcuts ... ok +test tests::nested_allocation_insertion_reflows_sibling_subtrees_and_preserves_fold_state ... ok +test tests::opening_and_creating_models_preserve_the_actual_window_size_for_fit ... ok +test tests::opening_legacy_source_surfaces_report_without_modifying_original_bytes ... ok +test tests::pending_source_prevents_property_draft_collision_and_preserves_both_if_present ... ok +test tests::placement_identity_edit_then_drag_and_diagram_identity_then_arrange ... ok +test tests::placement_relocation_follows_cross_layer_traceability_view ... ok +test tests::property_enum_and_optional_reference_roundtrip ... ok +test tests::reopening_canvas_for_a_modal_preserves_viewport_after_route_edits ... ok +test tests::revealing_an_implicit_function_port_unfolds_its_visible_architecture_owner ... ok +test tests::routing_actions_are_atomic_guarded_and_fit_the_authored_detour ... ok +test tests::selecting_current_constructors_preserves_payloads ... ok +test tests::source_find_navigates_an_invalid_draft_without_applying_or_losing_it ... ok +test tests::source_navigation_waits_for_editor_layout_and_cancels_on_edit ... ok +test tests::system_only_models_open_the_populated_perspective ... ok +test tests::transition_resolutions_belong_to_the_effective_target_and_kind ... ok +test view_copy::tests::duplicate_retains_ports_routes_options_and_artifact_claims_with_exact_undo_redo ... ok +test view_copy::tests::duplicate_state_view_preserves_machine_nesting_and_collapse_with_unique_aliases ... ok +test view_copy::tests::missing_view_does_not_propose_an_empty_replacement ... ok +test views::traceability::tests::traceability_browsing_retains_invalid_property_draft_and_existing_select_guard ... ok +test views::traceability::tests::traceability_filter_reaches_artifacts_after_68_traces_and_searches_all_metadata ... ok +test workflow::communication::tests::communication_requires_two_explicit_ports_and_recovers_the_partial_choice ... ok +test workflow::port_authoring_tests::boundary_picker_matches_exact_commands_across_contracts_and_ownership ... ok +test workflow::port_authoring_tests::boundary_picker_recomputes_for_unoriented_reverse_endpoints_without_relaxing_contracts ... ok +test workflow::port_authoring_tests::duplicate_port_names_show_owner_contract_and_unique_alias ... ok +test workflow::port_authoring_tests::fresh_functions_are_actual_picker_targets_and_plan_enables_apply ... ok +test workflow::port_authoring_tests::generic_component_port_connection_keeps_its_endpoint_and_direction ... ok +test workflow::port_authoring_tests::ordinary_standard_connections_default_unoriented_and_new_roles_exclude_legacy ... ok +test workflow::recovery::tests::incomplete_relationship_and_trace_recover_raw_fields_and_reject_changed_model ... ok +test workflow::recovery::tests::transition_recovery_replans_typed_request_without_persisted_commands ... ok +test workflow::transition_tests::basic_transition_boundary_choice_is_required_without_an_inferred_system ... ok +test workflow::transition_tests::basic_transition_creates_overview_when_existing_views_cannot_show_result ... ok +test workflow::transition_tests::basic_transition_explicit_destination_appends_below_existing_bounds_and_is_one_source_edit ... ok +test workflow::transition_tests::basic_transition_invalid_explicit_destination_retains_choice_and_refuses ... ok +test workflow::transition_tests::basic_transition_reconcile_keeps_existing_selected_view_placement_and_route_exact ... ok +test workflow::transition_tests::basic_transition_skips_lowest_uuid_state_view_and_preserves_oa ... ok + +test result: ok. 836 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1793.80s + diff --git a/harness/experiments/diagram-removal-windows-20260912/full-d61f1f3.result.json b/harness/experiments/diagram-removal-windows-20260912/full-d61f1f3.result.json new file mode 100644 index 00000000..5a9fdd8a --- /dev/null +++ b/harness/experiments/diagram-removal-windows-20260912/full-d61f1f3.result.json @@ -0,0 +1,19 @@ +{ + "source": "d61f1f38779ab70a77efcde523ae31c432aefcfd", + "start": "2026-09-12T23:00:48.242126+00:00", + "end": "2026-09-12T23:39:26.440552+00:00", + "exit": 0, + "command": [ + "cargo", + "test", + "--locked", + "-p", + "oa-desktop", + "--bin", + "arcadia-studio", + "--", + "--test-threads=1" + ], + "inputs": "full-d61f1f3.inputs.json", + "changed_inputs": [] +} diff --git a/harness/experiments/diagram-removal-windows-20260912/gui-d61f1f3.inputs.json b/harness/experiments/diagram-removal-windows-20260912/gui-d61f1f3.inputs.json new file mode 100644 index 00000000..0bb4c429 --- /dev/null +++ b/harness/experiments/diagram-removal-windows-20260912/gui-d61f1f3.inputs.json @@ -0,0 +1,2670 @@ +{ + "source": "d61f1f38779ab70a77efcde523ae31c432aefcfd", + "inputs": [ + { + "path": "Cargo.lock", + "bytes": 119973, + "sha256": "065c23c94908fe499d32ed91d55a70946ed5b08ecfda3b483ec1e635572257bf" + }, + { + "path": "Cargo.toml", + "bytes": 400, + "sha256": "369f5b4b2b60705a94623c8c0b68f8e0b048f263280ce07ae0629ad353797d62" + }, + { + "path": "build/windows.manifest", + "bytes": 354, + "sha256": "9c19c5a02f858ece84c44839ad2b145d9c1d90442da0b15c87fd045f975974eb" + }, + { + "path": "build/windows.rc", + "bytes": 24, + "sha256": "a27385edcae0bcf96f55361056cb7be5f36d76fcddcaefd20647c91959563e1e" + }, + { + "path": "build/windows_manifest.rs", + "bytes": 1460, + "sha256": "168da2c42ecccfebc11ee3e1b455e653a68fe9c6d30a9842a8b9e7441d086c80" + }, + { + "path": "crates/oa-cli/Cargo.toml", + "bytes": 279, + "sha256": "49c567f1af74a826683b4d96845feb3806fd9bcb7dc2767e16b5509d4e5e1cde" + }, + { + "path": "crates/oa-cli/src/lib.rs", + "bytes": 15498, + "sha256": "97bebab63b4a611a1d36ad0c20fe452cbe1985fe3a6fbd39c954603da11410fc" + }, + { + "path": "crates/oa-cli/src/main.rs", + "bytes": 2984, + "sha256": "de964f9b6c59c0f31c080afbd3b31d442b07b1b44f6a187a248d3409c45d35fb" + }, + { + "path": "crates/oa-cli/tests/source_cli.rs", + "bytes": 16600, + "sha256": "a3a1b856c7a9fd3d80bc8074150a24fbb0ef0e9ddf736c7cea036725fc3dc2b8" + }, + { + "path": "crates/oa-core/Cargo.toml", + "bytes": 408, + "sha256": "6b5c062474ebb62d5082e07dabed99ee85e4a833edf26690fb4f887028d3416f" + }, + { + "path": "crates/oa-core/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-core/examples/generate_demo.rs", + "bytes": 795, + "sha256": "e26f432c95331aeca50985dbb3ad2c558affd43023b585811f0f7bfaa59f6661" + }, + { + "path": "crates/oa-core/examples/generate_release1.rs", + "bytes": 1798, + "sha256": "1d5f11165d74893e4bc18dbf3a2f2111f4026bd89fd06ee7f0bae69e45c4d4b5" + }, + { + "path": "crates/oa-core/examples/release_dense_views.rs", + "bytes": 14664, + "sha256": "a83158488ef9b7394f136c52b1496719be935c4e5bdfe457cab5c9894f5f9412" + }, + { + "path": "crates/oa-core/examples/routing_workshop.rs", + "bytes": 17248, + "sha256": "571307b18b6d4fa04700c5a4d4b0c2154c419e93a21292b2028e7b6f46a2faa7" + }, + { + "path": "crates/oa-core/src/analysis_numeric.rs", + "bytes": 3735, + "sha256": "6c88eef3119162aeb6c07b9e75812c3af9fbfe75554b0503ad00f103cb478408" + }, + { + "path": "crates/oa-core/src/analysis_numeric/dimension.rs", + "bytes": 3045, + "sha256": "d4ad8e5307a1620e31791d724a0e31fdba860d00dc83e3e1f2209d9c5e22a340" + }, + { + "path": "crates/oa-core/src/analysis_numeric/exact.rs", + "bytes": 17338, + "sha256": "4eb8cb0f66b10e5da204899af82ee26adfec74bab47b1a6c9842b5488ee04c4d" + }, + { + "path": "crates/oa-core/src/analysis_numeric/fixtures/r7-literal-boundaries.json", + "bytes": 6085, + "sha256": "3b959dec5e100a6f03817f5314bef497347ba579ebd235476516d4bd83399181" + }, + { + "path": "crates/oa-core/src/analysis_numeric/meter.rs", + "bytes": 7129, + "sha256": "1f7174beb992935b4c399acdef91114af73faf041070feab968455ac827e8ee4" + }, + { + "path": "crates/oa-core/src/analysis_numeric/quantity.rs", + "bytes": 12257, + "sha256": "ead5142d6eeea8f99399d57e02d8f7d819980923de76387cd454694d6a747aee" + }, + { + "path": "crates/oa-core/src/analysis_numeric/tests.rs", + "bytes": 27486, + "sha256": "323ce82fc057d36f44463569fd8ea324c7d700fddfbf32bce15e04bd2a66970b" + }, + { + "path": "crates/oa-core/src/data.rs", + "bytes": 42696, + "sha256": "7f9c7c7dd8353cb5a38597b92cde6d3e890203d392473187eb387d41ff37414a" + }, + { + "path": "crates/oa-core/src/demo.rs", + "bytes": 20657, + "sha256": "ad62123f96c20ff023cafc1a9849b0fa06bc62edd1fb9701799e4599b458600c" + }, + { + "path": "crates/oa-core/src/language.rs", + "bytes": 99938, + "sha256": "638f08a42e9cf4996b5d07f69b4d6f517a518369f3604d25be1006e40e080765" + }, + { + "path": "crates/oa-core/src/language/semantic_source.rs", + "bytes": 7326, + "sha256": "584b5bb59d87a7b8d44d5dd2d124c3a1323b21492b138a17bc9526c0087c9e29" + }, + { + "path": "crates/oa-core/src/language_nesting_tests.rs", + "bytes": 20639, + "sha256": "bd061611e8cb6f28ab203c73e544ac98bf275eb464cd314ad5fbd25f773df33b" + }, + { + "path": "crates/oa-core/src/lib.rs", + "bytes": 549, + "sha256": "ea1d9bf5acba8381ba204db12ff5b5fe1f320417d17af517e46b90fd6bcb241c" + }, + { + "path": "crates/oa-core/src/migration_v2/README.md", + "bytes": 1515, + "sha256": "fb61d3faa33d7bdfba73415415a0882c0fbd3e0b45df42f972a19aec6da927b9" + }, + { + "path": "crates/oa-core/src/migration_v2/adapter.rs", + "bytes": 9490, + "sha256": "66741b4c8354a23b8a932ecc5bf1bc3bb6e74279558757b8c35bc2157a7e51b5" + }, + { + "path": "crates/oa-core/src/migration_v2/mod.rs", + "bytes": 1158, + "sha256": "857d8bb13b6814daba6780ca770c16352943c01cb130245d055f11b3b957b3e9" + }, + { + "path": "crates/oa-core/src/migration_v2/model.rs", + "bytes": 52059, + "sha256": "8ac63eb59b2e57bdecff2477ee0634096090924d3dd1851e1c454880a889dacb" + }, + { + "path": "crates/oa-core/src/migration_v2/references.rs", + "bytes": 13369, + "sha256": "33a6819abc83139fdaebeebd1b553238a328637106cce7dd5a535f1791d43e20" + }, + { + "path": "crates/oa-core/src/migration_v2/source.rs", + "bytes": 21946, + "sha256": "74fee9b24e7c912182c998ab9d9aeec125e2009c3214959229e844c67afe2bf6" + }, + { + "path": "crates/oa-core/src/migration_v2/state_validation.rs", + "bytes": 15769, + "sha256": "e29ef071bab0a68460ddf55c46131c6f66c022d52c3c602c37c013c3649da1b0" + }, + { + "path": "crates/oa-core/src/migration_v2/transitions.rs", + "bytes": 704, + "sha256": "f74174c532ba56b57c80b719a11fb4adea0a78ccc2828fff72fe2b9eda5a10b1" + }, + { + "path": "crates/oa-core/src/migration_v2/validation.rs", + "bytes": 98736, + "sha256": "6d5e4a4e2805ae5045bf789a0485e14a61c63346587bace2b4a91173a688f780" + }, + { + "path": "crates/oa-core/src/migration_v3/README.md", + "bytes": 2128, + "sha256": "3755a63f840d7f0eadf68afa7a9d587877a9468ff982d3610539e8a0bb067a82" + }, + { + "path": "crates/oa-core/src/migration_v3/mod.rs", + "bytes": 23023, + "sha256": "f4edb6a0b50ecfe8670973776d703047b064420cb1f05913129c00fc656b3722" + }, + { + "path": "crates/oa-core/src/migration_v4.rs", + "bytes": 4020, + "sha256": "50c652964f0f309e7f3f54b6ef12c40d42fcecc0490f005995c713df1179af70" + }, + { + "path": "crates/oa-core/src/model.rs", + "bytes": 66352, + "sha256": "4585c895c64c4a183941c92cf047a9e52ff0cbe41971e16e78d229ea9dc101fb" + }, + { + "path": "crates/oa-core/src/operations.rs", + "bytes": 11405, + "sha256": "a5ffbbf54cd440316a106d1188bfb699b57dae59f466edcb33618c333cd19f41" + }, + { + "path": "crates/oa-core/src/persistence.rs", + "bytes": 31774, + "sha256": "1c01474f906a63e552c0d590b272c95821c00a100b3e79e58e67dbbeac341a14" + }, + { + "path": "crates/oa-core/src/ports.rs", + "bytes": 45413, + "sha256": "5cac12eea70a54ebebbd6be77b63ce92e3195325c4bc7d27705c518686cbac80" + }, + { + "path": "crates/oa-core/src/projection.rs", + "bytes": 21374, + "sha256": "69ed12bace2cc5024e151752a174ab14034ac2d05eb741fcf13e9a27521c059b" + }, + { + "path": "crates/oa-core/src/projection/port_layout.rs", + "bytes": 13474, + "sha256": "a08d17d10a58bb8b206dd001b19b91d5aa3a9f743b298a4da57d503223c20079" + }, + { + "path": "crates/oa-core/src/projection/state.rs", + "bytes": 5233, + "sha256": "73a607bac713ec7ff49a509fefb1a53c7686dca93ee241ffc835564d743afb28" + }, + { + "path": "crates/oa-core/src/references.rs", + "bytes": 21957, + "sha256": "93553c234f32da35f1f41a7b83ad81c471c9803efa78ca222cf7de3c2f86c0bb" + }, + { + "path": "crates/oa-core/src/routing.rs", + "bytes": 50309, + "sha256": "c5ebb350ba76f731f5c48d968bfbba4b6ef68ec046eb5893d116c4637ef15080" + }, + { + "path": "crates/oa-core/src/semantic.rs", + "bytes": 540, + "sha256": "f9895dd5b8fb27d10d4cfbb41c3542ef2018365a589b8d5778e5674ae5a1f239" + }, + { + "path": "crates/oa-core/src/semantic/catalog.rs", + "bytes": 49407, + "sha256": "1ff74fcca18084d178681d7ff38ee1ccac632c27c4de0595ba1ceab8067ab3a4" + }, + { + "path": "crates/oa-core/src/semantic/historical.rs", + "bytes": 15271, + "sha256": "eaf3284bf234312698514cdb636bc8348e1b5d746cb16b18df777e77d312abfb" + }, + { + "path": "crates/oa-core/src/semantic/linked.rs", + "bytes": 6035, + "sha256": "6f335b14e809aecfc35defcaf77cb821b080d1506dbc46297912b25af98c07a2" + }, + { + "path": "crates/oa-core/src/semantic/mutate.rs", + "bytes": 22683, + "sha256": "dc2b4c4a6eb156fe468eaa8c85fd37a505c0cd8ea1f226cb69cd01689afd3d9d" + }, + { + "path": "crates/oa-core/src/semantic/review.rs", + "bytes": 51116, + "sha256": "0c157d2c327e72e89cca3b423e71ee73798105c5bb7271439c1a101642c91e3e" + }, + { + "path": "crates/oa-core/src/semantic/types.rs", + "bytes": 10405, + "sha256": "6922fe35089f12fad43ab0ce1c6886d01a3855f90b8e2543e99802ac5e6f1bbb" + }, + { + "path": "crates/oa-core/src/session.rs", + "bytes": 35237, + "sha256": "1eb77b329b2986fc6f5dc0171e77fd860375cdfd8c769a1367b445d6c49ebe00" + }, + { + "path": "crates/oa-core/src/source_files.rs", + "bytes": 74803, + "sha256": "669491dbddb8e8e6556161426dffa1a49ac1c826d31020bff0956d81a4d84683" + }, + { + "path": "crates/oa-core/src/source_project.rs", + "bytes": 61843, + "sha256": "1394370bcc5908873b830c2c11312e6e1611af41f46c4f43ca0a6bcb713bb466" + }, + { + "path": "crates/oa-core/src/source_project/source_migration.rs", + "bytes": 4700, + "sha256": "add463ae85c420f853d324b00a221f0f874164cc3f3ed6bbb07557a9ed7a8c95" + }, + { + "path": "crates/oa-core/src/source_project/source_structure.rs", + "bytes": 20225, + "sha256": "9f1f83315856a7025fe662c0fbb13452f31613224a03663150d6225d1ddc162f" + }, + { + "path": "crates/oa-core/src/state_validation.rs", + "bytes": 15665, + "sha256": "e28d7f74385e2a78763716b34491bd73a00bfeccc085970ceb130627e3faee18" + }, + { + "path": "crates/oa-core/src/topology_context.rs", + "bytes": 13734, + "sha256": "16de69b297de95d93c73808621607833b713af811dd082f0169186ae1e5c3e2d" + }, + { + "path": "crates/oa-core/src/topology_context/analysis.rs", + "bytes": 20036, + "sha256": "dead6194f0aa60cc46045c0e5ee10dbdbb689158c38634dfbbbc45d2ba88ac65" + }, + { + "path": "crates/oa-core/src/topology_context/analysis_tests.rs", + "bytes": 5258, + "sha256": "17839263410815e96fe027d4eba3aae0a9ab3b82b16947e2b29ebe0d09782b56" + }, + { + "path": "crates/oa-core/src/transitions.rs", + "bytes": 51998, + "sha256": "fadd1b07b89cae4117b91abb4f1ac9ea81ff818ef20f2175e76ee8cf21fb708d" + }, + { + "path": "crates/oa-core/src/transitions/communication.rs", + "bytes": 8634, + "sha256": "2b476630a88edd9021b9156ca12a5402e01604095f0d4002afb452671903a028" + }, + { + "path": "crates/oa-core/src/validation.rs", + "bytes": 112792, + "sha256": "7c1b4ae5e4ebba13e99af9158ccde138dfc5e9a7afb580e76fba72d0b64ba74e" + }, + { + "path": "crates/oa-core/src/validation/coverage.rs", + "bytes": 6478, + "sha256": "b08e4b344ecad055714168c83beff7fe29ba4edc53edbffa2eae04e5580a4d5f" + }, + { + "path": "crates/oa-core/src/view_options.rs", + "bytes": 24481, + "sha256": "421ede0a04c593ca1df0e6e0d06fabcfcc8113cdbcfb0adc7f5c8ef4d1724208" + }, + { + "path": "crates/oa-core/src/view_options_tests.rs", + "bytes": 21433, + "sha256": "64aac44de2df42a1012239a3dd75c473daf0c8990b3170b7bf7e78a556080208" + }, + { + "path": "crates/oa-core/tests/communication_boundary_scenarios.rs", + "bytes": 8816, + "sha256": "e1100b8f363910a487d90c73acc7df543dc6d532158c3c63ad11cd3d40d8e12b" + }, + { + "path": "crates/oa-core/tests/communication_means.rs", + "bytes": 18102, + "sha256": "a25f2749180bc6f4beb1445bfad3351eedf0669131a7439b633ab804439e95a4" + }, + { + "path": "crates/oa-core/tests/coverage_diagnostics.rs", + "bytes": 20527, + "sha256": "e2e9c3996daab47f2bd23f5d8c48b4e372af33331152f5fc85b76f06d04fcdf4" + }, + { + "path": "crates/oa-core/tests/fixtures/v2-coastal-rescue.arcadia", + "bytes": 29220, + "sha256": "f0df129c1914bfc01d0b047b0cd4b520d8cf0c249ea9ced085de400c0be87ff3" + }, + { + "path": "crates/oa-core/tests/fixtures/v2-coastal-rescue.json", + "bytes": 43990, + "sha256": "3ed53508eb544bbd788832f7bebea2ec31b3d66191f24f45098cc9750ec4c005" + }, + { + "path": "crates/oa-core/tests/fixtures/v3-data-contract.arcadia", + "bytes": 2450, + "sha256": "305f19d1b79f99f8d4cf627ba2e9ca6836bb7959cc0070227815937a699eafea" + }, + { + "path": "crates/oa-core/tests/fixtures/v3-data-contract.json", + "bytes": 8240, + "sha256": "1b41299c53204e6232397d25a58d5bccdbbc16e770c75e8edb55ce36ccfe58a2" + }, + { + "path": "crates/oa-core/tests/fixtures/v4-reviewed-prose.arcadia", + "bytes": 1222, + "sha256": "5fa53a26a5ad010c8e59eb56d9b2b52003569e66c0377ffb58840590168ad0c1" + }, + { + "path": "crates/oa-core/tests/fixtures/v4-reviewed-prose.json", + "bytes": 1734, + "sha256": "2808088afcc165f4bd6da5129151143411c997041c3de61d600ab76e05d24a47" + }, + { + "path": "crates/oa-core/tests/language.rs", + "bytes": 56482, + "sha256": "77f6cb2a69976bfb5f60b243b71c07fb0edc7505002c1e9e73fcd6ddf6d9496e" + }, + { + "path": "crates/oa-core/tests/port_anchors.rs", + "bytes": 26893, + "sha256": "efbc0fa18733b1aaac501f9785a4c392fc49c05c45a5778d26e9b5dd951ca6fa" + }, + { + "path": "crates/oa-core/tests/port_migration.rs", + "bytes": 15620, + "sha256": "1801c376a5435ac7efb2a8342348b2c7ffef930bba65deca4acb66b06e0483d7" + }, + { + "path": "crates/oa-core/tests/port_source.rs", + "bytes": 4858, + "sha256": "8d2ddaca4045d330f6eda2591561497b858aad53769a823249d0bea4f5916e12" + }, + { + "path": "crates/oa-core/tests/prepared_commands.rs", + "bytes": 9555, + "sha256": "52cab1c668064777412df0a6a3c20d74d579b33794b4b00525b9f151c06eac9b" + }, + { + "path": "crates/oa-core/tests/process_diagnostics.rs", + "bytes": 1104, + "sha256": "1dbbc590239ef7542be4a2bdc9543aaa64d108417b03dd312a0894e364745906" + }, + { + "path": "crates/oa-core/tests/r3_constructor_ack.rs", + "bytes": 24163, + "sha256": "e5c44676ea0aab97f2e091ddac2f4bc4a4a90f5877f7bbf08b61229600944dd0" + }, + { + "path": "crates/oa-core/tests/r3_migration.rs", + "bytes": 6590, + "sha256": "ebd04120f5215b3956fdc79ee78f6e38734c7d13392f1fc28aaba957912265bd" + }, + { + "path": "crates/oa-core/tests/r3_semantic.rs", + "bytes": 77473, + "sha256": "49c3763eaf2131070a7c46cc23a84f917d292d41610b6404510e5607f8890c32" + }, + { + "path": "crates/oa-core/tests/r3_source.rs", + "bytes": 15311, + "sha256": "f31f60659df3c7ef601650d1cff140589d8729f01a3f65a4a6a6c2272f15c408" + }, + { + "path": "crates/oa-core/tests/r6_data.rs", + "bytes": 41437, + "sha256": "5f7ffb3bc73c3c85423623fe56f8680646dc97040327bdbead9d47a37e80f155" + }, + { + "path": "crates/oa-core/tests/r6_migration.rs", + "bytes": 9174, + "sha256": "81519bc1512f5e069432e9a1cdad04c10216d492df01b4b75b02102480ebd6a1" + }, + { + "path": "crates/oa-core/tests/r6_source.rs", + "bytes": 9519, + "sha256": "88a0aa087a7678e2898ff6057538072ca92072190712f05fff08372cc56ebed6" + }, + { + "path": "crates/oa-core/tests/release1_teaching.rs", + "bytes": 10010, + "sha256": "be179290d871125dc97cfd2a3067c7ac89c8a538fdb0afafc5b825bcdfb2bef2" + }, + { + "path": "crates/oa-core/tests/release_capabilities.rs", + "bytes": 19422, + "sha256": "b92cba2a562e78287ddd7dc3e94557848d17faa0c8a102601b50286b9af48a30" + }, + { + "path": "crates/oa-core/tests/release_diagrams.rs", + "bytes": 7689, + "sha256": "cefcc0582d91266d5de6ee5daefcfe41b606ab971ab235b59034a8e1dbc24b7d" + }, + { + "path": "crates/oa-core/tests/release_language_limits.rs", + "bytes": 5204, + "sha256": "8578da4f76bbd2d0e1bfe295ab1259e2162a3fe3d0d2ba8901915d7a40942806" + }, + { + "path": "crates/oa-core/tests/release_ports.rs", + "bytes": 32740, + "sha256": "506e62beab0c7ec0cece83e9e0c1a810fa1f99285c9e1cab0c77f06de55a40e1" + }, + { + "path": "crates/oa-core/tests/release_routing.rs", + "bytes": 23165, + "sha256": "ae168faaba23769b7ca1fd65f217b9db671726e67276eb5a04e5e72b1447a462" + }, + { + "path": "crates/oa-core/tests/release_scenarios.rs", + "bytes": 41067, + "sha256": "0f5d876badeec653fc7b12610a77d867e9a53582e605253deff8d379da21572f" + }, + { + "path": "crates/oa-core/tests/release_states.rs", + "bytes": 26873, + "sha256": "b1a26acee95eaba7f9920f9da738a1e33606552eb078e6d298895daff7e3d811" + }, + { + "path": "crates/oa-core/tests/release_topology.rs", + "bytes": 17643, + "sha256": "c51dbe5aa5a038f9ed830daa02aa67714472179eb7fd6da5ce36dc6931c8b3a9" + }, + { + "path": "crates/oa-core/tests/review_regressions.rs", + "bytes": 21823, + "sha256": "f154e5c88d35e31512e2b07733a1327ea3e2fcfd1ef8eb23066a4e9573f387c1" + }, + { + "path": "crates/oa-core/tests/route_source.rs", + "bytes": 7270, + "sha256": "1a73fdbac0d0ae0e84d8d67b6ad398e11223958f5dca007f73757c91827decfb" + }, + { + "path": "crates/oa-core/tests/routing_geometry.rs", + "bytes": 31890, + "sha256": "2d8eea4a2bba535ed0ea6daabccdaf87b375828c404baa10518c7bd7fd6253d3" + }, + { + "path": "crates/oa-core/tests/routing_labels.rs", + "bytes": 5530, + "sha256": "dff884d799c3c5c9257210248c55767e294e3cb317c605cbd0ddc9600c216eb6" + }, + { + "path": "crates/oa-core/tests/semantic_artifact_absence_oracle.rs", + "bytes": 4640, + "sha256": "d93eaf9667f4221232168bef0fe9f069e5be1b1f23410bda5dd67010b96e5c8a" + }, + { + "path": "crates/oa-core/tests/semantic_attachments_gui_oracle.rs", + "bytes": 14957, + "sha256": "7f526d363ba05e7ac89faf0fead0796e419c34ee204edf44a1b46c78308b0970" + }, + { + "path": "crates/oa-core/tests/source6_view_contract.rs", + "bytes": 14307, + "sha256": "fa566de53946d40bbbd9033edfeed177180c4dc44afa2f2f4667ffdc622eb3bb" + }, + { + "path": "crates/oa-core/tests/source7_contract.rs", + "bytes": 43262, + "sha256": "cad4f1a135ddbd947bdf3c71d1b44f1e438725095ea8c4d893464bc721c2363f" + }, + { + "path": "crates/oa-core/tests/source_files.rs", + "bytes": 13168, + "sha256": "f0429a0b89a443458ea9af7083c1e4e7411417a7e6b47e618bfbb9266dc164f9" + }, + { + "path": "crates/oa-core/tests/source_identity_updates.rs", + "bytes": 5139, + "sha256": "f52aa38b4d317e532c641ad7463472e4b40e802e60052cf0017556ffc63da06c" + }, + { + "path": "crates/oa-core/tests/source_nested_updates.rs", + "bytes": 16892, + "sha256": "9ac3390936c0d250651ea94a1b8faf0adfb680f061ececc56f2a52909b5ba855" + }, + { + "path": "crates/oa-core/tests/source_project.rs", + "bytes": 45910, + "sha256": "cef58adb16aa4d2527ddc0628aec3e26f0b42b4be70014a7e360fafdac13a942" + }, + { + "path": "crates/oa-core/tests/state_diagrams.rs", + "bytes": 23973, + "sha256": "6b02b387a3ae559cb3ad72de24292a5abcb76aaac0adbab5d2aa5211b22cd2e5" + }, + { + "path": "crates/oa-core/tests/workflows.rs", + "bytes": 33426, + "sha256": "bd843dfddbd5724ec08f657571f887496203056fe2fa5864ef50a168a613b89b" + }, + { + "path": "crates/oa-desktop/Cargo.toml", + "bytes": 842, + "sha256": "f3547b2b924d5db6706c0a8e069014b440ff65315d82fc8aced0360af4b3cdc9" + }, + { + "path": "crates/oa-desktop/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-desktop/src/allocation_drag.rs", + "bytes": 29634, + "sha256": "6b93290627a8697dd529ecf12b6e99196a11783afff1ca7aaf75c6e2762f3d94" + }, + { + "path": "crates/oa-desktop/src/allocation_drag/tests.rs", + "bytes": 60311, + "sha256": "13b7d055a516c8a9f0bd13f03abe3b81423bde9d121c51778a129ff485f4f102" + }, + { + "path": "crates/oa-desktop/src/allocation_input.rs", + "bytes": 8391, + "sha256": "c7825c43383e81b7eb1b78bd902950c8a2206e0387d26002a80ddbe4dc2b6c73" + }, + { + "path": "crates/oa-desktop/src/app.rs", + "bytes": 220614, + "sha256": "99447bba4810135834663681447a03061a948db2661395b9b4c4924738a38f18" + }, + { + "path": "crates/oa-desktop/src/app/allocation_drag.rs", + "bytes": 24452, + "sha256": "218726dcd2e6809cb6f3660f575e586806360456e6b4fac61b9e361b411aeee9" + }, + { + "path": "crates/oa-desktop/src/app/allocation_drag_full_tree_tests.rs", + "bytes": 28288, + "sha256": "ff4c3d07f885f242b71160c09e2c457c4a746073fd89030781da306730c5db44" + }, + { + "path": "crates/oa-desktop/src/app/allocation_drag_tests.rs", + "bytes": 42677, + "sha256": "3c6908f8a677921245932252ab38806f16012becbbc082ac11e7871ff7bdeeb4" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring.rs", + "bytes": 27835, + "sha256": "37c7db33e99dd4adcc5a51f09ee4878af94fd32413359890a541690080885f65" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring/palette.rs", + "bytes": 8887, + "sha256": "8f9937cb30b48b83759fd084a8a5990a2daa3920280f1210abe048560241985a" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring/tests.rs", + "bytes": 14565, + "sha256": "174e184f1baf872c3be1cf70d9a7f4bc5569a9623000b3ab0e71e2b82e249cf5" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring_tests.rs", + "bytes": 18551, + "sha256": "ba913f7d7cbf586708d65c9f1db25b9b9ed7846f9d2e75a546b4ac69d8d19c6a" + }, + { + "path": "crates/oa-desktop/src/app/behavior_lifecycle_tests.rs", + "bytes": 13672, + "sha256": "f9a0b030faca5deaf3f55d9f5efcafdf1a7cb1a663001aa20a61baba4f92d080" + }, + { + "path": "crates/oa-desktop/src/app/behavior_removal_tests.rs", + "bytes": 23958, + "sha256": "ef09843a7daeb91afab0b76e83c5679351a1635a84a26d80a194dea744ea5874" + }, + { + "path": "crates/oa-desktop/src/app/checkpoints.rs", + "bytes": 29576, + "sha256": "55e5babdcabef767af3bc8be9cc3153b3f5cc0695701b890820ec0225643852e" + }, + { + "path": "crates/oa-desktop/src/app/diagram_focus_tests.rs", + "bytes": 6047, + "sha256": "65f3f841e1295ae4878b3ae2cf45ff64003d42e26e450e9a1de1c36dbd771bd8" + }, + { + "path": "crates/oa-desktop/src/app/diagram_removal.rs", + "bytes": 8778, + "sha256": "addb51604f41d680b06586bb362362ee3c2603a334f33022ce9abc281295ac85" + }, + { + "path": "crates/oa-desktop/src/app/diagram_removal_tests.rs", + "bytes": 47336, + "sha256": "70f9eb53d8995a23a53535b3941fc0c0b81a340f9fbbb371f0d705cfa775bd9e" + }, + { + "path": "crates/oa-desktop/src/app/diagram_selection_tests.rs", + "bytes": 5582, + "sha256": "4fa507adbc23db3a6eb202d809c695ec0ebd6181356930c4fa7528a9a0c7be57" + }, + { + "path": "crates/oa-desktop/src/app/hosted.rs", + "bytes": 25059, + "sha256": "2f7094c078e1d7cbccd6c0d310afa6c400a7e031f12918bbfce65ba62754e316" + }, + { + "path": "crates/oa-desktop/src/app/hosted/tests.rs", + "bytes": 30344, + "sha256": "fa118f64d04b400ccc01e4e67adaf3541975288882afa265a9e7f092cdbda232" + }, + { + "path": "crates/oa-desktop/src/app/process_canvas.rs", + "bytes": 31560, + "sha256": "7e05f4899a0b24df9ab355b6484e94997c7bc66c873342d975aed0b6a56acf04" + }, + { + "path": "crates/oa-desktop/src/app/reference_authoring.rs", + "bytes": 11250, + "sha256": "38e033e23e8135032f70117a376a5fe7bc68127c466559a35d7ec200932e3f77" + }, + { + "path": "crates/oa-desktop/src/app/reference_authoring/tests.rs", + "bytes": 20067, + "sha256": "b96ddc6bff7f8fde97720e18a92070f891c1340348d2e19c7c9c5a7bda650ce8" + }, + { + "path": "crates/oa-desktop/src/app/reference_authoring/tests/mounted.rs", + "bytes": 32805, + "sha256": "14a4914a1c86e50c395672dab8fe80d7af679a79c9082890b509fad7b7c543d9" + }, + { + "path": "crates/oa-desktop/src/app/repair_save_state_tests.rs", + "bytes": 10745, + "sha256": "5543dcba853bb1513acf824b860249729a6004747e7e320b46efe60ea19e2d83" + }, + { + "path": "crates/oa-desktop/src/app/review_navigation_tests.rs", + "bytes": 7049, + "sha256": "872fa91479dad5436e139ffcaece270323e9f5daeeb7a4d80c2c2534f48bc21b" + }, + { + "path": "crates/oa-desktop/src/app/save_as_tests.rs", + "bytes": 4113, + "sha256": "f8b915793f1a36fd152569c4781a4bdc17f4af404a8ceb373330053413087a1c" + }, + { + "path": "crates/oa-desktop/src/app/state_diagram.rs", + "bytes": 10050, + "sha256": "9ae3d533a20963a2bd1d485d357ac04319f336cd9f4c16305aa2a67d833573a8" + }, + { + "path": "crates/oa-desktop/src/app/state_diagram_tests.rs", + "bytes": 39957, + "sha256": "612e414b1a2cab12cbfd8fce23745559ff27577700694d53af67ad1f2883ee2c" + }, + { + "path": "crates/oa-desktop/src/app/transition_context_tests.rs", + "bytes": 11508, + "sha256": "47002fb025f3a2f8c53871f9509bfe8611a61db6fb0e1b3125eb6e875425cb1d" + }, + { + "path": "crates/oa-desktop/src/app/view_copy_tests.rs", + "bytes": 7846, + "sha256": "296821c51dcde568e7d717039aa26bfc1b56a9074aa16051007bb351b33a4d44" + }, + { + "path": "crates/oa-desktop/src/behavior.rs", + "bytes": 130523, + "sha256": "96c6e784640fd19a65c93346d21cb184ca721d7649812bd4c68a479391e38127" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace.rs", + "bytes": 7903, + "sha256": "b6e06b9d29f1a5677f99bebcb0e53a3795b4bcd957796a85fd800db4279aed03" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/control.rs", + "bytes": 7804, + "sha256": "2b8d97b8c0e3ff1b1a2c32187b1d0eb25edf39ba582b5fb3303bc880f674f7ba" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/focus.rs", + "bytes": 8901, + "sha256": "33447003980847033e40550f9926d8617fa61e2c3e73ec9c6121d1afed946c33" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/tests.rs", + "bytes": 27101, + "sha256": "b33361c6569354aa2df9b1ba1b60d68e4703800be80f815e0f0505064ea323c3" + }, + { + "path": "crates/oa-desktop/src/behavior/canvas_workspace/viewport.rs", + "bytes": 15164, + "sha256": "41ff9c50fa9fb89ab9fdb2d18dadc21585aafa1ee008cfcd1e0b731dce645eaf" + }, + { + "path": "crates/oa-desktop/src/behavior/contextual_source_tests.rs", + "bytes": 49518, + "sha256": "044bd412dc45ffe440b1e251993946942dc3759dcb2d5dfe71bd8d6ef61cbcc7" + }, + { + "path": "crates/oa-desktop/src/behavior/creation.rs", + "bytes": 28978, + "sha256": "33ae9aaf4ba90de9432870cc8e99708ef39e3638ae8283a9253c333785c91299" + }, + { + "path": "crates/oa-desktop/src/behavior/creation/app_tests.rs", + "bytes": 13181, + "sha256": "e9c5bf2b07357b7a2f679ae0d8f6904c1c1461aaeb94fa0db478b54d4641ae3e" + }, + { + "path": "crates/oa-desktop/src/behavior/creation/tests.rs", + "bytes": 22793, + "sha256": "a0d1daf9fb3920f7e6181a9802d84fbe056cbf0043b9e41dba5fdda687d9818a" + }, + { + "path": "crates/oa-desktop/src/behavior/form_session.rs", + "bytes": 3941, + "sha256": "f5027fb3a5a5599a182e7d1a10dba56dd66eb1f23a4ba4c4a1744c9a6a5b6e61" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario.rs", + "bytes": 154707, + "sha256": "ffac8821977488ecd1cd9084ad7c0c9fbf8de3d5031c5d4f5d033f0348d3e887" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/focus.rs", + "bytes": 9728, + "sha256": "73a9ea10ad7312086081b8688396a21ab4251c9faecc2df6d984b702f3963533" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/workspace.rs", + "bytes": 24960, + "sha256": "5aec4cb2ceb00ab25900d919a5bec71ab96848b4f14504f51790e3fe8801d3bc" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/workspace/tests.rs", + "bytes": 80542, + "sha256": "f2f6acd93ecf4e9ffee56abc1de28f71da8cb1353cdc3e67cf0c0cf7a619fec5" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_activation.rs", + "bytes": 14095, + "sha256": "77199dcb08ec8697f779d2560f6b716aed8d8f33965237a4934934954f4e805a" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_activation/tests.rs", + "bytes": 28464, + "sha256": "8b855dc067f1b15aed79c7eddf52c89001a8b961d9de4887f235c03b46264a1b" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_lifecycle.rs", + "bytes": 9324, + "sha256": "758d244c2e8de61f515d540baa4d967275f49720e0253c6c9159eb9acd71c859" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_lifecycle/tests.rs", + "bytes": 15430, + "sha256": "01b576993b329810cd78a859b45ac52c66f5a14549065661dd1308196e0b724d" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_operation_tests.rs", + "bytes": 10087, + "sha256": "89fb71c690e07eac314f7a5e05862d5c1e2f9c21039673bf22c4ac894d21c977" + }, + { + "path": "crates/oa-desktop/src/behavior/source_draft.rs", + "bytes": 18031, + "sha256": "08190823090bd8b0305809099abadcc0de431175f7044f1d5abdceda52612ee1" + }, + { + "path": "crates/oa-desktop/src/behavior/state_canvas.rs", + "bytes": 96098, + "sha256": "5844d2abf4a3fe3bb07c707865ee3f8303d213b0fe1871765ac468c11e140da7" + }, + { + "path": "crates/oa-desktop/src/behavior/state_edit.rs", + "bytes": 35843, + "sha256": "4e67321ab0cf88e6200061873086841244c4d610ddd5f88d70c69ac0cc6bf270" + }, + { + "path": "crates/oa-desktop/src/behavior/state_menu.rs", + "bytes": 8530, + "sha256": "9d0a3c29516efa79553c559274848f12101330dbf93ffbbefab398cbc1906790" + }, + { + "path": "crates/oa-desktop/src/behavior/state_view.rs", + "bytes": 7637, + "sha256": "3d01c853663385fc1b760401bbebe3f691fcc289a779a8e63cd0733ff0c8007f" + }, + { + "path": "crates/oa-desktop/src/behavior/states.rs", + "bytes": 26986, + "sha256": "8986ed9492960e20f1254e9dfe3ff91d79ce9fef66f3bda738f9933278043954" + }, + { + "path": "crates/oa-desktop/src/behavior/topology.rs", + "bytes": 84224, + "sha256": "66c81c4d4f2613263f13ae90cea61895c1aeed1f6278880789ec56f8c42433e0" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/contextual.rs", + "bytes": 28432, + "sha256": "5d0ac5b3e258fc70987a00ede1e603681d99746596f2fcc46ad2b3667d65203a" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/contextual_routing.rs", + "bytes": 16731, + "sha256": "d914b0e82aa8d253fe64be2ef74443d1fd2e6cec26d1cf30620a57646e1d426c" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/direct.rs", + "bytes": 39059, + "sha256": "5cca649870f54abdd2eb098954bcc0a2a5ca456b7ee11b5f653edbdf2ed55905" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/direct_tests.rs", + "bytes": 51170, + "sha256": "edccfe3ce8b224065a3540aa53c6340f13db0cecd48ecc0a3904cd832a483964" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/layout_tests.rs", + "bytes": 37846, + "sha256": "f27203866e22aee80daad2811113341684b0cbd59885b36d64243c4317f29f84" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/view.rs", + "bytes": 22009, + "sha256": "29e29c2a0667baa429ae44dbb400e67c86f24f88959d5e7dd22894473bdd1f09" + }, + { + "path": "crates/oa-desktop/src/connection_edit.rs", + "bytes": 5301, + "sha256": "020581e077f82b43c936b623cc51733b02b88428df4e5f25df74b9705819fa37" + }, + { + "path": "crates/oa-desktop/src/connection_tool.rs", + "bytes": 27023, + "sha256": "649da93677d52dae495b0e19bc32f3122ab05a6d84de8402578ff5ce3f6ee1d3" + }, + { + "path": "crates/oa-desktop/src/context_menu.rs", + "bytes": 52955, + "sha256": "629354b34dc232763700251f2695b4d4e53d6251c0b1432ecc0dfe424f7dfeac" + }, + { + "path": "crates/oa-desktop/src/data_values.rs", + "bytes": 23877, + "sha256": "e1deb1cad551f0a9fdef9653aad257cfb36e6d9c0f93b6245061ec3fab8fd365" + }, + { + "path": "crates/oa-desktop/src/data_view.rs", + "bytes": 38871, + "sha256": "158b852be5d3db450aa5cda8b68a35bd96bddce1d8d053a7a23582095c06362d" + }, + { + "path": "crates/oa-desktop/src/diagram.rs", + "bytes": 111242, + "sha256": "e5260a39e19fc3df19bd16898ff1f0abd60ede7584f595c035b5e86a12ecef93" + }, + { + "path": "crates/oa-desktop/src/diagram/focus.rs", + "bytes": 9197, + "sha256": "b88a7c43123b08cf6228d8e32257f6ed7fe361f7278f427ec138e233e1ea6ccf" + }, + { + "path": "crates/oa-desktop/src/diagram/lifecycle_tests.rs", + "bytes": 9342, + "sha256": "03dd13106f3fdd06a26699bfdfba006fad086a0711cad2ba1aeb09a4e8f8656e" + }, + { + "path": "crates/oa-desktop/src/diagram/pointer_tests.rs", + "bytes": 11859, + "sha256": "ae68e091032fe2cf71559ff7e671b3b6d657ee8279330345f0c7a57edfa472ef" + }, + { + "path": "crates/oa-desktop/src/diagram/port_hit_tests.rs", + "bytes": 5650, + "sha256": "c3728f127711cb6d7f80a4670a798808b6e4239dd29c273445de81706ab6f39e" + }, + { + "path": "crates/oa-desktop/src/diagram/port_labels.rs", + "bytes": 13574, + "sha256": "6643f0cbde7a59d4772ae5284a488083e3b81f2fefabc43619d75738f474646f" + }, + { + "path": "crates/oa-desktop/src/diagram/view_options_tests.rs", + "bytes": 2815, + "sha256": "cf0c98a7715558baf17b59f67a80556f98ad30262b4434635e617c6601775433" + }, + { + "path": "crates/oa-desktop/src/diagram/work_drag.rs", + "bytes": 7059, + "sha256": "9757534a7ba47dc0df5d41c8d7366b1d90f3d50b24344580ff3c783667bf66f0" + }, + { + "path": "crates/oa-desktop/src/document.rs", + "bytes": 31807, + "sha256": "7c87280b5b8d112c34865253f8ba0f80d43bc9897771943b15dc7b5608eb17a4" + }, + { + "path": "crates/oa-desktop/src/document_save_as_tests.rs", + "bytes": 5781, + "sha256": "83dc243a25f4e97674ff0d86c794a490cc923e98f1f9fb05bb038f622f11e20b" + }, + { + "path": "crates/oa-desktop/src/explorer.rs", + "bytes": 14764, + "sha256": "fa01c59219564ba9ae5553abc2b6f94e9849f9148d5812ef99b40318fe5dcf9a" + }, + { + "path": "crates/oa-desktop/src/explorer_view.rs", + "bytes": 13773, + "sha256": "a720d7484bcc3a24729332a00e005d1cc6f5f945a9cc3965134e0024dffb581f" + }, + { + "path": "crates/oa-desktop/src/forms.rs", + "bytes": 105544, + "sha256": "ea124f479fcd2d3978ac3cb8eb81fec4a7aae5e4f4414c4bdd54849e954dedf9" + }, + { + "path": "crates/oa-desktop/src/forms/context_fields.rs", + "bytes": 10831, + "sha256": "eaacd474f6500dd344d5a8b63ccb1d1dd86fe2aea78ab708afa8a80d62ce69bf" + }, + { + "path": "crates/oa-desktop/src/forms/data_fields.rs", + "bytes": 49285, + "sha256": "a540a0d451bff56a96b1d28643b2e8c0649f3846350c25c5b154729c0538e77c" + }, + { + "path": "crates/oa-desktop/src/forms/history_fields.rs", + "bytes": 27414, + "sha256": "e7100474cde18bdfe95562bcb3c055f29b4b15aa64788a578194464aebcd046e" + }, + { + "path": "crates/oa-desktop/src/forms/history_fields/tests.rs", + "bytes": 33950, + "sha256": "16d3c308138c063f45986d53c621ad83c7dc2ce853edd31b7204e2939a382df9" + }, + { + "path": "crates/oa-desktop/src/forms/port_fields.rs", + "bytes": 30554, + "sha256": "3fe684d651d5be6203fd9db3979c772913e1af5ac1514e67be386ffd88dc8127" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser.rs", + "bytes": 12130, + "sha256": "b60af363be333af048859e51c28e8c989cb5c95d696cad16c8eec15f78d57a12" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/adapter.rs", + "bytes": 10447, + "sha256": "87ab4bc3bf27fd4b5a458791cf62c7ba8e44e9ebf846d8b851b8b6ffb454cd64" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/tests.rs", + "bytes": 27835, + "sha256": "8e98f8a3fcb814d4a201cc85b3db87a689fd3d2ce487f8a2fe312fc296f93377" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/trigger.rs", + "bytes": 13336, + "sha256": "34d0acecfe6bed193970aa473cc3313984971264b86d7b362a6b84c23d013c0a" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/trigger/focus.rs", + "bytes": 9923, + "sha256": "f1e79f4b03b2f9fd1cdc335054d4ae177dc9e759b6ea3d334b2bcca39b57191b" + }, + { + "path": "crates/oa-desktop/src/forms/reference_chooser/widget.rs", + "bytes": 33804, + "sha256": "d66cc17af7a48bb8598be683f084bb08fa7af7304f9636f0a1bea94c5cf6c727" + }, + { + "path": "crates/oa-desktop/src/forms/view_fields.rs", + "bytes": 24987, + "sha256": "5184d438f0dfd4e29f284ff048e19da73e71be1f24a6e9f123c7e922aecb85fa" + }, + { + "path": "crates/oa-desktop/src/guide.rs", + "bytes": 118110, + "sha256": "ab4b47050e6d57dccdcc264ee5752766bd5013fccdc35eeeb9c9037bb5eb9a67" + }, + { + "path": "crates/oa-desktop/src/highlight.rs", + "bytes": 2751, + "sha256": "da7c254fff7052e5fd9ec7469f473b91a819406028d7c304f6e22c4169561600" + }, + { + "path": "crates/oa-desktop/src/home.rs", + "bytes": 17587, + "sha256": "f03c1071334894f586a5a7c86026602a694db3c2faf902822e1dbe5156a859c2" + }, + { + "path": "crates/oa-desktop/src/home/tests.rs", + "bytes": 8167, + "sha256": "3b03ccfc97dfb75954e1e0ed568bb87a632295c07b96cedc05ed381f87b378f3" + }, + { + "path": "crates/oa-desktop/src/hosted/client.rs", + "bytes": 21912, + "sha256": "54b24b4b50f8d87d7c92946ea5a2cff4c98760e70555b3ce3d90be27115e95d4" + }, + { + "path": "crates/oa-desktop/src/hosted/client_tests.rs", + "bytes": 23009, + "sha256": "3ef70907ca75e098d631c41b90badd4cff1e1eb1b3c78e15a9f811c13ba8ffbe" + }, + { + "path": "crates/oa-desktop/src/hosted/mod.rs", + "bytes": 3744, + "sha256": "1b75e11c80fcb38fd20bb3487e3f88729fdac73e471c5ae64da28c249f77c63b" + }, + { + "path": "crates/oa-desktop/src/hosted/view.rs", + "bytes": 9281, + "sha256": "fc0c7b7ce3a5f05c49713df6661067751f81e810af11c614ca265ea9490e6463" + }, + { + "path": "crates/oa-desktop/src/main.rs", + "bytes": 1554, + "sha256": "5228743f361f9239e4584780bfa9b65d36207d0288624e1fb42b721146bcff1c" + }, + { + "path": "crates/oa-desktop/src/model_menu.rs", + "bytes": 36340, + "sha256": "d2f836661f43fa1bc8830b1e51cc736948b3d261796c3fa877df02ae15568c4b" + }, + { + "path": "crates/oa-desktop/src/navigation.rs", + "bytes": 8839, + "sha256": "71355a12e1b4791106426d83fe5ebf0b29bce8e1dc594f0655ab85695469669e" + }, + { + "path": "crates/oa-desktop/src/port_edit.rs", + "bytes": 7809, + "sha256": "70b99f577c4fdeda8780c8dc1ee7b1639fd77aaca06658f06d725139fb3efb6d" + }, + { + "path": "crates/oa-desktop/src/port_preview.rs", + "bytes": 35855, + "sha256": "069487c4ece737d52e8ae4a84dcfb132236aca6799e841c91c8e7244320cf871" + }, + { + "path": "crates/oa-desktop/src/port_workflow.rs", + "bytes": 40582, + "sha256": "ccc15f97c3272145a67bb5857b4faeaf7437561bd61912fa27ab26e8824146a0" + }, + { + "path": "crates/oa-desktop/src/recovery.rs", + "bytes": 21041, + "sha256": "57e22e5fbb0e994e64ae03e69450271fe9f04a951db1670c2a018abe99db4489" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/README.md", + "bytes": 1587, + "sha256": "a90002df1e087d2dac7be26926864243568a0de7c4103e4927435b34178e8016" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/profiles.json", + "bytes": 473, + "sha256": "2c12ae96b50e6da5d60ce2b7fa00204be71dfbe2fd51311fc337a0de6a4332ff" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source5-bundle.json", + "bytes": 80974, + "sha256": "12715995e6f7f35414aea53b3ad720b9b31873ffdeaf4444231db1a5ac3c463e" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source5-model.json", + "bytes": 86191, + "sha256": "5535a706df9ec21715e8b6a5aa6dbd79636ae461450aee61305559016167612b" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source6-bundle.json", + "bytes": 85286, + "sha256": "ea88890a33f47d67dfb06d6dbbcc179058cf28dad76ae7d615c00aaf30dbbbfe" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source6-model.json", + "bytes": 90629, + "sha256": "5bb8db0b6394276666323483f977ac3586f88554c81a148c6d508fca0ef4576f" + }, + { + "path": "crates/oa-desktop/src/recovery/source5.rs", + "bytes": 6956, + "sha256": "0f0a763f0c98c2c908d4c2b95d8a4c042b6a255ee1cc16260e5404669691f642" + }, + { + "path": "crates/oa-desktop/src/recovery/source5_tests.rs", + "bytes": 12146, + "sha256": "cfd17a742f1f27b523fce7cd9309f0a07a30413395f6c58659fb91d02834a7a3" + }, + { + "path": "crates/oa-desktop/src/recovery/source7_tests.rs", + "bytes": 18213, + "sha256": "7ee61de66c75bf949489ba51ddc9677e2b4efc68801cf27909c9b894bfdc9288" + }, + { + "path": "crates/oa-desktop/src/route_edit.rs", + "bytes": 2941, + "sha256": "457ae59c2761a43a8620b4d336a7cf0f54b965997110ecaf968756a88b6b0374" + }, + { + "path": "crates/oa-desktop/src/semantic_review.rs", + "bytes": 3432, + "sha256": "8dd1e93783d63a663c7e56c28775a5c389cfd7a6b562013d6a95c891afa21ed8" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts.rs", + "bytes": 24201, + "sha256": "a79236a8150597ff808597e59cf4f1e9e61c74c4901d9c8cf42d3427bb52a9a8" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_recovery_falsifier_tests.rs", + "bytes": 11034, + "sha256": "3f255d04e4bffa5a467b75e3cbf6f7149aa3269a02f2a89fbaa1db0e5df9ae62" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_tests.rs", + "bytes": 20798, + "sha256": "04d0dd2ac453705185663f705282aa4a3a31433466a5be305764248da1a03c32" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_view.rs", + "bytes": 6447, + "sha256": "2100ff73565765d8293c84f6ce2d8e566610c1524c50e32ce3c37dc33b6686e4" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments.rs", + "bytes": 18160, + "sha256": "de0ec0c740895b160ff5b847332c087c3f1a48931583464069470cc61315ed59" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments_tests.rs", + "bytes": 29389, + "sha256": "8b26be0324e0f33b1e7cf7af340350df8ed98963002d6da8589ee0e6f6900bea" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments_view.rs", + "bytes": 3032, + "sha256": "932f231554d77c7cb119d33bb06b9879db5e12127aed187e67013e77b6458e78" + }, + { + "path": "crates/oa-desktop/src/semantic_review/batch.rs", + "bytes": 34485, + "sha256": "a462eb627ae19348072775cf8e60b17d62f6b682b74cc413906d493fba1f0b3c" + }, + { + "path": "crates/oa-desktop/src/semantic_review/batch_tests.rs", + "bytes": 27546, + "sha256": "b67c4d7dcabac710cf3d30730a8db323180a558a415e2d117c868cdfa4804619" + }, + { + "path": "crates/oa-desktop/src/semantic_review/compose.rs", + "bytes": 27155, + "sha256": "c6adcc9882dde65e9f04f6eda7f0c855c5cbb285cf421123029169112793ce9b" + }, + { + "path": "crates/oa-desktop/src/semantic_review/compose_diagnostic_tests.rs", + "bytes": 9809, + "sha256": "440daf8d43278ef981c620d1818d0daaed8fb83193b8e8ff67b2e42fbf882938" + }, + { + "path": "crates/oa-desktop/src/semantic_review/constructor_tests.rs", + "bytes": 54132, + "sha256": "85149521ad7df62918f6f2fab6da2b3346c342ab4bce7100de3f6206c1e81096" + }, + { + "path": "crates/oa-desktop/src/semantic_review/constructors.rs", + "bytes": 12258, + "sha256": "0982163439b06a42d9af1643530364109282e63f05b323a35a76d8241f3caa32" + }, + { + "path": "crates/oa-desktop/src/semantic_review/history.rs", + "bytes": 3211, + "sha256": "df038c2464eab8093a983f3104f0d04ca8f602010a50e1d3eeb8e53f2309e201" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed.rs", + "bytes": 14175, + "sha256": "bdd6c0fdc7108056bc5d7433254503449eed2209813680e717ead24b9d0ce834" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_rows.rs", + "bytes": 13222, + "sha256": "4b7bf25806471ad22d89253b9af8000f5acff53b4cc0aa1c1a83138e7b270eca" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_rows_tests.rs", + "bytes": 30804, + "sha256": "1a3b09e7ed100411cdf8043f9a78defc664a873ee0201117709185c201a5c57f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_tests.rs", + "bytes": 31163, + "sha256": "9dc9b989e5a9d408427ca1baf86b2454f9dd3baf40a551c70ca2359dc18a1227" + }, + { + "path": "crates/oa-desktop/src/semantic_review/message_kind.rs", + "bytes": 789, + "sha256": "4ed19952ea511d1b3226564a138e3322f994371d6b49794c14bc3689d1393e7f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/message_kind_tests.rs", + "bytes": 23424, + "sha256": "5fcf9930e949aebeb12eab0327264f32a2388d62dbf098bd2365711e22623c52" + }, + { + "path": "crates/oa-desktop/src/semantic_review/ordered.rs", + "bytes": 9705, + "sha256": "6a1ed894d1b9d0110bc784a75c49444f1d14f1f74620d701f22203b2d8d0a813" + }, + { + "path": "crates/oa-desktop/src/semantic_review/ordered_tests.rs", + "bytes": 22383, + "sha256": "5c8ea3a69e3da3b94d13f50f12aa7dc53246ccba25ffcace9552a0eb76b0bf36" + }, + { + "path": "crates/oa-desktop/src/semantic_review/recovery.rs", + "bytes": 28769, + "sha256": "88e69044d90c481593bab7cc125f0401c05202fccdde07698cec9483947fe8be" + }, + { + "path": "crates/oa-desktop/src/semantic_review/row.rs", + "bytes": 38159, + "sha256": "b08fdc503c6c4d2ff99adac7e18c9baa861bf86155e00b55d1e492430980d0f2" + }, + { + "path": "crates/oa-desktop/src/semantic_review/scalar.rs", + "bytes": 15153, + "sha256": "9ad202174934dd9a63fbf9cba43135aead571db60846c8b7b1d3019a11df26c2" + }, + { + "path": "crates/oa-desktop/src/semantic_review/source7_tests.rs", + "bytes": 11665, + "sha256": "5e8221d77b068fa30c1571988448cb8829711735881d810f3d333cbc95d34a9f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/tests.rs", + "bytes": 32480, + "sha256": "077ec6501dfaab0b05ea3987943b204f08352952296d313555051d998ccd232e" + }, + { + "path": "crates/oa-desktop/src/semantic_review/view.rs", + "bytes": 57626, + "sha256": "7cc7dd213ab01dadad5debaee868c30a1099466602869a799ebdf9b680e8eaf0" + }, + { + "path": "crates/oa-desktop/src/semantic_review/view_reserved_artifact_tests.rs", + "bytes": 4737, + "sha256": "6c766b29c8664d15cb113d2cc71bba9b60ae4ccf7e44c9c5d3c41e1dc4b7ed90" + }, + { + "path": "crates/oa-desktop/src/source_navigation.rs", + "bytes": 3938, + "sha256": "c1da10882f35f8eb0675e68c642c9a209dde09679cded414cfb9903a4e49ec77" + }, + { + "path": "crates/oa-desktop/src/source_tree.rs", + "bytes": 21816, + "sha256": "4d55e0110a1eb128a5d26c28f3aae5853d79b7245812b7c82bd275f38440a5aa" + }, + { + "path": "crates/oa-desktop/src/source_workspace.rs", + "bytes": 15522, + "sha256": "30f63a6b8d65a38d66061f90d864b5746cbacc0fbd65abc028a8f3071c47d358" + }, + { + "path": "crates/oa-desktop/src/style.rs", + "bytes": 3015, + "sha256": "05d61bec16141612ccafa0988e8c4827f41754509efdb3b961eab69127ded896" + }, + { + "path": "crates/oa-desktop/src/tests.rs", + "bytes": 58557, + "sha256": "b017218195eea2c96aba12eba8a99a38945c8ca910a652e272d34883bdb98691" + }, + { + "path": "crates/oa-desktop/src/view_copy.rs", + "bytes": 9043, + "sha256": "5630f31c942e1226aafd67eabdace6a5c5494875bdc6f7f077019e8110ba41a9" + }, + { + "path": "crates/oa-desktop/src/views.rs", + "bytes": 50668, + "sha256": "9b53126d19b2ae34f170a1422c9f5ea5a833489274cbfa04546279058e289f9b" + }, + { + "path": "crates/oa-desktop/src/views/traceability.rs", + "bytes": 7501, + "sha256": "4c89dcf35c25e737d8cce4d543a5989ca104a5678e6cf40df47e457773d2ef94" + }, + { + "path": "crates/oa-desktop/src/workflow.rs", + "bytes": 82963, + "sha256": "d9e7b11a86fd3ec79d91f0c9bc9cebd5a2043cdaa7261622454fb7730ad8e060" + }, + { + "path": "crates/oa-desktop/src/workflow/communication.rs", + "bytes": 11084, + "sha256": "34d121ad97706012722e4bb6210072ecc3a5b4718b0ceab0c3d0f14d4cd780a1" + }, + { + "path": "crates/oa-desktop/src/workflow/recovery.rs", + "bytes": 9859, + "sha256": "0849b0f34dba5e8761be5fa05784d134ac74e4e9db395d6b9b7d6cff71e3f3dc" + }, + { + "path": "crates/oa-desktop/src/workflow/transition_tests.rs", + "bytes": 8553, + "sha256": "589b1b2dbadca74a52c2cfcfd4fe620bd4790abd113ac02182e91616c52d793c" + }, + { + "path": "crates/oa-server/Cargo.toml", + "bytes": 778, + "sha256": "527ff5e15010a8b560a6659aa1ae4bf0c8df0d9e019f03c47529ec6a750c0982" + }, + { + "path": "crates/oa-server/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-server/src/error.rs", + "bytes": 5610, + "sha256": "93817f1502386e4662c96ee1c7d1c4afc4e33bda6fd64e46c86c8e1afd5a9368" + }, + { + "path": "crates/oa-server/src/lib.rs", + "bytes": 7743, + "sha256": "20bef350350ed6339588b23af684abf745f97916c7edf3853ee042abe687e664" + }, + { + "path": "crates/oa-server/src/main.rs", + "bytes": 4163, + "sha256": "d59a6a2b5c7034bd2e00a516d2d49abb16391bf0316c1c357ddafb9c82d2d1e3" + }, + { + "path": "crates/oa-server/src/preparation_http_tests.rs", + "bytes": 5523, + "sha256": "454b90d0055d35644c8d990cd7576ddf675a9b271ca07fe9b0efce25d8ddbc07" + }, + { + "path": "crates/oa-server/src/routes.rs", + "bytes": 46053, + "sha256": "3f9a0c22043dbf28f7a8e587d2fc3abf869f76f4d23a46fe0aeb9c4392454a4b" + }, + { + "path": "crates/oa-server/src/store.rs", + "bytes": 25524, + "sha256": "37dcfb845b7993d5bced2bcf25fedfcd2a9c20a748f9315afe6cca1f41f89ae5" + }, + { + "path": "crates/oa-server/src/store_preparation_gate.rs", + "bytes": 4440, + "sha256": "427c390da3c0281ba1fe115a93ea90800e3b45fce6bcb9185e71982ddd885fec" + }, + { + "path": "crates/oa-server/tests/http.rs", + "bytes": 71892, + "sha256": "50daa6a90e96ad6fe3c6a27df2eaebe486270599c203892d09769c547a194975" + }, + { + "path": "crates/oa-server/tests/http/communication_limits.rs", + "bytes": 5790, + "sha256": "ba5474dd8e494a0176fffb4548c8e3deb2081b15de33bfce82394c764e0a2c16" + }, + { + "path": "crates/oa-server/tests/http/data_contracts.rs", + "bytes": 25949, + "sha256": "8cd456db83f301baca380acf025a5a99db4edf7d8839537dfbd02c4307e10e6b" + }, + { + "path": "crates/oa-server/tests/http/port_anchors.rs", + "bytes": 15086, + "sha256": "7199d0a208ddad9e1518b6e3fb390d64da111716d7505ba5c995deae19ad1258" + }, + { + "path": "crates/oa-server/tests/http/semantic_transitions.rs", + "bytes": 22832, + "sha256": "856d1c9b633ffb581e3e631f4e5a607789a02181dbf060667f208a569bfa4920" + }, + { + "path": "crates/oa-server/tests/http/source6_views.rs", + "bytes": 13023, + "sha256": "867bccda0e030eeeb9976b4ceeb47b21ab5044d700278022d5fb495bbb64ca07" + }, + { + "path": "crates/oa-server/tests/http/source7_contracts.rs", + "bytes": 11000, + "sha256": "0e0a467186da7263c0754890aff69ebd0d92d36b5224e4865bb6854b18dab7e8" + }, + { + "path": "crates/oa-server/tests/http/source_projects.rs", + "bytes": 30907, + "sha256": "8ff580f317ec267d1cd72ae14d8638f74a77cdf99ca4c78f66f4290c2d77460a" + }, + { + "path": "crates/oa-server/tests/semantic_http_contract.py", + "bytes": 7251, + "sha256": "4737ff94f10761f94151a694414c5c62737e0391ec820bca132830652bc4cca2" + }, + { + "path": "crates/oa-server/tests/semantic_schema.py", + "bytes": 25111, + "sha256": "cacca116c42ffbc097f1419c0f89921fa0dfd3faa864d46820ff744cfe6967f9" + }, + { + "path": "crates/oa-server/tests/state_representation.rs", + "bytes": 12241, + "sha256": "6686c826f28248ae4b63ec3f2112e193d4a347724b87974483217fcfee49cd61" + }, + { + "path": "docs/acceptance.md", + "bytes": 3463, + "sha256": "32ed3e4fed63f5c464e0937221f401d71623b276dd70f083531ac6ccebbf9050" + }, + { + "path": "docs/api.html", + "bytes": 72515, + "sha256": "a06126cb741da57e9c06e83fc4137ccde0de05562673546bc9d405878f51ea07" + }, + { + "path": "docs/api.rst", + "bytes": 41929, + "sha256": "ca7d310138c3b4d429d80a1d03d1ac8d4a9296069e205da573034256d10438a7" + }, + { + "path": "docs/architecture.md", + "bytes": 10974, + "sha256": "a50bd1645222ef3e574fa07a6ab9aa213431ee8833c6c0158ad91ce0f799543c" + }, + { + "path": "docs/language.html", + "bytes": 175111, + "sha256": "67dcfa3477b48a0b07298ec81741840cc3ccff12c7d58164873d746d41d611c8" + }, + { + "path": "docs/language.rst", + "bytes": 134663, + "sha256": "12229dd7d52fbaba80fe599d499f29b535f4c37c7be0585664d17edf0466ba33" + }, + { + "path": "docs/linux-packaging.md", + "bytes": 8671, + "sha256": "41a1bb1095801df37a1411341c5791d55ea8c365739314d599a60269ac4bc7a0" + }, + { + "path": "docs/openapi.json", + "bytes": 346920, + "sha256": "bc5825a3182a4df5f6710a80262f4a09b4c15f0e4cda7ca74e1746ceca81a89b" + }, + { + "path": "docs/research-v2-architecture.md", + "bytes": 40445, + "sha256": "1b3809f2dabe6b1805dbf3d3f2625c471cd21356c7bd603916466a8c4ced8090" + }, + { + "path": "docs/research-v2-semantics.md", + "bytes": 31535, + "sha256": "b7ec3677300248926a88b84da3e7ffe52f5b73524c7712c927a0e951569db04f" + }, + { + "path": "docs/research-v2-service.md", + "bytes": 36209, + "sha256": "4828df5bc679e7c71f49b4b85c9e7dacbec52f46d416fed48af70e08886d4e4e" + }, + { + "path": "docs/research-v2-ui.md", + "bytes": 3245, + "sha256": "894e721b59a8ca85f0d95b6706ed5f130a0372def460cf33aeefc9e5e38cde0a" + }, + { + "path": "docs/scope.md", + "bytes": 16690, + "sha256": "a1d0cfbfc06fc8bc2bf0f71343aacc8853cbbbfc00a1fc9852ddf41c8245ffca" + }, + { + "path": "docs/server.md", + "bytes": 23361, + "sha256": "4eb24937d424ba8b384e1734e02a6f8e963ae11d2715889c92b14b39ff2e4a48" + }, + { + "path": "docs/source-cli.md", + "bytes": 3374, + "sha256": "34f12b72cc6d6ead4f47c7818c1897db592f8ad493c70776db2ab48c24d8f051" + }, + { + "path": "docs/v2-interface.md", + "bytes": 11807, + "sha256": "c7fbaf0ebd3fc9f6c11f818db2b0b9d68a33f580cfced22bde83ce08ae790bc7" + }, + { + "path": "docs/validation.md", + "bytes": 6505, + "sha256": "f46ea950ed1a54409aa07c4f9e90f39f8e2d00c1dd1b6cb805caa3993845967f" + }, + { + "path": "docs/windows-packaging.md", + "bytes": 10406, + "sha256": "2c852ff7041713ffbff3c951ac98df647c51fb70b0feba9000f7bfd5bc2703a8" + }, + { + "path": "examples/coastal-rescue.arcadia", + "bytes": 33107, + "sha256": "7e183ef9fd8154d3074303f1956cd0d9871c19e3ffc630d333b0bffbd6e30e17" + }, + { + "path": "examples/coastal-rescue.json", + "bytes": 49715, + "sha256": "242f0b031229a87af5c4ebe5d651defe59c191a6b7a69dc0a77f7e203411f195" + }, + { + "path": "examples/legacy-v1-coastal-rescue.arcadia", + "bytes": 3449, + "sha256": "4dbbbdf8bc7e6cb8e0a81dd678069dae585a9e5187c59bc3665e1fdab3f1a86a" + }, + { + "path": "examples/legacy-v1-coastal-rescue.oa.json", + "bytes": 5976, + "sha256": "fd0e9dedfb7adb922dc0575cc2b820d40344d639f1d8052bd70363aa59de9c24" + }, + { + "path": "examples/release1/README.md", + "bytes": 11137, + "sha256": "113cfb1cf38a98b51bff60442d86a35d636a3d80ef206bece7d53d0aae67f2d5" + }, + { + "path": "examples/release1/evidence/repair-check.md", + "bytes": 1419, + "sha256": "f4db17bdca4ecbb1bf0caef01b2da5f1f7f798ab3152b648ce6dd8696a6a68e5" + }, + { + "path": "examples/release1/expected-diagnostics.json", + "bytes": 288, + "sha256": "3700393d76b940cfc076bf52861bd7b1f43370f8eabce3594531bd0bf1fc851e" + }, + { + "path": "examples/release1/model.json", + "bytes": 134520, + "sha256": "ef0ef4006c3e09d5db6e1b621256b3f7d6642f3a7b09cc34607cfbcca830c727" + }, + { + "path": "examples/release1/model.rs", + "bytes": 28762, + "sha256": "15f30f6bde655808fe754665c26d560e36f2a9bad340f346b09137d0d05045f5" + }, + { + "path": "examples/release1/oa/activities/activity_oa_restore_work.arcadia", + "bytes": 1307, + "sha256": "83e73d0a013d5c3e1a4af0d9139ab0cfa362d25a846671fc2dac59181061a9d4" + }, + { + "path": "examples/release1/oa/behavior/process_oa_assessment_procedure.arcadia", + "bytes": 697, + "sha256": "172c32c044ef4b5bc58a1f4635cc81f48dabb4014479b47dce7b25fedf2dbd0d" + }, + { + "path": "examples/release1/oa/behavior/process_oa_field_procedure.arcadia", + "bytes": 1781, + "sha256": "d2552dc5383e2e91cb302a790364e197f663c2edc013a2ab1978789825c9c324" + }, + { + "path": "examples/release1/oa/behavior/process_oa_response.arcadia", + "bytes": 3225, + "sha256": "cf86f46fa5c5d70592ef43f1bc1cb4d968efd8add384ba88036bef6b88aa4abc" + }, + { + "path": "examples/release1/oa/behavior/scenario_oa_conversation.arcadia", + "bytes": 1795, + "sha256": "b25be524e98a35ebac5e4481b7609c027b32baf9605e8097f807560f94a77ca6" + }, + { + "path": "examples/release1/oa/behavior/scenario_oa_full_scenario.arcadia", + "bytes": 1261, + "sha256": "00a1edf2c9707a0eb62ac070c2d02467874f2c9c1f273cc6ddb53d6d65999a1c" + }, + { + "path": "examples/release1/oa/behavior/state_machine_oa_monitor.arcadia", + "bytes": 2022, + "sha256": "447c9ad1359f4a31ecf975ad07c0b08d8e7e03191fb0858e2fc56f377b223cd5" + }, + { + "path": "examples/release1/oa/capabilities.arcadia", + "bytes": 781, + "sha256": "fc8012e5554350b12e1cb80080f8feab80d933c9b33c0f2a7bb500cb7d609936" + }, + { + "path": "examples/release1/oa/model.arcadia", + "bytes": 661, + "sha256": "f7cf914766ea73ec53b85e32d117ea9a9dba52d3e038246863541ae7069b1a15" + }, + { + "path": "examples/release1/oa/participants.arcadia", + "bytes": 1834, + "sha256": "951764c14179f27c10e315acf2ea37d1fff54c77b8441e23addd239e8c715ce3" + }, + { + "path": "examples/release1/oa/types.arcadia", + "bytes": 788, + "sha256": "9d0396fb82dd5733edd8d1cf52f968ca84906927c704f9cf0944a7fae215cf49" + }, + { + "path": "examples/release1/project.arcadia", + "bytes": 1958, + "sha256": "b2674e6bf77cfe0f6f0ba79c81d2e96d92f39c02ca2c6266d80e91723bfb9fda" + }, + { + "path": "examples/release1/sa/behavior/process_sa_assessment_procedure.arcadia", + "bytes": 706, + "sha256": "73928ced61c06cbc08728d7956676a50fd4c05aa5b7f1ff4f29ce27a0b0f2088" + }, + { + "path": "examples/release1/sa/behavior/process_sa_field_procedure.arcadia", + "bytes": 1790, + "sha256": "886d462af83110cbfa55dd232a667ea1446761234471357cbb878794e98e8768" + }, + { + "path": "examples/release1/sa/behavior/process_sa_response.arcadia", + "bytes": 3234, + "sha256": "041785fc22842423822431bd5e6e8d16094ebd0716965e7c765fb8c1d7549e8a" + }, + { + "path": "examples/release1/sa/behavior/scenario_sa_conversation.arcadia", + "bytes": 2127, + "sha256": "97276f5757ee9aa12a0dbd9d3ccd58174b3091162bb8bcce357cec20a45f5d85" + }, + { + "path": "examples/release1/sa/behavior/scenario_sa_full_scenario.arcadia", + "bytes": 1256, + "sha256": "e12fc406b99d60a2f7768aaa0b25ba560e8605f0b8e37f3a7cdd3b8443562b74" + }, + { + "path": "examples/release1/sa/behavior/state_machine_sa_monitor.arcadia", + "bytes": 2022, + "sha256": "05ce29af99424c491c47fe2450dc6f5f8ce995511c01ec7e17bb5855be3c9736" + }, + { + "path": "examples/release1/sa/capabilities.arcadia", + "bytes": 781, + "sha256": "b6912fb3ece439912345fa71724acd462e716a1e5a88203a1058a5c3b2c20a4f" + }, + { + "path": "examples/release1/sa/functions/function_sa_audit_thresholds.arcadia", + "bytes": 297, + "sha256": "e5a04325d52183956dca814dd90f4e56c96c6b7db0f4f202f203ecb49c3e0f4f" + }, + { + "path": "examples/release1/sa/functions/function_sa_restore_work.arcadia", + "bytes": 2576, + "sha256": "fddeb67308051325041fee641fe758ddf43345b7c47b66d433616ad07fdccdd6" + }, + { + "path": "examples/release1/sa/model.arcadia", + "bytes": 661, + "sha256": "d431509251acb859fbb98733b6d18add952495e10a78703fbe8f31e40bc083c4" + }, + { + "path": "examples/release1/sa/participants.arcadia", + "bytes": 4012, + "sha256": "780d2eb08b217b67b55febb3d34846f727b8ee9018df6c5741748647e36b2ff8" + }, + { + "path": "examples/release1/sa/types.arcadia", + "bytes": 1227, + "sha256": "101fc0fbd99f1101514aa7b6da4f8e535aae0bb94c9e2b9e7e6c151135b28660" + }, + { + "path": "examples/release1/traceability.arcadia", + "bytes": 29506, + "sha256": "48a96f543456c9b5a5798fc795594e4119147fe45f11a6f109f141b7f514560f" + }, + { + "path": "examples/release1/transition-before.json", + "bytes": 35801, + "sha256": "2253e6434f741687e22327c37d520ed15c043bc36025498650bc2366bb6a874d" + }, + { + "path": "examples/release1/transition-request.json", + "bytes": 4276, + "sha256": "43b9a22e5f95ad3bc0ebd2478ead0e14406854abc989ae94ded9367b013d812a" + }, + { + "path": "examples/release1/views/diagram_oa_allocation_view.arcadia", + "bytes": 2176, + "sha256": "dfc0eb61e0e2aa5bda45524571fbfa3494f44ce19696f3e15e07438074a07bc7" + }, + { + "path": "examples/release1/views/diagram_sa_allocation_view.arcadia", + "bytes": 2173, + "sha256": "b78b43a26a82efb8fbd5374b09c329fa341f57b29f635d397b9ef8aede71d389" + }, + { + "path": "examples/release1/views/diagram_sa_capability_view.arcadia", + "bytes": 1620, + "sha256": "75e8dc9fb30f25d6f8fd3c6b595593ab4f98958a25798f961e336e0fac557649" + }, + { + "path": "examples/release1/views/diagram_sa_service_view.arcadia", + "bytes": 2209, + "sha256": "b08c84f3ea633e7c78dfdad3272f75415f6256cf3614b6d99bfd4f0269076c9b" + }, + { + "path": "examples/release1/views/diagram_sa_state_view.arcadia", + "bytes": 1931, + "sha256": "5f42f4c605e57b817d8400ed21f2b14bfc4e1592aebe941ff113767504c2b869" + }, + { + "path": "examples/routing-workshop.arcadia", + "bytes": 66431, + "sha256": "dc6b75da72884d399132ed9e300fa5a26b73d802bb526c9af986ae9eeb0a646a" + }, + { + "path": "examples/routing-workshop.json", + "bytes": 100281, + "sha256": "8592714f75b271133f21ce017d87896b6cf91ea0e4837f1c2ed453e21be26b14" + }, + { + "path": "examples/source-project/oa.arcadia", + "bytes": 2142, + "sha256": "5f60642f211b2d352a951092faeeb7503d4fb7f6f7fca99e810347231101d31c" + }, + { + "path": "examples/source-project/project.arcadia", + "bytes": 606, + "sha256": "787f6b67b179ffd221f7e5faf1a4edd74cfd116aa1e3b5e9ed9f22fbff612d8d" + }, + { + "path": "examples/source-project/sa/assurance.arcadia", + "bytes": 682, + "sha256": "ab76044836e4dcd42a82d316846ec87da2108939aa2037640c5bca1d2ecdee0f" + }, + { + "path": "examples/source-project/sa/participants.arcadia", + "bytes": 1231, + "sha256": "1abad579812e77877b45a3d8e3c3e9da734be2d04a0254cc730a5257ebd2dc88" + }, + { + "path": "examples/source-project/sa/reporting.arcadia", + "bytes": 2839, + "sha256": "f0b7443f728912ca163de39b6055876b533a77feaa3219b2d40a2dd65712e058" + }, + { + "path": "examples/source-project/views.arcadia", + "bytes": 3508, + "sha256": "e29ad3f406a6a50d2f0ae2ca2a53ee3b0c18222cd4098704a46d4f48b64ea17f" + }, + { + "path": "examples/text-first/README.md", + "bytes": 1367, + "sha256": "4ec8250d5ed556f1d496e8c85137e973e802ecb11df1a36488411e8cdc5a9f9e" + }, + { + "path": "examples/text-first/project.arcadia", + "bytes": 480, + "sha256": "f441535c623e0cf20e1875eb2cd33b587ed00e078c37af39cb36d89bb5edc19a" + }, + { + "path": "harness/fixtures/basic-editing/README.md", + "bytes": 12012, + "sha256": "3545d9695e7c62e0caa818efd7f4dc426f04876a3626e0f3b1bad606b258cb26" + }, + { + "path": "harness/fixtures/basic-editing/base/expected-baseline.json", + "bytes": 4524, + "sha256": "f239e728d650b0af32bb8f3dcaf6b27c99b9c5041132ac14e51756ea6563d978" + }, + { + "path": "harness/fixtures/basic-editing/base/project.arcadia", + "bytes": 3077, + "sha256": "045cb047d7bfbca72c3fb30db4c81a30ad463d3af7fc51604906ad7fa75a1ff8" + }, + { + "path": "harness/fixtures/basic-editing/base/rationale.arcadia", + "bytes": 57, + "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f" + }, + { + "path": "harness/fixtures/basic-editing/manifest.json", + "bytes": 447, + "sha256": "d23c21b02064ddb85e051e10e16ff089daba8d9910bb1a695dfabe2db3757734" + }, + { + "path": "harness/fixtures/behavior-creation/README.md", + "bytes": 5954, + "sha256": "9e5fc751424d12cfe76a84abb1da45b2d38947409179451bb90ffe7e7ddc8723" + }, + { + "path": "harness/fixtures/interface-operation-probe/README.md", + "bytes": 2604, + "sha256": "088f0bdb3375deb8f2c7e3b749ca8d210ea828ca4dece69b3871b674e3110175" + }, + { + "path": "harness/fixtures/interface-operation-probe/hashes.json", + "bytes": 977, + "sha256": "f6d3e8aa42f40f64ce2ecba7b9cf112eb9091f3cccde3a592b0434e834cf2a6a" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/after-reset-deletion.arcadia", + "bytes": 4218, + "sha256": "c0fe9570684c0061efc4cad65e339fede6961b04ca90c6f324c787bd65e61226" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/after-reset-deletion.json", + "bytes": 7835, + "sha256": "93187f7a1b476a44185725c6b15f2e1767482b6911ab1280144348d033eb51f0" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/boundary-only.arcadia", + "bytes": 4771, + "sha256": "02f85e39957ebe6d56336fa729a5c8b10f51865face9d3b2c9679200571fcfc7" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/boundary-only.json", + "bytes": 8840, + "sha256": "756f9710336e6734ce3592ca774c6f104bba5a37c9e165540eb39326682393d1" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/explicit-functional-refinement.arcadia", + "bytes": 8635, + "sha256": "ac5b629ba5596464f9f8a975b8bc2764e3007ceb7342de3f828d4b18e4f069b7" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/explicit-functional-refinement.json", + "bytes": 16160, + "sha256": "78a47c978dc667aa1c45af711f06aa2a0d3c581003013e30c3e02fb0faae2e64" + }, + { + "path": "harness/fixtures/interface-operation-probe/probe.rs", + "bytes": 11274, + "sha256": "72b1b443e25eb20420dec4477b0fb5ef5d1c705e3882c81df88dd578ab96a426" + }, + { + "path": "harness/fixtures/release1-native/README.md", + "bytes": 2564, + "sha256": "5f5ba040fd2df9261a29bcab3f9a7ae27c3683265411ad3dda0b467d5df8590e" + }, + { + "path": "harness/fixtures/release1-native/artifacts/README.md", + "bytes": 4155, + "sha256": "24200c84ccc2ef3e17c029744074e5cea785188f5549ac54e44cf89682643f81" + }, + { + "path": "harness/fixtures/release1-native/artifacts/generate-semantic-artifacts.rs", + "bytes": 9275, + "sha256": "444f360b78df52c5e42046f77b148781e0c9bddc2a09c0b7bd65c7a4f376cfe6" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.after.arcadia", + "bytes": 7768, + "sha256": "84b22e95c213018612e6e8a84cad68b35a8b495ff3515b0f978c5e7a3d196d79" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.after.json", + "bytes": 7330, + "sha256": "13a6f99ec2df1dd35ee8b2613f183918cd9537eda4a5da085ad52e65c033db59" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.arcadia", + "bytes": 1446, + "sha256": "1e0d662ba33071b122ad9206d2d559a8e748c9431eb3ac1b759bde3760ca877c" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.json", + "bytes": 2216, + "sha256": "fa6a2e3643c0f909b92407abec3edc897033162eeaa501f8d4616f79d41fa044" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.manifest.json", + "bytes": 567, + "sha256": "65cb70b0d697a055363ba01bf30bed7e412d43c9978a033549c378d117719ae7" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.request.json", + "bytes": 3991, + "sha256": "ed905267263e7f8a0cd2dbe833196b30118b6a246815216932fae661ad650699" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.after.arcadia", + "bytes": 6837, + "sha256": "e50fc462ec22dbf98011929931dd2489430001c3e6433608685b9d88bceb9acb" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.after.json", + "bytes": 6433, + "sha256": "f27a7b38d59c7cefe58cb36783d3d4dd8d8ae1168d9aed1eb61d343c18758908" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.arcadia", + "bytes": 1807, + "sha256": "eba2aec39e6efb405eace4bc8ab0c5563907c26d449e71a4aa750df9f73233b4" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.json", + "bytes": 2673, + "sha256": "2ef777f19b94f08b5e5ca2ef727777897e1018f1426eee291408b3c69101f596" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.manifest.json", + "bytes": 519, + "sha256": "3af7232ed3056ca84dcaf0f266ead3faaa512a0dc0051c7ba68791c20dbae0cf" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.request.json", + "bytes": 1246, + "sha256": "8af21b00b62e620256fbf50e47c6c5836cdb6922d9549cc4b3d86bc03b008073" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.after.arcadia", + "bytes": 4200, + "sha256": "20bb30473830e44228958e78fb7480269cdcc0580c6c90c718da75f34ca5a43f" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.after.json", + "bytes": 4552, + "sha256": "44f4b05db49758dcf344788f57cecc0250fd029099b1c54e4e1e3e972f6cf039" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.arcadia", + "bytes": 1808, + "sha256": "b0fd031671c9f755756922ec5c40a0ce3f40164d22c3c389aec9fd0705344da7" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.json", + "bytes": 2673, + "sha256": "1acf81e08c51c85aceb14a3efbc39ec680552a19c7824aab4611ac3cf71b9c6d" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.manifest.json", + "bytes": 610, + "sha256": "a07978f4b0a3ca83e5ae5f35e7b66b26473b24431fc90e5889d755f1816d52dd" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.request.json", + "bytes": 2352, + "sha256": "5ff844a038b0030adb5a83d13d81e60f30627543388f6199b6a0e026fc42ea58" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-native.md", + "bytes": 4075, + "sha256": "a51ffbc45b6c172cbfed3b16c249296e6a28d457fea57393dd958cdcfbafbca1" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts.hashes.json", + "bytes": 2367, + "sha256": "3ad8b7428b3ed7585a91e7f5d9d5f4880caccfd0b08dca25d05af523e62e0a10" + }, + { + "path": "harness/fixtures/release1-native/communication-means/README.md", + "bytes": 15091, + "sha256": "015c16010c212af283f9def118c6d263ba65a3bc6e81a750f180624ca69bb311" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/entry.arcadia", + "bytes": 6098, + "sha256": "a6976e7c21031e7cc3cb731e20c3075cf89cf85144dc8d3f52930f8521ea196f" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/expected.json", + "bytes": 10480, + "sha256": "60c4419415c546f06c9972ac7bb0e530ada7b30a200b59e75ddda231a24f9a3d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/traceability.arcadia", + "bytes": 407, + "sha256": "3c41459f2b0706a767988738bf8126f76540415bb5940d9c5db19cbe8c18182d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.request.json", + "bytes": 1331, + "sha256": "b16e673b29c96b5aed681389ff7669110abe552939e86dd0ec6011c9a45ed860" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-draw.arcadia", + "bytes": 5239, + "sha256": "a511a4d817d9c5c80233bce83e84a7056b7dce7afd9fcc25696e333f8f4df055" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-draw.json", + "bytes": 8424, + "sha256": "7140114926228b1c378c450535f7a70992c71a879a8d2270c49e8d5f04a2f484" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/entry.arcadia", + "bytes": 5710, + "sha256": "910e6dfe609467047ce629ec9c626f4e927cada74bfbfa164414a8fe6783ea87" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/expected.json", + "bytes": 9868, + "sha256": "567259e20c9f6278776e8fa99b8b2fdbbc9a883ad875c5d39dae1b53de3a2924" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/traceability.arcadia", + "bytes": 407, + "sha256": "997f72fe9258012df66e88344cf39c1a2cebf2327f604056b67f7f2a8ebcfbfa" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.request.json", + "bytes": 1127, + "sha256": "cb3fe05859cfffec6f8846c19983dc462413bc0ea4f6e19204f09c259919c4b1" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/cm-reverse-scenario.arcadia", + "bytes": 8209, + "sha256": "ec826b9b84616507490ac30e4d57100dd6338dba2f7071e879a8fb58820a85c5" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/expected.json", + "bytes": 19735, + "sha256": "ef07e4d2d3fc36004ff01739838281581d9a703c747611eacc01bb9cc672489f" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/oa/behavior/scenario_oa_cm_200.arcadia", + "bytes": 1488, + "sha256": "0ec8d7e38f5a5cd56ccf3979757b3a9f412ad0ae36ee6c2690b7872129046d70" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/request.json", + "bytes": 1090, + "sha256": "c0ac99ee186d126fe3ec57f2c0a4072984d39d36ad21ead357ab66a08ac0065c" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/traceability.arcadia", + "bytes": 2068, + "sha256": "dd5d356390089e4ec474374956f6219502733987e60ef8ff32920d8b33dce858" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/entry.arcadia", + "bytes": 9827, + "sha256": "86dd8a355f6c9dadfea56d06e5247c9b0f820819d7df17ef5690671c7c81324b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/expected.json", + "bytes": 21877, + "sha256": "980489ec2c483d4f9efada61358c1f29bafb2572fd5b804c656b91b8e9bb4f9a" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/oa/behavior/scenario_oa_cm_200.arcadia", + "bytes": 1488, + "sha256": "0ec8d7e38f5a5cd56ccf3979757b3a9f412ad0ae36ee6c2690b7872129046d70" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/traceability.arcadia", + "bytes": 2068, + "sha256": "dd5d356390089e4ec474374956f6219502733987e60ef8ff32920d8b33dce858" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.arcadia", + "bytes": 7698, + "sha256": "1abc4c4cac37cfb06ed3b12a115f9e7e6a2d3affd34b25c355309e5ee465fa40" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.json", + "bytes": 13130, + "sha256": "a5cf4cb2ef390113dd752f4054d43fb789da2ca77799efb5782805ae8aa2dfd5" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.request.json", + "bytes": 1090, + "sha256": "c0ac99ee186d126fe3ec57f2c0a4072984d39d36ad21ead357ab66a08ac0065c" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-transition-ready.arcadia", + "bytes": 5454, + "sha256": "b761c4c2af5f7064aaf1f887ffd6094eb6ae834b2c8057ecdbc4aa97c042066b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-transition-ready.json", + "bytes": 8852, + "sha256": "2536b000de361fb131787e32b466b9123d4e98abf00c099ad32f6cb8e7fb530b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/generate-communication-means.rs", + "bytes": 28035, + "sha256": "003521404b702332082e01f2be7676fda1dd7b5bcf220bb81d25120c8984c75d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/hashes.json", + "bytes": 3133, + "sha256": "39b4dc02fc8b074015c59354fd1c1061c25832fde25065c7151f36eb0455e6f6" + }, + { + "path": "harness/fixtures/release1-native/communication-means/manifest.json", + "bytes": 1237, + "sha256": "fb921f42f2c4a4f8a67d1266f17f8c7750b6a2619554b713aa92b17918f0c43e" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40-oracle.json", + "bytes": 26264, + "sha256": "74edca148583f42c269e51f135662f65ef1c9ea1c94516d63e2a5091967dc99b" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40.arcadia", + "bytes": 28947, + "sha256": "00b87736b82c5afd33b311df7aebe9a6c8c51b6de66221181b5ea8bc8ca221a3" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40.json", + "bytes": 54938, + "sha256": "5dd4f22453330cab3abc059881660190e689a22619853f77cf6d0b52735d97ad" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments-native.md", + "bytes": 2624, + "sha256": "28906924b05f75bbf432389517aef65f1df474d2f2bff79a3586564f7f7328ef" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.after.arcadia", + "bytes": 6795, + "sha256": "9d084dd75a0251d349cc31f9ee98df58d0bc76859dc3cb1503f242e2f759888a" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.after.json", + "bytes": 9618, + "sha256": "f09be41afd85c18fd52fdf997e9b81c4b7cb2c41e78d167abcd14caea8110333" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.arcadia", + "bytes": 4990, + "sha256": "8740f27be99624013d9be876639c0411e1b8c14f0f9a843f43dc71d769efd79a" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.hashes.json", + "bytes": 963, + "sha256": "00fc9e2c709bdcd9ee98012176cb0edb635c112153d963cd169bf4bf69a9e010" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.json", + "bytes": 8146, + "sha256": "9c188f2890630c7feec2be719a7104af9690da7ea836df18fa78da3ff2acfc1b" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.manifest.json", + "bytes": 1045, + "sha256": "46b40f221ffad614733b615208814ace63947e96b80bbfdec63853ccd4f4e8c8" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.request.json", + "bytes": 3075, + "sha256": "b57f656f0b9cf2c595e83150c683301909e20f15684d35d108d3c57ee0dc5909" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch-native.md", + "bytes": 2637, + "sha256": "dddca2b85f892b05881c75ef3cd62437396cc086a09909b621e02bad0cbe56ff" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.after.arcadia", + "bytes": 3134, + "sha256": "d3315bba762395205ae761e6e64029e8b4070c15a1299c6114075581db7b0974" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.after.json", + "bytes": 3927, + "sha256": "8f36119c7e893a4af374b13b85b1c2cb3df0196df8d06a551386628fc8b8646d" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.arcadia", + "bytes": 1787, + "sha256": "5e1f433e04621424edac43e53411624059e873f88dd531bfdb39093953485ed7" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.hashes.json", + "bytes": 933, + "sha256": "1bd87700b04e4f169ab5f8aceaa3b0c3ec3a1cc43e1bce135a1cee506fc75d38" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.json", + "bytes": 2816, + "sha256": "1972242d2a8677d004dc3af1081feb292de65fe26128d877dded8661f9906619" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.manifest.json", + "bytes": 647, + "sha256": "1e440efa02e2ccc27585d9a49c7864d53e3e3e7645ccb219f040e00d95331b8e" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.request.json", + "bytes": 2197, + "sha256": "71f23474614aab90398ce24f00f2cf61d6cb9a3a34faa3e12e0c8104e0a71073" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-repair.arcadia", + "bytes": 15635, + "sha256": "e3ce0347746584f503b825a8b6bd23a7eebf0827940112ef8f36d500c1d0a043" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-repair.json", + "bytes": 25736, + "sha256": "29736f2a619f7f2d0e795229f6e8c3645a1b4eca6292043cd604aa01b1ec9170" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-take.arcadia", + "bytes": 15631, + "sha256": "9ab573c92be66e3bae659dd826923ba6066979b1651edda7bd469056632cd77e" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-take.json", + "bytes": 25736, + "sha256": "828c990c6129692cd31c7f6ed0dd6c952f9cfffdd90bc80171df82d4d929afba" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.arcadia", + "bytes": 15617, + "sha256": "49214be2ca9c8bb6195c3b39737c053847021839f70f0bb2921d35a1fbd2ac83" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.invalid-request.json", + "bytes": 2225, + "sha256": "8b02d4739b1be2c8a64da76423b4a6cae7d89c60f4d30723b94f1da3779cbcca" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.invalid.txt", + "bytes": 78, + "sha256": "aa536e18bc65325163e9b645a4ad031ab599fcb05948dcf741b725d0f0c8b602" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.json", + "bytes": 25722, + "sha256": "995dd72f5c1f07f998233ae9847e337cb82de0c2a9053d3905be021d5f8124b9" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.manifest.json", + "bytes": 1059, + "sha256": "ad315359bfd68ce0d265976dc9e4ea6a502ebbb87d7339dd1af5ef27dd01e433" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.repair-plan.json", + "bytes": 15016, + "sha256": "27bf316ad66ffa91f6323e75b0c280baf5caec298645793dea72c5d42aa3b782" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.repair-request.json", + "bytes": 2225, + "sha256": "f4f6b5480ec8927033ea469ea82c1e8411cb6dba95d2da680f15bc193914c9b4" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.steps.md", + "bytes": 3897, + "sha256": "7d7e38d93641a5f22a2738baa4dbacc392eebb477a855cdce0641961980a19ad" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.take-plan.json", + "bytes": 18557, + "sha256": "74dd68ba686b8928054480f0bfed55aad91f6f1208803399dc9878e894f57ecb" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.take-request.json", + "bytes": 1508, + "sha256": "d19a53002a6bf95af3123a3ef9f78baaf7ce1085d4f06f0f4a9d5e5d5accbc0e" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.after-order.arcadia", + "bytes": 6935, + "sha256": "90277f1780d43a6f0b2184bf00b87e7a4f3518d67c6f10d4793daafe1aabf493" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.after-order.json", + "bytes": 11286, + "sha256": "5a3c8494f6976c23b990c14b40760fb2f32ca9973caf6f31dab5632310663591" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.ambiguous-request.json", + "bytes": 1379, + "sha256": "6a86fde194faa55f2d1bdb982571e0e711e5401b53a960e6acb8cf3e17f506c8" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.arcadia", + "bytes": 6195, + "sha256": "e7c30c5a5c3ba7209c8e223f02da55821d7af10a2f09844a7065ae6cd8f22aa5" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.final-plan.json", + "bytes": 19156, + "sha256": "d1e5c2ed08e0aa6274a0421a39876d1ba99f4e441c7a0a68660a83b9e017da14" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.final-request.json", + "bytes": 2418, + "sha256": "433f723252598994dac7184da61f95344b528156cc5a0fba1a7864b2ec9f002b" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.json", + "bytes": 10441, + "sha256": "9e4e2ce1c7879935ad0860a3ae720506c929a8422b51491b719d88af3fd3ff2d" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.manifest.json", + "bytes": 1042, + "sha256": "87e8899c7d4e54faedeef32afb7592fb65278d1bd7390850ab198dcf62068329" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.after-order.arcadia", + "bytes": 6280, + "sha256": "6c77ed42bbf9f4ebe08bfa233197a4020e5587ce33747f7914430aa0c662d9a3" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.after-order.json", + "bytes": 10009, + "sha256": "1dd7ca2bcfc84ac23369c506302b39569d2ebc41e5a4edc99378a1fe01923b7e" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.ambiguous-request.json", + "bytes": 1390, + "sha256": "e0ea7aeb25687ae63c65128f1aab78273f14030d179d3fbea63fe91ab5430136" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.arcadia", + "bytes": 5529, + "sha256": "563c36162050c8564ffa25a85c726462ecdaebdb87659b3f3610506bfd5581e6" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.final-plan.json", + "bytes": 18821, + "sha256": "f96c43fc58dbe48a044b628b31bb3f0b59171dad5b6982ec6c34a5597e474130" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.final-request.json", + "bytes": 2438, + "sha256": "d38fdb13612b07254edad80848f79c1e097d5f868c020feae9ba072aa697a50d" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.json", + "bytes": 9153, + "sha256": "2ed0daed118f2df13dcad738dab174ad34d44a15921cf8097415e707978b0968" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.manifest.json", + "bytes": 1058, + "sha256": "c79bd12a85d8d4f25cc3ee43581b3e5e74ae9ad7e4de0c72764975ba2b89c279" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.after-order.arcadia", + "bytes": 5026, + "sha256": "98020e048ac01f285c6ad8c10ce22bef05e193b5ba0f5558be1fb26a7bf82620" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.after-order.json", + "bytes": 7851, + "sha256": "ea3783992488bc6ee944eb91a26ccf3dbc05a3909528fc32ec8023a76765cee6" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.ambiguous-request.json", + "bytes": 1379, + "sha256": "ea3cfd25f7a50481805956fb88ab851516dcd602dd6564502a0cc55f7de6a54f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.arcadia", + "bytes": 4295, + "sha256": "2b7c3694623bbea3e36dcc6f674d4adcd91e23c8e1005ded21e5a69648a048e5" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.final-plan.json", + "bytes": 17912, + "sha256": "95a23bd334cffcaef0c3b1012b7555efd2a077ef6f9140d58020910ef8a76723" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.final-request.json", + "bytes": 2081, + "sha256": "1e2433ed5821bf65443f56cb27381ee935db81b1955d3a539b7952898312a410" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.json", + "bytes": 7012, + "sha256": "0033f8780c2ba69779b811bca792340c25a092f887e5811c6839f0a691d744f2" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.manifest.json", + "bytes": 1046, + "sha256": "e3b4a60a56abee779ca8356605c968aa2d99256a3bd3c5601b14b5c5502a1a05" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.after-order.arcadia", + "bytes": 5467, + "sha256": "e265cab35097acc46f5123107c13bc35b9f71931ff650557fc1c85779141b327" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.after-order.json", + "bytes": 8482, + "sha256": "9b777828d3681138de6bbd08de8bf922bed92c27be60b103d8ff73ce7ddd0a48" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.ambiguous-request.json", + "bytes": 1379, + "sha256": "7d124256730bf2feee772c7d0118b87eb288e8aaa9179d69ceb9259dbceb2c71" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.arcadia", + "bytes": 4727, + "sha256": "87a5a3665dab2dd6e595867dcebb1586e93dd067c85d6e24b1a4d3ff0ad6d4ba" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.final-plan.json", + "bytes": 18803, + "sha256": "1888ca51e0923866a9afea99cad069fe5d3f19f0a1b24328e20ac1b9f52d8bad" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.final-request.json", + "bytes": 2294, + "sha256": "5070a5b85feb1bc7b1fc648cd5d35ef26663492c8666dcd471950c06ec3a6052" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.json", + "bytes": 7641, + "sha256": "725b35e36640c81c70c7efea5c3304bf61b49ef9664194ca0d491782cc62191a" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.manifest.json", + "bytes": 1038, + "sha256": "1b43abf8fed3061c65a7b7cb103d31ea7ece333a2da83c645f8d228448c4dbb2" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.after-order.arcadia", + "bytes": 5019, + "sha256": "65a6217f474b5085f37b511151185c2c08ff7a1998e924f1fe01f29c410f6ced" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.after-order.json", + "bytes": 7835, + "sha256": "8a53bb9b43eab5b6dca5e08deef20c14c96e134b9ee816a99b7960bb5255e008" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.ambiguous-request.json", + "bytes": 1379, + "sha256": "c704f99245f00d5c3be0562d91931b4e7f1fb3fb36f41991eb76656ffbd6129f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.arcadia", + "bytes": 4279, + "sha256": "c59ec1233d5a9fbb8e386f6d9b13f398be21baf813ba215efb51bfc1bb98db36" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.final-plan.json", + "bytes": 17938, + "sha256": "30c5c3f614a74708763df612016483623792f4c65e2ed2fa662ac417cfb852eb" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.final-request.json", + "bytes": 2098, + "sha256": "3b6c35ef78133f0980cb6fb53fbc29c5d3c4deb5dc4be01c2c3384e221987b9b" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.json", + "bytes": 6996, + "sha256": "c159c60403abcf8fefab7f19cbad9989488e8ccc20b82c57597b22a0ae254802" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.manifest.json", + "bytes": 1038, + "sha256": "af8a314a9b1d85a8f98affa5a6649f43d252851158798e1ad687bb1b6966b14f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.steps.md", + "bytes": 4549, + "sha256": "6004894e9d9f478b7fe1c3c3e0706dcc546d5df8557cff91b4cf26f8a4badf24" + }, + { + "path": "harness/fixtures/release1-native/source5-recovery/15000000-0000-4000-8000-000000000010.json", + "bytes": 1933, + "sha256": "71cca2a59f36b2a07d11dedbe9101226aa1a4a00d8ac244b5565202e56709f51" + }, + { + "path": "harness/fixtures/release1-native/source5-recovery/generate.py", + "bytes": 1496, + "sha256": "e44986c1d563499f25917441220b23883fc9cb0f89faf409873191f0212fbd2f" + }, + { + "path": "harness/fixtures/release1-native/state-actions.arcadia", + "bytes": 6224, + "sha256": "9cde82608110e56aa9e14c9e33eb38976f53aed74ab013145d411d5743a0ec26" + }, + { + "path": "harness/fixtures/rest-coverage/README.md", + "bytes": 1870, + "sha256": "df4a391312e0c8b20ccdcc850199443b08547be1b10b1f2447a067bf4bf544e6" + }, + { + "path": "harness/fixtures/rest-coverage/coverage-probe.json", + "bytes": 7951, + "sha256": "2d1ef7bdb5d7bf17b9fda33b1d1790d1d88289b3fd1e725f89b83a69771f9a43" + }, + { + "path": "harness/fixtures/rest-coverage/run-coverage-probe.ps1", + "bytes": 9381, + "sha256": "f24f19fca418b76a7249894a08c116e16b465a02f8f899d12b808ccfdd90a3bd" + }, + { + "path": "harness/fixtures/run-timed-bundle-oracle.ps1", + "bytes": 7466, + "sha256": "fab696486a574f9867c6e69a8a8b960e7e9722206441b9cc5f36d41f285f1a25" + }, + { + "path": "harness/fixtures/scenario-authoring/README.md", + "bytes": 14700, + "sha256": "6b651b180b76d10b00bc49d77a8f5e0b3ba0317446978f41b541f5bb23fedad8" + }, + { + "path": "harness/fixtures/scenario-authoring/base/expected-baseline.json", + "bytes": 38589, + "sha256": "abd8246c939ebb8a2162ef82e23d0fb322ee1a8b4d0d7c28a34037e42e86e841" + }, + { + "path": "harness/fixtures/scenario-authoring/base/project.arcadia", + "bytes": 19470, + "sha256": "9b1afbe96b0bf8fa613451b00929492f05a59b9eb2ca74c2c374a8b7bb7cba9e" + }, + { + "path": "harness/fixtures/scenario-authoring/base/rationale.arcadia", + "bytes": 86, + "sha256": "82df210f22f6aa336a3e7e00240977d671c7c3923db7bc58fb29e6d98b67ef49" + }, + { + "path": "harness/fixtures/source7-native/README.md", + "bytes": 7235, + "sha256": "7abccbc3da0980d1d099761d1a66d12c403a0f543954134537ecd4930d182b4b" + }, + { + "path": "harness/fixtures/source7-native/base/expected-baseline.json", + "bytes": 26428, + "sha256": "e2882a58f841f460f45d9d67db1606440e0d7997b9b29a784569ae48e4b23bfb" + }, + { + "path": "harness/fixtures/source7-native/base/project.arcadia", + "bytes": 13616, + "sha256": "5474d8ca05fd1375220dc0ad40d913631fde51159e9632bb9f290d1ecdab8dd7" + }, + { + "path": "harness/fixtures/source7-native/base/rationale.arcadia", + "bytes": 59, + "sha256": "e6a600e13036d4ad594a65380ed1b3d82d1772d583041bb0a624c9588a73047a" + }, + { + "path": "harness/fixtures/source7-native/manifest.json", + "bytes": 410, + "sha256": "6c57164a796234d83818d462d0a25f10e77062d405769e602ae2a7bec251e3b6" + }, + { + "path": "harness/fixtures/staged-source-authoring/README.md", + "bytes": 6876, + "sha256": "502be5e3bf9112447dc07b1a51fe0fa301754b47128a9b81877c185c6e797fee" + }, + { + "path": "harness/fixtures/staged-source-authoring/base/notes.arcadia", + "bytes": 63, + "sha256": "ad9de02963c20d1f43856455a797deb05ca674659e45f2c4b96b52783024f8bd" + }, + { + "path": "harness/fixtures/staged-source-authoring/base/project.arcadia", + "bytes": 593, + "sha256": "aa844950ec4fb86f262a257e1fc370a26557ea7978d8a4cab78265037660234c" + }, + { + "path": "rust-toolchain.toml", + "bytes": 66, + "sha256": "a6a0bbd29ffaa8182dc22d1d9149709f1091e47df40ed96eb8a78a711c66a4ce" + } + ] +} diff --git a/harness/experiments/diagram-removal-windows-20260912/gui-d61f1f3.log b/harness/experiments/diagram-removal-windows-20260912/gui-d61f1f3.log new file mode 100644 index 00000000..029f0f9f --- /dev/null +++ b/harness/experiments/diagram-removal-windows-20260912/gui-d61f1f3.log @@ -0,0 +1,2 @@ + Compiling oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-desktop) + Finished `dev` profile [unoptimized] target(s) in 2m 26s diff --git a/harness/experiments/diagram-removal-windows-20260912/gui-d61f1f3.result.json b/harness/experiments/diagram-removal-windows-20260912/gui-d61f1f3.result.json new file mode 100644 index 00000000..d9ab5643 --- /dev/null +++ b/harness/experiments/diagram-removal-windows-20260912/gui-d61f1f3.result.json @@ -0,0 +1,17 @@ +{ + "source": "d61f1f38779ab70a77efcde523ae31c432aefcfd", + "start": "2026-09-12T23:42:43.604131+00:00", + "end": "2026-09-12T23:45:13.257180+00:00", + "exit": 0, + "command": [ + "cargo", + "build", + "--locked", + "-p", + "oa-desktop", + "--bin", + "arcadia-studio" + ], + "inputs": "gui-d61f1f3.inputs.json", + "changed_inputs": [] +} diff --git a/harness/experiments/nested-lifecycle-union-20260912/README.md b/harness/experiments/nested-lifecycle-union-20260912/README.md new file mode 100644 index 00000000..56148254 --- /dev/null +++ b/harness/experiments/nested-lifecycle-union-20260912/README.md @@ -0,0 +1,25 @@ +# Nested lifecycle / typed activation source union + +Source: `f6595ebf66e88ec42c37b5c1a3c014f5e52cb32d`. +Base: `d61f1f38779ab70a77efcde523ae31c432aefcfd`. + +- [Source handoff](source-handoff.md) +- [Independent source review](independent-review.md) +- [Exact committed source snapshot](source/crates/oa-desktop/src/behavior.rs) +- [Full-index binary Git patch](patches/d61f1f3-to-f6595eb.patch) +- [Payload manifest](manifest.json) +- [Archive/verification helper](tools/archive-lifecycle-union-f6595eb.py) + +The six source files are extracted from committed Git blobs; they are evidence, +not an additional production tree. Notes retain their original bytes, including +historical local paths and source-scoped statements. The manifest lists portable +archive-relative paths plus original source provenance. It does not claim tests, +native acceptance, import, or publication succeeded. Subsequent gates remain +separate source-identified records owned by the integration owner. + +From repository root, run the helper with `verify` to compare payload bytes, +manifest metadata, source blobs and regenerated patch. After owner-controlled +staging, run `verify-index` to additionally compare every payload and manifest +with Git index blobs. Neither mode stages or rewrites files. If Git attributes +normalize archived bytes, index verification fails; the owner must resolve that +explicitly. No patch is applied by this helper. diff --git a/harness/experiments/nested-lifecycle-union-20260912/independent-review.md b/harness/experiments/nested-lifecycle-union-20260912/independent-review.md new file mode 100644 index 00000000..302eac8f --- /dev/null +++ b/harness/experiments/nested-lifecycle-union-20260912/independent-review.md @@ -0,0 +1,38 @@ +# Independent lifecycle/typed-activation union review + +Reviewed `f6595ebf66e88ec42c37b5c1a3c014f5e52cb32d` in `.local/nested-lifecycle-union-20260912`, base `d61f1f38779ab70a77efcde523ae31c432aefcfd`. Read the complete worker handoff, earlier integration contract, actual six-file diff, activation/lifecycle implementations, core lifetime admission, all nine union tests and retained renderer evaluators. The isolated worktree was clean at inspection. No source edits, compiler/tests, UI interaction, integration or Gitea mutation performed; only this requested report was written. + +**Bounded conclusion: no actionable source defect identified in this union.** This supports proceeding to the root-owned combined gates, not accepting a native result. All 17 retained renderer tests and nine union tests remain unrun by this reviewer. The prior root and peer passes do not establish the combined source's behavior. + +## Contract verification + +- **Admission remains authoritative.** No core files change. `oa-core/src/validation.rs:1766` still rejects uses ordered before Create or after Delete, including potentially ordered paths. The ordinary fixture invokes `validate_candidate` and constructs a `Document` from the authored bundle (`scenario_lifecycle/render_tests.rs:141`); it does not silently admit raw projects. Defensive invalid fixtures first assert an actual `lifeline_lifetime` error (`union_tests.rs:247`) before calling raw `Scene::sequence`. The rejected prebirth/postdeath/recreation cases are clearly distinct from the admitted incomplete-endpoint cases. The contribution does not adopt the peer's wider free-editing/schema policy. +- **One geometry pipeline.** `behavior.rs:1399` adds self-Create/Delete clearance before row recording; final height is established at `behavior.rs:1327`, then lifecycle is built, Create/Delete endpoints aligned, and typed activations laid out. The non-scenario path retains its original guides. `render.rs:128` handles only the lifecycle markers it derives; `scenario_activation.rs:292` restricts final anchoring to Call/Reply/Asynchronous. A reflective Call still begins at its actual lower receive point (`scenario_activation.rs:164`); a reflective Reply ends at its send row (`:206`). No duplicate legacy activation traversal was imported. +- **Logical timing survives clipping and missing polylines.** `scenario_activation.rs:49,367` constructs every recorded Call's correlation before clipping, using its actual receive point or row fallback, then recorded Reply scope/send positions. This avoids reconstructing logical duration from visible pieces and supplies metadata for incomplete calls with no sender line. `active_segment`'s indexed correlation lookup (`:441`) therefore has an entry for every Call represented by an activation. Reply source anchoring (`:310`) requires matching call, exact scope, exact Reply ID and visible bottom equal to the actual send y. A call whose first visible piece starts only at later birth cannot move the original Call receive event, because its target requires `rect.y == receive_y` (`:330`). +- **Clipping and termination are distinct.** `render.rs:169` intersects only Alive intervals for the exact receiver/scope and discards empty spans. `scenario_activation.rs:121` preserves identity and scope for each piece; only a piece reaching the logical terminal retains that finish, while earlier pieces become `Finish::Clipped`. Delete emits `Finish::Terminated(delete_id)` and closes traversal (`:176`). It cannot manufacture a Reply cap or be restarted by a later Create. +- **Conditional death preserves uncertainty without resurrection.** The branch outcome carries `open` and `may_be_terminated` separately (`scenario_activation.rs:359`); any terminating compatible operand stops definite parent continuation (`:235`). Sibling traversals receive their own entry and retain their own bars/cues. This implements the explicit conservative root decision recorded in the handoff. It does not assert that a conditional model execution definitely died, change persisted correlation, or weaken validation. A call already answered before a later Delete is no longer open, so the later event does not incorrectly terminate that answered execution. +- **Cues and columns remain coherent.** Logical unanswered cues are emitted before alive-fragment filtering (`scenario_activation.rs:113`), retaining wholly invisible unresolved paths. The same chosen column displacement is applied to the call's surviving segments and cues (`:85`). Visible pieces alone provide active anchors; nested versus crossed containment uses original compatible Reply timings (`:451`) rather than fragment-edge coincidence. The new nested/crossed falsifier actually changes Reply order and expects different source anchors. +- **Painter/hit union preserves the d61 repair.** Lifecycle lanes paint before label masks/activations (`behavior.rs:2036`), masks still precede execution borders, and message paths/arrowheads/text remain foreground. Lifecycle markers paint last (`:2197`); their exact visible shape also wins first in hit testing (`:1661`). Headers/cards then precede exact message paths, execution rectangles, label rectangles and broad tolerances. `near_sequence_item` (`:1725`) compares broad marker/message distances together, avoiding minimum-zoom marker halos stealing a closer message. It does not move broad tolerance ahead of an exposed execution shoulder. Birth capsules and death Xs retain occurrence identity; lane-header selection retains lifeline identity. Clipped header/capsule text uses screen-space clip bounds and reapplies camera transform inside the child painter (`behavior.rs:2159`, `render.rs:327`); this is source-consistent but still needs the actual WGPU/native witness below. + +## Evaluator strength and limits + +The nine union evaluators are useful and substantially discriminating: actual Document admission; exact Call/Reply receive/send alignment; explicit typed finish/column identities; deletion versus Reply; retained incomplete repair cards; invisible-path cues; missing sender polylines; rejected-data clipping; conditional death with a 26-unit unaffected sibling; and nested-versus-crossed anchoring. The latter two are independent semantic expectations, not snapshots of the old rectangle allocator. + +The retained 17 renderer tests cover visible root extents, exact interval/marker coordinates, conditional/repeated/parallel scopes, marker and message hit priority at 5%/10%, self-event clearance, edit/Undo/Redo source restoration, and header/capsule clip bounds under pan/zoom. The width-8 anonymous-box adaptation now queries typed activation identity (`render_tests.rs:509`); the branch-death test retains its independent lifetime/sibling/open-cue assertions. Header names remain the actual root lane names. No evidence that a failing peer assertion was simply discarded was found in the reviewed source. + +Two limits matter to the acceptance decision: + +1. `union_tests.rs:15` reuses production `alive_spans` to assert every visible segment is covered. That is a consistency check, not an independent proof that the lifetime projection is correct. It is adequately supplemented here by exact expected endpoints/scopes and retained explicit interval tests; do not report that helper alone as the lifecycle oracle. +2. Pan/zoom clip tests verify numeric bounds, and the Program test (`render_tests.rs:906`) exercises event-coordinate conversion and published identity, not final pixels. The row-offset test (`union_tests.rs:442`) verifies translation, full scene reparse equivalence and unchanged Document source/history, but does not prove arbitrary authored placement or pointer editing. The existing d61 WGPU activation-border evaluator is retained, yet its prior pass must be rerun on the union. None of these source inspections establishes a new native rendering pass. + +## Remaining native acceptance cases + +Run the combined lifecycle, activation, atomic graphical Call/Reply and required desktop/strict gates first. Then inspect a source-identified packaged build with: + +1. OA and SA delayed Create → nested C1/C2 → R2/R1 → Delete. At 100%, Fit and a small window, inspect both selected/unselected execution shoulders, arrowheads at bar edges, Create capsule, Delete X, and label-backplate continuity. Select each exposed shoulder and marker; confirm the corresponding Inspector identity. +2. Self-Create/Delete after an Action alongside self-Call/Reply. Confirm the 16-unit clearance is visible, the lifecycle receive row and lower self-Call receive row remain distinct, and selecting captions/capsules/Xs does not target an adjacent card or message. Include right-to-left Create for capsule-edge/arrowhead layering. +3. Long Latin and wide Unicode lane titles/details and birth names, with positive/negative pan at 50%, 100% and 200%, including clips at viewport edges. Text must stay inside its intended box/capsule without clipping the entire header, covering arrows, or detaching from its hit target. +4. Admitted incomplete post-death Reply and an admitted unresolved operand. Verify a repairable card and unanswered/uncertainty cue remain, with no false visible execution or Reply anchor. Do not author the defensive rejected fixtures through the GUI or describe their raw Scene projection as an admitted workflow. +5. At minimum zoom, exact marker/header/ordinary-message and exposed activation hits retain identity despite broad halos. Contrast/min-scale detail readability stays with issue #26; this review does not excuse missing geometry as a palette problem or claim tiny text is readable. + +Parent owns synthesis and import. No change requested before the combined gates on source grounds from this bounded review. diff --git a/harness/experiments/nested-lifecycle-union-20260912/manifest.json b/harness/experiments/nested-lifecycle-union-20260912/manifest.json new file mode 100644 index 00000000..700b31f7 --- /dev/null +++ b/harness/experiments/nested-lifecycle-union-20260912/manifest.json @@ -0,0 +1,101 @@ +{ + "schema": 1, + "archive_path": "harness/experiments/nested-lifecycle-union-20260912", + "base_commit": "d61f1f38779ab70a77efcde523ae31c432aefcfd", + "source_commit": "f6595ebf66e88ec42c37b5c1a3c014f5e52cb32d", + "created_utc": "2026-09-12T23:44:10.439774+00:00", + "evidence_scope": "Committed source and source-only review; no combined test/native pass asserted", + "files": [ + { + "path": "README.md", + "kind": "archive-navigation", + "bytes": 1409, + "sha256": "538c2c460f0a911906cd5dcd45055fd7c03f13afaec3740c861e37103d65bdd5" + }, + { + "path": "independent-review.md", + "kind": "source-review-record", + "source_path": ".local/nested-lifecycle-union-independent-review-20260912.md", + "reviewed_source_commit": "f6595ebf66e88ec42c37b5c1a3c014f5e52cb32d", + "bytes": 9736, + "sha256": "3b5b116ca7a15f2b5bac313fab9a91966e2fa64f75cc7fc4509332208dd8f29c" + }, + { + "path": "patches/d61f1f3-to-f6595eb.patch", + "kind": "git-binary-patch", + "base_commit": "d61f1f38779ab70a77efcde523ae31c432aefcfd", + "source_commit": "f6595ebf66e88ec42c37b5c1a3c014f5e52cb32d", + "bytes": 93357, + "sha256": "0428becb26cf59b4a31ffe0bbc3fa31aee0b50c51054b149c3b780f8eadfd5a9" + }, + { + "path": "source-handoff.md", + "kind": "source-review-record", + "source_path": ".local/nested-lifecycle-union-handoff-20260912.md", + "reviewed_source_commit": "f6595ebf66e88ec42c37b5c1a3c014f5e52cb32d", + "bytes": 8668, + "sha256": "2c28f4ffca8e84626cf4bf7580504a008fe971dda7eb0e9b83d94695bcb42410" + }, + { + "path": "source/crates/oa-desktop/src/behavior.rs", + "kind": "committed-source", + "source_commit": "f6595ebf66e88ec42c37b5c1a3c014f5e52cb32d", + "source_path": "crates/oa-desktop/src/behavior.rs", + "git_blob": "0a0c4df479ff1c46f935735e508144ca2ec3052f", + "bytes": 133741, + "sha256": "bc1c55e4dfb0be6f54d0b9aa7e69a1cbba2aa73b4af4476ad0bdc3afdecf7de7" + }, + { + "path": "source/crates/oa-desktop/src/behavior/scenario_activation.rs", + "kind": "committed-source", + "source_commit": "f6595ebf66e88ec42c37b5c1a3c014f5e52cb32d", + "source_path": "crates/oa-desktop/src/behavior/scenario_activation.rs", + "git_blob": "88fa4d6e861fc96f4dc5497088cd9119cf25e151", + "bytes": 17694, + "sha256": "6dfc8eccf7245954319f2bec84072330a652bf208cc636c7043781d49dcd1ada" + }, + { + "path": "source/crates/oa-desktop/src/behavior/scenario_lifecycle.rs", + "kind": "committed-source", + "source_commit": "f6595ebf66e88ec42c37b5c1a3c014f5e52cb32d", + "source_path": "crates/oa-desktop/src/behavior/scenario_lifecycle.rs", + "git_blob": "6fe044890864ecf3095d0fedf590104f6121abf7", + "bytes": 9348, + "sha256": "c94f3738e4bf027e3f055e32d709b90777d8fb2dea70b563713af8df000af13a" + }, + { + "path": "source/crates/oa-desktop/src/behavior/scenario_lifecycle/render.rs", + "kind": "committed-source", + "source_commit": "f6595ebf66e88ec42c37b5c1a3c014f5e52cb32d", + "source_path": "crates/oa-desktop/src/behavior/scenario_lifecycle/render.rs", + "git_blob": "989fb2d5b173fc68e50705f8d406f7786ba9c979", + "bytes": 14820, + "sha256": "c0cc8003225f171fe85e066e9399b3e4ccbeac8fd5e88a325c7d206d24a384c4" + }, + { + "path": "source/crates/oa-desktop/src/behavior/scenario_lifecycle/render_tests.rs", + "kind": "committed-source", + "source_commit": "f6595ebf66e88ec42c37b5c1a3c014f5e52cb32d", + "source_path": "crates/oa-desktop/src/behavior/scenario_lifecycle/render_tests.rs", + "git_blob": "e0d9ee812a49fb1f8b24b0e9e460e08cd42aa34f", + "bytes": 35358, + "sha256": "e0274c2aeb0463e0633f6cf7c4ce3b1a0f6f95b4084a1c1fb6cb6053288b2f1d" + }, + { + "path": "source/crates/oa-desktop/src/behavior/scenario_lifecycle/union_tests.rs", + "kind": "committed-source", + "source_commit": "f6595ebf66e88ec42c37b5c1a3c014f5e52cb32d", + "source_path": "crates/oa-desktop/src/behavior/scenario_lifecycle/union_tests.rs", + "git_blob": "86fa0cceff11ff66497c3514e43659a0ca003a52", + "bytes": 18024, + "sha256": "1c7b6c40854d6206637ccdb1857962d5870d8df8fb44309aba43d250c405d2c8" + }, + { + "path": "tools/archive-lifecycle-union-f6595eb.py", + "kind": "archive-helper", + "source_path": ".local/archive-lifecycle-union-f6595eb.py", + "bytes": 11517, + "sha256": "6299f6278d4fdcdde8b66a9564c898370ac5035c95de2f65255a276ec1b61493" + } + ] +} diff --git a/harness/experiments/nested-lifecycle-union-20260912/patches/d61f1f3-to-f6595eb.patch b/harness/experiments/nested-lifecycle-union-20260912/patches/d61f1f3-to-f6595eb.patch new file mode 100644 index 00000000..70a2592a --- /dev/null +++ b/harness/experiments/nested-lifecycle-union-20260912/patches/d61f1f3-to-f6595eb.patch @@ -0,0 +1,2467 @@ +diff --git a/crates/oa-desktop/src/behavior.rs b/crates/oa-desktop/src/behavior.rs +index ea70799e17a7e23533e4c4a9aa52bd72b713c824..0a0c4df479ff1c46f935735e508144ca2ec3052f 100644 +--- a/crates/oa-desktop/src/behavior.rs ++++ b/crates/oa-desktop/src/behavior.rs +@@ -21,8 +21,6 @@ pub(crate) mod creation; + mod form_session; + pub(crate) mod scenario; + mod scenario_activation; +-// Projection acceptance precedes the coordinated scenario renderer integration. +-#[cfg(test)] + mod scenario_lifecycle; + pub(crate) mod source_draft; + pub(crate) mod state_canvas; +@@ -1127,6 +1125,31 @@ struct BoxItem { + detail: String, + marker: Option, + } ++fn box_text_clip( ++ pan: iced::Vector, ++ rect: Rectangle, ++ scale: f32, ++ viewport: Size, ++) -> Option { ++ if !pan.x.is_finite() ++ || !pan.y.is_finite() ++ || !scale.is_finite() ++ || scale <= 0. ++ || rect.width <= 20. ++ || rect.height <= 16. ++ { ++ return None; ++ } ++ Rectangle::new( ++ Point::new( ++ pan.x + (rect.x + 10.) * scale, ++ pan.y + (rect.y + 8.) * scale, ++ ), ++ Size::new((rect.width - 20.) * scale, (rect.height - 16.) * scale), ++ ) ++ .intersection(&Rectangle::new(Point::ORIGIN, viewport)) ++} ++ + struct Line { + id: Id, + points: Vec, +@@ -1147,6 +1170,7 @@ struct Scene { + slots: Vec, + rows: BTreeMap, + activations: Vec, ++ lifecycle: scenario_lifecycle::render::Rendering, + open_calls: Vec, + sequence_bounds: BTreeMap, + } +@@ -1211,6 +1235,7 @@ impl Scene { + slots: vec![], + rows: BTreeMap::new(), + activations: vec![], ++ lifecycle: scenario_lifecycle::render::Rendering::default(), + open_calls: vec![], + sequence_bounds: BTreeMap::new(), + }; +@@ -1299,22 +1324,33 @@ impl Scene { + } + let mut y = if scenario { 148. } else { 120. }; + scene.occurrences(p, owner, scenario, &lane_x, &mut y, 0); ++ scene.size.height = (y + 45.).max(210.); + if scenario { ++ scene.lifecycle = scenario_lifecycle::render::Rendering::new( ++ p, ++ owner, ++ &lane_x, ++ &scene.rows, ++ &scene.sequence_bounds, ++ scene.size.height, ++ ); ++ scene.lifecycle.align_messages(&mut scene.lines); + scene.layout_activations(p, &lane_x); + } +- scene.size.height = (y + 45.).max(210.); + for (id, name, detail) in lanes { + let x = lane_x[&id]; +- scene.lines.insert( +- 0, +- Line { +- id, +- points: vec![Point::new(x, 85.), Point::new(x, scene.size.height - 20.)], +- label: String::new(), +- label_at: Point::ORIGIN, +- dashed: false, +- }, +- ); ++ if !scenario { ++ scene.lines.insert( ++ 0, ++ Line { ++ id, ++ points: vec![Point::new(x, 85.), Point::new(x, scene.size.height - 20.)], ++ label: String::new(), ++ label_at: Point::ORIGIN, ++ dashed: false, ++ }, ++ ); ++ } + scene.boxes.push(BoxItem { + id, + rect: Rectangle::new(Point::new(x - 102., 15.), Size::new(204., 70.)), +@@ -1360,6 +1396,18 @@ impl Scene { + let Some(SharedBody::Occurrence { body, .. }) = e.shared() else { + continue; + }; ++ if scenario ++ && matches!(body, OccurrenceBody::Exchange { ++ sender: Some(sender), receiver: Some(receiver), ++ message_kind: MessageKind::Create | MessageKind::Delete, .. ++ } if sender == receiver) ++ { ++ // Record the lifecycle receive row only after making room for ++ // the self-message elbow and caption above its marker. ++ *y += 16.; ++ } ++ #[cfg(test)] ++ scenario_lifecycle::render::apply_test_row_offset(*id, y); + if ordered { + let slot = scenario::Slot { + parent: owner, +@@ -1607,6 +1655,12 @@ impl Scene { + )) + } + fn hit(&self, point: Point) -> Option { ++ if !point.x.is_finite() || !point.y.is_finite() { ++ return None; ++ } ++ if let Some(id) = self.lifecycle.marker_at(point) { ++ return Some(id); ++ } + self.boxes + .iter() + .rev() +@@ -1652,18 +1706,8 @@ impl Scene { + }) + // The generous message tolerance must not steal the exposed + // shoulder of another call's execution when the view is zoomed out. +- .or_else(|| { +- self.lines +- .iter() +- .find(|line| { +- !line.label.is_empty() +- && line.points.windows(2).any(|p| { +- crate::diagram::distance_to_segment(point, p[0], p[1]) +- < 8. / self.scale +- }) +- }) +- .map(|line| line.id) +- }) ++ .or_else(|| self.near_sequence_item(point)) ++ .or_else(|| self.lifecycle.lane_at(point, self.scale)) + .or_else(|| self.lane_at(point)) + .or_else(|| { + self.lines +@@ -1678,6 +1722,33 @@ impl Scene { + .map(|line| line.id) + }) + } ++ ++ fn near_sequence_item(&self, point: Point) -> Option { ++ if !self.scale.is_finite() || self.scale <= 0. { ++ return None; ++ } ++ let messages = self ++ .lines ++ .iter() ++ .filter(|line| !line.label.is_empty()) ++ .map(|line| { ++ let distance = line ++ .points ++ .windows(2) ++ .map(|p| crate::diagram::distance_to_segment(point, p[0], p[1])) ++ .fold(f32::INFINITY, f32::min); ++ (line.id, distance) ++ }); ++ // Compare broad message and lifecycle-marker tolerance together after ++ // exact shapes, so dense minimum-Fit rows choose the nearer item. ++ self.lifecycle ++ .nearest_marker(point) ++ .into_iter() ++ .chain(messages) ++ .filter(|(_, distance)| *distance <= 8. / self.scale) ++ .min_by(|a, b| a.1.total_cmp(&b.1).then_with(|| a.0.cmp(&b.0))) ++ .map(|(id, _)| id) ++ } + } + impl canvas::Program for Scene { + type State = SequenceInput; +@@ -1962,6 +2033,7 @@ impl canvas::Program for Scene { + f.fill_rectangle(Point::ORIGIN, bounds.size(), Color::WHITE); + f.translate(self.camera_pan); + f.scale(self.scale); ++ self.lifecycle.draw_lanes(&mut f, self.selected); + // Guides belong behind execution fills and cards. In particular, a + // lifeline must not cut through the middle of its activation rectangle. + for guide in self.lines.iter().filter(|line| line.label.is_empty()) { +@@ -2084,24 +2156,32 @@ impl canvas::Program for Scene { + } + } + for b in &self.boxes { +- f.fill_text(Text { +- content: short(&b.title, ((b.rect.width - 25.) / 7.) as usize), +- position: Point::new(b.rect.x + 12., b.rect.y + 12.), +- size: 13.into(), +- color: if b.id == self.selected { +- style::TEAL +- } else { +- style::INK +- }, +- ..Default::default() +- }); +- if !b.detail.is_empty() { +- f.fill_text(Text { +- content: short(&b.detail, ((b.rect.width - 25.) / 6.) as usize), +- position: Point::new(b.rect.x + 12., b.rect.y + 39.), +- size: 11.into(), +- color: style::MUTED, +- ..Default::default() ++ if let Some(clip) = box_text_clip(self.camera_pan, b.rect, self.scale, f.size()) { ++ // WGPU child clips start with an identity transform, as in ++ // the lifecycle capsule label painter. ++ f.with_clip(clip, |label| { ++ label.translate(self.camera_pan); ++ label.scale(self.scale); ++ label.fill_text(Text { ++ content: short(&b.title, ((b.rect.width - 25.) / 7.) as usize), ++ position: Point::new(b.rect.x + 12., b.rect.y + 12.), ++ size: 13.into(), ++ color: if b.id == self.selected { ++ style::TEAL ++ } else { ++ style::INK ++ }, ++ ..Default::default() ++ }); ++ if !b.detail.is_empty() { ++ label.fill_text(Text { ++ content: short(&b.detail, ((b.rect.width - 25.) / 6.) as usize), ++ position: Point::new(b.rect.x + 12., b.rect.y + 39.), ++ size: 11.into(), ++ color: style::MUTED, ++ ..Default::default() ++ }); ++ } + }); + } + } +@@ -2114,6 +2194,8 @@ impl canvas::Program for Scene { + ..Default::default() + }); + } ++ self.lifecycle ++ .draw_markers(&mut f, self.selected, self.scale, self.camera_pan); + if let Some((context, tool, editable)) = self.interaction { + let active = editable && state.context == Some(context) && state.tool == tool; + let point = cursor.position_in(bounds).map(|p| { +diff --git a/crates/oa-desktop/src/behavior/scenario_activation.rs b/crates/oa-desktop/src/behavior/scenario_activation.rs +index fdafed5855b3d52edd04fef2fc7085bf320039b0..88fa4d6e861fc96f4dc5497088cd9119cf25e151 100644 +--- a/crates/oa-desktop/src/behavior/scenario_activation.rs ++++ b/crates/oa-desktop/src/behavior/scenario_activation.rs +@@ -12,9 +12,13 @@ pub(super) enum Finish { + /// Still open at this scope boundary; the visible span is not an isolated stub. + Continuation, + Open, ++ /// The receiver was deleted without answering this call. ++ Terminated(Id), ++ /// Lifetime clipping ended this visible piece before its logical terminal. ++ Clipped, + } + +-#[derive(Clone, Debug)] ++#[derive(Clone, Debug, PartialEq)] + pub(super) struct Segment { + pub call: Id, + pub receiver: Id, +@@ -40,6 +44,9 @@ impl Segment { + + impl Scene { + pub(super) fn layout_activations(&mut self, p: &Project, lanes: &BTreeMap) { ++ // Logical endpoints precede clipping and remain available even when a ++ // lifetime hides a whole execution or terminates it before its Reply. ++ let correlations = logical_correlations(p, &self.rows, &self.lines); + let mut calls: Vec<_> = self + .rows + .iter() +@@ -64,6 +71,7 @@ impl Scene { + calls.sort_by(|a, b| a.3.total_cmp(&b.3).then_with(|| a.0.cmp(&b.0))); + for &(call, receiver, scope, _, x) in &calls { + let first = self.activations.len(); ++ let first_cue = self.open_calls.len(); + self.activation_sequence(p, scope, call, receiver, x, None); + let column = self.activations[first..] + .iter() +@@ -79,6 +87,9 @@ impl Scene { + segment.column = column; + segment.rect.x += column as f32 * OFFSET; + } ++ for cue in &mut self.open_calls[first_cue..] { ++ cue.x += column as f32 * OFFSET; ++ } + } + // Shallow executions paint first; columns cannot collide within a scope. + self.activations.sort_by(|a, b| { +@@ -87,13 +98,7 @@ impl Scene { + .then_with(|| a.rect.y.total_cmp(&b.rect.y)) + .then_with(|| a.call.cmp(&b.call)) + }); +- self.open_calls = self +- .activations +- .iter() +- .filter(|a| matches!(a.finish, Finish::Open | Finish::Continuation)) +- .map(|a| Point::new(a.rect.x + a.rect.width + 4., a.bottom() - 7.)) +- .collect(); +- self.anchor_activation_messages(p, lanes); ++ self.anchor_activation_messages(p, lanes, &correlations); + } + + fn activation_segment( +@@ -105,17 +110,33 @@ impl Scene { + span: std::ops::Range, + finish: Finish, + ) { +- if span.end > span.start { ++ // Cues describe unanswered logical paths, including wholly invisible ++ // ones. Never derive them only from the surviving paint rectangles. ++ if matches!( ++ finish, ++ Finish::Open | Finish::Continuation | Finish::Terminated(_) ++ ) { ++ self.open_calls ++ .push(Point::new(x + WIDTH / 2. + 4., span.end - 7.)); ++ } ++ for alive in self ++ .lifecycle ++ .alive_spans(receiver, scope, span.start, span.end) ++ { + self.activations.push(Segment { + call, + receiver, + scope, + rect: Rectangle::new( +- Point::new(x - WIDTH / 2., span.start), +- Size::new(WIDTH, span.end - span.start), ++ Point::new(x - WIDTH / 2., alive.start), ++ Size::new(WIDTH, alive.end - alive.start), + ), + column: 0, +- finish, ++ finish: if alive.end == span.end { ++ finish ++ } else { ++ Finish::Clipped ++ }, + }); + } + } +@@ -130,9 +151,10 @@ impl Scene { + receiver: Id, + x: f32, + mut start: Option, +- ) -> bool { ++ ) -> Outcome { + let entered_open = start.is_some(); + let mut split = false; ++ let mut may_be_terminated = false; + for id in p.elements[&owner].steps().into_iter().flatten() { + let Some(&(_, y)) = self.rows.get(id) else { + continue; +@@ -154,6 +176,26 @@ impl Scene { + Some(SharedBody::Occurrence { + body: + OccurrenceBody::Exchange { ++ message_kind: MessageKind::Delete, ++ receiver: Some(deleted), ++ .. ++ }, ++ .. ++ }) if *deleted == receiver => { ++ self.activation_segment( ++ call, ++ receiver, ++ owner, ++ x, ++ top..y, ++ Finish::Terminated(*id), ++ ); ++ start = None; ++ may_be_terminated = true; ++ } ++ Some(SharedBody::Occurrence { ++ body: ++ OccurrenceBody::Exchange { + message_kind: MessageKind::Reply, + reply_to: Some(correlation), + .. +@@ -185,12 +227,22 @@ impl Scene { + .collect(); + let open = match operator { + FragmentOperator::Alternative => { +- outcomes.is_empty() || outcomes.iter().any(|open| *open) ++ outcomes.is_empty() || outcomes.iter().any(|outcome| outcome.open) + } +- FragmentOperator::Parallel => outcomes.iter().all(|open| *open), ++ FragmentOperator::Parallel => outcomes.iter().all(|outcome| outcome.open), + FragmentOperator::Optional | FragmentOperator::Loop => true, + }; +- start = open.then_some(bottom); ++ if outcomes.iter().any(|outcome| outcome.may_be_terminated) { ++ // Sibling bars retain their own entry paths, but a ++ // conditional death cannot become a definite parent ++ // execution again after a later Create. ++ self.open_calls ++ .push(Point::new(x + WIDTH / 2. + 4., bottom - 7.)); ++ may_be_terminated = true; ++ start = None; ++ } else { ++ start = open.then_some(bottom); ++ } + } + _ => {} + } +@@ -210,22 +262,19 @@ impl Scene { + }; + self.activation_segment(call, receiver, owner, x, top..bottom, finish); + } +- start.is_some() ++ Outcome { ++ open: start.is_some(), ++ may_be_terminated, ++ } + } + +- fn anchor_activation_messages(&mut self, p: &Project, lanes: &BTreeMap) { ++ fn anchor_activation_messages( ++ &mut self, ++ p: &Project, ++ lanes: &BTreeMap, ++ correlations: &BTreeMap, ++ ) { + let segments = &self.activations; +- let mut correlations: BTreeMap = BTreeMap::new(); +- for segment in segments { +- let correlation = correlations.entry(segment.call).or_insert(Correlation { +- start: segment.rect.y, +- replies: vec![], +- }); +- correlation.start = correlation.start.min(segment.rect.y); +- if matches!(segment.finish, Finish::Reply(_)) { +- correlation.replies.push((segment.scope, segment.bottom())); +- } +- } + for line in &mut self.lines { + let Some(SharedBody::Occurrence { + body: +@@ -259,15 +308,18 @@ impl Scene { + let reflective = sender == receiver; + let source = if *message_kind == MessageKind::Reply { + reply_to.and_then(|call| { +- segments +- .iter() +- .find(|a| a.call == call && a.finish == Finish::Reply(line.id)) ++ segments.iter().find(|a| { ++ a.call == call ++ && a.scope == scope ++ && a.finish == Finish::Reply(line.id) ++ && a.bottom() == send_y ++ }) + }) + } else { + active_segment( + p, + segments, +- &correlations, ++ correlations, + *sender, + scope, + send_y, +@@ -282,7 +334,7 @@ impl Scene { + active_segment( + p, + segments, +- &correlations, ++ correlations, + *receiver, + scope, + receive_y, +@@ -307,6 +359,57 @@ impl Scene { + } + } + ++struct Outcome { ++ open: bool, ++ may_be_terminated: bool, ++} ++ ++fn logical_correlations( ++ p: &Project, ++ rows: &BTreeMap, ++ lines: &[Line], ++) -> BTreeMap { ++ let mut result = BTreeMap::new(); ++ let points: BTreeMap<_, _> = lines.iter().map(|line| (line.id, &line.points)).collect(); ++ for (&id, &(_, y)) in rows { ++ if matches!( ++ p.elements.get(&id).and_then(|e| e.shared()), ++ Some(SharedBody::Occurrence { ++ body: OccurrenceBody::Exchange { ++ message_kind: MessageKind::Call, ++ .. ++ }, ++ .. ++ }) ++ ) { ++ result.insert( ++ id, ++ Correlation { ++ start: points.get(&id).and_then(|p| p.last()).map_or(y, |p| p.y), ++ replies: vec![], ++ }, ++ ); ++ } ++ } ++ for (&id, &(scope, y)) in rows { ++ if let Some(SharedBody::Occurrence { ++ body: ++ OccurrenceBody::Exchange { ++ message_kind: MessageKind::Reply, ++ reply_to: Some(call), ++ .. ++ }, ++ .. ++ }) = p.elements.get(&id).and_then(|e| e.shared()) ++ && let Some(correlation) = result.get_mut(call) ++ { ++ let sent = points.get(&id).and_then(|p| p.first()).map_or(y, |p| p.y); ++ correlation.replies.push((scope, sent)); ++ } ++ } ++ result ++} ++ + /// A caller has no implicit execution just because it sent a message. Only an + /// actually drawn, known-duration execution can supply its anchor. Crossed + /// intervals provide no unambiguous innermost execution, so fall back to the lane. +diff --git a/crates/oa-desktop/src/behavior/scenario_lifecycle.rs b/crates/oa-desktop/src/behavior/scenario_lifecycle.rs +index 18a0ba9c0b8b1017bbe47bb6c71eddb4a3df5a7b..6fe044890864ecf3095d0fedf590104f6121abf7 100644 +--- a/crates/oa-desktop/src/behavior/scenario_lifecycle.rs ++++ b/crates/oa-desktop/src/behavior/scenario_lifecycle.rs +@@ -2,6 +2,8 @@ + use oa_core::{FragmentOperator, Id, Kind, MessageKind, OccurrenceBody, Project, SharedBody}; + use std::collections::{BTreeMap, BTreeSet}; + ++pub(super) mod render; ++ + /// Maps already recorded by the sequence renderer. Rows carry their owning sequence. + pub(crate) struct Geometry<'a> { + pub rows: &'a BTreeMap, +diff --git a/crates/oa-desktop/src/behavior/scenario_lifecycle/render.rs b/crates/oa-desktop/src/behavior/scenario_lifecycle/render.rs +new file mode 100644 +index 0000000000000000000000000000000000000000..989fb2d5b173fc68e50705f8d406f7786ba9c979 +--- /dev/null ++++ b/crates/oa-desktop/src/behavior/scenario_lifecycle/render.rs +@@ -0,0 +1,407 @@ ++//! Scene bridge for local lifetime geometry; no authoring or model mutations. ++use super::{Geometry, LaneLifetime, Life, Marker, MarkerKind, Span, project_lifetimes}; ++use crate::{behavior::Line, style, views::short}; ++use iced::{ ++ Color, Point, Rectangle, Size, ++ widget::canvas::{self, Frame, Path, Stroke, Text}, ++}; ++use oa_core::{Id, OccurrenceBody, Project, SharedBody}; ++use std::collections::BTreeMap; ++ ++// Test-only geometry input, deliberately upstream of rows, scopes, lifecycle ++// and activations. This is not an authored placement or drag policy. ++#[cfg(test)] ++thread_local! { ++ static TEST_ROW_OFFSETS: std::cell::RefCell> = Default::default(); ++} ++#[cfg(test)] ++pub(in crate::behavior) fn apply_test_row_offset(id: Id, y: &mut f32) { ++ TEST_ROW_OFFSETS.with(|offsets| { ++ if let Some(offset) = offsets.borrow().get(&id) { ++ *y += offset; ++ } ++ }); ++} ++ ++#[derive(Debug, Clone, PartialEq)] ++struct EventMarker { ++ event: Marker, ++ lifeline: Id, ++ center: Point, ++ capsule: Rectangle, ++ name: String, ++ sender_x: Option, ++} ++ ++#[derive(Debug, Default, Clone, PartialEq)] ++pub(in crate::behavior) struct Rendering { ++ // Complete rendering positions, including warning-admitted unassigned lanes. ++ // Scene.lanes independently retains the existing authoring eligibility rule. ++ lanes: BTreeMap, ++ span: Option, ++ lifetimes: Vec, ++ markers: Vec, ++} ++ ++impl Rendering { ++ pub(in crate::behavior) fn new( ++ project: &Project, ++ owner: Id, ++ lanes: &BTreeMap, ++ rows: &BTreeMap, ++ insertion_scopes: &BTreeMap, ++ height: f32, ++ ) -> Self { ++ let span = Span { ++ start: 85., ++ end: height - 20., ++ }; ++ if !span.valid() { ++ return Self::default(); ++ } ++ // Insertion scopes deliberately start later and end earlier. Empty and ++ // Create-only scenarios still have the full visible lifetime extent. ++ let mut scopes = insertion_scopes.clone(); ++ for (scope, (start, end)) in &mut scopes { ++ if *scope != owner && *start == *end && start.is_finite() { ++ // An empty operand has 42 px between its insertion axis and ++ // frame end. Match the existing 26 px open-activation allowance. ++ *end = *start + 26.; ++ } ++ } ++ scopes.insert(owner, (span.start, span.end)); ++ let lifetimes = project_lifetimes( ++ project, ++ owner, ++ &Geometry { ++ rows, ++ scopes: &scopes, ++ }, ++ ); ++ let lanes: BTreeMap<_, _> = lanes ++ .iter() ++ .filter(|(_, x)| x.is_finite()) ++ .map(|(id, x)| (*id, *x)) ++ .collect(); ++ let mut markers = Vec::new(); ++ for lane in &lifetimes { ++ let Some(&x) = lanes.get(&lane.lifeline) else { ++ continue; ++ }; ++ for event in &lane.markers { ++ let sender_x = project ++ .elements ++ .get(&event.occurrence) ++ .and_then(|e| e.shared()) ++ .and_then(|body| match body { ++ SharedBody::Occurrence { ++ body: ++ OccurrenceBody::Exchange { ++ sender: Some(sender), ++ .. ++ }, ++ .. ++ } => lanes.get(sender).copied(), ++ _ => None, ++ }); ++ markers.push(EventMarker { ++ event: *event, ++ lifeline: lane.lifeline, ++ center: Point::new(x, event.y), ++ capsule: Rectangle::new( ++ Point::new(x - 70., event.y - 14.), ++ Size::new(140., 28.), ++ ), ++ name: project.named(lane.lifeline).to_owned(), ++ sender_x, ++ }); ++ } ++ } ++ Self { ++ lanes, ++ span: Some(span), ++ lifetimes, ++ markers, ++ } ++ } ++ ++ pub(in crate::behavior) fn align_messages(&self, lines: &mut [Line]) { ++ for marker in &self.markers { ++ let Some(sender) = marker.sender_x else { ++ continue; ++ }; ++ let Some(line) = lines ++ .iter_mut() ++ .find(|line| line.id == marker.event.occurrence) ++ else { ++ continue; ++ }; ++ let x = marker.center.x; ++ let y = marker.center.y; ++ let self_message = sender == x; ++ let end_x = match marker.event.kind { ++ MarkerKind::Birth if sender < x => marker.capsule.x, ++ MarkerKind::Birth => marker.capsule.x + marker.capsule.width, ++ MarkerKind::Death => x, ++ }; ++ line.points = if self_message { ++ // The receiver is on the recorded occurrence row, including self ++ // lifecycle events. The elbow stays outside the birth capsule. ++ let elbow = x + 112.; ++ line.label_at = Point::new(x + 12., y - 52.); ++ vec![ ++ Point::new(x, y - 24.), ++ Point::new(elbow, y - 24.), ++ Point::new(elbow, y), ++ Point::new(end_x, y), ++ ] ++ } else { ++ if marker.event.kind == MarkerKind::Birth { ++ // Keep the label above the capsule, including right-to-left ++ // messages whose existing label starts beside the receiver. ++ line.label_at.y = y - 40.; ++ } ++ vec![Point::new(sender, y), Point::new(end_x, y)] ++ }; ++ } ++ } ++ ++ pub(in crate::behavior) fn alive_spans( ++ &self, ++ lifeline: Id, ++ scope: Id, ++ top: f32, ++ bottom: f32, ++ ) -> Vec { ++ if !top.is_finite() || !bottom.is_finite() || bottom <= top { ++ return vec![]; ++ } ++ self.lifetimes ++ .iter() ++ .find(|lane| lane.lifeline == lifeline) ++ .into_iter() ++ .flat_map(|lane| &lane.intervals) ++ .filter(|interval| interval.scope == scope && interval.life == Life::Alive) ++ .filter_map(|interval| { ++ let start = top.max(interval.span.start); ++ let end = bottom.min(interval.span.end); ++ (start < end).then_some(Span { start, end }) ++ }) ++ .collect() ++ } ++ ++ pub(in crate::behavior) fn marker_at(&self, point: Point) -> Option { ++ self.markers ++ .iter() ++ .rev() ++ .find(|marker| match marker.event.kind { ++ MarkerKind::Birth => marker.capsule.contains(point), ++ MarkerKind::Death => marker_distance(marker, point) <= 1.25, ++ }) ++ .map(|marker| marker.event.occurrence) ++ } ++ ++ pub(in crate::behavior) fn nearest_marker(&self, point: Point) -> Option<(Id, f32)> { ++ if !point.x.is_finite() || !point.y.is_finite() { ++ return None; ++ } ++ // Exact visible shapes are tested first by Scene. A low-zoom tolerance ++ // must not outrank another marker's actual capsule, a header, or a label. ++ self.markers ++ .iter() ++ .map(|marker| (marker.event.occurrence, marker_distance(marker, point))) ++ .min_by(|a, b| a.1.total_cmp(&b.1).then_with(|| a.0.cmp(&b.0))) ++ } ++ ++ pub(in crate::behavior) fn lane_at(&self, point: Point, scale: f32) -> Option { ++ let span = self.span?; ++ if !scale.is_finite() || scale <= 0. || point.y < span.start || point.y > span.end { ++ return None; ++ } ++ self.lanes ++ .iter() ++ .filter(|(_, x)| (**x - point.x).abs() < 12. / scale) ++ .min_by(|a, b| (a.1 - point.x).abs().total_cmp(&(b.1 - point.x).abs())) ++ .map(|(id, _)| *id) ++ } ++ ++ pub(in crate::behavior) fn draw_lanes(&self, frame: &mut Frame, selected: Id) { ++ let Some(span) = self.span else { ++ return; ++ }; ++ for (&id, &x) in &self.lanes { ++ frame.stroke( ++ &Path::line(Point::new(x, span.start), Point::new(x, span.end)), ++ Stroke { ++ line_dash: canvas::LineDash { ++ segments: &[2., 5.], ++ offset: 0, ++ }, ++ ..Stroke::default() ++ .with_width(1.) ++ .with_color(if id == selected { ++ Color::from_rgb8(148, 190, 187) ++ } else { ++ Color::from_rgb8(214, 222, 222) ++ }) ++ }, ++ ); ++ } ++ for lifetime in &self.lifetimes { ++ let Some(&x) = self.lanes.get(&lifetime.lifeline) else { ++ continue; ++ }; ++ for interval in &lifetime.intervals { ++ match interval.life { ++ Life::Alive => frame.stroke( ++ &Path::line( ++ Point::new(x, interval.span.start), ++ Point::new(x, interval.span.end), ++ ), ++ Stroke::default().with_width(2.).with_color( ++ if lifetime.lifeline == selected { ++ style::TEAL ++ } else { ++ Color::from_rgb8(91, 113, 113) ++ }, ++ ), ++ ), ++ Life::Unresolved if interval.span.end - interval.span.start >= 16. => { ++ frame.fill_text(Text { ++ content: "?".into(), ++ position: Point::new(x + 9., interval.span.start + 2.), ++ size: 11.into(), ++ color: style::MUTED, ++ ..Default::default() ++ }); ++ } ++ _ => {} ++ } ++ } ++ } ++ if !self.lanes.is_empty() { ++ frame.fill_text(Text { ++ content: ++ "Dotted: editing guide · Solid: local lifetime · ?: lifetime depends on path" ++ .into(), ++ position: Point::new(28., span.end + 4.), ++ size: 10.into(), ++ color: style::MUTED, ++ ..Default::default() ++ }); ++ } ++ } ++ ++ pub(in crate::behavior) fn draw_markers( ++ &self, ++ frame: &mut Frame, ++ selected: Id, ++ scale: f32, ++ pan: iced::Vector, ++ ) { ++ for marker in &self.markers { ++ let color = if selected == marker.event.occurrence || selected == marker.lifeline { ++ style::TEAL ++ } else { ++ style::INK ++ }; ++ match marker.event.kind { ++ MarkerKind::Birth => { ++ let path = Path::rounded_rectangle( ++ marker.capsule.position(), ++ marker.capsule.size(), ++ 6.into(), ++ ); ++ frame.fill(&path, Color::from_rgb8(243, 248, 248)); ++ frame.stroke( ++ &path, ++ Stroke::default().with_color(color).with_width( ++ if selected == marker.event.occurrence { ++ 2.5 ++ } else { ++ 1.5 ++ }, ++ ), ++ ); ++ if let Some(clip) = birth_label_clip(pan, marker.capsule, scale, frame.size()) { ++ // WGPU clipped frames start with an identity transform; ++ // neither the parent's pan/scale nor its clip is inherited. ++ frame.with_clip(clip, |label| { ++ label.translate(pan); ++ label.scale(scale); ++ label.fill_text(Text { ++ content: short(&marker.name, 18), ++ position: marker.capsule.position() + iced::Vector::new(8., 6.), ++ size: 12.into(), ++ color, ++ ..Default::default() ++ }); ++ }); ++ } ++ } ++ MarkerKind::Death => { ++ for (a, b) in death_strokes(marker.center) { ++ frame.stroke( ++ &Path::line(a, b), ++ Stroke::default().with_color(color).with_width(2.5), ++ ); ++ } ++ } ++ } ++ } ++ } ++} ++ ++fn birth_label_clip( ++ pan: iced::Vector, ++ capsule: Rectangle, ++ scale: f32, ++ viewport: Size, ++) -> Option { ++ if !pan.x.is_finite() || !pan.y.is_finite() || !scale.is_finite() || scale <= 0. { ++ return None; ++ } ++ Rectangle::new( ++ Point::new( ++ pan.x + (capsule.x + 8.) * scale, ++ pan.y + (capsule.y + 4.) * scale, ++ ), ++ Size::new((capsule.width - 16.) * scale, (capsule.height - 8.) * scale), ++ ) ++ .intersection(&Rectangle::new(Point::ORIGIN, viewport)) ++} ++ ++fn marker_distance(marker: &EventMarker, point: Point) -> f32 { ++ match marker.event.kind { ++ MarkerKind::Birth => { ++ let dx = (marker.capsule.x - point.x) ++ .max(point.x - marker.capsule.x - marker.capsule.width) ++ .max(0.); ++ let dy = (marker.capsule.y - point.y) ++ .max(point.y - marker.capsule.y - marker.capsule.height) ++ .max(0.); ++ dx.hypot(dy) ++ } ++ MarkerKind::Death => death_strokes(marker.center) ++ .iter() ++ .map(|(a, b)| crate::diagram::distance_to_segment(point, *a, *b)) ++ .fold(f32::INFINITY, f32::min), ++ } ++} ++ ++fn death_strokes(center: Point) -> [(Point, Point); 2] { ++ [ ++ ( ++ center + iced::Vector::new(-7., -7.), ++ center + iced::Vector::new(7., 7.), ++ ), ++ ( ++ center + iced::Vector::new(-7., 7.), ++ center + iced::Vector::new(7., -7.), ++ ), ++ ] ++} ++ ++#[cfg(test)] ++#[path = "render_tests.rs"] ++mod tests; +diff --git a/crates/oa-desktop/src/behavior/scenario_lifecycle/render_tests.rs b/crates/oa-desktop/src/behavior/scenario_lifecycle/render_tests.rs +new file mode 100644 +index 0000000000000000000000000000000000000000..e0d9ee812a49fb1f8b24b0e9e460e08cd42aa34f +--- /dev/null ++++ b/crates/oa-desktop/src/behavior/scenario_lifecycle/render_tests.rs +@@ -0,0 +1,991 @@ ++use super::*; ++use crate::{behavior::Scene, document::Document}; ++use iced::Size; ++use oa_core::*; ++ ++#[path = "union_tests.rs"] ++mod union_tests; ++ ++struct Fixture { ++ project: Project, ++ owner: Id, ++ sender: Id, ++ receiver: Id, ++ work: Id, ++ exchange: Id, ++} ++impl Fixture { ++ fn new(layer: Layer) -> Self { ++ let mut project = Project::empty(); ++ let kind = if layer == Layer::Oa { ++ Kind::Activity ++ } else { ++ Kind::Function ++ }; ++ let a = project.add_element(kind, layer, "Request", None).unwrap(); ++ let work = project.add_element(kind, layer, "Provide", None).unwrap(); ++ let exchange = project.relate( ++ if layer == Layer::Oa { ++ RelationKind::Interaction ++ } else { ++ RelationKind::FunctionalExchange ++ }, ++ "Service", ++ a, ++ work, ++ ); ++ let owner = project ++ .add_element(Kind::Scenario, layer, "Lifecycle", None) ++ .unwrap(); ++ let mut lane = |name, represented| { ++ let id = project ++ .add_element(Kind::Lifeline, layer, name, Some(owner)) ++ .unwrap(); ++ *project.elements.get_mut(&id).unwrap().shared_mut().unwrap() = SharedBody::Lifeline { ++ represented: Some(represented), ++ }; ++ id ++ }; ++ let sender = lane("Requester", a); ++ let receiver = lane("Provider", work); ++ Self { ++ project, ++ owner, ++ sender, ++ receiver, ++ work, ++ exchange, ++ } ++ } ++ fn occurrence(&mut self, parent: Id, name: &str, body: OccurrenceBody) -> Id { ++ let mut element = self ++ .project ++ .make_element( ++ Kind::Occurrence, ++ self.project.elements[&parent].layer(), ++ name, ++ Some(parent), ++ ) ++ .unwrap(); ++ let id = element.id; ++ *element.shared_mut().unwrap() = SharedBody::Occurrence { ++ body, ++ precondition: String::new(), ++ postcondition: String::new(), ++ }; ++ self.project.elements.insert(id, element); ++ let parent = self.project.elements.get_mut(&parent).unwrap(); ++ if let Some(steps) = parent.steps_mut() { ++ steps.push(id); ++ } else if let Some(SharedBody::Occurrence { ++ body: OccurrenceBody::Fragment { branches, .. }, ++ .. ++ }) = parent.shared_mut() ++ { ++ branches.push(id); ++ } else { ++ panic!("fixture parent must own ordered occurrences or operands"); ++ } ++ id ++ } ++ fn message(&mut self, parent: Id, kind: MessageKind) -> Id { ++ self.occurrence( ++ parent, ++ "Message", ++ OccurrenceBody::Exchange { ++ exchange: Some(self.exchange), ++ sender: Some(self.sender), ++ receiver: Some(self.receiver), ++ message_kind: kind, ++ operation: None, ++ reply_to: None, ++ values: vec![], ++ }, ++ ) ++ } ++ fn reply(&mut self, parent: Id, call: Id) -> Id { ++ self.occurrence( ++ parent, ++ "Reply", ++ OccurrenceBody::Exchange { ++ exchange: Some(self.exchange), ++ sender: Some(self.receiver), ++ receiver: Some(self.sender), ++ message_kind: MessageKind::Reply, ++ operation: None, ++ reply_to: Some(call), ++ values: vec![], ++ }, ++ ) ++ } ++ fn fragment(&mut self, parent: Id, operator: FragmentOperator) -> Id { ++ self.occurrence( ++ parent, ++ "Paths", ++ OccurrenceBody::Fragment { ++ operator, ++ branches: vec![], ++ }, ++ ) ++ } ++ fn branch(&mut self, fragment: Id) -> Id { ++ self.occurrence( ++ fragment, ++ "Operand", ++ OccurrenceBody::Branch { ++ guard: "condition".into(), ++ occurrences: vec![], ++ }, ++ ) ++ } ++ fn document(&self) -> Document { ++ validate_candidate(&self.project).expect("ordinary core admission must succeed"); ++ let mut bundle = source_project::format_bundle(&self.project); ++ for text in bundle.files.values_mut() { ++ *text = format!( ++ "// Retain exact authored CRLF and Unicode Ω\r\n{}", ++ text.replace('\n', "\r\n") ++ ); ++ } ++ let document = ++ Document::from_bundle(bundle.clone(), source_project::ProjectLimits::default()) ++ .unwrap(); ++ assert_eq!(document.project(), &self.project); ++ assert_eq!(document.bundle(), &bundle); ++ document ++ } ++ fn scene(&self) -> Scene { ++ let document = self.document(); ++ let before = document.snapshot(); ++ let scene = Scene::sequence(document.project(), self.owner, self.owner); ++ assert_eq!(document.project(), &before.decoded.project); ++ assert_eq!(document.bundle(), &before.bundle); ++ assert_eq!(document.revision(), 0); ++ assert!(!document.can_undo() && !document.can_redo() && !document.dirty()); ++ assert_eq!( ++ scene.lifecycle, ++ Scene::sequence(document.project(), self.owner, self.owner).lifecycle ++ ); ++ assert!( ++ scene ++ .lines ++ .iter() ++ .flat_map(|line| &line.points) ++ .all(|p| p.x.is_finite() && p.y.is_finite()) ++ ); ++ scene ++ } ++} ++ ++fn intervals(scene: &Scene, lifeline: Id, scope: Id) -> Vec<(f32, f32, Life)> { ++ scene ++ .lifecycle ++ .lifetimes ++ .iter() ++ .find(|lane| lane.lifeline == lifeline) ++ .unwrap() ++ .intervals ++ .iter() ++ .filter(|i| i.scope == scope) ++ .map(|i| (i.span.start, i.span.end, i.life)) ++ .collect() ++} ++ ++#[test] ++fn real_scene_long_header_title_and_detail_keep_names_and_have_bounded_clips() { ++ for layer in [Layer::Oa, Layer::Sa] { ++ for name in [ ++ "W".repeat(18), ++ "界".repeat(24), ++ "e\u{301}".repeat(24), ++ "👩\u{200d}🔧".repeat(12), ++ ] { ++ let mut f = Fixture::new(layer); ++ f.project.elements.get_mut(&f.receiver).unwrap().name = name.clone(); ++ f.project.elements.get_mut(&f.work).unwrap().name = name.clone(); ++ let scene = f.scene(); ++ let header = scene.boxes.iter().find(|b| b.id == f.receiver).unwrap(); ++ assert_eq!(header.title, name); ++ assert_eq!(header.detail, name); ++ assert_eq!(header.rect.size(), Size::new(204., 70.)); ++ assert_eq!(scene.hit(header.rect.center()), Some(f.receiver)); ++ // Scroll offset is handled by the existing outer canvas/scrollable; ++ // these are the local drawing frame's coordinates, not screen input. ++ for scale in [0.05, 0.5, 0.512, 0.64, 0.8, 1., 1.953125, 2.] { ++ let clip = crate::behavior::box_text_clip( ++ iced::Vector::ZERO, ++ header.rect, ++ scale, ++ Size::new(2000., 2000.), ++ ) ++ .unwrap(); ++ let world = Rectangle::new( ++ Point::new(clip.x / scale, clip.y / scale), ++ Size::new(clip.width / scale, clip.height / scale), ++ ); ++ assert!((world.x - header.rect.x - 10.).abs() < 0.001); ++ assert!((world.y - header.rect.y - 8.).abs() < 0.001); ++ assert!((world.width - 184.).abs() < 0.001); ++ assert!((world.height - 54.).abs() < 0.001); ++ assert!(header.rect.contains(world.position())); ++ assert!( ++ header ++ .rect ++ .contains(Point::new(world.x + world.width, world.y + world.height,)) ++ ); ++ } ++ } ++ } ++} ++ ++#[test] ++fn box_text_clip_intersects_parent_viewport_and_rejects_empty_interiors() { ++ use crate::behavior::box_text_clip; ++ let card = Rectangle::new(Point::new(100., 200.), Size::new(204., 70.)); ++ assert_eq!( ++ box_text_clip(iced::Vector::ZERO, card, 2., Size::new(300., 500.)), ++ Some(Rectangle::new(Point::new(220., 416.), Size::new(80., 84.))) ++ ); ++ assert_eq!( ++ box_text_clip( ++ iced::Vector::ZERO, ++ Rectangle::new(Point::new(-20., -10.), card.size()), ++ 2., ++ Size::new(300., 500.), ++ ), ++ Some(Rectangle::new(Point::ORIGIN, Size::new(300., 104.))) ++ ); ++ for viewport in [Size::new(200., 500.), Size::new(300., 400.), Size::ZERO] { ++ assert_eq!(box_text_clip(iced::Vector::ZERO, card, 2., viewport), None); ++ } ++ for scale in [0., -1., f32::NAN, f32::INFINITY] { ++ assert_eq!( ++ box_text_clip(iced::Vector::ZERO, card, scale, Size::new(1000., 1000.)), ++ None ++ ); ++ } ++ for size in [Size::new(20., 70.), Size::new(204., 16.), Size::ZERO] { ++ assert_eq!( ++ box_text_clip( ++ iced::Vector::ZERO, ++ Rectangle::new(Point::ORIGIN, size), ++ 1., ++ card.size() ++ ), ++ None ++ ); ++ } ++} ++ ++#[test] ++fn real_scene_wide_latin_header_exceeds_old_character_budget() { ++ use iced::advanced::text::{self, Paragraph as _}; ++ let mut f = Fixture::new(Layer::Oa); ++ f.project.elements.get_mut(&f.receiver).unwrap().name = "W".repeat(18); ++ f.project.elements.get_mut(&f.work).unwrap().name = "W".repeat(24); ++ let scene = f.scene(); ++ let header = scene.boxes.iter().find(|b| b.id == f.receiver).unwrap(); ++ for (content, size, divisor) in [(&header.title, 13., 7.), (&header.detail, 11., 6.)] { ++ let label = iced::widget::canvas::Text { ++ content: crate::views::short(content, ((header.rect.width - 25.) / divisor) as usize), ++ size: size.into(), ++ ..Default::default() ++ }; ++ // Use the same real paragraph/font/shaping defaults as canvas Text. ++ // The native defect survives short(): glyph width, not scalar count, ++ // is what exceeds the card. This is a font witness, not a pixel gate. ++ let paragraph = ::Paragraph::with_text(text::Text { ++ content: label.content.as_str(), ++ bounds: Size::INFINITE, ++ size: label.size, ++ line_height: label.line_height, ++ font: label.font, ++ align_x: label.align_x, ++ align_y: label.align_y, ++ shaping: label.shaping, ++ wrapping: text::Wrapping::default(), ++ }); ++ let old_available = header.rect.width - 12.; ++ assert!( ++ paragraph.min_width() > old_available, ++ "wide glyph fixture must overflow the old unbounded card: {} <= {old_available}", ++ paragraph.min_width() ++ ); ++ } ++} ++ ++#[test] ++fn birth_label_clip_keeps_padded_world_bounds_at_each_scene_scale() { ++ let capsule = Rectangle::new(Point::new(100., 200.), Size::new(140., 28.)); ++ for (scale, expected) in [ ++ ( ++ 0.05, ++ Rectangle::new(Point::new(5.4, 10.2), Size::new(6.2, 1.)), ++ ), ++ ( ++ 0.5, ++ Rectangle::new(Point::new(54., 102.), Size::new(62., 10.)), ++ ), ++ ( ++ 1., ++ Rectangle::new(Point::new(108., 204.), Size::new(124., 20.)), ++ ), ++ ( ++ 2., ++ Rectangle::new(Point::new(216., 408.), Size::new(248., 40.)), ++ ), ++ ] { ++ let clip = ++ birth_label_clip(iced::Vector::ZERO, capsule, scale, Size::new(1000., 1000.)).unwrap(); ++ for (actual, expected) in [ ++ (clip.x, expected.x), ++ (clip.y, expected.y), ++ (clip.width, expected.width), ++ (clip.height, expected.height), ++ ] { ++ assert!((actual - expected).abs() < 0.0001); ++ } ++ assert!(capsule.contains(Point::new(clip.x / scale, clip.y / scale))); ++ assert!(capsule.contains(Point::new( ++ (clip.x + clip.width) / scale, ++ (clip.y + clip.height) / scale, ++ ))); ++ } ++} ++ ++#[test] ++fn birth_label_clip_preserves_parent_viewport_bounds() { ++ let capsule = Rectangle::new(Point::new(100., 200.), Size::new(140., 28.)); ++ assert_eq!( ++ birth_label_clip(iced::Vector::ZERO, capsule, 2., Size::new(300., 420.)), ++ Some(Rectangle::new(Point::new(216., 408.), Size::new(84., 12.))) ++ ); ++ let crossing_origin = Rectangle::new(Point::new(-20., -10.), Size::new(140., 28.)); ++ assert_eq!( ++ birth_label_clip( ++ iced::Vector::ZERO, ++ crossing_origin, ++ 2., ++ Size::new(300., 420.) ++ ), ++ Some(Rectangle::new(Point::ORIGIN, Size::new(224., 28.))) ++ ); ++ for viewport in [Size::new(200., 420.), Size::new(300., 400.), Size::ZERO] { ++ assert_eq!( ++ birth_label_clip(iced::Vector::ZERO, capsule, 2., viewport), ++ None ++ ); ++ } ++ for scale in [0., -1., f32::NAN, f32::INFINITY] { ++ assert_eq!( ++ birth_label_clip(iced::Vector::ZERO, capsule, scale, Size::new(1000., 1000.)), ++ None ++ ); ++ } ++} ++ ++#[test] ++fn real_scene_empty_and_create_only_use_visible_root_extents_not_insertion_bounds() { ++ for layer in [Layer::Oa, Layer::Sa] { ++ let mut f = Fixture::new(layer); ++ let empty = f.scene(); ++ assert_eq!(empty.sequence_bounds[&f.owner], (106., 106.)); ++ assert_eq!( ++ intervals(&empty, f.receiver, f.owner), ++ vec![(85., empty.size.height - 20., Life::Alive)] ++ ); ++ assert!(empty.lines.is_empty(), "lane guides are not message lines"); ++ let create = f.message(f.owner, MessageKind::Create); ++ let scene = f.scene(); ++ let birth = scene.rows[&create].1; ++ assert_eq!(birth, 148.); ++ assert_eq!(scene.sequence_bounds[&f.owner], (106., 198.)); ++ assert_eq!( ++ intervals(&scene, f.receiver, f.owner), ++ vec![ ++ (85., birth, Life::Absent), ++ (birth, scene.size.height - 20., Life::Alive), ++ ] ++ ); ++ assert_eq!( ++ intervals(&scene, f.sender, f.owner), ++ vec![(85., scene.size.height - 20., Life::Alive)] ++ ); ++ assert_eq!(scene.slots[0].y, 106.); ++ assert_eq!( ++ scene.lane_at(Point::new(scene.lanes[&f.receiver], 90.)), ++ Some(f.receiver) ++ ); ++ } ++} ++ ++#[test] ++fn real_scene_birth_death_markers_align_endpoints_and_win_selection_without_mutating_source() { ++ for layer in [Layer::Oa, Layer::Sa] { ++ let mut f = Fixture::new(layer); ++ let create = f.message(f.owner, MessageKind::Create); ++ f.occurrence( ++ f.owner, ++ "Work", ++ OccurrenceBody::Action { ++ action: Some(f.work), ++ lifeline: Some(f.receiver), ++ }, ++ ); ++ let delete = f.message(f.owner, MessageKind::Delete); ++ let mut scene = f.scene(); ++ let birth = scene.rows[&create].1; ++ let death = scene.rows[&delete].1; ++ assert_eq!( ++ intervals(&scene, f.receiver, f.owner), ++ vec![ ++ (85., birth, Life::Absent), ++ (birth, death, Life::Alive), ++ (death, scene.size.height - 20., Life::Absent), ++ ] ++ ); ++ let capsule = scene ++ .lifecycle ++ .markers ++ .iter() ++ .find(|m| m.event.occurrence == create) ++ .unwrap() ++ .capsule; ++ let line = scene.lines.iter().find(|l| l.id == create).unwrap(); ++ let expected_x = if scene.lanes[&f.sender] < scene.lanes[&f.receiver] { ++ capsule.x ++ } else { ++ capsule.x + capsule.width ++ }; ++ assert_eq!(line.points.last(), Some(&Point::new(expected_x, birth))); ++ assert!( ++ line.label_at.y + 22. < capsule.y, ++ "message caption clears birth capsule" ++ ); ++ let line = scene.lines.iter().find(|l| l.id == delete).unwrap(); ++ assert_eq!( ++ line.points.last(), ++ Some(&Point::new(scene.lanes[&f.receiver], death)) ++ ); ++ for scale in [0.5, 1., 2.] { ++ scene.scale = scale; ++ assert_eq!( ++ scene.hit(Point::new(scene.lanes[&f.receiver], birth)), ++ Some(create) ++ ); ++ assert_eq!( ++ scene.hit(Point::new(scene.lanes[&f.receiver], death)), ++ Some(delete) ++ ); ++ assert_eq!( ++ scene.hit(Point::new( ++ scene.lanes[&f.receiver], ++ scene.size.height - 25. ++ )), ++ Some(f.receiver) ++ ); ++ assert_eq!( ++ scene.hit(Point::new(scene.lanes[&f.receiver], 40.)), ++ Some(f.receiver) ++ ); ++ } ++ } ++} ++ ++#[test] ++fn real_scene_branch_delete_clips_only_its_activation_and_keeps_unanswered_call_visible() { ++ for layer in [Layer::Oa, Layer::Sa] { ++ let mut f = Fixture::new(layer); ++ let call = f.message(f.owner, MessageKind::Call); ++ let fragment = f.fragment(f.owner, FragmentOperator::Alternative); ++ let left = f.branch(fragment); ++ let delete = f.message(left, MessageKind::Delete); ++ let right = f.branch(fragment); ++ let scene = f.scene(); ++ let death = scene.rows[&delete].1; ++ let (left_start, left_end) = scene.sequence_bounds[&left]; ++ let (right_start, _) = scene.sequence_bounds[&right]; ++ let bars: Vec<_> = scene ++ .activations ++ .iter() ++ .filter(|b| b.call == call && b.receiver == f.receiver) ++ .map(|b| b.rect) ++ .collect(); ++ assert!( ++ bars.iter() ++ .any(|r| r.y == left_start && r.y + r.height == death) ++ ); ++ assert!( ++ !bars ++ .iter() ++ .any(|r| r.y < left_end && r.y + r.height > death && r.y >= left_start) ++ ); ++ assert!( ++ bars.iter().any(|r| r.y == right_start && r.height == 26.), ++ "empty exclusive sibling retains its own open activation" ++ ); ++ assert_eq!( ++ intervals(&scene, f.receiver, right), ++ vec![(right_start, right_start + 26., Life::Alive)] ++ ); ++ let frame_end = scene.boxes.iter().find(|b| b.id == fragment).unwrap().rect; ++ assert!( ++ !bars.iter().any(|r| r.y >= frame_end.y + frame_end.height), ++ "uncertain post-fragment lifetime cannot carry a definite activation bar" ++ ); ++ assert!( ++ scene ++ .open_calls ++ .iter() ++ .any(|p| p.y < death && p.y > left_start) ++ ); ++ assert!(scene.open_calls.iter().any(|p| p.y > right_start)); ++ assert_eq!( ++ intervals(&scene, f.receiver, left), ++ vec![ ++ (left_start, death, Life::Alive), ++ (death, left_end, Life::Absent) ++ ] ++ ); ++ assert_eq!( ++ intervals(&scene, f.receiver, f.owner).last().unwrap().2, ++ Life::Unresolved ++ ); ++ assert!(!f.project.elements.values().any(|e| matches!( ++ e.shared(), ++ Some(SharedBody::Occurrence { ++ body: OccurrenceBody::Exchange { ++ message_kind: MessageKind::Reply, ++ .. ++ }, ++ .. ++ }) ++ ))); ++ } ++} ++ ++#[test] ++fn real_scene_unassigned_lanes_and_explicit_incomplete_receiver_keep_real_marker_identity() { ++ for layer in [Layer::Oa, Layer::Sa] { ++ let mut f = Fixture::new(layer); ++ *f.project ++ .elements ++ .get_mut(&f.receiver) ++ .unwrap() ++ .shared_mut() ++ .unwrap() = SharedBody::Lifeline { represented: None }; ++ let create = f.message(f.owner, MessageKind::Create); ++ if let Some(SharedBody::Occurrence { ++ body: OccurrenceBody::Exchange { exchange, .. }, ++ .. ++ }) = f.project.elements.get_mut(&create).unwrap().shared_mut() ++ { ++ *exchange = None; ++ } ++ let scene = f.scene(); ++ assert!( ++ !scene.lanes.contains_key(&f.receiver), ++ "authoring eligibility remains separate" ++ ); ++ let x = scene.lifecycle.lanes[&f.receiver]; ++ assert_eq!(scene.lifecycle.markers[0].lifeline, f.receiver); ++ assert_eq!( ++ scene.hit(Point::new(x, scene.rows[&create].1)), ++ Some(create) ++ ); ++ assert_eq!(scene.hit(Point::new(x, 40.)), Some(f.receiver)); ++ assert_eq!( ++ scene.hit(Point::new(x, scene.size.height - 25.)), ++ Some(f.receiver) ++ ); ++ assert_eq!(scene.lane_at(Point::new(x, 90.)), None); ++ if let Some(SharedBody::Occurrence { ++ body: OccurrenceBody::Exchange { ++ receiver, exchange, .. ++ }, ++ .. ++ }) = f.project.elements.get_mut(&create).unwrap().shared_mut() ++ { ++ *receiver = None; ++ *exchange = Some(f.exchange); ++ } ++ let missing = f.scene(); ++ assert!( ++ missing.lifecycle.markers.is_empty(), ++ "do not infer receiver from global exchange" ++ ); ++ } ++} ++ ++#[test] ++fn real_scene_minimum_zoom_marker_halos_do_not_steal_adjacent_capsule_or_header_hits() { ++ let mut f = Fixture::new(Layer::Sa); ++ *f.project ++ .elements ++ .get_mut(&f.receiver) ++ .unwrap() ++ .shared_mut() ++ .unwrap() = SharedBody::Lifeline { represented: None }; ++ let create = f.message(f.owner, MessageKind::Create); ++ let delete = f.message(f.owner, MessageKind::Delete); ++ for event in [create, delete] { ++ if let Some(SharedBody::Occurrence { ++ body: OccurrenceBody::Exchange { exchange, .. }, ++ .. ++ }) = f.project.elements.get_mut(&event).unwrap().shared_mut() ++ { ++ *exchange = None; ++ } ++ } ++ let mut scene = f.scene(); ++ let x = scene.lifecycle.lanes[&f.receiver]; ++ assert_eq!(scene.rows[&delete].1 - scene.rows[&create].1, 92.); ++ for scale in [0.05, 0.1, 0.5, 1., 2.] { ++ scene.scale = scale; ++ assert_eq!( ++ scene.hit(Point::new(x, scene.rows[&create].1)), ++ Some(create) ++ ); ++ assert_eq!( ++ scene.hit(Point::new(x, scene.rows[&delete].1)), ++ Some(delete) ++ ); ++ assert_eq!(scene.hit(Point::new(x, 40.)), Some(f.receiver)); ++ if scale <= 0.1 { ++ for offset in [-25., -15., 15., 25.] { ++ assert_eq!( ++ scene.hit(Point::new(x, scene.rows[&delete].1 + offset)), ++ Some(delete), ++ "a nearby death halo must beat an earlier message's wider tolerance" ++ ); ++ } ++ } ++ } ++} ++ ++#[test] ++fn real_scene_minimum_zoom_near_ordinary_message_wins_over_lifecycle_halos() { ++ let mut f = Fixture::new(Layer::Sa); ++ f.message(f.owner, MessageKind::Create); ++ let ordinary = f.message(f.owner, MessageKind::Asynchronous); ++ f.message(f.owner, MessageKind::Delete); ++ let mut scene = f.scene(); ++ let x = (scene.lanes[&f.sender] + scene.lanes[&f.receiver]) / 2.; ++ for scale in [0.05, 0.1] { ++ scene.scale = scale; ++ assert_eq!( ++ scene.hit(Point::new(x, scene.rows[&ordinary].1 + 2.)), ++ Some(ordinary) ++ ); ++ } ++} ++ ++#[test] ++fn real_scene_self_lifecycle_elbows_end_on_recorded_marker_rows() { ++ for layer in [Layer::Oa, Layer::Sa] { ++ for kind in [MessageKind::Create, MessageKind::Delete] { ++ let mut f = Fixture::new(layer); ++ let event = f.message(f.owner, kind); ++ if let Some(SharedBody::Occurrence { ++ body: ++ OccurrenceBody::Exchange { ++ exchange, sender, .. ++ }, ++ .. ++ }) = f.project.elements.get_mut(&event).unwrap().shared_mut() ++ { ++ *exchange = None; ++ *sender = Some(f.receiver); ++ } ++ let scene = f.scene(); ++ let marker = &scene.lifecycle.markers[0]; ++ let line = scene.lines.iter().find(|l| l.id == event).unwrap(); ++ assert_eq!(line.points.len(), 4); ++ assert_eq!(line.points[0].y, marker.center.y - 24.); ++ assert_eq!(line.points[3].y, marker.center.y); ++ assert_eq!( ++ line.points[3].x, ++ if marker.event.kind == MarkerKind::Birth { ++ marker.capsule.x + marker.capsule.width ++ } else { ++ marker.center.x ++ } ++ ); ++ assert!(line.points[1].x > marker.capsule.x + marker.capsule.width); ++ assert_eq!(scene.hit(marker.center), Some(event)); ++ } ++ } ++} ++ ++#[test] ++fn real_scene_self_delete_caption_clears_the_preceding_action_box() { ++ let mut f = Fixture::new(Layer::Sa); ++ let action = f.occurrence( ++ f.owner, ++ "Finish work", ++ OccurrenceBody::Action { ++ action: Some(f.work), ++ lifeline: Some(f.receiver), ++ }, ++ ); ++ let delete = f.message(f.owner, MessageKind::Delete); ++ if let Some(SharedBody::Occurrence { ++ body: OccurrenceBody::Exchange { ++ exchange, sender, .. ++ }, ++ .. ++ }) = f.project.elements.get_mut(&delete).unwrap().shared_mut() ++ { ++ *exchange = None; ++ *sender = Some(f.receiver); ++ } ++ let scene = f.scene(); ++ let action = scene.boxes.iter().find(|b| b.id == action).unwrap(); ++ let line = scene.lines.iter().find(|l| l.id == delete).unwrap(); ++ assert!(line.label_at.y > action.rect.y + action.rect.height); ++ assert!(line.label_at.y + 22. < line.points[0].y); ++ assert_eq!(line.points[3].y, scene.rows[&delete].1); ++ assert_eq!( ++ scene ++ .slots ++ .iter() ++ .find(|s| s.slot.before == Some(delete)) ++ .unwrap() ++ .y, ++ scene.rows[&delete].1 - 42. ++ ); ++} ++ ++#[test] ++fn real_scene_conditional_repeated_and_parallel_scopes_do_not_claim_definite_continuation() { ++ for operator in [ ++ FragmentOperator::Alternative, ++ FragmentOperator::Optional, ++ FragmentOperator::Loop, ++ FragmentOperator::Parallel, ++ ] { ++ let mut f = Fixture::new(Layer::Sa); ++ let fragment = f.fragment(f.owner, operator); ++ let first = f.branch(fragment); ++ let create = f.message(first, MessageKind::Create); ++ let scene = f.scene(); ++ assert_eq!(scene.lifecycle.markers[0].event.occurrence, create); ++ assert_eq!( ++ intervals(&scene, f.receiver, f.owner).first().unwrap().2, ++ Life::Unresolved ++ ); ++ assert_eq!( ++ intervals(&scene, f.receiver, f.owner).last().unwrap().2, ++ Life::Unresolved ++ ); ++ assert!( ++ scene ++ .lifecycle ++ .lifetimes ++ .iter() ++ .find(|l| l.lifeline == f.sender) ++ .unwrap() ++ .intervals ++ .iter() ++ .all(|i| i.life == Life::Alive) ++ ); ++ } ++} ++ ++#[test] ++fn real_scene_lifecycle_edit_undo_redo_restores_exact_source_and_changed_geometry() { ++ for layer in [Layer::Oa, Layer::Sa] { ++ let mut f = Fixture::new(layer); ++ let create = f.message(f.owner, MessageKind::Create); ++ let mut document = f.document(); ++ let before = document.snapshot(); ++ let geometry = Scene::sequence(document.project(), f.owner, create).lifecycle; ++ let mut edited = document.project().elements[&create].clone(); ++ if let Some(SharedBody::Occurrence { ++ body: OccurrenceBody::Exchange { message_kind, .. }, ++ .. ++ }) = edited.shared_mut() ++ { ++ *message_kind = MessageKind::Asynchronous; ++ } ++ document ++ .execute(Command::EditElement(create, edited)) ++ .unwrap(); ++ let after = document.snapshot(); ++ let changed = Scene::sequence(document.project(), f.owner, create).lifecycle; ++ assert_ne!(geometry, changed); ++ assert!(changed.markers.is_empty()); ++ assert_ne!(before.bundle, after.bundle); ++ assert!(document.undo()); ++ assert_eq!(document.project(), &before.decoded.project); ++ assert_eq!(document.bundle(), &before.bundle); ++ assert_eq!( ++ Scene::sequence(document.project(), f.owner, create).lifecycle, ++ geometry ++ ); ++ assert!(!document.can_undo() && document.can_redo()); ++ assert!(document.redo()); ++ assert_eq!(document.project(), &after.decoded.project); ++ assert_eq!(document.bundle(), &after.bundle); ++ assert_eq!( ++ Scene::sequence(document.project(), f.owner, create).lifecycle, ++ changed ++ ); ++ assert!(!document.can_redo()); ++ } ++} ++ ++#[test] ++fn panned_header_and_create_clips_use_screen_translation_and_actual_viewport() { ++ use crate::behavior::box_text_clip; ++ use iced::Vector; ++ let header = Rectangle::new(Point::new(100., 200.), Size::new(204., 70.)); ++ let capsule = Rectangle::new(header.position(), Size::new(140., 28.)); ++ let rect = |x, y, w, h| Rectangle::new(Point::new(x, y), Size::new(w, h)); ++ for (pan, scale, viewport, header_expected, birth_expected) in [ ++ ( ++ Vector::new(37., -41.), ++ 0.5, ++ Size::new(300., 400.), ++ rect(92., 63., 92., 27.), ++ rect(91., 61., 62., 10.), ++ ), ++ ( ++ Vector::new(37., -41.), ++ 1., ++ Size::new(300., 400.), ++ rect(147., 167., 153., 54.), ++ rect(145., 163., 124., 20.), ++ ), ++ ( ++ Vector::new(37., -41.), ++ 2., ++ Size::new(300., 400.), ++ rect(257., 375., 43., 25.), ++ rect(253., 367., 47., 33.), ++ ), ++ ( ++ Vector::new(-200., -400.), ++ 2., ++ Size::new(300., 100.), ++ rect(20., 16., 280., 84.), ++ rect(16., 8., 248., 40.), ++ ), ++ ( ++ Vector::new(-237., -411.), ++ 2., ++ Size::new(300., 100.), ++ rect(0., 5., 300., 95.), ++ rect(0., 0., 227., 37.), ++ ), ++ ] { ++ assert_eq!( ++ box_text_clip(pan, header, scale, viewport), ++ Some(header_expected) ++ ); ++ assert_eq!( ++ birth_label_clip(pan, capsule, scale, viewport), ++ Some(birth_expected) ++ ); ++ } ++ for pan in [ ++ Vector::new(1000., 1000.), ++ Vector::new(-1000., -1000.), ++ Vector::new(f32::NAN, 0.), ++ Vector::new(0., f32::INFINITY), ++ ] { ++ assert_eq!(box_text_clip(pan, header, 2., Size::new(300., 100.)), None); ++ assert_eq!( ++ birth_label_clip(pan, capsule, 2., Size::new(300., 100.)), ++ None ++ ); ++ } ++} ++ ++#[test] ++fn real_scene_panned_zoomed_program_keeps_header_birth_and_death_hit_identity() { ++ use crate::{ ++ app::Message, ++ behavior::{ ++ SequenceInput, ++ scenario::{CanvasEvent, CanvasTool}, ++ }, ++ }; ++ use iced::{Vector, mouse, widget::canvas}; ++ for layer in [Layer::Oa, Layer::Sa] { ++ let mut f = Fixture::new(layer); ++ f.project.elements.get_mut(&f.receiver).unwrap().name = "界".repeat(24); ++ let create = f.message(f.owner, MessageKind::Create); ++ let delete = f.message(f.owner, MessageKind::Delete); ++ let document = f.document(); ++ let before = document.snapshot(); ++ for scale in [0.5, 1., 2.] { ++ for pan in [Vector::new(35., 40.), Vector::new(-35., -5.)] { ++ let mut scene = f.scene(); ++ scene.scale = scale; ++ scene.camera_pan = pan; ++ let context = crate::behavior::scenario::direct_tests::context(f.owner); ++ scene.interaction = Some((context, CanvasTool::Select, true)); ++ let header = scene.boxes.iter().find(|b| b.id == f.sender).unwrap(); ++ let targets = [ ++ (f.sender, header.rect.center()), ++ ( ++ create, ++ scene ++ .lifecycle ++ .markers ++ .iter() ++ .find(|m| m.event.occurrence == create) ++ .unwrap() ++ .center, ++ ), ++ ( ++ delete, ++ scene ++ .lifecycle ++ .markers ++ .iter() ++ .find(|m| m.event.occurrence == delete) ++ .unwrap() ++ .center, ++ ), ++ ]; ++ // Absolute widget origin models the outer layout/scroll translation; ++ // camera pan remains local screen units and must be subtracted once. ++ let bounds = Rectangle::new(Point::new(73., 119.), Size::new(2000., 1200.)); ++ for (expected, world) in targets { ++ let screen = ++ bounds.position() + pan + Vector::new(world.x * scale, world.y * scale); ++ assert!(bounds.contains(screen)); ++ let mut state = SequenceInput::default(); ++ let mut published = Vec::new(); ++ for event in [ ++ mouse::Event::CursorMoved { position: screen }, ++ mouse::Event::ButtonPressed(mouse::Button::Left), ++ mouse::Event::ButtonReleased(mouse::Button::Left), ++ ] { ++ if let Some(message) = canvas::Program::update( ++ &scene, ++ &mut state, ++ &canvas::Event::Mouse(event), ++ bounds, ++ mouse::Cursor::Available(screen), ++ ) ++ .and_then(|a| a.into_inner().0) ++ { ++ published.push(message); ++ } ++ } ++ assert!( ++ matches!(published.as_slice(), [Message::ScenarioCanvas(CanvasEvent::Select(actual_context, actual))] if *actual_context == context && *actual == expected), ++ "Pan/zoom must retain the typed hit identity" ++ ); ++ } ++ assert_eq!(scene.lifecycle, f.scene().lifecycle); ++ } ++ } ++ assert_eq!(document.project(), &before.decoded.project); ++ assert_eq!(document.bundle(), &before.bundle); ++ assert!(!document.can_undo() && !document.dirty()); ++ } ++} +diff --git a/crates/oa-desktop/src/behavior/scenario_lifecycle/union_tests.rs b/crates/oa-desktop/src/behavior/scenario_lifecycle/union_tests.rs +new file mode 100644 +index 0000000000000000000000000000000000000000..86fa0cceff11ff66497c3514e43659a0ca003a52 +--- /dev/null ++++ b/crates/oa-desktop/src/behavior/scenario_lifecycle/union_tests.rs +@@ -0,0 +1,489 @@ ++use super::*; ++use crate::behavior::scenario_activation::{Finish, Segment}; ++ ++fn line(scene: &Scene, id: Id) -> &crate::behavior::Line { ++ scene.lines.iter().find(|line| line.id == id).unwrap() ++} ++fn segments(scene: &Scene, call: Id) -> Vec<&Segment> { ++ scene ++ .activations ++ .iter() ++ .filter(|a| a.call == call) ++ .collect() ++} ++fn assert_visible_lifetime(scene: &Scene) { ++ for a in &scene.activations { ++ assert_eq!( ++ scene ++ .lifecycle ++ .alive_spans(a.receiver, a.scope, a.rect.y, a.rect.y + a.rect.height), ++ vec![Span { ++ start: a.rect.y, ++ end: a.rect.y + a.rect.height ++ }] ++ ); ++ if let Finish::Reply(reply) = a.finish { ++ assert_eq!(a.rect.y + a.rect.height, line(scene, reply).points[0].y); ++ } ++ } ++} ++ ++#[test] ++fn admitted_delayed_create_nested_calls_replies_delete_share_one_geometry_pipeline() { ++ for layer in [Layer::Oa, Layer::Sa] { ++ let mut f = Fixture::new(layer); ++ let birth = f.message(f.owner, MessageKind::Create); ++ let c1 = f.message(f.owner, MessageKind::Call); ++ let c2 = f.message(f.owner, MessageKind::Call); ++ let r2 = f.reply(f.owner, c2); ++ let r1 = f.reply(f.owner, c1); ++ let death = f.message(f.owner, MessageKind::Delete); ++ let scene = f.scene(); ++ assert_eq!(scene.activations.len(), 2); ++ for (call, reply, column) in [(c1, r1, 0), (c2, r2, 1)] { ++ let a = segments(&scene, call)[0]; ++ assert_eq!( ++ (a.receiver, a.scope, a.column, a.finish), ++ (f.receiver, f.owner, column, Finish::Reply(reply)) ++ ); ++ let received = *line(&scene, call).points.last().unwrap(); ++ let sent = line(&scene, reply).points[0]; ++ assert_eq!((a.rect.y, a.rect.y + a.rect.height), (received.y, sent.y)); ++ assert_eq!(received.x, sent.x); ++ assert!( ++ a.rect.y > scene.rows[&birth].1 && a.rect.y + a.rect.height < scene.rows[&death].1 ++ ); ++ } ++ assert_visible_lifetime(&scene); ++ assert!(scene.open_calls.is_empty()); ++ for event in [birth, death] { ++ assert_eq!( ++ scene.hit(Point::new(scene.lanes[&f.receiver], scene.rows[&event].1)), ++ Some(event) ++ ); ++ } ++ } ++} ++ ++#[test] ++fn admitted_death_and_incomplete_later_reply_do_not_fabricate_an_answered_execution() { ++ for layer in [Layer::Oa, Layer::Sa] { ++ let mut f = Fixture::new(layer); ++ let call = f.message(f.owner, MessageKind::Call); ++ let death = f.message(f.owner, MessageKind::Delete); ++ let reply = f.reply(f.owner, call); ++ if let SharedBody::Occurrence { ++ body: OccurrenceBody::Exchange { ++ sender, exchange, .. ++ }, ++ .. ++ } = f ++ .project ++ .elements ++ .get_mut(&reply) ++ .unwrap() ++ .shared_mut() ++ .unwrap() ++ { ++ *sender = None; ++ *exchange = None; ++ } ++ let scene = f.scene(); ++ let a = segments(&scene, call)[0]; ++ assert_eq!(a.finish, Finish::Terminated(death)); ++ assert_eq!(a.rect.y + a.rect.height, scene.rows[&death].1); ++ assert!( ++ scene.boxes.iter().any(|b| b.id == reply), ++ "The incomplete reply remains a repairable card" ++ ); ++ assert_eq!(scene.open_calls.len(), 1); ++ assert_visible_lifetime(&scene); ++ } ++} ++ ++#[test] ++fn admitted_self_lifecycle_and_self_call_keep_distinct_send_receive_rows() { ++ for layer in [Layer::Oa, Layer::Sa] { ++ let mut f = Fixture::new(layer); ++ let action = f.occurrence( ++ f.owner, ++ "Sender preparation", ++ OccurrenceBody::Action { ++ action: None, ++ lifeline: Some(f.sender), ++ }, ++ ); ++ let birth = f.message(f.owner, MessageKind::Create); ++ let call = f.message(f.owner, MessageKind::Call); ++ let reply = f.reply(f.owner, call); ++ let death = f.message(f.owner, MessageKind::Delete); ++ for event in [birth, call, reply, death] { ++ if let SharedBody::Occurrence { ++ body: ++ OccurrenceBody::Exchange { ++ sender, ++ receiver, ++ exchange, ++ .. ++ }, ++ .. ++ } = f ++ .project ++ .elements ++ .get_mut(&event) ++ .unwrap() ++ .shared_mut() ++ .unwrap() ++ { ++ *sender = Some(f.receiver); ++ *receiver = Some(f.receiver); ++ *exchange = None; ++ } ++ } ++ let scene = f.scene(); ++ let preparation = scene.boxes.iter().find(|b| b.id == action).unwrap(); ++ assert!(line(&scene, birth).label_at.y > preparation.rect.y + preparation.rect.height); ++ for event in [birth, death] { ++ let message = line(&scene, event); ++ assert_eq!(message.points[0].y, scene.rows[&event].1 - 24.); ++ assert_eq!(message.points.last().unwrap().y, scene.rows[&event].1); ++ assert_eq!( ++ scene.hit(Point::new(scene.lanes[&f.receiver], scene.rows[&event].1)), ++ Some(event) ++ ); ++ } ++ let activation = segments(&scene, call)[0]; ++ assert_eq!(activation.rect.y, scene.rows[&call].1 + 24.); ++ assert_eq!( ++ activation.rect.y, ++ line(&scene, call).points.last().unwrap().y ++ ); ++ assert_eq!( ++ activation.rect.y + activation.rect.height, ++ line(&scene, reply).points[0].y ++ ); ++ assert_eq!(activation.finish, Finish::Reply(reply)); ++ assert_visible_lifetime(&scene); ++ } ++} ++ ++#[test] ++fn admitted_unresolved_operand_keeps_unanswered_cue_without_any_visible_segment() { ++ for layer in [Layer::Oa, Layer::Sa] { ++ let mut f = Fixture::new(layer); ++ let fragment = f.fragment(f.owner, FragmentOperator::Alternative); ++ let left = f.branch(fragment); ++ f.message(left, MessageKind::Create); ++ let right = f.branch(fragment); ++ let call = f.message(right, MessageKind::Call); ++ let scene = f.scene(); ++ assert!(segments(&scene, call).is_empty()); ++ assert!( ++ intervals(&scene, f.receiver, right) ++ .iter() ++ .all(|i| i.2 == Life::Unresolved) ++ ); ++ assert_eq!(scene.open_calls.len(), 1); ++ assert!(scene.open_calls[0].y > scene.rows[&call].1); ++ assert_eq!( ++ line(&scene, call).points.last().unwrap().x, ++ scene.lanes[&f.receiver] ++ ); ++ } ++} ++ ++#[test] ++fn admitted_calls_without_sender_polylines_still_have_logical_correlation_metadata() { ++ for layer in [Layer::Oa, Layer::Sa] { ++ let mut f = Fixture::new(layer); ++ let c1 = f.message(f.owner, MessageKind::Call); ++ let c2 = f.message(f.owner, MessageKind::Call); ++ for call in [c1, c2] { ++ if let SharedBody::Occurrence { ++ body: ++ OccurrenceBody::Exchange { ++ sender, exchange, .. ++ }, ++ .. ++ } = f ++ .project ++ .elements ++ .get_mut(&call) ++ .unwrap() ++ .shared_mut() ++ .unwrap() ++ { ++ *sender = None; ++ *exchange = None; ++ } ++ } ++ let outgoing = f.occurrence( ++ f.owner, ++ "Outgoing", ++ OccurrenceBody::Exchange { ++ exchange: None, ++ sender: Some(f.receiver), ++ receiver: Some(f.sender), ++ message_kind: MessageKind::Asynchronous, ++ operation: None, ++ reply_to: None, ++ values: vec![], ++ }, ++ ); ++ f.reply(f.owner, c2); ++ f.reply(f.owner, c1); ++ let scene = f.scene(); ++ assert!(scene.boxes.iter().any(|b| b.id == c1)); ++ assert!(scene.boxes.iter().any(|b| b.id == c2)); ++ let inner = segments(&scene, c2)[0]; ++ let expected = if scene.lanes[&f.sender] > scene.lanes[&f.receiver] { ++ inner.rect.x + inner.rect.width ++ } else { ++ inner.rect.x ++ }; ++ assert_eq!(line(&scene, outgoing).points[0].x, expected); ++ } ++} ++ ++fn lifetime_rejected(f: &Fixture) { ++ assert!(validate_candidate(&f.project).is_err()); ++ assert!( ++ validation::validate(&f.project) ++ .iter() ++ .any(|issue| issue.severity == validation::Severity::Error ++ && issue.code == "lifeline_lifetime") ++ ); ++} ++ ++#[test] ++fn invalid_prebirth_call_and_postdeath_reply_remain_rejected_with_defensive_scene_clipping() { ++ for layer in [Layer::Oa, Layer::Sa] { ++ for later_birth in [false, true] { ++ let mut f = Fixture::new(layer); ++ let call = f.message(f.owner, MessageKind::Call); ++ let death = f.message(f.owner, MessageKind::Delete); ++ if later_birth { ++ f.message(f.owner, MessageKind::Create); ++ } ++ let reply = f.reply(f.owner, call); ++ lifetime_rejected(&f); ++ // Deliberately bypass Document only for defensive renderer coverage ++ // of rejected data. This is not an admitted editing workflow. ++ let scene = Scene::sequence(&f.project, f.owner, f.owner); ++ assert!( ++ scene ++ .activations ++ .iter() ++ .all(|a| a.rect.y + a.rect.height <= scene.rows[&death].1) ++ ); ++ assert!( ++ scene ++ .activations ++ .iter() ++ .all(|a| a.finish != Finish::Reply(reply)) ++ ); ++ assert_eq!(line(&scene, reply).points[0].x, scene.lanes[&f.receiver]); ++ assert!(!scene.open_calls.is_empty()); ++ assert_visible_lifetime(&scene); ++ } ++ let mut f = Fixture::new(layer); ++ let call = f.message(f.owner, MessageKind::Call); ++ let birth = f.message(f.owner, MessageKind::Create); ++ let reply = f.reply(f.owner, call); ++ lifetime_rejected(&f); ++ let scene = Scene::sequence(&f.project, f.owner, f.owner); ++ assert_eq!(segments(&scene, call)[0].rect.y, scene.rows[&birth].1); ++ assert_eq!(segments(&scene, call)[0].finish, Finish::Reply(reply)); ++ assert_eq!( ++ line(&scene, call).points.last().unwrap().x, ++ scene.lanes[&f.receiver] ++ ); ++ assert_visible_lifetime(&scene); ++ } ++} ++ ++#[test] ++fn conditional_death_then_recreate_never_revives_call_but_keeps_open_sibling() { ++ for layer in [Layer::Oa, Layer::Sa] { ++ let mut f = Fixture::new(layer); ++ f.message(f.owner, MessageKind::Create); ++ let call = f.message(f.owner, MessageKind::Call); ++ let fragment = f.fragment(f.owner, FragmentOperator::Alternative); ++ let left = f.branch(fragment); ++ let death = f.message(left, MessageKind::Delete); ++ let right = f.branch(fragment); ++ let rebirth = f.message(f.owner, MessageKind::Create); ++ let reply = f.reply(f.owner, call); ++ lifetime_rejected(&f); ++ let scene = Scene::sequence(&f.project, f.owner, f.owner); ++ let bars = segments(&scene, call); ++ assert!( ++ bars.iter() ++ .any(|a| a.scope == left && a.finish == Finish::Terminated(death)) ++ ); ++ assert!( ++ bars.iter().any(|a| a.scope == right ++ && a.rect.height == 26. ++ && a.finish == Finish::Continuation) ++ ); ++ assert!( ++ bars.iter() ++ .all(|a| a.rect.y + a.rect.height < scene.rows[&rebirth].1) ++ ); ++ assert!(!bars.iter().any(|a| a.finish == Finish::Reply(reply))); ++ assert_eq!(line(&scene, reply).points[0].x, scene.lanes[&f.receiver]); ++ assert_eq!( ++ scene.open_calls.len(), ++ 3, ++ "Terminated, open sibling and uncertain parent cues survive" ++ ); ++ assert_visible_lifetime(&scene); ++ } ++} ++ ++#[test] ++fn clipped_operand_preserves_original_nested_or_crossed_correlation_distinction() { ++ for layer in [Layer::Oa, Layer::Sa] { ++ for nested in [false, true] { ++ let mut f = Fixture::new(layer); ++ f.message(f.owner, MessageKind::Create); ++ let c1 = f.message(f.owner, MessageKind::Call); ++ let c2 = f.message(f.owner, MessageKind::Call); ++ let fragment = f.fragment(f.owner, FragmentOperator::Alternative); ++ let left = f.branch(fragment); ++ f.message(left, MessageKind::Delete); ++ let right = f.branch(fragment); ++ let outgoing = f.occurrence( ++ right, ++ "Outgoing", ++ OccurrenceBody::Exchange { ++ exchange: None, ++ sender: Some(f.receiver), ++ receiver: Some(f.sender), ++ message_kind: MessageKind::Asynchronous, ++ operation: None, ++ reply_to: None, ++ values: vec![], ++ }, ++ ); ++ let r1 = f.reply(f.owner, if nested { c2 } else { c1 }); ++ let r2 = f.reply(f.owner, if nested { c1 } else { c2 }); ++ lifetime_rejected(&f); ++ let scene = Scene::sequence(&f.project, f.owner, f.owner); ++ let send = line(&scene, outgoing).points[0]; ++ let expected = if nested { ++ let inner = segments(&scene, c2) ++ .into_iter() ++ .find(|a| a.scope == right) ++ .unwrap(); ++ if scene.lanes[&f.sender] > scene.lanes[&f.receiver] { ++ inner.rect.x + inner.rect.width ++ } else { ++ inner.rect.x ++ } ++ } else { ++ scene.lanes[&f.receiver] ++ }; ++ assert_eq!(send.x, expected); ++ for call in [c1, c2] { ++ assert!(segments(&scene, call).iter().any(|a| a.scope == right ++ && a.rect.y <= send.y ++ && send.y < a.rect.y + a.rect.height)); ++ } ++ assert!(scene.rows[&r1].1 < scene.rows[&r2].1); ++ assert_visible_lifetime(&scene); ++ } ++ } ++} ++ ++fn with_offset(id: Id, offset: f32, f: impl FnOnce() -> T) -> T { ++ struct Restore(BTreeMap); ++ impl Drop for Restore { ++ fn drop(&mut self) { ++ TEST_ROW_OFFSETS.with(|current| *current.borrow_mut() = std::mem::take(&mut self.0)); ++ } ++ } ++ let _restore = ++ Restore(TEST_ROW_OFFSETS.with(|current| current.replace(BTreeMap::from([(id, offset)])))); ++ f() ++} ++fn snapshot(scene: &Scene) -> String { ++ format!( ++ "{:?}", ++ ( ++ &scene.lifecycle, ++ &scene.activations, ++ &scene.open_calls, ++ &scene.rows, ++ &scene.sequence_bounds, ++ scene ++ .lines ++ .iter() ++ .map(|l| (l.id, &l.points, &l.label, l.label_at, l.dashed)) ++ .collect::>(), ++ scene ++ .boxes ++ .iter() ++ .map(|b| (b.id, b.rect, &b.title, &b.detail, b.marker)) ++ .collect::>(), ++ scene ++ .slots ++ .iter() ++ .map(|s| (s.slot, s.y, &s.label)) ++ .collect::>(), ++ scene.size, ++ ) ++ ) ++} ++ ++#[test] ++fn test_only_upstream_row_offsets_update_lifetime_segments_and_endpoints_without_authoring() { ++ for layer in [Layer::Oa, Layer::Sa] { ++ let mut f = Fixture::new(layer); ++ let birth = f.message(f.owner, MessageKind::Create); ++ let c1 = f.message(f.owner, MessageKind::Call); ++ let c2 = f.message(f.owner, MessageKind::Call); ++ f.reply(f.owner, c2); ++ f.reply(f.owner, c1); ++ let death = f.message(f.owner, MessageKind::Delete); ++ let document = f.document(); ++ let before = document.snapshot(); ++ let baseline = Scene::sequence(document.project(), f.owner, c1); ++ let moved = with_offset(birth, 60., || { ++ Scene::sequence(document.project(), f.owner, c1) ++ }); ++ assert_eq!(moved.rows[&birth].1, baseline.rows[&birth].1 + 60.); ++ assert_eq!(moved.rows[&death].1, baseline.rows[&death].1 + 60.); ++ for (a, b) in baseline.activations.iter().zip(&moved.activations) { ++ assert_eq!( ++ (a.call, a.receiver, a.scope, a.column, a.finish), ++ (b.call, b.receiver, b.scope, b.column, b.finish) ++ ); ++ assert_eq!( ++ b.rect, ++ Rectangle::new( ++ a.rect.position() + iced::Vector::new(0., 60.), ++ a.rect.size() ++ ) ++ ); ++ } ++ assert_eq!(baseline.activations.len(), moved.activations.len()); ++ assert_visible_lifetime(&moved); ++ let reparsed = language::parse(&language::format(document.project())).unwrap(); ++ assert_eq!(reparsed, *document.project()); ++ assert_eq!( ++ snapshot(&moved), ++ with_offset(birth, 60., || snapshot(&Scene::sequence( ++ &reparsed, f.owner, c1 ++ ))) ++ ); ++ assert_eq!( ++ snapshot(&baseline), ++ snapshot(&Scene::sequence(document.project(), f.owner, c1)) ++ ); ++ assert_eq!(document.project(), &before.decoded.project); ++ assert_eq!(document.bundle(), &before.bundle); ++ assert_eq!(document.revision(), 0); ++ assert!(!document.dirty() && !document.can_undo() && !document.can_redo()); ++ } ++} diff --git a/harness/experiments/nested-lifecycle-union-20260912/source-handoff.md b/harness/experiments/nested-lifecycle-union-20260912/source-handoff.md new file mode 100644 index 00000000..d785160f --- /dev/null +++ b/harness/experiments/nested-lifecycle-union-20260912/source-handoff.md @@ -0,0 +1,51 @@ +# Typed activation / lifecycle union handoff + +Source-only contribution by `/root/nested_call_design` for root-owned #21/comment716. Isolated worktree `.local/nested-lifecycle-union-20260912`, branch `codex/nested-lifecycle-union-956atf-20260912`, base `d61f1f38779ab70a77efcde523ae31c432aefcfd`. Root owns integration, Gitea, compiler and native acceptance. No root tracked files were edited. + +Committed source: `f6595ebf66e88ec42c37b5c1a3c014f5e52cb32d`; isolated worktree clean. Six files, 2,151 insertions and 77 deletions, mostly the published lifecycle bridge and retained renderer tests. + +## Inputs and boundary + +Read the complete `.local/nested-lifecycle-union-review-20260912.md` and actual core admission logic before implementation. Published peer source was retrieved through Gitea at `7aa007b0777aa182a99f46e90eeb9b2558f3ad2a`: behavior blob `d199096df61cacde7858ab1915f352b5c479e347`, lifecycle projection blob `6fe044890864ecf3095d0fedf590104f6121abf7`, lifecycle bridge blob `a066d9671cb60070f507d8840977e100aac89792`, render tests blob `02673f0636faacc6d51fbe38f8fa8b223e884bdc`. Root's existing test-only lifecycle projection differed only by the missing render-module declaration. The bridge was independently confirmed identical at `911f63e63ca9e35af631ae02cbf731f2b34b72a2`; its behavior blob `3f9fd97e038733ac92749b1543e9fa68cd3dda2c` was read to locate the upstream test hook, not imported wholesale. Peer `66a1f1690f778c8814bfefff7f46fe7f6bbe520e` lifetime experiment note was also read as unexecuted supporting design evidence. + +Only behavior.rs, scenario_activation.rs, scenario_lifecycle.rs and scenario_lifecycle/{render.rs,render_tests.rs,union_tests.rs} change. No WIP navigation, free-layout policy, persisted anchor schema, geometry edit transaction or upward-anchor floor is imported. + +## Integrated behavior + +The pipeline is occurrence geometry (including published 16-unit self-Create/Delete clearance), final scene height, lifecycle projection, Create/Delete endpoint alignment, typed activation clipping/columns, final Call/Reply/Asynchronous anchors. There is one activation traversal. Scenario lifetime lanes replace undifferentiated vertical guides; non-scenario guides remain unchanged. Birth/death markers and bounded capsule/header text painting come from the published renderer. The root's background-before-activation paint fix and activation-before-label hit priority remain intact. Exact lifecycle markers precede other hits; broad marker/message tolerances are compared by distance after exact shapes and labels. + +Logical Call starts and correlated Reply send times are collected from recorded model rows, using actual polylines where available. They do not come from clipped rectangles. Incomplete calls lacking sender polylines still receive logical metadata, avoiding absent-map lookups when their visible execution competes with another call. Only a visible segment whose end equals the actual reply-send y and whose exact scope/Reply ID match may supply a reply anchor. + +Visible pieces intersect only Alive intervals for their receiver and exact scope. They retain call/receiver/scope/column identity; a clipped end is `Finish::Clipped`, never a fabricated Reply. Receiver Delete gives `Finish::Terminated(delete_id)` and an unanswered cue. Cues are emitted from logical traversal independently of surviving rectangles and follow the chosen call column, so entirely invisible open paths retain their uncertainty presentation. + +Root explicitly chose the conservative conditional-death rule during this task: preserve each sibling's bars/cues and original model correlation, but stop definite parent continuation when a compatible branch may terminate the receiver execution. A later Create cannot revive that Call. The rejected `bool(any-open)` propagation can resume an old execution after conditional death/recreation. The implementation carries separate open and may-be-terminated outcomes; no model semantics/schema are changed. + +## Admission distinction + +Core `validation.rs:1766–1791` rejects a fully bound use before Create or after Delete, including potentially ordered conditional/parallel paths. Therefore fully bound Call→Delete→Reply/Create and ALT(Delete,open)→Create→Reply are **not admitted editing workflows**. Tests explicitly require `lifeline_lifetime` errors before invoking raw Scene projection defensively on those invalid models. A leading Create in the conditional-recreation defensive fixture establishes an actual alive prefix so the unaffected sibling's 26-unit open span remains a discriminating oracle. + +Ordinary Document-admitted cases separately cover valid delayed Create/nested Call/Reply/Delete, receiver death followed by an incomplete correlated Reply with no dead sender endpoint, self lifecycle plus self Call/Reply, an unresolved ALT operand with no visible activation, and incomplete calls without sender polylines. Validation is never weakened. Source review predicts admission from actual endpoint/order rules; execution is still required to confirm it. + +## Evaluators (unrun) + +All 17 published lifecycle renderer tests are retained. Adaptations are the legacy width-8 anonymous-box query to typed call/receiver segments, and the peer-only `Lane ·` title prefix expectation to root's preserved actual lane name. The existing root typed activation and pixel/hit tests remain unchanged. Published header clipping helper/painting is retained so its Unicode/wide-glyph, viewport and pan/zoom assertions remain meaningful. + +Nine new combined tests in `scenario_lifecycle/union_tests.rs`: + +1. `admitted_delayed_create_nested_calls_replies_delete_share_one_geometry_pipeline`: OA/SA exact receive/send endpoints, typed identity/depth, lifetime containment and marker hits. +2. `admitted_death_and_incomplete_later_reply_do_not_fabricate_an_answered_execution`: terminated metadata, retained repair card and unanswered cue. +3. `admitted_self_lifecycle_and_self_call_keep_distinct_send_receive_rows`: action clearance, marker receive rows, self-call lower receive start and exact reply send end. +4. `admitted_unresolved_operand_keeps_unanswered_cue_without_any_visible_segment`: wholly invisible open execution still has a cue and lane-anchored message. +5. `admitted_calls_without_sender_polylines_still_have_logical_correlation_metadata`: incomplete nested calls do not lose correlation or crash anchoring. +6. `invalid_prebirth_call_and_postdeath_reply_remain_rejected_with_defensive_scene_clipping`: explicit admission errors; no invented death-boundary Reply or revived execution; pre-birth clipping does not move the original Call receive event. +7. `conditional_death_then_recreate_never_revives_call_but_keeps_open_sibling`: rejected model, defensive terminated/open/uncertain cues, no later bar or false Reply anchor. +8. `clipped_operand_preserves_original_nested_or_crossed_correlation_distinction`: compare nested and crossed actual reply order even when the later replies cannot terminate visible pieces; nested outgoing messages use the inner bar and crossed ones fall back to the lane. +9. `test_only_upstream_row_offsets_update_lifetime_segments_and_endpoints_without_authoring`: a scoped test-only row offset before row recording changes lifecycle and complete typed segment tuples coherently; compares final polylines, labels, frames, IDs, scope/slot geometry, exact source bundle, whole Project and clean history. The hook resets on unwind and is absent in production; it is not a placement policy. + +The existing `Rendering::alive_spans` tests and new lifetime assertions cover exact scope clipping. The union retains the root headless WGPU regression for label-backplate erasure; its success on the combined source must be re-established by root. + +## Verification and remaining risk + +Executed only source inspection, installed standalone rustfmt with edition2024/skip_children=true, and Git whitespace/status checks. No Cargo, rustc, tests, native UI or Gitea mutation. The peer reports and root's earlier tests each describe their own source; no combined pass is claimed here. + +Root should review this source, run the `scenario_lifecycle`, `scenario_activation`, and atomic graphical Call/Reply tests, then the required combined desktop/strict gates. Native acceptance must inspect birth/death markers, self-event clearance, long headers/capsules at pan/zoom, and selected/unselected nested bars/shoulders. Global palette issue26, min-scale bar legibility, free editing requirements20/22 and Linux remain separate. Published lifecycle/header clipping adds actual painter ordering and hit boundaries; the full native rendering result remains a required gate. diff --git a/harness/experiments/nested-lifecycle-union-20260912/source/crates/oa-desktop/src/behavior.rs b/harness/experiments/nested-lifecycle-union-20260912/source/crates/oa-desktop/src/behavior.rs new file mode 100644 index 00000000..0a0c4df4 --- /dev/null +++ b/harness/experiments/nested-lifecycle-union-20260912/source/crates/oa-desktop/src/behavior.rs @@ -0,0 +1,3413 @@ +//! Readable behavioral projections. Selection edits the same typed records as text. +use crate::{ + app::{App, Choice, Message}, + style, + views::{action, heading, label, short}, +}; +use iced::{ + Color, Element, Fill, Point, Rectangle, Renderer, Size, Theme, mouse, + widget::{ + Action, button, + canvas::{self, Frame, Path, Stroke, Text}, + column, container, pick_list, row, scrollable, text, + }, +}; +use oa_core::*; +use std::collections::BTreeMap; +pub(crate) mod canvas_workspace; +#[cfg(test)] +mod contextual_source_tests; +pub(crate) mod creation; +mod form_session; +pub(crate) mod scenario; +mod scenario_activation; +mod scenario_lifecycle; +pub(crate) mod source_draft; +pub(crate) mod state_canvas; +pub(crate) mod state_edit; +pub(crate) mod state_menu; +pub(crate) mod state_view; +pub(crate) mod states; +pub(crate) mod topology; +// The standard on_scroll callback only reports active scrolling. This local +// wrapper reads the existing Scrollable's actual translation as well, including +// initial mount and passive size clamping. It forwards layout, input and drawing. +mod scenario_scroll { + use super::*; + use iced::advanced::{Clipboard, Layout, Shell, Widget, layout, renderer, widget}; + use iced::{Length, Vector, overlay}; + + pub(super) fn observe<'a, R: renderer::Renderer + 'a>( + context: scenario::Context, + area: scenario::ScrollArea, + process: bool, + restore: Option, + content: impl Into>, + ) -> Element<'a, Message, Theme, R> { + Element::new(Observer { + content: content.into(), + context, + area, + process, + restore, + }) + } + struct Observer<'a, R = Renderer> { + content: Element<'a, Message, Theme, R>, + context: scenario::Context, + area: scenario::ScrollArea, + process: bool, + restore: Option, + } + type Report = Option<(bool, Id, Id, Vector)>; + struct ObservedScroll { + identity: (Id, Id), + report: Report, + restored: Option, + } + #[derive(Default)] + struct Translation(Option); + impl widget::Operation for Translation { + fn traverse(&mut self, _: &mut dyn FnMut(&mut dyn widget::Operation)) {} + fn scrollable( + &mut self, + _: Option<&widget::Id>, + _: Rectangle, + _: Rectangle, + translation: Vector, + _: &mut dyn widget::operation::Scrollable, + ) { + self.0 = Some(translation); + } + } + struct RestoreTranslation { + offset: Vector, + applied: bool, + } + impl widget::Operation for RestoreTranslation { + // Restore only this wrapper's root Scrollable, never its nested canvas. + fn traverse(&mut self, _: &mut dyn FnMut(&mut dyn widget::Operation)) {} + fn scrollable( + &mut self, + _: Option<&widget::Id>, + _: Rectangle, + _: Rectangle, + _: Vector, + state: &mut dyn widget::operation::Scrollable, + ) { + state.scroll_to(widget::operation::scrollable::AbsoluteOffset { + x: Some(self.offset.x), + y: Some(self.offset.y), + }); + self.applied = true; + } + } + impl Observer<'_, R> { + fn report( + &mut self, + tree: &mut widget::Tree, + layout: Layout<'_>, + renderer: &R, + shell: &mut Shell<'_, Message>, + ) { + let restore = self.restore.filter(|request| { + !self.process + && (request.document, request.owner) + == (self.context.document, self.context.scenario) + && tree.state.downcast_ref::().restored != Some(request.token) + }); + let receipt = restore.and_then(|request| { + let mut operation = RestoreTranslation { + offset: request.offset, + applied: false, + }; + self.content.as_widget_mut().operate( + &mut tree.children[0], + layout, + renderer, + &mut operation, + ); + operation.applied.then_some(request.token) + }); + let mut offset = Translation::default(); + self.content.as_widget_mut().operate( + &mut tree.children[0], + layout, + renderer, + &mut offset, + ); + if let Some(offset) = offset.0 { + let next = Some(( + self.process, + self.context.document, + self.context.scenario, + offset, + )); + let state = tree.state.downcast_mut::(); + if let Some(token) = receipt { + state.restored = Some(token); + state.report = next; + shell.publish(Message::ScenarioCanvas(scenario::CanvasEvent::Restored( + self.context, + token, + self.area, + offset, + ))); + return; + } + let previous = &mut state.report; + if *previous != next { + *previous = next; + shell.publish(if self.process { + Message::TopologyCanvas(topology::CanvasEvent::Scrolled( + topology::Context { + document: self.context.document, + owner: self.context.scenario, + revision: self.context.revision, + epoch: self.context.epoch, + }, + self.area, + offset, + )) + } else { + Message::ScenarioCanvas(scenario::CanvasEvent::Scrolled( + self.context, + self.area, + offset, + )) + }); + } + } + } + } + impl Widget for Observer<'_, R> { + fn tag(&self) -> widget::tree::Tag { + widget::tree::Tag::of::() + } + fn state(&self) -> widget::tree::State { + widget::tree::State::new(ObservedScroll { + identity: (self.context.document, self.context.scenario), + report: None, + restored: None, + }) + } + fn children(&self) -> Vec { + vec![widget::Tree::new(self.content.as_widget())] + } + fn diff(&self, tree: &mut widget::Tree) { + if tree.state.downcast_ref::().identity + != (self.context.document, self.context.scenario) + { + // A new owner/document needs fresh real scroll state, not merely + // cleared mirrored offsets. Edits and tool/form changes retain it. + tree.state = self.state(); + tree.children = self.children(); + } else { + tree.diff_children(std::slice::from_ref(&self.content)); + } + } + fn size(&self) -> Size { + self.content.as_widget().size() + } + fn size_hint(&self) -> Size { + self.content.as_widget().size_hint() + } + fn layout( + &mut self, + tree: &mut widget::Tree, + renderer: &R, + limits: &layout::Limits, + ) -> layout::Node { + self.content + .as_widget_mut() + .layout(&mut tree.children[0], renderer, limits) + } + fn update( + &mut self, + tree: &mut widget::Tree, + event: &iced::Event, + layout: Layout<'_>, + cursor: mouse::Cursor, + renderer: &R, + clipboard: &mut dyn Clipboard, + shell: &mut Shell<'_, Message>, + viewport: &Rectangle, + ) { + // A passive clamp notification precedes any pointer result produced + // with the old context; App rejects that result after the epoch bump. + self.report(tree, layout, renderer, shell); + self.content.as_widget_mut().update( + &mut tree.children[0], + event, + layout, + cursor, + renderer, + clipboard, + shell, + viewport, + ); + self.report(tree, layout, renderer, shell); + } + fn draw( + &self, + tree: &widget::Tree, + renderer: &mut R, + theme: &Theme, + style: &renderer::Style, + layout: Layout<'_>, + cursor: mouse::Cursor, + viewport: &Rectangle, + ) { + self.content.as_widget().draw( + &tree.children[0], + renderer, + theme, + style, + layout, + cursor, + viewport, + ); + } + fn operate( + &mut self, + tree: &mut widget::Tree, + layout: Layout<'_>, + renderer: &R, + operation: &mut dyn widget::Operation, + ) { + self.content.as_widget_mut().operate( + &mut tree.children[0], + layout, + renderer, + operation, + ); + } + fn mouse_interaction( + &self, + tree: &widget::Tree, + layout: Layout<'_>, + cursor: mouse::Cursor, + viewport: &Rectangle, + renderer: &R, + ) -> mouse::Interaction { + self.content.as_widget().mouse_interaction( + &tree.children[0], + layout, + cursor, + viewport, + renderer, + ) + } + fn overlay<'b>( + &'b mut self, + tree: &'b mut widget::Tree, + layout: Layout<'b>, + renderer: &R, + viewport: &Rectangle, + translation: Vector, + ) -> Option> { + self.content.as_widget_mut().overlay( + &mut tree.children[0], + layout, + renderer, + viewport, + translation, + ) + } + } + // Iced exposes its null renderer only in debug builds. + #[cfg(all(test, debug_assertions))] + mod tests { + use super::*; + fn observer(height: f32, context: scenario::Context) -> Observer<'static, ()> { + Observer { + context, + area: scenario::ScrollArea::Page, + process: false, + restore: None, + content: scrollable(iced::widget::Space::new().width(200.).height(height)) + .id("observer-test") + .width(200.) + .height(200.) + .into(), + } + } + fn update( + observer: &mut Observer<'_, ()>, + tree: &mut widget::Tree, + event: iced::Event, + ) -> (Vec, bool) { + let node = observer.layout( + tree, + &(), + &layout::Limits::new(Size::ZERO, Size::new(800., 700.)), + ); + let mut messages = vec![]; + let mut shell = Shell::new(&mut messages); + observer.update( + tree, + &event, + Layout::new(&node), + mouse::Cursor::Available(Point::new(50., 50.)), + &(), + &mut iced::advanced::clipboard::Null, + &mut shell, + &Rectangle::with_size(Size::new(800., 700.)), + ); + let captured = shell.is_event_captured(); + (messages, captured) + } + fn offsets(messages: &[Message]) -> Vec { + messages + .iter() + .filter_map(|message| { + if let Message::ScenarioCanvas(scenario::CanvasEvent::Scrolled(_, _, offset)) = + message + { + Some(*offset) + } else { + None + } + }) + .collect() + } + fn actual_offset(view: &mut Observer<'_, ()>, tree: &mut widget::Tree) -> Vector { + let node = view.layout( + tree, + &(), + &layout::Limits::new(Size::ZERO, Size::new(800., 700.)), + ); + let mut operation = Translation::default(); + view.operate(tree, Layout::new(&node), &(), &mut operation); + operation.0.unwrap() + } + #[test] + fn direct_scenario_caller_restores_mounted_scroll_once_with_clamping_and_app_receipt() { + use scenario::{ + CanvasEvent, ScrollArea, + direct_tests::{navigation_event, navigation_fixture}, + }; + let redraw = || { + iced::Event::Window(iced::window::Event::RedrawRequested( + std::time::Instant::now(), + )) + }; + let area = ScrollArea::Page; + for returned_height in [600., 250.] { + let (project, [a, _, _], [use_id, _, _]) = navigation_fixture(); + let mut app = App::with_project(project.clone()); + let _ = app.update(Message::Select(a)); + let _ = app.update(Message::Page(crate::app::Page::Behavior)); + let source = app.document.bundle().clone(); + let mut view = observer(600., app.scenario_context().unwrap()); + view.area = area; + let mut tree = widget::Tree::new(&view as &dyn Widget); + for message in update(&mut view, &mut tree, redraw()).0 { + let _ = app.update(message); + } + for message in update( + &mut view, + &mut tree, + iced::Event::Mouse(mouse::Event::WheelScrolled { + delta: mouse::ScrollDelta::Pixels { x: 0., y: -180. }, + }), + ) + .0 + { + let _ = app.update(message); + } + assert_eq!(actual_offset(&mut view, &mut tree), Vector::new(0., 180.)); + navigation_event(&mut app, |ctx| CanvasEvent::OpenUse(ctx, use_id)); + view = observer(600., app.scenario_context().unwrap()); + view.area = area; + view.diff(&mut tree); + for message in update(&mut view, &mut tree, redraw()).0 { + let _ = app.update(message); + } + assert_eq!(actual_offset(&mut view, &mut tree), Vector::ZERO); + navigation_event(&mut app, CanvasEvent::Back); + assert_eq!(app.selected, use_id); + let context = app.scenario_context().unwrap(); + let request = app.behavior.scenario.scroll_restore(context, area).unwrap(); + view = observer(returned_height, context); + view.area = area; + view.restore = Some(request); + view.diff(&mut tree); + let expected = Vector::new(0., (returned_height - 200.).min(180.)); + let messages = update(&mut view, &mut tree, redraw()).0; + assert!( + matches!(messages.as_slice(), [Message::ScenarioCanvas(CanvasEvent::Restored(_, _, _, actual))] if *actual == expected) + ); + assert_eq!(actual_offset(&mut view, &mut tree), expected); + for message in messages { + let _ = app.update(message); + } + assert!( + app.behavior + .scenario + .scroll_restore(app.scenario_context().unwrap(), area) + .is_none() + ); + // A delayed receipt leaves the same request in the view; later input must not snap back. + for message in update( + &mut view, + &mut tree, + iced::Event::Mouse(mouse::Event::WheelScrolled { + delta: mouse::ScrollDelta::Pixels { x: 0., y: 20. }, + }), + ) + .0 + { + let _ = app.update(message); + } + let moved = expected - Vector::new(0., 20.); + assert_eq!(actual_offset(&mut view, &mut tree), moved); + view.context = app.scenario_context().unwrap(); + view.diff(&mut tree); + assert!(update(&mut view, &mut tree, redraw()).0.is_empty()); + assert_eq!(actual_offset(&mut view, &mut tree), moved); + navigation_event(&mut app, |ctx| { + CanvasEvent::Restored(ctx, request.token, area, Vector::new(0., 999.)) + }); + let late_context = app.scenario_context().unwrap(); + let _ = app.update(Message::Page(crate::app::Page::Diagram)); + let epoch = app.canvas_epoch; + let _ = app.update(Message::ScenarioCanvas(CanvasEvent::Restored( + late_context, + request.token, + area, + Vector::ZERO, + ))); + assert_eq!(app.canvas_epoch, epoch); + assert_eq!(app.project(), &project); + assert_eq!(app.document.bundle(), &source); + assert!(!app.document.can_undo()); + } + } + #[test] + fn direct_scenario_restore_cannot_scroll_another_document_owner_or_process_view() { + for mismatch in 0..3 { + let context = scenario::direct_tests::context(Id::new_v4()); + let mut request = scenario::ScrollRestore { + document: context.document, + owner: context.scenario, + token: Id::new_v4(), + offset: Vector::new(0., 180.), + }; + match mismatch { + 0 => request.document = Id::new_v4(), + 1 => request.owner = Id::new_v4(), + _ => {} + } + let mut view = observer(600., context); + view.process = mismatch == 2; + view.restore = Some(request); + let mut tree = widget::Tree::new(&view as &dyn Widget); + let messages = update( + &mut view, + &mut tree, + iced::Event::Window(iced::window::Event::RedrawRequested( + std::time::Instant::now(), + )), + ) + .0; + assert_eq!(actual_offset(&mut view, &mut tree), Vector::ZERO); + assert!(!messages.iter().any(|m| matches!( + m, + Message::ScenarioCanvas(scenario::CanvasEvent::Restored(..)) + ))); + } + } + #[test] + fn independent_process_owner_change_resets_actual_scroll_offsets() { + let context = scenario::direct_tests::context(Id::new_v4()); + let redraw = || { + iced::Event::Window(iced::window::Event::RedrawRequested( + std::time::Instant::now(), + )) + }; + let process_offsets = |messages: Vec| { + messages + .into_iter() + .filter_map(|message| { + if let Message::TopologyCanvas(topology::CanvasEvent::Scrolled( + _, + _, + offset, + )) = message + { + Some(offset) + } else { + None + } + }) + .collect::>() + }; + let mut view = observer(600., context); + view.process = true; + let mut tree = widget::Tree::new(&view as &dyn Widget); + assert_eq!( + process_offsets(update(&mut view, &mut tree, redraw()).0), + vec![Vector::ZERO] + ); + let (messages, captured) = update( + &mut view, + &mut tree, + iced::Event::Mouse(mouse::Event::WheelScrolled { + delta: mouse::ScrollDelta::Pixels { x: 0., y: -180. }, + }), + ); + assert!(captured); + assert_eq!(process_offsets(messages), vec![Vector::new(0., 180.)]); + let mut other = context; + other.scenario = Id::new_v4(); + let mut state = topology::State::default(); + state.enter(context.document, context.scenario); + state.scrolled(scenario::ScrollArea::Page, Vector::new(0., 180.)); + state.enter(other.document, other.scenario); + assert_eq!(state.details_offset(), Vector::ZERO); + view = observer(600., other); + view.process = true; + view.diff(&mut tree); + let reported = process_offsets(update(&mut view, &mut tree, redraw()).0); + assert_eq!( + reported, + vec![Vector::ZERO], + "The new process immediately reacquires its predecessor's scroll offset" + ); + } + + #[test] + fn direct_scroll_mounted_identity_resets_navigation_but_preserves_edits_before_first_report() + { + use widget::operation::scrollable::{AbsoluteOffset, scroll_to}; + for process in [false, true] { + let area = scenario::ScrollArea::Page; + for change in 0..4 { + let context = scenario::direct_tests::context(Id::new_v4()); + let mut view = observer(600., context); + view.process = process; + view.area = area; + let mut tree = widget::Tree::new(&view as &dyn Widget); + let node = view.layout( + &mut tree, + &(), + &layout::Limits::new(Size::ZERO, Size::new(800., 700.)), + ); + // Model a programmatic reveal before the observer has reported. + // Mounted identity must not depend on its last scroll notification. + let mut operation = scroll_to::<()>( + widget::Id::new("observer-test"), + AbsoluteOffset { + x: None, + y: Some(180.), + }, + ); + view.operate(&mut tree, Layout::new(&node), &(), &mut operation); + let mut next = context; + match change { + 0 => next.scenario = Id::new_v4(), + 1 => next.document = Id::new_v4(), + 2 => { + next.revision += 1; + next.epoch += 5; + } + _ => {} + } + view = observer(if change == 3 { 800. } else { 600. }, next); + view.process = process; + view.area = area; + view.diff(&mut tree); + let redraw = || { + iced::Event::Window(iced::window::Event::RedrawRequested( + std::time::Instant::now(), + )) + }; + let (messages, _) = update(&mut view, &mut tree, redraw()); + let actual = messages + .into_iter() + .filter_map(|message| match message { + Message::TopologyCanvas(topology::CanvasEvent::Scrolled( + c, + reported_area, + offset, + )) => { + assert_eq!( + (c.document, c.owner, c.revision, c.epoch), + (next.document, next.scenario, next.revision, next.epoch) + ); + assert_eq!( + std::mem::discriminant(&reported_area), + std::mem::discriminant(&area) + ); + Some(offset) + } + Message::ScenarioCanvas(scenario::CanvasEvent::Scrolled( + c, + reported_area, + offset, + )) => { + assert_eq!(c, next); + assert_eq!( + std::mem::discriminant(&reported_area), + std::mem::discriminant(&area) + ); + Some(offset) + } + _ => None, + }) + .collect::>(); + assert_eq!( + actual, + vec![if change < 2 { + Vector::ZERO + } else { + Vector::new(0., 180.) + }], + "process={process} area={area:?} change={change}" + ); + assert!(update(&mut view, &mut tree, redraw()).0.is_empty()); + } + } + } + + #[test] + fn direct_scroll_observer_reports_actual_initial_clamped_and_remounted_offsets_once() { + let context = scenario::direct_tests::context(Id::new_v4()); + let redraw = || { + iced::Event::Window(iced::window::Event::RedrawRequested( + std::time::Instant::now(), + )) + }; + let mut view = observer(600., context); + let mut tree = widget::Tree::new(&view as &dyn Widget); + assert_eq!( + offsets(&update(&mut view, &mut tree, redraw()).0), + vec![Vector::ZERO] + ); + assert!(update(&mut view, &mut tree, redraw()).0.is_empty()); + let (messages, captured) = update( + &mut view, + &mut tree, + iced::Event::Mouse(mouse::Event::WheelScrolled { + delta: mouse::ScrollDelta::Pixels { x: 0., y: -180. }, + }), + ); + assert!(captured, "the observer forwards normal Scrollable capture"); + assert_eq!(offsets(&messages), vec![Vector::new(0., 180.)]); + assert!(update(&mut view, &mut tree, redraw()).0.is_empty()); + view = observer(250., context); + view.diff(&mut tree); + assert_eq!( + offsets(&update(&mut view, &mut tree, redraw()).0), + vec![Vector::new(0., 50.)] + ); + assert!(update(&mut view, &mut tree, redraw()).0.is_empty()); + view = observer(600., context); + view.diff(&mut tree); + assert_eq!( + offsets(&update(&mut view, &mut tree, redraw()).0), + vec![Vector::new(0., 180.)] + ); + let mut remounted = widget::Tree::new(&view as &dyn Widget); + assert_eq!( + offsets(&update(&mut view, &mut remounted, redraw()).0), + vec![Vector::ZERO] + ); + assert!(update(&mut view, &mut remounted, redraw()).0.is_empty()); + } + } +} +#[derive(Debug, Clone)] +pub enum Event { + Creation(creation::Event), + Topology(topology::Event), + Scenario(scenario::Event), + States(states::Event), + Submit, +} +impl Event { + pub fn is_source_back(&self) -> bool { + matches!( + self, + Self::Creation(creation::Event::Source(source_draft::Event::Edit( + _, + source_draft::Edit::Back + ))) | Self::Scenario(scenario::Event::Source(source_draft::Event::Edit( + _, + source_draft::Edit::Back + ))) | Self::Topology(topology::Event::Source(source_draft::Event::Edit( + _, + source_draft::Edit::Back + ))) + ) + } + pub fn is_source(&self) -> bool { + matches!( + self, + Self::Creation(creation::Event::Source(_)) + | Self::Scenario(scenario::Event::Source(_)) + | Self::Topology(topology::Event::Source(_)) + ) + } + pub fn starts_form(&self) -> bool { + matches!( + self, + Self::Creation(creation::Event::Open(..)) + | Self::Topology(topology::Event::Start(..)) + | Self::Scenario(scenario::Event::Start(..)) + | Self::States(states::Event::Start(..) | states::Event::Edit(..)) + ) + } + pub fn is_submit(&self) -> bool { + matches!( + self, + Self::Submit + | Self::Creation(creation::Event::Submit) + | Self::Topology(topology::Event::Submit) + | Self::Scenario(scenario::Event::Submit) + | Self::States(states::Event::Submit) + ) + } +} +#[derive(Default)] +pub struct State { + pub(crate) creation: creation::State, + pub active_owner: Option, + pub diagram: state_view::State, + pub(crate) topology: topology::State, + pub(crate) scenario: scenario::State, + states: states::State, +} +const PENDING_DRAFT: &str = "Apply or cancel the current behavior form before starting another."; +#[derive(serde::Serialize, serde::Deserialize)] +#[serde(deny_unknown_fields)] +struct RecoveryDraft { + version: u32, + kind: RecoveryKind, + draft: serde_json::Value, +} +#[derive(serde::Serialize, serde::Deserialize)] +enum RecoveryKind { + Creation, + State, + Scenario, + Process, +} +impl State { + /// Capture only the pending authored form. Pointer gestures, cached choices, + /// viewport geometry and document/revision tokens never cross a restart. + pub fn recovery_snapshot(&self) -> Result, String> { + let drafts = [ + (RecoveryKind::Creation, self.creation.recovery_snapshot()?), + (RecoveryKind::State, self.states.recovery_snapshot()?), + (RecoveryKind::Scenario, self.scenario.recovery_snapshot()?), + (RecoveryKind::Process, self.topology.recovery_snapshot()?), + ]; + let mut drafts = drafts.into_iter().filter_map(|(kind, draft)| { + draft.map(|draft| RecoveryDraft { + version: 1, + kind, + draft, + }) + }); + let first = drafts.next(); + if drafts.next().is_some() { + return Err( + "Several behavior forms are pending; recovery cannot choose one to discard.".into(), + ); + } + first + .map(serde_json::to_value) + .transpose() + .map_err(|e| e.to_string()) + } + + /// Restore raw fields without planning/executing them. Rejected values and + /// incomplete endpoints must remain available for repair after a crash. + pub fn restore_recovery(&mut self, value: serde_json::Value) -> Result<(), String> { + let saved: RecoveryDraft = serde_json::from_value(value).map_err(|e| e.to_string())?; + if saved.version != 1 { + return Err(format!( + "Unsupported behavior recovery version {}", + saved.version + )); + } + let mut restored = Self::default(); + match saved.kind { + RecoveryKind::Creation => { + restored.creation = creation::State::from_recovery(saved.draft)? + } + RecoveryKind::State => restored.states = states::State::from_recovery(saved.draft)?, + RecoveryKind::Scenario => { + restored.scenario = scenario::State::from_recovery(saved.draft)? + } + RecoveryKind::Process => { + restored.topology = topology::State::from_recovery(saved.draft)? + } + } + restored.active_owner = restored.pending_owner(); + *self = restored; + Ok(()) + } + + pub fn has_pending(&self) -> bool { + self.creation.has_pending() || self.pending_owner().is_some() + } + + pub fn pending_owner(&self) -> Option { + self.topology + .pending_owner() + .or_else(|| self.scenario.pending_owner()) + .or_else(|| self.states.pending_owner()) + } + + /// Prepare the active form without discarding inputs. The caller must execute + /// this exact command and acknowledge only a successful document transaction. + pub fn prepare_pending(&self, p: &Project) -> Result, String> { + if self.creation.has_pending() { + self.creation.prepare_pending(p).map(Some) + } else if self.topology.pending_owner().is_some() { + self.topology.prepare_pending(p).map(Some) + } else if self.scenario.pending_owner().is_some() { + self.scenario.prepare_pending(p).map(Some) + } else if self.states.pending_owner().is_some() { + self.states.prepare_pending(p).map(Some) + } else { + Ok(None) + } + } + + /// Clear the active form after its prepared command commits successfully. + /// Rejected commands must leave the form available for repair and retry. + pub fn source_active(&self) -> bool { + self.creation.source_active() + || self.scenario.source_active() + || self.topology.source_active() + } + pub fn source_open(&self) -> bool { + self.creation.source_open() || self.scenario.source_open() || self.topology.source_open() + } + pub fn source_back(&mut self) -> bool { + self.creation.source_back() || self.scenario.source_back() || self.topology.source_back() + } + + pub fn acknowledge_commit(&mut self) { + self.creation.acknowledge_commit(); + self.topology.acknowledge_commit(); + self.scenario.acknowledge_commit(); + self.states.acknowledge_commit(); + } + + pub fn update(&mut self, p: &Project, event: Event) -> Result, String> { + if self.has_pending() + && matches!( + &event, + Event::Creation(creation::Event::Open(..)) + | Event::Topology(topology::Event::Start(..)) + | Event::Scenario(scenario::Event::Start(..)) + | Event::States(states::Event::Start(..) | states::Event::Edit(..)) + ) + { + return Err(PENDING_DRAFT.into()); + } + let cancels_pending = match &event { + Event::Topology(topology::Event::Cancel) => self.topology.pending_owner().is_some(), + Event::Scenario(scenario::Event::Cancel) => self.scenario.pending_owner().is_some(), + Event::States(states::Event::Cancel) => self.states.pending_owner().is_some(), + _ => false, + }; + if cancels_pending { + self.acknowledge_commit(); + return Ok(None); + } + match event { + Event::Creation(event) => self.creation.update(p, event), + Event::Topology(event) => self.topology.update(p, event), + Event::Scenario(event) => self.scenario.update(p, event), + Event::States(event) => self.states.update(p, event), + Event::Submit => self + .prepare_pending(p)? + .map(Some) + .ok_or_else(|| "Choose a behavior modeling tool.".into()), + } + } +} + +pub fn view(app: &App) -> Element<'_, Message> { + let p = app.project(); + if let Some(card) = app.behavior.creation.view(p) { + return card.map(|event| Message::Behavior(Event::Creation(event))); + } + if let Some(owner) = app.behavior.pending_owner() { + let kind = p.elements.get(&owner).map(oa_core::Element::kind); + let unavailable = p.layer_of(owner) != Some(app.layer) + || (app.behavior.scenario.pending_owner().is_some() && kind != Some(Kind::Scenario)) + || (app.behavior.topology.pending_owner().is_some() + && !matches!(kind, Some(Kind::Process | Kind::FunctionalChain))); + if unavailable { + let mut out=column![text("The pending behavior owner is unavailable").size(20),text("Your inputs are retained. Return from the source form or cancel this parent draft before choosing another behavior.").size(13)].spacing(12); + if let Some(name) = app + .behavior + .scenario + .pending_name() + .or_else(|| app.behavior.topology.pending_name()) + { + out = + out.push(text(format!("Pending consumer name: {}", short(name, 80))).size(14)); + } + if let Some(child) = app.behavior.scenario.source_view(p) { + out = out.push(child.map(|e| Message::Behavior(Event::Scenario(e)))); + } else if let Some(child) = app.behavior.topology.source_view(p) { + out = out.push(child.map(|e| Message::Behavior(Event::Topology(e)))); + } else { + let cancel = if app.behavior.scenario.pending_owner().is_some() { + Event::Scenario(scenario::Event::Cancel) + } else if app.behavior.topology.pending_owner().is_some() { + Event::Topology(topology::Event::Cancel) + } else { + Event::States(states::Event::Cancel) + }; + out = out.push(button("Cancel retained draft").on_press(Message::Behavior(cancel))); + } + return container(out).padding(16).width(Fill).height(Fill).into(); + } + } + let choices = p + .elements + .values() + .filter(|e| { + e.layer() == app.layer && (e.kind().is_sequence() || e.kind() == Kind::StateMachine) + }) + .map(|e| Choice { + id: e.id, + label: format!("{} · {}", e.kind(), e.name), + }) + .collect::>(); + let owner = selected_owner(app); + let selected = owner + .and_then(|id| choices.iter().find(|c| c.id == id)) + .or(choices.first()) + .cloned(); + let mut out = column![heading("Behavior & scenarios", "Follow exchanges and operating conditions. Select a message, state or transition to edit it.")].spacing(14); + let Some(selected) = selected else { + return out + .push(label( + "Start a named process, scenario or state machine, then model its behavior here.", + )) + .push(action( + "New", + Message::Behavior(Event::Creation(creation::Event::Open(app.layer))), + )) + .padding(24) + .into(); + }; + let e = &p.elements[&selected.id]; + let compact_canvas = matches!( + e.kind(), + Kind::Process | Kind::FunctionalChain | Kind::Scenario + ); + if e.kind() == Kind::StateMachine { + out = column![text("States & modes").size(20)].spacing(8); + } else if compact_canvas { + // The process/scenario canvas owns its compact remaining-height layout. + out = column![].spacing(6); + } + out = out.push( + row![ + pick_list(choices, Some(selected), Message::BehaviorOwner) + .width(Fill) + .text_size(13) + .padding(if compact_canvas { 6 } else { 10 }), + action( + "New", + Message::Behavior(Event::Creation(creation::Event::Open(app.layer))) + ) + ] + .spacing(8), + ); + if matches!(e.kind(), Kind::Process | Kind::FunctionalChain) { + return topology::view(app, e.id, out); + } + if e.kind() == Kind::Scenario { + return scenario::view(app, e.id, out); + } + state_view::view(app, e.id, out) +} + +pub fn selected_owner(app: &App) -> Option { + let valid = |id: &Id| { + app.project().elements.get(id).is_some_and(|e| { + e.layer() == app.layer && (e.kind().is_sequence() || e.kind() == Kind::StateMachine) + }) + }; + app.behavior + .pending_owner() + .or(app.behavior.active_owner.filter(valid)) + .or_else(|| selected_behavior(app.project(), app.selected).filter(valid)) + .or_else(|| app.project().elements.keys().find(|id| valid(id)).copied()) +} +/// Mirror the core's legacy-versus-explicit process interpretation. Existing +/// exchange-only lists still describe ordered paths until explicitly migrated. +fn uses_explicit_topology(p: &Project, owner: Id) -> bool { + let Some(e) = p.elements.get(&owner) else { + return false; + }; + if !matches!(e.kind(), Kind::Process | Kind::FunctionalChain) { + return false; + } + p.relations.values().any(|r| { + r.kind() == RelationKind::SequenceLink + && p.elements.get(&r.source()).and_then(|e| e.parent) == Some(owner) + && p.elements.get(&r.target()).and_then(|e| e.parent) == Some(owner) + }) || e.steps().into_iter().flatten().any(|id| { + matches!( + p.elements.get(id).and_then(|e| e.shared()), + Some(SharedBody::Occurrence { + body: OccurrenceBody::Action { .. } + | OccurrenceBody::Control { .. } + | OccurrenceBody::SequenceReference { .. }, + .. + }) + ) + }) +} +pub fn selected_behavior(p: &Project, selected: Id) -> Option { + if let Some(Relation { + body: RelationBody::ContextualLink { owner, .. }, + .. + }) = p.relations.get(&selected) + { + return p + .elements + .get(owner) + .filter(|e| matches!(e.kind(), Kind::Process | Kind::FunctionalChain)) + .map(|e| e.id); + } + let mut current = Some( + p.relations + .get(&selected) + .filter(|r| { + matches!( + r.kind(), + RelationKind::StateTransition + | RelationKind::SequenceLink + | RelationKind::StateAction + ) + }) + .map(|r| r.source()) + .unwrap_or(selected), + ); + while let Some(id) = current { + let e = p.elements.get(&id)?; + if e.kind().is_sequence() || e.kind() == Kind::StateMachine { + return Some(id); + } + current = e.parent; + } + None +} +fn in_machine(p: &Project, id: Id, machine: Id) -> bool { + let mut current = Some(id); + while let Some(id) = current { + if id == machine { + return true; + } + current = p.elements.get(&id).and_then(|e| e.parent); + } + false +} + +struct BoxItem { + id: Id, + rect: Rectangle, + title: String, + detail: String, + marker: Option, +} +fn box_text_clip( + pan: iced::Vector, + rect: Rectangle, + scale: f32, + viewport: Size, +) -> Option { + if !pan.x.is_finite() + || !pan.y.is_finite() + || !scale.is_finite() + || scale <= 0. + || rect.width <= 20. + || rect.height <= 16. + { + return None; + } + Rectangle::new( + Point::new( + pan.x + (rect.x + 10.) * scale, + pan.y + (rect.y + 8.) * scale, + ), + Size::new((rect.width - 20.) * scale, (rect.height - 16.) * scale), + ) + .intersection(&Rectangle::new(Point::ORIGIN, viewport)) +} + +struct Line { + id: Id, + points: Vec, + label: String, + label_at: Point, + dashed: bool, +} +struct Scene { + boxes: Vec, + lines: Vec, + size: Size, + selected: Id, + scale: f32, + camera_pan: iced::Vector, + interaction: Option<(scenario::Context, scenario::CanvasTool, bool)>, + pending_placement: Option<(scenario::Slot, Option)>, + lanes: BTreeMap, + slots: Vec, + rows: BTreeMap, + activations: Vec, + lifecycle: scenario_lifecycle::render::Rendering, + open_calls: Vec, + sequence_bounds: BTreeMap, +} +struct SequenceSlot { + slot: scenario::Slot, + y: f32, + label: String, +} +#[derive(Default)] +struct SequenceInput { + context: Option, + tool: scenario::CanvasTool, + pointer: Option, + bounds: Option, + source: Option<(Id, scenario::Slot)>, + press: Option, +} +#[derive(Clone, Copy)] +enum SequencePress { + Occurrence { + tool: scenario::Tool, + slot: scenario::Slot, + lifeline: Option, + }, + Message { + source: Id, + slot: scenario::Slot, + start: Point, + first: bool, + moved: bool, + }, + Reorder { + occurrence: Id, + parent: Id, + start: Point, + moved: bool, + }, +} +impl SequenceInput { + fn cancel(&mut self) { + self.source = None; + self.press = None; + } +} +impl Scene { + fn removal_target(&self, owner: Id, id: Id) -> bool { + id != owner + && (self.boxes.iter().any(|item| item.id == id) + || self.lines.iter().any(|item| item.id == id)) + } + fn sequence(p: &Project, owner: Id, selected: Id) -> Self { + let mut scene = Self { + scale: 1., + camera_pan: iced::Vector::ZERO, + boxes: vec![], + lines: vec![], + size: Size::new(700., 200.), + selected, + interaction: None, + pending_placement: None, + lanes: BTreeMap::new(), + slots: vec![], + rows: BTreeMap::new(), + activations: vec![], + lifecycle: scenario_lifecycle::render::Rendering::default(), + open_calls: vec![], + sequence_bounds: BTreeMap::new(), + }; + let mut lanes = p + .children(owner) + .filter(|e| e.kind() == Kind::Lifeline) + .map(|e| { + ( + e.id, + e.name.clone(), + match e.shared() { + Some(SharedBody::Lifeline { + represented: Some(id), + }) => p.named(*id).to_owned(), + _ => "Unassigned participant".into(), + }, + ) + }) + .collect::>(); + let scenario = p.elements[&owner].kind() == Kind::Scenario; + if !scenario { + fn endpoints(p: &Project, steps: &[Id], ids: &mut Vec) { + for id in steps { + if let Some(SharedBody::Occurrence { body, .. }) = + p.elements.get(id).and_then(|e| e.shared()) + { + match body { + OccurrenceBody::Exchange { + exchange: Some(id), .. + } => { + if let Some(r) = p.relations.get(id) { + for endpoint in [r.source(), r.target()] { + if !ids.contains(&endpoint) { + ids.push(endpoint); + } + } + } + } + OccurrenceBody::Fragment { branches, .. } => { + endpoints(p, branches, ids) + } + OccurrenceBody::Branch { occurrences, .. } => { + endpoints(p, occurrences, ids) + } + _ => {} + } + } + } + } + let mut ids = vec![]; + endpoints(p, p.elements[&owner].steps().unwrap_or(&vec![]), &mut ids); + lanes = ids + .into_iter() + .map(|id| { + ( + id, + p.named(id).to_owned(), + p.elements + .get(&id) + .map(|e| e.kind().label()) + .unwrap_or("Endpoint") + .into(), + ) + }) + .collect(); + } + let lane_x = lanes + .iter() + .enumerate() + .map(|(i, (id, ..))| (*id, 160. + i as f32 * 240.)) + .collect::>(); + scene.size.width = (lanes.len() as f32 * 240. + 80.).max(680.); + if scenario { + scene.lanes = lane_x + .iter() + .filter(|(id, _)| { + matches!( + p.elements.get(id).and_then(|e| e.shared()), + Some(SharedBody::Lifeline { + represented: Some(_) + }) + ) + }) + .map(|(id, x)| (*id, *x)) + .collect(); + } + let mut y = if scenario { 148. } else { 120. }; + scene.occurrences(p, owner, scenario, &lane_x, &mut y, 0); + scene.size.height = (y + 45.).max(210.); + if scenario { + scene.lifecycle = scenario_lifecycle::render::Rendering::new( + p, + owner, + &lane_x, + &scene.rows, + &scene.sequence_bounds, + scene.size.height, + ); + scene.lifecycle.align_messages(&mut scene.lines); + scene.layout_activations(p, &lane_x); + } + for (id, name, detail) in lanes { + let x = lane_x[&id]; + if !scenario { + scene.lines.insert( + 0, + Line { + id, + points: vec![Point::new(x, 85.), Point::new(x, scene.size.height - 20.)], + label: String::new(), + label_at: Point::ORIGIN, + dashed: false, + }, + ); + } + scene.boxes.push(BoxItem { + id, + rect: Rectangle::new(Point::new(x - 102., 15.), Size::new(204., 70.)), + title: name, + detail, + marker: None, + }); + } + scene + } + fn occurrences( + &mut self, + p: &Project, + owner: Id, + scenario: bool, + lanes: &BTreeMap, + y: &mut f32, + depth: usize, + ) { + let steps = p + .elements + .get(&owner) + .and_then(|e| { + e.steps().map(Vec::as_slice).or_else(|| { + if let Some(SharedBody::Occurrence { + body: OccurrenceBody::Fragment { branches, .. }, + .. + }) = e.shared() + { + Some(branches.as_slice()) + } else { + None + } + }) + }) + .unwrap_or(&[]); + let ordered = p.elements.get(&owner).and_then(|e| e.steps()).is_some(); + let sequence_top = *y - 42.; + for (index, id) in steps.iter().enumerate() { + let Some(e) = p.elements.get(id) else { + continue; + }; + let Some(SharedBody::Occurrence { body, .. }) = e.shared() else { + continue; + }; + if scenario + && matches!(body, OccurrenceBody::Exchange { + sender: Some(sender), receiver: Some(receiver), + message_kind: MessageKind::Create | MessageKind::Delete, .. + } if sender == receiver) + { + // Record the lifecycle receive row only after making room for + // the self-message elbow and caption above its marker. + *y += 16.; + } + #[cfg(test)] + scenario_lifecycle::render::apply_test_row_offset(*id, y); + if ordered { + let slot = scenario::Slot { + parent: owner, + before: Some(*id), + }; + self.slots.push(SequenceSlot { + slot, + y: *y - 42., + label: scenario::slot_label(p, slot), + }); + self.rows.insert(*id, (owner, *y)); + } + match body { + OccurrenceBody::Fragment { operator, .. } => { + let top = *y; + *y += 55.; + self.occurrences(p, *id, scenario, lanes, y, depth + 1); + let rect = Rectangle::new( + Point::new(18. + depth as f32 * 10., top), + Size::new( + self.size.width - 36. - depth as f32 * 20., + (*y - top).max(95.), + ), + ); + self.boxes.insert( + 0, + BoxItem { + id: *id, + rect, + title: format!("{operator:?} · {}", e.name), + detail: String::new(), + marker: Some(Kind::Occurrence), + }, + ); + *y += if scenario { 64. } else { 20. }; + } + OccurrenceBody::Branch { guard, .. } => { + self.boxes.push(BoxItem { + id: *id, + rect: Rectangle::new( + Point::new(36. + depth as f32 * 10., *y), + Size::new(self.size.width - 85. - depth as f32 * 20., 43.), + ), + title: format!( + "[{}]", + if guard.is_empty() { + "guard not specified" + } else { + guard + } + ), + detail: String::new(), + marker: Some(Kind::Occurrence), + }); + *y += if scenario { 90. } else { 62. }; + self.occurrences(p, *id, scenario, lanes, y, depth + 1); + } + OccurrenceBody::Exchange { + exchange, + sender, + receiver, + message_kind, + .. + } => { + let r = exchange.and_then(|id| p.relations.get(&id)); + let source = if scenario { + *sender + } else { + r.map(|r| r.source()) + }; + let target = if scenario { + if matches!(message_kind, MessageKind::Timer { .. }) { + *sender + } else { + *receiver + } + } else { + r.map(|r| r.target()) + }; + if let (Some(a), Some(b)) = ( + source.and_then(|id| lanes.get(&id)), + target.and_then(|id| lanes.get(&id)), + ) { + let points = if a == b { + vec![ + Point::new(*a, *y), + Point::new(a + 75., *y), + Point::new(a + 75., *y + 24.), + Point::new(*a, *y + 24.), + ] + } else { + vec![Point::new(*a, *y), Point::new(*b, *y)] + }; + let kind = if !scenario { + "" + } else { + match message_kind { + MessageKind::Asynchronous => "signal · ", + MessageKind::Call => "call · ", + MessageKind::Reply => "reply · ", + MessageKind::Create => "create · ", + MessageKind::Delete => "delete · ", + MessageKind::Timer { .. } => "timer · ", + } + }; + let mut message_label = if !scenario { + r.map(|r| r.name.clone()).unwrap_or_else(|| e.name.clone()) + } else if let MessageKind::Timer { expression } = message_kind { + format!("{} · {expression}", e.name) + } else if let Some(exchange) = r.filter(|r| r.name != e.name) { + format!("{} · {}", e.name, exchange.name) + } else { + e.name.clone() + }; + if scenario + && let Some(operation) = crate::data_values::operation_label(p, e) + { + message_label.push_str(" · "); + message_label.push_str(&operation); + } + self.lines.push(Line { + id: *id, + points, + label: format!("{}. {kind}{}", index + 1, message_label), + label_at: Point::new(a.min(*b) + 12., *y - 26.), + dashed: matches!(message_kind, MessageKind::Reply), + }); + } else { + self.boxes.push(BoxItem { + id: *id, + rect: Rectangle::new( + Point::new(65., *y - 20.), + Size::new(self.size.width - 130., 65.), + ), + title: e.name.clone(), + detail: "Choose an exchange and its lifelines in Properties".into(), + marker: None, + }); + } + *y += 92.; + } + OccurrenceBody::Action { action, lifeline } + | OccurrenceBody::State { + state: action, + lifeline, + } => { + let x = lifeline + .and_then(|id| lanes.get(&id)) + .copied() + .unwrap_or(180.); + self.boxes.push(BoxItem { + id: *id, + rect: Rectangle::new(Point::new(x - 110., *y - 20.), Size::new(220., 70.)), + title: e.name.clone(), + detail: action + .map(|id| p.named(id).to_owned()) + .unwrap_or("Choose observed behavior".into()), + marker: None, + }); + *y += 95.; + } + OccurrenceBody::Control { kind } => { + self.boxes.push(BoxItem { + id: *id, + rect: Rectangle::new(Point::new(65., *y - 20.), Size::new(240., 70.)), + title: format!("{kind:?} · {}", e.name), + detail: "Contextual process control".into(), + marker: None, + }); + *y += 95.; + } + OccurrenceBody::SequenceReference { sequence } => { + self.boxes.push(BoxItem { + id: *id, + rect: Rectangle::new(Point::new(65., *y - 20.), Size::new(280., 70.)), + title: e.name.clone(), + detail: sequence + .map(|id| format!("Use {}", p.named(id))) + .unwrap_or("Choose a reusable process or chain".into()), + marker: None, + }); + *y += 95.; + } + OccurrenceBody::ScenarioUse { scenario, bindings } => { + self.boxes.push(BoxItem { + id: *id, + rect: Rectangle::new( + Point::new(65., *y - 20.), + Size::new(self.size.width - 130., 70.), + ), + title: format!("ref · {}", e.name), + detail: scenario + .map(|id| { + format!( + "{} · {} explicit lifeline bindings", + p.named(id), + bindings.len() + ) + }) + .unwrap_or("Choose a scenario".into()), + marker: Some(Kind::Occurrence), + }); + *y += 95.; + } + } + } + if ordered { + self.sequence_bounds.insert(owner, (sequence_top, *y - 42.)); + let slot = scenario::Slot { + parent: owner, + before: None, + }; + self.slots.push(SequenceSlot { + slot, + y: *y - 42., + label: scenario::slot_label(p, slot), + }); + } + } + fn slot_at(&self, point: Point, parent: Option) -> Option<&SequenceSlot> { + self.slots + .iter() + .min_by(|a, b| (a.y - point.y).abs().total_cmp(&(b.y - point.y).abs())) + .filter(|slot| parent.is_none_or(|id| id == slot.slot.parent)) + } + fn lane_at(&self, point: Point) -> Option { + if let Some(header) = self + .boxes + .iter() + .find(|b| self.lanes.contains_key(&b.id) && b.rect.contains(point)) + { + return Some(header.id); + } + self.lanes + .iter() + .filter(|(_, x)| (**x - point.x).abs() < 12. / self.scale) + .min_by(|a, b| (a.1 - point.x).abs().total_cmp(&(b.1 - point.x).abs())) + .map(|(id, _)| *id) + } + fn reorder_handle(&self) -> Option { + let (_, y) = self.rows.get(&self.selected)?; + Some(Rectangle::new( + Point::new(6., *y - 12.), + Size::new(22., 24.), + )) + } + fn hit(&self, point: Point) -> Option { + if !point.x.is_finite() || !point.y.is_finite() { + return None; + } + if let Some(id) = self.lifecycle.marker_at(point) { + return Some(id); + } + self.boxes + .iter() + .rev() + .find(|b| { + !b.title.is_empty() + && b.rect.contains(point) + && (b.marker != Some(Kind::Occurrence) || point.y < b.rect.y + 38.) + }) + .map(|b| b.id) + .or_else(|| { + self.lines + .iter() + .find(|line| { + !line.label.is_empty() + && line.points.windows(2).any(|p| { + crate::diagram::distance_to_segment(point, p[0], p[1]) < 1.5 + }) + }) + .map(|line| line.id) + }) + .or_else(|| { + self.activations + .iter() + .rev() + .find(|b| b.rect.contains(point)) + .map(|b| b.call) + }) + .or_else(|| { + self.lines + .iter() + .find(|line| { + !line.label.is_empty() + && Rectangle::new( + line.label_at, + Size::new( + (line.label.chars().count() as f32 * 6.8 + 8.).min(225.), + 25., + ), + ) + .contains(point) + }) + .map(|line| line.id) + }) + // The generous message tolerance must not steal the exposed + // shoulder of another call's execution when the view is zoomed out. + .or_else(|| self.near_sequence_item(point)) + .or_else(|| self.lifecycle.lane_at(point, self.scale)) + .or_else(|| self.lane_at(point)) + .or_else(|| { + self.lines + .iter() + .find(|line| { + line.label.is_empty() + && line.points.windows(2).any(|p| { + crate::diagram::distance_to_segment(point, p[0], p[1]) + < 8. / self.scale + }) + }) + .map(|line| line.id) + }) + } + + fn near_sequence_item(&self, point: Point) -> Option { + if !self.scale.is_finite() || self.scale <= 0. { + return None; + } + let messages = self + .lines + .iter() + .filter(|line| !line.label.is_empty()) + .map(|line| { + let distance = line + .points + .windows(2) + .map(|p| crate::diagram::distance_to_segment(point, p[0], p[1])) + .fold(f32::INFINITY, f32::min); + (line.id, distance) + }); + // Compare broad message and lifecycle-marker tolerance together after + // exact shapes, so dense minimum-Fit rows choose the nearer item. + self.lifecycle + .nearest_marker(point) + .into_iter() + .chain(messages) + .filter(|(_, distance)| *distance <= 8. / self.scale) + .min_by(|a, b| a.1.total_cmp(&b.1).then_with(|| a.0.cmp(&b.0))) + .map(|(id, _)| id) + } +} +impl canvas::Program for Scene { + type State = SequenceInput; + fn update( + &self, + state: &mut SequenceInput, + event: &canvas::Event, + bounds: Rectangle, + cursor: mouse::Cursor, + ) -> Option> { + use scenario::{CanvasEvent, CanvasTool}; + let (context, tool, editable) = self + .interaction + .map_or((None, CanvasTool::Select, false), |(c, t, e)| { + (Some(c), t, e) + }); + if state.context != context || state.tool != tool { + state.cancel(); + state.pointer = None; + state.context = context; + state.tool = tool; + } + // Scrolling either enclosing Scrollable changes the canvas origin. A + // captured insertion slot belongs to the previous view, even if the + // pointer itself did not move and the semantic context is unchanged. + if state.bounds.is_some_and(|previous| previous != bounds) { + state.cancel(); + state.pointer = None; + } + state.bounds = Some(bounds); + if !editable { + state.cancel(); + } + // The viewport masks input outside its visible canvas bounds. + let visible = cursor.position().is_some(); + if !visible + && matches!( + event, + canvas::Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left)) + ) + { + state.cancel(); + return Some(Action::request_redraw()); + } + let cursor = match event { + canvas::Event::Mouse(mouse::Event::CursorMoved { position }) => { + state.pointer = Some(*position); + if let Some(press) = &mut state.press { + match press { + SequencePress::Message { start, moved, .. } + | SequencePress::Reorder { start, moved, .. } => { + *moved |= position.distance(*start) >= 3. + } + SequencePress::Occurrence { .. } => {} + } + } + mouse::Cursor::Available(*position) + } + canvas::Event::Mouse(mouse::Event::WheelScrolled { .. }) + | canvas::Event::Window(iced::window::Event::Resized(_)) + | canvas::Event::Mouse(mouse::Event::CursorLeft) + | canvas::Event::Window(iced::window::Event::Unfocused) => { + state.cancel(); + state.pointer = None; + return Some(Action::request_redraw()); + } + canvas::Event::Mouse( + mouse::Event::ButtonPressed(_) | mouse::Event::ButtonReleased(_), + ) => state.pointer.map_or(cursor, mouse::Cursor::Available), + canvas::Event::Window(iced::window::Event::RedrawRequested(_)) => { + state.pointer = cursor.position(); + cursor + } + canvas::Event::Keyboard(iced::keyboard::Event::KeyPressed { + key: iced::keyboard::Key::Named(iced::keyboard::key::Named::Delete), + modifiers, + repeat: false, + .. + }) if editable + && tool == CanvasTool::Select + && (modifiers.is_empty() || *modifiers == iced::keyboard::Modifiers::SHIFT) + && state.press.is_none() + && state.source.is_none() => + { + let context = context?; + if self.removal_target(context.scenario, self.selected) { + return Some( + Action::publish(Message::ScenarioCanvas(CanvasEvent::Remove( + context, + self.selected, + ))) + .and_capture(), + ); + } + return None; + } + canvas::Event::Keyboard(iced::keyboard::Event::KeyPressed { + key: iced::keyboard::Key::Named(iced::keyboard::key::Named::Escape), + .. + }) if state.source.is_some() || state.press.is_some() => { + state.cancel(); + return Some(Action::request_redraw().and_capture()); + } + _ => cursor, + }; + let world = cursor.position_in(bounds).map(|p| { + Point::new( + (p.x - self.camera_pan.x) / self.scale, + (p.y - self.camera_pan.y) / self.scale, + ) + }); + match event { + canvas::Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) => { + if !visible { + return None; + } + let point = world?; + if let Some(context) = context { + if !editable { + return None; + } + if let CanvasTool::Message(_) = tool { + let first = state.source.is_none(); + let (source, slot) = state.source.or_else(|| { + Some((self.lane_at(point)?, self.slot_at(point, None)?.slot)) + })?; + state.source = Some((source, slot)); + state.press = Some(SequencePress::Message { + source, + slot, + start: cursor.position()?, + first, + moved: false, + }); + return Some(Action::request_redraw().and_capture()); + } + if let CanvasTool::Add(tool) = tool { + if !tool.canvas_occurrence() && tool != scenario::Tool::Lifeline { + return None; + } + state.press = Some(SequencePress::Occurrence { + tool, + slot: self.slot_at(point, None)?.slot, + lifeline: tool.uses_lifeline().then(|| self.lane_at(point)).flatten(), + }); + return Some(Action::request_redraw().and_capture()); + } + if let Some(occurrence) = self + .hit(point) + .filter(|id| self.rows.contains_key(id)) + .or_else(|| { + self.reorder_handle() + .filter(|r| r.contains(point)) + .map(|_| self.selected) + }) + { + state.press = Some(SequencePress::Reorder { + occurrence, + parent: self.rows[&occurrence].0, + start: cursor.position()?, + moved: false, + }); + return Some(Action::request_redraw().and_capture()); + } + return self.hit(point).map(|id| { + Action::publish(Message::ScenarioCanvas(CanvasEvent::Select(context, id))) + .and_capture() + }); + } + self.hit(point) + .map(|id| Action::publish(Message::Select(id)).and_capture()) + } + canvas::Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left)) => { + let press = state.press.take()?; + let context = context?; + match press { + SequencePress::Occurrence { + tool: captured, + slot, + lifeline, + } if tool == CanvasTool::Add(captured) && world.is_some() => { + return Some( + Action::publish(Message::ScenarioCanvas( + CanvasEvent::BeginOccurrence { + context, + tool: captured, + slot, + lifeline, + }, + )) + .and_capture(), + ); + } + SequencePress::Message { source, slot, .. } + if tool == CanvasTool::Message(scenario::MessageStyle::Timer) + && world.is_some() => + { + state.cancel(); + return Some( + Action::publish(Message::ScenarioCanvas(CanvasEvent::Begin { + context, + slot, + sender: source, + receiver: source, + style: scenario::MessageStyle::Timer, + })) + .and_capture(), + ); + } + SequencePress::Message { + source, + slot, + first, + moved, + .. + } if moved || !first => { + if let Some(receiver) = world.and_then(|p| self.lane_at(p)) { + let CanvasTool::Message(style) = tool else { + return None; + }; + state.cancel(); + return Some( + Action::publish(Message::ScenarioCanvas(CanvasEvent::Begin { + context, + slot, + sender: source, + receiver, + style, + })) + .and_capture(), + ); + } + } + SequencePress::Reorder { + occurrence, + moved: false, + .. + } => { + return Some( + Action::publish(Message::ScenarioCanvas(CanvasEvent::Select( + context, occurrence, + ))) + .and_capture(), + ); + } + SequencePress::Reorder { + occurrence, + parent, + moved: true, + .. + } => { + if let Some(slot) = world.and_then(|p| self.slot_at(p, Some(parent))) { + return Some( + Action::publish(Message::ScenarioCanvas(CanvasEvent::Reorder { + context, + occurrence, + slot: slot.slot, + })) + .and_capture(), + ); + } + } + _ => {} + } + Some(Action::request_redraw().and_capture()) + } + canvas::Event::Mouse(mouse::Event::CursorMoved { .. }) if context.is_some() => { + Some(Action::request_redraw()) + } + _ => None, + } + } + fn draw( + &self, + state: &SequenceInput, + renderer: &Renderer, + _: &Theme, + bounds: Rectangle, + cursor: mouse::Cursor, + ) -> Vec { + let mut f = Frame::new(renderer, bounds.size()); + f.fill_rectangle(Point::ORIGIN, bounds.size(), Color::WHITE); + f.translate(self.camera_pan); + f.scale(self.scale); + self.lifecycle.draw_lanes(&mut f, self.selected); + // Guides belong behind execution fills and cards. In particular, a + // lifeline must not cut through the middle of its activation rectangle. + for guide in self.lines.iter().filter(|line| line.label.is_empty()) { + f.stroke( + &Path::new(|path| { + path.move_to(guide.points[0]); + for point in &guide.points[1..] { + path.line_to(*point); + } + }), + Stroke::default() + .with_color(if guide.id == self.selected { + style::TEAL + } else { + style::MUTED + }) + .with_width(if guide.id == self.selected { 2.5 } else { 1.2 }), + ); + } + // Label backplates clear guides, but must not erase execution borders + // or message geometry. Their text remains in the foreground below. + for line in self.lines.iter().filter(|line| !line.label.is_empty()) { + f.fill_rectangle( + line.label_at, + Size::new( + (line.label.chars().count() as f32 * 6.8 + 8.).min(225.), + 22., + ), + Color::WHITE, + ); + } + for activation in &self.activations { + let path = Path::rectangle(activation.rect.position(), activation.rect.size()); + f.fill(&path, Color::from_rgb8(243, 248, 248)); + f.stroke( + &path, + Stroke::default() + .with_color(if activation.call == self.selected { + style::TEAL + } else { + style::LINE + }) + .with_width(if activation.call == self.selected { + 2.5 + } else { + 1. + }), + ); + } + for b in &self.boxes { + let outline = matches!( + b.marker, + Some(Kind::Region | Kind::StateMachine | Kind::Occurrence) + ); + let color = if b.id == self.selected { + style::TEAL + } else { + style::LINE + }; + if outline { + f.stroke( + &Path::rectangle(b.rect.position(), b.rect.size()), + Stroke::default().with_color(color), + ); + } else { + let path = Path::rounded_rectangle(b.rect.position(), b.rect.size(), 8.into()); + f.fill(&path, Color::from_rgb8(243, 248, 248)); + f.stroke( + &path, + Stroke::default() + .with_color(color) + .with_width(if b.id == self.selected { 2.5 } else { 1. }), + ); + } + } + for l in self.lines.iter().filter(|line| !line.label.is_empty()) { + let color = if l.id == self.selected { + style::TEAL + } else { + style::MUTED + }; + f.stroke( + &Path::new(|p| { + p.move_to(l.points[0]); + for point in &l.points[1..] { + p.line_to(*point); + } + }), + Stroke { + line_dash: canvas::LineDash { + segments: if l.dashed { &[6., 4.] } else { &[] }, + offset: 0, + }, + ..Stroke::default() + .with_color(color) + .with_width(if l.id == self.selected { 2.5 } else { 1.2 }) + }, + ); + if !l.label.is_empty() { + let end = l.points[l.points.len() - 1]; + let prev = l.points[l.points.len() - 2]; + let delta = end - prev; + let len = (delta.x * delta.x + delta.y * delta.y).sqrt().max(1.); + let d = delta / len; + f.stroke( + &Path::new(|p| { + p.move_to(end - d * 9. + iced::Vector::new(-d.y, d.x) * 4.); + p.line_to(end); + p.line_to(end - d * 9. - iced::Vector::new(-d.y, d.x) * 4.); + }), + Stroke::default().with_color(color), + ); + f.fill_text(Text { + content: short(&l.label, 32), + position: l.label_at, + color, + size: 12.into(), + ..Default::default() + }); + } + } + for b in &self.boxes { + if let Some(clip) = box_text_clip(self.camera_pan, b.rect, self.scale, f.size()) { + // WGPU child clips start with an identity transform, as in + // the lifecycle capsule label painter. + f.with_clip(clip, |label| { + label.translate(self.camera_pan); + label.scale(self.scale); + label.fill_text(Text { + content: short(&b.title, ((b.rect.width - 25.) / 7.) as usize), + position: Point::new(b.rect.x + 12., b.rect.y + 12.), + size: 13.into(), + color: if b.id == self.selected { + style::TEAL + } else { + style::INK + }, + ..Default::default() + }); + if !b.detail.is_empty() { + label.fill_text(Text { + content: short(&b.detail, ((b.rect.width - 25.) / 6.) as usize), + position: Point::new(b.rect.x + 12., b.rect.y + 39.), + size: 11.into(), + color: style::MUTED, + ..Default::default() + }); + } + }); + } + } + for point in &self.open_calls { + f.fill_text(Text { + content: "…".into(), + position: *point, + size: 11.into(), + color: style::MUTED, + ..Default::default() + }); + } + self.lifecycle + .draw_markers(&mut f, self.selected, self.scale, self.camera_pan); + if let Some((context, tool, editable)) = self.interaction { + let active = editable && state.context == Some(context) && state.tool == tool; + let point = cursor.position_in(bounds).map(|p| { + Point::new( + (p.x - self.camera_pan.x) / self.scale, + (p.y - self.camera_pan.y) / self.scale, + ) + }); + let source = active.then_some(state.source).flatten(); + let reorder = active.then_some(state.press).flatten().and_then(|press| { + if let SequencePress::Reorder { parent, .. } = press { + Some(parent) + } else { + None + } + }); + if editable + && tool == scenario::CanvasTool::Select + && let Some(handle) = self.reorder_handle() + { + f.fill_rectangle(handle.position(), handle.size(), style::TEAL); + f.fill_text(Text { + content: "↕".into(), + position: handle.position() + iced::Vector::new(5., 2.), + size: 16.into(), + color: Color::WHITE, + ..Default::default() + }); + } + let placement = self.pending_placement.or_else(|| { + active.then_some(state.press).flatten().and_then(|press| { + if let SequencePress::Occurrence { slot, lifeline, .. } = press { + Some((slot, lifeline)) + } else { + None + } + }) + }); + let slot = if let Some((slot, _)) = placement { + self.slots.iter().find(|s| s.slot == slot) + } else if let Some((_, slot)) = source { + self.slots.iter().find(|s| s.slot == slot) + } else if editable + && (matches!( + tool, + scenario::CanvasTool::Message(_) | scenario::CanvasTool::Add(_) + ) || reorder.is_some()) + { + point.and_then(|p| self.slot_at(p, reorder)) + } else { + None + }; + if reorder.is_some() + && slot.is_none() + && let Some(point) = point + { + f.fill_text(Text { + content: "Other operand: move stays in the current sequence".into(), + position: Point::new(point.x + 8., point.y + 12.), + size: (11. / self.scale).into(), + color: Color::from_rgb(0.75, 0.2, 0.15), + ..Default::default() + }); + } + if let Some(slot) = slot { + f.stroke( + &Path::line( + Point::new(32., slot.y), + Point::new(self.size.width - 24., slot.y), + ), + Stroke::default().with_color(style::TEAL).with_width(1.5), + ); + f.fill_rectangle( + Point::new(34., slot.y - 20.), + Size::new((self.size.width - 70.).min(650.), 19.), + Color::WHITE, + ); + f.fill_text(Text { + content: short( + &format!( + "{}: {}", + if self.pending_placement.is_some() { + "Pending" + } else { + "Insert" + }, + slot.label + ), + 88, + ), + position: Point::new(38., slot.y - 19.), + size: 11.into(), + color: style::TEAL, + ..Default::default() + }); + if let Some(x) = placement + .and_then(|(_, lifeline)| lifeline) + .and_then(|id| self.lanes.get(&id)) + { + f.fill(&Path::circle(Point::new(*x, slot.y), 5.), style::TEAL); + } + if let Some((source, _)) = source + && let Some(x) = self.lanes.get(&source) + && let Some(point) = point + { + let to = self + .lane_at(point) + .and_then(|id| self.lanes.get(&id)) + .copied() + .unwrap_or(point.x); + f.stroke( + &Path::line(Point::new(*x, slot.y), Point::new(to, slot.y)), + Stroke::default().with_color(style::TEAL).with_width(3.), + ); + f.fill(&Path::circle(Point::new(to, slot.y), 5.), style::TEAL); + } + } + } + vec![f.into_geometry()] + } + fn mouse_interaction( + &self, + _: &SequenceInput, + bounds: Rectangle, + cursor: mouse::Cursor, + ) -> mouse::Interaction { + if cursor.is_over(bounds) { + mouse::Interaction::Pointer + } else { + mouse::Interaction::default() + } + } +} + +#[cfg(test)] +mod direct_canvas_tests { + use super::*; + use scenario::{CanvasEvent, CanvasTool, MessageStyle}; + fn scene() -> (scenario::direct_tests::Fixture, Scene) { + let f = scenario::direct_tests::fixture(); + let mut scene = Scene::sequence(&f.project, f.owner, f.call); + scene.interaction = Some(( + scenario::direct_tests::context(f.owner), + CanvasTool::Message(MessageStyle::CallReply), + true, + )); + (f, scene) + } + fn send( + scene: &Scene, + state: &mut SequenceInput, + event: mouse::Event, + final_cursor: Point, + bounds: Rectangle, + ) -> Option { + canvas::Program::update( + scene, + state, + &canvas::Event::Mouse(event), + bounds, + mouse::Cursor::Available(final_cursor), + ) + .and_then(|action| action.into_inner().0) + .and_then(|message| { + if let Message::ScenarioCanvas(event) = message { + Some(event) + } else { + None + } + }) + } + #[test] + fn reused_exchange_messages_display_their_distinct_occurrence_names() { + let mut f = scenario::direct_tests::fixture(); + f.project.elements.get_mut(&f.call).unwrap().name = "Route request".into(); + f.project.elements.get_mut(&f.reply).unwrap().name = "Route response".into(); + let scene = Scene::sequence(&f.project, f.owner, f.call); + let call = scene.lines.iter().find(|line| line.id == f.call).unwrap(); + let reply = scene.lines.iter().find(|line| line.id == f.reply).unwrap(); + assert!(call.label.starts_with("1. call · Route request")); + assert!(reply.label.starts_with("2. reply · Route response")); + assert!(call.label.ends_with(&f.project.relations[&f.exchange].name)); + assert!( + reply + .label + .ends_with(&f.project.relations[&f.exchange].name) + ); + } + #[test] + fn direct_drag_and_click_click_use_ordered_sources_and_publish_once() { + for drag in [false, true] { + let (f, scene) = scene(); + let mut state = SequenceInput::default(); + let bounds = Rectangle::new(Point::new(30., 50.), scene.size); + let a = Point::new( + bounds.x + scene.lanes[&f.sender], + bounds.y + scene.slots[0].y, + ); + let b = Point::new(bounds.x + scene.lanes[&f.receiver], a.y); + send( + &scene, + &mut state, + mouse::Event::CursorMoved { position: a }, + b, + bounds, + ); + assert!( + send( + &scene, + &mut state, + mouse::Event::ButtonPressed(mouse::Button::Left), + b, + bounds + ) + .is_none() + ); + if !drag { + assert!( + send( + &scene, + &mut state, + mouse::Event::ButtonReleased(mouse::Button::Left), + b, + bounds + ) + .is_none() + ); + assert_eq!(state.source.unwrap().0, f.sender); + } + send( + &scene, + &mut state, + mouse::Event::CursorMoved { position: b }, + b, + bounds, + ); + if !drag { + send( + &scene, + &mut state, + mouse::Event::ButtonPressed(mouse::Button::Left), + b, + bounds, + ); + } + let result = send( + &scene, + &mut state, + mouse::Event::ButtonReleased(mouse::Button::Left), + b, + bounds, + ); + assert!( + matches!(result, Some(CanvasEvent::Begin { sender, receiver, slot, .. }) if sender == f.sender && receiver == f.receiver && slot.before == Some(f.call)) + ); + assert!( + send( + &scene, + &mut state, + mouse::Event::ButtonReleased(mouse::Button::Left), + b, + bounds + ) + .is_none() + ); + assert!(state.source.is_none() && state.press.is_none()); + } + } + #[test] + fn direct_panned_canvas_maps_ordered_pointer_events_to_the_visible_slot() { + let (f, mut scene) = scene(); + scene.camera_pan = iced::Vector::new(-35., -140.); + let bounds = Rectangle::new(Point::new(20., 230.), scene.size); + let slot = scene.slots.last().unwrap().slot; + let y = scene.slots.last().unwrap().y; + let a = Point::new(bounds.x + scene.lanes[&f.sender], bounds.y + y) + scene.camera_pan; + let b = Point::new(bounds.x + scene.lanes[&f.receiver], bounds.y + y) + scene.camera_pan; + assert!(bounds.contains(a) && bounds.contains(b)); + let mut state = SequenceInput::default(); + // Batched pointer events use their own positions with the final cursor. + for event in [ + mouse::Event::CursorMoved { position: a }, + mouse::Event::ButtonPressed(mouse::Button::Left), + mouse::Event::CursorMoved { position: b }, + ] { + send(&scene, &mut state, event, b, bounds); + } + assert!( + matches!(send(&scene, &mut state, mouse::Event::ButtonReleased(mouse::Button::Left), b, bounds), Some(CanvasEvent::Begin { sender, receiver, slot: actual, .. }) if sender == f.sender && receiver == f.receiver && actual == slot) + ); + } + #[test] + fn direct_scroll_resize_and_bounds_changes_cancel_captured_slots() { + for change in 0..5 { + let (f, scene) = scene(); + let mut state = SequenceInput::default(); + let bounds = Rectangle::new(Point::new(20., 70.), scene.size); + let a = Point::new( + bounds.x + scene.lanes[&f.sender], + bounds.y + scene.slots[0].y, + ); + send( + &scene, + &mut state, + mouse::Event::CursorMoved { position: a }, + a, + bounds, + ); + send( + &scene, + &mut state, + mouse::Event::ButtonPressed(mouse::Button::Left), + a, + bounds, + ); + send( + &scene, + &mut state, + mouse::Event::ButtonReleased(mouse::Button::Left), + a, + bounds, + ); + assert!(state.source.is_some()); + let changed = match change { + 0 => Rectangle::new( + bounds.position() - iced::Vector::new(15., 32.), + bounds.size(), + ), + 1 => Rectangle::new(bounds.position(), bounds.size() + Size::new(20., 10.)), + _ => bounds, + }; + let event = match change { + 2 => canvas::Event::Mouse(mouse::Event::WheelScrolled { + delta: mouse::ScrollDelta::Lines { x: 0., y: -1. }, + }), + 3 => canvas::Event::Window(iced::window::Event::Resized(Size::new(1100., 700.))), + _ => canvas::Event::Window(iced::window::Event::RedrawRequested( + std::time::Instant::now(), + )), + }; + let cursor = if change == 4 { + mouse::Cursor::Unavailable + } else { + mouse::Cursor::Available(a) + }; + let event = if change == 4 { + canvas::Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left)) + } else { + event + }; + canvas::Program::update(&scene, &mut state, &event, changed, cursor); + assert!( + state.source.is_none() && state.press.is_none(), + "change {change} must cancel the old slot" + ); + let b = Point::new( + changed.x + scene.lanes[&f.receiver], + changed.y + scene.slots.last().unwrap().y, + ); + send( + &scene, + &mut state, + mouse::Event::CursorMoved { position: b }, + b, + changed, + ); + send( + &scene, + &mut state, + mouse::Event::ButtonPressed(mouse::Button::Left), + b, + changed, + ); + assert!( + send( + &scene, + &mut state, + mouse::Event::ButtonReleased(mouse::Button::Left), + b, + changed + ) + .is_none(), + "a click after change {change} must start a fresh gesture" + ); + assert_eq!(state.source.unwrap().0, f.receiver); + assert_ne!(state.source.unwrap().1.before, Some(f.call)); + } + } + #[test] + fn direct_bounds_change_during_held_drag_never_commits_old_slot() { + let (f, scene) = scene(); + let mut state = SequenceInput::default(); + let bounds = Rectangle::new(Point::ORIGIN, scene.size); + let a = Point::new(scene.lanes[&f.sender], scene.slots[0].y); + let b = Point::new(scene.lanes[&f.receiver], a.y); + send( + &scene, + &mut state, + mouse::Event::CursorMoved { position: a }, + a, + bounds, + ); + send( + &scene, + &mut state, + mouse::Event::ButtonPressed(mouse::Button::Left), + a, + bounds, + ); + send( + &scene, + &mut state, + mouse::Event::CursorMoved { position: b }, + b, + bounds, + ); + let shifted = Rectangle::new(Point::new(0., -40.), scene.size); + assert!( + send( + &scene, + &mut state, + mouse::Event::ButtonReleased(mouse::Button::Left), + b, + shifted + ) + .is_none() + ); + assert!(state.source.is_none() && state.press.is_none()); + } + #[test] + fn direct_context_escape_unfocus_and_pending_form_cancel_gestures() { + for cancellation in 0..5 { + let (f, mut scene) = scene(); + let mut state = SequenceInput::default(); + let bounds = Rectangle::new(Point::ORIGIN, scene.size); + let a = Point::new(scene.lanes[&f.sender], scene.slots[0].y); + let b = Point::new(scene.lanes[&f.receiver], a.y); + send( + &scene, + &mut state, + mouse::Event::CursorMoved { position: a }, + a, + bounds, + ); + send( + &scene, + &mut state, + mouse::Event::ButtonPressed(mouse::Button::Left), + a, + bounds, + ); + send( + &scene, + &mut state, + mouse::Event::CursorMoved { position: b }, + b, + bounds, + ); + match cancellation { + 0 => { + scene.interaction.as_mut().unwrap().0.revision += 1; + } + 1 => { + scene.interaction.as_mut().unwrap().1 = CanvasTool::Select; + } + 2 => { + scene.interaction.as_mut().unwrap().2 = false; + } + 3 => { + canvas::Program::update( + &scene, + &mut state, + &canvas::Event::Window(iced::window::Event::Unfocused), + bounds, + mouse::Cursor::Unavailable, + ); + } + _ => { + canvas::Program::update( + &scene, + &mut state, + &canvas::Event::Keyboard(iced::keyboard::Event::KeyPressed { + key: iced::keyboard::Key::Named(iced::keyboard::key::Named::Escape), + modified_key: iced::keyboard::Key::Named( + iced::keyboard::key::Named::Escape, + ), + physical_key: iced::keyboard::key::Physical::Code( + iced::keyboard::key::Code::Escape, + ), + location: iced::keyboard::Location::Standard, + modifiers: iced::keyboard::Modifiers::empty(), + text: None, + repeat: false, + }), + bounds, + mouse::Cursor::Available(b), + ); + } + } + assert!( + send( + &scene, + &mut state, + mouse::Event::ButtonReleased(mouse::Button::Left), + b, + bounds + ) + .is_none() + ); + assert!(state.press.is_none() && state.source.is_none()); + } + } + #[test] + fn direct_clicked_occurrence_capture_cancels_on_view_and_context_changes() { + for tool in [ + scenario::Tool::Action, + scenario::Tool::Observation, + scenario::Tool::Reuse, + scenario::Tool::Fragment, + ] { + for cancellation in 0..9 { + let (f, mut scene) = scene(); + scene.interaction.as_mut().unwrap().1 = CanvasTool::Add(tool); + let mut state = SequenceInput::default(); + let mut bounds = Rectangle::new(Point::ORIGIN, scene.size); + let point = Point::new(scene.lanes[&f.sender], scene.slots[0].y); + send( + &scene, + &mut state, + mouse::Event::CursorMoved { position: point }, + point, + bounds, + ); + assert!( + send( + &scene, + &mut state, + mouse::Event::ButtonPressed(mouse::Button::Left), + point, + bounds + ) + .is_none() + ); + assert!(matches!( + state.press, + Some(SequencePress::Occurrence { .. }) + )); + let cancellation_event = match cancellation { + 0 => { + scene.interaction.as_mut().unwrap().0.epoch += 1; + None + } + 1 => { + scene.interaction.as_mut().unwrap().1 = CanvasTool::Select; + None + } + 2 => { + scene.interaction.as_mut().unwrap().2 = false; + None + } + 3 => Some(canvas::Event::Mouse(mouse::Event::WheelScrolled { + delta: mouse::ScrollDelta::Lines { x: 0., y: -1. }, + })), + 4 => Some(canvas::Event::Window(iced::window::Event::Resized( + Size::new(1100., 700.), + ))), + 5 => { + bounds.y -= 30.; + None + } + 6 => Some(canvas::Event::Window(iced::window::Event::Unfocused)), + 7 => Some(canvas::Event::Keyboard(iced::keyboard::Event::KeyPressed { + key: iced::keyboard::Key::Named(iced::keyboard::key::Named::Escape), + modified_key: iced::keyboard::Key::Named( + iced::keyboard::key::Named::Escape, + ), + physical_key: iced::keyboard::key::Physical::Code( + iced::keyboard::key::Code::Escape, + ), + location: iced::keyboard::Location::Standard, + modifiers: iced::keyboard::Modifiers::empty(), + text: None, + repeat: false, + })), + _ => None, + }; + if let Some(event) = cancellation_event { + let action = canvas::Program::update( + &scene, + &mut state, + &event, + bounds, + mouse::Cursor::Available(point), + ); + assert!(action.and_then(|action| action.into_inner().0).is_none()); + } + let cursor = if cancellation == 8 { + mouse::Cursor::Unavailable + } else { + mouse::Cursor::Available(point) + }; + let released = canvas::Program::update( + &scene, + &mut state, + &canvas::Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left)), + bounds, + cursor, + ); + assert!( + released.and_then(|action| action.into_inner().0).is_none(), + "{tool:?} cancellation {cancellation}" + ); + assert!(state.press.is_none()); + } + } + } + #[test] + fn direct_selected_handle_reorders_and_hits_keep_semantic_identity() { + let (f, mut scene) = scene(); + scene.interaction.as_mut().unwrap().1 = CanvasTool::Select; + let bounds = Rectangle::new(Point::ORIGIN, scene.size); + let header = scene + .boxes + .iter() + .find(|b| b.id == f.sender) + .unwrap() + .rect + .center(); + assert_eq!(scene.hit(header), Some(f.sender)); + assert_eq!( + scene.hit(Point::new(scene.lanes[&f.sender], scene.size.height - 28.)), + Some(f.sender) + ); + let line = scene.lines.iter().find(|line| line.id == f.reply).unwrap(); + assert_eq!( + scene.hit(line.label_at + iced::Vector::new(4., 4.)), + Some(f.reply) + ); + let mut state = SequenceInput::default(); + let start = scene.reorder_handle().unwrap().center(); + let end = Point::new(start.x, scene.slots.last().unwrap().y); + send( + &scene, + &mut state, + mouse::Event::CursorMoved { position: start }, + start, + bounds, + ); + send( + &scene, + &mut state, + mouse::Event::ButtonPressed(mouse::Button::Left), + start, + bounds, + ); + send( + &scene, + &mut state, + mouse::Event::CursorMoved { position: end }, + end, + bounds, + ); + assert!( + matches!(send(&scene, &mut state, mouse::Event::ButtonReleased(mouse::Button::Left), end, bounds), Some(CanvasEvent::Reorder { occurrence, slot, .. }) if occurrence == f.call && slot.parent == f.owner && slot.before.is_none()) + ); + } + #[test] + fn direct_alt_execution_stops_each_operand_at_its_reply_and_marks_open_operand() { + use super::topology::occurrence; + let f = scenario::direct_tests::fixture(); + let mut p = execute_batch(&f.project, &[Command::Delete(f.reply)]).unwrap(); + let fragment = occurrence( + &p, + f.owner, + "Alternatives", + OccurrenceBody::Fragment { + operator: FragmentOperator::Alternative, + branches: vec![], + }, + ); + let fragment_id = fragment.id; + let mut commands = vec![Command::CreateElement(fragment)]; + let mut branches = vec![]; + let mut replies = vec![]; + let mut actions = vec![]; + for index in 0..3 { + let mut branch = occurrence( + &p, + f.owner, + &format!("Operand {index}"), + OccurrenceBody::Branch { + guard: format!("path {index}"), + occurrences: vec![], + }, + ); + branch.parent = Some(fragment_id); + let branch_id = branch.id; + branches.push(branch_id); + commands.push(Command::CreateElement(branch)); + let mut steps = vec![]; + if index < 2 { + let mut reply = occurrence( + &p, + f.owner, + &format!("Reply {index}"), + OccurrenceBody::Exchange { + operation: None, + exchange: Some(f.exchange), + sender: Some(f.receiver), + receiver: Some(f.sender), + message_kind: MessageKind::Reply, + reply_to: Some(f.call), + values: vec![], + }, + ); + reply.parent = Some(branch_id); + replies.push(reply.id); + steps.push(reply.id); + commands.push(Command::CreateElement(reply)); + } + let mut action = occurrence( + &p, + f.owner, + &format!("Action {index}"), + OccurrenceBody::Action { + action: Some(p.relations[&f.exchange].target()), + lifeline: Some(f.receiver), + }, + ); + action.parent = Some(branch_id); + actions.push(action.id); + steps.push(action.id); + commands.push(Command::CreateElement(action)); + commands.push(Command::SetSteps(branch_id, steps)); + } + if let Command::CreateElement(element) = &mut commands[0] + && let Some(SharedBody::Occurrence { + body: + OccurrenceBody::Fragment { + branches: stored, .. + }, + .. + }) = element.shared_mut() + { + *stored = branches.clone(); + } + p = execute_batch(&p, &commands).unwrap(); + let scene = Scene::sequence(&p, f.owner, f.call); + let bars: Vec<_> = scene + .activations + .iter() + .filter(|b| b.call == f.call) + .map(|b| b.rect) + .collect(); + for reply in &replies { + let y = scene.rows[reply].1; + assert!( + bars.iter().any(|r| r.y <= y && r.y + r.height == y), + "every reply terminates its own operand segment" + ); + } + for action in &actions[..2] { + let y = scene.rows[action].1; + assert!( + !bars.iter().any(|r| r.y <= y && r.y + r.height > y), + "a returned operand must not remain active through its following action" + ); + } + let last_action = scene.rows[&actions[2]].1; + assert!( + scene.open_calls.iter().any(|p| p.y > last_action), + "the reply-free operand remains explicitly open" + ); + let header = scene + .boxes + .iter() + .find(|b| b.id == branches[1] && !b.title.is_empty()) + .unwrap() + .rect; + assert!( + !bars + .iter() + .any(|r| r.y < header.y + header.height && r.y + r.height > header.y), + "segments do not join mutually exclusive operand headers" + ); + } + #[test] + fn direct_execution_span_ends_at_its_correlated_reply_and_marks_an_open_call() { + let (f, scene) = scene(); + let bar = scene.activations.iter().find(|b| b.call == f.call).unwrap(); + assert_eq!(bar.rect.y + bar.rect.height, scene.rows[&f.reply].1); + assert!(scene.open_calls.is_empty()); + let p = execute_batch(&f.project, &[Command::Delete(f.reply)]).unwrap(); + let scene = Scene::sequence(&p, f.owner, f.call); + assert_eq!(scene.open_calls.len(), 1); + assert_eq!( + scene + .activations + .iter() + .find(|b| b.call == f.call) + .unwrap() + .rect + .height, + 26. + ); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn recovery_retains_each_incomplete_behavior_form_without_executing_it() { + let p = Project::demo(); + let before = p.clone(); + let owner = |kind| p.elements.values().find(|e| e.kind() == kind).unwrap().id; + let machine = owner(Kind::StateMachine); + let scenario = owner(Kind::Scenario); + let process = owner(Kind::Process); + let cases = [ + ( + machine, + vec![ + Event::States(states::Event::Start( + machine, + states::Tool::Transition, + machine, + )), + Event::States(states::Event::Name("Unfinished timeout".into())), + Event::States(states::Event::Timed(true)), + Event::States(states::Event::Expression("-".into())), + Event::States(states::Event::Guard("temperature >".into())), + ], + ), + ( + scenario, + vec![ + Event::Scenario(scenario::Event::Start(scenario, scenario::Tool::Message)), + Event::Scenario(scenario::Event::Name("Unfinished request".into())), + Event::Scenario(scenario::Event::Expression("-".into())), + ], + ), + ( + process, + vec![ + Event::Topology(topology::Event::Start( + process, + topology::Tool::Connect, + None, + )), + Event::Topology(topology::Event::Name("Unfinished path".into())), + Event::Topology(topology::Event::Guard("available &&".into())), + ], + ), + ]; + for (owner, events) in cases { + let mut original = State::default(); + for event in events { + original.update(&p, event).unwrap(); + } + assert!(original.prepare_pending(&p).is_err()); + let snapshot = original.recovery_snapshot().unwrap().unwrap(); + let bytes = serde_json::to_vec(&snapshot).unwrap(); + let mut recovered = State::default(); + recovered + .restore_recovery(serde_json::from_slice(&bytes).unwrap()) + .unwrap(); + assert_eq!(recovered.pending_owner(), Some(owner)); + assert_eq!(recovered.active_owner, Some(owner)); + assert!( + recovered.prepare_pending(&p).is_err(), + "An incomplete recovered form is not applied or silently repaired" + ); + assert_eq!(recovered.recovery_snapshot().unwrap(), Some(snapshot)); + assert_eq!(p, before); + recovered.acknowledge_commit(); + assert!(recovered.recovery_snapshot().unwrap().is_none()); + } + } + + #[test] + fn recovery_preserves_distinct_qualified_value_paths_and_rejects_invalid_payload_atomically() { + let p = Project::demo(); + let scenario = p + .elements + .values() + .find(|e| e.kind() == Kind::Scenario) + .unwrap() + .id; + let field = Id::new_v4(); + let paths = [Id::new_v4(), Id::new_v4()]; + let mut state = State::default(); + state + .update( + &p, + Event::Scenario(scenario::Event::Start(scenario, scenario::Tool::Message)), + ) + .unwrap(); + for (path, value) in paths.into_iter().zip(["-", "3.4e"]) { + state + .update( + &p, + Event::Scenario(scenario::Event::Value( + crate::data_values::FieldPathKey { + path: vec![path], + field, + }, + value.into(), + )), + ) + .unwrap(); + } + let original = state.recovery_snapshot().unwrap().unwrap(); + let mut recovered = State::default(); + recovered.restore_recovery(original.clone()).unwrap(); + assert_eq!( + recovered.recovery_snapshot().unwrap(), + Some(original.clone()) + ); + let values = original["draft"]["values"].as_array().unwrap(); + assert_eq!(values.len(), 2); + assert_ne!(values[0][0], values[1][0]); + assert_eq!(values[0][1], values[1][1]); + for bad in [ + { + let mut value = original.clone(); + value["version"] = 99.into(); + value + }, + { + let mut value = original.clone(); + value["draft"]["unknown"] = true.into(); + value + }, + { + let mut value = original.clone(); + value["draft"]["values"] + .as_array_mut() + .unwrap() + .push(values[0].clone()); + value + }, + ] { + assert!(recovered.restore_recovery(bad).is_err()); + assert_eq!( + recovered.recovery_snapshot().unwrap(), + Some(original.clone()), + "Malformed recovery cannot discard the currently retained form" + ); + } + } + use crate::document::{Document, DocumentError}; + use oa_core::source_project::{self, ProjectLimits}; + + #[test] + fn one_behavior_form_survives_start_edit_and_unrelated_cancel_until_commit() { + let p = Project::demo(); + let owner = |kind| p.elements.values().find(|e| e.kind() == kind).unwrap().id; + let process = owner(Kind::Process); + let scenario = owner(Kind::Scenario); + let machine = owner(Kind::StateMachine); + let transition = p + .relations + .values() + .find(|r| r.kind() == RelationKind::StateTransition) + .unwrap() + .id; + let starts = [ + Event::Topology(topology::Event::Start( + process, + topology::Tool::Control, + None, + )), + Event::Scenario(scenario::Event::Start(scenario, scenario::Tool::Fragment)), + Event::States(states::Event::Start(machine, states::Tool::Region, machine)), + ]; + let names = [ + Event::Topology(topology::Event::Name("Keep this draft".into())), + Event::Scenario(scenario::Event::Name("Keep this draft".into())), + Event::States(states::Event::Name("Keep this draft".into())), + ]; + let cancels = [ + Event::Topology(topology::Event::Cancel), + Event::Scenario(scenario::Event::Cancel), + Event::States(states::Event::Cancel), + ]; + for (index, expected_owner) in [process, scenario, machine].into_iter().enumerate() { + let mut state = State::default(); + assert!(!state.has_pending()); + assert!(state.prepare_pending(&p).unwrap().is_none()); + state.update(&p, starts[index].clone()).unwrap(); + state.update(&p, names[index].clone()).unwrap(); + if index == 1 { + state + .update( + &p, + Event::Scenario(scenario::Event::Expression("approved".into())), + ) + .unwrap(); + } + assert_eq!(state.pending_owner(), Some(expected_owner)); + for replacement in starts + .iter() + .cloned() + .chain([Event::States(states::Event::Edit(transition))]) + { + assert_eq!(state.update(&p, replacement).unwrap_err(), PENDING_DRAFT); + assert_eq!(state.pending_owner(), Some(expected_owner)); + } + state.update(&p, cancels[(index + 1) % 3].clone()).unwrap(); + assert!(state.has_pending(), "Another editor's cancel is stale"); + let command = state.update(&p, Event::Submit).unwrap().unwrap(); + assert!(state.has_pending(), "Preparation must retain the form"); + let expected = execute_batch(&p, std::slice::from_ref(&command)).unwrap(); + assert!(expected.elements.values().any(|e| { + !p.elements.contains_key(&e.id) + && e.name == "Keep this draft" + && e.parent == Some(expected_owner) + })); + let mut document = Document::from_project(p.clone(), ProjectLimits::default()).unwrap(); + document.execute(command).unwrap(); + assert_eq!(document.project(), &expected); + state.acknowledge_commit(); + assert!(!state.has_pending()); + assert!(state.prepare_pending(document.project()).unwrap().is_none()); + assert_eq!(document.revision(), 1); + assert!(document.undo()); + assert_eq!(document.project(), &p); + assert!(!document.can_undo()); + + state.update(&p, starts[index].clone()).unwrap(); + state.update(&p, cancels[index].clone()).unwrap(); + assert!(!state.has_pending(), "Explicit cancel discards this form"); + state.update(&p, starts[(index + 1) % 3].clone()).unwrap(); + } + } + + #[test] + fn failed_document_commit_retains_typed_transition_and_time_event_for_repair() { + let mut p = Project::empty(); + let owner = p + .add_element(Kind::System, Layer::Sa, "System", None) + .unwrap(); + let machine = p + .add_element(Kind::StateMachine, Layer::Sa, "Modes", Some(owner)) + .unwrap(); + let region = p + .add_element(Kind::Region, Layer::Sa, "Region", Some(machine)) + .unwrap(); + let source = p + .add_element(Kind::State, Layer::Sa, "Ready", Some(region)) + .unwrap(); + let target = p + .add_element(Kind::State, Layer::Sa, "Waiting", Some(region)) + .unwrap(); + let work = p + .add_element(Kind::Function, Layer::Sa, "Monitor", None) + .unwrap(); + let choice = |id| Choice { + id, + label: p.named(id).into(), + }; + let mut state = State::default(); + for event in [ + states::Event::Start(machine, states::Tool::Transition, source), + states::Event::Name("Transition".repeat(1024)), + states::Event::Trigger(choice(work)), + states::Event::Effect(choice(work)), + states::Event::TriggerNotes("On a monitor result".into()), + states::Event::Guard("connection unavailable".into()), + states::Event::EffectNotes("Record the timeout".into()), + states::Event::Timed(true), + states::Event::TimeKind("At".into()), + states::Event::Expression("12:30 UTC".into()), + ] { + state.update(&p, Event::States(event)).unwrap(); + } + assert!( + state.prepare_pending(&p).is_err(), + "A target is still missing" + ); + assert_eq!(state.pending_owner(), Some(machine)); + state + .update(&p, Event::States(states::Event::Target(choice(target)))) + .unwrap(); + let command = state.prepare_pending(&p).unwrap().unwrap(); + let bundle = source_project::format_bundle(&p); + let mut limits = ProjectLimits::default(); + limits.model.max_source_bytes = + bundle.files.values().map(String::len).sum::() + 2000; + let mut document = Document::from_bundle(bundle.clone(), limits).unwrap(); + assert!(matches!( + document.execute(command), + Err(DocumentError::Source(_)) + )); + assert_eq!(document.project(), &p); + assert_eq!(document.bundle(), &bundle); + assert_eq!(document.revision(), 0); + assert!(!document.can_undo()); + assert!(state.has_pending()); + + state + .update( + &p, + Event::States(states::Event::Name("Wait for recovery".into())), + ) + .unwrap(); + let command = state.prepare_pending(&p).unwrap().unwrap(); + let Command::Batch(commands) = &command else { + panic!("Expected one atomic transition batch") + }; + assert_eq!(commands.len(), 2); + let Command::CreateElement(event) = &commands[0] else { + panic!("Expected a typed time event") + }; + assert!( + matches!(event.shared(), Some(SharedBody::Event { body: EventBody::Time { kind: TimeEventKind::At, expression } }) if expression == "12:30 UTC") + ); + let Command::CreateRelation(relation) = &commands[1] else { + panic!("Expected the transition") + }; + let RelationBody::StateTransition { + triggers, + effects, + trigger, + guard, + effect, + .. + } = &relation.body + else { + panic!() + }; + assert_eq!(triggers, &[work, event.id]); + assert_eq!(effects, &[work]); + assert_eq!(trigger, "On a monitor result"); + assert_eq!(guard, "connection unavailable"); + assert_eq!(effect, "Record the timeout"); + let expected = execute_batch(&p, std::slice::from_ref(&command)).unwrap(); + document.execute(command).unwrap(); + assert_eq!( + document.project(), + &expected, + "Commit the exact prepared identities" + ); + state.acknowledge_commit(); + assert!(!state.has_pending()); + assert_eq!(document.revision(), 1); + assert!(document.undo()); + assert_eq!(document.bundle(), &bundle); + assert_eq!(document.project(), &p); + assert!(!document.can_undo()); + } + + #[test] + fn legacy_process_and_chain_keep_their_ordered_exchange_scene() { + let p = Project::demo(); + let owners: Vec<_> = p + .elements + .values() + .filter(|e| matches!(e.kind(), Kind::Process | Kind::FunctionalChain)) + .collect(); + assert!(owners.iter().any(|e| e.kind() == Kind::Process)); + assert!(owners.iter().any(|e| e.kind() == Kind::FunctionalChain)); + for owner in owners { + assert!(!uses_explicit_topology(&p, owner.id)); + let expected: Vec<_> = owner + .steps() + .unwrap() + .iter() + .enumerate() + .map(|(index, id)| { + let Some(SharedBody::Occurrence { + body: + OccurrenceBody::Exchange { + exchange: Some(exchange), + .. + }, + .. + }) = p.elements[id].shared() + else { + panic!("Demo legacy sequence should contain exchange occurrences"); + }; + format!("{}. {}", index + 1, p.relations[exchange].name) + }) + .collect(); + assert!(!expected.is_empty()); + let scene = Scene::sequence(&p, owner.id, owner.id); + let actual: Vec<_> = scene + .lines + .iter() + .filter(|line| !line.label.is_empty()) + .map(|line| line.label.clone()) + .collect(); + assert_eq!( + actual, expected, + "Legacy rendering must preserve the model's ordered exchange path" + ); + } + } + #[test] + fn selecting_state_transition_keeps_its_behavior_context() { + let p = Project::demo(); + for r in p + .relations + .values() + .filter(|r| r.kind() == RelationKind::StateTransition) + { + let machine = selected_behavior(&p, r.id).expect("Transition remains in its machine"); + assert_eq!(p.elements[&machine].kind(), Kind::StateMachine); + assert!(in_machine(&p, r.source(), machine)); + assert!(in_machine(&p, r.target(), machine)); + } + } +} diff --git a/harness/experiments/nested-lifecycle-union-20260912/source/crates/oa-desktop/src/behavior/scenario_activation.rs b/harness/experiments/nested-lifecycle-union-20260912/source/crates/oa-desktop/src/behavior/scenario_activation.rs new file mode 100644 index 00000000..88fa4d6e --- /dev/null +++ b/harness/experiments/nested-lifecycle-union-20260912/source/crates/oa-desktop/src/behavior/scenario_activation.rs @@ -0,0 +1,492 @@ +//! Derived call geometry. Correlation and branch ownership come from the model; +//! columns separate overlapping drawings and do not assert an execution thread. +use super::*; + +const WIDTH: f32 = 12.; +const OFFSET: f32 = 6.; + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub(super) enum Finish { + Reply(Id), + Boundary, + /// Still open at this scope boundary; the visible span is not an isolated stub. + Continuation, + Open, + /// The receiver was deleted without answering this call. + Terminated(Id), + /// Lifetime clipping ended this visible piece before its logical terminal. + Clipped, +} + +#[derive(Clone, Debug, PartialEq)] +pub(super) struct Segment { + pub call: Id, + pub receiver: Id, + pub scope: Id, + pub rect: Rectangle, + pub column: usize, + pub finish: Finish, +} +impl Segment { + fn bottom(&self) -> f32 { + self.rect.y + self.rect.height + } + fn overlaps(&self, other: &Self) -> bool { + self.receiver == other.receiver + && self.scope == other.scope + && self.rect.y < other.bottom() + && other.rect.y < self.bottom() + } + fn edge(&self, right: bool) -> f32 { + self.rect.x + if right { self.rect.width } else { 0. } + } +} + +impl Scene { + pub(super) fn layout_activations(&mut self, p: &Project, lanes: &BTreeMap) { + // Logical endpoints precede clipping and remain available even when a + // lifetime hides a whole execution or terminates it before its Reply. + let correlations = logical_correlations(p, &self.rows, &self.lines); + let mut calls: Vec<_> = self + .rows + .iter() + .filter_map(|(&call, &(scope, y))| { + let Some(SharedBody::Occurrence { + body: + OccurrenceBody::Exchange { + message_kind: MessageKind::Call, + receiver: Some(receiver), + .. + }, + .. + }) = p.elements.get(&call).and_then(|e| e.shared()) + else { + return None; + }; + Some((call, *receiver, scope, y, *lanes.get(receiver)?)) + }) + .collect(); + // Rows are laid out in semantic order. UUID order must not choose which + // rectangle obscures another (especially after source reidentification). + calls.sort_by(|a, b| a.3.total_cmp(&b.3).then_with(|| a.0.cmp(&b.0))); + for &(call, receiver, scope, _, x) in &calls { + let first = self.activations.len(); + let first_cue = self.open_calls.len(); + self.activation_sequence(p, scope, call, receiver, x, None); + let column = self.activations[first..] + .iter() + .flat_map(|segment| { + self.activations[..first] + .iter() + .filter(move |other| segment.overlaps(other)) + }) + .map(|other| other.column + 1) + .max() + .unwrap_or(0); + for segment in &mut self.activations[first..] { + segment.column = column; + segment.rect.x += column as f32 * OFFSET; + } + for cue in &mut self.open_calls[first_cue..] { + cue.x += column as f32 * OFFSET; + } + } + // Shallow executions paint first; columns cannot collide within a scope. + self.activations.sort_by(|a, b| { + a.column + .cmp(&b.column) + .then_with(|| a.rect.y.total_cmp(&b.rect.y)) + .then_with(|| a.call.cmp(&b.call)) + }); + self.anchor_activation_messages(p, lanes, &correlations); + } + + fn activation_segment( + &mut self, + call: Id, + receiver: Id, + scope: Id, + x: f32, + span: std::ops::Range, + finish: Finish, + ) { + // Cues describe unanswered logical paths, including wholly invisible + // ones. Never derive them only from the surviving paint rectangles. + if matches!( + finish, + Finish::Open | Finish::Continuation | Finish::Terminated(_) + ) { + self.open_calls + .push(Point::new(x + WIDTH / 2. + 4., span.end - 7.)); + } + for alive in self + .lifecycle + .alive_spans(receiver, scope, span.start, span.end) + { + self.activations.push(Segment { + call, + receiver, + scope, + rect: Rectangle::new( + Point::new(x - WIDTH / 2., alive.start), + Size::new(WIDTH, alive.end - alive.start), + ), + column: 0, + finish: if alive.end == span.end { + finish + } else { + Finish::Clipped + }, + }); + } + } + + /// Follow one exact correlation. A segment belongs to one ordered scope; + /// vertically stacked operands must not become a single chronological span. + fn activation_sequence( + &mut self, + p: &Project, + owner: Id, + call: Id, + receiver: Id, + x: f32, + mut start: Option, + ) -> Outcome { + let entered_open = start.is_some(); + let mut split = false; + let mut may_be_terminated = false; + for id in p.elements[&owner].steps().into_iter().flatten() { + let Some(&(_, y)) = self.rows.get(id) else { + continue; + }; + if *id == call { + // A reflective call is received at the lower end of its loop. + start = Some( + self.lines + .iter() + .find(|line| line.id == call) + .and_then(|line| line.points.last()) + .map_or(y, |point| point.y), + ); + } + let Some(top) = start else { + continue; + }; + match p.elements[id].shared() { + Some(SharedBody::Occurrence { + body: + OccurrenceBody::Exchange { + message_kind: MessageKind::Delete, + receiver: Some(deleted), + .. + }, + .. + }) if *deleted == receiver => { + self.activation_segment( + call, + receiver, + owner, + x, + top..y, + Finish::Terminated(*id), + ); + start = None; + may_be_terminated = true; + } + Some(SharedBody::Occurrence { + body: + OccurrenceBody::Exchange { + message_kind: MessageKind::Reply, + reply_to: Some(correlation), + .. + }, + .. + }) if *correlation == call => { + // Execution ends when its reply is sent, including a self reply. + self.activation_segment(call, receiver, owner, x, top..y, Finish::Reply(*id)); + start = None; + } + Some(SharedBody::Occurrence { + body: OccurrenceBody::Fragment { operator, branches }, + .. + }) => { + split = true; + self.activation_segment(call, receiver, owner, x, top..y, Finish::Boundary); + let bottom = self + .boxes + .iter() + .find(|b| b.id == *id && !b.title.is_empty()) + .map(|b| b.rect.y + b.rect.height) + .unwrap_or(y); + let outcomes: Vec<_> = branches + .iter() + .filter_map(|branch| { + let &(top, _) = self.sequence_bounds.get(branch)?; + Some(self.activation_sequence(p, *branch, call, receiver, x, Some(top))) + }) + .collect(); + let open = match operator { + FragmentOperator::Alternative => { + outcomes.is_empty() || outcomes.iter().any(|outcome| outcome.open) + } + FragmentOperator::Parallel => outcomes.iter().all(|outcome| outcome.open), + FragmentOperator::Optional | FragmentOperator::Loop => true, + }; + if outcomes.iter().any(|outcome| outcome.may_be_terminated) { + // Sibling bars retain their own entry paths, but a + // conditional death cannot become a definite parent + // execution again after a later Create. + self.open_calls + .push(Point::new(x + WIDTH / 2. + 4., bottom - 7.)); + may_be_terminated = true; + start = None; + } else { + start = open.then_some(bottom); + } + } + _ => {} + } + } + if let Some(top) = start { + let bottom = if entered_open || split { + self.sequence_bounds + .get(&owner) + .map_or(top + 26., |(_, bottom)| (*bottom).max(top + 26.)) + } else { + top + 26. + }; + let finish = if entered_open || split { + Finish::Continuation + } else { + Finish::Open + }; + self.activation_segment(call, receiver, owner, x, top..bottom, finish); + } + Outcome { + open: start.is_some(), + may_be_terminated, + } + } + + fn anchor_activation_messages( + &mut self, + p: &Project, + lanes: &BTreeMap, + correlations: &BTreeMap, + ) { + let segments = &self.activations; + for line in &mut self.lines { + let Some(SharedBody::Occurrence { + body: + OccurrenceBody::Exchange { + sender: Some(sender), + receiver: Some(receiver), + message_kind, + reply_to, + .. + }, + .. + }) = p.elements.get(&line.id).and_then(|e| e.shared()) + else { + continue; + }; + if !matches!( + message_kind, + MessageKind::Call | MessageKind::Reply | MessageKind::Asynchronous + ) { + continue; + } + let (Some(&from), Some(&to), Some(&(scope, _))) = ( + lanes.get(sender), + lanes.get(receiver), + self.rows.get(&line.id), + ) else { + continue; + }; + let send_y = line.points[0].y; + let receive_y = line.points.last().unwrap().y; + let reflective = sender == receiver; + let source = if *message_kind == MessageKind::Reply { + reply_to.and_then(|call| { + segments.iter().find(|a| { + a.call == call + && a.scope == scope + && a.finish == Finish::Reply(line.id) + && a.bottom() == send_y + }) + }) + } else { + active_segment( + p, + segments, + correlations, + *sender, + scope, + send_y, + Some(line.id), + ) + }; + let target = if *message_kind == MessageKind::Call { + segments + .iter() + .find(|a| a.call == line.id && a.scope == scope && a.rect.y == receive_y) + } else { + active_segment( + p, + segments, + correlations, + *receiver, + scope, + receive_y, + *reply_to, + ) + }; + let start = source.map_or(from, |a| a.edge(reflective || to > from)); + let end = target.map_or(to, |a| a.edge(reflective || from > to)); + if reflective { + let outside = start.max(end) + 60.; + line.points = vec![ + Point::new(start, send_y), + Point::new(outside, send_y), + Point::new(outside, receive_y), + Point::new(end, receive_y), + ]; + } else { + line.points = vec![Point::new(start, send_y), Point::new(end, receive_y)]; + } + line.label_at.x = start.min(end) + 12.; + } + } +} + +struct Outcome { + open: bool, + may_be_terminated: bool, +} + +fn logical_correlations( + p: &Project, + rows: &BTreeMap, + lines: &[Line], +) -> BTreeMap { + let mut result = BTreeMap::new(); + let points: BTreeMap<_, _> = lines.iter().map(|line| (line.id, &line.points)).collect(); + for (&id, &(_, y)) in rows { + if matches!( + p.elements.get(&id).and_then(|e| e.shared()), + Some(SharedBody::Occurrence { + body: OccurrenceBody::Exchange { + message_kind: MessageKind::Call, + .. + }, + .. + }) + ) { + result.insert( + id, + Correlation { + start: points.get(&id).and_then(|p| p.last()).map_or(y, |p| p.y), + replies: vec![], + }, + ); + } + } + for (&id, &(scope, y)) in rows { + if let Some(SharedBody::Occurrence { + body: + OccurrenceBody::Exchange { + message_kind: MessageKind::Reply, + reply_to: Some(call), + .. + }, + .. + }) = p.elements.get(&id).and_then(|e| e.shared()) + && let Some(correlation) = result.get_mut(call) + { + let sent = points.get(&id).and_then(|p| p.first()).map_or(y, |p| p.y); + correlation.replies.push((scope, sent)); + } + } + result +} + +/// A caller has no implicit execution just because it sent a message. Only an +/// actually drawn, known-duration execution can supply its anchor. Crossed +/// intervals provide no unambiguous innermost execution, so fall back to the lane. +fn active_segment<'a>( + p: &Project, + segments: &'a [Segment], + correlations: &BTreeMap, + receiver: Id, + scope: Id, + y: f32, + exclude: Option, +) -> Option<&'a Segment> { + let candidates: Vec<_> = segments + .iter() + .filter(|a| { + a.receiver == receiver + && a.scope == scope + && Some(a.call) != exclude + && a.rect.y <= y + && y < a.bottom() + && a.finish != Finish::Open + }) + .collect(); + let inner = candidates.iter().max_by_key(|a| a.column).copied()?; + candidates + .iter() + .all(|a| { + a.call == inner.call + || correlations[&a.call].contains(p, scope, &correlations[&inner.call]) + }) + .then_some(inner) +} + +struct Correlation { + start: f32, + replies: Vec<(Id, f32)>, +} +impl Correlation { + fn contains(&self, p: &Project, scope: Id, inner: &Self) -> bool { + // Segment clipping at a fragment can make crossed calls appear nested. + // Compare actual correlated replies on compatible scope paths instead. + let relevant = |&(reply_scope, _): &(Id, f32)| { + ancestor(p, scope, reply_scope) || ancestor(p, reply_scope, scope) + }; + let mut compared = false; + for &(inner_scope, inner_end) in inner.replies.iter().filter(|reply| relevant(reply)) { + let mut matched = false; + for &(outer_scope, outer_end) in self.replies.iter().filter(|reply| relevant(reply)) { + if ancestor(p, inner_scope, outer_scope) || ancestor(p, outer_scope, inner_scope) { + // Alternative operands are not chronological. Compare only + // returns that can belong to the same enclosing branch path. + if outer_end < inner_end { + return false; + } + matched = true; + } + } + if !matched { + return false; + } + compared = true; + } + self.start <= inner.start && compared + } +} +fn ancestor(p: &Project, expected: Id, mut scope: Id) -> bool { + for _ in 0..=p.elements.len() { + if scope == expected { + return true; + } + let Some(parent) = p.elements.get(&scope).and_then(|e| e.parent) else { + return false; + }; + scope = parent; + } + false +} + +#[cfg(test)] +mod tests; diff --git a/harness/experiments/nested-lifecycle-union-20260912/source/crates/oa-desktop/src/behavior/scenario_lifecycle.rs b/harness/experiments/nested-lifecycle-union-20260912/source/crates/oa-desktop/src/behavior/scenario_lifecycle.rs new file mode 100644 index 00000000..6fe04489 --- /dev/null +++ b/harness/experiments/nested-lifecycle-union-20260912/source/crates/oa-desktop/src/behavior/scenario_lifecycle.rs @@ -0,0 +1,285 @@ +//! Read-only lifecycle geometry. Operand screen order is never execution order. +use oa_core::{FragmentOperator, Id, Kind, MessageKind, OccurrenceBody, Project, SharedBody}; +use std::collections::{BTreeMap, BTreeSet}; + +pub(super) mod render; + +/// Maps already recorded by the sequence renderer. Rows carry their owning sequence. +pub(crate) struct Geometry<'a> { + pub rows: &'a BTreeMap, + pub scopes: &'a BTreeMap, +} + +#[derive(Debug, Clone, Copy, PartialEq)] +pub(crate) struct Span { + pub start: f32, + pub end: f32, +} +impl Span { + fn valid(self) -> bool { + self.start.is_finite() && self.end.is_finite() && self.start <= self.end + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum Life { + Alive, + Absent, + Unresolved, +} +#[derive(Debug, Clone, Copy, PartialEq)] +pub(crate) struct Interval { + pub scope: Id, + pub span: Span, + pub life: Life, +} +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum MarkerKind { + Birth, + Death, +} +#[derive(Debug, Clone, Copy, PartialEq)] +pub(crate) struct Marker { + pub occurrence: Id, + pub scope: Id, + pub y: f32, + pub kind: MarkerKind, +} +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum UncertaintyReason { + Conditional, + Repeated, + Parallel, + MissingGeometry, +} +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) struct Uncertainty { + pub scope: Id, + pub reason: UncertaintyReason, +} +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct LaneLifetime { + pub lifeline: Id, + pub intervals: Vec, + pub markers: Vec, + pub uncertainties: Vec, +} + +/// Stable lane-ID order; source/model/history and caller-owned geometry are untouched. +/// An opaque ScenarioUse is a local use, not a caller birth/death contract. +pub(crate) fn project_lifetimes( + project: &Project, + scenario: Id, + geometry: &Geometry<'_>, +) -> Vec { + if project + .elements + .get(&scenario) + .is_none_or(|e| e.kind() != Kind::Scenario) + { + return vec![]; + } + project + .elements + .values() + .filter(|e| e.kind() == Kind::Lifeline && e.parent == Some(scenario)) + .map(|e| { + let mut projection = Projection { + project, + geometry, + lane: e.id, + visiting: BTreeSet::new(), + result: LaneLifetime { + lifeline: e.id, + intervals: vec![], + markers: vec![], + uncertainties: vec![], + }, + }; + let initial = if projection.contains(scenario, Some(MarkerKind::Birth)) { + Life::Unresolved + } else { + Life::Alive + }; + projection.sequence(scenario, initial); + projection.result + }) + .collect() +} + +struct Projection<'a, 'g> { + project: &'a Project, + geometry: &'a Geometry<'g>, + lane: Id, + visiting: BTreeSet, + result: LaneLifetime, +} +impl Projection<'_, '_> { + fn body(&self, id: Id) -> Option<&OccurrenceBody> { + match self.project.elements.get(&id)?.shared()? { + SharedBody::Occurrence { body, .. } => Some(body), + _ => None, + } + } + fn event(&self, id: Id) -> Option { + match self.body(id)? { + OccurrenceBody::Exchange { + receiver: Some(line), + message_kind, + .. + } if *line == self.lane => match message_kind { + MessageKind::Create => Some(MarkerKind::Birth), + MessageKind::Delete => Some(MarkerKind::Death), + _ => None, + }, + _ => None, + } + } + fn contains(&self, scope: Id, kind: Option) -> bool { + // Local structural walk only: no guards, iteration simulation or reuse expansion. + let mut pending = vec![scope]; + let mut seen = BTreeSet::new(); + while let Some(id) = pending.pop() { + if !seen.insert(id) { + continue; + } + if self + .event(id) + .is_some_and(|event| kind.is_none_or(|k| event == k)) + { + return true; + } + if let Some(steps) = self.project.elements.get(&id).and_then(|e| e.steps()) { + pending.extend(steps); + } + if let Some(OccurrenceBody::Fragment { branches, .. }) = self.body(id) { + pending.extend(branches); + } + } + false + } + fn span(&self, scope: Id) -> Option { + let &(start, end) = self.geometry.scopes.get(&scope)?; + let span = Span { start, end }; + span.valid().then_some(span) + } + fn uncertain(&mut self, scope: Id, reason: UncertaintyReason) { + let value = Uncertainty { scope, reason }; + if !self.result.uncertainties.contains(&value) { + self.result.uncertainties.push(value); + } + } + fn interval(&mut self, scope: Id, start: f32, end: f32, life: Life) { + if start < end && start.is_finite() && end.is_finite() { + self.result.intervals.push(Interval { + scope, + span: Span { start, end }, + life, + }); + } + } + fn sequence(&mut self, scope: Id, entry: Life) -> Life { + let Some(span) = self.span(scope) else { + self.uncertain(scope, UncertaintyReason::MissingGeometry); + return Life::Unresolved; + }; + if !self.visiting.insert(scope) { + self.uncertain(scope, UncertaintyReason::MissingGeometry); + return Life::Unresolved; + } + let steps = self + .project + .elements + .get(&scope) + .and_then(|e| e.steps()) + .cloned() + .unwrap_or_default(); + // A creation directly in this sequence fixes its local birth boundary. + // A creation only in a nested operand cannot fix its ancestor's entry. + let mut life = if steps + .iter() + .any(|&id| self.event(id) == Some(MarkerKind::Birth)) + { + Life::Absent + } else { + entry + }; + let mut cursor = span.start; + for id in steps { + let event = self.event(id); + let fragment = match self.body(id) { + Some(OccurrenceBody::Fragment { operator, branches }) => { + Some((*operator, branches.clone())) + } + _ => None, + }; + if event.is_none() && fragment.is_none() { + continue; + } + let y = self + .geometry + .rows + .get(&id) + .filter(|(owner, y)| { + *owner == scope && y.is_finite() && *y >= cursor && *y <= span.end + }) + .map(|(_, y)| *y); + let Some(y) = y else { + self.uncertain(id, UncertaintyReason::MissingGeometry); + life = Life::Unresolved; + continue; + }; + self.interval(scope, cursor, y, life); + cursor = y; + if let Some(kind) = event { + self.result.markers.push(Marker { + occurrence: id, + scope, + y, + kind, + }); + life = match kind { + MarkerKind::Birth => Life::Alive, + MarkerKind::Death => Life::Absent, + }; + } + if let Some((operator, branches)) = fragment { + let entry = life; + let mut missing = false; + for branch in branches { + let bounds = self + .span(branch) + .filter(|s| s.start >= cursor && s.end <= span.end); + if let Some(bounds) = bounds { + // Every sibling inherits the same entry, never its displayed predecessor's exit. + self.sequence(branch, entry); + cursor = bounds.end; + } else { + self.uncertain(branch, UncertaintyReason::MissingGeometry); + missing = true; + } + } + if self.contains(id, None) { + let reason = match operator { + FragmentOperator::Alternative | FragmentOperator::Optional => { + UncertaintyReason::Conditional + } + FragmentOperator::Loop => UncertaintyReason::Repeated, + FragmentOperator::Parallel => UncertaintyReason::Parallel, + }; + self.uncertain(id, reason); + life = Life::Unresolved; + } else if missing { + life = Life::Unresolved; + } + } + } + self.interval(scope, cursor, span.end, life); + self.visiting.remove(&scope); + life + } +} + +#[cfg(test)] +#[path = "scenario_lifecycle/tests.rs"] +mod tests; diff --git a/harness/experiments/nested-lifecycle-union-20260912/source/crates/oa-desktop/src/behavior/scenario_lifecycle/render.rs b/harness/experiments/nested-lifecycle-union-20260912/source/crates/oa-desktop/src/behavior/scenario_lifecycle/render.rs new file mode 100644 index 00000000..989fb2d5 --- /dev/null +++ b/harness/experiments/nested-lifecycle-union-20260912/source/crates/oa-desktop/src/behavior/scenario_lifecycle/render.rs @@ -0,0 +1,407 @@ +//! Scene bridge for local lifetime geometry; no authoring or model mutations. +use super::{Geometry, LaneLifetime, Life, Marker, MarkerKind, Span, project_lifetimes}; +use crate::{behavior::Line, style, views::short}; +use iced::{ + Color, Point, Rectangle, Size, + widget::canvas::{self, Frame, Path, Stroke, Text}, +}; +use oa_core::{Id, OccurrenceBody, Project, SharedBody}; +use std::collections::BTreeMap; + +// Test-only geometry input, deliberately upstream of rows, scopes, lifecycle +// and activations. This is not an authored placement or drag policy. +#[cfg(test)] +thread_local! { + static TEST_ROW_OFFSETS: std::cell::RefCell> = Default::default(); +} +#[cfg(test)] +pub(in crate::behavior) fn apply_test_row_offset(id: Id, y: &mut f32) { + TEST_ROW_OFFSETS.with(|offsets| { + if let Some(offset) = offsets.borrow().get(&id) { + *y += offset; + } + }); +} + +#[derive(Debug, Clone, PartialEq)] +struct EventMarker { + event: Marker, + lifeline: Id, + center: Point, + capsule: Rectangle, + name: String, + sender_x: Option, +} + +#[derive(Debug, Default, Clone, PartialEq)] +pub(in crate::behavior) struct Rendering { + // Complete rendering positions, including warning-admitted unassigned lanes. + // Scene.lanes independently retains the existing authoring eligibility rule. + lanes: BTreeMap, + span: Option, + lifetimes: Vec, + markers: Vec, +} + +impl Rendering { + pub(in crate::behavior) fn new( + project: &Project, + owner: Id, + lanes: &BTreeMap, + rows: &BTreeMap, + insertion_scopes: &BTreeMap, + height: f32, + ) -> Self { + let span = Span { + start: 85., + end: height - 20., + }; + if !span.valid() { + return Self::default(); + } + // Insertion scopes deliberately start later and end earlier. Empty and + // Create-only scenarios still have the full visible lifetime extent. + let mut scopes = insertion_scopes.clone(); + for (scope, (start, end)) in &mut scopes { + if *scope != owner && *start == *end && start.is_finite() { + // An empty operand has 42 px between its insertion axis and + // frame end. Match the existing 26 px open-activation allowance. + *end = *start + 26.; + } + } + scopes.insert(owner, (span.start, span.end)); + let lifetimes = project_lifetimes( + project, + owner, + &Geometry { + rows, + scopes: &scopes, + }, + ); + let lanes: BTreeMap<_, _> = lanes + .iter() + .filter(|(_, x)| x.is_finite()) + .map(|(id, x)| (*id, *x)) + .collect(); + let mut markers = Vec::new(); + for lane in &lifetimes { + let Some(&x) = lanes.get(&lane.lifeline) else { + continue; + }; + for event in &lane.markers { + let sender_x = project + .elements + .get(&event.occurrence) + .and_then(|e| e.shared()) + .and_then(|body| match body { + SharedBody::Occurrence { + body: + OccurrenceBody::Exchange { + sender: Some(sender), + .. + }, + .. + } => lanes.get(sender).copied(), + _ => None, + }); + markers.push(EventMarker { + event: *event, + lifeline: lane.lifeline, + center: Point::new(x, event.y), + capsule: Rectangle::new( + Point::new(x - 70., event.y - 14.), + Size::new(140., 28.), + ), + name: project.named(lane.lifeline).to_owned(), + sender_x, + }); + } + } + Self { + lanes, + span: Some(span), + lifetimes, + markers, + } + } + + pub(in crate::behavior) fn align_messages(&self, lines: &mut [Line]) { + for marker in &self.markers { + let Some(sender) = marker.sender_x else { + continue; + }; + let Some(line) = lines + .iter_mut() + .find(|line| line.id == marker.event.occurrence) + else { + continue; + }; + let x = marker.center.x; + let y = marker.center.y; + let self_message = sender == x; + let end_x = match marker.event.kind { + MarkerKind::Birth if sender < x => marker.capsule.x, + MarkerKind::Birth => marker.capsule.x + marker.capsule.width, + MarkerKind::Death => x, + }; + line.points = if self_message { + // The receiver is on the recorded occurrence row, including self + // lifecycle events. The elbow stays outside the birth capsule. + let elbow = x + 112.; + line.label_at = Point::new(x + 12., y - 52.); + vec![ + Point::new(x, y - 24.), + Point::new(elbow, y - 24.), + Point::new(elbow, y), + Point::new(end_x, y), + ] + } else { + if marker.event.kind == MarkerKind::Birth { + // Keep the label above the capsule, including right-to-left + // messages whose existing label starts beside the receiver. + line.label_at.y = y - 40.; + } + vec![Point::new(sender, y), Point::new(end_x, y)] + }; + } + } + + pub(in crate::behavior) fn alive_spans( + &self, + lifeline: Id, + scope: Id, + top: f32, + bottom: f32, + ) -> Vec { + if !top.is_finite() || !bottom.is_finite() || bottom <= top { + return vec![]; + } + self.lifetimes + .iter() + .find(|lane| lane.lifeline == lifeline) + .into_iter() + .flat_map(|lane| &lane.intervals) + .filter(|interval| interval.scope == scope && interval.life == Life::Alive) + .filter_map(|interval| { + let start = top.max(interval.span.start); + let end = bottom.min(interval.span.end); + (start < end).then_some(Span { start, end }) + }) + .collect() + } + + pub(in crate::behavior) fn marker_at(&self, point: Point) -> Option { + self.markers + .iter() + .rev() + .find(|marker| match marker.event.kind { + MarkerKind::Birth => marker.capsule.contains(point), + MarkerKind::Death => marker_distance(marker, point) <= 1.25, + }) + .map(|marker| marker.event.occurrence) + } + + pub(in crate::behavior) fn nearest_marker(&self, point: Point) -> Option<(Id, f32)> { + if !point.x.is_finite() || !point.y.is_finite() { + return None; + } + // Exact visible shapes are tested first by Scene. A low-zoom tolerance + // must not outrank another marker's actual capsule, a header, or a label. + self.markers + .iter() + .map(|marker| (marker.event.occurrence, marker_distance(marker, point))) + .min_by(|a, b| a.1.total_cmp(&b.1).then_with(|| a.0.cmp(&b.0))) + } + + pub(in crate::behavior) fn lane_at(&self, point: Point, scale: f32) -> Option { + let span = self.span?; + if !scale.is_finite() || scale <= 0. || point.y < span.start || point.y > span.end { + return None; + } + self.lanes + .iter() + .filter(|(_, x)| (**x - point.x).abs() < 12. / scale) + .min_by(|a, b| (a.1 - point.x).abs().total_cmp(&(b.1 - point.x).abs())) + .map(|(id, _)| *id) + } + + pub(in crate::behavior) fn draw_lanes(&self, frame: &mut Frame, selected: Id) { + let Some(span) = self.span else { + return; + }; + for (&id, &x) in &self.lanes { + frame.stroke( + &Path::line(Point::new(x, span.start), Point::new(x, span.end)), + Stroke { + line_dash: canvas::LineDash { + segments: &[2., 5.], + offset: 0, + }, + ..Stroke::default() + .with_width(1.) + .with_color(if id == selected { + Color::from_rgb8(148, 190, 187) + } else { + Color::from_rgb8(214, 222, 222) + }) + }, + ); + } + for lifetime in &self.lifetimes { + let Some(&x) = self.lanes.get(&lifetime.lifeline) else { + continue; + }; + for interval in &lifetime.intervals { + match interval.life { + Life::Alive => frame.stroke( + &Path::line( + Point::new(x, interval.span.start), + Point::new(x, interval.span.end), + ), + Stroke::default().with_width(2.).with_color( + if lifetime.lifeline == selected { + style::TEAL + } else { + Color::from_rgb8(91, 113, 113) + }, + ), + ), + Life::Unresolved if interval.span.end - interval.span.start >= 16. => { + frame.fill_text(Text { + content: "?".into(), + position: Point::new(x + 9., interval.span.start + 2.), + size: 11.into(), + color: style::MUTED, + ..Default::default() + }); + } + _ => {} + } + } + } + if !self.lanes.is_empty() { + frame.fill_text(Text { + content: + "Dotted: editing guide · Solid: local lifetime · ?: lifetime depends on path" + .into(), + position: Point::new(28., span.end + 4.), + size: 10.into(), + color: style::MUTED, + ..Default::default() + }); + } + } + + pub(in crate::behavior) fn draw_markers( + &self, + frame: &mut Frame, + selected: Id, + scale: f32, + pan: iced::Vector, + ) { + for marker in &self.markers { + let color = if selected == marker.event.occurrence || selected == marker.lifeline { + style::TEAL + } else { + style::INK + }; + match marker.event.kind { + MarkerKind::Birth => { + let path = Path::rounded_rectangle( + marker.capsule.position(), + marker.capsule.size(), + 6.into(), + ); + frame.fill(&path, Color::from_rgb8(243, 248, 248)); + frame.stroke( + &path, + Stroke::default().with_color(color).with_width( + if selected == marker.event.occurrence { + 2.5 + } else { + 1.5 + }, + ), + ); + if let Some(clip) = birth_label_clip(pan, marker.capsule, scale, frame.size()) { + // WGPU clipped frames start with an identity transform; + // neither the parent's pan/scale nor its clip is inherited. + frame.with_clip(clip, |label| { + label.translate(pan); + label.scale(scale); + label.fill_text(Text { + content: short(&marker.name, 18), + position: marker.capsule.position() + iced::Vector::new(8., 6.), + size: 12.into(), + color, + ..Default::default() + }); + }); + } + } + MarkerKind::Death => { + for (a, b) in death_strokes(marker.center) { + frame.stroke( + &Path::line(a, b), + Stroke::default().with_color(color).with_width(2.5), + ); + } + } + } + } + } +} + +fn birth_label_clip( + pan: iced::Vector, + capsule: Rectangle, + scale: f32, + viewport: Size, +) -> Option { + if !pan.x.is_finite() || !pan.y.is_finite() || !scale.is_finite() || scale <= 0. { + return None; + } + Rectangle::new( + Point::new( + pan.x + (capsule.x + 8.) * scale, + pan.y + (capsule.y + 4.) * scale, + ), + Size::new((capsule.width - 16.) * scale, (capsule.height - 8.) * scale), + ) + .intersection(&Rectangle::new(Point::ORIGIN, viewport)) +} + +fn marker_distance(marker: &EventMarker, point: Point) -> f32 { + match marker.event.kind { + MarkerKind::Birth => { + let dx = (marker.capsule.x - point.x) + .max(point.x - marker.capsule.x - marker.capsule.width) + .max(0.); + let dy = (marker.capsule.y - point.y) + .max(point.y - marker.capsule.y - marker.capsule.height) + .max(0.); + dx.hypot(dy) + } + MarkerKind::Death => death_strokes(marker.center) + .iter() + .map(|(a, b)| crate::diagram::distance_to_segment(point, *a, *b)) + .fold(f32::INFINITY, f32::min), + } +} + +fn death_strokes(center: Point) -> [(Point, Point); 2] { + [ + ( + center + iced::Vector::new(-7., -7.), + center + iced::Vector::new(7., 7.), + ), + ( + center + iced::Vector::new(-7., 7.), + center + iced::Vector::new(7., -7.), + ), + ] +} + +#[cfg(test)] +#[path = "render_tests.rs"] +mod tests; diff --git a/harness/experiments/nested-lifecycle-union-20260912/source/crates/oa-desktop/src/behavior/scenario_lifecycle/render_tests.rs b/harness/experiments/nested-lifecycle-union-20260912/source/crates/oa-desktop/src/behavior/scenario_lifecycle/render_tests.rs new file mode 100644 index 00000000..e0d9ee81 --- /dev/null +++ b/harness/experiments/nested-lifecycle-union-20260912/source/crates/oa-desktop/src/behavior/scenario_lifecycle/render_tests.rs @@ -0,0 +1,991 @@ +use super::*; +use crate::{behavior::Scene, document::Document}; +use iced::Size; +use oa_core::*; + +#[path = "union_tests.rs"] +mod union_tests; + +struct Fixture { + project: Project, + owner: Id, + sender: Id, + receiver: Id, + work: Id, + exchange: Id, +} +impl Fixture { + fn new(layer: Layer) -> Self { + let mut project = Project::empty(); + let kind = if layer == Layer::Oa { + Kind::Activity + } else { + Kind::Function + }; + let a = project.add_element(kind, layer, "Request", None).unwrap(); + let work = project.add_element(kind, layer, "Provide", None).unwrap(); + let exchange = project.relate( + if layer == Layer::Oa { + RelationKind::Interaction + } else { + RelationKind::FunctionalExchange + }, + "Service", + a, + work, + ); + let owner = project + .add_element(Kind::Scenario, layer, "Lifecycle", None) + .unwrap(); + let mut lane = |name, represented| { + let id = project + .add_element(Kind::Lifeline, layer, name, Some(owner)) + .unwrap(); + *project.elements.get_mut(&id).unwrap().shared_mut().unwrap() = SharedBody::Lifeline { + represented: Some(represented), + }; + id + }; + let sender = lane("Requester", a); + let receiver = lane("Provider", work); + Self { + project, + owner, + sender, + receiver, + work, + exchange, + } + } + fn occurrence(&mut self, parent: Id, name: &str, body: OccurrenceBody) -> Id { + let mut element = self + .project + .make_element( + Kind::Occurrence, + self.project.elements[&parent].layer(), + name, + Some(parent), + ) + .unwrap(); + let id = element.id; + *element.shared_mut().unwrap() = SharedBody::Occurrence { + body, + precondition: String::new(), + postcondition: String::new(), + }; + self.project.elements.insert(id, element); + let parent = self.project.elements.get_mut(&parent).unwrap(); + if let Some(steps) = parent.steps_mut() { + steps.push(id); + } else if let Some(SharedBody::Occurrence { + body: OccurrenceBody::Fragment { branches, .. }, + .. + }) = parent.shared_mut() + { + branches.push(id); + } else { + panic!("fixture parent must own ordered occurrences or operands"); + } + id + } + fn message(&mut self, parent: Id, kind: MessageKind) -> Id { + self.occurrence( + parent, + "Message", + OccurrenceBody::Exchange { + exchange: Some(self.exchange), + sender: Some(self.sender), + receiver: Some(self.receiver), + message_kind: kind, + operation: None, + reply_to: None, + values: vec![], + }, + ) + } + fn reply(&mut self, parent: Id, call: Id) -> Id { + self.occurrence( + parent, + "Reply", + OccurrenceBody::Exchange { + exchange: Some(self.exchange), + sender: Some(self.receiver), + receiver: Some(self.sender), + message_kind: MessageKind::Reply, + operation: None, + reply_to: Some(call), + values: vec![], + }, + ) + } + fn fragment(&mut self, parent: Id, operator: FragmentOperator) -> Id { + self.occurrence( + parent, + "Paths", + OccurrenceBody::Fragment { + operator, + branches: vec![], + }, + ) + } + fn branch(&mut self, fragment: Id) -> Id { + self.occurrence( + fragment, + "Operand", + OccurrenceBody::Branch { + guard: "condition".into(), + occurrences: vec![], + }, + ) + } + fn document(&self) -> Document { + validate_candidate(&self.project).expect("ordinary core admission must succeed"); + let mut bundle = source_project::format_bundle(&self.project); + for text in bundle.files.values_mut() { + *text = format!( + "// Retain exact authored CRLF and Unicode Ω\r\n{}", + text.replace('\n', "\r\n") + ); + } + let document = + Document::from_bundle(bundle.clone(), source_project::ProjectLimits::default()) + .unwrap(); + assert_eq!(document.project(), &self.project); + assert_eq!(document.bundle(), &bundle); + document + } + fn scene(&self) -> Scene { + let document = self.document(); + let before = document.snapshot(); + let scene = Scene::sequence(document.project(), self.owner, self.owner); + assert_eq!(document.project(), &before.decoded.project); + assert_eq!(document.bundle(), &before.bundle); + assert_eq!(document.revision(), 0); + assert!(!document.can_undo() && !document.can_redo() && !document.dirty()); + assert_eq!( + scene.lifecycle, + Scene::sequence(document.project(), self.owner, self.owner).lifecycle + ); + assert!( + scene + .lines + .iter() + .flat_map(|line| &line.points) + .all(|p| p.x.is_finite() && p.y.is_finite()) + ); + scene + } +} + +fn intervals(scene: &Scene, lifeline: Id, scope: Id) -> Vec<(f32, f32, Life)> { + scene + .lifecycle + .lifetimes + .iter() + .find(|lane| lane.lifeline == lifeline) + .unwrap() + .intervals + .iter() + .filter(|i| i.scope == scope) + .map(|i| (i.span.start, i.span.end, i.life)) + .collect() +} + +#[test] +fn real_scene_long_header_title_and_detail_keep_names_and_have_bounded_clips() { + for layer in [Layer::Oa, Layer::Sa] { + for name in [ + "W".repeat(18), + "界".repeat(24), + "e\u{301}".repeat(24), + "👩\u{200d}🔧".repeat(12), + ] { + let mut f = Fixture::new(layer); + f.project.elements.get_mut(&f.receiver).unwrap().name = name.clone(); + f.project.elements.get_mut(&f.work).unwrap().name = name.clone(); + let scene = f.scene(); + let header = scene.boxes.iter().find(|b| b.id == f.receiver).unwrap(); + assert_eq!(header.title, name); + assert_eq!(header.detail, name); + assert_eq!(header.rect.size(), Size::new(204., 70.)); + assert_eq!(scene.hit(header.rect.center()), Some(f.receiver)); + // Scroll offset is handled by the existing outer canvas/scrollable; + // these are the local drawing frame's coordinates, not screen input. + for scale in [0.05, 0.5, 0.512, 0.64, 0.8, 1., 1.953125, 2.] { + let clip = crate::behavior::box_text_clip( + iced::Vector::ZERO, + header.rect, + scale, + Size::new(2000., 2000.), + ) + .unwrap(); + let world = Rectangle::new( + Point::new(clip.x / scale, clip.y / scale), + Size::new(clip.width / scale, clip.height / scale), + ); + assert!((world.x - header.rect.x - 10.).abs() < 0.001); + assert!((world.y - header.rect.y - 8.).abs() < 0.001); + assert!((world.width - 184.).abs() < 0.001); + assert!((world.height - 54.).abs() < 0.001); + assert!(header.rect.contains(world.position())); + assert!( + header + .rect + .contains(Point::new(world.x + world.width, world.y + world.height,)) + ); + } + } + } +} + +#[test] +fn box_text_clip_intersects_parent_viewport_and_rejects_empty_interiors() { + use crate::behavior::box_text_clip; + let card = Rectangle::new(Point::new(100., 200.), Size::new(204., 70.)); + assert_eq!( + box_text_clip(iced::Vector::ZERO, card, 2., Size::new(300., 500.)), + Some(Rectangle::new(Point::new(220., 416.), Size::new(80., 84.))) + ); + assert_eq!( + box_text_clip( + iced::Vector::ZERO, + Rectangle::new(Point::new(-20., -10.), card.size()), + 2., + Size::new(300., 500.), + ), + Some(Rectangle::new(Point::ORIGIN, Size::new(300., 104.))) + ); + for viewport in [Size::new(200., 500.), Size::new(300., 400.), Size::ZERO] { + assert_eq!(box_text_clip(iced::Vector::ZERO, card, 2., viewport), None); + } + for scale in [0., -1., f32::NAN, f32::INFINITY] { + assert_eq!( + box_text_clip(iced::Vector::ZERO, card, scale, Size::new(1000., 1000.)), + None + ); + } + for size in [Size::new(20., 70.), Size::new(204., 16.), Size::ZERO] { + assert_eq!( + box_text_clip( + iced::Vector::ZERO, + Rectangle::new(Point::ORIGIN, size), + 1., + card.size() + ), + None + ); + } +} + +#[test] +fn real_scene_wide_latin_header_exceeds_old_character_budget() { + use iced::advanced::text::{self, Paragraph as _}; + let mut f = Fixture::new(Layer::Oa); + f.project.elements.get_mut(&f.receiver).unwrap().name = "W".repeat(18); + f.project.elements.get_mut(&f.work).unwrap().name = "W".repeat(24); + let scene = f.scene(); + let header = scene.boxes.iter().find(|b| b.id == f.receiver).unwrap(); + for (content, size, divisor) in [(&header.title, 13., 7.), (&header.detail, 11., 6.)] { + let label = iced::widget::canvas::Text { + content: crate::views::short(content, ((header.rect.width - 25.) / divisor) as usize), + size: size.into(), + ..Default::default() + }; + // Use the same real paragraph/font/shaping defaults as canvas Text. + // The native defect survives short(): glyph width, not scalar count, + // is what exceeds the card. This is a font witness, not a pixel gate. + let paragraph = ::Paragraph::with_text(text::Text { + content: label.content.as_str(), + bounds: Size::INFINITE, + size: label.size, + line_height: label.line_height, + font: label.font, + align_x: label.align_x, + align_y: label.align_y, + shaping: label.shaping, + wrapping: text::Wrapping::default(), + }); + let old_available = header.rect.width - 12.; + assert!( + paragraph.min_width() > old_available, + "wide glyph fixture must overflow the old unbounded card: {} <= {old_available}", + paragraph.min_width() + ); + } +} + +#[test] +fn birth_label_clip_keeps_padded_world_bounds_at_each_scene_scale() { + let capsule = Rectangle::new(Point::new(100., 200.), Size::new(140., 28.)); + for (scale, expected) in [ + ( + 0.05, + Rectangle::new(Point::new(5.4, 10.2), Size::new(6.2, 1.)), + ), + ( + 0.5, + Rectangle::new(Point::new(54., 102.), Size::new(62., 10.)), + ), + ( + 1., + Rectangle::new(Point::new(108., 204.), Size::new(124., 20.)), + ), + ( + 2., + Rectangle::new(Point::new(216., 408.), Size::new(248., 40.)), + ), + ] { + let clip = + birth_label_clip(iced::Vector::ZERO, capsule, scale, Size::new(1000., 1000.)).unwrap(); + for (actual, expected) in [ + (clip.x, expected.x), + (clip.y, expected.y), + (clip.width, expected.width), + (clip.height, expected.height), + ] { + assert!((actual - expected).abs() < 0.0001); + } + assert!(capsule.contains(Point::new(clip.x / scale, clip.y / scale))); + assert!(capsule.contains(Point::new( + (clip.x + clip.width) / scale, + (clip.y + clip.height) / scale, + ))); + } +} + +#[test] +fn birth_label_clip_preserves_parent_viewport_bounds() { + let capsule = Rectangle::new(Point::new(100., 200.), Size::new(140., 28.)); + assert_eq!( + birth_label_clip(iced::Vector::ZERO, capsule, 2., Size::new(300., 420.)), + Some(Rectangle::new(Point::new(216., 408.), Size::new(84., 12.))) + ); + let crossing_origin = Rectangle::new(Point::new(-20., -10.), Size::new(140., 28.)); + assert_eq!( + birth_label_clip( + iced::Vector::ZERO, + crossing_origin, + 2., + Size::new(300., 420.) + ), + Some(Rectangle::new(Point::ORIGIN, Size::new(224., 28.))) + ); + for viewport in [Size::new(200., 420.), Size::new(300., 400.), Size::ZERO] { + assert_eq!( + birth_label_clip(iced::Vector::ZERO, capsule, 2., viewport), + None + ); + } + for scale in [0., -1., f32::NAN, f32::INFINITY] { + assert_eq!( + birth_label_clip(iced::Vector::ZERO, capsule, scale, Size::new(1000., 1000.)), + None + ); + } +} + +#[test] +fn real_scene_empty_and_create_only_use_visible_root_extents_not_insertion_bounds() { + for layer in [Layer::Oa, Layer::Sa] { + let mut f = Fixture::new(layer); + let empty = f.scene(); + assert_eq!(empty.sequence_bounds[&f.owner], (106., 106.)); + assert_eq!( + intervals(&empty, f.receiver, f.owner), + vec![(85., empty.size.height - 20., Life::Alive)] + ); + assert!(empty.lines.is_empty(), "lane guides are not message lines"); + let create = f.message(f.owner, MessageKind::Create); + let scene = f.scene(); + let birth = scene.rows[&create].1; + assert_eq!(birth, 148.); + assert_eq!(scene.sequence_bounds[&f.owner], (106., 198.)); + assert_eq!( + intervals(&scene, f.receiver, f.owner), + vec![ + (85., birth, Life::Absent), + (birth, scene.size.height - 20., Life::Alive), + ] + ); + assert_eq!( + intervals(&scene, f.sender, f.owner), + vec![(85., scene.size.height - 20., Life::Alive)] + ); + assert_eq!(scene.slots[0].y, 106.); + assert_eq!( + scene.lane_at(Point::new(scene.lanes[&f.receiver], 90.)), + Some(f.receiver) + ); + } +} + +#[test] +fn real_scene_birth_death_markers_align_endpoints_and_win_selection_without_mutating_source() { + for layer in [Layer::Oa, Layer::Sa] { + let mut f = Fixture::new(layer); + let create = f.message(f.owner, MessageKind::Create); + f.occurrence( + f.owner, + "Work", + OccurrenceBody::Action { + action: Some(f.work), + lifeline: Some(f.receiver), + }, + ); + let delete = f.message(f.owner, MessageKind::Delete); + let mut scene = f.scene(); + let birth = scene.rows[&create].1; + let death = scene.rows[&delete].1; + assert_eq!( + intervals(&scene, f.receiver, f.owner), + vec![ + (85., birth, Life::Absent), + (birth, death, Life::Alive), + (death, scene.size.height - 20., Life::Absent), + ] + ); + let capsule = scene + .lifecycle + .markers + .iter() + .find(|m| m.event.occurrence == create) + .unwrap() + .capsule; + let line = scene.lines.iter().find(|l| l.id == create).unwrap(); + let expected_x = if scene.lanes[&f.sender] < scene.lanes[&f.receiver] { + capsule.x + } else { + capsule.x + capsule.width + }; + assert_eq!(line.points.last(), Some(&Point::new(expected_x, birth))); + assert!( + line.label_at.y + 22. < capsule.y, + "message caption clears birth capsule" + ); + let line = scene.lines.iter().find(|l| l.id == delete).unwrap(); + assert_eq!( + line.points.last(), + Some(&Point::new(scene.lanes[&f.receiver], death)) + ); + for scale in [0.5, 1., 2.] { + scene.scale = scale; + assert_eq!( + scene.hit(Point::new(scene.lanes[&f.receiver], birth)), + Some(create) + ); + assert_eq!( + scene.hit(Point::new(scene.lanes[&f.receiver], death)), + Some(delete) + ); + assert_eq!( + scene.hit(Point::new( + scene.lanes[&f.receiver], + scene.size.height - 25. + )), + Some(f.receiver) + ); + assert_eq!( + scene.hit(Point::new(scene.lanes[&f.receiver], 40.)), + Some(f.receiver) + ); + } + } +} + +#[test] +fn real_scene_branch_delete_clips_only_its_activation_and_keeps_unanswered_call_visible() { + for layer in [Layer::Oa, Layer::Sa] { + let mut f = Fixture::new(layer); + let call = f.message(f.owner, MessageKind::Call); + let fragment = f.fragment(f.owner, FragmentOperator::Alternative); + let left = f.branch(fragment); + let delete = f.message(left, MessageKind::Delete); + let right = f.branch(fragment); + let scene = f.scene(); + let death = scene.rows[&delete].1; + let (left_start, left_end) = scene.sequence_bounds[&left]; + let (right_start, _) = scene.sequence_bounds[&right]; + let bars: Vec<_> = scene + .activations + .iter() + .filter(|b| b.call == call && b.receiver == f.receiver) + .map(|b| b.rect) + .collect(); + assert!( + bars.iter() + .any(|r| r.y == left_start && r.y + r.height == death) + ); + assert!( + !bars + .iter() + .any(|r| r.y < left_end && r.y + r.height > death && r.y >= left_start) + ); + assert!( + bars.iter().any(|r| r.y == right_start && r.height == 26.), + "empty exclusive sibling retains its own open activation" + ); + assert_eq!( + intervals(&scene, f.receiver, right), + vec![(right_start, right_start + 26., Life::Alive)] + ); + let frame_end = scene.boxes.iter().find(|b| b.id == fragment).unwrap().rect; + assert!( + !bars.iter().any(|r| r.y >= frame_end.y + frame_end.height), + "uncertain post-fragment lifetime cannot carry a definite activation bar" + ); + assert!( + scene + .open_calls + .iter() + .any(|p| p.y < death && p.y > left_start) + ); + assert!(scene.open_calls.iter().any(|p| p.y > right_start)); + assert_eq!( + intervals(&scene, f.receiver, left), + vec![ + (left_start, death, Life::Alive), + (death, left_end, Life::Absent) + ] + ); + assert_eq!( + intervals(&scene, f.receiver, f.owner).last().unwrap().2, + Life::Unresolved + ); + assert!(!f.project.elements.values().any(|e| matches!( + e.shared(), + Some(SharedBody::Occurrence { + body: OccurrenceBody::Exchange { + message_kind: MessageKind::Reply, + .. + }, + .. + }) + ))); + } +} + +#[test] +fn real_scene_unassigned_lanes_and_explicit_incomplete_receiver_keep_real_marker_identity() { + for layer in [Layer::Oa, Layer::Sa] { + let mut f = Fixture::new(layer); + *f.project + .elements + .get_mut(&f.receiver) + .unwrap() + .shared_mut() + .unwrap() = SharedBody::Lifeline { represented: None }; + let create = f.message(f.owner, MessageKind::Create); + if let Some(SharedBody::Occurrence { + body: OccurrenceBody::Exchange { exchange, .. }, + .. + }) = f.project.elements.get_mut(&create).unwrap().shared_mut() + { + *exchange = None; + } + let scene = f.scene(); + assert!( + !scene.lanes.contains_key(&f.receiver), + "authoring eligibility remains separate" + ); + let x = scene.lifecycle.lanes[&f.receiver]; + assert_eq!(scene.lifecycle.markers[0].lifeline, f.receiver); + assert_eq!( + scene.hit(Point::new(x, scene.rows[&create].1)), + Some(create) + ); + assert_eq!(scene.hit(Point::new(x, 40.)), Some(f.receiver)); + assert_eq!( + scene.hit(Point::new(x, scene.size.height - 25.)), + Some(f.receiver) + ); + assert_eq!(scene.lane_at(Point::new(x, 90.)), None); + if let Some(SharedBody::Occurrence { + body: OccurrenceBody::Exchange { + receiver, exchange, .. + }, + .. + }) = f.project.elements.get_mut(&create).unwrap().shared_mut() + { + *receiver = None; + *exchange = Some(f.exchange); + } + let missing = f.scene(); + assert!( + missing.lifecycle.markers.is_empty(), + "do not infer receiver from global exchange" + ); + } +} + +#[test] +fn real_scene_minimum_zoom_marker_halos_do_not_steal_adjacent_capsule_or_header_hits() { + let mut f = Fixture::new(Layer::Sa); + *f.project + .elements + .get_mut(&f.receiver) + .unwrap() + .shared_mut() + .unwrap() = SharedBody::Lifeline { represented: None }; + let create = f.message(f.owner, MessageKind::Create); + let delete = f.message(f.owner, MessageKind::Delete); + for event in [create, delete] { + if let Some(SharedBody::Occurrence { + body: OccurrenceBody::Exchange { exchange, .. }, + .. + }) = f.project.elements.get_mut(&event).unwrap().shared_mut() + { + *exchange = None; + } + } + let mut scene = f.scene(); + let x = scene.lifecycle.lanes[&f.receiver]; + assert_eq!(scene.rows[&delete].1 - scene.rows[&create].1, 92.); + for scale in [0.05, 0.1, 0.5, 1., 2.] { + scene.scale = scale; + assert_eq!( + scene.hit(Point::new(x, scene.rows[&create].1)), + Some(create) + ); + assert_eq!( + scene.hit(Point::new(x, scene.rows[&delete].1)), + Some(delete) + ); + assert_eq!(scene.hit(Point::new(x, 40.)), Some(f.receiver)); + if scale <= 0.1 { + for offset in [-25., -15., 15., 25.] { + assert_eq!( + scene.hit(Point::new(x, scene.rows[&delete].1 + offset)), + Some(delete), + "a nearby death halo must beat an earlier message's wider tolerance" + ); + } + } + } +} + +#[test] +fn real_scene_minimum_zoom_near_ordinary_message_wins_over_lifecycle_halos() { + let mut f = Fixture::new(Layer::Sa); + f.message(f.owner, MessageKind::Create); + let ordinary = f.message(f.owner, MessageKind::Asynchronous); + f.message(f.owner, MessageKind::Delete); + let mut scene = f.scene(); + let x = (scene.lanes[&f.sender] + scene.lanes[&f.receiver]) / 2.; + for scale in [0.05, 0.1] { + scene.scale = scale; + assert_eq!( + scene.hit(Point::new(x, scene.rows[&ordinary].1 + 2.)), + Some(ordinary) + ); + } +} + +#[test] +fn real_scene_self_lifecycle_elbows_end_on_recorded_marker_rows() { + for layer in [Layer::Oa, Layer::Sa] { + for kind in [MessageKind::Create, MessageKind::Delete] { + let mut f = Fixture::new(layer); + let event = f.message(f.owner, kind); + if let Some(SharedBody::Occurrence { + body: + OccurrenceBody::Exchange { + exchange, sender, .. + }, + .. + }) = f.project.elements.get_mut(&event).unwrap().shared_mut() + { + *exchange = None; + *sender = Some(f.receiver); + } + let scene = f.scene(); + let marker = &scene.lifecycle.markers[0]; + let line = scene.lines.iter().find(|l| l.id == event).unwrap(); + assert_eq!(line.points.len(), 4); + assert_eq!(line.points[0].y, marker.center.y - 24.); + assert_eq!(line.points[3].y, marker.center.y); + assert_eq!( + line.points[3].x, + if marker.event.kind == MarkerKind::Birth { + marker.capsule.x + marker.capsule.width + } else { + marker.center.x + } + ); + assert!(line.points[1].x > marker.capsule.x + marker.capsule.width); + assert_eq!(scene.hit(marker.center), Some(event)); + } + } +} + +#[test] +fn real_scene_self_delete_caption_clears_the_preceding_action_box() { + let mut f = Fixture::new(Layer::Sa); + let action = f.occurrence( + f.owner, + "Finish work", + OccurrenceBody::Action { + action: Some(f.work), + lifeline: Some(f.receiver), + }, + ); + let delete = f.message(f.owner, MessageKind::Delete); + if let Some(SharedBody::Occurrence { + body: OccurrenceBody::Exchange { + exchange, sender, .. + }, + .. + }) = f.project.elements.get_mut(&delete).unwrap().shared_mut() + { + *exchange = None; + *sender = Some(f.receiver); + } + let scene = f.scene(); + let action = scene.boxes.iter().find(|b| b.id == action).unwrap(); + let line = scene.lines.iter().find(|l| l.id == delete).unwrap(); + assert!(line.label_at.y > action.rect.y + action.rect.height); + assert!(line.label_at.y + 22. < line.points[0].y); + assert_eq!(line.points[3].y, scene.rows[&delete].1); + assert_eq!( + scene + .slots + .iter() + .find(|s| s.slot.before == Some(delete)) + .unwrap() + .y, + scene.rows[&delete].1 - 42. + ); +} + +#[test] +fn real_scene_conditional_repeated_and_parallel_scopes_do_not_claim_definite_continuation() { + for operator in [ + FragmentOperator::Alternative, + FragmentOperator::Optional, + FragmentOperator::Loop, + FragmentOperator::Parallel, + ] { + let mut f = Fixture::new(Layer::Sa); + let fragment = f.fragment(f.owner, operator); + let first = f.branch(fragment); + let create = f.message(first, MessageKind::Create); + let scene = f.scene(); + assert_eq!(scene.lifecycle.markers[0].event.occurrence, create); + assert_eq!( + intervals(&scene, f.receiver, f.owner).first().unwrap().2, + Life::Unresolved + ); + assert_eq!( + intervals(&scene, f.receiver, f.owner).last().unwrap().2, + Life::Unresolved + ); + assert!( + scene + .lifecycle + .lifetimes + .iter() + .find(|l| l.lifeline == f.sender) + .unwrap() + .intervals + .iter() + .all(|i| i.life == Life::Alive) + ); + } +} + +#[test] +fn real_scene_lifecycle_edit_undo_redo_restores_exact_source_and_changed_geometry() { + for layer in [Layer::Oa, Layer::Sa] { + let mut f = Fixture::new(layer); + let create = f.message(f.owner, MessageKind::Create); + let mut document = f.document(); + let before = document.snapshot(); + let geometry = Scene::sequence(document.project(), f.owner, create).lifecycle; + let mut edited = document.project().elements[&create].clone(); + if let Some(SharedBody::Occurrence { + body: OccurrenceBody::Exchange { message_kind, .. }, + .. + }) = edited.shared_mut() + { + *message_kind = MessageKind::Asynchronous; + } + document + .execute(Command::EditElement(create, edited)) + .unwrap(); + let after = document.snapshot(); + let changed = Scene::sequence(document.project(), f.owner, create).lifecycle; + assert_ne!(geometry, changed); + assert!(changed.markers.is_empty()); + assert_ne!(before.bundle, after.bundle); + assert!(document.undo()); + assert_eq!(document.project(), &before.decoded.project); + assert_eq!(document.bundle(), &before.bundle); + assert_eq!( + Scene::sequence(document.project(), f.owner, create).lifecycle, + geometry + ); + assert!(!document.can_undo() && document.can_redo()); + assert!(document.redo()); + assert_eq!(document.project(), &after.decoded.project); + assert_eq!(document.bundle(), &after.bundle); + assert_eq!( + Scene::sequence(document.project(), f.owner, create).lifecycle, + changed + ); + assert!(!document.can_redo()); + } +} + +#[test] +fn panned_header_and_create_clips_use_screen_translation_and_actual_viewport() { + use crate::behavior::box_text_clip; + use iced::Vector; + let header = Rectangle::new(Point::new(100., 200.), Size::new(204., 70.)); + let capsule = Rectangle::new(header.position(), Size::new(140., 28.)); + let rect = |x, y, w, h| Rectangle::new(Point::new(x, y), Size::new(w, h)); + for (pan, scale, viewport, header_expected, birth_expected) in [ + ( + Vector::new(37., -41.), + 0.5, + Size::new(300., 400.), + rect(92., 63., 92., 27.), + rect(91., 61., 62., 10.), + ), + ( + Vector::new(37., -41.), + 1., + Size::new(300., 400.), + rect(147., 167., 153., 54.), + rect(145., 163., 124., 20.), + ), + ( + Vector::new(37., -41.), + 2., + Size::new(300., 400.), + rect(257., 375., 43., 25.), + rect(253., 367., 47., 33.), + ), + ( + Vector::new(-200., -400.), + 2., + Size::new(300., 100.), + rect(20., 16., 280., 84.), + rect(16., 8., 248., 40.), + ), + ( + Vector::new(-237., -411.), + 2., + Size::new(300., 100.), + rect(0., 5., 300., 95.), + rect(0., 0., 227., 37.), + ), + ] { + assert_eq!( + box_text_clip(pan, header, scale, viewport), + Some(header_expected) + ); + assert_eq!( + birth_label_clip(pan, capsule, scale, viewport), + Some(birth_expected) + ); + } + for pan in [ + Vector::new(1000., 1000.), + Vector::new(-1000., -1000.), + Vector::new(f32::NAN, 0.), + Vector::new(0., f32::INFINITY), + ] { + assert_eq!(box_text_clip(pan, header, 2., Size::new(300., 100.)), None); + assert_eq!( + birth_label_clip(pan, capsule, 2., Size::new(300., 100.)), + None + ); + } +} + +#[test] +fn real_scene_panned_zoomed_program_keeps_header_birth_and_death_hit_identity() { + use crate::{ + app::Message, + behavior::{ + SequenceInput, + scenario::{CanvasEvent, CanvasTool}, + }, + }; + use iced::{Vector, mouse, widget::canvas}; + for layer in [Layer::Oa, Layer::Sa] { + let mut f = Fixture::new(layer); + f.project.elements.get_mut(&f.receiver).unwrap().name = "界".repeat(24); + let create = f.message(f.owner, MessageKind::Create); + let delete = f.message(f.owner, MessageKind::Delete); + let document = f.document(); + let before = document.snapshot(); + for scale in [0.5, 1., 2.] { + for pan in [Vector::new(35., 40.), Vector::new(-35., -5.)] { + let mut scene = f.scene(); + scene.scale = scale; + scene.camera_pan = pan; + let context = crate::behavior::scenario::direct_tests::context(f.owner); + scene.interaction = Some((context, CanvasTool::Select, true)); + let header = scene.boxes.iter().find(|b| b.id == f.sender).unwrap(); + let targets = [ + (f.sender, header.rect.center()), + ( + create, + scene + .lifecycle + .markers + .iter() + .find(|m| m.event.occurrence == create) + .unwrap() + .center, + ), + ( + delete, + scene + .lifecycle + .markers + .iter() + .find(|m| m.event.occurrence == delete) + .unwrap() + .center, + ), + ]; + // Absolute widget origin models the outer layout/scroll translation; + // camera pan remains local screen units and must be subtracted once. + let bounds = Rectangle::new(Point::new(73., 119.), Size::new(2000., 1200.)); + for (expected, world) in targets { + let screen = + bounds.position() + pan + Vector::new(world.x * scale, world.y * scale); + assert!(bounds.contains(screen)); + let mut state = SequenceInput::default(); + let mut published = Vec::new(); + for event in [ + mouse::Event::CursorMoved { position: screen }, + mouse::Event::ButtonPressed(mouse::Button::Left), + mouse::Event::ButtonReleased(mouse::Button::Left), + ] { + if let Some(message) = canvas::Program::update( + &scene, + &mut state, + &canvas::Event::Mouse(event), + bounds, + mouse::Cursor::Available(screen), + ) + .and_then(|a| a.into_inner().0) + { + published.push(message); + } + } + assert!( + matches!(published.as_slice(), [Message::ScenarioCanvas(CanvasEvent::Select(actual_context, actual))] if *actual_context == context && *actual == expected), + "Pan/zoom must retain the typed hit identity" + ); + } + assert_eq!(scene.lifecycle, f.scene().lifecycle); + } + } + assert_eq!(document.project(), &before.decoded.project); + assert_eq!(document.bundle(), &before.bundle); + assert!(!document.can_undo() && !document.dirty()); + } +} diff --git a/harness/experiments/nested-lifecycle-union-20260912/source/crates/oa-desktop/src/behavior/scenario_lifecycle/union_tests.rs b/harness/experiments/nested-lifecycle-union-20260912/source/crates/oa-desktop/src/behavior/scenario_lifecycle/union_tests.rs new file mode 100644 index 00000000..86fa0cce --- /dev/null +++ b/harness/experiments/nested-lifecycle-union-20260912/source/crates/oa-desktop/src/behavior/scenario_lifecycle/union_tests.rs @@ -0,0 +1,489 @@ +use super::*; +use crate::behavior::scenario_activation::{Finish, Segment}; + +fn line(scene: &Scene, id: Id) -> &crate::behavior::Line { + scene.lines.iter().find(|line| line.id == id).unwrap() +} +fn segments(scene: &Scene, call: Id) -> Vec<&Segment> { + scene + .activations + .iter() + .filter(|a| a.call == call) + .collect() +} +fn assert_visible_lifetime(scene: &Scene) { + for a in &scene.activations { + assert_eq!( + scene + .lifecycle + .alive_spans(a.receiver, a.scope, a.rect.y, a.rect.y + a.rect.height), + vec![Span { + start: a.rect.y, + end: a.rect.y + a.rect.height + }] + ); + if let Finish::Reply(reply) = a.finish { + assert_eq!(a.rect.y + a.rect.height, line(scene, reply).points[0].y); + } + } +} + +#[test] +fn admitted_delayed_create_nested_calls_replies_delete_share_one_geometry_pipeline() { + for layer in [Layer::Oa, Layer::Sa] { + let mut f = Fixture::new(layer); + let birth = f.message(f.owner, MessageKind::Create); + let c1 = f.message(f.owner, MessageKind::Call); + let c2 = f.message(f.owner, MessageKind::Call); + let r2 = f.reply(f.owner, c2); + let r1 = f.reply(f.owner, c1); + let death = f.message(f.owner, MessageKind::Delete); + let scene = f.scene(); + assert_eq!(scene.activations.len(), 2); + for (call, reply, column) in [(c1, r1, 0), (c2, r2, 1)] { + let a = segments(&scene, call)[0]; + assert_eq!( + (a.receiver, a.scope, a.column, a.finish), + (f.receiver, f.owner, column, Finish::Reply(reply)) + ); + let received = *line(&scene, call).points.last().unwrap(); + let sent = line(&scene, reply).points[0]; + assert_eq!((a.rect.y, a.rect.y + a.rect.height), (received.y, sent.y)); + assert_eq!(received.x, sent.x); + assert!( + a.rect.y > scene.rows[&birth].1 && a.rect.y + a.rect.height < scene.rows[&death].1 + ); + } + assert_visible_lifetime(&scene); + assert!(scene.open_calls.is_empty()); + for event in [birth, death] { + assert_eq!( + scene.hit(Point::new(scene.lanes[&f.receiver], scene.rows[&event].1)), + Some(event) + ); + } + } +} + +#[test] +fn admitted_death_and_incomplete_later_reply_do_not_fabricate_an_answered_execution() { + for layer in [Layer::Oa, Layer::Sa] { + let mut f = Fixture::new(layer); + let call = f.message(f.owner, MessageKind::Call); + let death = f.message(f.owner, MessageKind::Delete); + let reply = f.reply(f.owner, call); + if let SharedBody::Occurrence { + body: OccurrenceBody::Exchange { + sender, exchange, .. + }, + .. + } = f + .project + .elements + .get_mut(&reply) + .unwrap() + .shared_mut() + .unwrap() + { + *sender = None; + *exchange = None; + } + let scene = f.scene(); + let a = segments(&scene, call)[0]; + assert_eq!(a.finish, Finish::Terminated(death)); + assert_eq!(a.rect.y + a.rect.height, scene.rows[&death].1); + assert!( + scene.boxes.iter().any(|b| b.id == reply), + "The incomplete reply remains a repairable card" + ); + assert_eq!(scene.open_calls.len(), 1); + assert_visible_lifetime(&scene); + } +} + +#[test] +fn admitted_self_lifecycle_and_self_call_keep_distinct_send_receive_rows() { + for layer in [Layer::Oa, Layer::Sa] { + let mut f = Fixture::new(layer); + let action = f.occurrence( + f.owner, + "Sender preparation", + OccurrenceBody::Action { + action: None, + lifeline: Some(f.sender), + }, + ); + let birth = f.message(f.owner, MessageKind::Create); + let call = f.message(f.owner, MessageKind::Call); + let reply = f.reply(f.owner, call); + let death = f.message(f.owner, MessageKind::Delete); + for event in [birth, call, reply, death] { + if let SharedBody::Occurrence { + body: + OccurrenceBody::Exchange { + sender, + receiver, + exchange, + .. + }, + .. + } = f + .project + .elements + .get_mut(&event) + .unwrap() + .shared_mut() + .unwrap() + { + *sender = Some(f.receiver); + *receiver = Some(f.receiver); + *exchange = None; + } + } + let scene = f.scene(); + let preparation = scene.boxes.iter().find(|b| b.id == action).unwrap(); + assert!(line(&scene, birth).label_at.y > preparation.rect.y + preparation.rect.height); + for event in [birth, death] { + let message = line(&scene, event); + assert_eq!(message.points[0].y, scene.rows[&event].1 - 24.); + assert_eq!(message.points.last().unwrap().y, scene.rows[&event].1); + assert_eq!( + scene.hit(Point::new(scene.lanes[&f.receiver], scene.rows[&event].1)), + Some(event) + ); + } + let activation = segments(&scene, call)[0]; + assert_eq!(activation.rect.y, scene.rows[&call].1 + 24.); + assert_eq!( + activation.rect.y, + line(&scene, call).points.last().unwrap().y + ); + assert_eq!( + activation.rect.y + activation.rect.height, + line(&scene, reply).points[0].y + ); + assert_eq!(activation.finish, Finish::Reply(reply)); + assert_visible_lifetime(&scene); + } +} + +#[test] +fn admitted_unresolved_operand_keeps_unanswered_cue_without_any_visible_segment() { + for layer in [Layer::Oa, Layer::Sa] { + let mut f = Fixture::new(layer); + let fragment = f.fragment(f.owner, FragmentOperator::Alternative); + let left = f.branch(fragment); + f.message(left, MessageKind::Create); + let right = f.branch(fragment); + let call = f.message(right, MessageKind::Call); + let scene = f.scene(); + assert!(segments(&scene, call).is_empty()); + assert!( + intervals(&scene, f.receiver, right) + .iter() + .all(|i| i.2 == Life::Unresolved) + ); + assert_eq!(scene.open_calls.len(), 1); + assert!(scene.open_calls[0].y > scene.rows[&call].1); + assert_eq!( + line(&scene, call).points.last().unwrap().x, + scene.lanes[&f.receiver] + ); + } +} + +#[test] +fn admitted_calls_without_sender_polylines_still_have_logical_correlation_metadata() { + for layer in [Layer::Oa, Layer::Sa] { + let mut f = Fixture::new(layer); + let c1 = f.message(f.owner, MessageKind::Call); + let c2 = f.message(f.owner, MessageKind::Call); + for call in [c1, c2] { + if let SharedBody::Occurrence { + body: + OccurrenceBody::Exchange { + sender, exchange, .. + }, + .. + } = f + .project + .elements + .get_mut(&call) + .unwrap() + .shared_mut() + .unwrap() + { + *sender = None; + *exchange = None; + } + } + let outgoing = f.occurrence( + f.owner, + "Outgoing", + OccurrenceBody::Exchange { + exchange: None, + sender: Some(f.receiver), + receiver: Some(f.sender), + message_kind: MessageKind::Asynchronous, + operation: None, + reply_to: None, + values: vec![], + }, + ); + f.reply(f.owner, c2); + f.reply(f.owner, c1); + let scene = f.scene(); + assert!(scene.boxes.iter().any(|b| b.id == c1)); + assert!(scene.boxes.iter().any(|b| b.id == c2)); + let inner = segments(&scene, c2)[0]; + let expected = if scene.lanes[&f.sender] > scene.lanes[&f.receiver] { + inner.rect.x + inner.rect.width + } else { + inner.rect.x + }; + assert_eq!(line(&scene, outgoing).points[0].x, expected); + } +} + +fn lifetime_rejected(f: &Fixture) { + assert!(validate_candidate(&f.project).is_err()); + assert!( + validation::validate(&f.project) + .iter() + .any(|issue| issue.severity == validation::Severity::Error + && issue.code == "lifeline_lifetime") + ); +} + +#[test] +fn invalid_prebirth_call_and_postdeath_reply_remain_rejected_with_defensive_scene_clipping() { + for layer in [Layer::Oa, Layer::Sa] { + for later_birth in [false, true] { + let mut f = Fixture::new(layer); + let call = f.message(f.owner, MessageKind::Call); + let death = f.message(f.owner, MessageKind::Delete); + if later_birth { + f.message(f.owner, MessageKind::Create); + } + let reply = f.reply(f.owner, call); + lifetime_rejected(&f); + // Deliberately bypass Document only for defensive renderer coverage + // of rejected data. This is not an admitted editing workflow. + let scene = Scene::sequence(&f.project, f.owner, f.owner); + assert!( + scene + .activations + .iter() + .all(|a| a.rect.y + a.rect.height <= scene.rows[&death].1) + ); + assert!( + scene + .activations + .iter() + .all(|a| a.finish != Finish::Reply(reply)) + ); + assert_eq!(line(&scene, reply).points[0].x, scene.lanes[&f.receiver]); + assert!(!scene.open_calls.is_empty()); + assert_visible_lifetime(&scene); + } + let mut f = Fixture::new(layer); + let call = f.message(f.owner, MessageKind::Call); + let birth = f.message(f.owner, MessageKind::Create); + let reply = f.reply(f.owner, call); + lifetime_rejected(&f); + let scene = Scene::sequence(&f.project, f.owner, f.owner); + assert_eq!(segments(&scene, call)[0].rect.y, scene.rows[&birth].1); + assert_eq!(segments(&scene, call)[0].finish, Finish::Reply(reply)); + assert_eq!( + line(&scene, call).points.last().unwrap().x, + scene.lanes[&f.receiver] + ); + assert_visible_lifetime(&scene); + } +} + +#[test] +fn conditional_death_then_recreate_never_revives_call_but_keeps_open_sibling() { + for layer in [Layer::Oa, Layer::Sa] { + let mut f = Fixture::new(layer); + f.message(f.owner, MessageKind::Create); + let call = f.message(f.owner, MessageKind::Call); + let fragment = f.fragment(f.owner, FragmentOperator::Alternative); + let left = f.branch(fragment); + let death = f.message(left, MessageKind::Delete); + let right = f.branch(fragment); + let rebirth = f.message(f.owner, MessageKind::Create); + let reply = f.reply(f.owner, call); + lifetime_rejected(&f); + let scene = Scene::sequence(&f.project, f.owner, f.owner); + let bars = segments(&scene, call); + assert!( + bars.iter() + .any(|a| a.scope == left && a.finish == Finish::Terminated(death)) + ); + assert!( + bars.iter().any(|a| a.scope == right + && a.rect.height == 26. + && a.finish == Finish::Continuation) + ); + assert!( + bars.iter() + .all(|a| a.rect.y + a.rect.height < scene.rows[&rebirth].1) + ); + assert!(!bars.iter().any(|a| a.finish == Finish::Reply(reply))); + assert_eq!(line(&scene, reply).points[0].x, scene.lanes[&f.receiver]); + assert_eq!( + scene.open_calls.len(), + 3, + "Terminated, open sibling and uncertain parent cues survive" + ); + assert_visible_lifetime(&scene); + } +} + +#[test] +fn clipped_operand_preserves_original_nested_or_crossed_correlation_distinction() { + for layer in [Layer::Oa, Layer::Sa] { + for nested in [false, true] { + let mut f = Fixture::new(layer); + f.message(f.owner, MessageKind::Create); + let c1 = f.message(f.owner, MessageKind::Call); + let c2 = f.message(f.owner, MessageKind::Call); + let fragment = f.fragment(f.owner, FragmentOperator::Alternative); + let left = f.branch(fragment); + f.message(left, MessageKind::Delete); + let right = f.branch(fragment); + let outgoing = f.occurrence( + right, + "Outgoing", + OccurrenceBody::Exchange { + exchange: None, + sender: Some(f.receiver), + receiver: Some(f.sender), + message_kind: MessageKind::Asynchronous, + operation: None, + reply_to: None, + values: vec![], + }, + ); + let r1 = f.reply(f.owner, if nested { c2 } else { c1 }); + let r2 = f.reply(f.owner, if nested { c1 } else { c2 }); + lifetime_rejected(&f); + let scene = Scene::sequence(&f.project, f.owner, f.owner); + let send = line(&scene, outgoing).points[0]; + let expected = if nested { + let inner = segments(&scene, c2) + .into_iter() + .find(|a| a.scope == right) + .unwrap(); + if scene.lanes[&f.sender] > scene.lanes[&f.receiver] { + inner.rect.x + inner.rect.width + } else { + inner.rect.x + } + } else { + scene.lanes[&f.receiver] + }; + assert_eq!(send.x, expected); + for call in [c1, c2] { + assert!(segments(&scene, call).iter().any(|a| a.scope == right + && a.rect.y <= send.y + && send.y < a.rect.y + a.rect.height)); + } + assert!(scene.rows[&r1].1 < scene.rows[&r2].1); + assert_visible_lifetime(&scene); + } + } +} + +fn with_offset(id: Id, offset: f32, f: impl FnOnce() -> T) -> T { + struct Restore(BTreeMap); + impl Drop for Restore { + fn drop(&mut self) { + TEST_ROW_OFFSETS.with(|current| *current.borrow_mut() = std::mem::take(&mut self.0)); + } + } + let _restore = + Restore(TEST_ROW_OFFSETS.with(|current| current.replace(BTreeMap::from([(id, offset)])))); + f() +} +fn snapshot(scene: &Scene) -> String { + format!( + "{:?}", + ( + &scene.lifecycle, + &scene.activations, + &scene.open_calls, + &scene.rows, + &scene.sequence_bounds, + scene + .lines + .iter() + .map(|l| (l.id, &l.points, &l.label, l.label_at, l.dashed)) + .collect::>(), + scene + .boxes + .iter() + .map(|b| (b.id, b.rect, &b.title, &b.detail, b.marker)) + .collect::>(), + scene + .slots + .iter() + .map(|s| (s.slot, s.y, &s.label)) + .collect::>(), + scene.size, + ) + ) +} + +#[test] +fn test_only_upstream_row_offsets_update_lifetime_segments_and_endpoints_without_authoring() { + for layer in [Layer::Oa, Layer::Sa] { + let mut f = Fixture::new(layer); + let birth = f.message(f.owner, MessageKind::Create); + let c1 = f.message(f.owner, MessageKind::Call); + let c2 = f.message(f.owner, MessageKind::Call); + f.reply(f.owner, c2); + f.reply(f.owner, c1); + let death = f.message(f.owner, MessageKind::Delete); + let document = f.document(); + let before = document.snapshot(); + let baseline = Scene::sequence(document.project(), f.owner, c1); + let moved = with_offset(birth, 60., || { + Scene::sequence(document.project(), f.owner, c1) + }); + assert_eq!(moved.rows[&birth].1, baseline.rows[&birth].1 + 60.); + assert_eq!(moved.rows[&death].1, baseline.rows[&death].1 + 60.); + for (a, b) in baseline.activations.iter().zip(&moved.activations) { + assert_eq!( + (a.call, a.receiver, a.scope, a.column, a.finish), + (b.call, b.receiver, b.scope, b.column, b.finish) + ); + assert_eq!( + b.rect, + Rectangle::new( + a.rect.position() + iced::Vector::new(0., 60.), + a.rect.size() + ) + ); + } + assert_eq!(baseline.activations.len(), moved.activations.len()); + assert_visible_lifetime(&moved); + let reparsed = language::parse(&language::format(document.project())).unwrap(); + assert_eq!(reparsed, *document.project()); + assert_eq!( + snapshot(&moved), + with_offset(birth, 60., || snapshot(&Scene::sequence( + &reparsed, f.owner, c1 + ))) + ); + assert_eq!( + snapshot(&baseline), + snapshot(&Scene::sequence(document.project(), f.owner, c1)) + ); + assert_eq!(document.project(), &before.decoded.project); + assert_eq!(document.bundle(), &before.bundle); + assert_eq!(document.revision(), 0); + assert!(!document.dirty() && !document.can_undo() && !document.can_redo()); + } +} diff --git a/harness/experiments/nested-lifecycle-union-20260912/tools/archive-lifecycle-union-f6595eb.py b/harness/experiments/nested-lifecycle-union-20260912/tools/archive-lifecycle-union-f6595eb.py new file mode 100644 index 00000000..74405293 --- /dev/null +++ b/harness/experiments/nested-lifecycle-union-20260912/tools/archive-lifecycle-union-f6595eb.py @@ -0,0 +1,223 @@ +"""Archive f659 source evidence, or verify it; never stage, apply, build, or commit. + +From repository root: + python .local/archive-lifecycle-union-f6595eb.py create + python .local/archive-lifecycle-union-f6595eb.py verify + # After the integration owner stages the archive: + python .local/archive-lifecycle-union-f6595eb.py verify-index + +The archived tools/ copy supports the same commands from repository root. +Creation refuses overwrite. A failed partial archive is retained for diagnosis. +""" +from pathlib import Path, PurePosixPath +from datetime import datetime, timezone +import argparse +import hashlib +import json +import subprocess + +BASE = 'd61f1f38779ab70a77efcde523ae31c432aefcfd' +SOURCE = 'f6595ebf66e88ec42c37b5c1a3c014f5e52cb32d' +PREFIX = 'harness/experiments/nested-lifecycle-union-20260912' +SCRIPT_NAME = 'archive-lifecycle-union-f6595eb.py' +PATCH_PATH = 'patches/d61f1f3-to-f6595eb.patch' +FILES = { + 'crates/oa-desktop/src/behavior.rs': ('0a0c4df479ff1c46f935735e508144ca2ec3052f', 133741), + 'crates/oa-desktop/src/behavior/scenario_activation.rs': ('88fa4d6e861fc96f4dc5497088cd9119cf25e151', 17694), + 'crates/oa-desktop/src/behavior/scenario_lifecycle.rs': ('6fe044890864ecf3095d0fedf590104f6121abf7', 9348), + 'crates/oa-desktop/src/behavior/scenario_lifecycle/render.rs': ('989fb2d5b173fc68e50705f8d406f7786ba9c979', 14820), + 'crates/oa-desktop/src/behavior/scenario_lifecycle/render_tests.rs': ('e0d9ee812a49fb1f8b24b0e9e460e08cd42aa34f', 35358), + 'crates/oa-desktop/src/behavior/scenario_lifecycle/union_tests.rs': ('86fa0cceff11ff66497c3514e43659a0ca003a52', 18024), +} +NOTES = { + 'source-handoff.md': ('.local/nested-lifecycle-union-handoff-20260912.md', 8668, + '2c28f4ffca8e84626cf4bf7580504a008fe971dda7eb0e9b83d94695bcb42410'), + 'independent-review.md': ('.local/nested-lifecycle-union-independent-review-20260912.md', 9736, + '3b5b116ca7a15f2b5bac313fab9a91966e2fa64f75cc7fc4509332208dd8f29c'), +} +README = '''# Nested lifecycle / typed activation source union + +Source: `f6595ebf66e88ec42c37b5c1a3c014f5e52cb32d`. +Base: `d61f1f38779ab70a77efcde523ae31c432aefcfd`. + +- [Source handoff](source-handoff.md) +- [Independent source review](independent-review.md) +- [Exact committed source snapshot](source/crates/oa-desktop/src/behavior.rs) +- [Full-index binary Git patch](patches/d61f1f3-to-f6595eb.patch) +- [Payload manifest](manifest.json) +- [Archive/verification helper](tools/archive-lifecycle-union-f6595eb.py) + +The six source files are extracted from committed Git blobs; they are evidence, +not an additional production tree. Notes retain their original bytes, including +historical local paths and source-scoped statements. The manifest lists portable +archive-relative paths plus original source provenance. It does not claim tests, +native acceptance, import, or publication succeeded. Subsequent gates remain +separate source-identified records owned by the integration owner. + +From repository root, run the helper with `verify` to compare payload bytes, +manifest metadata, source blobs and regenerated patch. After owner-controlled +staging, run `verify-index` to additionally compare every payload and manifest +with Git index blobs. Neither mode stages or rewrites files. If Git attributes +normalize archived bytes, index verification fails; the owner must resolve that +explicitly. No patch is applied by this helper. +'''.encode('utf-8') + + +def require(condition, message): + if not condition: + raise RuntimeError(message) + + +def git(root, *args, data=None): + return subprocess.run(['git', '--no-pager', *args], cwd=root, input=data, + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + check=True).stdout + + +def digest(raw): + return {'bytes': len(raw), 'sha256': hashlib.sha256(raw).hexdigest()} + + +def safe_path(base, relative): + parts = PurePosixPath(relative) + require(not parts.is_absolute() and '..' not in parts.parts and '\\' not in relative, + f'Unsafe relative path: {relative}') + path = base.joinpath(*parts.parts) + require(path.resolve().is_relative_to(base.resolve()), f'Path escapes archive: {relative}') + for ancestor in [path, *path.parents]: + require(not ancestor.is_symlink(), f'Symlinks are not archive evidence: {ancestor}') + if ancestor == base: + break + return path + + +def committed_payloads(root): + require(git(root, 'cat-file', '-t', SOURCE).strip() == b'commit', 'Source is not a commit') + require(git(root, 'cat-file', '-t', BASE).strip() == b'commit', 'Base is not a commit') + require(git(root, 'rev-parse', SOURCE + '^').decode().strip() == BASE, + 'Source parent differs from reviewed base') + changed = git(root, 'diff', '--no-ext-diff', '--no-textconv', '--name-only', '-z', + BASE, SOURCE, '--').decode().rstrip('\0').split('\0') + require(set(changed) == set(FILES) and len(changed) == len(FILES), + 'Commit delta differs from the reviewed six files') + payloads = {} + for path, (oid, size) in FILES.items(): + actual = git(root, 'rev-parse', f'{SOURCE}:{path}').decode().strip() + require(actual == oid, f'Unexpected committed blob: {path}') + require(git(root, 'cat-file', '-t', oid).strip() == b'blob', path) + require(int(git(root, 'cat-file', '-s', oid)) == size, path) + raw = git(root, 'cat-file', 'blob', oid) + require(len(raw) == size, f'Incomplete cat-file data: {path}') + require(git(root, 'hash-object', '--stdin', data=raw).decode().strip() == oid, + f'Git object identity mismatch: {path}') + payloads['source/' + path] = (raw, { + 'kind': 'committed-source', 'source_commit': SOURCE, + 'source_path': path, 'git_blob': oid, + }) + # All changed paths are enforced above; full repository diff retains binary, + # executable-mode, rename and new-file metadata. No working-tree diff is read. + patch = git(root, 'diff', '--binary', '--full-index', '--no-renames', + '--diff-algorithm=myers', '--no-indent-heuristic', '--unified=3', + '--inter-hunk-context=0', '--no-ext-diff', '--no-textconv', + '--no-color', '--src-prefix=a/', '--dst-prefix=b/', BASE, SOURCE, '--') + require(patch.startswith(b'diff --git '), 'Missing binary Git patch') + payloads[PATCH_PATH] = (patch, {'kind': 'git-binary-patch', + 'base_commit': BASE, 'source_commit': SOURCE}) + return payloads + + +def expected_paths(): + return {'source/' + p for p in FILES} | set(NOTES) | { + PATCH_PATH, 'README.md', 'tools/' + SCRIPT_NAME, + } + + +def verify(root, destination, index=False): + manifest_raw = safe_path(destination, 'manifest.json').read_bytes() + manifest = json.loads(manifest_raw) + require(manifest['schema'] == 1 and manifest['source_commit'] == SOURCE + and manifest['base_commit'] == BASE and manifest['archive_path'] == PREFIX, + 'Manifest provenance mismatch') + rows = manifest['files'] + require({r['path'] for r in rows} == expected_paths() + and len(rows) == len(expected_paths()), 'Manifest payload list mismatch') + actual = {p.relative_to(destination).as_posix() for p in destination.rglob('*') + if p.is_file() or p.is_symlink()} + require(actual == expected_paths() | {'manifest.json'}, 'Unexpected/missing archive file') + committed = committed_payloads(root) + for row in rows: + path = safe_path(destination, row['path']) + raw = path.read_bytes() + require(digest(raw) == {k: row[k] for k in ('bytes', 'sha256')}, + f'Payload digest mismatch: {path}') + if row['path'] in committed: + expected, metadata = committed[row['path']] + require(raw == expected, f'Committed bytes/patch mismatch: {path}') + require(all(row.get(k) == v for k, v in metadata.items()), f'Provenance mismatch: {path}') + elif row['path'] in NOTES: + origin, size, sha = NOTES[row['path']] + require(digest(raw) == {'bytes': size, 'sha256': sha} + and row['source_path'] == origin, f'Approved note changed: {path}') + elif row['path'] == 'README.md': + require(raw == README, 'Archive navigation changed') + if index: + indexed = git(root, 'cat-file', 'blob', ':' + PREFIX + '/' + row['path']) + require(indexed == raw, f'Git index bytes differ: {path}') + if index: + require(git(root, 'cat-file', 'blob', ':' + PREFIX + '/manifest.json') == manifest_raw, + 'Git index manifest differs') + print(f'PASS {len(rows)} payloads: manifest, workspace, committed source and patch' + + ('; payloads and manifest also match Git index' if index else '')) + + +def create(root, destination): + require(not destination.exists() and not destination.is_symlink(), + f'Refusing to overwrite existing archive: {destination}') + payloads = committed_payloads(root) + # Preflight every approved local input and gather all bytes before creating anything. + for target, (origin, size, sha) in NOTES.items(): + raw = safe_path(root, origin).read_bytes() + require(digest(raw) == {'bytes': size, 'sha256': sha}, f'Approved note changed: {origin}') + payloads[target] = (raw, {'kind': 'source-review-record', 'source_path': origin, + 'reviewed_source_commit': SOURCE}) + payloads['README.md'] = (README, {'kind': 'archive-navigation'}) + payloads['tools/' + SCRIPT_NAME] = (Path(__file__).read_bytes(), { + 'kind': 'archive-helper', 'source_path': '.local/' + SCRIPT_NAME, + }) + require(set(payloads) == expected_paths(), 'Internal payload list mismatch') + manifest = { + 'schema': 1, 'archive_path': PREFIX, 'base_commit': BASE, 'source_commit': SOURCE, + 'created_utc': datetime.now(timezone.utc).isoformat(), + 'evidence_scope': 'Committed source and source-only review; no combined test/native pass asserted', + 'files': [{'path': path, **metadata, **digest(raw)} + for path, (raw, metadata) in sorted(payloads.items())], + } + destination.mkdir(parents=False, exist_ok=False) + for relative, (raw, _) in sorted(payloads.items()): + target = safe_path(destination, relative) + target.parent.mkdir(parents=True, exist_ok=True) + with target.open('xb') as stream: + stream.write(raw) + with (destination / 'manifest.json').open('xb') as stream: + stream.write((json.dumps(manifest, indent=2) + '\n').encode('utf-8')) + verify(root, destination) + print(f'Created {PREFIX}; not staged, applied, tested, integrated or published') + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('mode', choices=('create', 'verify', 'verify-index')) + parser.add_argument('--repo', type=Path, default=Path.cwd()) + args = parser.parse_args() + root = Path(git(args.repo.resolve(), 'rev-parse', '--show-toplevel').decode().strip()).resolve() + destination = safe_path(root, PREFIX) + require(destination.parent.is_dir(), 'Existing harness/experiments directory required') + if args.mode == 'create': + create(root, destination) + else: + require(destination.is_dir(), 'Archive does not exist') + verify(root, destination, index=args.mode == 'verify-index') + + +if __name__ == '__main__': + main() diff --git a/harness/experiments/resize-port-policy-20260912/interval-design-critique.md b/harness/experiments/resize-port-policy-20260912/interval-design-critique.md new file mode 100644 index 00000000..f9294825 --- /dev/null +++ b/harness/experiments/resize-port-policy-20260912/interval-design-critique.md @@ -0,0 +1,93 @@ +# Independent critique of interval-first port placement — 2026-09-12 + +Scope: fresh design/source review of `.local/resize-port-policy-revision-design-20260912.md`, prior independent review, actual `.local/native-qa/resize-falsifiers-a95-01/case-1.log` and `case-2.log`, their run receipt, and experimental projection/port-layout/router source. No implementation, compiler, native interaction or Gitea posts. This report is the only reviewer-written file. Root owns all other concurrent changes. + +## Judgment + +**Proceed with the isolated stable-ranking attribution control already assigned. A flat, common-obstacle interval experiment is justified next, but the evidence does not select interval-first as the general policy over bounded position-aware repair.** Both need a correct placement witness; scalar common capacities stop being an adequate model once edge-specific ancestor exceptions matter. Neither nominal gap nor deterministic identities is an ergonomic stability guarantee. + +The original `7e25b3d` policy remains rejected. The executed `a95db10` cases actually failed their intended criteria: 12/20 side changes at 259.9→260, and the added Top stub/NoClearPath failure. The logs also preserve the controls' limitations: Current height568 instead of259.9, and spacing-only gap11.78421. These observations do not establish a winning alternative. + +The revision correctly rejects midpoint-only clearance and side-only repair, preserves frozen owner bounds, separates shadow assignment from manual overrides, and avoids routing feedback. Its near-corner shifted-position witness is useful. The following are concrete remaining challenges, not claims that the unimplemented candidate already fails. + +## 1. A common interval capacity is exact only for genuinely common legal sets + +Source boundary: `routing.rs:627–647` constructs obstacles per edge from the ancestors of **both** endpoint owners. `:739–747` excludes only the source owner from its source-stub test and only the target owner from its target-stub test. Port identity alone does not determine an obstacle's full-rectangle versus header treatment. + +Source-derived nested witness, using frozen projected rectangles: + +| Object | Rectangle / role | +| --- | --- | +| A | Owner at (0,0), 224×160 | +| P | Separate visible compound at (230,−120), 400×440 | +| B | Visible child of P at (260,70), 184×132 | +| C | Distant external left peer, outside P | +| Ports a1…a4 | A ports connected to B | +| Port z | A port connected to C | + +For a1…a4, P is a target ancestor: its ordinary 64-unit header inflated by12 ends at y−44. P therefore does not block their Right stubs at y18…142. B's inflated left boundary248 is beyond their stub endpoint x242. Four Right positions18,59⅓,100⅔,142 are a nominal-gap witness. + +For z, P is not an endpoint ancestor. Its inflated full rectangle starts at x218 and spans y−132…332, blocking every Right stub. A Left placement for z remains available. + +A shared legal-set **intersection** across all five ports declares Right unusable despite the four clear Right placements. A shared **union** incorrectly grants z the same positions. Adding one external port can thus erase useful capacity for every internal-target port under the conservative common policy. Exact typed projection and routes still need execution; these are supplied projected-geometry premises, not a claim that arbitrary authored rectangles survive enclosure unchanged. + +Decision implication: using the intersection is safe as a conservative flat experiment, with explicit unresolved classification, but cannot justify “insufficient usable border capacity” for the actual model or routine migration of all four ports. An unaffected-side/port-aware repair could retain them while dealing with z. The proposal's acknowledged per-port limit is therefore a practical competing-candidate discriminator, not only a theoretical matcher extension. + +For one port with several incident edges, intersect its legal sets across those edges first: a single geometric port must serve all of them. Do not intersect different ports' sets and then present the resulting count as their true capacity. + +## 2. Capacity witnesses cannot be fed back through the old independent interval spread + +Source: `projection/port_layout.rs:336` onward currently sums capacities and allocates counts proportionally before spreading independently within each interval. Anchor exclusions make sufficiently wide gaps between its original intervals; arbitrary obstacle cuts remove that protection. + +Minimal pure interval witness at gap28: + +- Legal union: [18,46] ∪ [48,76]. +- Summed independent capacities:2+2=4, but four points cannot fit in the total58-unit span at minimum gap28. +- Global earliest-legal packing yields three valid points18,46,74. +- Even if a new capacity helper correctly returns3, the old proportional allocation chooses2+1 and spreads to18,46,62. The cross-gap separation is16. Choosing1+2 gives32,48,76 and the same defect. + +Thus both **count and final witness placement** must change together. “Distribute remaining slack” is not harmless postprocessing. Every adjusted point must remain legal and every adjacent pair, including pairs in different intervals, must meet the selected gap. Earliest-legal packing is an exact maximum-count method for identical legal unions and equal separation: choosing an earlier feasible first point cannot reduce room for later points. That argument does not transfer automatically to independently restricted ports. + +Per-port order also needs an honest boundary. If stable order is p then q, p permits only[80,108] and q only[18,46], no placement preserves that order; q=18,p=80 is feasible if reordering is allowed. A common count or unordered feasibility witness cannot prove feasibility under the existing peer-coordinate/ID order. Record “unresolved under preserved order” rather than equating it with geometric impossibility. No general matching implementation is required to expose this distinction. + +## 3. Fixed identity ranking leaves two independent churn mechanisms + +### Primary preference threshold + +Actual `port_layout.rs:59–76` compares normalized center displacement. With owner (0,0), width224, six neutral ports connected to one far peer centered at(2000,2000), compare height223.9→224.0→224.1. + +At223.9, normalized dy is greater than dx, so every port prefers Bottom. At224, equality chooses Right. Both relevant sides have seven nominal slots on both sides of this threshold; there is no scarcity. Six ports can therefore switch sides at once for0.1 height, for **any** chosen stable UUID set. Fixed fallback ranks never participate. + +This is not a defect in the proposed identity mixer. It disproves treating stable ranks as a general resize-stability result. Retain the hard-preference threshold as an explicit ergonomic candidate decision; compare displacement and actual route/readability before deciding its benefit warrants the collective move. + +### Gap-tier reset + +The revision proposes trying28 across sides before14 but does not fully define whether a failed nominal allocation restarts the whole owner at14. That natural implementation creates another analytic falsifier: + +-17 ports all prefer Right; only Left and Right have clear legal intervals. +-Width224; heights259.9 and260.0 are above the neutral semantic/content minimum for17 ports. +-At259.9, nominal capacities are8+8, insufficient for17. At14 they are16+16, so preferred-first assignment is16Right/1Left. +-At260, nominal capacities become9+9, and the whole-owner nominal retry assigns9Right/8Left. +-Result: seven ports move away from the preferred side when the owner becomes0.1 taller, independent of fixed-ID fallback ranking. + +This can be represented by clear vertical sides and fully blocked Top/Bottom corridors; use actual frozen projection and stub checks to establish that premise in a model fixture. A different tier policy may avoid the prediction. **Define that policy before attributing a passing result to intervals.** Per-side or localized degradation, or preserving a near28 spread for the extra port, are competing small policies to measure, not recommendations to add state or a general optimizer. + +The inherited28 target is not itself a user-authored priority above all side stability. The executed eight-port spacing-only control already has17.71428 centers, clear exits and stable preferred sides. Its glyph/label readability still needs inspection, but it is a meaningful control against scattering across the owner simply to exceed28. Treat the28-before14 ordering as an experimental choice. + +## 4. Manual overrides and exact router semantics are hard boundaries + +The proposed shadow contract is sound: compute shadow sides without authored side/fraction overrides, then place manual ports exactly and repack only automatic positions within their existing sides. An anchor edit must not influence a conservative “common interval” cache, side count or repair order that changes unrelated automatic sides. + +Use an explicit scarcity check: one automatic port's chosen side has a narrow clear interval around80; a manual anchor is moved to80. If the required exclusion consumes the interval, retain exact manual metadata and the automatic side and report the actual conflict. Silently dropping the obstacle restriction, using the legacy emergency evenly-spaced fallback, changing the automatic side or growing the owner would violate one of the stated boundaries. The current `automatic_positions` emergency return below gap0.001 does not accept obstacle intervals; it must not silently become the final obstacle-aware fallback. + +Sharing the router's pure effective-obstacle logic is preferable to another geometric interpretation. Include EPSILON0.001 and strict boundary comparisons (`routing.rs:335–353`), source/target owner exclusion, the64-unit ordinary header, and the dedicated state header rule. Full visible rectangles are insufficient. Port geometry must still consume eligible edges **before** presentation filtering (`projection.rs:547`); a hidden exchange must not change side assignment. Folded descendants disappear before layout; promoted endpoints may no longer have a semantic port; dedicated state views bypass this layout. Preserve these exact stage boundaries without importing route search or occupied-path cost into projection. + +## Smallest decision-producing next checks + +1. Complete the already assigned stable-ranking attribution against the two frozen failures. Add the six-port diagonal preference and17-port tier examples as bounded policy falsifiers once the tier behavior is explicit; do not replace their criteria with determinism alone. +2. Before integrating obstacle intervals, verify the three-point cross-gap witness and final placement checks, including open/boundary tolerance and a manual exclusion that consumes all legal space. Carry the accepted witness into final projection. +3. Compare interval-first and a narrowly described position-aware repair on the already proposed near-corner scene; both should keep five clear nominal-gap Right ports. Then use the nested a1…a4/z witness to determine whether a common-capacity model is too conservative for the intended scope. Do not implement two complete frameworks merely for symmetry. +4. Preserve the exact route rule boundary with a compact filtered/unfiltered and folded/unfolded pair, plus one mixed-ancestor port. Check actual ProjectedView nodes/endpoints first, then every relevant mandatory stub. Escalate to matching only if these executed fixtures expose a useful layout the bounded representation cannot provide. + +Bounds/source/manual identity, final glyph gaps, blocked stubs, route warnings and adjacent-frame side/position displacement are sufficient immediate outputs. Broader route/label/native eight-handle acceptance remains root-owned and is still necessary before adoption. No revised production policy, expanded format specification or issue closure is endorsed here. + diff --git a/harness/experiments/resize-port-policy-20260912/manifest.json b/harness/experiments/resize-port-policy-20260912/manifest.json index ee2fcb26..0022fa5f 100644 --- a/harness/experiments/resize-port-policy-20260912/manifest.json +++ b/harness/experiments/resize-port-policy-20260912/manifest.json @@ -363,5 +363,104 @@ "file": "falsifiers.patch", "bytes": 15413, "sha256": "16d70dca93b8dafabe1b522b6d53a90cb5b6aa4df1c3ad4db167f06189c7f433" + }, + { + "file": "revision-design.md", + "bytes": 25464, + "sha256": "5bb7fc3057365700e782f30c982d2b51899c1986984398d4db54f0bf35976c17" + }, + { + "file": "interval-design-critique.md", + "bytes": 12022, + "sha256": "10c01c424ff8cf78ec4592760ed5a93b64a26ad3c393dffb85d6068432449c56" + }, + { + "file": "stable-ranking-independent-review.md", + "bytes": 5594, + "sha256": "3a07be95b877a54f8c92de4bcdbc342e9267fa1b9f6b655168bce04b42bbd82e" + }, + { + "file": "stable-ranking/source/crates/oa-core/src/projection.rs", + "bytes": 22168, + "sha256": "5db6aebe98aaec0c8990dec1e4cb8897b63a35954c75510a60fabb992d90fe5b", + "source_path": ".local/resize-port-stable-ranking-20260912/crates/oa-core/src/projection.rs", + "git_blob": "6203b5c4c0cc8bd736196aa4744dccfc0e139a2a:crates/oa-core/src/projection.rs", + "contribution_commit": "6203b5c4c0cc8bd736196aa4744dccfc0e139a2a", + "execution_status": "source-only; runner and tests unrun", + "policy_accepted": false + }, + { + "file": "stable-ranking/source/crates/oa-core/src/projection/port_layout.rs", + "bytes": 15323, + "sha256": "653f345c09db576c8b859bd6797739beec82216204706eb49b2427b3b7a7d0a9", + "source_path": ".local/resize-port-stable-ranking-20260912/crates/oa-core/src/projection/port_layout.rs", + "git_blob": "6203b5c4c0cc8bd736196aa4744dccfc0e139a2a:crates/oa-core/src/projection/port_layout.rs", + "contribution_commit": "6203b5c4c0cc8bd736196aa4744dccfc0e139a2a", + "execution_status": "source-only; runner and tests unrun", + "policy_accepted": false + }, + { + "file": "stable-ranking/source/crates/oa-core/src/projection/port_capacity_experiment.rs", + "bytes": 9541, + "sha256": "9d0fc16092fcc446e29110cb838969b134066c61cdeb50f5242fea8df32df7a3", + "source_path": ".local/resize-port-stable-ranking-20260912/crates/oa-core/src/projection/port_capacity_experiment.rs", + "git_blob": "6203b5c4c0cc8bd736196aa4744dccfc0e139a2a:crates/oa-core/src/projection/port_capacity_experiment.rs", + "contribution_commit": "6203b5c4c0cc8bd736196aa4744dccfc0e139a2a", + "execution_status": "source-only; runner and tests unrun", + "policy_accepted": false + }, + { + "file": "stable-ranking/source/crates/oa-core/tests/experimental_port_policy_falsifiers.rs", + "bytes": 22146, + "sha256": "a70368362c2e1d64c89afa78b0ae0bd3b7c19b88709ee34e0e383558787f160d", + "source_path": ".local/resize-port-stable-ranking-20260912/crates/oa-core/tests/experimental_port_policy_falsifiers.rs", + "git_blob": "6203b5c4c0cc8bd736196aa4744dccfc0e139a2a:crates/oa-core/tests/experimental_port_policy_falsifiers.rs", + "contribution_commit": "6203b5c4c0cc8bd736196aa4744dccfc0e139a2a", + "execution_status": "source-only; runner and tests unrun", + "policy_accepted": false + }, + { + "file": "stable-ranking.patch", + "bytes": 16092, + "sha256": "f9b0e925fffacef74eabed1ee83febf999a7d95d70b5d356264755e96d521afe", + "source_command": [ + "git", + "diff", + "--binary", + "--full-index", + "a95db10ce73d639f59eb1ec1153de26f4967881c", + "6203b5c4c0cc8bd736196aa4744dccfc0e139a2a" + ], + "base_commit": "a95db10ce73d639f59eb1ec1153de26f4967881c", + "contribution_commit": "6203b5c4c0cc8bd736196aa4744dccfc0e139a2a", + "execution_status": "source-only; runner and tests unrun", + "policy_accepted": false + }, + { + "file": "stable-ranking/source-handoff.md", + "bytes": 7448, + "sha256": "ae29bd60c275fd7067ed47a7988672e153cbdd2e98b2267e413675576281ded0", + "source_path": ".local/resize-port-stable-ranking-source-handoff-20260912.md", + "contribution_commit": "6203b5c4c0cc8bd736196aa4744dccfc0e139a2a", + "execution_status": "source-only; runner and tests unrun", + "policy_accepted": false + }, + { + "file": "stable-ranking/run-stable-ranking-gates.py", + "bytes": 16920, + "sha256": "0d823b12064c4966e39c430a6da71e09c4563aba8b57c5f4134850c7a8195f45", + "source_path": ".local/resize-port-stable-ranking-20260912/.local/run-stable-ranking-gates.py", + "contribution_commit": "6203b5c4c0cc8bd736196aa4744dccfc0e139a2a", + "execution_status": "source-only; runner and tests unrun", + "policy_accepted": false + }, + { + "file": "stable-ranking/gate-runner-handoff.md", + "bytes": 6817, + "sha256": "5d4d472b324f1dd5ed17164d22291263ee10cdec2ed2fd0dd457829e89fc5f3f", + "source_path": ".local/resize-stable-ranking-gate-runner-handoff-20260912.md", + "contribution_commit": "6203b5c4c0cc8bd736196aa4744dccfc0e139a2a", + "execution_status": "source-only; runner and tests unrun", + "policy_accepted": false } ] diff --git a/harness/experiments/resize-port-policy-20260912/revision-design.md b/harness/experiments/resize-port-policy-20260912/revision-design.md new file mode 100644 index 00000000..a3c4b3d9 --- /dev/null +++ b/harness/experiments/resize-port-policy-20260912/revision-design.md @@ -0,0 +1,128 @@ +# Port-policy revision experiment design — 2026-09-12 + +Status: source/design proposal only for root-owned issue16. No policy, compiler, native application or production file changed. The executed `7e25b3d` CapacityAware policy is **not adoptable**. Preserve its implementation, the passed foundational gates, and the failed `a95db10` falsifiers as comparison evidence. + +The next useful experiment is **stable per-port fallback preferences plus obstacle-aware placement within side intervals**, over frozen owner bounds. Compare stable preferences alone as an attribution control. A bounded repair that only changes sides and calls the existing position allocator is insufficient: the near-corner case below predicts a repair stall even though a readable placement exists on the same side. Do not introduce a general port-to-slot matching framework or repeated inverse/routing feedback loop at this point. + +## Executed evidence read + +Read `native-qa/resize-falsifiers-a95-01/run.json` and both full case logs. Exact core `7e25b3d3907693cbbf03bb51b5e08b01d743a934`, exact tests `a95db10ce73d639f59eb1ec1153de26f4967881c`; both tests exited101 at their intended prospective assertions, with unchanged stamped inputs and binary. These are observed candidate failures, not hypothetical failures or harness errors. + +| Actual comparison | Current | SameSidesAdaptSpacing | CapacityAware | +| --- | --- | --- | --- | +| 20 ports, authored height259.9→260→260.1, adjacent side changes | `[0,0]` | `[0,0]` | **`[12,0]`** | +| Visible height at259.9 | 568 | 259.9 | 259.9 | +| Minimum same-side center separation at259.9→260 | 27.99997→27.99997 | 11.78421→11.789459 | 31.985703→28 | +| Total routed length at259.9→260 | 36976→36976 | 39145.004→39143.996 | 41393.008→41410 | +| Total bends at259.9→260 | 42→42 | 54→54 | 54→55 | +| Eight-port unrelated-top-obstacle blocked mandatory stubs / warnings | 0 / 0 | 0 / 0 | **1 / 1** | + +In the obstacle case, port `956a2026-0912-4000-8000-00000000006a` crosses obstacle `...002a`; its real exchange `...03ee` reports `NoClearPath`. Controls keep all eight Right exits. Candidate uses L/R/T/B counts1/5/1/1 and the offending Top endpoint `(112,0)`. + +These routes are synthetic measurements, not a complete readability score. The candidate's threshold route is approximately5.7% longer than spacing-only at259.9, despite its better separation. The logs do not measure crossings or label collisions. The separation metric measures same-side center distance; 14-unit component glyph width explains why the spacing-only20-port result is a problem, but it does not make center spacing a text/readability proof. + +Underlying requirements remain ergonomic modern graphical/textual editing and maintainability (`PROJECT_GOAL.md:38–71,110`), not preserving the failed allocator. Frozen authored/content bounds, exact eight-handle geometry, source/API parity, exact manual anchors and unrelated automatic-side stability remain the boundary established in `resize-port-policy-20260912.md`. + +## Source facts that constrain revisions + +At the experimental base, `projection/port_layout.rs` computes peer-facing/semantic preferences and automatic shadow sides independently of authored anchors. It then applies the anchors and uses `automatic_positions` to spread automatic ports around fixed fractions. CapacityAware's `ranked` orders fallback sides by current occupancy (`port_capacity_experiment.rs:34–52`); recomputing that ranking after one new preferred-side slot shifts many subsequent choices. Stable IDs make this repeatable, not stable during resizing. + +`clear_exit` tests only the side midpoint against connected peers (`port_layout.rs:80–119`). Simply including every visible obstacle fixes the executed Top case but leaves the offset-specific defect below. Actual routing uses the projected port and its18-unit outward stub, inflates obstacles by12, and rejects a blocked mandatory stub before path search (`routing.rs:377–390,627–647,735–747`). Its ancestor/header exceptions matter; a new projection checker must not invent a different interpretation of traversable containing nodes. + +The existing position allocator puts the first and last automatic ports at the usable interval ends when more than one occupies an interval. With no authored anchors, those ends are18 and `length−18` (`port_layout.rs:336` onward). Removing one port from a side normally redistributes all remaining ports on that side. This coupling is why testing only the moved port during repair is invalid. + +## Third falsifier: clear midpoint, blocked actual corner exit + +This is a **new source-derived prediction, not yet executed**. Reuse the typed eight-port/right-peer fixture from the successful falsifier harness, changing only the unrelated actor placement: + +| Placement | Authored bounds | +| --- | --- | +| Owner, eight Standard/Unset ports | `(0,0) / 224×160` | +| Distant SystemActor peer, one port, eight BoundaryExchanges | `(1908,336) / 184×132` | +| Unrelated visible SystemActor, no containment/exchange to owner | **`(230,−120) / 184×132`** | + +The obstacle's inflated rectangle is x `[218,426]`, y `[-132,24]`. Right midpoint `(224,80)` and its outward stub are clear. CapacityAware places five Right ports at y18,49,80,111,142. The first port's stub from `(224,18)` to `(242,18)` intersects the inflated obstacle. An all-visible-midpoint predicate still approves Right. + +A same-side nominal-gap witness exists: y24.01,53.5075,83.005,112.5025,142, approximately29.4975 separation. The tiny24.01 safety margin avoids depending on boundary-equality conventions. These five positions are only an analytic witness; the experiment must obtain actual positions from its candidate projector, route the real edges, and independently check all stubs. + +This case also falsifies a tempting repair: move the first blocked Right port to another side, then rerun unchanged `automatic_positions`. As long as at least two Right ports remain, a different Right port becomes the first at y18 and is blocked. A one-port move does not decrease the number of blocked stubs. A strictly improving single-move repair stalls; a non-strict repair walks identities between sides without addressing the position rule. Reducing Right from five ports to one could clear it, but would discard four useful preferred-side slots although all five fit readably there. Swapping IDs on sides does not solve the first-slot problem either. + +Expect the original Current and spacing-only controls to expose the same near-corner weakness, because they too start Right ports at y18. This is a deliberately shared baseline defect, unlike the executed Top spillover regression. The new candidate should improve it using the explicit same-side witness. Keep the distinction in results. + +## Material alternatives + +| Revision | What it can establish | Limitation / complexity | +| --- | --- | --- | +| Fixed fallback order per port, no dynamic occupancy ranking; existing placement | Removes the demonstrated overflow phase-reset mechanism without changing the source model | Cannot repair actual blocked exits. All ports using one global fallback order can still cascade when multiple side capacities change. Necessary attribution control, insufficient policy. | +| Stable per-port ranking plus all-visible midpoint tests and one-pass side repair after actual placement | Small addition to the existing four-side allocator; can recover the executed Top spillover by selecting another side | Midpoints miss the new corner case. Moving one blocked port can block another on the same side. Repeated strictly improving side-only moves cannot solve the supplied feasible witness. Do not select this as the final position policy. | +| Stable ranking plus bounded **position-aware** shadow repair: re-pack an affected side, then try one-port relocation and re-pack both sides | Can solve the near-corner case by shifting the five Right positions together; can leave uncomplicated owners on the existing fast path | Requires the same clear-interval geometry/packing as the next row, plus a repair order and stopping policy. A locally unsuccessful repair is not a global impossibility proof. Worth a narrow control if it materially reduces integration work. | +| Stable per-port ranking plus clear side intervals and obstacle-aware same-side packing | Directly addresses actual endpoint positions, uses free portions of preferred sides, can keep the five near-corner Right ports, and leaves owner bounds fixed | Needs a real interval placement function and shared obstacle semantics. Per-port differences and manual anchors must be handled honestly; raw interval capacities are not a proof of global feasibility. Leading next experiment. | +| Explicit global slots, ports matched to individually legal slots with deterministic costs | Represents slot clearance and occupancy together; can support per-port clear masks and finite matching oracles | A fixed lattice can miss a legal shifted placement; regenerated slots may move/renumber at resize thresholds. More machinery, and port ordering/crossings are not solved by feasibility matching. Defer unless the smaller interval experiment fails a concrete per-port scarcity example. | + +### Stable preference detail and its limits + +Retain peer-facing and semantic preferences as preferences. Rank remaining sides by a reproducible function of the **port identity and side**, independent of current side counts and the number of previously overflowed ports. Use an explicitly specified mixer/ranking, not a runtime-randomized hash or the ordinal within the overflow list. Stable semantic IDs are already the layout tie breaker. Do not key layout to display names or aliases. + +Test a simple fixed per-port rotation/ranking first; there is no need for an allocator service or new schema. Record the exact function and ties in experimental code. A port's rank among all ports would be resize-stable but changes when an earlier port is inserted/reidentified; identity-derived ranking avoids that particular collective phase shift. It can still change the reidentified port and induce capacity reassignment. This is a measurable tradeoff, not an identity-invariance claim. + +The20-port case has spare fallback capacity, so taking one additional preferred slot should require only the newly admitted port to change side. Stable rankings plausibly accomplish that. They do **not** prove a global one-change bound: scarce admissible sets may require an alternating chain, several side capacities may change together, and every port may share a normalized peer-facing threshold. Include randomized stable IDs and a near-diagonal facing threshold, not just the chosen consecutive IDs. If a change causes many switches for negligible geometric advantage, investigate the preference cost before adding gesture state or silently authored anchors. + +### Why intervals need more care than a new capacity formula + +The strongest modest repair candidate first computes the stable nominal-capacity shadow assignment and ordinary shadow positions. It detects blocked **actual** stubs; for each affected side in a fixed order it tries clear-interval packing with the same membership, then at most a fixed set of one-port relocations into other sides, re-packing and revalidating every affected side. A trial may not sacrifice previously clear stubs or degrade the chosen gap tier, and must decrease the remaining blocked-stub count. Accepting only such progress bounds accepted repairs by the number of initially blocked ports. Exhausting trials produces an explicit unresolved result, not a claim of capacity infeasibility. Manual overrides remain absent throughout these side-changing trials. + +Unlike side-only repair, this position-aware candidate can solve the supplied corner witness in its first same-side attempt. Its limitation is local search: another feasible layout may require moving a currently clear port first, or a temporary neutral exchange among sides. Do not add ever-larger repair loops to evade that boundary. Compare such a case with the common-interval capacity allocation or a bounded small oracle before deciding a more complete matcher is needed. + +The proposed interval-first candidate computes capacities from actual common clear spans before assigning sides, then places the accepted memberships using those spans. It avoids assigning nominal capacity to the wholly blocked Top side in the executed obstacle case and avoids a second side-repair state machine. Both candidates need the same interval geometry and packing; the main tradeoff is upfront side capacity knowledge versus a smaller fast path followed by bounded unresolved repairs. **Prefer interval-first for the next implementation**, because the helper is required either way and the existing four-bin assignment can consume corrected capacities directly. Keep the position-aware repair definition as a concrete competing candidate, not as a dismissed midpoint-only strawman. + +For flat ordinary nodes with common obstacle semantics, project each inflated obstacle crossed by the18-unit outward corridor onto the side's coordinate axis. Subtract the union of forbidden coordinates from the usable `[18, length−18]` span. This tests every potential endpoint along the border, not a representative midpoint. On the near-corner Right side it leaves approximately `[24,142]`. + +At a requested gap, pack positions within the legal union while maintaining the gap **across interval boundaries**, then distribute remaining slack without leaving legal space. Do not blindly sum `floor(interval_length/gap)+1`: points in two nearby intervals can violate the gap across their intervening forbidden segment. Left-to-right earliest legal packing gives a useful common-interval capacity/witness for equal minimum separation. This small one-dimensional evaluator can be checked against a bounded enumeration before being combined with side allocation. + +An arbitrary fixed28-unit slot lattice is an insufficient oracle: legal positions may require shifting the lattice, as at the near-corner boundary. Recomputing evenly spread slots independently for every tentative assignment can also recreate discontinuities. Keep the actual placement witness alongside the accepted counts and validate it after all overrides; do not assume that a count accepted by one formula will be realized by a different spreading function. + +Extend the existing `automatic_positions` interval concept rather than introduce a parallel positioning subsystem. It already builds usable intervals around authored anchor exclusions. The experiment can supply an additional legal border-span set, intersect it with those exclusions, then preserve the current stable peer-coordinate/ID ordering while distributing automatic positions. The original allocator's cross-interval assumptions need explicit tests when real obstacle spans are introduced. Anchor-free shadow placement passes no manual exclusions; final placement passes the authored exclusions. These are two calls to the same geometric helper, not two rules for assigning sides. + +For nested diagrams, obstacles are not necessarily identical for every port. A port's multiple incident edges can have different ancestor/header exceptions. The prospective layout must satisfy each applicable outward-stub check. A conservative union can be used for an explicitly scoped experiment, but failure under that union is **unresolved under the conservative policy**, not proof that no legal model layout exists. Extract/share a pure obstacle-rule helper with routing only when implementation is authorized; do not duplicate its containment semantics into a second planner. The first interval comparison can deliberately use the existing flat fixtures to isolate the question. + +### Visibility, folds and the shared obstacle boundary + +Use the actual projection stage, not every authored placement. `project_diagram_impl` first excludes wrong-layer/projection/state-machine placements and descendants hidden under a collapsed visual ancestor (`projection.rs:305` onward). Folded exchanges can be promoted to visible ancestors and lose unavailable semantic port endpoints. Dedicated state views skip component-port layout entirely. Reintroducing hidden descendants as obstacles would make invisible geometry constrain resize layouts. + +Port layout then intentionally consumes **all eligible projected edges before presentation filters**; `projection.rs:535` onward filters edges only after port geometry is settled. In the inspected source, these final presentation filters remove edges, not the projected node vector. Thus a hidden line/category must not change port-side assignment, while a true fold or change of shown placements can change the applicable node/endpoint geometry. Do not derive layout clearance from only the final displayed edge set: that would violate the existing filter-stability contract. + +The router starts from the supplied visible projected nodes, but those full rectangles are not the final obstacle geometry for every edge. It shortens ancestors of either endpoint to their header rectangles, applies the correct ordinary/state header height, inflates by12, and ignores the source/target owner for its respective mandatory exit (`routing.rs:414–425,455–466,627–647,735–747`). Promotion also suspends authored pins and produces a specific warning. A candidate must preserve these distinctions when testing a semantic port's own stub; checking every full visible rectangle would falsely block valid exits through containing bodies. + +The maintainable production direction is to extract/reuse the actual pure obstacle geometry/eligibility kernel used by routing, given frozen projected nodes and one eligible projected edge. The interval helper then derives forbidden endpoint coordinates from **those** effective rectangles and the same boundary tolerance. Keep the independently implemented slab oracle only in tests as a cross-check for flat scenes, not as an alternative production collision policy. No route search, occupied-segment cost or authored-pin mutation belongs in this shared kernel. + +Required boundary fixtures before adoption: hide an exchange/category without changing ports; fold/unfold a parent so its hidden descendants stop contributing obstacles; port-to-ancestor and port-to-sibling edges with a traversable body but blocked header; a port serving edges with different ancestor chains; a promoted folded endpoint without an available semantic port; and the dedicated state-view bypass. Parent enclosure and actual visible obstacle eligibility must be established before computing clear border intervals. + +## Manual anchors and priorities + +Compute shadow sides and shadow clear positions for **all ports**, including anchored ports, without reading authored anchor fractions/sides. Any capacity/repair decision capable of changing unrelated automatic sides must use that shadow layout. Then apply exact authored anchors. Final automatic ports may reposition within their already chosen sides, taking both legal intervals and manual exclusion gaps into account. No final repair may move an unrelated automatic port to another side because an authored anchor changed. + +This contract rules out promising unconditional clearance and28/14 separation for arbitrary anchors. Coincident anchors or an anchor placed into an obstacle are valid authored choices; a manual port can also consume the only clear positions on an automatic port's fixed side. Preserve anchor metadata and exact fractions. Report actual crowded/blocked outcomes using the existing route warnings plus experimental diagnostics; do not reinterpret the resize as invalid or secretly grow the frame. A final placement failure after manual overrides must remain visible in the experiment even if the anchor-free shadow succeeded. + +Candidate priority for **automatic** placements is: frozen node geometry and exact authored metadata; clear mandatory stubs when available; target28 separation; readable fallback at least14 where nominal space is insufficient; then deterministic degraded spacing/route diagnostics when these cannot coexist. Try clear28 capacity across sides before degrading to14. At14, a same-side center-gap check only establishes square-glyph separation, not labels. Manual conflicts are a documented exception, not an excuse to ignore avoidable crowding in an all-automatic fixture. + +## Concrete next experiment, with stop conditions + +1. Preserve `7e25b3d` and `a95db10`. In a newly authorized isolated source branch, add a small experimental stable-ranking mode, with unchanged placement. Re-run the exact two falsifiers and add the near-corner case before changing the position algorithm. Expected attribution: threshold improves; obstacle/corner tests still fail. Retain first failures. +2. Add one interval-placement candidate using the **same stable ranking** and frozen geometry. Keep ordinary Current, spacing-only and original CapacityAware as controls. Initially use the flat common-obstacle fixtures, typed ports, real source roundtrips and real router. Reuse a narrow one-dimensional interval helper for shadow and final automatic positioning; do not create a generic global slot graph. If the implementer finds the bounded position-aware repair path materially smaller, compare it on the same fixtures using that same helper; do not implement two full architectures just for symmetry. Record the delta in code/operations and any unresolved repair witness before changing the selected experiment. +3. In the next serialized gate, require the20-port threshold bound; both executed obstacle controls; the near-corner actual same-side witness; eight forbidden/outward-geometry cases;100-port target-gap case; and the existing narrow-gap/manual fractions/stability cases. Record exact arrays and actual routes. If interval placement cannot keep the five clear Right positions without excessive side movement, preserve the failure and revise that helper before expanding architecture. +4. Sweep small height changes around capacities for8/20/100 ports, multiple fixed UUID sets, reverse movement and a near-diagonal peer-facing threshold. Include insertion/removal and one Reidentify, aliases/names, source roundtrip and construction order. Compare side changes and total displacement, not determinism alone. First use a bounded set of values; broad randomized testing follows only a concrete concern. +5. Evaluate per-port/admissibility scarcity separately. Extend the existing abstract four-bin oracle only enough to check the revised rank/matching behavior; keep its assignment-only status. If realistic nested/partial-obstacle fixtures require per-port interval matching that the small helper cannot represent, use those fixtures to decide whether explicit slot matching is justified. Do not infer completeness from a green flat interval suite. + +For every comparison, record owner bounds, inactive authored fields, manual anchor metadata, exact ports, same-side separation, independent mandatory-stub intersections, route warnings, total length, bends, proper crossings and coincident overlap lengths. Route cost is an **after-projection evaluator**, not an input to an iterative layout/router feedback cycle. Record adjacent-frame route/label displacement where available. Compare crossings/labels on realistic multipeer scenes; the one-shared-peer fixture naturally produces shared portions and cannot establish general crossing quality. + +Count interval creation/packing operations and projections for increasing port/obstacle sets, and measure elapsed time later. A direct port-by-obstacle construction can cost O(P×O); sorting/merging side intervals and ordinary side allocation should remain bounded and shared where obstacle rules agree. A post-placement trial that reroutes the whole view for every candidate move is outside this experiment. Any stricter asymptotic/performance claim awaits implementation and measurement. + +Do not call scarcity a minimum-size result. If this bounded candidate cannot find a readable clear placement, retain the exact requested rectangle and classify the actual limitation (manual conflict, proven insufficient common interval capacity, or unresolved assignment). This is separate from the semantic/content minima used by the resize planner. + +## Promotion boundary + +No mode is selected for production by this report. Stable ranking is a low-cost candidate correction for a demonstrated mechanism; interval positioning is the smallest justified next extension because side-only repair has a concrete structural counterexample. A general slot matcher remains a fallback experiment, not a required architecture. + +Before policy adoption, root still needs enclosure/fold/state and ancestor/header cases, authored route pins, realistic route/label and native readability, source/API/Undo interaction, and upgrade rendering comparisons. Removing capacity-driven growth changes old views even when source is untouched. Preserve historical Current snapshots separately; comparing two entrypoints into the same modified projector does not prove historical compatibility. Changing automatic layout must not silently normalize authored placements, persist automatic pins, introduce a gesture-only regime or weaken complete eight-handle editing. + +This proposal stops at the candidate experiment. No compiler, native work or implementation is authorized or performed by the report itself. diff --git a/harness/experiments/resize-port-policy-20260912/stable-ranking-independent-review.md b/harness/experiments/resize-port-policy-20260912/stable-ranking-independent-review.md new file mode 100644 index 00000000..ca9c0306 --- /dev/null +++ b/harness/experiments/resize-port-policy-20260912/stable-ranking-independent-review.md @@ -0,0 +1,32 @@ +# Independent source review — stable fallback ranking — 2026-09-12 + +Target: `6203b5c4c0cc8bd736196aa4744dccfc0e139a2a` in `.local/resize-port-stable-ranking-20260912`, based on `a95db10`. Read the source handoff, complete four-file diff and relevant surrounding allocator/projector/falsifier code. Target worktree was clean. No compilation, tests, UI, Gitea writes or code edits were performed. All new evaluators remain **unrun from this review's evidence**. + +**No actionable source defect found. The change is suitable for the proposed isolated attribution gate; it is not clearance-policy or production approval.** + +## Preservation and determinism + +- `crates/oa-core/src/projection.rs:262,297`: ordinary projection and availability still explicitly select Current. The new enum variant adds no persisted field or setting. +- `projection/port_layout.rs:235–268`: only the new mode passes aligned port identities to assign_stable. Old CapacityAware still calls assign; Current and spacing-only skip both capacity branches. Existing owner growth remains confined to Current at line277. No minimum, enclosure, clearance, manual-anchor or position algorithm changed. +- `projection/port_capacity_experiment.rs:113–125`: the old assignment entrypoint calls the factored implementation with None. `:49–68` preserves the original occupancy ordering in precisely that branch. Recursion, capacities, occupant visitation and crowding fallback retain their previous behavior. This is strong source evidence of old-mode preservation; rerunning historical results is still necessary. +- `:39–47`: UUID conversion, shifts, rotations, wrapping multiplication and score/index ordering make the fallback rank deterministic across ordinary platform integer implementations. No randomized hasher, name, alias, occupancy or overflow ordinal enters identity_score. Preferred and semantic sides still precede hashed fallbacks. `:84,105,144` consistently supplies the current demand's identity, including recursive reassignment and final crowded fallback. Demand/identity vector lengths are checked; both originate in the same choices traversal. +- Compressing128 UUID bits into64 score input permits different ports to share rankings. That is not a determinism defect and the experiment makes no uniqueness or universal low-churn promise. + +## Evaluators discriminate the bounded claims + +`tests/experimental_port_policy_falsifiers.rs:450–505` compares old/new policy on the same geometry and three declared identity sets, measures actual ports/routes, holds the same ≤1 side-change and nominal-gap criteria for every set, and checks repeated geometry after reverse movement. This is materially stronger than rerunning the original consecutive UUID fixture or asserting reproducibility alone. Command::Reidentify at line442 updates model references, and validation plus complete Project canonical roundtrip follows it. Array membership, rather than vector ordinal, is used to count a given port's changes across frames. + +The old two falsifiers and three-mode loops are preserved byte-for-byte; the test diff appends181 lines. The new exit test at line509 runs all four modes on both obstacle scenes. It measures actual projected ports and routed exchanges independently of the analytic witness. Its five legal points at line552 are used only for the independent slab check, never substituted into projection or routing. The aggregate acceptance assertion at line581 correctly remains expected to fail when the stable mode still produces blocked actual exits. It neither marks expected failure as a test pass nor relaxes the obstacle criterion. + +The inherited slab oracle explicitly requires unrelated flat projected nodes (`project` line100); this is an appropriate scope for its full-rectangle check. Its lack of the router's EPSILON/ancestor exceptions must remain a limit when adding future nested or boundary-equality fixtures. The current witness's0.01 margin exceeds the router's0.001 tolerance, so that mismatch does not invalidate the supplied near-corner witness. + +Receipt names include identity set and frame index, so reverse frames cannot overwrite earlier observations. create_new artifact output remains intact. The handoff correctly requires rebuilding the changed core rather than linking these tests to the old rlib. + +## Acceptance limits and next action + +Proceed with the new identified-core gate and preserve both intended exit failure and any unexpected threshold failure. Run the original two falsifiers separately/full binary to confirm historical outcomes; the new threshold test prints the old-mode prediction but does not itself enforce old-mode exact counts. Retain the historical policy and allocator gates even though the new exit test is expected to fail. + +A passing threshold test establishes only the measured20-port, same-peer, three-ID-set capacity transition. It does not establish general stability under primary facing changes, gap-tier changes, insertion/removal, geometry scarcity, manual overrides or arbitrary IDs; the separate interval critique gives concrete examples. Route warnings and length are recorded in that test but are not its acceptance criteria. Three old allocator tests exercise the None branch, so their passes alone would not validate geometric clearance or all new ranking-driven reassignment orders. + +No additional source edit is required before this bounded execution. Do not adopt the stable mode merely because the attribution threshold passes; the untouched clearance/position defect is deliberately still exposed by the second evaluator. + diff --git a/harness/experiments/resize-port-policy-20260912/stable-ranking.patch b/harness/experiments/resize-port-policy-20260912/stable-ranking.patch new file mode 100644 index 00000000..a93b7adb --- /dev/null +++ b/harness/experiments/resize-port-policy-20260912/stable-ranking.patch @@ -0,0 +1,375 @@ +diff --git a/crates/oa-core/src/projection.rs b/crates/oa-core/src/projection.rs +index 2ee820e3c88eda1245ea17fe36965d5e5643cf5e..b6f71ab24e23a7918260e239f102ac17552d5828 100644 +--- a/crates/oa-core/src/projection.rs ++++ b/crates/oa-core/src/projection.rs +@@ -12,6 +12,7 @@ pub enum ExperimentalPortPolicy { + Current, + SameSidesAdaptSpacing, + CapacityAware, ++ CapacityAwareStableRanking, + } + #[path = "projection/state.rs"] + mod state; +diff --git a/crates/oa-core/src/projection/port_capacity_experiment.rs b/crates/oa-core/src/projection/port_capacity_experiment.rs +index 25bdab04371cafee66c6bb51bb47c11c873e976c..29723b86dcb91985b7374f9553e1aaf9b20b0299 100644 +--- a/crates/oa-core/src/projection/port_capacity_experiment.rs ++++ b/crates/oa-core/src/projection/port_capacity_experiment.rs +@@ -31,7 +31,22 @@ fn counts(assigned: &[Option]) -> [usize; 4] { + result + } + +-fn ranked(demand: &Demand, counts: [usize; 4]) -> Vec { ++// Explicit reproducible identity/side ranking for the fourth experimental mode. ++// UUID bits are interpreted as u128, with low64 XOR high64.rotate_left(17). ++// Each side uses (L/R/T/B index + 1) * the golden-ratio constant as a salt. ++// The SplitMix64 finalizer below uses wrapping arithmetic. Largest score wins; ++// equal scores use L/R/T/B order. No occupancy, overflow ordinal or runtime hash. ++fn identity_score(port: Id, side: PortAnchorSide) -> u64 { ++ let bits = port.as_u128(); ++ let mut value = bits as u64 ++ ^ ((bits >> 64) as u64).rotate_left(17) ++ ^ (index(side) as u64 + 1).wrapping_mul(0x9e37_79b9_7f4a_7c15); ++ value = (value ^ (value >> 30)).wrapping_mul(0xbf58_476d_1ce4_e5b9); ++ value = (value ^ (value >> 27)).wrapping_mul(0x94d0_49bb_1331_11eb); ++ value ^ (value >> 31) ++} ++ ++fn ranked(demand: &Demand, counts: [usize; 4], identity: Option) -> Vec { + let mut result = Vec::new(); + for side in [Some(demand.preferred), demand.semantic] + .into_iter() +@@ -42,7 +57,12 @@ fn ranked(demand: &Demand, counts: [usize; 4]) -> Vec { + } + } + let mut remaining = SIDES; +- remaining.sort_by_key(|side| (counts[index(*side)], index(*side))); ++ if let Some(port) = identity { ++ remaining ++ .sort_by_key(|side| (std::cmp::Reverse(identity_score(port, *side)), index(*side))); ++ } else { ++ remaining.sort_by_key(|side| (counts[index(*side)], index(*side))); ++ } + for side in remaining { + if demand.clear[index(side)] && !result.contains(&side) { + result.push(side); +@@ -59,9 +79,10 @@ fn try_assign( + capacities: [usize; 4], + assigned: &mut [Option], + visited: &mut [bool; 4], ++ identities: Option<&[Id]>, + ) -> bool { + let counts = counts(assigned); +- let sides = ranked(&demands[port], counts); ++ let sides = ranked(&demands[port], counts, identities.map(|ids| ids[port])); + for side in &sides { + let slot = index(*side); + if !visited[slot] && counts[slot] < capacities[slot] { +@@ -81,7 +102,7 @@ fn try_assign( + .filter_map(|(port, current)| (*current == Some(side)).then_some(port)) + .collect(); + for other in occupants { +- if try_assign(other, demands, capacities, assigned, visited) { ++ if try_assign(other, demands, capacities, assigned, visited, identities) { + assigned[port] = Some(side); + return true; + } +@@ -91,11 +112,27 @@ fn try_assign( + } + + fn assign_with_capacities(demands: &[Demand], capacities: [usize; 4]) -> Vec { ++ assign_with_identities(demands, capacities, None) ++} ++ ++fn assign_with_identities( ++ demands: &[Demand], ++ capacities: [usize; 4], ++ identities: Option<&[Id]>, ++) -> Vec { ++ assert!(identities.is_none_or(|ids| ids.len() == demands.len())); + let mut assigned = vec![None; demands.len()]; + // Demands are in the core's stable semantic port-ID order. Manual anchors + // are deliberately absent: editing one must not resize owners or flip peers. + for port in 0..demands.len() { +- try_assign(port, demands, capacities, &mut assigned, &mut [false; 4]); ++ try_assign( ++ port, ++ demands, ++ capacities, ++ &mut assigned, ++ &mut [false; 4], ++ identities, ++ ); + } + for (port, demand) in demands.iter().enumerate() { + if assigned[port].is_some() { +@@ -104,7 +141,7 @@ fn assign_with_capacities(demands: &[Demand], capacities: [usize; 4]) -> Vec Vec Vec { ++ assign_with_identities( ++ demands, ++ [ ++ capacity(node.size.height), ++ capacity(node.size.height), ++ capacity(node.size.width), ++ capacity(node.size.width), ++ ], ++ Some(identities), ++ ) ++} ++ + #[cfg(test)] + mod tests { + use super::*; +diff --git a/crates/oa-core/src/projection/port_layout.rs b/crates/oa-core/src/projection/port_layout.rs +index ba0d86897ed432efc466ed7af43dd52d010d08a0..555fa56b3829f357d41f3a94bbac520b690be9e7 100644 +--- a/crates/oa-core/src/projection/port_layout.rs ++++ b/crates/oa-core/src/projection/port_layout.rs +@@ -232,17 +232,23 @@ pub(super) fn layout( + automatic_side: side, + manual: anchor.map(|a| a.offset), + peer, +- capacity: (policy == ExperimentalPortPolicy::CapacityAware).then(|| { +- capacity_experiment::Demand { +- preferred: side, +- semantic: port_anchor_side(port), +- clear: SIDES.map(clear), +- } ++ capacity: matches!( ++ policy, ++ ExperimentalPortPolicy::CapacityAware ++ | ExperimentalPortPolicy::CapacityAwareStableRanking ++ ) ++ .then(|| capacity_experiment::Demand { ++ preferred: side, ++ semantic: port_anchor_side(port), ++ clear: SIDES.map(clear), + }), + }); + } + } +- if policy == ExperimentalPortPolicy::CapacityAware { ++ if matches!( ++ policy, ++ ExperimentalPortPolicy::CapacityAware | ExperimentalPortPolicy::CapacityAwareStableRanking ++ ) { + for node in nodes.iter() { + let Some(choices) = choices.get_mut(&node.id) else { + continue; +@@ -251,7 +257,12 @@ pub(super) fn layout( + .iter() + .map(|choice| choice.capacity.clone().unwrap()) + .collect(); +- let sides = capacity_experiment::assign(node, &demands); ++ let sides = if policy == ExperimentalPortPolicy::CapacityAwareStableRanking { ++ let identities: Vec<_> = choices.iter().map(|choice| choice.port).collect(); ++ capacity_experiment::assign_stable(node, &demands, &identities) ++ } else { ++ capacity_experiment::assign(node, &demands) ++ }; + for (choice, side) in choices.iter_mut().zip(sides) { + choice.automatic_side = side; + if choice.manual.is_none() { +diff --git a/crates/oa-core/tests/experimental_port_policy_falsifiers.rs b/crates/oa-core/tests/experimental_port_policy_falsifiers.rs +index ef6d197b0f397ce4c976859adabd62c46cbcb0da..0a31254a47fc151a723e21a372f1023d09ef83c0 100644 +--- a/crates/oa-core/tests/experimental_port_policy_falsifiers.rs ++++ b/crates/oa-core/tests/experimental_port_policy_falsifiers.rs +@@ -402,3 +402,184 @@ fn capacity_spillover_does_not_add_a_blocked_mandatory_stub_above_the_owner() { + "Prospective exit-clearance criterion failed: {violations:?}" + ); + } ++ ++fn fixed_port_identity_set(mut f: Fixture, set: usize) -> Fixture { ++ if set == 0 { ++ return f; ++ } ++ // Two declared, reproducible UUID sets; not random draws or selected after ++ // observing layout results. Only port identities change, not topology. ++ let replacements: Vec<_> = (1..=f.ports.len()) ++ .map(|n| { ++ let low = match set { ++ 1 => (n as u64).wrapping_mul(0xd134_2543_de82_ef95), ++ 2 => (n as u64) ++ .wrapping_mul(0x9e37_79b9_7f4a_7c15) ++ .rotate_left(23), ++ _ => unreachable!(), ++ } & 0x0000_ffff_ffff_ffff; ++ let prefix = if set == 1 { ++ 0x12345678_9abc_4000_8000_000000000000 ++ } else { ++ 0xfedcba98_7654_4000_8000_000000000000 ++ }; ++ Id::from_u128(prefix | u128::from(low)) ++ }) ++ .collect(); ++ assert_eq!( ++ replacements ++ .iter() ++ .collect::>() ++ .len(), ++ f.ports.len() ++ ); ++ let commands: Vec<_> = f ++ .ports ++ .iter() ++ .zip(&replacements) ++ .map(|(old, new)| Command::Reidentify(*old, *new)) ++ .collect(); ++ f.p = execute_batch(&f.p, &commands).unwrap(); ++ f.ports = replacements; ++ validate_candidate(&f.p).unwrap(); ++ assert_eq!(language::parse(&language::format(&f.p)).unwrap(), f.p); ++ f ++} ++ ++#[test] ++fn stable_fallback_ranking_bounds_threshold_churn_across_three_identity_sets_and_reverse() { ++ let stable = ExperimentalPortPolicy::CapacityAwareStableRanking; ++ let mut violations = Vec::new(); ++ for set in 0..3 { ++ for policy in [ExperimentalPortPolicy::CapacityAware, stable] { ++ let mut f = fixed_port_identity_set(right_peer(20, 259.9, false), set); ++ let mut views = Vec::new(); ++ for (frame, height) in [259.9, 260., 260.1, 260., 259.9].into_iter().enumerate() { ++ f.p.diagrams ++ .get_mut(&f.d) ++ .unwrap() ++ .nodes ++ .get_mut(&f.owner) ++ .unwrap() ++ .size ++ .height = height; ++ let original = f.p.clone(); ++ let view = project(&f, policy); ++ let label = format!("stable-threshold-set{set}-{policy:?}-frame{frame}-{height}"); ++ measure(&f, &view, &label); ++ assert_eq!(f.p, original); ++ assert_eq!(owner(&f, &view).size, size(224., height)); ++ if policy == stable && gap(&f, &view) < 27.99 { ++ violations.push(format!( ++ "{label}: avoidable sub-nominal gap {}", ++ gap(&f, &view) ++ )); ++ } ++ views.push(view); ++ } ++ let flips: Vec<_> = views ++ .windows(2) ++ .map(|pair| { ++ f.ports ++ .iter() ++ .filter(|id| port(&pair[0], **id).side != port(&pair[1], **id).side) ++ .count() ++ }) ++ .collect(); ++ println!( ++ "stable threshold set={set} policy={policy:?} changes={flips:?}; prediction original=[12,0,0,12], stable<=1 each (unverified)" ++ ); ++ assert_eq!( ++ views[0], views[4], ++ "Same rectangle must reproject identically after reversal" ++ ); ++ assert_eq!(views[1], views[3]); ++ if policy == stable && flips.iter().any(|n| *n > 1) { ++ violations.push(format!("set={set} stable side changes {flips:?}; same bounded criterion across every UUID set")); ++ } ++ } ++ } ++ assert!( ++ violations.is_empty(), ++ "Prospective stable-ranking threshold criterion failed: {violations:?}" ++ ); ++} ++ ++#[test] ++fn stable_fallback_ranking_still_needs_real_exit_clearance_including_near_corner() { ++ let stable = ExperimentalPortPolicy::CapacityAwareStableRanking; ++ let mut violations = Vec::new(); ++ for corner in [false, true] { ++ let mut f = right_peer(8, 160., true); ++ if corner { ++ let obstacle = ++ f.p.diagrams ++ .get_mut(&f.d) ++ .unwrap() ++ .nodes ++ .get_mut(&id(42)) ++ .unwrap(); ++ obstacle.position = pos(230., -120.); ++ obstacle.size = size(184., 132.); ++ } ++ validate_candidate(&f.p).unwrap(); ++ assert_eq!(language::parse(&language::format(&f.p)).unwrap(), f.p); ++ let original = f.p.clone(); ++ for policy in POLICIES.into_iter().chain([stable]) { ++ let view = project(&f, policy); ++ let label = format!("stable-obstacle-corner{corner}-{policy:?}"); ++ let routed = measure(&f, &view, &label); ++ let blocked = blocked_stubs(&view); ++ if policy != ExperimentalPortPolicy::Current { ++ assert_eq!(owner(&f, &view).size, size(224., 160.)); ++ } ++ if corner { ++ let obstacle = view.nodes.iter().find(|n| n.id == id(42)).unwrap(); ++ assert_eq!( ++ (obstacle.position, obstacle.size), ++ (pos(230., -120.), size(184., 132.)) ++ ); ++ let midpoint = ProjectedPort { ++ element: f.ports[0], ++ owner: f.owner, ++ side: PortAnchorSide::Right, ++ position: pos(224., owner(&f, &view).size.height / 2.), ++ }; ++ assert!(view.nodes.iter().all(|node| !stub_hits(&midpoint, node))); ++ // Independent geometric witness only: five legal same-side ++ // coordinates exist. No fake ports are passed to the projector ++ // or router. The actual mode must produce its own clear layout. ++ let coordinates = [24.01_f32, 53.5075, 83.005, 112.5025, 142.]; ++ assert!(coordinates.windows(2).all(|p| p[1] - p[0] >= 28.)); ++ for y in coordinates { ++ let witness = ProjectedPort { ++ position: pos(224., y), ++ ..midpoint.clone() ++ }; ++ assert!(view.nodes.iter().all(|node| !stub_hits(&witness, node))); ++ } ++ println!( ++ "{label}: actual Right midpoint {:?} clear; independent five-position witness={coordinates:?}; actual blocked={blocked:?}", ++ midpoint.position ++ ); ++ } ++ let warned: Vec<_> = routed ++ .edges ++ .values() ++ .filter(|e| !e.warnings.is_empty()) ++ .map(|e| e.id) ++ .collect(); ++ println!( ++ "{label}: candidate attribution only; midpoint/placement unchanged, warnings={warned:?}" ++ ); ++ if policy == stable && (!blocked.is_empty() || !warned.is_empty()) { ++ violations.push(format!("{label}: blocked={blocked:?}, warned={warned:?}")); ++ } ++ assert_eq!(f.p, original); ++ } ++ } ++ assert!( ++ violations.is_empty(), ++ "Prospective stable-ranking real-exit criterion failed: {violations:?}" ++ ); ++} diff --git a/harness/experiments/resize-port-policy-20260912/stable-ranking/gate-runner-handoff.md b/harness/experiments/resize-port-policy-20260912/stable-ranking/gate-runner-handoff.md new file mode 100644 index 00000000..bfdfb6f7 --- /dev/null +++ b/harness/experiments/resize-port-policy-20260912/stable-ranking/gate-runner-handoff.md @@ -0,0 +1,51 @@ +# Stable-ranking serialized gate runner — source-only handoff + +Prepared after reading `resize-stable-ranking-independent-review-20260912.md`. The reviewer found no actionable source defect and required historical gates plus the two new evaluators, preserving expected clearance failure as non-adoption. + +Runner: `C:/Users/User/Documents/Git/ARCADIA-Studio/.local/resize-port-stable-ranking-20260912/.local/run-stable-ranking-gates.py` + +SHA-256: **`0d823b12064c4966e39c430a6da71e09c4563aba8b57c5f4134850c7a8195f45`**. This source-only revision adds exact committed-blob verification following root review; the earlier helper was never run or archived. + +Exact required worktree commit: **`6203b5c4c0cc8bd736196aa4744dccfc0e139a2a`**. Python AST parsing passed; source inspection confirms four falsifier test declarations and13 port-anchor declarations. **The runner has not executed. No compiler/test/native call was made and no lease is held.** No root staging/commit or Gitea action was performed. + +## Run only after root grants the serialized lease + +Working directory is the isolated stable-ranking worktree. Initialize `C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/env.ps1`; use bundled Python `C:/Users/User/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe`. Every invocation takes one mode and the same unique label: + +```text +python .local/run-stable-ranking-gates.py build 01 +python .local/run-stable-ranking-gates.py comparison 01 +python .local/run-stable-ranking-gates.py original-threshold 01 +python .local/run-stable-ranking-gates.py original-exit 01 +python .local/run-stable-ranking-gates.py stable-threshold 01 +python .local/run-stable-ranking-gates.py stable-exit 01 +python .local/run-stable-ranking-gates.py allocator 01 +python .local/run-stable-ranking-gates.py anchors 01 +python .local/run-stable-ranking-gates.py summary 01 +``` + +No all-in-one mode auto-continues after arbitrary errors. Root controls each step and can preserve/inspect failures before continuing. Each mode refuses existing output files. A failed/partial invocation cannot silently overwrite its earlier log; use a fresh label for a new run. Expected assertion failures should not prevent root from running the remaining historical gates. + +`build` requires a new `.local/target-stable-6203b5c-01` and new `.local/gate-stable-6203b5c-01` beneath this worktree. It compiles only the two integration-test targets with locked dependencies, jobs1, explicit real rustc/linker identities, and `RUSTFLAGS=-Dwarnings`. It does not compile the unit-test binary until `allocator`, or the port-anchor binary until `anchors`. No root target, accepted7e target, cache copy or hardlink is used for output. + +The helper enumerates the exact source tree with `git ls-tree`, then reads all committed blobs through one `git cat-file --batch` call and requires byte-for-byte equality with every tracked working file before stamping. This does not rely on clean Git status alone, so assume-unchanged/skip-worktree flags or checkout transformations cannot hide differing build inputs. The freshly stamped rows must also equal the verified blob digests. The helper additionally stamps itself, toolchain environment, review and actual Cargo/rustc/linker binaries. It records toolchain versions, environment, exact commands, times/exits/log hashes and source-integrity checks. Existing root and accepted7e core rlibs are protected by before/after hashes. Cargo JSON compiler-artifact events identify the new core rlib and exact test executables; there is no newest-filename selection. All emitted artifact paths must resolve inside the new target directory. Their hashes bind later binary execution to the build receipt. + +## Selection and outcome rules + +| Mode | Exact selection / count | Expected observation | +| --- | --- | --- | +| comparison | Entire `experimental_port_policy` binary, eight enumerated names | 8 passed,0 failed | +| original-threshold | One exact old threshold test, after four-name binary inventory | exit101 at `Prospective resize-stability criterion failed:`; Current/spacing changes `[0,0]`, CapacityAware `[12,0]` | +| original-exit | One exact old obstacle test | exit101 at `Prospective exit-clearance criterion failed:`; controls clear, exact old blocked port/obstacle and exchange IDs retained | +| stable-threshold | One exact three-identity forward/reverse evaluator | Prefer pass; an exit101 at its designated threshold criterion remains a real failed attribution result. Logs must include six old/new set summaries and historical old-mode vectors `[12,0,0,12]` for all three sets. | +| stable-exit | One exact new Top/near-corner evaluator | exit101 at `Prospective stable-ranking real-exit criterion failed:`; require actual new-mode near-corner blocked-stub output, not merely an unrelated control's warning | +| allocator | Exact three enumerated unit names under `capacity_experiment::tests` | 3 passed,0 failed | +| anchors | Entire binary;13 exact names independently read from committed test declarations | 13 passed,0 failed | + +Each mode first runs a separately logged `--list --format terse` and compares exact names, not just exit0 or a substring count. Individual falsifiers use `--exact` for listing and execution. Afterward it parses passed/failed/ignored counts, checks the specific prospective assertion marker where applicable, and records whether historical/completion observations matched. An arbitrary nonzero exit, compile failure, early fixture failure, missing names or wrong counts is an unexpected failure. Designated test failures are recorded as `designated_criterion_failure` and the helper returns101; they are never called a test pass. Every result explicitly carries `policy_accepted: false`. + +The unit-test binary compiles the same identified core sources in test configuration; its auxiliary build receipt identifies that executable separately. The integration core rlib identity remains recorded for reference, not a claim that the unit binary links that rlib. + +Each evaluator has a new geometry directory set via `OA_PORT_POLICY_RECEIPTS`; every produced canonical Project, projected view and route dump is hashed in its result. The source tests already use create-new outputs and frame-index labels. Inputs and executable/core hashes are checked after runs. `summary` is a read-only collection of recorded outcomes and missing modes, not an acceptance gate or an assertion that all tests passed. + +The new stable-ranking mode remains an attribution experiment. A green threshold result, even across all three identity sets, cannot approve untouched exit geometry or a production resize policy. A changed threshold result or clearance observation must be preserved and investigated without changing fixed UUID sets or acceptance criteria to obtain a pass. diff --git a/harness/experiments/resize-port-policy-20260912/stable-ranking/run-stable-ranking-gates.py b/harness/experiments/resize-port-policy-20260912/stable-ranking/run-stable-ranking-gates.py new file mode 100644 index 00000000..9136ca60 --- /dev/null +++ b/harness/experiments/resize-port-policy-20260912/stable-ranking/run-stable-ranking-gates.py @@ -0,0 +1,321 @@ +"""Serialized identified 6203b5c gates. Requires a coordinator lease; no auto-run. + +Usage: python .local/run-stable-ranking-gates.py MODE UNIQUE-LABEL +MODE: build, comparison, original-threshold, original-exit, stable-threshold, + stable-exit, allocator, anchors, summary +Expected criterion failures retain process exit101 and never mean adoption. +""" +from datetime import datetime, timezone +from pathlib import Path +import hashlib +import json +import os +import re +import shutil +import subprocess +import sys +import time + +WORK = Path(__file__).resolve().parent.parent +ROOT = WORK.parent.parent +SOURCE = '6203b5c4c0cc8bd736196aa4744dccfc0e139a2a' +ORIGINAL_THRESHOLD = 'a_point_one_height_increase_does_not_needlessly_flip_twelve_of_twenty_ports' +ORIGINAL_EXIT = 'capacity_spillover_does_not_add_a_blocked_mandatory_stub_above_the_owner' +STABLE_THRESHOLD = 'stable_fallback_ranking_bounds_threshold_churn_across_three_identity_sets_and_reverse' +STABLE_EXIT = 'stable_fallback_ranking_still_needs_real_exit_clearance_including_near_corner' +COMPARISONS = [ + 'experimental_current_is_the_unchanged_default_projector', + 'alternatives_realize_the_three_previously_forbidden_rectangles', + 'all_eight_outward_handles_have_exact_fixed_edges_without_authored_inactive_changes', + 'capacity_uses_available_sides_where_spacing_only_overlaps_fourteen_unit_glyphs', + 'manual_anchor_edits_preserve_owner_geometry_and_unrelated_automatic_sides', + 'exact_crowded_manual_fractions_survive_every_alternative_and_reopen', + 'narrow_peer_gap_keeps_clear_sides_and_actual_routed_port_endpoints', + 'candidate_geometry_is_deterministic_and_independent_of_peer_motion_and_names', +] +FALSIFIERS = [ORIGINAL_THRESHOLD, ORIGINAL_EXIT, STABLE_THRESHOLD, STABLE_EXIT] +ALLOCATORS = ['projection::port_layout::capacity_experiment::tests::' + name for name in [ + 'reassignment_recovers_scarce_clear_capacity', + 'clear_overflow_does_not_choose_a_blocked_empty_side', + 'small_clear_masks_match_an_exhaustive_assignment_oracle', +]] +GATES = { + 'comparison': ('experimental_port_policy', None, COMPARISONS, None, False), + 'original-threshold': ('experimental_port_policy_falsifiers', ORIGINAL_THRESHOLD, [ORIGINAL_THRESHOLD], + 'Prospective resize-stability criterion failed:', True), + 'original-exit': ('experimental_port_policy_falsifiers', ORIGINAL_EXIT, [ORIGINAL_EXIT], + 'Prospective exit-clearance criterion failed:', True), + 'stable-threshold': ('experimental_port_policy_falsifiers', STABLE_THRESHOLD, [STABLE_THRESHOLD], + 'Prospective stable-ranking threshold criterion failed:', False), + 'stable-exit': ('experimental_port_policy_falsifiers', STABLE_EXIT, [STABLE_EXIT], + 'Prospective stable-ranking real-exit criterion failed:', True), + 'allocator': ('oa_core', 'projection::port_layout::capacity_experiment::tests', ALLOCATORS, None, False), +} + + +def utc(): + return datetime.now(timezone.utc).isoformat() + + +def sha(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def read(path): + return json.loads(path.read_bytes()) + + +def write(path, value): + with path.open('x', encoding='utf-8', newline='\n') as stream: + stream.write(json.dumps(value, indent=2) + '\n') + + +def checked(args): + return subprocess.check_output(args, cwd=WORK, stderr=subprocess.STDOUT).decode().strip() + + +def stamp(paths): + return {str(p): {'bytes': p.stat().st_size, 'sha256': sha(p)} for p in sorted(set(paths))} + + +def changed(files): + return [name for name, item in files.items() if not Path(name).is_file() + or sha(Path(name)) != item['sha256']] + + +def source_ok(): + assert checked(['git', 'rev-parse', 'HEAD']) == SOURCE + assert not checked(['git', 'status', '--porcelain', '--untracked-files=no']) + + +def committed_inputs(): + # Status can hide assume-unchanged/skip-worktree flags or checkout + # transformations. Compare actual bytes with every blob in the exact tree. + names = subprocess.check_output(['git', 'ls-tree', '-r', '--name-only', '-z', SOURCE], cwd=WORK).decode().split('\0') + names = [name for name in names if name] + assert all('\n' not in name and '\r' not in name for name in names) + requests = ''.join(SOURCE + ':' + name + '\n' for name in names).encode() + batch = subprocess.run(['git', 'cat-file', '--batch'], input=requests, cwd=WORK, + stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True).stdout + cursor, verified = 0, {} + for name in names: + end = batch.index(b'\n', cursor) + header = batch[cursor:end].split() + assert len(header) == 3 and header[1] == b'blob', (name, header) + length = int(header[2]) + cursor = end + 1 + blob = batch[cursor:cursor + length] + assert len(blob) == length and (WORK / name).read_bytes() == blob, ('Committed bytes differ', name) + verified[str(WORK / name)] = {'bytes': length, 'sha256': hashlib.sha256(blob).hexdigest()} + cursor += length + assert batch[cursor:cursor + 1] == b'\n' + cursor += 1 + assert cursor == len(batch) + return verified + + +def invoke(command, stem, env): + log = OUT / (stem + '.log') + start, clock = utc(), time.monotonic() + print('START', stem, command, flush=True) + with log.open('xb') as stream: + process = subprocess.run(command, cwd=WORK, env=env, stdout=stream, stderr=subprocess.STDOUT) + return {'source': SOURCE, 'command': command, 'start': start, 'end': utc(), + 'seconds': round(time.monotonic() - clock, 3), 'exit': process.returncode, + 'log': log.name, 'log_sha256': sha(log)} + + +def environment(manifest): + env = os.environ.copy() + for key, value in manifest['environment'].items(): + env[key] = value + return env + + +def integrity(manifest): + source_ok() + return changed(manifest['files']) + + +def compile_targets(manifest, targets, stem): + assert not integrity(manifest) + command = [manifest['toolchain']['cargo']['path'], 'test', '--locked', '--jobs', '1', + '-p', 'oa-core', *targets, '--no-run', '--message-format=json'] + result = invoke(command, stem, environment(manifest)) + artifacts, binaries, core = [], {}, [] + for line in (OUT / result['log']).read_text(encoding='utf-8', errors='replace').splitlines(): + try: + message = json.loads(line) + except json.JSONDecodeError: + continue + if message.get('reason') != 'compiler-artifact': + continue + artifacts.extend(Path(name) for name in message['filenames'] if Path(name).is_file()) + if message.get('executable') and message['target']['name'] in [ + 'experimental_port_policy', 'experimental_port_policy_falsifiers', 'oa_core', 'port_anchors']: + binaries[message['target']['name']] = message['executable'] + if message['target']['name'] == 'oa_core' and not message['profile']['test']: + core.extend(Path(name) for name in message['filenames'] if name.endswith('.rlib')) + assert all(p.resolve().is_relative_to(TARGET) for p in artifacts), 'Unexpected artifact outside isolated target' + result.update({'artifacts': stamp(artifacts), 'binaries': binaries, 'core_rlibs': stamp(core), + 'changed_inputs': integrity(manifest)}) + result['build_accepted'] = result['exit'] == 0 and not result['changed_inputs'] + write(OUT / (stem + '.json'), result) + return result + + +def build(): + source_ok() + # Verify exact committed bytes before stamping all tracked workspace inputs, + # including source, fixtures, manifests and configuration. + committed = committed_inputs() + paths = [Path(p) for p in committed] + tools = {} + for name in ['cargo', 'rustc']: + path = Path(checked(['rustup', 'which', name])) + tools[name] = {'path': str(path), **stamp([path])[str(path)]} + linker = Path(shutil.which('clang.exe')) + tools['linker'] = {'path': str(linker), **stamp([linker])[str(linker)]} + tools['cargo_version'] = checked([tools['cargo']['path'], '-V']) + tools['rustc_version'] = checked([tools['rustc']['path'], '-Vv']) + tools['active_toolchain'] = checked(['rustup', 'show', 'active-toolchain']) + assert os.environ.get('RUSTFLAGS', '') in ['', '-Dwarnings'], 'Review nonstandard RUSTFLAGS first' + assert not os.environ.get('CARGO_ENCODED_RUSTFLAGS'), 'Review encoded flags first' + env_file = ROOT / '.local/toolchain/env.ps1' + assert Path(os.environ['CARGO_HOME']).resolve() == ROOT / '.local/toolchain/cargo' + assert Path(os.environ['RUSTUP_HOME']).resolve() == ROOT / '.local/toolchain/rustup' + paths += [env_file, Path(__file__).resolve(), ROOT / '.local/resize-stable-ranking-independent-review-20260912.md'] + paths += [Path(tools[name]['path']) for name in ['cargo', 'rustc', 'linker']] + # Read-only protection of both prior experiment and current root core files. + # No cargo invocation points at either of their target directories. + for folder in [ROOT / 'target/debug/deps', ROOT / '.local/resize-port-policy-20260912/.local/target-7e25b3d-01/debug/deps']: + paths += list(folder.glob('liboa_core-*.rlib')) + files = stamp(paths) + assert all(files[name] == record for name, record in committed.items()), 'Input changed after blob verification' + manifest = {'source': SOURCE, 'start': utc(), 'worktree': str(WORK), 'target': str(TARGET), + 'committed_blob_verification': {'source': SOURCE, 'count': len(committed), + 'method': 'git cat-file --batch; exact blob/working-file byte equality before stamping'}, + 'toolchain': tools, 'files': files, 'policy_accepted': False, + 'environment': {'CARGO_HOME': os.environ['CARGO_HOME'], 'RUSTUP_HOME': os.environ['RUSTUP_HOME'], + 'CARGO_TARGET_DIR': str(TARGET), 'CARGO_BUILD_JOBS': '1', 'RUSTFLAGS': '-Dwarnings', + 'RUSTC': tools['rustc']['path'], 'CARGO_TARGET_X86_64_PC_WINDOWS_GNULLVM_LINKER': str(linker)}} + write(OUT / 'inputs.json', manifest) + result = compile_targets(manifest, ['--test', 'experimental_port_policy', '--test', 'experimental_port_policy_falsifiers'], 'build') + required = {'experimental_port_policy', 'experimental_port_policy_falsifiers'} + assert result['build_accepted'] and required <= result['binaries'].keys() and len(result['core_rlibs']) == 1 + return 0 + + +def listing(binary, stem, env, expected, selected=None, exact=False): + args = [binary, '--list', '--format', 'terse'] + if selected: + args.append(selected) + if exact: + args.append('--exact') + result = invoke(args, stem, env) + names = [line.removesuffix(': test') for line in (OUT / result['log']).read_text().splitlines() + if line.endswith(': test')] + result.update({'selected_names': names, 'expected_names': sorted(expected), + 'selection_accepted': result['exit'] == 0 and sorted(names) == sorted(expected)}) + write(OUT / (stem + '.json'), result) + assert result['selection_accepted'], (stem, names) + + +def gate(mode): + manifest, built = read(OUT / 'inputs.json'), read(OUT / 'build.json') + assert built['build_accepted'] and not integrity(manifest) + assert not changed(built['artifacts']) + env = environment(manifest) + if mode in ['allocator', 'anchors']: + targets = ['--lib'] if mode == 'allocator' else ['--test', 'port_anchors'] + auxiliary = compile_targets(manifest, targets, mode + '-build') + assert auxiliary['build_accepted'] + built = auxiliary + if mode == 'anchors': + source_text = (WORK / 'crates/oa-core/tests/port_anchors.rs').read_text() + expected = re.findall(r'#\[test\]\s*fn\s+(\w+)\s*\(', source_text) + assert len(expected) == 13 + target, selected, marker, planned_failure = 'port_anchors', None, None, False + else: + target, selected, expected, marker, planned_failure = GATES[mode] + binary = built['binaries'][target] + frozen = stamp([Path(binary), *[Path(p) for p in built['core_rlibs']]]) + # Prove the complete integration binary identity and nonempty selection. + if target == 'experimental_port_policy_falsifiers': + listing(binary, mode + '-inventory', env, FALSIFIERS) + exact = selected is not None and mode != 'allocator' + listing(binary, mode + '-list', env, expected, selected, exact) + geometry = OUT / (mode + '-geometry') + assert not geometry.exists() + env['OA_PORT_POLICY_RECEIPTS'] = str(geometry) + command = [binary, '--nocapture', '--test-threads=1'] + if selected: + command.append(selected) + if exact: + command.append('--exact') + result = invoke(command, mode, env) + log = (OUT / result['log']).read_text(encoding='utf-8', errors='replace') + match = re.search(r'test result: (ok|FAILED)\. (\d+) passed; (\d+) failed; (\d+) ignored;', log) + counts = tuple(map(int, match.groups()[1:])) if match else None + passed = result['exit'] == 0 and counts == (len(expected), 0, 0) + designated = bool(result['exit'] == 101 and counts == (0, 1, 0) and marker and marker in log) + historical = None + if mode == 'original-threshold': + historical = all(f'threshold {policy}: adjacent side changes={values};' in log for policy, values in [ + ('Current', '[0, 0]'), ('SameSidesAdaptSpacing', '[0, 0]'), ('CapacityAware', '[12, 0]')]) + elif mode == 'original-exit': + historical = all(f'obstacle {policy}: independently blocked=[], NoClearPath=[];' in log + for policy in ['Current', 'SameSidesAdaptSpacing']) and all(text in log for text in [ + 'obstacle CapacityAware: independently blocked=[(956a2026-0912-4000-8000-00000000006a, 956a2026-0912-4000-8000-00000000002a)]', + 'NoClearPath=[956a2026-0912-4000-8000-0000000003ee]', 'all_NoClearPath=true']) + elif mode == 'stable-threshold': + rows = re.findall(r'stable threshold set=(\d+) policy=(\w+) changes=(\[[^\]]*\]);', log) + historical = len(rows) == 6 and all((str(i), 'CapacityAware', '[12, 0, 0, 12]') in rows for i in range(3)) + elif mode == 'stable-exit': + historical = bool(re.search(r'^stable-obstacle-cornertrue-CapacityAwareStableRanking: actual Right midpoint .*actual blocked=\[\(', log, re.MULTILINE)) + issues = integrity(manifest) + changed(frozen) + result.update({'target': target, 'expected_names': expected, 'counts_passed_failed_ignored': counts, + 'outcome': 'test_passed' if passed else ('designated_criterion_failure' if designated else 'unexpected_failure'), + 'planned_failure': planned_failure, 'designated_marker': marker, + 'historical_or_completion_checks': historical, 'changed_inputs_or_binary': issues, + 'compiled_core_identity': read(OUT / 'build.json')['core_rlibs'], 'binary_identity': frozen, + 'geometry': stamp(p for p in geometry.rglob('*') if p.is_file()) if geometry.exists() else {}, + 'policy_accepted': False}) + write(OUT / (mode + '.json'), result) + print(json.dumps({k: v for k, v in result.items() if k not in ['geometry', 'binary_identity']}), flush=True) + if issues or historical is False or not (passed or designated): + return 1 + # A designated prospective failure remains a failed test, not an auto-pass. + return result['exit'] + + +def summarize(): + modes = [*GATES, 'anchors'] + results = {mode: read(OUT / (mode + '.json')) for mode in modes if (OUT / (mode + '.json')).exists()} + record = {'source': SOURCE, 'utc': utc(), 'policy_accepted': False, + 'results': {mode: {key: r[key] for key in ['exit', 'outcome', 'planned_failure', + 'historical_or_completion_checks', 'changed_inputs_or_binary']} for mode, r in results.items()}, + 'missing_modes': [mode for mode in modes if mode not in results]} + write(OUT / 'summary.json', record) + print(json.dumps(record, indent=2)) + return 0 + + +if __name__ == '__main__': + MODE, LABEL = sys.argv[1:] + assert MODE in ['build', *GATES, 'anchors', 'summary'] and LABEL.replace('-', '').isalnum() + OUT = WORK / '.local' / ('gate-stable-6203b5c-' + LABEL) + TARGET = WORK / '.local' / ('target-stable-6203b5c-' + LABEL) + assert TARGET.resolve().is_relative_to(WORK / '.local') + if MODE == 'build': + assert not OUT.exists() and not TARGET.exists(), 'Use a fresh receipt AND target label' + OUT.mkdir() + else: + assert OUT.is_dir() and not (OUT / (MODE + '.json')).exists(), 'Never overwrite a mode receipt' + try: + code = build() if MODE == 'build' else (summarize() if MODE == 'summary' else gate(MODE)) + except Exception as error: + write(OUT / (MODE + '-exception.json'), {'utc': utc(), 'source': SOURCE, + 'type': type(error).__name__, 'error': str(error), 'policy_accepted': False}) + raise + raise SystemExit(code) diff --git a/harness/experiments/resize-port-policy-20260912/stable-ranking/source-handoff.md b/harness/experiments/resize-port-policy-20260912/stable-ranking/source-handoff.md new file mode 100644 index 00000000..31b150df --- /dev/null +++ b/harness/experiments/resize-port-policy-20260912/stable-ranking/source-handoff.md @@ -0,0 +1,49 @@ +# Stable fallback ranking attribution — source-only handoff + +Root-owned issue16 experiment; no production policy selection. New isolated worktree `C:/Users/User/Documents/Git/ARCADIA-Studio/.local/resize-port-stable-ranking-20260912`, branch `codex/resize-port-stable-ranking-956atf-20260912`, based on preserved falsifier commit `a95db10ce73d639f59eb1ec1153de26f4967881c`. + +**Commit: `6203b5c4c0cc8bd736196aa4744dccfc0e139a2a`**, `Isolate stable per-port fallback ranking attribution`. Committed worktree clean. `rustfmt --edition 2024` and staged diff whitespace checks passed. **No Cargo/compiler/native execution; no compiler lease held.** Root tracked inputs and both prior experimental worktrees were untouched. + +## Exactly what changed + +A fourth, explicitly experimental mode, `CapacityAwareStableRanking`, uses the existing capacity assignment algorithm but ranks remaining fallback sides per port identity. Existing `Current`, `SameSidesAdaptSpacing` and `CapacityAware` retain their original branches and default remains Current. The original CapacityAware calls the original count-based ranking with no identity argument. No node minima, capacities, peer-facing or semantic preference, midpoint clearance, manual override, position allocator, routing, schema or public user setting was changed. + +This is deliberately **stable-ranking attribution only**. It does not implement clear intervals, repair, all-visible midpoint clearance or an extracted router obstacle kernel. + +Ranking is reproducible and specified in `projection/port_capacity_experiment.rs`: interpret UUID as u128; XOR low64 with high64 rotated left17; XOR with wrapping `(side_index+1)×0x9e3779b97f4a7c15`; apply the SplitMix64 finalizer using shifts30/27/31 and multipliers `0xbf58476d1ce4e5b9`, `0x94d049bb133111eb`. Largest score wins, exact-score ties use Left/Right/Top/Bottom index order. The existing clear preferred side and then clear semantic side still precede fallbacks. Rankings use no runtime hash, side occupancy, overflow ordinal, label or alias. Matching still uses capacity counts and stable ID traversal; therefore a general low-churn guarantee is not asserted. + +## New evaluators, all unrun + +The original two a95 falsifiers and their three-policy loops are preserved. Two tests are appended to `experimental_port_policy_falsifiers.rs`: + +1. `stable_fallback_ranking_bounds_threshold_churn_across_three_identity_sets_and_reverse`:20 ports, original CapacityAware versus the new mode, three fixed UUID sets, five frames at heights259.9→260→260.1→260→259.9. The first identity set is the executed original. Sets1/2 are deterministic, declared arithmetic constructions in distinct UUID prefixes using odd multipliers and a fixed rotation; they are not random draws or chosen after observing results. `Command::Reidentify` changes only the port identities and updates semantic references; models validate and roundtrip. Every frame routes actual exchanges and records full ports/routes/crowding. The new mode must retain nominal same-side separation and change no more than one side per adjacent frame in every identity set. Exact repeated frames must project identically after reverse movement. All measurements are gathered before the aggregate criterion assertion. +2. `stable_fallback_ranking_still_needs_real_exit_clearance_including_near_corner`: runs all four modes on the executed unrelated-top-obstacle fixture, then the new unrelated actor `(230,−120)/184×132` near-corner fixture. Actual midpoint exits are independently clear in the latter, while the predicted first Right y18 exit is blocked. An independent five-position clear witness at y24.01,53.5075,83.005,112.5025,142 demonstrates approximately29.4975 spacing is geometrically possible. These witness points are never injected into the real projector/router. Actual outputs are separately measured and the new mode must have no blocked stubs or route warnings. This acceptance test is expected to fail because the position/clearance policy is intentionally unchanged. + +Every measured frame preserves per-port vectors, actual route endpoints/orthogonality, independent finite-stub intersections, route warnings, total length/bends, owner bounds and same-side center separation. `OA_PORT_POLICY_RECEIPTS` optionally writes the same create-new canonical model, projection JSON and routing text artifacts as the a95 harness. New labels include identity set and frame index so reversed repeated heights cannot overwrite earlier evidence. The new tests create30 threshold frames and8 obstacle frames,114 artifacts when enabled; the original tests create36 more artifacts if the entire binary is run. + +**Predictions, not outcomes:** original CapacityAware continues `[12,0,0,12]` in each threshold sweep; stable ranking should reduce that churn substantially, with the same≤1 acceptance threshold held across all three identity sets. If a fixed set still cascades, preserve it as a failed attribution result; do not alter the set/ranking to manufacture a pass. The near-corner case should still block actual Right stubs for the new mode. The old Top obstacle may remain blocked or happen to be avoided by a different fallback choice; an incidental clear Top result would not establish clearance logic, which is unchanged. + +## Next root-owned serialized gate + +The new enum/allocator changes require a newly identified compiled core. **Do not link these tests to the old7e25 rlib or reuse the a95 standalone helper unchanged.** Use a new isolated target beneath this worktree, jobs1, locked dependencies and root absolute toolchain environment after root grants the lease. Preserve the old stamped core artifacts and receipts. + +Suggested attribution commands: + +```text +cargo test --locked --jobs 1 -p oa-core --test experimental_port_policy_falsifiers stable_fallback_ranking -- --nocapture --test-threads=1 +cargo test --locked --jobs 1 -p oa-core --test experimental_port_policy -- --nocapture --test-threads=1 +cargo test --locked --jobs 1 -p oa-core --lib capacity_experiment::tests -- --nocapture --test-threads=1 +``` + +The first command must select exactly the two new tests and is expected to return a test failure for real-exit clearance. Preserve its complete log and execute the original two falsifiers separately or the full four-test binary when checking unchanged historical outcomes; do not skip the remaining gates merely because the planned clearance criterion fails. The eight historical policy comparisons and three old allocator tests should pass. Existing port-anchor tests remain a useful additional gate when root batches the affected core checks. + +## Exact committed file hashes + +| Path relative to new worktree | SHA-256 | +| --- | --- | +| `crates/oa-core/src/projection.rs` | `5db6aebe98aaec0c8990dec1e4cb8897b63a35954c75510a60fabb992d90fe5b` | +| `crates/oa-core/src/projection/port_layout.rs` | `653f345c09db576c8b859bd6797739beec82216204706eb49b2427b3b7a7d0a9` | +| `crates/oa-core/src/projection/port_capacity_experiment.rs` | `9d0fc16092fcc446e29110cb838969b134066c61cdeb50f5242fea8df32df7a3` | +| `crates/oa-core/tests/experimental_port_policy_falsifiers.rs` | `a70368362c2e1d64c89afa78b0ae0bd3b7c19b88709ee34e0e383558787f160d` | + +No execution result or production readiness claim is made by this source handoff. The interval/repair comparison remains in `resize-port-policy-revision-design-20260912.md` for fresh critique after this attribution experiment. diff --git a/harness/experiments/resize-port-policy-20260912/stable-ranking/source/crates/oa-core/src/projection.rs b/harness/experiments/resize-port-policy-20260912/stable-ranking/source/crates/oa-core/src/projection.rs new file mode 100644 index 00000000..b6f71ab2 --- /dev/null +++ b/harness/experiments/resize-port-policy-20260912/stable-ranking/source/crates/oa-core/src/projection.rs @@ -0,0 +1,600 @@ +pub use crate::model::PortAnchorSide; +use crate::*; +use serde::{Deserialize, Serialize}; +use std::collections::{BTreeMap, BTreeSet}; +mod port_layout; +pub use port_layout::{port_anchor_offset, port_anchor_position}; + +/// Isolated experiment only: no persisted setting or production default change. +#[doc(hidden)] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ExperimentalPortPolicy { + Current, + SameSidesAdaptSpacing, + CapacityAware, + CapacityAwareStableRanking, +} +#[path = "projection/state.rs"] +mod state; +pub(crate) use state::node_size as state_node_size; +pub use state::{state_header_height, state_machine_contains, state_symbol_size}; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct ProjectedNode { + pub id: Id, + pub element: Id, + pub position: Position, + pub size: Size, + pub visual_parent: Option, + pub depth: usize, + pub collapsed: bool, + /// The work is grouped by its allocated leaves, not by a direct allocation. + pub allocation_summary: bool, +} +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct ProjectedEdge { + pub id: Id, + pub source: Id, + pub target: Id, + pub trace: bool, + pub oriented: bool, + pub source_port: Option, + pub target_port: Option, +} +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct ProjectedPort { + pub element: Id, + /// Placement identity of the owning visible function/participant. + pub owner: Id, + pub position: Position, + pub side: PortAnchorSide, +} +/// Semantic fallback for an unconnected port. Neutral ports have no preferred +/// side; the projected view resolves their placement using peers and capacity. +/// A preferred side never constrains an authored anchor. +pub fn port_anchor_side(e: &Element) -> Option { + let Some(SharedBody::Port { contract, legacy }) = e.shared() else { + return None; + }; + match contract { + PortContract::FunctionInput { .. } => Some(PortAnchorSide::Left), + PortContract::FunctionOutput { .. } => Some(PortAnchorSide::Right), + PortContract::Component { + kind: ComponentPortKind::Flow, + orientation: ComponentPortOrientation::In, + } => Some(PortAnchorSide::Left), + PortContract::Component { + kind: ComponentPortKind::Flow, + orientation: ComponentPortOrientation::Out, + } => Some(PortAnchorSide::Right), + PortContract::Legacy => match legacy.as_ref().map(|l| l.direction) { + Some(PortDirection::In) => Some(PortAnchorSide::Left), + Some(PortDirection::Out) => Some(PortAnchorSide::Right), + _ => None, + }, + _ => None, + } +} +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct ProjectedView { + pub nodes: Vec, + pub edges: Vec, + pub ports: Vec, +} +pub(crate) fn minimum_node_size(p: &Project, element: Id, size: Size) -> Size { + port_layout::minimum_size(p, element, size) +} +pub(crate) fn port_footer(_p: &Project, _element: Id) -> f32 { + 24. +} + +pub(crate) fn parents(p: &Project, d: &Diagram) -> BTreeMap> { + let placed: BTreeMap<_, _> = d + .nodes + .values() + .filter(|n| { + p.elements.get(&n.element).is_some_and(|e| { + e.kind() != Kind::Port + && d.projection.includes(e.kind()) + && d.projection + .state_machine() + .is_none_or(|machine| state_machine_contains(p, machine, e.id)) + }) + }) + .map(|n| (n.element, n.id)) + .collect(); + d.nodes + .values() + .filter(|n| placed.contains_key(&n.element)) + .map(|n| { + let mut semantic = p.elements.get(&n.element).and_then(|e| e.parent); + if d.projection == ProjectionKind::Allocation + && let Some(performer) = crate::validation::allocation_summary(p, n.element) + { + let mut candidate = semantic; + let mut visible_work_parent = None; + let mut seen = BTreeSet::new(); + while let Some(id) = candidate { + if !seen.insert(id) + || crate::validation::allocation_summary(p, id) != Some(performer) + { + break; + } + if placed.contains_key(&id) { + visible_work_parent = Some(id); + break; + } + candidate = p.elements.get(&id).and_then(|e| e.parent); + } + semantic = visible_work_parent.or(Some(performer)); + } + if d.projection == ProjectionKind::Traceability { + return (n.id, None); + } + let mut seen = BTreeSet::new(); + let mut parent = None; + while let Some(id) = semantic { + if !seen.insert(id) { + break; + } + if let Some(node) = placed.get(&id) { + parent = Some(*node); + break; + } + semantic = p.elements.get(&id).and_then(|e| e.parent); + } + (n.id, parent) + }) + .collect() +} +pub fn descendant_nodes(p: &Project, diagram: Id, node: Id) -> Vec { + let Some(d) = p.diagrams.get(&diagram) else { + return vec![]; + }; + let parents = parents(p, d); + parents + .keys() + .copied() + .filter(|candidate| { + let mut current = parents.get(candidate).copied().flatten(); + let mut seen = BTreeSet::new(); + while let Some(id) = current { + if id == node { + return true; + } + if !seen.insert(id) { + break; + } + current = parents.get(&id).copied().flatten(); + } + false + }) + .collect() +} +/// Actual endpoint-owner placements before folding promotes a hidden endpoint +/// to an ancestor. Ports belong to their placed function/participant; they do not +/// acquire independent placement identities. Missing placements are not inferred. +pub fn edge_endpoint_placements(p: &Project, d: &Diagram, edge: Id) -> Option<(Id, Id)> { + let (source, target) = if let Some(r) = p.relations.get(&edge) { + (r.source(), r.target()) + } else { + let trace = p.traces.get(&edge)?; + (trace.oa, trace.sa) + }; + let placement = |id| { + let element = p.elements.get(&id)?; + let owner = if element.kind() == Kind::Port { + element.parent? + } else { + id + }; + d.nodes.values().find(|n| n.element == owner).map(|n| n.id) + }; + Some((placement(source)?, placement(target)?)) +} + +/// Route updates for a simultaneous placement movement. `deltas` maps placement +/// identities to diagram-space displacement. Only routes with two actual owners +/// moving by the same nonzero delta translate; one-ended moves keep world pins. +/// Returns changed records only, for the caller to apply with its node edits in +/// one transaction. This pure helper also drives reflow and drag previews. +pub fn translated_routes( + p: &Project, + d: &Diagram, + deltas: &BTreeMap, +) -> Vec { + d.routes + .iter() + .filter_map(|route| { + let (source, target) = edge_endpoint_placements(p, d, route.edge)?; + let source_delta = deltas.get(&source)?; + let target_delta = deltas.get(&target)?; + if d.projection.state_machine().is_some() + && !state::boundary_moves_with(p, d, route.edge, source_delta, deltas) + { + return None; + } + if source_delta != target_delta + || (source_delta.x == 0. && source_delta.y == 0.) + || route.waypoints.is_empty() + { + return None; + } + let mut translated = route.clone(); + for point in &mut translated.waypoints { + point.x += source_delta.x; + point.y += source_delta.y; + } + Some(translated) + }) + .collect() +} +/// One projection drives drawing, hit testing, Fit, SVG, and grouped movement. +pub fn project_view(p: &Project, diagram: Id) -> ProjectedView { + let Some(d) = p.diagrams.get(&diagram) else { + return ProjectedView::default(); + }; + project_diagram(p, d) +} +/// Reuse an index built for this accepted semantic revision during presentation +/// previews. Callers must invalidate it when semantic records change. +pub fn project_view_with_index( + p: &Project, + diagram: Id, + index: &crate::view_options::ViewIndex, +) -> ProjectedView { + p.diagrams + .get(&diagram) + .map_or_else(ProjectedView::default, |d| { + project_diagram_with_index(p, d, index) + }) +} +/// Project alternate placement geometry without copying or mutating semantics. +pub fn project_diagram(p: &Project, d: &Diagram) -> ProjectedView { + let index = crate::view_options::ViewIndex::new(p); + project_diagram_with_index(p, d, &index) +} +pub fn project_diagram_with_index( + p: &Project, + d: &Diagram, + index: &crate::view_options::ViewIndex, +) -> ProjectedView { + project_diagram_impl(p, d, None, Some(index), ExperimentalPortPolicy::Current) +} +/// Compare port policies over the actual projector; not a document/API setting. +#[doc(hidden)] +pub fn project_diagram_with_experimental_port_policy( + p: &Project, + d: &Diagram, + policy: ExperimentalPortPolicy, +) -> ProjectedView { + let index = crate::view_options::ViewIndex::new(p); + project_diagram_impl(p, d, None, Some(&index), policy) +} +/// Unfiltered eligibility from the same projection/anchor/fold decisions used +/// for drawing. Compute once for a view-options editor, then combine with the +/// prepared filter's reasons; hidden lines remain geometrically eligible here. +pub fn edge_availability( + p: &Project, + d: &Diagram, +) -> BTreeMap { + let mut availability = p + .relations + .keys() + .chain(p.traces.keys()) + .map(|id| { + ( + *id, + crate::view_options::EdgeAvailability::OutsideProjection, + ) + }) + .collect(); + project_diagram_impl( + p, + d, + Some(&mut availability), + None, + ExperimentalPortPolicy::Current, + ); + availability +} +fn project_diagram_impl( + p: &Project, + d: &Diagram, + mut availability: Option<&mut BTreeMap>, + index: Option<&crate::view_options::ViewIndex>, + port_policy: ExperimentalPortPolicy, +) -> ProjectedView { + let parents = parents(p, d); + let mut nodes = Vec::new(); + for n in d.nodes.values() { + let Some(e) = p.elements.get(&n.element) else { + continue; + }; + if e.kind() == Kind::Port + || !d.projection.includes(e.kind()) + || d.projection + .state_machine() + .is_some_and(|machine| !state_machine_contains(p, machine, e.id)) + { + continue; + } + if d.projection != ProjectionKind::Traceability && e.layer() != d.layer { + continue; + } + let mut current = parents.get(&n.id).copied().flatten(); + let mut seen = BTreeSet::new(); + let mut depth = 0; + let mut hidden = false; + while let Some(id) = current { + if !seen.insert(id) { + hidden = true; + break; + } + depth += 1; + if d.nodes.get(&id).is_some_and(|n| n.collapsed) { + hidden = true; + } + current = parents.get(&id).copied().flatten(); + } + if !hidden { + let size = minimum_node_size( + p, + e.id, + if n.collapsed { + Size { + width: n.size.width, + height: 94., + } + } else { + n.size + }, + ); + let size = if d.projection.state_machine().is_some() { + state::node_size(p, e, size, n.collapsed) + } else { + size + }; + nodes.push(ProjectedNode { + id: n.id, + element: n.element, + position: n.position, + size, + visual_parent: parents.get(&n.id).copied().flatten(), + depth, + collapsed: n.collapsed, + allocation_summary: d.projection == ProjectionKind::Allocation + && crate::validation::allocation_summary(p, e.id).is_some() + && !p + .relations + .values() + .any(|r| r.kind() == RelationKind::Allocation && r.target() == e.id), + }); + } + } + nodes.sort_by_key(|n| (n.depth, n.id)); + enclose_with_headers(p, &mut nodes, d.projection.state_machine().is_some()); + if d.projection.state_machine().is_some() { + state::snap_boundaries(p, &mut nodes); + } + let visible: BTreeSet<_> = nodes.iter().map(|n| n.id).collect(); + let placed: BTreeMap<_, _> = d.nodes.values().map(|n| (n.element, n.id)).collect(); + let anchor = |element: Id| { + let owner = p + .elements + .get(&element) + .filter(|e| e.kind() == Kind::Port) + .and_then(|e| e.parent) + .unwrap_or(element); + let mut id = placed.get(&owner).copied(); + let mut seen = BTreeSet::new(); + while let Some(n) = id { + if visible.contains(&n) { + return Some(n); + } + if !seen.insert(n) { + break; + } + id = parents.get(&n).copied().flatten(); + } + None + }; + let visible_ports: BTreeSet<_> = p + .elements + .values() + .filter(|e| { + e.kind() == Kind::Port + && e.parent + .and_then(|id| placed.get(&id)) + .is_some_and(|id| visible.contains(id)) + }) + .map(|e| e.id) + .collect(); + let mut edges = Vec::new(); + for r in p.relations.values() { + // Interface allocations are selectable nested dictionary rows. Their + // independently identified contracts do not add noisy diagram arrows. + if r.kind() == RelationKind::InterfaceItemAllocation { + continue; + } + if d.projection == ProjectionKind::Allocation && r.kind() == RelationKind::Allocation { + continue; + } + let included = match d.projection { + ProjectionKind::StateMachine { machine } => matches!(&r.body, + RelationBody::StateTransition { transition_kind, .. } + if *transition_kind != TransitionKind::Internal + && state_machine_contains(p, machine, r.source()) + && state_machine_contains(p, machine, r.target())), + ProjectionKind::Allocation => matches!( + r.kind(), + RelationKind::Interaction + | RelationKind::FunctionalExchange + | RelationKind::BoundaryExchange + | RelationKind::CommunicationMean + ), + ProjectionKind::FunctionalDataflow => matches!( + r.kind(), + RelationKind::Interaction | RelationKind::FunctionalExchange + ), + ProjectionKind::Capabilities => matches!( + r.kind(), + RelationKind::CapabilityInclude + | RelationKind::CapabilityExtend + | RelationKind::CapabilityGeneralization + | RelationKind::MissionCapability + | RelationKind::MissionInvolvement + | RelationKind::CapabilityInvolvement + | RelationKind::CommunicationMean + ), + _ => true, + }; + if !included { + continue; + } + let ends = (anchor(r.source()), anchor(r.target())); + let self_loop = (d.projection.state_machine().is_some() + || r.kind() == RelationKind::DataAssociation) + && r.source() == r.target() + && nodes + .iter() + .any(|n| Some(n.id) == ends.0 && n.element == r.source()); + if let Some(availability) = availability.as_deref_mut() { + use crate::view_options::EdgeAvailability as A; + availability.insert( + r.id, + match ends { + (Some(a), Some(b)) if a != b || self_loop => A::Visible, + (Some(_), Some(_)) => A::FoldedInternal, + (a, b) => A::EndpointNotShown { + source: a.is_none(), + target: b.is_none(), + }, + }, + ); + } + if let (Some(source), Some(target)) = ends + && (source != target || self_loop) + { + let (source_port, target_port) = match &r.body { + RelationBody::FunctionalExchange { + source_port, + target_port, + .. + } => (Some(*source_port), Some(*target_port)), + RelationBody::BoundaryExchange { source, target, .. } + | RelationBody::PortAllocation { source, target } => (Some(*source), Some(*target)), + _ => (None, None), + }; + edges.push(ProjectedEdge { + id: r.id, + source, + target, + trace: false, + oriented: !matches!( + &r.body, + RelationBody::BoundaryExchange { + oriented: false, + .. + } | RelationBody::CommunicationMean { + oriented: false, + .. + } | RelationBody::DataAssociation { .. } + ), + source_port: source_port.filter(|id| visible_ports.contains(id)), + target_port: target_port.filter(|id| visible_ports.contains(id)), + }); + } + } + if d.projection == ProjectionKind::Traceability { + for t in p.traces.values() { + let ends = (anchor(t.oa), anchor(t.sa)); + if let Some(availability) = availability.as_deref_mut() { + use crate::view_options::EdgeAvailability as A; + availability.insert( + t.id, + match ends { + (Some(a), Some(b)) if a != b => A::Visible, + (Some(_), Some(_)) => A::FoldedInternal, + (a, b) => A::EndpointNotShown { + source: a.is_none(), + target: b.is_none(), + }, + }, + ); + } + if let (Some(source), Some(target)) = ends + && source != target + { + edges.push(ProjectedEdge { + id: t.id, + source, + target, + trace: true, + oriented: true, + source_port: None, + target_port: None, + }); + } + } + } + // Dedicated state views contain state symbols, not semantic component ports. + // Port layout would re-enclose already snapped boundary vertices. + let ports = if d.projection.state_machine().is_some() { + Vec::new() + } else { + port_layout::layout(p, d, &mut nodes, &edges, port_policy) + }; + // Port geometry uses every eligible edge. Presentation filters must never + // move visible ports when another line is hidden or a category is selected. + if let Some(index) = index { + let filter = if d.projection == ProjectionKind::Traceability { + index.prepare_cross_layer(d.layer, &d.view_options) + } else { + index.prepare(d.layer, &d.view_options) + }; + edges.retain(|edge| filter.includes(edge.id)); + } + ProjectedView { + nodes, + edges, + ports, + } +} + +fn enclose(p: &Project, nodes: &mut [ProjectedNode]) { + enclose_with_headers(p, nodes, false); +} +fn enclose_with_headers(p: &Project, nodes: &mut [ProjectedNode], state_view: bool) { + for index in (0..nodes.len()).rev() { + let child = nodes[index].clone(); + if state_view + && p.elements + .get(&child.element) + .is_some_and(|e| matches!(e.kind(), Kind::EntryPoint | Kind::ExitPoint)) + { + continue; + } + if let Some(parent) = child + .visual_parent + .and_then(|id| nodes.iter().position(|n| n.id == id)) + { + let footer = port_footer(p, nodes[parent].element); + let header = if state_view { + state_header_height(p, nodes[parent].element) + } else { + 64. + }; + let p = &mut nodes[parent]; + let right = + (p.position.x + p.size.width).max(child.position.x + child.size.width + 24.); + let bottom = + (p.position.y + p.size.height).max(child.position.y + child.size.height + footer); + p.position.x = p.position.x.min(child.position.x - 24.); + // Reserve two readable header lines above the first nested card. + p.position.y = p.position.y.min(child.position.y - header); + p.size.width = right - p.position.x; + p.size.height = bottom - p.position.y; + } + } +} diff --git a/harness/experiments/resize-port-policy-20260912/stable-ranking/source/crates/oa-core/src/projection/port_capacity_experiment.rs b/harness/experiments/resize-port-policy-20260912/stable-ranking/source/crates/oa-core/src/projection/port_capacity_experiment.rs new file mode 100644 index 00000000..29723b86 --- /dev/null +++ b/harness/experiments/resize-port-policy-20260912/stable-ranking/source/crates/oa-core/src/projection/port_capacity_experiment.rs @@ -0,0 +1,275 @@ +//! Experimental four-side capacity assignment; no model fields or router feedback. +use super::*; + +#[derive(Clone)] +pub(super) struct Demand { + pub preferred: PortAnchorSide, + pub semantic: Option, + pub clear: [bool; 4], +} + +fn index(side: PortAnchorSide) -> usize { + SIDES + .iter() + .position(|candidate| *candidate == side) + .unwrap() +} + +fn capacity(length: f32) -> usize { + if length < 2. * CORNER { + 0 + } else { + ((length - 2. * CORNER) / GAP).floor() as usize + 1 + } +} + +fn counts(assigned: &[Option]) -> [usize; 4] { + let mut result = [0; 4]; + for side in assigned.iter().flatten() { + result[index(*side)] += 1; + } + result +} + +// Explicit reproducible identity/side ranking for the fourth experimental mode. +// UUID bits are interpreted as u128, with low64 XOR high64.rotate_left(17). +// Each side uses (L/R/T/B index + 1) * the golden-ratio constant as a salt. +// The SplitMix64 finalizer below uses wrapping arithmetic. Largest score wins; +// equal scores use L/R/T/B order. No occupancy, overflow ordinal or runtime hash. +fn identity_score(port: Id, side: PortAnchorSide) -> u64 { + let bits = port.as_u128(); + let mut value = bits as u64 + ^ ((bits >> 64) as u64).rotate_left(17) + ^ (index(side) as u64 + 1).wrapping_mul(0x9e37_79b9_7f4a_7c15); + value = (value ^ (value >> 30)).wrapping_mul(0xbf58_476d_1ce4_e5b9); + value = (value ^ (value >> 27)).wrapping_mul(0x94d0_49bb_1331_11eb); + value ^ (value >> 31) +} + +fn ranked(demand: &Demand, counts: [usize; 4], identity: Option) -> Vec { + let mut result = Vec::new(); + for side in [Some(demand.preferred), demand.semantic] + .into_iter() + .flatten() + { + if demand.clear[index(side)] && !result.contains(&side) { + result.push(side); + } + } + let mut remaining = SIDES; + if let Some(port) = identity { + remaining + .sort_by_key(|side| (std::cmp::Reverse(identity_score(port, *side)), index(*side))); + } else { + remaining.sort_by_key(|side| (counts[index(*side)], index(*side))); + } + for side in remaining { + if demand.clear[index(side)] && !result.contains(&side) { + result.push(side); + } + } + result +} + +// An alternating reassignment visits each of four side bins at most once. +// It is attempted only after every directly free clear side has been considered. +fn try_assign( + port: usize, + demands: &[Demand], + capacities: [usize; 4], + assigned: &mut [Option], + visited: &mut [bool; 4], + identities: Option<&[Id]>, +) -> bool { + let counts = counts(assigned); + let sides = ranked(&demands[port], counts, identities.map(|ids| ids[port])); + for side in &sides { + let slot = index(*side); + if !visited[slot] && counts[slot] < capacities[slot] { + assigned[port] = Some(*side); + return true; + } + } + for side in sides { + let slot = index(side); + if visited[slot] || capacities[slot] == 0 { + continue; + } + visited[slot] = true; + let occupants: Vec<_> = assigned + .iter() + .enumerate() + .filter_map(|(port, current)| (*current == Some(side)).then_some(port)) + .collect(); + for other in occupants { + if try_assign(other, demands, capacities, assigned, visited, identities) { + assigned[port] = Some(side); + return true; + } + } + } + false +} + +fn assign_with_capacities(demands: &[Demand], capacities: [usize; 4]) -> Vec { + assign_with_identities(demands, capacities, None) +} + +fn assign_with_identities( + demands: &[Demand], + capacities: [usize; 4], + identities: Option<&[Id]>, +) -> Vec { + assert!(identities.is_none_or(|ids| ids.len() == demands.len())); + let mut assigned = vec![None; demands.len()]; + // Demands are in the core's stable semantic port-ID order. Manual anchors + // are deliberately absent: editing one must not resize owners or flip peers. + for port in 0..demands.len() { + try_assign( + port, + demands, + capacities, + &mut assigned, + &mut [false; 4], + identities, + ); + } + for (port, demand) in demands.iter().enumerate() { + if assigned[port].is_some() { + continue; + } + let counts = counts(&assigned); + // Prefer a crowded clear exit to an available blocked one. The existing + // position allocator adapts spacing; no port or owner geometry is invented. + let side = ranked(demand, counts, identities.map(|ids| ids[port])) + .into_iter() + .next() + .unwrap_or_else(|| { + *SIDES + .iter() + .min_by_key(|side| counts[index(**side)]) + .unwrap() + }); + assigned[port] = Some(side); + } + assigned.into_iter().map(Option::unwrap).collect() +} + +pub(super) fn assign(node: &ProjectedNode, demands: &[Demand]) -> Vec { + assign_with_capacities( + demands, + [ + capacity(node.size.height), + capacity(node.size.height), + capacity(node.size.width), + capacity(node.size.width), + ], + ) +} + +pub(super) fn assign_stable( + node: &ProjectedNode, + demands: &[Demand], + identities: &[Id], +) -> Vec { + assign_with_identities( + demands, + [ + capacity(node.size.height), + capacity(node.size.height), + capacity(node.size.width), + capacity(node.size.width), + ], + Some(identities), + ) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn demand(preferred: PortAnchorSide, sides: &[PortAnchorSide]) -> Demand { + Demand { + preferred, + semantic: None, + clear: SIDES.map(|side| sides.contains(&side)), + } + } + + #[test] + fn reassignment_recovers_scarce_clear_capacity() { + use PortAnchorSide::{Left, Right, Top}; + // Assignment-level falsifier only. Its clear masks are not yet produced + // by a model fixture with actual peer geometry. + let mut demands = vec![demand(Left, &[Left, Top]); 8]; + demands.extend(vec![demand(Left, &[Left, Right]); 9]); + demands.extend(vec![demand(Right, &[Right, Top]); 3]); + let capacities = [8, 8, 6, 0]; + let result = assign_with_capacities(&demands, capacities); + let totals = counts(&result.iter().copied().map(Some).collect::>()); + for (actual, capacity) in totals.into_iter().zip(capacities) { + assert!(actual <= capacity); + } + for (side, demand) in result.iter().zip(&demands) { + assert!(demand.clear[index(*side)]); + } + assert_eq!(assign_with_capacities(&demands, capacities), result); + } + + #[test] + fn clear_overflow_does_not_choose_a_blocked_empty_side() { + let demands = vec![demand(PortAnchorSide::Right, &[PortAnchorSide::Right]); 5]; + let result = assign_with_capacities(&demands, [10, 1, 10, 10]); + assert!(result.iter().all(|side| *side == PortAnchorSide::Right)); + } + + #[test] + fn small_clear_masks_match_an_exhaustive_assignment_oracle() { + let capacities = [1, 1, 1, 0]; + // All343 triples of nonempty masks on three sides. This validates the + // alternating assignment itself, not geometric reachability of masks. + for a in 1..8_u8 { + for b in 1..8_u8 { + for c in 1..8_u8 { + let demands: Vec<_> = [a, b, c] + .into_iter() + .map(|mask| { + let sides: Vec<_> = SIDES + .iter() + .copied() + .filter(|side| mask & (1 << index(*side)) != 0) + .collect(); + demand(sides[0], &sides) + }) + .collect(); + let feasible = (0..3).any(|x| { + (0..3).any(|y| { + (0..3).any(|z| { + x != y + && x != z + && y != z + && demands[0].clear[x] + && demands[1].clear[y] + && demands[2].clear[z] + }) + }) + }); + let result = assign_with_capacities(&demands, capacities); + for (side, demand) in result.iter().zip(&demands) { + assert!(demand.clear[index(*side)]); + } + if feasible { + let totals = counts(&result.into_iter().map(Some).collect::>()); + assert!( + totals + .into_iter() + .zip(capacities) + .all(|(n, capacity)| n <= capacity), + "missed feasible masks {a}/{b}/{c}" + ); + } + } + } + } + } +} diff --git a/harness/experiments/resize-port-policy-20260912/stable-ranking/source/crates/oa-core/src/projection/port_layout.rs b/harness/experiments/resize-port-policy-20260912/stable-ranking/source/crates/oa-core/src/projection/port_layout.rs new file mode 100644 index 00000000..555fa56b --- /dev/null +++ b/harness/experiments/resize-port-policy-20260912/stable-ranking/source/crates/oa-core/src/projection/port_layout.rs @@ -0,0 +1,426 @@ +//! Presentation-only port anchors. Automatic choices depend on owner geometry, +//! never on routed elbows, so routing cannot feed back into layout. +use super::*; +#[path = "port_capacity_experiment.rs"] +mod capacity_experiment; + +const GAP: f32 = 28.; +const CORNER: f32 = 18.; +const SIDES: [PortAnchorSide; 4] = [ + PortAnchorSide::Left, + PortAnchorSide::Right, + PortAnchorSide::Top, + PortAnchorSide::Bottom, +]; + +pub fn port_anchor_position(node: &ProjectedNode, side: PortAnchorSide, offset: f32) -> Position { + let (x, y) = match side { + PortAnchorSide::Left => (0., node.size.height * offset), + PortAnchorSide::Right => (node.size.width, node.size.height * offset), + PortAnchorSide::Top => (node.size.width * offset, 0.), + PortAnchorSide::Bottom => (node.size.width * offset, node.size.height), + }; + Position { + x: node.position.x + x, + y: node.position.y + y, + } +} + +pub fn port_anchor_offset(node: &ProjectedNode, side: PortAnchorSide, position: Position) -> f32 { + let value = match side { + PortAnchorSide::Left | PortAnchorSide::Right => { + (position.y - node.position.y) / node.size.height + } + PortAnchorSide::Top | PortAnchorSide::Bottom => { + (position.x - node.position.x) / node.size.width + } + }; + value.clamp(0., 1.) +} + +fn center(node: &ProjectedNode) -> Position { + Position { + x: node.position.x + node.size.width / 2., + y: node.position.y + node.size.height / 2., + } +} + +#[derive(Clone)] +struct Choice { + port: Id, + side: PortAnchorSide, + automatic_side: PortAnchorSide, + manual: Option, + peer: Option, + capacity: Option, +} + +fn facing(node: &ProjectedNode, peer: Position) -> Option { + let c = center(node); + let dx = (peer.x - c.x) / node.size.width; + let dy = (peer.y - c.y) / node.size.height; + if dx.abs().max(dy.abs()) < 0.001 { + return None; + } + if dx.abs() >= dy.abs() { + Some(if dx < 0. { + PortAnchorSide::Left + } else { + PortAnchorSide::Right + }) + } else { + Some(if dy < 0. { + PortAnchorSide::Top + } else { + PortAnchorSide::Bottom + }) + } +} + +fn clear_exit( + node: &ProjectedNode, + side: PortAnchorSide, + peers: &BTreeSet, + by_id: &BTreeMap, +) -> bool { + let a = port_anchor_position(node, side, 0.5); + let normal = side.normal(); + let b = Position { + x: a.x + normal.x * crate::routing::PORT_STUB, + y: a.y + normal.y * crate::routing::PORT_STUB, + }; + peers.iter().all(|peer| { + let other = by_id[peer]; + // A containing endpoint's body is traversable, just as in routing. + let mut ancestor = node.visual_parent; + for _ in 0..by_id.len() { + let Some(id) = ancestor else { + break; + }; + if id == *peer { + return true; + } + ancestor = by_id.get(&id).and_then(|n| n.visual_parent); + } + let padding = crate::routing::CLEARANCE; + let left = other.position.x - padding; + let right = other.position.x + other.size.width + padding; + let top = other.position.y - padding; + let bottom = other.position.y + other.size.height + padding; + if a.x == b.x { + !(a.x > left && a.x < right && a.y.min(b.y) < bottom && a.y.max(b.y) > top) + } else { + !(a.y > top && a.y < bottom && a.x.min(b.x) < right && a.x.max(b.x) > left) + } + }) +} + +#[derive(Default)] +struct Peers { + x: f64, + y: f64, + count: usize, + owners: BTreeSet, +} +impl Peers { + fn center(&self) -> Position { + Position { + x: (self.x / self.count as f64) as f32, + y: (self.y / self.count as f64) as f32, + } + } +} + +pub(super) fn minimum_size(p: &Project, element: Id, mut size: Size) -> Size { + let mut counts: BTreeMap<_, usize> = SIDES.into_iter().map(|s| (s, 0)).collect(); + let mut neutral = 0; + for port in p.children(element).filter(|p| p.kind() == Kind::Port) { + if let Some(side) = port_anchor_side(port) { + *counts.get_mut(&side).unwrap() += 1; + } else { + neutral += 1; + } + } + for _ in 0..neutral { + let side = *SIDES.iter().min_by_key(|s| counts[s]).unwrap(); + *counts.get_mut(&side).unwrap() += 1; + } + let vertical = counts[&PortAnchorSide::Left].max(counts[&PortAnchorSide::Right]); + let horizontal = counts[&PortAnchorSide::Top].max(counts[&PortAnchorSide::Bottom]); + if vertical > 0 { + size.height = size.height.max(76. + GAP * (vertical + 1) as f32); + } + if horizontal > 0 { + size.width = size.width.max(GAP * (horizontal + 1) as f32); + } + size +} + +pub(super) fn layout( + p: &Project, + d: &Diagram, + nodes: &mut [ProjectedNode], + edges: &[ProjectedEdge], + policy: ExperimentalPortPolicy, +) -> Vec { + let by_id: BTreeMap<_, _> = nodes.iter().map(|n| (n.id, n)).collect(); + let mut peers: BTreeMap<(Id, Id), Peers> = BTreeMap::new(); + for edge in edges { + // Port allocation is implementation traceability, not a communication + // peer. It must not turn an external boundary port toward its own work. + if !p.relations.get(&edge.id).is_some_and(|r| { + matches!( + r.kind(), + RelationKind::FunctionalExchange | RelationKind::BoundaryExchange + ) + }) { + continue; + } + for (owner, port, other) in [ + (edge.source, edge.source_port, edge.target), + (edge.target, edge.target_port, edge.source), + ] { + if let (Some(port), Some(other)) = (port, by_id.get(&other)) { + let c = center(other); + let entry = peers.entry((owner, port)).or_default(); + entry.x += f64::from(c.x); + entry.y += f64::from(c.y); + entry.count += 1; + entry.owners.insert(other.id); + } + } + } + let mut children: BTreeMap> = BTreeMap::new(); + for port in p.elements.values().filter(|e| e.kind() == Kind::Port) { + if let Some(parent) = port.parent { + children.entry(parent).or_default().push(port); + } + } + let mut choices = BTreeMap::>::new(); + for node in nodes.iter() { + let anchors: BTreeMap<_, _> = d.nodes[&node.id] + .port_anchors + .iter() + .map(|a| (a.port, a)) + .collect(); + let mut counts: BTreeMap<_, usize> = SIDES.into_iter().map(|s| (s, 0)).collect(); + // Compute the automatic capacity independently of manual overrides. + // Moving a port must not resize its owner or flip unrelated ports. + for port in children.get(&node.element).into_iter().flatten() { + let connected = peers.get(&(node.id, port.id)); + let peer = connected.map(Peers::center); + let clear = + |side| connected.is_none_or(|peers| clear_exit(node, side, &peers.owners, &by_id)); + let anchor = anchors.get(&port.id); + let side = { + peer.and_then(|v| facing(node, v)) + .filter(|side| clear(*side)) + } + .or_else(|| port_anchor_side(port).filter(|side| clear(*side))) + .or_else(|| { + SIDES + .iter() + .filter(|side| clear(**side)) + .min_by_key(|s| counts[s]) + .copied() + }) + .unwrap_or_else(|| *SIDES.iter().min_by_key(|s| counts[s]).unwrap()); + *counts.get_mut(&side).unwrap() += 1; + choices.entry(node.id).or_default().push(Choice { + port: port.id, + side: anchor.map_or(side, |a| a.side), + automatic_side: side, + manual: anchor.map(|a| a.offset), + peer, + capacity: matches!( + policy, + ExperimentalPortPolicy::CapacityAware + | ExperimentalPortPolicy::CapacityAwareStableRanking + ) + .then(|| capacity_experiment::Demand { + preferred: side, + semantic: port_anchor_side(port), + clear: SIDES.map(clear), + }), + }); + } + } + if matches!( + policy, + ExperimentalPortPolicy::CapacityAware | ExperimentalPortPolicy::CapacityAwareStableRanking + ) { + for node in nodes.iter() { + let Some(choices) = choices.get_mut(&node.id) else { + continue; + }; + let demands: Vec<_> = choices + .iter() + .map(|choice| choice.capacity.clone().unwrap()) + .collect(); + let sides = if policy == ExperimentalPortPolicy::CapacityAwareStableRanking { + let identities: Vec<_> = choices.iter().map(|choice| choice.port).collect(); + capacity_experiment::assign_stable(node, &demands, &identities) + } else { + capacity_experiment::assign(node, &demands) + }; + for (choice, side) in choices.iter_mut().zip(sides) { + choice.automatic_side = side; + if choice.manual.is_none() { + choice.side = side; + } + } + } + } + // One capacity pass followed by semantic enclosure. Side choices stay frozen + // throughout this pass; expanded parents cannot cause layout oscillation. + // Experimental alternatives finalize nodes before port-side assignment. + if policy == ExperimentalPortPolicy::Current { + for node in nodes.iter_mut() { + for side in SIDES { + let count = choices + .get(&node.id) + .into_iter() + .flatten() + .filter(|c| c.automatic_side == side) + .count(); + if count == 0 { + continue; + } + let minimum = 2. * CORNER + GAP * count.saturating_sub(1) as f32; + match side { + PortAnchorSide::Left | PortAnchorSide::Right => { + node.size.height = node.size.height.max(minimum) + } + PortAnchorSide::Top | PortAnchorSide::Bottom => { + node.size.width = node.size.width.max(minimum) + } + } + } + } + super::enclose(p, nodes); + } + let mut result = Vec::new(); + for node in nodes.iter() { + let Some(choices) = choices.get(&node.id) else { + continue; + }; + for side in SIDES { + let mut automatic: Vec<_> = choices + .iter() + .filter(|c| c.side == side && c.manual.is_none()) + .collect(); + let horizontal = matches!(side, PortAnchorSide::Top | PortAnchorSide::Bottom); + automatic.sort_by(|a, b| { + let axis = |c: &Choice| c.peer.map(|p| if horizontal { p.x } else { p.y }); + match (axis(a), axis(b)) { + (Some(a), Some(b)) => a.total_cmp(&b), + (Some(_), None) => std::cmp::Ordering::Less, + (None, Some(_)) => std::cmp::Ordering::Greater, + _ => std::cmp::Ordering::Equal, + } + .then_with(|| a.port.cmp(&b.port)) + }); + let length = if horizontal { + node.size.width + } else { + node.size.height + }; + let mut fixed = Vec::new(); + for choice in choices.iter().filter(|c| c.side == side) { + if let Some(offset) = choice.manual { + fixed.push(offset * length); + result.push(ProjectedPort { + element: choice.port, + owner: node.id, + side, + position: port_anchor_position(node, side, offset), + }); + } + } + let positions = automatic_positions(length, &fixed, automatic.len()); + for (choice, distance) in automatic.into_iter().zip(positions) { + result.push(ProjectedPort { + element: choice.port, + owner: node.id, + side, + position: port_anchor_position(node, side, distance / length), + }); + } + } + } + result +} + +/// Allocate free intervals around authored anchors. If manual anchors are too +/// crowded to satisfy the desired gap, retain them and degrade spacing evenly. +fn automatic_positions(length: f32, fixed: &[f32], count: usize) -> Vec { + if count == 0 { + return Vec::new(); + } + let mut fixed = fixed.to_vec(); + fixed.sort_by(f32::total_cmp); + let mut gap = GAP; + let intervals = loop { + let mut start = CORNER.min(length / 2.); + let end = (length - CORNER).max(start); + let mut free = Vec::new(); + for &anchor in &fixed { + if anchor - gap >= start { + free.push((start, (anchor - gap).min(end))); + } + start = start.max(anchor + gap); + if start > end { + break; + } + } + if start <= end { + free.push((start, end)); + } + free.retain(|(a, b)| b >= a); + let capacity: usize = free + .iter() + .map(|(a, b)| (((b - a) / gap).floor() as usize).saturating_add(1)) + .sum(); + if capacity >= count { + break free; + } + gap /= 2.; + if gap < 0.001 { + return (0..count) + .map(|i| length * (i + 1) as f32 / (count + 1) as f32) + .collect(); + } + }; + let capacities: Vec<_> = intervals + .iter() + .map(|(a, b)| (((b - a) / gap).floor() as usize).saturating_add(1)) + .collect(); + let total: usize = capacities.iter().sum(); + let mut allocated: Vec<_> = capacities + .iter() + .map(|capacity| (count as u128 * *capacity as u128 / total as u128) as usize) + .collect(); + let mut remainder: Vec<_> = capacities + .iter() + .enumerate() + .map(|(i, capacity)| (count as u128 * *capacity as u128 % total as u128, i)) + .collect(); + remainder.sort_by(|(a, i), (b, j)| b.cmp(a).then_with(|| i.cmp(j))); + let unassigned = count - allocated.iter().sum::(); + for (_, index) in remainder.into_iter().take(unassigned) { + allocated[index] += 1; + } + intervals + .into_iter() + .zip(allocated) + .flat_map(|((a, b), count)| { + (0..count).map(move |i| { + if count == 1 { + (a + b) / 2. + } else { + a + (b - a) * i as f32 / (count - 1) as f32 + } + }) + }) + .collect() +} diff --git a/harness/experiments/resize-port-policy-20260912/stable-ranking/source/crates/oa-core/tests/experimental_port_policy_falsifiers.rs b/harness/experiments/resize-port-policy-20260912/stable-ranking/source/crates/oa-core/tests/experimental_port_policy_falsifiers.rs new file mode 100644 index 00000000..0a31254a --- /dev/null +++ b/harness/experiments/resize-port-policy-20260912/stable-ranking/source/crates/oa-core/tests/experimental_port_policy_falsifiers.rs @@ -0,0 +1,585 @@ +//! Prospective acceptance falsifiers, intentionally expected to fail at 7e25b3d. +//! Do not change the policy or relax these criteria before preserving first-run +//! receipts. Source-derived predictions are diagnostic text, not test outcomes. +use oa_core::{projection::*, routing::*, *}; +use std::{fs::OpenOptions, io::Write, path::PathBuf}; + +const POLICIES: [ExperimentalPortPolicy; 3] = [ + ExperimentalPortPolicy::Current, + ExperimentalPortPolicy::SameSidesAdaptSpacing, + ExperimentalPortPolicy::CapacityAware, +]; +const SIDES: [PortAnchorSide; 4] = [ + PortAnchorSide::Left, + PortAnchorSide::Right, + PortAnchorSide::Top, + PortAnchorSide::Bottom, +]; +fn id(n: u128) -> Id { + Id::from_u128(0x956a2026_0912_4000_8000_000000000000 + n) +} +fn pos(x: f32, y: f32) -> Position { + Position { x, y } +} +fn size(width: f32, height: f32) -> Size { + Size { width, height } +} +fn element(p: &mut Project, n: u128, kind: Kind, name: &str) -> Id { + let mut e = p.make_element(kind, Layer::Sa, name, None).unwrap(); + e.id = id(n); + p.elements.insert(e.id, e); + id(n) +} +fn standard(p: &mut Project, n: u128, owner: Id, name: &str) -> Id { + let port = make_port( + p, + id(n), + owner, + name, + PortContract::Component { + kind: ComponentPortKind::Standard, + orientation: ComponentPortOrientation::Unset, + }, + ) + .unwrap(); + p.elements.insert(port.id, port); + id(n) +} +fn place(p: &mut Project, d: Id, n: u128, e: Id, at: Position, dimensions: Size) -> Id { + let generated = p.place(d, e, at); + let nodes = &mut p.diagrams.get_mut(&d).unwrap().nodes; + let mut node = nodes.remove(&generated).unwrap(); + node.id = id(n); + node.size = dimensions; + nodes.insert(node.id, node); + id(n) +} +struct Fixture { + p: Project, + d: Id, + owner: Id, + ports: Vec, +} +fn right_peer(count: usize, height: f32, obstacle: bool) -> Fixture { + let mut p = Project::empty(); + p.id = id(1); + let a = element(&mut p, 10, Kind::System, "Owner"); + let b = element(&mut p, 11, Kind::SystemActor, "Far right peer"); + let pb = standard(&mut p, 20, b, "Peer interface"); + let mut ports = Vec::new(); + for i in 0..count { + let pa = standard(&mut p, 100 + i as u128, a, &format!("Interface {i}")); + let generated = p.relate( + RelationKind::BoundaryExchange, + &format!("Exchange {i}"), + pa, + pb, + ); + let mut relation = p.relations.remove(&generated).unwrap(); + relation.id = id(1000 + i as u128); + p.relations.insert(relation.id, relation); + ports.push(pa); + } + let generated = p.ensure_diagram(Layer::Sa); + let mut diagram = p.diagrams.remove(&generated).unwrap(); + diagram.id = id(30); + let d = diagram.id; + p.diagrams.insert(d, diagram); + let owner = place(&mut p, d, 40, a, pos(0., 0.), size(224., height)); + place(&mut p, d, 41, b, pos(1908., 336.), size(184., 132.)); + if obstacle { + let c = element(&mut p, 12, Kind::SystemActor, "Unrelated top obstacle"); + place(&mut p, d, 42, c, pos(0., -150.), size(224., 132.)); + } + validate_candidate(&p).unwrap(); + assert_eq!(language::parse(&language::format(&p)).unwrap(), p); + Fixture { p, d, owner, ports } +} +fn project(f: &Fixture, policy: ExperimentalPortPolicy) -> ProjectedView { + let view = project_diagram_with_experimental_port_policy(&f.p, &f.p.diagrams[&f.d], policy); + assert!(view.nodes.iter().all(|node| node.visual_parent.is_none())); + assert_eq!(view.edges.len(), f.ports.len()); + view +} +fn owner<'a>(f: &Fixture, view: &'a ProjectedView) -> &'a ProjectedNode { + view.nodes.iter().find(|n| n.id == f.owner).unwrap() +} +fn port(view: &ProjectedView, id: Id) -> &ProjectedPort { + view.ports.iter().find(|p| p.element == id).unwrap() +} +fn side_counts(f: &Fixture, view: &ProjectedView) -> [usize; 4] { + SIDES.map(|side| { + view.ports + .iter() + .filter(|p| p.owner == f.owner && p.side == side) + .count() + }) +} +fn gap(f: &Fixture, view: &ProjectedView) -> f32 { + let mut minimum = f32::INFINITY; + for side in SIDES { + let mut offsets: Vec<_> = view + .ports + .iter() + .filter(|p| p.owner == f.owner && p.side == side) + .map(|p| match side { + PortAnchorSide::Left | PortAnchorSide::Right => p.position.y, + _ => p.position.x, + }) + .collect(); + offsets.sort_by(f32::total_cmp); + for pair in offsets.windows(2) { + minimum = minimum.min(pair[1] - pair[0]); + } + } + minimum +} +// Independent segment/slab test, not the router's private Rect::crosses helper. +// All fixture nodes are unrelated flat obstacles, so ancestor/header exceptions +// do not apply. A node's own outward stub is allowed through its own clearance. +fn stub_hits(port: &ProjectedPort, obstacle: &ProjectedNode) -> bool { + if port.owner == obstacle.id { + return false; + } + let normal = port.side.normal(); + let mut lo = 0.0_f32; + let mut hi = 1.0_f32; + for (start, delta, min, max) in [ + ( + port.position.x, + normal.x * PORT_STUB, + obstacle.position.x - CLEARANCE, + obstacle.position.x + obstacle.size.width + CLEARANCE, + ), + ( + port.position.y, + normal.y * PORT_STUB, + obstacle.position.y - CLEARANCE, + obstacle.position.y + obstacle.size.height + CLEARANCE, + ), + ] { + if delta == 0. { + if start <= min || start >= max { + return false; + } + } else { + let a = (min - start) / delta; + let b = (max - start) / delta; + lo = lo.max(a.min(b)); + hi = hi.min(a.max(b)); + } + } + lo < hi +} +fn blocked_stubs(view: &ProjectedView) -> Vec<(Id, Id)> { + view.ports + .iter() + .flat_map(|p| { + view.nodes + .iter() + .filter(move |n| stub_hits(p, n)) + .map(move |n| (p.element, n.id)) + }) + .collect() +} +fn measure(f: &Fixture, view: &ProjectedView, label: &str) -> RoutedView { + let routed = route_diagram(&f.p, &f.p.diagrams[&f.d], view); + let mut length = 0.0_f32; + let mut bends = 0; + for edge in &view.edges { + let route = &routed.edges[&edge.id]; + assert_eq!( + route.points.first(), + Some(&port(view, edge.source_port.unwrap()).position) + ); + assert_eq!( + route.points.last(), + Some(&port(view, edge.target_port.unwrap()).position) + ); + for pair in route.points.windows(2) { + assert!(pair[0].x == pair[1].x || pair[0].y == pair[1].y); + length += (pair[0].x - pair[1].x).abs() + (pair[0].y - pair[1].y).abs(); + } + for triple in route.points.windows(3) { + let a = pos(triple[1].x - triple[0].x, triple[1].y - triple[0].y); + let b = pos(triple[2].x - triple[1].x, triple[2].y - triple[1].y); + if a.x * b.y != a.y * b.x { + bends += 1; + } + } + println!( + "{label} edge={} points={:?} warnings={:?}", + edge.id, route.points, route.warnings + ); + } + let warnings: usize = routed.edges.values().map(|e| e.warnings.len()).sum(); + println!( + "{label} bounds={:?}/{:?} LRTB={:?} gap={} warnings={warnings} length={length} bends={bends} blocked_stubs={:?}", + owner(f, view).position, + owner(f, view).size, + side_counts(f, view), + gap(f, view), + blocked_stubs(view) + ); + for id in &f.ports { + println!( + "{label} port={id} side={:?} position={:?}", + port(view, *id).side, + port(view, *id).position + ); + } + // A caller may retain exact model, projection and route geometry. Never + // overwrite a previous run. Ordinary export still chooses Current. + if let Some(directory) = std::env::var_os("OA_PORT_POLICY_RECEIPTS") { + let directory = PathBuf::from(directory); + std::fs::create_dir_all(&directory).unwrap(); + for (suffix, content) in [ + ("arcadia", language::format(&f.p)), + ( + "projection.json", + serde_json::to_string_pretty(view).unwrap(), + ), + ("routing.txt", format!("{routed:#?}")), + ] { + let mut file = OpenOptions::new() + .write(true) + .create_new(true) + .open(directory.join(format!("{label}.{suffix}"))) + .unwrap(); + file.write_all(content.as_bytes()).unwrap(); + } + } + routed +} + +#[test] +fn a_point_one_height_increase_does_not_needlessly_flip_twelve_of_twenty_ports() { + let mut f = right_peer(20, 259.9, false); + let mut violations = Vec::new(); + for policy in POLICIES { + let mut views = Vec::new(); + for height in [259.9, 260., 260.1] { + f.p.diagrams + .get_mut(&f.d) + .unwrap() + .nodes + .get_mut(&f.owner) + .unwrap() + .size + .height = height; + let before = f.p.clone(); + let view = project(&f, policy); + measure(&f, &view, &format!("threshold-{policy:?}-{height}")); + assert_eq!(f.p, before, "Projection/routing must not author geometry"); + if policy != ExperimentalPortPolicy::Current { + assert_eq!(owner(&f, &view).size, size(224., height)); + } + views.push(view); + } + let flips: Vec<_> = views + .windows(2) + .map(|pair| { + f.ports + .iter() + .filter(|id| port(&pair[0], **id).side != port(&pair[1], **id).side) + .count() + }) + .collect(); + println!( + "threshold {policy:?}: adjacent side changes={flips:?}; source prediction capacity=[12,0], controls=[0,0]" + ); + if policy == ExperimentalPortPolicy::CapacityAware { + // The prior assignment is still feasible at the larger rectangle. + // Nominal independent capacities: floor((edge - 36) / 28) + 1. + let new = owner(&f, &views[1]); + let capacities = [ + new.size.height, + new.size.height, + new.size.width, + new.size.width, + ] + .map(|length| ((length - 36.) / 28.).floor() as usize + 1); + assert!( + side_counts(&f, &views[0]) + .into_iter() + .zip(capacities) + .all(|(n, c)| n <= c) + ); + assert!(gap(&f, &views[0]) >= 27.99); + // A single relocation can use the new preferred-side slot. This + // fixture-specific bound does not prohibit justified side changes. + if flips.iter().any(|n| *n > 1) { + violations.push(format!( + "CapacityAware changes {flips:?} sides while zero/one move suffices" + )); + } + } else if flips != [0, 0] { + violations.push(format!( + "{policy:?} control unexpectedly changes {flips:?} sides" + )); + } + } + assert!( + violations.is_empty(), + "Prospective resize-stability criterion failed: {violations:?}" + ); +} + +#[test] +fn capacity_spillover_does_not_add_a_blocked_mandatory_stub_above_the_owner() { + let f = right_peer(8, 160., true); + let original = f.p.clone(); + let mut violations = Vec::new(); + for policy in POLICIES { + let view = project(&f, policy); + let routed = measure(&f, &view, &format!("obstacle-{policy:?}")); + let actual = owner(&f, &view); + assert_eq!(actual.position, pos(0., 0.)); + assert_eq!( + actual.size, + size( + 224., + if policy == ExperimentalPortPolicy::Current { + 232. + } else { + 160. + } + ) + ); + let obstacle = view.nodes.iter().find(|n| n.id == id(42)).unwrap(); + assert_eq!( + (obstacle.position, obstacle.size), + (pos(0., -150.), size(224., 132.)) + ); + let blocked = blocked_stubs(&view); + let no_clear: Vec<_> = routed + .edges + .values() + .filter(|e| e.warnings.contains(&RouteWarning::NoClearPath)) + .map(|e| e.id) + .collect(); + println!( + "obstacle {policy:?}: independently blocked={blocked:?}, NoClearPath={no_clear:?}; source prediction capacity Top=(112,0), stub=(112,-18), obstacle inflation y=[-162,-6]" + ); + if policy == ExperimentalPortPolicy::CapacityAware { + // Record whether each physically blocked source also reports the + // predicted route warning; do not use warning text as geometry proof. + for (port_id, obstacle_id) in &blocked { + let edges: Vec<_> = view + .edges + .iter() + .filter(|e| e.source_port == Some(*port_id) || e.target_port == Some(*port_id)) + .map(|e| e.id) + .collect(); + println!( + "blocked port={port_id} obstacle={obstacle_id} affected_edges={edges:?} all_NoClearPath={}", + edges.iter().all(|e| no_clear.contains(e)) + ); + } + if !blocked.is_empty() || routed.edges.values().any(|e| !e.warnings.is_empty()) { + violations.push(format!( + "CapacityAware introduces blocked stubs {blocked:?} or routed warnings" + )); + } + } else { + if !f + .ports + .iter() + .all(|p| port(&view, *p).side == PortAnchorSide::Right) + { + violations.push(format!("{policy:?} control no longer keeps Right exits")); + } + if !blocked.is_empty() || routed.edges.values().any(|e| !e.warnings.is_empty()) { + violations.push(format!( + "{policy:?} control has blocked stubs {blocked:?} or routed warnings" + )); + } + } + assert_eq!(f.p, original); + } + assert!( + violations.is_empty(), + "Prospective exit-clearance criterion failed: {violations:?}" + ); +} + +fn fixed_port_identity_set(mut f: Fixture, set: usize) -> Fixture { + if set == 0 { + return f; + } + // Two declared, reproducible UUID sets; not random draws or selected after + // observing layout results. Only port identities change, not topology. + let replacements: Vec<_> = (1..=f.ports.len()) + .map(|n| { + let low = match set { + 1 => (n as u64).wrapping_mul(0xd134_2543_de82_ef95), + 2 => (n as u64) + .wrapping_mul(0x9e37_79b9_7f4a_7c15) + .rotate_left(23), + _ => unreachable!(), + } & 0x0000_ffff_ffff_ffff; + let prefix = if set == 1 { + 0x12345678_9abc_4000_8000_000000000000 + } else { + 0xfedcba98_7654_4000_8000_000000000000 + }; + Id::from_u128(prefix | u128::from(low)) + }) + .collect(); + assert_eq!( + replacements + .iter() + .collect::>() + .len(), + f.ports.len() + ); + let commands: Vec<_> = f + .ports + .iter() + .zip(&replacements) + .map(|(old, new)| Command::Reidentify(*old, *new)) + .collect(); + f.p = execute_batch(&f.p, &commands).unwrap(); + f.ports = replacements; + validate_candidate(&f.p).unwrap(); + assert_eq!(language::parse(&language::format(&f.p)).unwrap(), f.p); + f +} + +#[test] +fn stable_fallback_ranking_bounds_threshold_churn_across_three_identity_sets_and_reverse() { + let stable = ExperimentalPortPolicy::CapacityAwareStableRanking; + let mut violations = Vec::new(); + for set in 0..3 { + for policy in [ExperimentalPortPolicy::CapacityAware, stable] { + let mut f = fixed_port_identity_set(right_peer(20, 259.9, false), set); + let mut views = Vec::new(); + for (frame, height) in [259.9, 260., 260.1, 260., 259.9].into_iter().enumerate() { + f.p.diagrams + .get_mut(&f.d) + .unwrap() + .nodes + .get_mut(&f.owner) + .unwrap() + .size + .height = height; + let original = f.p.clone(); + let view = project(&f, policy); + let label = format!("stable-threshold-set{set}-{policy:?}-frame{frame}-{height}"); + measure(&f, &view, &label); + assert_eq!(f.p, original); + assert_eq!(owner(&f, &view).size, size(224., height)); + if policy == stable && gap(&f, &view) < 27.99 { + violations.push(format!( + "{label}: avoidable sub-nominal gap {}", + gap(&f, &view) + )); + } + views.push(view); + } + let flips: Vec<_> = views + .windows(2) + .map(|pair| { + f.ports + .iter() + .filter(|id| port(&pair[0], **id).side != port(&pair[1], **id).side) + .count() + }) + .collect(); + println!( + "stable threshold set={set} policy={policy:?} changes={flips:?}; prediction original=[12,0,0,12], stable<=1 each (unverified)" + ); + assert_eq!( + views[0], views[4], + "Same rectangle must reproject identically after reversal" + ); + assert_eq!(views[1], views[3]); + if policy == stable && flips.iter().any(|n| *n > 1) { + violations.push(format!("set={set} stable side changes {flips:?}; same bounded criterion across every UUID set")); + } + } + } + assert!( + violations.is_empty(), + "Prospective stable-ranking threshold criterion failed: {violations:?}" + ); +} + +#[test] +fn stable_fallback_ranking_still_needs_real_exit_clearance_including_near_corner() { + let stable = ExperimentalPortPolicy::CapacityAwareStableRanking; + let mut violations = Vec::new(); + for corner in [false, true] { + let mut f = right_peer(8, 160., true); + if corner { + let obstacle = + f.p.diagrams + .get_mut(&f.d) + .unwrap() + .nodes + .get_mut(&id(42)) + .unwrap(); + obstacle.position = pos(230., -120.); + obstacle.size = size(184., 132.); + } + validate_candidate(&f.p).unwrap(); + assert_eq!(language::parse(&language::format(&f.p)).unwrap(), f.p); + let original = f.p.clone(); + for policy in POLICIES.into_iter().chain([stable]) { + let view = project(&f, policy); + let label = format!("stable-obstacle-corner{corner}-{policy:?}"); + let routed = measure(&f, &view, &label); + let blocked = blocked_stubs(&view); + if policy != ExperimentalPortPolicy::Current { + assert_eq!(owner(&f, &view).size, size(224., 160.)); + } + if corner { + let obstacle = view.nodes.iter().find(|n| n.id == id(42)).unwrap(); + assert_eq!( + (obstacle.position, obstacle.size), + (pos(230., -120.), size(184., 132.)) + ); + let midpoint = ProjectedPort { + element: f.ports[0], + owner: f.owner, + side: PortAnchorSide::Right, + position: pos(224., owner(&f, &view).size.height / 2.), + }; + assert!(view.nodes.iter().all(|node| !stub_hits(&midpoint, node))); + // Independent geometric witness only: five legal same-side + // coordinates exist. No fake ports are passed to the projector + // or router. The actual mode must produce its own clear layout. + let coordinates = [24.01_f32, 53.5075, 83.005, 112.5025, 142.]; + assert!(coordinates.windows(2).all(|p| p[1] - p[0] >= 28.)); + for y in coordinates { + let witness = ProjectedPort { + position: pos(224., y), + ..midpoint.clone() + }; + assert!(view.nodes.iter().all(|node| !stub_hits(&witness, node))); + } + println!( + "{label}: actual Right midpoint {:?} clear; independent five-position witness={coordinates:?}; actual blocked={blocked:?}", + midpoint.position + ); + } + let warned: Vec<_> = routed + .edges + .values() + .filter(|e| !e.warnings.is_empty()) + .map(|e| e.id) + .collect(); + println!( + "{label}: candidate attribution only; midpoint/placement unchanged, warnings={warned:?}" + ); + if policy == stable && (!blocked.is_empty() || !warned.is_empty()) { + violations.push(format!("{label}: blocked={blocked:?}, warned={warned:?}")); + } + assert_eq!(f.p, original); + } + } + assert!( + violations.is_empty(), + "Prospective stable-ranking real-exit criterion failed: {violations:?}" + ); +} diff --git a/harness/release-canvas-followup-20260912.md b/harness/release-canvas-followup-20260912.md index 2a19cb8c..ae01e19b 100644 --- a/harness/release-canvas-followup-20260912.md +++ b/harness/release-canvas-followup-20260912.md @@ -16,12 +16,13 @@ ownership and acceptance remain in Gitea [15](http://217.177.34.108:3000/sorokin optional placement controls now occupy a stable child slot ahead of the canvas. Hide/Undo no longer changes the canvas widget's position in its parent. The strengthened test keeps the actual Save/Undo/Delete sequence and observes focus - through each intermediate redraw. Runtime acceptance is pending. + through each intermediate redraw. The later source83 gate and native trial + below verify this correction. - `956a584` derives activation segments from typed call/receiver/scope identities and compatible reply correlations. It uses distinct columns for overlapping calls and exact activation endpoints for replies, including self-calls. The - source includes twelve production-scene tests; their execution and native - legibility/selection checks are pending. Hit tests at small zoom do not establish + source includes twelve production-scene tests, passed in the source83 gate. + Its native trial below found a separate paint-order defect. Hit tests at small zoom do not establish raster legibility. The 12-unit bar width and 6-unit offset remain a visual candidate until the actual application has been inspected. - `b25065c` removes the redundant Canvas and Focus canvas/Restore panels buttons. @@ -42,7 +43,7 @@ A [fresh independent source review](experiments/canvas-editing-followup-20260912 found no actionable defect in the bounded correction and verified the state picker's stable Shrink slot against Iced internals. It does not establish runtime acceptance or process/scenario Save focus continuity; those workspaces use a -separate Viewport lifetime policy. New Windows and native gates remain required. +separate Viewport lifetime policy. Subsequent execution is recorded below. The full Windows suite at 4015498 closed with **833 passed, one failed**, zero ignored and all 533 inputs unchanged. Compilation took 3m58s and tests 360.78s. @@ -64,7 +65,27 @@ call/reply evaluator and twelve activation cases. Strict all-target Clippy with warnings denied and the GUI build also pass on that exact source and input manifest, ending at 22:32:41 and 22:35:05 UTC respectively. The staged executable SHA-256 is `49eb87b4a239c586a16b9efbfd036b3823adc8b62a8992feeaa934bca4f5743b`. -Native acceptance remains a separate gate. +The [subsequent native trial](release-canvas-native-83f53c7-20260912.md) passes +the architecture/state Save/Undo focus sequences and bound source Save/reopen, +but exposes opaque message-label backgrounds interrupting activation borders. +Correction **d61f1f3** moves those backplates behind bars and aligns exposed-bar +hit priority, preserving precise message selection. It adds actual rendered-pixel +continuity and OA/SA Scene selection regressions. Its new gates and native recheck +remain separate from the source83 evidence. + +The full Windows gate at **d61f1f38779ab70a77efcde523ae31c432aefcfd** passes +**836 tests**, with zero failures/ignored and all 533 committed inputs unchanged. +It closed at 23:39:26 UTC on 2026-09-12; compilation took 8m40s and the tests +1793.80 seconds. Input-manifest SHA-256: +`67ce23fbbcc30ff8c4d78898e9d12030ac07dc507c41d7598c5fe38e88c055bf`. +Both the rendered border-continuity test and the OA/SA exposed-shoulder and exact +message selection test pass. Strict all-target Clippy with warnings denied also +passes at 23:42:36 UTC, followed by the matching GUI build at 23:45:13 UTC. Both +use the same 533 unchanged inputs and manifest. The +[source-identified native recheck](release-canvas-native-d61f1f3-20260912.md) +passes the former border-overlap and call/reply selection cases in OA, SA and +reentrant scenes, including an exposed shoulder at 66% Fit in the minimum window. +Save preserves the exact Project/SourceBundle; the trial closes with exit 0. The [closed gate receipts](experiments/diagram-removal-windows-20260912/archive-manifest.json) identify the exact commands, input bytes, source commits, failures and logs. @@ -74,7 +95,7 @@ acceptance of these production changes. ## Scenario evaluator preparation -The [28-payload archive](experiments/canvas-editing-followup-20260912/manifest.json) +The [source and review archive](experiments/canvas-editing-followup-20260912/manifest.json) preserves design/review notes, fixture builders, exact build/run receipts and generated source. Builders link the identified existing core artifacts only after verifying their source inputs against the completed core-containing gate; @@ -105,8 +126,9 @@ the OA Actor kind for SA and attempted a generic Port constructor. Its exact source and failure receipts are preserved. The correction uses SystemActor and the dedicated port constructor; validation assertions were retained. -Native Save/Undo focus, bound nested-call rendering and direct pointer/text-focus -workflows remain required after the passing same-source Windows gates. Broader +The linked native trial establishes its bounded Save/Undo, source persistence and +pointer/text-focus results. The rendering correction has its own passing gates +and bounded native recheck linked above. Broader process/scenario free placement, resizing and the Details redesign are separate outstanding requirements; these corrections do not close them. Linux/WSL checking remains deferred by the user. diff --git a/harness/release-canvas-native-83f53c7-20260912.md b/harness/release-canvas-native-83f53c7-20260912.md new file mode 100644 index 00000000..ba7c037f --- /dev/null +++ b/harness/release-canvas-native-83f53c7-20260912.md @@ -0,0 +1,93 @@ +# Native canvas follow-up at 83f53c7 + +This report describes Windows native observations of source +`83f53c7c6e277e250f06d2ae6bfa6a7988bd2e4b`, not acceptance of the complete release. +The [same-source Windows gates](release-canvas-followup-20260912.md) pass 834 +desktop tests, strict all-target Clippy and the matching GUI build. Executable +SHA-256: `49eb87b4a239c586a16b9efbfd036b3823adc8b62a8992feeaa934bca4f5743b`. + +The native process used disposable compact and bound fixtures in an isolated +profile. It launched at 22:41:22 UTC and closed normally at 22:58:28 UTC on +2026-09-12, with a retained process exit code of zero. Both output logs are empty. +The [portable archive](experiments/canvas-native-83f53c7-20260912/manifest.json) +contains the exact build identity, procedure, screenshots, source checkpoints, +oracle receipts and closure record. Source comparisons use the previously +identified actual core oracle; they compare the complete Project and exact +SourceBundle, including the compact fixture's Unicode/CRLF included file. + +## Architecture and state focus + +Starting from a single pointer selection of Target work, the native architecture +sequence was Delete, Save, Undo, Save, Redo, Save, Undo, Shift+Delete. No intervening +canvas click or F6 was used. Each saved removal matches the independently derived +baseline Delete of placement `de1e7e00-0000-4000-8000-00000000001f`; each saved +restoration exactly matches the original Project and SourceBundle. Shift+Delete +opens the confirmation for Target work. Cancel and Save leave the exact baseline. +This verifies the originally observed loss of keyboard ownership is corrected +for this sequence. + +In the persisted SA state view, first-click selection of SA Ready followed by +Delete exposes the unplaced-element picker. Save matches the independent Delete +of placement `de1e7e00-0000-4000-8000-00000000003f`. Undo removes that picker and +restores the selected state; immediate Shift+Delete opens the confirmation for +SA Ready without another canvas click. After Cancel and Save, both source files +and the complete Project exactly match the baseline. This exercises the actual +Iced child-slot replacement that failed before e2c027e. + +Inspector Name editing is protected: Home, Delete changes only the pending text +from SA Ready to A Ready; Shift+Delete edits the text again without opening model +deletion or removing the drawn state. Revert restores the original name and clears +pending edits. No Canvas or Focus canvas button is required in either workflow. + +Persisted state uses a different keyboard policy from process/scenario controls: +F6 after Inspector Revert is a no-op, and Tab enters Inspector Name. Source review +confirms state Owner has no F6 handler. This is a cross-workspace inconsistency, +not evidence of a failed implemented state F6 shortcut. In the scenario workspace, +F6 from an Inspector field visibly clears text focus, and Tab advances to the +Select palette control. F6/Tab are toolbar navigation, not occurrence traversal. +These observations do not establish process/scenario Save focus continuity. +An interleaved held-drag/Save native test was not performed; the available atomic +drag API cannot hold the mouse across another action. Mounted regression evidence +is separately scoped in the earlier report. + +## Bound nested scenarios + +The real bound fixture contains OA and SA C1, C2, R2, R1 scenarios and an OA +reentrant reverse call. At 100%, clicking the exposed inner and outer activation +interiors selects their exact C2 and C1 occurrences. The reverse-call bar selects +C2 on L1. Inner and outer reply endpoints visibly terminate on their respective +activation edges. Inspector readback includes OA C1 requested_pressure 420.0, +OA R1 measured_pressure 418.0 correlated to C1, SA C2 requested_pressure 380.0 +with its explicit synchronous interface allocation, and SA R2 measured_pressure +378.0 derived from that exact C2 allocation. These are sampled native readbacks; +the full fixture identities and values are covered by core source comparisons. + +Save, native Open of the same bound source, return to its scenario, and Save pass +exact complete Project/SourceBundle comparison. No semantic modification was +made to the bound fixture. The window was resized using its observed borders to +1102x732 outer pixels (1100x700 client). The scene remains navigable, and Fit gives +66% zoom. At 100% the right lifeline header is partly clipped within the narrow +canvas; Fit exposes it with considerably smaller text. + +Native inspection found a real rendering defect despite the passing Scene tests: +opaque, 225-unit message-label backgrounds erase the outer activation border in +22-unit bands above C2/R2/R1. The visible shortened text ends before the bar, but +its background and label hit rectangle extend over it. Screenshot +`oa-outer-activation-selected-0.png` is the primary witness. Rendering acceptance +therefore fails at 83f53c7. Correction d61f1f3 moves backplates behind activations +and gives exposed bars priority over label rectangles while preserving precise +message hits. Its tests/build/native acceptance are separate from this trial. + +Unselected bars and message labels are visibly faint on white, especially at +66% zoom. Issue 26 records this broader contrast concern; the paint-order repair +does not address it. Native self/crossed/ALT/PAR rendering was not exercised in +this trial. Geometry tests and generated fixtures do not substitute for those +remaining native checks or for peer lifecycle integration. + +## Scope and coordination + +Live outcomes remain in Gitea issues 15, 21, 25 and 26. The architecture/state +focus regression passes this bounded native trial; nested rendering needs the +identified correction and recheck. Broader free geometry, resizing, Details UX, +lifeline union, graphical/source/API parity and complete release acceptance remain +open. Linux/WSL checks remain deferred by the user. diff --git a/harness/release-canvas-native-d61f1f3-20260912.md b/harness/release-canvas-native-d61f1f3-20260912.md new file mode 100644 index 00000000..cd7e16ea --- /dev/null +++ b/harness/release-canvas-native-d61f1f3-20260912.md @@ -0,0 +1,65 @@ +# Native activation paint correction — 2026-09-12 + +Bounded Windows acceptance of **d61f1f38779ab70a77efcde523ae31c432aefcfd**: +the previously erased activation borders remain continuous and exposed shoulders +select their calls, while exact message endpoints retain priority. This is not +acceptance of the complete OA/SA release, palette, or the later lifecycle union. + +The same source passes all **836 desktop tests**, strict all-target Clippy with +warnings denied, and the GUI build. All 533 committed inputs remain unchanged. +[Exact gate evidence](release-canvas-followup-20260912.md). + +The staged executable is 113,939,456 bytes, SHA-256 +`c990fa05772c60666ecf96ab808e6140e57542ad448ddd092b977be0b587136f`. +The identified trial ran from 23:46:20 to 23:51:20 UTC with a private profile and +disposable fixture copies. Its actual process exited normally with code 0. +[Native manifest, screenshots and source checkpoints](experiments/canvas-native-d61f1f3-20260912/manifest.json) +retain launch/closure records and the exact staged-build identity. + +## Observed behavior + +- In bound OA nested C1/C2/R2/R1, clicks at the formerly covered outer shoulder + `(664,440)`, `(664,535)` and `(664,625)` select C1, Inspector alias `bound_1040`. + The selected border is continuous through all three former label bands. + Exact C2 receive `(668,457)`, R2 send `(669,549)` and R1 send `(664,641)` select + `bound_1030`, `bound_1060` and `bound_1050` respectively. Labels and arrowheads + remain visible. Coordinates refer to the archived 1442×932 window frames. +- In OA reentrant pressure review, the right outer shoulder `(664,440)` selects + C1 `bound_3040`; the left inner bar `(429,510)` selects C2 `bound_3030`. + The reverse call/reply paths and both activation outlines remain visible. +- In SA nested pressure checks, the former R2-label shoulder `(664,535)` selects + C1 `bound_2040`, while the exact R2 endpoint `(669,549)` selects `bound_2060`. + The same repaired outer border and separate inner execution are visible. +- At a 1100×700 client area (1102×732 outer window), 100% retains the repaired + geometry but partly clips the right header. Fit reaches 66%; the outer shoulder + `(529,363)` still selects C1 `bound_2040`, with its border continuous. +- Actual Ctrl+S after navigation/selection/resize preserves the **complete Project + and exact SourceBundle**, checked against the untouched bound baseline by the + identified core oracle. Four checkpoint files have independent byte hashes. + +The GUI trial uses the existing bound fixture: 34 elements, six relations, +zero validation errors and two completeness warnings. The preflight and final +Save comparison both pass. The oracle's binary identity is recorded separately +from the native application's source; it does not imply that the oracle was +compiled from d61f1f3. + +## Scope and remaining limitations + +This trial directly retests the defect found in the +[source83 native trial](release-canvas-native-83f53c7-20260912.md). It does not +repeat the earlier architecture/state Save/Undo focus workflows, change model +data, or claim a new native self-call/ALT/PAR/lifecycle-marker result. Those +geometry cases have source-specific automated evidence; the forthcoming +lifecycle integration still requires combined tests and native acceptance. + +Unselected outlines and small message text remain faint, especially at 66% Fit. +That is still [issue 26](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/26). +Stronger colors are not part of d61f1f3. Partial header clipping at 100% in the +minimum window is recoverable through Fit; this trial does not establish overall +diagram ergonomics or readability at the lowest allowed zoom. Linux remains +deferred by explicit user instruction. + +Reproduction: use the source-identified staged build and archived bound baseline, +open `bound-nested-calls.arcadia`, choose Behavior & scenarios, and repeat the +scenario/selection sequence above. The archive retains the exact trial launcher, +checkpoint procedure and stage manifest. Original screenshots are unmodified. diff --git a/harness/resize-port-policy-experiment-20260912.md b/harness/resize-port-policy-experiment-20260912.md index 3035e464..6f75302e 100644 --- a/harness/resize-port-policy-experiment-20260912.md +++ b/harness/resize-port-policy-experiment-20260912.md @@ -91,3 +91,32 @@ while preserving authored anchors, source parity and real routing endpoints. The current candidate is not adopted. No passing desktop resize workflow, general geometry solution, historical rendering equivalence or issue closure is claimed. Linux/WSL remains deferred. + +## Revision boundary + +The [revised candidate comparison](experiments/resize-port-policy-20260912/revision-design.md) +and [independent interval critique](experiments/resize-port-policy-20260912/interval-design-critique.md) +separate attribution, clear-position placement and more general repair. The next +isolated source, **6203b5c**, changes fallback ranking only: fixed UUID/side scores +replace occupancy-dependent rankings in an explicit fourth experimental mode. +The original three modes and default Current remain unchanged. Three fixed +identity sets and forward/reverse height sweeps distinguish ranking churn from +the untouched exit-clearance failure. Source review found no actionable defect; +compilation and execution remain pending. + +The [source handoff](experiments/resize-port-policy-20260912/stable-ranking/source-handoff.md) +and [serialized gate runner](experiments/resize-port-policy-20260912/stable-ranking/run-stable-ranking-gates.py) +are archived with exact changed Git blobs and the a95-to-6203 patch. The runner +requires exact committed input bytes, a fresh isolated target, recorded core/test +artifacts and exact test inventories. Designated prospective failures keep their +nonzero exits and non-adoption status. It has not been executed. + +This does not select a general resize policy. The critique supplies further +unexecuted counterexamples: per-edge ancestor obstacles make different ports' +legal borders differ; independent spreading across narrow gaps can violate the +required spacing; normalized primary-side preferences can flip collectively +without any fallback allocation; and restarting a whole owner at a different gap +tier can create churn even with fixed ranks. Exact placement witnesses, actual +routes and stable identity sweeps must evaluate these separately. A flat interval +experiment is justified, but neither a common scalar capacity nor stable fallback +ranks establish the full requirement. The production policy remains unchanged.