diff --git a/harness/multiselect-process-20260923.md b/harness/multiselect-process-20260923.md new file mode 100644 index 00000000..b91ea393 --- /dev/null +++ b/harness/multiselect-process-20260923.md @@ -0,0 +1,72 @@ +# Process multi-selection evidence — 2026-09-23 + +This slice implements exact multi-selection and topology-preserving order for OA Process and SA Functional Chain. Desktop, independent-source and corrected Windows native checks pass within the scopes below. This is branch-specific evidence, not a release, combined integration or completion of multi-selection issue #29. Combined release publication remains with the integration owner. + +The [adapter design](multiselect-process-adapter-design-20260923.md) owns the selection, planning and lifecycle contract. The [native evaluator design](multiselect-process-native-design-20260923.md) owns the independent fixture/oracle and discriminating gesture. Detailed evidence is separated into [checks](multiselect-process-evidence-20260923/checks/), [source identity](multiselect-process-evidence-20260923/source/), [render feedback](multiselect-process-evidence-20260923/feedback/), [native trials](multiselect-process-evidence-20260923/native/), [reviews](multiselect-process-evidence-20260923/reviews/) and [preparation failure](multiselect-process-evidence-20260923/preparation-run-2/). + +## Implementation and integration seams + +Selection is transient and owner-scoped, preserving local occurrence/link and qualified path/preview-link identities. Primary controls Properties; qualified subjects stay read-only. Shift toggles, stationary member clicks collapse, and contextual membership/inspection is explicit. Feedback preserves canvas bounds. Visible reconnect handles win hit testing; groups cannot fall through to singleton mutations. Mixed/qualified movement refuses the whole set unchanged. + +Local occurrences in one column move in source order into Before/After slots, preserving other-column indices and all ranks. `[A,U,B,V,C]`, C then A After B, becomes `[B,U,A,V,C]`. Singleton order shares the planner. One `SetSteps` transaction records a change; invalid/no-op results create no history. Facts are captured once per press; plans cache destinations without pointer-time Project clones/Graph rebuilds. Feedback shows slot/count and source-order numbers. + +Integration uses `app::multiselect`, Process App handlers, topology `direct_selection.rs`/`group_reorder.rs`, existing menus/transactions and shared Viewport modifier retention. Mounted tests split press/motion/release across App rebuilds and check snapshots, reconnect precedence, intermediate source/history and final order/Undo/Redo. Scenario has a shared-modifier regression, not multi-selection implementation. + +## Exact-subject failure and correction + +Native run 1 on `b153451...` exposed a blocking identity defect: Back restored caller/camera but showed editable outer-reference Properties alongside qualified-leaf highlighting (frame 26). Baseline/mixed/qualified refusal saves passed three independent complete-Project `unchanged` checks, which could not detect UI identity. The run stopped before order/history/reopen acceptance. It exited 0 with empty logs and unchanged pinned binaries/fixture; it has no successful history-bytes receipt. + +The correction remembers the requested qualified address, including nonprimary menu invocation. Back selects its validated leaf and refreshes read-only inspection. Select/EditProperties clears obsolete context after admission, including same-ID defining-leaf navigation; ordinary Open saves a local frame. Tests assert path, subject, draft, camera, source/history and ordinary return. Back restores the invoked singleton. Review 2 found no concrete regression; protective-test suggestions remain notes rather than claimed coverage. + +Run 3 confirms current/nonprimary Open/Back, exact read-only caller subject, and Explorer navigation to outer reference and same-ID leaf with editable local Properties. [Parent observations](multiselect-process-evidence-20260923/reviews/run-3-observations.md) and the [independent native review](multiselect-process-evidence-20260923/reviews/process-native-review-3.md) establish these UI results separately from saved-Project checks. + +## Source and test evidence + +Gates retain commands/logs, artifact/helper hashes and unchanged 742-file maps/archives, including 71 vendored files and compile-time fixtures. Source receipts compare bytes with named Git blobs; captured HEAD alone cannot identify uncommitted source. + +| Source | Matching evidence and result | +| --- | --- | +| Historical `1711bff650dabb1df3a9bc37f19060d5db297feb`, map `d5acfcf6...` | `full-desktop-1`: **1,317 passed, 6 ignored**; `format-1` passed. Historical implementation, before final navigation corrections. | +| `b15345123a7feaf630ef24d45f591c76c6715778`, map `7f5b3de4...` | `desktop-3`: **147 passed**; strict `lint-2`, `format-2`, `feedback-1` passed; `core-2`: **5 passed**. Matching checker/GUI builds passed. Native run 1 failed as recorded above. | +| Production correction `ff712b24190342363d0275467e96f181872da6ad`, map `1ba4ed41...` | `desktop-6`: **150 passed**; `full-desktop-2`: **1,320 passed, 0 failed, 6 ignored**. Strict core/desktop all-target `lint-3` and `format-3` passed. | +| Evaluator clarification `b743a10d51032dc1655b94fed5e49fbbbcee83f4`, map `f3fd180a...` | `core-3`: **5 passed**; example-scoped `lint-4`, `format-4`, `windows-build-2`, `native-build-2` passed. Production desktop/core library unchanged from `ff712...`; this is not a second full-desktop run. Matching GUI/checker used for native run 3. | + +Failures remain preserved: `desktop-1` 94 passed/8 failed; `desktop-2` 104/1; `lint-1` failed before the payload-size correction. `desktop-4` rejected invalid Cargo filter placement before tests. `desktop-5` ran 147/1 because the new fixture toggled already-expanded references closed, yielding an empty initial group; corrected setup/navigation pass in `desktop-6`. Preparation run 2 failed while generating its fixture with missing toolchain DLL environment (exit 3221225781); **no GUI trial occurred**. Run 3 corrected the environment and used a fresh directory. + +## Independent semantics, rendering and native history + +The core checker compares complete Projects against immutable baseline/literal expected OA order without invoking the desktop planner. SA/reuse/trace are preservation sentinels. Primary A would be ambiguous: singleton-A After B equals the group result. The clarified evaluator adds unchanged-C rejection and a discriminating trial: membership `[C,A]`, Inspect C, drag C After B. Group output is `[B,U,A,V,C]`; singleton primary/pressed C leaves the original order. + +The native observer performed that sequence in run 3: click C, context Add A, Inspect C, verify two selected/primary C, then drag C After B. The visible column became B,A,C with U,V unchanged. One Ctrl+Z restored baseline; one Ctrl+Y restored reordered output; an in-process reopen retained it. The trial also observed mixed-set refusal and selected-anchor no-op. Run 3 closed normally at `2026-09-23T13:43:54Z`, exit 0, empty stdout/stderr and unchanged pinned checker/GUI/fixture. + +**Routing remains visibly imperfect.** In the [reordered frame](multiselect-process-evidence-20260923/reviews/images/run-3/39-group-reordered-0.jpg), A→U and B→V share portions of their orthogonal paths, obscuring endpoint connectivity. The independent review confirms this defect; unchanged link records do not establish readable routing. It is related to the intersection concerns in issue #32, whose original scope is Auto Arrange; this trial exercises Process order instead. No source-level attribution or routing fix is claimed here. + +All eight saved snapshots passed the independent complete-Project checker: baseline, qualified-navigation, mixed-refusal, anchor-noop, reordered, undo, redo and reopened. The history-byte gate passed for all ten source files: `baseline == undo == qualified-navigation == mixed-refusal == anchor-noop` and `reordered == redo == reopened`, also checking immutable fixture equality for the baseline group. Only `oa/behavior/process_oa_process.arcadia` differs between groups. This lexical proof complements observed one-step history; equality alone cannot prove the user actions. + +Actual headless WGPU App feedback covers OA/SA at 1440×900 and 100% zoom: stable source/selection/camera, legible insertion slot/count and source-order numbers. Raw RGBA, lossless PNG readback and parent inspection are preserved. These split-batch renderings establish actual production pixels, not a paused native drag or other DPI/window sizes. Native membership used context actions; held Shift-click is mounted-test evidence. Reopen is in-process, not cold restart. Aggregate removal, Allocation/Scenario adapters, native SA reorder, Linux/DPI and full accessibility remain outside this slice's acceptance. + +## Reproduction and package verification + +From the named source checkout, use the documented project toolchain. Captures used Windows GNU LLVM, Cargo/rustc 1.98.1, one build job and incremental compilation disabled. Multiple test filters belong **after** `--`: + +```text +cargo test -p oa-core --example process_multiselect_native -- --test-threads=1 +cargo test -p oa-desktop -- topology process_ canvas_workspace repeated_process menu --test-threads=1 +cargo test -p oa-desktop -- --test-threads=1 +cargo clippy -p oa-core -p oa-desktop --all-targets -- -D warnings +cargo fmt --all -- --check +cargo build -p oa-core --example process_multiselect_native +cargo build -p oa-desktop +``` + +Portable evidence checks use Python; feedback PNG verification also needs Pillow. They do not build or execute archived sources. From repository root: + +```text +python -B harness/multiselect-process-evidence-20260923/checks/verify.py +python -B harness/multiselect-process-evidence-20260923/source/verify.py --repo . +python -B harness/multiselect-process-evidence-20260923/feedback/verify.py --checks harness/multiselect-process-evidence-20260923/checks +python -B harness/multiselect-process-evidence-20260923/native/verify.py +python -B harness/multiselect-process-evidence-20260923/preparation-run-2/verify.py +``` + +The source check requires named commits locally; omit `--repo .` for offline receipt consistency. Before publication, all five verifiers and review pins passed against a fresh export of the exact 47 staged evidence files; exported bytes matched the working files. The first staging attempt omitted the two ignored empty preparation logs; inventory validation caught that omission before verification or publication, and they were explicitly staged. Package READMEs cover native reproduction with fresh fixtures and matching GUI/checker receipts. Preserve failures and immutable baselines. Package consistency, semantic equality, lexical history, rendered feedback and observed interaction remain distinct claims. diff --git a/harness/multiselect-process-evidence-20260923/.gitattributes b/harness/multiselect-process-evidence-20260923/.gitattributes new file mode 100644 index 00000000..0e97fd3d --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/.gitattributes @@ -0,0 +1,2 @@ +# Receipt-bound files must retain exact bytes through Git checkout. +** -text whitespace=cr-at-eol diff --git a/harness/multiselect-process-evidence-20260923/checks/README.md b/harness/multiselect-process-evidence-20260923/checks/README.md new file mode 100644 index 00000000..91ee474d --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/checks/README.md @@ -0,0 +1,58 @@ +# Process multiselect closed gate evidence + +These tools adapt the State multiselect checks packager/verifier. They copy +explicitly named **closed** runs from `.local/process-group-gates`, preserve +their exact seven raw files, retain nonzero exit codes and both streams, and +verify all source-map/archive bytes before writing and again after ZIP readback. +They never run Cargo, execute archived code, extract inputs, or publish evidence. + +Check-only example: + +```text +python -B prepare.py --root CHECKOUT --runs core-1 desktop-1 desktop-2 lint-1 full-desktop-1 lint-2 format-2 --check-only +``` + +After all desired runs close, supply a fresh, nonexistent output directory: + +```text +python -B prepare.py --root CHECKOUT --runs core-1 desktop-1 desktop-2 lint-1 full-desktop-1 desktop-3 feedback-1 lint-2 format-2 native-build-1 windows-build-1 --output FRESH_DIRECTORY +python -B verify.py FRESH_DIRECTORY +``` + +Run names in the second example are a proposed final inventory, not an existence, +completion, pass, or source-equivalence claim. The parent chooses the final list. +Preserve failed desktop-1, desktop-2, and lint-1 alongside subsequent receipts; +their successful packaging means only byte/receipt consistency. No run is inferred +from directory scanning. Open/incomplete runs, changed-input receipts, missing +historical helpers, unsafe/duplicate archive members, and mismatched input +maps/bytes are refused. An existing output directory is refused even if empty. +Use repeatable `--helper PATH` to provide an exact historical capture helper when +the current two helpers no longer match a selected receipt. + +`manifest.json` maps each logical raw path to its stored ZIP member. Input maps +and input ZIPs deduplicate independently by their exact SHA-256 bytes, including +ZIP metadata; equal source contents need not imply byte-identical ZIPs. +`captureHelpers` names both gate.py and gate-feedback.py and points to their +hash-addressed archived bytes. Each run separately references the helper matching +its receipt. Current reviewed helper SHA-256 values are: + +```text +gate.py 1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20 +gate-feedback.py 230f1222f133edef76ffb9c09ed6eecf952fc326b04a0bbccb3f3f49df4c0c29 +``` + +Both current named helpers are included even when no selected run uses one yet. +The manifest is authoritative for helper pins at packaging time; this README's +values document this tooling review, not a substitute for receipt matching. +`files.json` pins the archive, manifest, tools and this README. Keep that pin file +under the parent's source/evidence record; self-consistency is not authentication. + +The verifier retains the existing 71-file vendored-input invariant and requires +`inputsUnchanged` to be exactly true. Source coverage is whatever each original +input map and receipt actually captured; recorded HEAD alone does not identify +uncommitted tested bytes. Executable readback pins are receipts only: no executable +or toolchain is packaged or independently reconstructed. Rendered feedback images, +native screenshots/saves and source-to-commit receipts are separate parent-owned +packages. Offline validation is not test execution, native acceptance or usability +evidence. `selfcheck.py` checks these tools against explicitly selected closed runs +and includes in-memory corruption rejection checks. diff --git a/harness/multiselect-process-evidence-20260923/checks/evidence.zip b/harness/multiselect-process-evidence-20260923/checks/evidence.zip new file mode 100644 index 00000000..0b25b9f8 Binary files /dev/null and b/harness/multiselect-process-evidence-20260923/checks/evidence.zip differ diff --git a/harness/multiselect-process-evidence-20260923/checks/files.json b/harness/multiselect-process-evidence-20260923/checks/files.json new file mode 100644 index 00000000..ac81837d --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/checks/files.json @@ -0,0 +1,22 @@ +{ + "prepare.py": { + "bytes": 5326, + "sha256": "2c8d7cbd1ec2415e671c35734fb5b78beb9a535626b54492a4c1d3687a6e4dd9" + }, + "verify.py": { + "bytes": 9497, + "sha256": "a52e4057d975717d132c1a8b656d34e1ef8ef8fbd125687715a69696a866fd44" + }, + "README.md": { + "bytes": 3344, + "sha256": "9d1eaa1dabdad0d95829da6d6e3004703ba90bc9824a963c43ca61e24b210e7e" + }, + "manifest.json": { + "bytes": 45584, + "sha256": "ea8d070535c3d62f3e2c13b81340ad2d506863fd93fe981f03a4edb87552e943" + }, + "evidence.zip": { + "bytes": 20916711, + "sha256": "591a81f55aa409044ecbcaf6da83ca107602a6ab690b347b84fd40bea469fd35" + } +} diff --git a/harness/multiselect-process-evidence-20260923/checks/manifest.json b/harness/multiselect-process-evidence-20260923/checks/manifest.json new file mode 100644 index 00000000..325a1fc1 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/checks/manifest.json @@ -0,0 +1,1126 @@ +{ + "schema": 1, + "kind": "multiselect-cargo-gates", + "runs": { + "core-1": { + "command": [ + "cargo", + "test", + "-p", + "oa-core", + "--example", + "process_multiselect_native", + "--message-format=json", + "--", + "--test-threads=1" + ], + "head": "bed7f825fd00ec32299032a664a5f5d753aad86d", + "exitCode": 0, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "core-2": { + "command": [ + "cargo", + "test", + "-p", + "oa-core", + "--example", + "process_multiselect_native", + "--message-format=json", + "--", + "--test-threads=1" + ], + "head": "b15345123a7feaf630ef24d45f591c76c6715778", + "exitCode": 0, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "core-3": { + "command": [ + "cargo", + "test", + "-p", + "oa-core", + "--example", + "process_multiselect_native", + "--message-format=json", + "--", + "--test-threads=1" + ], + "head": "ff712b24190342363d0275467e96f181872da6ad", + "exitCode": 0, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "desktop-1": { + "command": [ + "cargo", + "test", + "-p", + "oa-desktop", + "--message-format=json", + "--", + "topology", + "process_", + "canvas_workspace", + "repeated_process", + "--test-threads=1" + ], + "head": "bed7f825fd00ec32299032a664a5f5d753aad86d", + "exitCode": 101, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "desktop-2": { + "command": [ + "cargo", + "test", + "-p", + "oa-desktop", + "--message-format=json", + "--", + "topology", + "process_", + "canvas_workspace", + "repeated_process", + "--test-threads=1" + ], + "head": "bed7f825fd00ec32299032a664a5f5d753aad86d", + "exitCode": 101, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "desktop-3": { + "command": [ + "cargo", + "test", + "-p", + "oa-desktop", + "--message-format=json", + "--", + "topology", + "process_", + "canvas_workspace", + "repeated_process", + "menu", + "--test-threads=1" + ], + "head": "1711bff650dabb1df3a9bc37f19060d5db297feb", + "exitCode": 0, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "desktop-4": { + "command": [ + "cargo", + "test", + "-p", + "oa-desktop", + "--message-format=json", + "topology", + "process_", + "canvas_workspace", + "repeated_process", + "menu", + "--", + "--test-threads=1" + ], + "head": "b15345123a7feaf630ef24d45f591c76c6715778", + "exitCode": 1, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "desktop-5": { + "command": [ + "cargo", + "test", + "-p", + "oa-desktop", + "--message-format=json", + "--", + "topology", + "process_", + "canvas_workspace", + "repeated_process", + "menu", + "--test-threads=1" + ], + "head": "b15345123a7feaf630ef24d45f591c76c6715778", + "exitCode": 101, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "desktop-6": { + "command": [ + "cargo", + "test", + "-p", + "oa-desktop", + "--message-format=json", + "--", + "topology", + "process_", + "canvas_workspace", + "repeated_process", + "menu", + "--test-threads=1" + ], + "head": "b15345123a7feaf630ef24d45f591c76c6715778", + "exitCode": 0, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "feedback-1": { + "command": [ + "cargo", + "test", + "-p", + "oa-desktop", + "--message-format=json", + "--", + "production_process_multiselect_reverse_click_group_drop_has_one_history_step_and_stable_camera", + "--test-threads=1" + ], + "head": "1711bff650dabb1df3a9bc37f19060d5db297feb", + "exitCode": 0, + "inputCount": 742, + "helper": "helpers/230f1222f133edef76ffb9c09ed6eecf952fc326b04a0bbccb3f3f49df4c0c29.py" + }, + "format-1": { + "command": [ + "cargo", + "fmt", + "--all", + "--", + "--check" + ], + "head": "bed7f825fd00ec32299032a664a5f5d753aad86d", + "exitCode": 0, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "format-2": { + "command": [ + "cargo", + "fmt", + "--all", + "--", + "--check" + ], + "head": "1711bff650dabb1df3a9bc37f19060d5db297feb", + "exitCode": 0, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "format-3": { + "command": [ + "cargo", + "fmt", + "--all", + "--", + "--check" + ], + "head": "b15345123a7feaf630ef24d45f591c76c6715778", + "exitCode": 0, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "format-4": { + "command": [ + "cargo", + "fmt", + "--all", + "--", + "--check" + ], + "head": "ff712b24190342363d0275467e96f181872da6ad", + "exitCode": 0, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "full-desktop-1": { + "command": [ + "cargo", + "test", + "-p", + "oa-desktop", + "--message-format=json", + "--", + "--test-threads=1" + ], + "head": "bed7f825fd00ec32299032a664a5f5d753aad86d", + "exitCode": 0, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "full-desktop-2": { + "command": [ + "cargo", + "test", + "-p", + "oa-desktop", + "--message-format=json", + "--", + "--test-threads=1" + ], + "head": "b15345123a7feaf630ef24d45f591c76c6715778", + "exitCode": 0, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "lint-1": { + "command": [ + "cargo", + "clippy", + "-p", + "oa-core", + "-p", + "oa-desktop", + "--all-targets", + "--message-format=json", + "--", + "-D", + "warnings" + ], + "head": "bed7f825fd00ec32299032a664a5f5d753aad86d", + "exitCode": 101, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "lint-2": { + "command": [ + "cargo", + "clippy", + "-p", + "oa-core", + "-p", + "oa-desktop", + "--all-targets", + "--message-format=json", + "--", + "-D", + "warnings" + ], + "head": "1711bff650dabb1df3a9bc37f19060d5db297feb", + "exitCode": 0, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "lint-3": { + "command": [ + "cargo", + "clippy", + "-p", + "oa-core", + "-p", + "oa-desktop", + "--all-targets", + "--message-format=json", + "--", + "-D", + "warnings" + ], + "head": "b15345123a7feaf630ef24d45f591c76c6715778", + "exitCode": 0, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "lint-4": { + "command": [ + "cargo", + "clippy", + "-p", + "oa-core", + "--example", + "process_multiselect_native", + "--message-format=json", + "--", + "-D", + "warnings" + ], + "head": "ff712b24190342363d0275467e96f181872da6ad", + "exitCode": 0, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "native-build-1": { + "command": [ + "cargo", + "build", + "-p", + "oa-core", + "--example", + "process_multiselect_native", + "--message-format=json" + ], + "head": "b15345123a7feaf630ef24d45f591c76c6715778", + "exitCode": 0, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "native-build-2": { + "command": [ + "cargo", + "build", + "-p", + "oa-core", + "--example", + "process_multiselect_native", + "--message-format=json" + ], + "head": "b743a10d51032dc1655b94fed5e49fbbbcee83f4", + "exitCode": 0, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "windows-build-1": { + "command": [ + "cargo", + "build", + "-p", + "oa-desktop", + "--message-format=json" + ], + "head": "b15345123a7feaf630ef24d45f591c76c6715778", + "exitCode": 0, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + }, + "windows-build-2": { + "command": [ + "cargo", + "build", + "-p", + "oa-desktop", + "--message-format=json" + ], + "head": "b743a10d51032dc1655b94fed5e49fbbbcee83f4", + "exitCode": 0, + "inputCount": 742, + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py" + } + }, + "captureHelpers": { + "gate.py": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py", + "gate-feedback.py": "helpers/230f1222f133edef76ffb9c09ed6eecf952fc326b04a0bbccb3f3f49df4c0c29.py" + }, + "logicalFiles": { + "cargo/core-1/inputs.json": "capsules/50a2a94fd8302e657ec60b736134cbb0317bb45dbadaa33386654450588dc4f1.json", + "cargo/core-1/inputs.zip": "capsules/5d461ddbf464abb553f430bedd5c043cb104dfe27b38369e9e123acb92475fac.zip", + "cargo/core-1/process.json": "cargo/core-1/process.json", + "cargo/core-1/result.json": "cargo/core-1/result.json", + "cargo/core-1/started.json": "cargo/core-1/started.json", + "cargo/core-1/stderr.log": "cargo/core-1/stderr.log", + "cargo/core-1/stdout.log": "cargo/core-1/stdout.log", + "cargo/core-2/inputs.json": "capsules/7f5b3de4d5bb70282e424fbe90211af2ac259965aef10b05438b46076467a767.json", + "cargo/core-2/inputs.zip": "capsules/f681fb5ead73d5aba1d9a0f25ea29a96ccb430692630b64987b984623cd38148.zip", + "cargo/core-2/process.json": "cargo/core-2/process.json", + "cargo/core-2/result.json": "cargo/core-2/result.json", + "cargo/core-2/started.json": "cargo/core-2/started.json", + "cargo/core-2/stderr.log": "cargo/core-2/stderr.log", + "cargo/core-2/stdout.log": "cargo/core-2/stdout.log", + "cargo/core-3/inputs.json": "capsules/f3fd180af294e0797f9dfdbff647274de30a907b685a4fe1a2b58027bfe7da95.json", + "cargo/core-3/inputs.zip": "capsules/2dcc12ec457a6df0997c11c2fed3d5085b7033c9e100ec7d29b01af254d693cc.zip", + "cargo/core-3/process.json": "cargo/core-3/process.json", + "cargo/core-3/result.json": "cargo/core-3/result.json", + "cargo/core-3/started.json": "cargo/core-3/started.json", + "cargo/core-3/stderr.log": "cargo/core-3/stderr.log", + "cargo/core-3/stdout.log": "cargo/core-3/stdout.log", + "cargo/desktop-1/inputs.json": "capsules/50a2a94fd8302e657ec60b736134cbb0317bb45dbadaa33386654450588dc4f1.json", + "cargo/desktop-1/inputs.zip": "capsules/5d461ddbf464abb553f430bedd5c043cb104dfe27b38369e9e123acb92475fac.zip", + "cargo/desktop-1/process.json": "cargo/desktop-1/process.json", + "cargo/desktop-1/result.json": "cargo/desktop-1/result.json", + "cargo/desktop-1/started.json": "cargo/desktop-1/started.json", + "cargo/desktop-1/stderr.log": "cargo/desktop-1/stderr.log", + "cargo/desktop-1/stdout.log": "cargo/desktop-1/stdout.log", + "cargo/desktop-2/inputs.json": "capsules/eabf7fb87cf9872d08482b1178f16553e5d194596639f51e42f5a248ffdb66f0.json", + "cargo/desktop-2/inputs.zip": "capsules/7991e2c80a908d40a85e0a68730b337e47fed993550d5d6dc6be52607f915a82.zip", + "cargo/desktop-2/process.json": "cargo/desktop-2/process.json", + "cargo/desktop-2/result.json": "cargo/desktop-2/result.json", + "cargo/desktop-2/started.json": "cargo/desktop-2/started.json", + "cargo/desktop-2/stderr.log": "cargo/desktop-2/stderr.log", + "cargo/desktop-2/stdout.log": "cargo/desktop-2/stdout.log", + "cargo/desktop-3/inputs.json": "capsules/7f5b3de4d5bb70282e424fbe90211af2ac259965aef10b05438b46076467a767.json", + "cargo/desktop-3/inputs.zip": "capsules/f681fb5ead73d5aba1d9a0f25ea29a96ccb430692630b64987b984623cd38148.zip", + "cargo/desktop-3/process.json": "cargo/desktop-3/process.json", + "cargo/desktop-3/result.json": "cargo/desktop-3/result.json", + "cargo/desktop-3/started.json": "cargo/desktop-3/started.json", + "cargo/desktop-3/stderr.log": "cargo/desktop-3/stderr.log", + "cargo/desktop-3/stdout.log": "cargo/desktop-3/stdout.log", + "cargo/desktop-4/inputs.json": "capsules/b00d7695489437f5c896abe5a12e99a42f1b0b759d9e07828bf4b3bb3de69634.json", + "cargo/desktop-4/inputs.zip": "capsules/d21871d7b41d87f34d483382886e4c3cb46023a23f911b541852ffc154529b55.zip", + "cargo/desktop-4/process.json": "cargo/desktop-4/process.json", + "cargo/desktop-4/result.json": "cargo/desktop-4/result.json", + "cargo/desktop-4/started.json": "cargo/desktop-4/started.json", + "cargo/desktop-4/stderr.log": "cargo/desktop-4/stderr.log", + "cargo/desktop-4/stdout.log": "cargo/desktop-4/stdout.log", + "cargo/desktop-5/inputs.json": "capsules/b00d7695489437f5c896abe5a12e99a42f1b0b759d9e07828bf4b3bb3de69634.json", + "cargo/desktop-5/inputs.zip": "capsules/d21871d7b41d87f34d483382886e4c3cb46023a23f911b541852ffc154529b55.zip", + "cargo/desktop-5/process.json": "cargo/desktop-5/process.json", + "cargo/desktop-5/result.json": "cargo/desktop-5/result.json", + "cargo/desktop-5/started.json": "cargo/desktop-5/started.json", + "cargo/desktop-5/stderr.log": "cargo/desktop-5/stderr.log", + "cargo/desktop-5/stdout.log": "cargo/desktop-5/stdout.log", + "cargo/desktop-6/inputs.json": "capsules/1ba4ed414b3ccbc139ad4998af77370cba994f3edf4395b80acc69d3440ccc45.json", + "cargo/desktop-6/inputs.zip": "capsules/c5e367e9a2d1c155bf872fc42ae5a1bbb06947ee4b6ad5bc6c9ac767eee2166c.zip", + "cargo/desktop-6/process.json": "cargo/desktop-6/process.json", + "cargo/desktop-6/result.json": "cargo/desktop-6/result.json", + "cargo/desktop-6/started.json": "cargo/desktop-6/started.json", + "cargo/desktop-6/stderr.log": "cargo/desktop-6/stderr.log", + "cargo/desktop-6/stdout.log": "cargo/desktop-6/stdout.log", + "cargo/feedback-1/inputs.json": "capsules/7f5b3de4d5bb70282e424fbe90211af2ac259965aef10b05438b46076467a767.json", + "cargo/feedback-1/inputs.zip": "capsules/f681fb5ead73d5aba1d9a0f25ea29a96ccb430692630b64987b984623cd38148.zip", + "cargo/feedback-1/process.json": "cargo/feedback-1/process.json", + "cargo/feedback-1/result.json": "cargo/feedback-1/result.json", + "cargo/feedback-1/started.json": "cargo/feedback-1/started.json", + "cargo/feedback-1/stderr.log": "cargo/feedback-1/stderr.log", + "cargo/feedback-1/stdout.log": "cargo/feedback-1/stdout.log", + "cargo/format-1/inputs.json": "capsules/d5acfcf62fb4efd4efaf073abcc7e671644a6086e9e6cf105a06034c4a27daf8.json", + "cargo/format-1/inputs.zip": "capsules/54f2d4cf11dce768ba3a5376938f377ff1f0c169ab55e72f97206f291492014d.zip", + "cargo/format-1/process.json": "cargo/format-1/process.json", + "cargo/format-1/result.json": "cargo/format-1/result.json", + "cargo/format-1/started.json": "cargo/format-1/started.json", + "cargo/format-1/stderr.log": "cargo/format-1/stderr.log", + "cargo/format-1/stdout.log": "cargo/format-1/stdout.log", + "cargo/format-2/inputs.json": "capsules/7f5b3de4d5bb70282e424fbe90211af2ac259965aef10b05438b46076467a767.json", + "cargo/format-2/inputs.zip": "capsules/f681fb5ead73d5aba1d9a0f25ea29a96ccb430692630b64987b984623cd38148.zip", + "cargo/format-2/process.json": "cargo/format-2/process.json", + "cargo/format-2/result.json": "cargo/format-2/result.json", + "cargo/format-2/started.json": "cargo/format-2/started.json", + "cargo/format-2/stderr.log": "cargo/format-2/stderr.log", + "cargo/format-2/stdout.log": "cargo/format-2/stdout.log", + "cargo/format-3/inputs.json": "capsules/1ba4ed414b3ccbc139ad4998af77370cba994f3edf4395b80acc69d3440ccc45.json", + "cargo/format-3/inputs.zip": "capsules/c5e367e9a2d1c155bf872fc42ae5a1bbb06947ee4b6ad5bc6c9ac767eee2166c.zip", + "cargo/format-3/process.json": "cargo/format-3/process.json", + "cargo/format-3/result.json": "cargo/format-3/result.json", + "cargo/format-3/started.json": "cargo/format-3/started.json", + "cargo/format-3/stderr.log": "cargo/format-3/stderr.log", + "cargo/format-3/stdout.log": "cargo/format-3/stdout.log", + "cargo/format-4/inputs.json": "capsules/f3fd180af294e0797f9dfdbff647274de30a907b685a4fe1a2b58027bfe7da95.json", + "cargo/format-4/inputs.zip": "capsules/2dcc12ec457a6df0997c11c2fed3d5085b7033c9e100ec7d29b01af254d693cc.zip", + "cargo/format-4/process.json": "cargo/format-4/process.json", + "cargo/format-4/result.json": "cargo/format-4/result.json", + "cargo/format-4/started.json": "cargo/format-4/started.json", + "cargo/format-4/stderr.log": "cargo/format-4/stderr.log", + "cargo/format-4/stdout.log": "cargo/format-4/stdout.log", + "cargo/full-desktop-1/inputs.json": "capsules/d5acfcf62fb4efd4efaf073abcc7e671644a6086e9e6cf105a06034c4a27daf8.json", + "cargo/full-desktop-1/inputs.zip": "capsules/54f2d4cf11dce768ba3a5376938f377ff1f0c169ab55e72f97206f291492014d.zip", + "cargo/full-desktop-1/process.json": "cargo/full-desktop-1/process.json", + "cargo/full-desktop-1/result.json": "cargo/full-desktop-1/result.json", + "cargo/full-desktop-1/started.json": "cargo/full-desktop-1/started.json", + "cargo/full-desktop-1/stderr.log": "cargo/full-desktop-1/stderr.log", + "cargo/full-desktop-1/stdout.log": "cargo/full-desktop-1/stdout.log", + "cargo/full-desktop-2/inputs.json": "capsules/1ba4ed414b3ccbc139ad4998af77370cba994f3edf4395b80acc69d3440ccc45.json", + "cargo/full-desktop-2/inputs.zip": "capsules/c5e367e9a2d1c155bf872fc42ae5a1bbb06947ee4b6ad5bc6c9ac767eee2166c.zip", + "cargo/full-desktop-2/process.json": "cargo/full-desktop-2/process.json", + "cargo/full-desktop-2/result.json": "cargo/full-desktop-2/result.json", + "cargo/full-desktop-2/started.json": "cargo/full-desktop-2/started.json", + "cargo/full-desktop-2/stderr.log": "cargo/full-desktop-2/stderr.log", + "cargo/full-desktop-2/stdout.log": "cargo/full-desktop-2/stdout.log", + "cargo/lint-1/inputs.json": "capsules/d5acfcf62fb4efd4efaf073abcc7e671644a6086e9e6cf105a06034c4a27daf8.json", + "cargo/lint-1/inputs.zip": "capsules/54f2d4cf11dce768ba3a5376938f377ff1f0c169ab55e72f97206f291492014d.zip", + "cargo/lint-1/process.json": "cargo/lint-1/process.json", + "cargo/lint-1/result.json": "cargo/lint-1/result.json", + "cargo/lint-1/started.json": "cargo/lint-1/started.json", + "cargo/lint-1/stderr.log": "cargo/lint-1/stderr.log", + "cargo/lint-1/stdout.log": "cargo/lint-1/stdout.log", + "cargo/lint-2/inputs.json": "capsules/7f5b3de4d5bb70282e424fbe90211af2ac259965aef10b05438b46076467a767.json", + "cargo/lint-2/inputs.zip": "capsules/f681fb5ead73d5aba1d9a0f25ea29a96ccb430692630b64987b984623cd38148.zip", + "cargo/lint-2/process.json": "cargo/lint-2/process.json", + "cargo/lint-2/result.json": "cargo/lint-2/result.json", + "cargo/lint-2/started.json": "cargo/lint-2/started.json", + "cargo/lint-2/stderr.log": "cargo/lint-2/stderr.log", + "cargo/lint-2/stdout.log": "cargo/lint-2/stdout.log", + "cargo/lint-3/inputs.json": "capsules/1ba4ed414b3ccbc139ad4998af77370cba994f3edf4395b80acc69d3440ccc45.json", + "cargo/lint-3/inputs.zip": "capsules/c5e367e9a2d1c155bf872fc42ae5a1bbb06947ee4b6ad5bc6c9ac767eee2166c.zip", + "cargo/lint-3/process.json": "cargo/lint-3/process.json", + "cargo/lint-3/result.json": "cargo/lint-3/result.json", + "cargo/lint-3/started.json": "cargo/lint-3/started.json", + "cargo/lint-3/stderr.log": "cargo/lint-3/stderr.log", + "cargo/lint-3/stdout.log": "cargo/lint-3/stdout.log", + "cargo/lint-4/inputs.json": "capsules/f3fd180af294e0797f9dfdbff647274de30a907b685a4fe1a2b58027bfe7da95.json", + "cargo/lint-4/inputs.zip": "capsules/2dcc12ec457a6df0997c11c2fed3d5085b7033c9e100ec7d29b01af254d693cc.zip", + "cargo/lint-4/process.json": "cargo/lint-4/process.json", + "cargo/lint-4/result.json": "cargo/lint-4/result.json", + "cargo/lint-4/started.json": "cargo/lint-4/started.json", + "cargo/lint-4/stderr.log": "cargo/lint-4/stderr.log", + "cargo/lint-4/stdout.log": "cargo/lint-4/stdout.log", + "cargo/native-build-1/inputs.json": "capsules/7f5b3de4d5bb70282e424fbe90211af2ac259965aef10b05438b46076467a767.json", + "cargo/native-build-1/inputs.zip": "capsules/f681fb5ead73d5aba1d9a0f25ea29a96ccb430692630b64987b984623cd38148.zip", + "cargo/native-build-1/process.json": "cargo/native-build-1/process.json", + "cargo/native-build-1/result.json": "cargo/native-build-1/result.json", + "cargo/native-build-1/started.json": "cargo/native-build-1/started.json", + "cargo/native-build-1/stderr.log": "cargo/native-build-1/stderr.log", + "cargo/native-build-1/stdout.log": "cargo/native-build-1/stdout.log", + "cargo/native-build-2/inputs.json": "capsules/f3fd180af294e0797f9dfdbff647274de30a907b685a4fe1a2b58027bfe7da95.json", + "cargo/native-build-2/inputs.zip": "capsules/2dcc12ec457a6df0997c11c2fed3d5085b7033c9e100ec7d29b01af254d693cc.zip", + "cargo/native-build-2/process.json": "cargo/native-build-2/process.json", + "cargo/native-build-2/result.json": "cargo/native-build-2/result.json", + "cargo/native-build-2/started.json": "cargo/native-build-2/started.json", + "cargo/native-build-2/stderr.log": "cargo/native-build-2/stderr.log", + "cargo/native-build-2/stdout.log": "cargo/native-build-2/stdout.log", + "cargo/windows-build-1/inputs.json": "capsules/7f5b3de4d5bb70282e424fbe90211af2ac259965aef10b05438b46076467a767.json", + "cargo/windows-build-1/inputs.zip": "capsules/f681fb5ead73d5aba1d9a0f25ea29a96ccb430692630b64987b984623cd38148.zip", + "cargo/windows-build-1/process.json": "cargo/windows-build-1/process.json", + "cargo/windows-build-1/result.json": "cargo/windows-build-1/result.json", + "cargo/windows-build-1/started.json": "cargo/windows-build-1/started.json", + "cargo/windows-build-1/stderr.log": "cargo/windows-build-1/stderr.log", + "cargo/windows-build-1/stdout.log": "cargo/windows-build-1/stdout.log", + "cargo/windows-build-2/inputs.json": "capsules/f3fd180af294e0797f9dfdbff647274de30a907b685a4fe1a2b58027bfe7da95.json", + "cargo/windows-build-2/inputs.zip": "capsules/2dcc12ec457a6df0997c11c2fed3d5085b7033c9e100ec7d29b01af254d693cc.zip", + "cargo/windows-build-2/process.json": "cargo/windows-build-2/process.json", + "cargo/windows-build-2/result.json": "cargo/windows-build-2/result.json", + "cargo/windows-build-2/started.json": "cargo/windows-build-2/started.json", + "cargo/windows-build-2/stderr.log": "cargo/windows-build-2/stderr.log", + "cargo/windows-build-2/stdout.log": "cargo/windows-build-2/stdout.log", + "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py", + "helpers/230f1222f133edef76ffb9c09ed6eecf952fc326b04a0bbccb3f3f49df4c0c29.py": "helpers/230f1222f133edef76ffb9c09ed6eecf952fc326b04a0bbccb3f3f49df4c0c29.py" + }, + "members": { + "capsules/1ba4ed414b3ccbc139ad4998af77370cba994f3edf4395b80acc69d3440ccc45.json": { + "bytes": 124276, + "sha256": "1ba4ed414b3ccbc139ad4998af77370cba994f3edf4395b80acc69d3440ccc45" + }, + "capsules/2dcc12ec457a6df0997c11c2fed3d5085b7033c9e100ec7d29b01af254d693cc.zip": { + "bytes": 2987614, + "sha256": "2dcc12ec457a6df0997c11c2fed3d5085b7033c9e100ec7d29b01af254d693cc" + }, + "capsules/50a2a94fd8302e657ec60b736134cbb0317bb45dbadaa33386654450588dc4f1.json": { + "bytes": 124276, + "sha256": "50a2a94fd8302e657ec60b736134cbb0317bb45dbadaa33386654450588dc4f1" + }, + "capsules/54f2d4cf11dce768ba3a5376938f377ff1f0c169ab55e72f97206f291492014d.zip": { + "bytes": 2985236, + "sha256": "54f2d4cf11dce768ba3a5376938f377ff1f0c169ab55e72f97206f291492014d" + }, + "capsules/5d461ddbf464abb553f430bedd5c043cb104dfe27b38369e9e123acb92475fac.zip": { + "bytes": 2983752, + "sha256": "5d461ddbf464abb553f430bedd5c043cb104dfe27b38369e9e123acb92475fac" + }, + "capsules/7991e2c80a908d40a85e0a68730b337e47fed993550d5d6dc6be52607f915a82.zip": { + "bytes": 2985226, + "sha256": "7991e2c80a908d40a85e0a68730b337e47fed993550d5d6dc6be52607f915a82" + }, + "capsules/7f5b3de4d5bb70282e424fbe90211af2ac259965aef10b05438b46076467a767.json": { + "bytes": 124276, + "sha256": "7f5b3de4d5bb70282e424fbe90211af2ac259965aef10b05438b46076467a767" + }, + "capsules/b00d7695489437f5c896abe5a12e99a42f1b0b759d9e07828bf4b3bb3de69634.json": { + "bytes": 124276, + "sha256": "b00d7695489437f5c896abe5a12e99a42f1b0b759d9e07828bf4b3bb3de69634" + }, + "capsules/c5e367e9a2d1c155bf872fc42ae5a1bbb06947ee4b6ad5bc6c9ac767eee2166c.zip": { + "bytes": 2987472, + "sha256": "c5e367e9a2d1c155bf872fc42ae5a1bbb06947ee4b6ad5bc6c9ac767eee2166c" + }, + "capsules/d21871d7b41d87f34d483382886e4c3cb46023a23f911b541852ffc154529b55.zip": { + "bytes": 2986783, + "sha256": "d21871d7b41d87f34d483382886e4c3cb46023a23f911b541852ffc154529b55" + }, + "capsules/d5acfcf62fb4efd4efaf073abcc7e671644a6086e9e6cf105a06034c4a27daf8.json": { + "bytes": 124276, + "sha256": "d5acfcf62fb4efd4efaf073abcc7e671644a6086e9e6cf105a06034c4a27daf8" + }, + "capsules/eabf7fb87cf9872d08482b1178f16553e5d194596639f51e42f5a248ffdb66f0.json": { + "bytes": 124276, + "sha256": "eabf7fb87cf9872d08482b1178f16553e5d194596639f51e42f5a248ffdb66f0" + }, + "capsules/f3fd180af294e0797f9dfdbff647274de30a907b685a4fe1a2b58027bfe7da95.json": { + "bytes": 124276, + "sha256": "f3fd180af294e0797f9dfdbff647274de30a907b685a4fe1a2b58027bfe7da95" + }, + "capsules/f681fb5ead73d5aba1d9a0f25ea29a96ccb430692630b64987b984623cd38148.zip": { + "bytes": 2985964, + "sha256": "f681fb5ead73d5aba1d9a0f25ea29a96ccb430692630b64987b984623cd38148" + }, + "cargo/core-1/process.json": { + "bytes": 202, + "sha256": "6bec8cab8e25f85ce12eae63c1f1a7a7588f9f0a2590e15e6ce1ecbd64da5367" + }, + "cargo/core-1/result.json": { + "bytes": 3389, + "sha256": "b5ab41b84650466594131e579bcebf6b4959b01594e15dd0c97dcbac02c78730" + }, + "cargo/core-1/started.json": { + "bytes": 1589, + "sha256": "f750afed5cc7828160dfbaffdfdaf65f6e6ea6077155386dbad842416bd998c4" + }, + "cargo/core-1/stderr.log": { + "bytes": 324, + "sha256": "988ac75555adaa3a8162de10a6e086cfdf9d63694e4fd0df02d5a7a2fbe7bb5e" + }, + "cargo/core-1/stdout.log": { + "bytes": 42304, + "sha256": "d6110df004e6bd219a9bc7df6adbba827af7eee725807f38d4f4bb7044ecd302" + }, + "cargo/core-2/process.json": { + "bytes": 202, + "sha256": "4a3fb9bb4281e211028ce2c15e8070138c92aafe794bf152151ff49d65089304" + }, + "cargo/core-2/result.json": { + "bytes": 3387, + "sha256": "aeef77c61452cfeadc104a307d962a2fad4287a99d0fdecfb2d59069631d40b8" + }, + "cargo/core-2/started.json": { + "bytes": 1589, + "sha256": "96b3c701cba809868dccb603abcd12ccfb5ab200883b3bde75e65d33b13af2dc" + }, + "cargo/core-2/stderr.log": { + "bytes": 253, + "sha256": "3caa803d0c76a3e9d070934ec663f5f3e505ffb25f21c946a321e075a3f45541" + }, + "cargo/core-2/stdout.log": { + "bytes": 42303, + "sha256": "3f7d406f09c0d18fa464f7313e03e50d1a5587ebead8585bae8fcbb8fbc12bc3" + }, + "cargo/core-3/process.json": { + "bytes": 202, + "sha256": "fe18c8791e1290895cfcdc3d8e70955ba1a3d8d33bca825e2495bcfa3b0ba1d5" + }, + "cargo/core-3/result.json": { + "bytes": 3389, + "sha256": "935962d372e0570ea7e55416050c0ae37464148f7a327a63d40531be7e3f5489" + }, + "cargo/core-3/started.json": { + "bytes": 1589, + "sha256": "ee0d66717cc0121b191887b031c29a037268ded1df8b35624c0c61da476b8586" + }, + "cargo/core-3/stderr.log": { + "bytes": 323, + "sha256": "ede43135edfb82b643ab3af51a815546ddd9f069a29ce092571e11bbd633091b" + }, + "cargo/core-3/stdout.log": { + "bytes": 42303, + "sha256": "abd875a5d586d77e12a4e71b0d51d707f9cfafbd6cf980da58be2fe0576612ea" + }, + "cargo/desktop-1/process.json": { + "bytes": 225, + "sha256": "884be8242a9d9d5e363e0b25ce2aa937bf78ef758a716f1313f7e7f459f795d0" + }, + "cargo/desktop-1/result.json": { + "bytes": 3360, + "sha256": "959cd00d90c6311603e1c2910e6c23d98b102c004884a55a0560d34b2a8ff00a" + }, + "cargo/desktop-1/started.json": { + "bytes": 1623, + "sha256": "d02d433efbdbe63d5917b1d90b73296e205d67d2fc4954b092172bb17465eb21" + }, + "cargo/desktop-1/stderr.log": { + "bytes": 358, + "sha256": "d26edae49256149f93a16181ddf4e1fdf05019b97f6176f67feb14d69da72a5d" + }, + "cargo/desktop-1/stdout.log": { + "bytes": 310704, + "sha256": "0d5dd558a893448b0193422332f06f194a52d22c205507c12d6676123fc28572" + }, + "cargo/desktop-2/process.json": { + "bytes": 226, + "sha256": "cb2a01b905d18e5ed7a33346d025c84a02d456c166b5c51892552b952eb0c2b9" + }, + "cargo/desktop-2/result.json": { + "bytes": 3359, + "sha256": "6818ea36e2c99162772abddf1ad15831c87aa9ce99f2befe779b4214658b4432" + }, + "cargo/desktop-2/started.json": { + "bytes": 1623, + "sha256": "1fdc4e78cfa343b169d03c03678c2c6e82fdb1e77d2b917b09575b59e4b1e539" + }, + "cargo/desktop-2/stderr.log": { + "bytes": 358, + "sha256": "936c116c7fbb54d09dadea3ee99a7ee0aab6e22c5847663ec787180cad7b87a5" + }, + "cargo/desktop-2/stdout.log": { + "bytes": 306783, + "sha256": "92cc0cc535b2c7682b4f9d4509d3d6ec11e5ac6fcfcef7ef4f9b681a0f20e273" + }, + "cargo/desktop-3/process.json": { + "bytes": 234, + "sha256": "cadbdcb6942795ab506e08bcf0a2729187271826cd512862b305d3f95af6763a" + }, + "cargo/desktop-3/result.json": { + "bytes": 3371, + "sha256": "f3e857d930e70666dc6c5f88c508a98e035330db2d18f6ca10bdc3fd2efe0cbb" + }, + "cargo/desktop-3/started.json": { + "bytes": 1636, + "sha256": "cb2047f966669b93c4e4c480e3cb744fbc6cc4dd60b6ffebb455aaa2eb45379f" + }, + "cargo/desktop-3/stderr.log": { + "bytes": 287, + "sha256": "8db54c27653786373f3100bb0aad89ac82d08b684066178b6dcc57c0f30a5186" + }, + "cargo/desktop-3/stdout.log": { + "bytes": 310641, + "sha256": "a523e55b55dabc43ec507ffa50116f299158b6e91d7f906f59002675be551617" + }, + "cargo/desktop-4/process.json": { + "bytes": 234, + "sha256": "8f07e87bcefddf59b8a51ec35996b2dde71dc0dd67e314c46de1021cbc3b7d66" + }, + "cargo/desktop-4/result.json": { + "bytes": 2028, + "sha256": "964d5975595681cce40a659a4dc2283157f599e443f74b3fd0a70085d9ff9f55" + }, + "cargo/desktop-4/started.json": { + "bytes": 1636, + "sha256": "e04d4f066c6402799475f607bbe16d6f40a267e6287bed6497faac7eb31ca6a0" + }, + "cargo/desktop-4/stderr.log": { + "bytes": 140, + "sha256": "5e30c2f757d39ba09c42f239921c78c37974120df0da0063f2cf43fb10b7c903" + }, + "cargo/desktop-4/stdout.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "cargo/desktop-5/process.json": { + "bytes": 234, + "sha256": "4c99e502f6d6e887c7489454b45291d74cd354e8ed7aac1311abe17d203b44ea" + }, + "cargo/desktop-5/result.json": { + "bytes": 3373, + "sha256": "9e799b7f410fe02586a1d3029eccfd9cec2452f1992e7b071dc2a752e88e69e4" + }, + "cargo/desktop-5/started.json": { + "bytes": 1636, + "sha256": "27c7b5f4960c6ec6337fa8327ef418bed447010bfd113211bcc9311ab821fddf" + }, + "cargo/desktop-5/stderr.log": { + "bytes": 358, + "sha256": "add3bda277cabc15598ab228c46683c2da7f2b0a55bd3f0a043bf3f06c17a04e" + }, + "cargo/desktop-5/stdout.log": { + "bytes": 311412, + "sha256": "83832ac3e66a691a72ccd2867cfba151c950937ed5a80a469032f0a28045c3ab" + }, + "cargo/desktop-6/process.json": { + "bytes": 234, + "sha256": "df402ee20070c46d1af54bd9301ae8cc394e1fd881d590368d1d9860f25ecbdc" + }, + "cargo/desktop-6/result.json": { + "bytes": 3371, + "sha256": "ba690911358cdbdfc16847466c688907ede520cd2642077685219caf7ac38470" + }, + "cargo/desktop-6/started.json": { + "bytes": 1636, + "sha256": "7d46478387b3a8c46b300fb621c2288d6f9158a6da19314026876db843337a68" + }, + "cargo/desktop-6/stderr.log": { + "bytes": 287, + "sha256": "1f617c1a2e680c3e0282499eebad6a530dd2941bcd0f09543ebeae786476b169" + }, + "cargo/desktop-6/stdout.log": { + "bytes": 311022, + "sha256": "780ab5b3eda2e0bd56b56a0e60b66c161cc2f811c084b64ac296a19383b37df5" + }, + "cargo/feedback-1/process.json": { + "bytes": 260, + "sha256": "b8559e934c97f9eba407b1ceceed637fc570a9a8ba9e3362b961824cb0344fcd" + }, + "cargo/feedback-1/result.json": { + "bytes": 3481, + "sha256": "2f007dfda469a75eaaf713577b394605af7d3d42fed2137d9e3ed632301c78d3" + }, + "cargo/feedback-1/started.json": { + "bytes": 1747, + "sha256": "01fbcfd28b752921ded95c40a711909851bcd005394b34b5f4f49a7eaa0a594c" + }, + "cargo/feedback-1/stderr.log": { + "bytes": 210, + "sha256": "504bdaa5c008c52a9462aeca71413f9933a4e9c6b0272715ba5ca916411781c1" + }, + "cargo/feedback-1/stdout.log": { + "bytes": 293378, + "sha256": "8c611aa1671316570c79b079882400e3b710d3eff8fe04e37ec59f17071fa92c" + }, + "cargo/format-1/process.json": { + "bytes": 116, + "sha256": "52687a01d58ed383c8f834c47541274e279f3c2f686c002a3394cc00b0bc6dcf" + }, + "cargo/format-1/result.json": { + "bytes": 1871, + "sha256": "7a14c5d541c6b857ae89f58561cc65146e975f52bedc12ba6a31462fcfdb97b2" + }, + "cargo/format-1/started.json": { + "bytes": 1483, + "sha256": "9b0b172efc3f682220b1a4052b2c810a3b5bf97643ffd47725911cd78a1a0bc7" + }, + "cargo/format-1/stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "cargo/format-1/stdout.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "cargo/format-2/process.json": { + "bytes": 116, + "sha256": "0403723a9cca41759a0891b0068a7323232e7e2fd236d23cb02bd256ef29ab45" + }, + "cargo/format-2/result.json": { + "bytes": 1872, + "sha256": "8f16c9146cf721e8c79b053f83684be13ae2329913294506e5f4cc92bb2fb1dc" + }, + "cargo/format-2/started.json": { + "bytes": 1483, + "sha256": "2212772b937a3f9a27bc23e6496acd03b6ad038eaa5f06b8ddb4e4b799a7cb83" + }, + "cargo/format-2/stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "cargo/format-2/stdout.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "cargo/format-3/process.json": { + "bytes": 116, + "sha256": "048378f339bad8da7863f97e5671b5cc18de101c6bfbf06d1d5a941cb44c1aba" + }, + "cargo/format-3/result.json": { + "bytes": 1871, + "sha256": "402ccfff4d08ddeed53b64a758d395446ba4c6926e8273435afc4adabf039ad3" + }, + "cargo/format-3/started.json": { + "bytes": 1483, + "sha256": "6411f41ae5f653e4986e16a38dd905d820bedae9e7935d29b9bc74ff5c01df2b" + }, + "cargo/format-3/stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "cargo/format-3/stdout.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "cargo/format-4/process.json": { + "bytes": 116, + "sha256": "1235445b246e66285da7a43a2a4f9067ed4a3ab734b400a0b5abcca1d521be54" + }, + "cargo/format-4/result.json": { + "bytes": 1871, + "sha256": "e7ec8b836983ba5bd7087f1e47cc4de85820d5339ec392f7d629737234a5f5dd" + }, + "cargo/format-4/started.json": { + "bytes": 1483, + "sha256": "638780b2bd8a755a432d088cbb69aa7d86d5f08c22bcde709124a73428520e8a" + }, + "cargo/format-4/stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "cargo/format-4/stdout.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "cargo/full-desktop-1/process.json": { + "bytes": 162, + "sha256": "afa6aa7b6d735148a1db2366894f59c2e0ecca45e222060bd5b7247aad8476f3" + }, + "cargo/full-desktop-1/result.json": { + "bytes": 3273, + "sha256": "d0804979b3f9deabc61ca97f4cee9f0c11837b69a41730fad77c1f992329af47" + }, + "cargo/full-desktop-1/started.json": { + "bytes": 1539, + "sha256": "f4d636477484f73d1c7ed1b6423309cf46510fa9a8aad08cf698f164ef928692" + }, + "cargo/full-desktop-1/stderr.log": { + "bytes": 287, + "sha256": "6b4d50ba398f541058f59f2ab87fabeb28c669e3395e1cb99551ad0829bbf68e" + }, + "cargo/full-desktop-1/stdout.log": { + "bytes": 445423, + "sha256": "a62c4e5fc711805564c25c196505988b00383c78e9e44ea0b05842e959b1c61c" + }, + "cargo/full-desktop-2/process.json": { + "bytes": 161, + "sha256": "b59db79901c47ff0bbc529690f98c804f7a6ded71160a86ecf36c38e78cfebd5" + }, + "cargo/full-desktop-2/result.json": { + "bytes": 3273, + "sha256": "1f97146a3d8efe9f3555af22446ee5adbddfe8bde521abf031dec59be4fb9d11" + }, + "cargo/full-desktop-2/started.json": { + "bytes": 1539, + "sha256": "7683c8e6ea6c4d2a9a0e52184701ef11016ff38ff8e3080f9c2c8827933ca48e" + }, + "cargo/full-desktop-2/stderr.log": { + "bytes": 210, + "sha256": "31df583ee1b398976b4373f4be995d79c31a094d38054777a7b281a36a17dd9e" + }, + "cargo/full-desktop-2/stdout.log": { + "bytes": 445803, + "sha256": "21e66e479c4ec5e7013e110ea0355f87317906e46e9300efb7854fed7470ab63" + }, + "cargo/lint-1/process.json": { + "bytes": 196, + "sha256": "fed7ff6c147b958dd9a114f7da8240133184cc2d4d2b6a1ff593641bdd42e859" + }, + "cargo/lint-1/result.json": { + "bytes": 1989, + "sha256": "161792fa35e0452ce75b6ebb82a9e85bd07d9f066ee97640358fbe38d7c0b6c2" + }, + "cargo/lint-1/started.json": { + "bytes": 1593, + "sha256": "afea705ba46b8939f7908aa62cce1f54d2aac74044b526bffc58eda1e08a639c" + }, + "cargo/lint-1/stderr.log": { + "bytes": 167, + "sha256": "de5fcf7a630c9db5e9ae0a74e70637edf372c4590dbf948eee88e642a7c4ccd3" + }, + "cargo/lint-1/stdout.log": { + "bytes": 274895, + "sha256": "94b8e1c8f6cd3f97cab07e02186eb5f2ef1ae0a1a9d8729347cf9b1a457108a9" + }, + "cargo/lint-2/process.json": { + "bytes": 196, + "sha256": "65cbaedf9fb3286c2800fba3cb24e4c1124f2f148a236c41025e7d1e33b1c553" + }, + "cargo/lint-2/result.json": { + "bytes": 1989, + "sha256": "6ed82f0fb01fb63dab35856a44910c8d274da7ded636f1f9be211e31ee75fe51" + }, + "cargo/lint-2/started.json": { + "bytes": 1593, + "sha256": "68741478c91159a3caa303a3eb547e4a5de4696253671839e11ab88bf350005a" + }, + "cargo/lint-2/stderr.log": { + "bytes": 207, + "sha256": "1f90fcac2272f9f45a281a87561cc132658b5f8e923aa461b9676da5435628ab" + }, + "cargo/lint-2/stdout.log": { + "bytes": 310285, + "sha256": "eb00f6e2f909bca8d3765cacbf2aca4142f6314ebf1916df3f25ae2f7bac735d" + }, + "cargo/lint-3/process.json": { + "bytes": 196, + "sha256": "cbf735cedd2d93a411bd208a3f2d620fc53deba36afd141d31662945bb530b54" + }, + "cargo/lint-3/result.json": { + "bytes": 1988, + "sha256": "62713ba7f0c0184af1f1bd76154c50684724eeb36bf7562d3a98eef183dc7089" + }, + "cargo/lint-3/started.json": { + "bytes": 1593, + "sha256": "096ae947d794895f97a4fdce733ed2fcba8108fe5560f3867eb6a712858a9212" + }, + "cargo/lint-3/stderr.log": { + "bytes": 137, + "sha256": "2233336da05e39aa60c45cae62339002a904cf342d551ca5e68869c206c3ed23" + }, + "cargo/lint-3/stdout.log": { + "bytes": 310284, + "sha256": "56b8e028611b240348b0373525741cb5e8e5e4fa044054845bbefd918c17bbeb" + }, + "cargo/lint-4/process.json": { + "bytes": 202, + "sha256": "2e4f98647c758e6545956aed20d8e464726b6639cc04274ad9bd47a289a5a65c" + }, + "cargo/lint-4/result.json": { + "bytes": 1989, + "sha256": "580171eca5ccd60da5615e50ba5d93ae3d06d072fd7bc1b4f1b8992596982050" + }, + "cargo/lint-4/started.json": { + "bytes": 1594, + "sha256": "fa32704c52e5335328300b4105eaba3b38d69f70bb14fa2ea8ecffb3bcb7ef79" + }, + "cargo/lint-4/stderr.log": { + "bytes": 227, + "sha256": "44b42afaf393a583a3c5f09844b241bdd61af02c2efd3d9bac2e785915073779" + }, + "cargo/lint-4/stdout.log": { + "bytes": 38950, + "sha256": "d4aabaa63e77b6959444dde23046e9722619bc67bf37037bb49ffc09a0ae29b7" + }, + "cargo/native-build-1/process.json": { + "bytes": 177, + "sha256": "96b067ef1a49f4e908452798214fa1691a6f58e47923ce338c182dd4135e7b12" + }, + "cargo/native-build-1/result.json": { + "bytes": 3321, + "sha256": "98f62963fc4a1d70ea49a2b3a8eb54dca7bc8c3e90edb26fef0b6af89f50e99b" + }, + "cargo/native-build-1/started.json": { + "bytes": 1554, + "sha256": "c92f92b1de9d0fef6e19a1365fd18782f9310cdbfa68d9b66ede3d179318c47e" + }, + "cargo/native-build-1/stderr.log": { + "bytes": 130, + "sha256": "2dc3f9bcc90f1046481f83482b478e3debd0d0784d137bc463cfd2813ebc0693" + }, + "cargo/native-build-1/stdout.log": { + "bytes": 41732, + "sha256": "582fef43a9b92e91df8dc3fc49f73e8d56e378a5451958ded376f90c7309b55e" + }, + "cargo/native-build-2/process.json": { + "bytes": 177, + "sha256": "654d7094bb258d53a981e23ee8a65dfe3c15bd5afd729ffcb5f9ab3d9bc7266b" + }, + "cargo/native-build-2/result.json": { + "bytes": 3322, + "sha256": "1df7538acda0f38b36f91d0293a7f74a5f4d308797f35b1d4dabaa7155aae23b" + }, + "cargo/native-build-2/started.json": { + "bytes": 1554, + "sha256": "c035f4568abe654969be40fbbc1af51d56adf5cf92e5242ba506c18ac84ce635" + }, + "cargo/native-build-2/stderr.log": { + "bytes": 130, + "sha256": "2dc3f9bcc90f1046481f83482b478e3debd0d0784d137bc463cfd2813ebc0693" + }, + "cargo/native-build-2/stdout.log": { + "bytes": 41732, + "sha256": "90d105724d4c77826bea5a3686fd23951d2a3f23ff221d326c753ba248f2ff90" + }, + "cargo/windows-build-1/process.json": { + "bytes": 137, + "sha256": "2d45f19802388b96fd734b034b5b6da3f9f7a04e8666b9c2eefa4c43e97e5031" + }, + "cargo/windows-build-1/result.json": { + "bytes": 3193, + "sha256": "0a4d5ac9e798153c54c415d4bbddb98c5f725ba28a537e340714d610a3a97547" + }, + "cargo/windows-build-1/started.json": { + "bytes": 1504, + "sha256": "acf7cd9f6ec1418a1cd9eaf99940851edc4889ee206b26a6a092dd7ec9d77b3f" + }, + "cargo/windows-build-1/stderr.log": { + "bytes": 137, + "sha256": "a5f6f3ceebc0811634cb745e93312a4103cc4c3caae0f217b6c97929a25e383e" + }, + "cargo/windows-build-1/stdout.log": { + "bytes": 284179, + "sha256": "c8a0b1cde5523aceddb7fe9f266b317af923a86c1e9ab73bc4ce03ad2e425f3c" + }, + "cargo/windows-build-2/process.json": { + "bytes": 137, + "sha256": "3435c171165966bc69284a1557a1b032afe6214485e1cf1931b8ea23113ab1e7" + }, + "cargo/windows-build-2/result.json": { + "bytes": 3193, + "sha256": "8082f00a7a2ecc6ce81cb2ac3d58ad0a115fdb598fbbed3ca521e00e6b57bbba" + }, + "cargo/windows-build-2/started.json": { + "bytes": 1504, + "sha256": "c44c7502122f5fc17e96476b9240cf8a590207eaab06cdcf38c0a6c98a2fca34" + }, + "cargo/windows-build-2/stderr.log": { + "bytes": 137, + "sha256": "acead8fc321ee49e00eadc746fbb2454442e48c93f4c001f8f7a00e747eb8bf6" + }, + "cargo/windows-build-2/stdout.log": { + "bytes": 284179, + "sha256": "0f4030afef0af42ad17b8c8cfc9b5b0051bb5fc79edbf8f589087a06734760cc" + }, + "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py": { + "bytes": 3827, + "sha256": "1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20" + }, + "helpers/230f1222f133edef76ffb9c09ed6eecf952fc326b04a0bbccb3f3f49df4c0c29.py": { + "bytes": 3856, + "sha256": "230f1222f133edef76ffb9c09ed6eecf952fc326b04a0bbccb3f3f49df4c0c29" + } + } +} diff --git a/harness/multiselect-process-evidence-20260923/checks/prepare.py b/harness/multiselect-process-evidence-20260923/checks/prepare.py new file mode 100644 index 00000000..806c4d11 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/checks/prepare.py @@ -0,0 +1,99 @@ +"""Package explicitly selected closed gate captures without running Cargo.""" +from pathlib import Path +import argparse +import json +import zipfile +from verify import RAW_FILES, pin, parsed, need, run_name, verify_data, verify_package + +HERE = Path(__file__).resolve().parent + + +def collect(root, runs, helpers): + gates = root / ".local/process-group-gates" + candidates = [gates / name for name in ("gate.py", "gate-feedback.py")] + helpers + helper_bytes = [path.read_bytes() for path in candidates] + payload, logical, specs = {}, {}, {} + def add(name, data): + stored = ("capsules/" + pin(data)["sha256"] + Path(name).suffix + if name.rsplit("/", 1)[1] in {"inputs.json", "inputs.zip"} else name) + need(stored not in payload or payload[stored] == data, "deduplication collision") + payload[stored] = data + logical[name] = stored + helper_catalog = {} + for name, data in zip(("gate.py", "gate-feedback.py"), helper_bytes): + helper = "helpers/" + pin(data)["sha256"] + ".py" + add(helper, data) + helper_catalog[name] = helper + for run in runs: + folder = gates / run + need(folder.is_dir(), "run directory missing: " + run) + paths = list(folder.iterdir()) + need(all(path.is_file() and not path.is_symlink() for path in paths) + and {path.name for path in paths} == RAW_FILES, "exact closed raw files required: " + run) + raw = {path.name: path.read_bytes() for path in paths} + result = parsed(raw["result.json"]) + need("finish" in result and result["inputsUnchanged"] is True, "unfinished/changed run refused: " + run) + matches = [data for data in helper_bytes if pin(data) == result["helper"]] + need(bool(matches), "exact historical helper unavailable for " + run + "; supply --helper PATH") + helper = "helpers/" + result["helper"]["sha256"] + ".py" + add(helper, matches[0]) + for name, data in sorted(raw.items()): + add("cargo/" + run + "/" + name, data) + specs[run] = {key: result[key] for key in ("command", "head", "exitCode", "inputCount")} + specs[run]["helper"] = helper + manifest = {"schema": 1, "kind": "multiselect-cargo-gates", "runs": specs, + "captureHelpers": helper_catalog, + "logicalFiles": dict(sorted(logical.items())), + "members": {name: pin(data) for name, data in sorted(payload.items())}} + summary = verify_data(manifest, payload.__getitem__) + return payload, manifest, summary + + +def write_json(path, value): + with path.open("xb") as output: + output.write((json.dumps(value, indent=2) + "\n").encode("utf-8")) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--root", type=Path, required=True, help="checkout holding .local/process-group-gates") + parser.add_argument("--runs", nargs="+", required=True, help="explicit run names, including failures to retain") + parser.add_argument("--helper", type=Path, action="append", default=[], help="additional exact historical helper (repeatable)") + parser.add_argument("--output", type=Path, help="fresh, nonexistent package directory (required unless --check-only)") + parser.add_argument("--check-only", action="store_true", help="validate raw captures in memory without creating an archive") + args = parser.parse_args() + need(all(run_name(run) for run in args.runs) and len(args.runs) == len(set(args.runs)), "unique safe run names required") + need(args.check_only or args.output is not None, "--output is required unless --check-only") + if not args.check_only: + need(not args.output.exists(), "output must be a fresh directory: " + str(args.output)) + payload, manifest, summary = collect(args.root.resolve(), args.runs, args.helper) + if args.check_only: + print("PASS raw consistency; no package written:", summary) + return + out = args.output.resolve() + out.mkdir(parents=True, exist_ok=False) + for name in ("evidence.zip", "manifest.json", "files.json"): + need(not (out / name).exists(), "existing package output refused: " + name) + for name in ("prepare.py", "verify.py", "README.md"): + data = (HERE / name).read_bytes() + destination = out / name + if destination.exists(): + need(destination.read_bytes() == data, "different existing package tool: " + name) + else: + with destination.open("xb") as output: + output.write(data) + with zipfile.ZipFile(out / "evidence.zip", "x", compression=zipfile.ZIP_DEFLATED, compresslevel=9) as archive: + for name, data in sorted(payload.items()): + info = zipfile.ZipInfo(name, date_time=(2026, 9, 23, 0, 0, 0)) + info.compress_type = zipfile.ZIP_DEFLATED + info.external_attr = 0o100644 << 16 + archive.writestr(info, data) + write_json(out / "manifest.json", manifest) + names = ("prepare.py", "verify.py", "README.md", "manifest.json", "evidence.zip") + write_json(out / "files.json", {name: pin((out / name).read_bytes()) for name in names}) + need(verify_package(out) == summary, "written package differs from validated captures") + print("PASS package readback:", out, summary) + + +if __name__ == "__main__": + main() diff --git a/harness/multiselect-process-evidence-20260923/checks/verify.py b/harness/multiselect-process-evidence-20260923/checks/verify.py new file mode 100644 index 00000000..63662f6a --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/checks/verify.py @@ -0,0 +1,173 @@ +"""Offline consistency checks only; never execute or extract archived inputs.""" +from pathlib import Path, PurePosixPath +from datetime import datetime +import argparse +import hashlib +import io +import json +import math +import re +import stat +import zipfile + +RAW_FILES = {"started.json", "process.json", "result.json", "stdout.log", "stderr.log", "inputs.json", "inputs.zip"} +OUTER_FILES = {"prepare.py", "verify.py", "README.md", "manifest.json", "evidence.zip"} + + +def need(condition, message): + if not condition: + raise ValueError(message) + + +def pin(data): + return {"bytes": len(data), "sha256": hashlib.sha256(data).hexdigest()} + + +def valid_pin(value): + return (isinstance(value, dict) and set(value) == {"bytes", "sha256"} + and type(value["bytes"]) is int and value["bytes"] >= 0 + and isinstance(value["sha256"], str) + and re.fullmatch(r"[0-9a-f]{64}", value["sha256"]) is not None) + + +def safe(name): + return (isinstance(name, str) and bool(name) and "\\" not in name and ":" not in name + and all(ord(char) >= 32 for char in name) + and not PurePosixPath(name).is_absolute() + and all(part not in ("", ".", "..") for part in name.split("/"))) + + +def run_name(name): + return isinstance(name, str) and re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9._-]*", name) is not None + + +def parsed(data): + def pairs(items): + result = {} + for key, value in items: + need(key not in result, "duplicate JSON key: " + key) + result[key] = value + return result + def constant(value): + raise ValueError("nonfinite JSON constant: " + value) + return json.loads(data, object_pairs_hook=pairs, parse_constant=constant) + + +def inventory(archive, expected): + names = archive.namelist() + need(len(names) == len(set(names)) and set(names) == set(expected), "exact ZIP membership") + for entry in archive.infolist(): + need(safe(entry.filename) and not entry.is_dir(), "unsafe ZIP member: " + entry.filename) + need(not stat.S_ISLNK(entry.external_attr >> 16), "ZIP symlink: " + entry.filename) + need(valid_pin(expected[entry.filename]), "invalid member pin: " + entry.filename) + need(entry.file_size == expected[entry.filename]["bytes"], "ZIP recorded size: " + entry.filename) + + +def ordered_times(*values): + times = [datetime.fromisoformat(value) for value in values] + return all(value.utcoffset() is not None for value in times) and times == sorted(times) + + +def verify_data(manifest, read): + """Shared read-only verifier for packaged bytes or prepare's in-memory payload.""" + need(manifest["schema"] == 1 and manifest["kind"] == "multiselect-cargo-gates", "manifest schema") + runs, logical, stored = manifest["runs"], manifest["logicalFiles"], manifest["members"] + helpers = manifest["captureHelpers"] + need(isinstance(helpers, dict) and set(helpers) == {"gate.py", "gate-feedback.py"}, "capture helper names") + need(all(isinstance(name, str) and re.fullmatch(r"helpers/[0-9a-f]{64}\.py", name) + for name in helpers.values()), "capture helper mapping") + need(isinstance(runs, dict) and bool(runs) and all(run_name(run) for run in runs), "explicit run inventory") + need(all(safe(name) for name in logical) and all(safe(name) for name in stored), "unsafe manifest path") + need(set(logical.values()) == set(stored), "unreferenced or absent stored members") + for name, expected in stored.items(): + need(valid_pin(expected) and pin(read(name)) == expected, "stored member hash: " + name) + expected_logical = {"cargo/" + run + "/" + name for run in runs for name in RAW_FILES} + expected_logical.update(spec["helper"] for spec in runs.values()) + expected_logical.update(helpers.values()) + need(set(logical) == expected_logical, "exact logical raw/helper inventory") + for name, destination in logical.items(): + if name.startswith("cargo/") and name.rsplit("/", 1)[1] in {"inputs.json", "inputs.zip"}: + expected = "capsules/" + stored[destination]["sha256"] + PurePosixPath(name).suffix + need(destination == expected, "input capsule mapping: " + name) + else: + need(destination == name, "only input maps/archives may be deduplicated: " + name) + def raw(name): + return read(logical[name]) + for name, helper in helpers.items(): + need(helper == "helpers/" + pin(raw(helper))["sha256"] + ".py", "named helper hash: " + name) + seen_capsules = set() + for run, spec in runs.items(): + prefix = "cargo/" + run + "/" + start = parsed(raw(prefix + "started.json")) + process = parsed(raw(prefix + "process.json")) + result = parsed(raw(prefix + "result.json")) + required_start = {"start", "command", "cwd", "head", "scope", "inputs", "archive", + "inputCount", "environment", "helper", "cargo", "rustc"} + need(required_start <= start.keys(), run + ": incomplete start receipt") + need(all(result.get(key) == value for key, value in start.items()), run + ": start/result relationship") + command = result["command"] + need(isinstance(command, list) and command and command[0] == "cargo" + and all(isinstance(arg, str) for arg in command), run + ": Cargo command") + need(command == process["command"] == spec["command"], run + ": command relationship") + need(result["head"] == spec["head"] and re.fullmatch(r"(?:[0-9a-f]{40}|[0-9a-f]{64})", result["head"]), run + ": HEAD") + need(type(result["exitCode"]) is int and result["exitCode"] == spec["exitCode"], run + ": recorded exit") + need(result["inputsUnchanged"] is True, run + ": changed inputs refused") + need(type(result["seconds"]) in (int, float) and math.isfinite(result["seconds"]) + and result["seconds"] >= 0, run + ": duration") + need(type(process["pid"]) is int and process["pid"] > 0, run + ": process identity") + need(ordered_times(start["start"], process["observed"], result["finish"]), run + ": completed timestamp order") + for field, filename in [("inputs", "inputs.json"), ("archive", "inputs.zip"), ("stdout", "stdout.log"), ("stderr", "stderr.log")]: + need(result[field] == pin(raw(prefix + filename)), run + ": " + field + " pin") + need(valid_pin(result["helper"]) and result["helper"] == pin(raw(spec["helper"])), run + ": helper pin") + need(spec["helper"] == "helpers/" + result["helper"]["sha256"] + ".py", run + ": helper mapping") + inputs = parsed(raw(prefix + "inputs.json")) + need(isinstance(inputs, dict) and all(safe(name) for name in inputs), run + ": safe input inventory") + need(type(result["inputCount"]) is int and len(inputs) == result["inputCount"] == spec["inputCount"], run + ": input counts") + need(sum(name.startswith("crates/vendor/iced_widget/") for name in inputs) == 71, run + ": vendor count") + capsule = (logical[prefix + "inputs.json"], logical[prefix + "inputs.zip"]) + if capsule not in seen_capsules: + with zipfile.ZipFile(io.BytesIO(raw(prefix + "inputs.zip"))) as source: + inventory(source, inputs) + for name, expected in inputs.items(): + need(pin(source.read(name)) == expected, run + ": source hash " + name) + seen_capsules.add(capsule) + artifacts = [] + for line in raw(prefix + "stdout.log").decode("utf-8", errors="replace").splitlines(): + try: + value = json.loads(line) + except json.JSONDecodeError: + continue + if isinstance(value, dict) and value.get("reason") == "compiler-artifact" and value.get("executable"): + artifacts.append(value) + need(isinstance(result["artifacts"], list), run + ": artifact records") + need(artifacts == [record["cargo"] for record in result["artifacts"]], run + ": Cargo JSON artifact relationship") + for record in result["artifacts"]: + need(set(record) == {"cargo", "readback"} + and (record["readback"] is None or valid_pin(record["readback"])), run + ": artifact readback pin") + print(run, "recorded exit", result["exitCode"], "inputs", len(inputs), "executable records", len(artifacts)) + return {"runs": len(runs), "recordedFailures": sum(spec["exitCode"] != 0 for spec in runs.values()), + "logicalFiles": len(logical), "storedMembers": len(stored), "sourceCapsulePairs": len(seen_capsules), + "captureHelpers": helpers} + + +def verify_package(root): + files = parsed((root / "files.json").read_bytes()) + need(set(files) == OUTER_FILES, "outer file inventory") + for name, expected in files.items(): + need(valid_pin(expected) and pin((root / name).read_bytes()) == expected, "outer hash: " + name) + manifest = parsed((root / "manifest.json").read_bytes()) + with zipfile.ZipFile(root / "evidence.zip") as archive: + inventory(archive, manifest["members"]) + return verify_data(manifest, archive.read) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("package", nargs="?", type=Path, default=Path(__file__).resolve().parent) + args = parser.parse_args() + print("PASS offline consistency:", verify_package(args.package)) + print("Historical receipts only; no source/binary execution or native acceptance claim.") + + +if __name__ == "__main__": + main() diff --git a/harness/multiselect-process-evidence-20260923/feedback/README.md b/harness/multiselect-process-evidence-20260923/feedback/README.md new file mode 100644 index 00000000..912d871d --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/feedback/README.md @@ -0,0 +1,42 @@ +# Actual Process render feedback byte proof + +This small package holds the four actual WGPU RGBA readbacks, adjacent JSON +metadata, lossless PNGs, original png-readback.json, encode-png.py and parent +observations.md from `.local/process-feedback-review/capture-1`. It requires +Python and Pillow; it never invokes Cargo, a GUI, or archived capture helpers. + +Use a portable Process checks package containing the closed `feedback-1` gate: + +```text +python -B prepare.py --root C:/ar-multiselect-9e8r6t --checks CHECKS_PACKAGE --check-only +python -B prepare.py --root C:/ar-multiselect-9e8r6t --checks CHECKS_PACKAGE --output FRESH_DIRECTORY +python -B FRESH_DIRECTORY/verify.py --checks CHECKS_PACKAGE +``` + +Run the checks package's own verifier too. Feedback references exact logical +feedback-1 receipt/helper/log/input pins, so the checks package may include other +runs and may be moved independently. No full source capsule is duplicated here. +Preparation refuses existing output and compares all 742 captured input bytes +to Git commit b15345123a7feaf630ef24d45f591c76c6715778. Verification checks the +fixed source map identity and every source-capsule member through the supplied +checks package. The original gate HEAD predates b153; its captured inputs, rather +than that HEAD, identify the rendered source. The relevant captured test and +Mounted renderer paths have explicit source pins. + +Every PNG is decoded and required to equal its raw RGBA byte for byte at the +recorded 1440x900 size. For OA and SA separately, before-press and after-motion +must preserve complete source bundle, selection string/count, canvas, camera, +scale and dimensions while pixels differ. The original PNG readback receipt, +unique safe ZIP inventory and every archived file hash are checked. A matching +checks receipt must record the exact passing test and capture output directory. + +This is byte/provenance consistency, not native acceptance or independent image +interpretation. Pixel files have no gate-time hashes: their linkage is the +recorded output directory, create-only captured test code, passing test receipt +and parent observations; package pins establish bytes at packaging time. +Selection metadata stores the test's captured snapshot; unchanged current +selection and empty history are separately asserted in the passing test. +There is no history metadata, and this tool does not invent any. Source text in +metadata is compared exactly between stages, not reparsed as a Project. +The parent observations describe visible quality and scope limits. Encoding +helpers and observations are preserved, not executed or treated as instructions. diff --git a/harness/multiselect-process-evidence-20260923/feedback/evidence.zip b/harness/multiselect-process-evidence-20260923/feedback/evidence.zip new file mode 100644 index 00000000..0bf5e62d Binary files /dev/null and b/harness/multiselect-process-evidence-20260923/feedback/evidence.zip differ diff --git a/harness/multiselect-process-evidence-20260923/feedback/files.json b/harness/multiselect-process-evidence-20260923/feedback/files.json new file mode 100644 index 00000000..e9e2a214 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/feedback/files.json @@ -0,0 +1,22 @@ +{ + "README.md": { + "bytes": 2623, + "sha256": "731c4062a0bc4a66a44246fc69c53b8aa32fd09613e62c9bbef4716f7c930641" + }, + "evidence.zip": { + "bytes": 797909, + "sha256": "6ebd3beafec69da81124511a509f56fe966d35fbd1b127567a1b7f57eb1a9051" + }, + "manifest.json": { + "bytes": 4079, + "sha256": "caf50753143216c0cf503473508581f1229528215cf6a72b038ddc8f84a75000" + }, + "prepare.py": { + "bytes": 3753, + "sha256": "4fb1db6b465ae6fd25cdabdf63b3a5fb76a6cd9399f01afd3dca4dd9ec4e7f86" + }, + "verify.py": { + "bytes": 8730, + "sha256": "d0bcb4fc8b07c7ba9b4573505b72e865a5eb18070b9b5e4411db757e13175d96" + } +} diff --git a/harness/multiselect-process-evidence-20260923/feedback/manifest.json b/harness/multiselect-process-evidence-20260923/feedback/manifest.json new file mode 100644 index 00000000..f448232b --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/feedback/manifest.json @@ -0,0 +1,112 @@ +{ + "schema": 1, + "kind": "process-render-feedback", + "sourceCommit": "b15345123a7feaf630ef24d45f591c76c6715778", + "checksRun": "feedback-1", + "checksPins": { + "started.json": { + "bytes": 1747, + "sha256": "01fbcfd28b752921ded95c40a711909851bcd005394b34b5f4f49a7eaa0a594c" + }, + "process.json": { + "bytes": 260, + "sha256": "b8559e934c97f9eba407b1ceceed637fc570a9a8ba9e3362b961824cb0344fcd" + }, + "result.json": { + "bytes": 3481, + "sha256": "2f007dfda469a75eaaf713577b394605af7d3d42fed2137d9e3ed632301c78d3" + }, + "stdout.log": { + "bytes": 293378, + "sha256": "8c611aa1671316570c79b079882400e3b710d3eff8fe04e37ec59f17071fa92c" + }, + "stderr.log": { + "bytes": 210, + "sha256": "504bdaa5c008c52a9462aeca71413f9933a4e9c6b0272715ba5ca916411781c1" + }, + "inputs.json": { + "bytes": 124276, + "sha256": "7f5b3de4d5bb70282e424fbe90211af2ac259965aef10b05438b46076467a767" + }, + "inputs.zip": { + "bytes": 2985964, + "sha256": "f681fb5ead73d5aba1d9a0f25ea29a96ccb430692630b64987b984623cd38148" + }, + "helper": { + "bytes": 3856, + "sha256": "230f1222f133edef76ffb9c09ed6eecf952fc326b04a0bbccb3f3f49df4c0c29" + } + }, + "capturingSources": { + "crates/oa-desktop/src/behavior/topology/layout_tests.rs": { + "bytes": 50414, + "sha256": "993d700d6590757fb329cab3029dd0202e71c2c2f852e13fe1228417b01d8fd9" + }, + "crates/oa-desktop/src/behavior/canvas_workspace/tests.rs": { + "bytes": 27368, + "sha256": "de13f0112b1a39fa03f32a9308dcbd30b235eef9ead877b440dde023c93bc5a3" + } + }, + "members": { + "capture-1/png-readback.json": { + "bytes": 1006, + "sha256": "4f397109e46512010fdb777c85abb6dc658fc9e26cb255d22165b0a1c6502eac" + }, + "capture-1/process-Oa-after-motion.json": { + "bytes": 2674, + "sha256": "17c55c7275634ac9a22b78a6eeab7464ceb0f0e389f02947d9ec96caaf18ecfe" + }, + "capture-1/process-Oa-after-motion.png": { + "bytes": 111782, + "sha256": "051c44a392eb23787b6e7ff28b0384336602eb2d6e166cca2859c7e44a8f5386" + }, + "capture-1/process-Oa-after-motion.rgba": { + "bytes": 5184000, + "sha256": "7726fa5de90ad7ec5b14e87883c40cace0007ece54279048c6f49c9386ce5d6d" + }, + "capture-1/process-Oa-before-press.json": { + "bytes": 2674, + "sha256": "6c1d80c1690d13a8fa2c21505322651c7436673368035fa7a054d0ee55ddbb5f" + }, + "capture-1/process-Oa-before-press.png": { + "bytes": 108986, + "sha256": "d9b5c2e0b7b50ea894986aa38c63b8d1559169974d6a93954dd0a69107b5740d" + }, + "capture-1/process-Oa-before-press.rgba": { + "bytes": 5184000, + "sha256": "399e7442f56d320a92d6d9beccd2f66a241e572adadcd733ba797aef97453a1e" + }, + "capture-1/process-Sa-after-motion.json": { + "bytes": 3186, + "sha256": "441d18d75dab872012f68020012840aa67a09b52a5946749ceea669e2839439e" + }, + "capture-1/process-Sa-after-motion.png": { + "bytes": 111760, + "sha256": "bc31d57fae268b6ad19c5b14aaa0860e14b7a5f80608a8896970f7ad82b041f0" + }, + "capture-1/process-Sa-after-motion.rgba": { + "bytes": 5184000, + "sha256": "82493c91aa5ac0e1f44a50f52496fe933104acd7992b2f9adbb7710ed3e85e29" + }, + "capture-1/process-Sa-before-press.json": { + "bytes": 3186, + "sha256": "b13fbdab939a9d34a8950ee89800f41c2082b5928ef5c8781dc813940ecf6df1" + }, + "capture-1/process-Sa-before-press.png": { + "bytes": 108966, + "sha256": "9b2a4a7cc355639e26e4e87cddf17b9ce859a00e5a80400da62b67ba27198a59" + }, + "capture-1/process-Sa-before-press.rgba": { + "bytes": 5184000, + "sha256": "30ede8974ba5d9227c109fd9a5c08c93119bdb897ad7f273e87a6602bc42bdd5" + }, + "encode-png.py": { + "bytes": 2181, + "sha256": "c05b2d9f2a02d72dba50422da733e36758bd6e2773e48d84174b72ec0a804b5e" + }, + "observations.md": { + "bytes": 1912, + "sha256": "11828e5467785990a11d462813b821f677cbff1c64dcd1ca8244a94fe01e2423" + } + } +} diff --git a/harness/multiselect-process-evidence-20260923/feedback/prepare.py b/harness/multiselect-process-evidence-20260923/feedback/prepare.py new file mode 100644 index 00000000..a2cff69b --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/feedback/prepare.py @@ -0,0 +1,70 @@ +"""Package the fixed, closed capture-1 pixels using an existing checks package.""" +from pathlib import Path +import argparse +import json +import subprocess +import zipfile +from verify import COMMIT, MEMBERS, SOURCES, OUTER, need, pin, checks_data, verify_data, verify_package + +HERE = Path(__file__).resolve().parent + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--root", type=Path, required=True) + parser.add_argument("--checks", type=Path, required=True) + parser.add_argument("--output", type=Path) + parser.add_argument("--check-only", action="store_true") + args = parser.parse_args() + need(args.check_only or args.output is not None, "--output or --check-only required") + if args.output: + need(not args.output.exists(), "fresh nonexistent output directory required") + checks = checks_data(args.checks) + gate, source = checks + # Compare every captured source byte to the named commit, not current worktree. + paths = sorted(source) + result = subprocess.run(["git", "cat-file", "--batch"], cwd=args.root, + input="".join(COMMIT + ":" + name + "\n" for name in paths).encode(), capture_output=True, check=True) + offset = 0 + for name in paths: + end = result.stdout.index(b"\n", offset) + header = result.stdout[offset:end].split() + need(len(header) == 3 and header[1] == b"blob", "missing commit blob: " + name) + size = int(header[2]) + data = result.stdout[end + 1:end + 1 + size] + need(data == source[name], "captured input differs from b153: " + name) + offset = end + 2 + size + need(offset == len(result.stdout), "exact Git batch readback") + folder = args.root / ".local/process-feedback-review" + need({p.relative_to(folder).as_posix() for p in (folder / "capture-1").rglob("*") if p.is_file()} == {name for name in MEMBERS if name.startswith("capture-1/")}, "exact captured file inventory") + payload = {} + for name in sorted(MEMBERS): + path = folder / name + need(not path.is_symlink() and not getattr(path, "is_junction", lambda: False)(), "linked input") + payload[name] = path.read_bytes() + manifest = {"schema": 1, "kind": "process-render-feedback", "sourceCommit": COMMIT, + "checksRun": "feedback-1", "checksPins": {name: pin(data) for name, data in gate.items()}, + "capturingSources": {name: pin(source[name]) for name in SOURCES}, + "members": {name: pin(data) for name, data in payload.items()}} + summary = verify_data(manifest, payload.__getitem__, checks) + if args.check_only: + print("PASS raw pixels, metadata and all 742 b153 source blobs:", summary) + return + out = args.output.resolve() + out.mkdir(parents=True, exist_ok=False) + for name in ("prepare.py", "verify.py", "README.md"): + (out / name).write_bytes((HERE / name).read_bytes()) + with zipfile.ZipFile(out / "evidence.zip", "x", compression=zipfile.ZIP_DEFLATED, compresslevel=9) as archive: + for name, data in payload.items(): + info = zipfile.ZipInfo(name, date_time=(2026, 9, 23, 0, 0, 0)) + info.compress_type = zipfile.ZIP_DEFLATED + info.external_attr = 0o100644 << 16 + archive.writestr(info, data) + (out / "manifest.json").write_text(json.dumps(manifest, indent=2) + "\n", encoding="utf-8") + (out / "files.json").write_text(json.dumps({name: pin((out / name).read_bytes()) for name in sorted(OUTER)}, indent=2) + "\n", encoding="utf-8") + need(verify_package(out, checks) == summary, "written archive readback") + print("PASS package readback and all 742 b153 source blobs:", out, summary) + + +if __name__ == "__main__": + main() diff --git a/harness/multiselect-process-evidence-20260923/feedback/verify.py b/harness/multiselect-process-evidence-20260923/feedback/verify.py new file mode 100644 index 00000000..2a3e884c --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/feedback/verify.py @@ -0,0 +1,142 @@ +"""Verify actual rendered feedback bytes against a separate Process checks package.""" +from pathlib import Path, PurePosixPath +from datetime import datetime +import argparse +import hashlib +import io +import json +import stat +import zipfile +from PIL import Image + +COMMIT = "b15345123a7feaf630ef24d45f591c76c6715778" +INPUT_SHA = "7f5b3de4d5bb70282e424fbe90211af2ac259965aef10b05438b46076467a767" +TEST = "production_process_multiselect_reverse_click_group_drop_has_one_history_step_and_stable_camera" +SOURCES = ("crates/oa-desktop/src/behavior/topology/layout_tests.rs", "crates/oa-desktop/src/behavior/canvas_workspace/tests.rs") +NAMES = [f"process-{layer}-{stage}" for layer in ("Oa", "Sa") for stage in ("before-press", "after-motion")] +MEMBERS = {"observations.md", "encode-png.py", "capture-1/png-readback.json"} | {f"capture-1/{name}.{ext}" for name in NAMES for ext in ("rgba", "png", "json")} +OUTER = {"prepare.py", "verify.py", "README.md", "manifest.json", "evidence.zip"} + + +def need(ok, message): + if not ok: + raise ValueError(message) + + +def pin(data): + return {"bytes": len(data), "sha256": hashlib.sha256(data).hexdigest()} + + +def safe(name): + return isinstance(name, str) and bool(name) and not PurePosixPath(name).is_absolute() and all(c not in name for c in ("\\", ":")) and all(ord(c) >= 32 for c in name) and all(p not in ("", ".", "..") for p in name.split("/")) + + +def parsed(data): + def unique(items): + result = {} + for key, value in items: + need(key not in result, "duplicate JSON key") + result[key] = value + return result + def constant(value): + raise ValueError("nonfinite JSON: " + value) + return json.loads(data, object_pairs_hook=unique, parse_constant=constant) + + +def inventory(archive, expected): + names = archive.namelist() + need(len(names) == len(set(names)) and set(names) == set(expected), "exact ZIP inventory") + for row in archive.infolist(): + need(safe(row.filename) and not row.is_dir() and not stat.S_ISLNK(row.external_attr >> 16), "unsafe ZIP entry") + need(row.file_size == expected[row.filename]["bytes"], "ZIP size") + + +def checks_data(root): + """Read referenced gate bytes, without importing or executing package code.""" + files = parsed((root / "files.json").read_bytes()) + need(set(files) == OUTER, "checks outer inventory") + for name, expected in files.items(): + need(pin((root / name).read_bytes()) == expected, "checks outer pin: " + name) + manifest = parsed((root / "manifest.json").read_bytes()) + need(manifest["schema"] == 1 and manifest["kind"] == "multiselect-cargo-gates", "checks format") + with zipfile.ZipFile(root / "evidence.zip") as archive: + inventory(archive, manifest["members"]) + def raw(logical): + member = manifest["logicalFiles"][logical] + data = archive.read(member) + need(pin(data) == manifest["members"][member], "referenced checks pin") + return data + prefix = "cargo/feedback-1/" + gate = {name: raw(prefix + name) for name in ("started.json", "process.json", "result.json", "stdout.log", "stderr.log", "inputs.json", "inputs.zip")} + spec = manifest["runs"]["feedback-1"] + gate["helper"] = raw(spec["helper"]) + result, start, process = [parsed(gate[name + ".json"]) for name in ("result", "started", "process")] + need(all(result.get(k) == v for k, v in start.items()) and result["command"] == process["command"], "feedback start/process/result") + times = [datetime.fromisoformat(t) for t in (start["start"], process["observed"], result["finish"])] + need(all(t.utcoffset() is not None for t in times) and times == sorted(times), "closed feedback chronology") + need(result["exitCode"] == 0 and result["inputsUnchanged"] is True and TEST in result["command"], "passed exact feedback gate") + need(result["environment"]["ARCADIA_RENDER_EVIDENCE_DIR"].replace("\\", "/") == result["cwd"].replace("\\", "/") + "/.local/process-feedback-review/capture-1", "actual output directory provenance") + for key, name in (("inputs", "inputs.json"), ("archive", "inputs.zip"), ("stdout", "stdout.log"), ("stderr", "stderr.log"), ("helper", "helper")): + need(result[key] == pin(gate[name]), "feedback receipt pin: " + key) + need(result["inputs"]["sha256"] == INPUT_SHA, "fixed b153 input map identity") + inputs = parsed(gate["inputs.json"]) + need(len(inputs) == result["inputCount"] == 742 and all(safe(name) for name in inputs), "captured source inventory") + with zipfile.ZipFile(io.BytesIO(gate["inputs.zip"])) as capsule: + inventory(capsule, inputs) + source = {name: capsule.read(name) for name in inputs} + need(all(pin(source[name]) == expected for name, expected in inputs.items()), "all captured source bytes") + need(("test behavior::topology::view::layout_tests::" + TEST + " ... ok").encode() in gate["stdout.log"], "actual test result") + return gate, source + + +def verify_data(manifest, read, checks): + need(manifest["schema"] == 1 and manifest["kind"] == "process-render-feedback" and manifest["sourceCommit"] == COMMIT, "feedback manifest") + need(set(manifest["members"]) == MEMBERS, "exact feedback files") + for name, expected in manifest["members"].items(): + need(pin(read(name)) == expected, "feedback pin: " + name) + gate, source = checks + need(manifest["checksRun"] == "feedback-1" and manifest["checksPins"] == {name: pin(data) for name, data in gate.items()}, "exact checks references") + need(manifest["capturingSources"] == {name: pin(source[name]) for name in SOURCES}, "capturing test and renderer source identity") + report = parsed(read("capture-1/png-readback.json")) + need(set(report["captures"]) == set(NAMES), "four readback records") + for layer in ("Oa", "Sa"): + previous = None + for stage in ("before-press", "after-motion"): + name = f"process-{layer}-{stage}" + metadata = parsed(read("capture-1/" + name + ".json")) + raw = read("capture-1/" + name + ".rgba") + need(metadata["layer"] == layer and metadata["stage"] == stage and metadata["format"] == "RGBA8", "capture identity") + need(metadata["width"] == 1440 and metadata["height"] == 900 and len(raw) == 1440 * 900 * 4, "exact original dimensions") + need(metadata["selectionCount"] == 2 and isinstance(metadata["selection"], str) and "history" not in metadata, "selection metadata; no invented history field") + bundle = metadata["source"] + need(safe(bundle["entry"]) and bundle["entry"] in bundle["files"] and all(safe(n) and isinstance(s, str) for n, s in bundle["files"].items()), "complete captured source bundle") + with Image.open(io.BytesIO(read("capture-1/" + name + ".png"))) as png: + need(png.format == "PNG" and png.size == (1440, 900) and png.convert("RGBA").tobytes() == raw, "decoded PNG equals actual raw RGBA") + expected = {"bytes": len(raw), "rgbaSha256": pin(raw)["sha256"], "width": 1440, "height": 900} + need(report["captures"][name] == expected, "original PNG readback receipt") + if previous: + for field in ("source", "selection", "selectionCount", "canvas", "camera", "scale", "width", "height"): + need(metadata[field] == previous[0][field], layer + " changed " + field + " before release") + need(raw != previous[1], "actual before/after pixel difference") + previous = metadata, raw + return {"captures": 4, "pngPixelsExact": True, "stableMetadataPairs": 2, "checksRun": "feedback-1", "nativeAcceptance": False} + + +def verify_package(root, checks): + files = parsed((root / "files.json").read_bytes()) + need(set(files) == OUTER, "feedback outer inventory") + for name, expected in files.items(): + need(pin((root / name).read_bytes()) == expected, "feedback outer pin") + manifest = parsed((root / "manifest.json").read_bytes()) + with zipfile.ZipFile(root / "evidence.zip") as archive: + inventory(archive, manifest["members"]) + return verify_data(manifest, archive.read, checks) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("package", nargs="?", type=Path, default=Path(__file__).resolve().parent) + parser.add_argument("--checks", type=Path, required=True, help="Process checks package containing closed feedback-1") + args = parser.parse_args() + print("PASS feedback byte proof:", verify_package(args.package, checks_data(args.checks))) + print("History is asserted by the captured test, not recorded in image metadata. No native acceptance claim.") diff --git a/harness/multiselect-process-evidence-20260923/native/README.md b/harness/multiselect-process-evidence-20260923/native/README.md new file mode 100644 index 00000000..922d5b54 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/native/README.md @@ -0,0 +1,48 @@ +# Portable Process native receipts + +Adapted from the State native evidence package. Python standard library only; +neither preparation nor verification runs any GUI, checker, archived helper or binary. + +From a checkout, validate explicit closed runs: + +```text +python -B prepare.py --root C:/ar-multiselect-9e8r6t --runs run-1 --check-only +python -B prepare.py --root C:/ar-multiselect-9e8r6t --runs run-1 run-2 --output FRESH_DIRECTORY +python -B FRESH_DIRECTORY/verify.py +``` + +The output directory must not exist. Run-2 is an example, usable only after its +finished.json exists. Explicit names prevent accidental capture of a live run. +No run is automatically accepted. Run-1 always retains `reviewStatus: failed`: +Back exposed the outer reference's editable Properties while highlighting the +qualified tile; reorder and history were not performed. Later runs are +`unreviewed` by this tool even if independently accepted in the parent's report. + +The archive retains every run file byte, exact prepared helpers (including +common.py and README.md), the actual capture-executed.js separately, complete +fixture/working/snapshot source, screenshots and accessibility JSON, logs, +normal-exit/closure flags, and history-bytes.json when present. The executed +capture function is preserved and package-pinned; the preparation receipt does +not authenticate it as the same bytes as the prepared capture.js template. + +Both GUI and checker build raw receipts, process/start metadata, logs, complete +input maps and source ZIPs are archived. Source maps/ZIPs are deduplicated by +exact hash. The historical checker source is also directly available. Helpers +must match recorded pins; use repeated `--helper PATH` for unavailable historical +versions. Never rewrite original capture helpers to make pins pass. + +Verification checks safe unique ZIP paths and JSON keys, all member hashes, +reference closure, lifecycle/time relationships, exact prepared helpers, +source-map equality, every source-capsule byte, executable receipt identity, +artifact membership in raw Cargo output, all snapshot reports, and literal +history bytes if present. Nonzero native/checker exits are retained as data; +missing closure or inconsistent receipts refuse packaging. A successful receipt +consistency check is not a claim that native interactions succeeded. + +The verifier does not authenticate authorship, independently replay the checker, +interpret screenshot contents, verify pixel dimensions, infer click/drag/focus +actions, prove one-step history, or establish usability/native acceptance. Input +hashes establish recorded consistency, not a reproducible-build proof. Binaries +are identified by build readback pins and native receipts, not included or run. +Independent parent review remains necessary. Failed checker output is preserved +verbatim and not required to be a positive JSON report. diff --git a/harness/multiselect-process-evidence-20260923/native/evidence.zip b/harness/multiselect-process-evidence-20260923/native/evidence.zip new file mode 100644 index 00000000..188a1f3f Binary files /dev/null and b/harness/multiselect-process-evidence-20260923/native/evidence.zip differ diff --git a/harness/multiselect-process-evidence-20260923/native/files.json b/harness/multiselect-process-evidence-20260923/native/files.json new file mode 100644 index 00000000..d7b59a6f --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/native/files.json @@ -0,0 +1,22 @@ +{ + "prepare.py": { + "bytes": 6712, + "sha256": "d6b265b0047e9e0f8d67b71a9208b0467cd12b0470690713bfce6e3ceba6e0d3" + }, + "verify.py": { + "bytes": 16518, + "sha256": "035e2e3eacdfb4205e6560fa85befbe65bbc2d20c5c8a42a11e4a965131ed0e4" + }, + "README.md": { + "bytes": 2857, + "sha256": "57d447f984fd8dccc1e93fdb7b493bbb9e76a081b2a0a2d28689da86c0d61ce4" + }, + "manifest.json": { + "bytes": 80265, + "sha256": "7bd4fa9247941d17939de989501b66c0d5d04f222424fb092c00f52f765b5bca" + }, + "evidence.zip": { + "bytes": 12355442, + "sha256": "e94c3e9f2fb644c8e415e09b75eaf973d9c2a93534ad9e41d69793a3c11e8f88" + } +} diff --git a/harness/multiselect-process-evidence-20260923/native/manifest.json b/harness/multiselect-process-evidence-20260923/native/manifest.json new file mode 100644 index 00000000..9cab9f6b --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/native/manifest.json @@ -0,0 +1,1768 @@ +{ + "schema": 1, + "kind": "process-multiselect-native", + "runs": { + "run-1": { + "originalRun": "C:/ar-multiselect-9e8r6t/.local/process-multiselect-native/run-1", + "reviewStatus": "failed", + "reviewNote": "Observed Back restored qualified highlight with outer-reference editable Properties; reorder and Undo/Redo/reopen history were not performed. Failed native workflow, despite three positive unchanged Project reports.", + "helpers": { + "capture.js": "helpers/5e64ff50d13b14b1ac75c4bcfc961b527d661a5729eedce789a472d2f92e0473.js", + "common.py": "helpers/81b21630a8235c8658839662bc7b56dda842b25fd816a3f812b9b7d385eaca96.py", + "history-bytes.py": "helpers/0c3786fd0c28f43153934dbfcc64b0fcaebded0787f5dda9347b89bb602ebd2f.py", + "native.py": "helpers/a0554aca92cfcd51f644ec54c46f1f10925d1fc63679d0a04b9a0e778021b600.py", + "README.md": "helpers/0a9ae83c48a4d04930f7ec8b7837500859096975e174cf44c0043af48e211a5c.md", + "snapshot.py": "helpers/e64783b09a615cc2354a0fda97700993c334a0855fd163562848774fbdaee425.py" + }, + "executedCapture": { + "bytes": 1255, + "sha256": "d2c9a3d2bcfe27e6ecd5077ef132862bcc3876f072c6abd787419e8d82de9642" + }, + "builds": { + "gui": { + "originalRelative": ".local/process-group-gates/windows-build-1/result.json", + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py", + "started.json": "builds/0a4d5ac9e798153c54c415d4bbddb98c5f725ba28a537e340714d610a3a97547/started.json", + "process.json": "builds/0a4d5ac9e798153c54c415d4bbddb98c5f725ba28a537e340714d610a3a97547/process.json", + "result.json": "builds/0a4d5ac9e798153c54c415d4bbddb98c5f725ba28a537e340714d610a3a97547/result.json", + "stdout.log": "builds/0a4d5ac9e798153c54c415d4bbddb98c5f725ba28a537e340714d610a3a97547/stdout.log", + "stderr.log": "builds/0a4d5ac9e798153c54c415d4bbddb98c5f725ba28a537e340714d610a3a97547/stderr.log", + "inputs.json": "inputs/7f5b3de4d5bb70282e424fbe90211af2ac259965aef10b05438b46076467a767.json", + "inputs.zip": "inputs/f681fb5ead73d5aba1d9a0f25ea29a96ccb430692630b64987b984623cd38148.zip" + }, + "checker": { + "originalRelative": ".local/process-group-gates/native-build-1/result.json", + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py", + "started.json": "builds/98f62963fc4a1d70ea49a2b3a8eb54dca7bc8c3e90edb26fef0b6af89f50e99b/started.json", + "process.json": "builds/98f62963fc4a1d70ea49a2b3a8eb54dca7bc8c3e90edb26fef0b6af89f50e99b/process.json", + "result.json": "builds/98f62963fc4a1d70ea49a2b3a8eb54dca7bc8c3e90edb26fef0b6af89f50e99b/result.json", + "stdout.log": "builds/98f62963fc4a1d70ea49a2b3a8eb54dca7bc8c3e90edb26fef0b6af89f50e99b/stdout.log", + "stderr.log": "builds/98f62963fc4a1d70ea49a2b3a8eb54dca7bc8c3e90edb26fef0b6af89f50e99b/stderr.log", + "inputs.json": "inputs/7f5b3de4d5bb70282e424fbe90211af2ac259965aef10b05438b46076467a767.json", + "inputs.zip": "inputs/f681fb5ead73d5aba1d9a0f25ea29a96ccb430692630b64987b984623cd38148.zip" + } + }, + "checkerSource": "checker-source/40f0914c2363cad48881dc651bfb9777bda42b0485368d18b78d43db42c29b56.rs" + }, + "run-3": { + "originalRun": "C:/ar-multiselect-9e8r6t/.local/process-multiselect-native/run-3", + "reviewStatus": "unreviewed", + "reviewNote": "Packaging consistency does not decide native acceptance. Consult the independent parent review.", + "helpers": { + "capture.js": "helpers/5e64ff50d13b14b1ac75c4bcfc961b527d661a5729eedce789a472d2f92e0473.js", + "common.py": "helpers/81b21630a8235c8658839662bc7b56dda842b25fd816a3f812b9b7d385eaca96.py", + "history-bytes.py": "helpers/0c3786fd0c28f43153934dbfcc64b0fcaebded0787f5dda9347b89bb602ebd2f.py", + "native.py": "helpers/a0554aca92cfcd51f644ec54c46f1f10925d1fc63679d0a04b9a0e778021b600.py", + "README.md": "helpers/0a9ae83c48a4d04930f7ec8b7837500859096975e174cf44c0043af48e211a5c.md", + "snapshot.py": "helpers/e64783b09a615cc2354a0fda97700993c334a0855fd163562848774fbdaee425.py" + }, + "executedCapture": { + "bytes": 1255, + "sha256": "d2c9a3d2bcfe27e6ecd5077ef132862bcc3876f072c6abd787419e8d82de9642" + }, + "builds": { + "gui": { + "originalRelative": ".local/process-group-gates/windows-build-2/result.json", + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py", + "started.json": "builds/8082f00a7a2ecc6ce81cb2ac3d58ad0a115fdb598fbbed3ca521e00e6b57bbba/started.json", + "process.json": "builds/8082f00a7a2ecc6ce81cb2ac3d58ad0a115fdb598fbbed3ca521e00e6b57bbba/process.json", + "result.json": "builds/8082f00a7a2ecc6ce81cb2ac3d58ad0a115fdb598fbbed3ca521e00e6b57bbba/result.json", + "stdout.log": "builds/8082f00a7a2ecc6ce81cb2ac3d58ad0a115fdb598fbbed3ca521e00e6b57bbba/stdout.log", + "stderr.log": "builds/8082f00a7a2ecc6ce81cb2ac3d58ad0a115fdb598fbbed3ca521e00e6b57bbba/stderr.log", + "inputs.json": "inputs/f3fd180af294e0797f9dfdbff647274de30a907b685a4fe1a2b58027bfe7da95.json", + "inputs.zip": "inputs/2dcc12ec457a6df0997c11c2fed3d5085b7033c9e100ec7d29b01af254d693cc.zip" + }, + "checker": { + "originalRelative": ".local/process-group-gates/native-build-2/result.json", + "helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py", + "started.json": "builds/1df7538acda0f38b36f91d0293a7f74a5f4d308797f35b1d4dabaa7155aae23b/started.json", + "process.json": "builds/1df7538acda0f38b36f91d0293a7f74a5f4d308797f35b1d4dabaa7155aae23b/process.json", + "result.json": "builds/1df7538acda0f38b36f91d0293a7f74a5f4d308797f35b1d4dabaa7155aae23b/result.json", + "stdout.log": "builds/1df7538acda0f38b36f91d0293a7f74a5f4d308797f35b1d4dabaa7155aae23b/stdout.log", + "stderr.log": "builds/1df7538acda0f38b36f91d0293a7f74a5f4d308797f35b1d4dabaa7155aae23b/stderr.log", + "inputs.json": "inputs/f3fd180af294e0797f9dfdbff647274de30a907b685a4fe1a2b58027bfe7da95.json", + "inputs.zip": "inputs/2dcc12ec457a6df0997c11c2fed3d5085b7033c9e100ec7d29b01af254d693cc.zip" + } + }, + "checkerSource": "checker-source/7ce7dc9dedb22140a8c226252bfcb5861f581c605336ec442929c3ea42f26562.rs" + } + }, + "members": { + "builds/0a4d5ac9e798153c54c415d4bbddb98c5f725ba28a537e340714d610a3a97547/process.json": { + "bytes": 137, + "sha256": "2d45f19802388b96fd734b034b5b6da3f9f7a04e8666b9c2eefa4c43e97e5031" + }, + "builds/0a4d5ac9e798153c54c415d4bbddb98c5f725ba28a537e340714d610a3a97547/result.json": { + "bytes": 3193, + "sha256": "0a4d5ac9e798153c54c415d4bbddb98c5f725ba28a537e340714d610a3a97547" + }, + "builds/0a4d5ac9e798153c54c415d4bbddb98c5f725ba28a537e340714d610a3a97547/started.json": { + "bytes": 1504, + "sha256": "acf7cd9f6ec1418a1cd9eaf99940851edc4889ee206b26a6a092dd7ec9d77b3f" + }, + "builds/0a4d5ac9e798153c54c415d4bbddb98c5f725ba28a537e340714d610a3a97547/stderr.log": { + "bytes": 137, + "sha256": "a5f6f3ceebc0811634cb745e93312a4103cc4c3caae0f217b6c97929a25e383e" + }, + "builds/0a4d5ac9e798153c54c415d4bbddb98c5f725ba28a537e340714d610a3a97547/stdout.log": { + "bytes": 284179, + "sha256": "c8a0b1cde5523aceddb7fe9f266b317af923a86c1e9ab73bc4ce03ad2e425f3c" + }, + "builds/1df7538acda0f38b36f91d0293a7f74a5f4d308797f35b1d4dabaa7155aae23b/process.json": { + "bytes": 177, + "sha256": "654d7094bb258d53a981e23ee8a65dfe3c15bd5afd729ffcb5f9ab3d9bc7266b" + }, + "builds/1df7538acda0f38b36f91d0293a7f74a5f4d308797f35b1d4dabaa7155aae23b/result.json": { + "bytes": 3322, + "sha256": "1df7538acda0f38b36f91d0293a7f74a5f4d308797f35b1d4dabaa7155aae23b" + }, + "builds/1df7538acda0f38b36f91d0293a7f74a5f4d308797f35b1d4dabaa7155aae23b/started.json": { + "bytes": 1554, + "sha256": "c035f4568abe654969be40fbbc1af51d56adf5cf92e5242ba506c18ac84ce635" + }, + "builds/1df7538acda0f38b36f91d0293a7f74a5f4d308797f35b1d4dabaa7155aae23b/stderr.log": { + "bytes": 130, + "sha256": "2dc3f9bcc90f1046481f83482b478e3debd0d0784d137bc463cfd2813ebc0693" + }, + "builds/1df7538acda0f38b36f91d0293a7f74a5f4d308797f35b1d4dabaa7155aae23b/stdout.log": { + "bytes": 41732, + "sha256": "90d105724d4c77826bea5a3686fd23951d2a3f23ff221d326c753ba248f2ff90" + }, + "builds/8082f00a7a2ecc6ce81cb2ac3d58ad0a115fdb598fbbed3ca521e00e6b57bbba/process.json": { + "bytes": 137, + "sha256": "3435c171165966bc69284a1557a1b032afe6214485e1cf1931b8ea23113ab1e7" + }, + "builds/8082f00a7a2ecc6ce81cb2ac3d58ad0a115fdb598fbbed3ca521e00e6b57bbba/result.json": { + "bytes": 3193, + "sha256": "8082f00a7a2ecc6ce81cb2ac3d58ad0a115fdb598fbbed3ca521e00e6b57bbba" + }, + "builds/8082f00a7a2ecc6ce81cb2ac3d58ad0a115fdb598fbbed3ca521e00e6b57bbba/started.json": { + "bytes": 1504, + "sha256": "c44c7502122f5fc17e96476b9240cf8a590207eaab06cdcf38c0a6c98a2fca34" + }, + "builds/8082f00a7a2ecc6ce81cb2ac3d58ad0a115fdb598fbbed3ca521e00e6b57bbba/stderr.log": { + "bytes": 137, + "sha256": "acead8fc321ee49e00eadc746fbb2454442e48c93f4c001f8f7a00e747eb8bf6" + }, + "builds/8082f00a7a2ecc6ce81cb2ac3d58ad0a115fdb598fbbed3ca521e00e6b57bbba/stdout.log": { + "bytes": 284179, + "sha256": "0f4030afef0af42ad17b8c8cfc9b5b0051bb5fc79edbf8f589087a06734760cc" + }, + "builds/98f62963fc4a1d70ea49a2b3a8eb54dca7bc8c3e90edb26fef0b6af89f50e99b/process.json": { + "bytes": 177, + "sha256": "96b067ef1a49f4e908452798214fa1691a6f58e47923ce338c182dd4135e7b12" + }, + "builds/98f62963fc4a1d70ea49a2b3a8eb54dca7bc8c3e90edb26fef0b6af89f50e99b/result.json": { + "bytes": 3321, + "sha256": "98f62963fc4a1d70ea49a2b3a8eb54dca7bc8c3e90edb26fef0b6af89f50e99b" + }, + "builds/98f62963fc4a1d70ea49a2b3a8eb54dca7bc8c3e90edb26fef0b6af89f50e99b/started.json": { + "bytes": 1554, + "sha256": "c92f92b1de9d0fef6e19a1365fd18782f9310cdbfa68d9b66ede3d179318c47e" + }, + "builds/98f62963fc4a1d70ea49a2b3a8eb54dca7bc8c3e90edb26fef0b6af89f50e99b/stderr.log": { + "bytes": 130, + "sha256": "2dc3f9bcc90f1046481f83482b478e3debd0d0784d137bc463cfd2813ebc0693" + }, + "builds/98f62963fc4a1d70ea49a2b3a8eb54dca7bc8c3e90edb26fef0b6af89f50e99b/stdout.log": { + "bytes": 41732, + "sha256": "582fef43a9b92e91df8dc3fc49f73e8d56e378a5451958ded376f90c7309b55e" + }, + "checker-source/40f0914c2363cad48881dc651bfb9777bda42b0485368d18b78d43db42c29b56.rs": { + "bytes": 18679, + "sha256": "40f0914c2363cad48881dc651bfb9777bda42b0485368d18b78d43db42c29b56" + }, + "checker-source/7ce7dc9dedb22140a8c226252bfcb5861f581c605336ec442929c3ea42f26562.rs": { + "bytes": 18986, + "sha256": "7ce7dc9dedb22140a8c226252bfcb5861f581c605336ec442929c3ea42f26562" + }, + "helpers/0a9ae83c48a4d04930f7ec8b7837500859096975e174cf44c0043af48e211a5c.md": { + "bytes": 7599, + "sha256": "0a9ae83c48a4d04930f7ec8b7837500859096975e174cf44c0043af48e211a5c" + }, + "helpers/0c3786fd0c28f43153934dbfcc64b0fcaebded0787f5dda9347b89bb602ebd2f.py": { + "bytes": 3998, + "sha256": "0c3786fd0c28f43153934dbfcc64b0fcaebded0787f5dda9347b89bb602ebd2f" + }, + "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py": { + "bytes": 3827, + "sha256": "1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20" + }, + "helpers/5e64ff50d13b14b1ac75c4bcfc961b527d661a5729eedce789a472d2f92e0473.js": { + "bytes": 1624, + "sha256": "5e64ff50d13b14b1ac75c4bcfc961b527d661a5729eedce789a472d2f92e0473" + }, + "helpers/81b21630a8235c8658839662bc7b56dda842b25fd816a3f812b9b7d385eaca96.py": { + "bytes": 2906, + "sha256": "81b21630a8235c8658839662bc7b56dda842b25fd816a3f812b9b7d385eaca96" + }, + "helpers/a0554aca92cfcd51f644ec54c46f1f10925d1fc63679d0a04b9a0e778021b600.py": { + "bytes": 4247, + "sha256": "a0554aca92cfcd51f644ec54c46f1f10925d1fc63679d0a04b9a0e778021b600" + }, + "helpers/e64783b09a615cc2354a0fda97700993c334a0855fd163562848774fbdaee425.py": { + "bytes": 2597, + "sha256": "e64783b09a615cc2354a0fda97700993c334a0855fd163562848774fbdaee425" + }, + "inputs/2dcc12ec457a6df0997c11c2fed3d5085b7033c9e100ec7d29b01af254d693cc.zip": { + "bytes": 2987614, + "sha256": "2dcc12ec457a6df0997c11c2fed3d5085b7033c9e100ec7d29b01af254d693cc" + }, + "inputs/7f5b3de4d5bb70282e424fbe90211af2ac259965aef10b05438b46076467a767.json": { + "bytes": 124276, + "sha256": "7f5b3de4d5bb70282e424fbe90211af2ac259965aef10b05438b46076467a767" + }, + "inputs/f3fd180af294e0797f9dfdbff647274de30a907b685a4fe1a2b58027bfe7da95.json": { + "bytes": 124276, + "sha256": "f3fd180af294e0797f9dfdbff647274de30a907b685a4fe1a2b58027bfe7da95" + }, + "inputs/f681fb5ead73d5aba1d9a0f25ea29a96ccb430692630b64987b984623cd38148.zip": { + "bytes": 2985964, + "sha256": "f681fb5ead73d5aba1d9a0f25ea29a96ccb430692630b64987b984623cd38148" + }, + "runs/run-1/raw/01-start-0.jpg": { + "bytes": 116617, + "sha256": "849e79e7035fbaa57d48afbdccd6c9634bc2ab1024eda7606ef5b320227e7a07" + }, + "runs/run-1/raw/01-start.json": { + "bytes": 919, + "sha256": "0cefa14b6b7dcc76bc069ccdf8b378cf076e96961f143907af9e848a9a806282" + }, + "runs/run-1/raw/02-open-dialog-0.jpg": { + "bytes": 115087, + "sha256": "4b466f7086aca8823f717bf6123633d71bbd86eee52edc0ada3919c9c6db685f" + }, + "runs/run-1/raw/02-open-dialog.json": { + "bytes": 925, + "sha256": "d5b254f098f662e2816f5787f825b1d1088b5baadf07745b58bda30ffa2ca314" + }, + "runs/run-1/raw/03-file-dialog-0.jpg": { + "bytes": 674, + "sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b" + }, + "runs/run-1/raw/03-file-dialog-1.jpg": { + "bytes": 58361, + "sha256": "086cc578e3d43c717b68894edbb77b51c678fb82d3eb3eb6d4319688144c5f54" + }, + "runs/run-1/raw/03-file-dialog.json": { + "bytes": 5635, + "sha256": "c73848096ab9159f1cc07110a82481276b7176aa90bc14e5913b16cfe525c962" + }, + "runs/run-1/raw/04-file-focus-0.jpg": { + "bytes": 674, + "sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b" + }, + "runs/run-1/raw/04-file-focus-1.jpg": { + "bytes": 58731, + "sha256": "dc937c1ae2093dcc60b0ddfb76c45f47c206311ddffaf377637bf91f75eb2b32" + }, + "runs/run-1/raw/04-file-focus.json": { + "bytes": 5633, + "sha256": "c6f8076a5659a56cf9664892aff69286cb51c0c304228debac8916a940968552" + }, + "runs/run-1/raw/06-dialog-reobserve-0.jpg": { + "bytes": 674, + "sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b" + }, + "runs/run-1/raw/06-dialog-reobserve-1.jpg": { + "bytes": 58538, + "sha256": "3ea648cdac8c0cfb7a254873402f30977a6b7390ac2bbf7c0f7f7ad1804582ac" + }, + "runs/run-1/raw/06-dialog-reobserve.json": { + "bytes": 5645, + "sha256": "ba6b391bbc2150cf8dee8e147fac907e5e8e98abf93d430f0fd8cea5a432bf69" + }, + "runs/run-1/raw/07-file-path-typed-0.jpg": { + "bytes": 674, + "sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b" + }, + "runs/run-1/raw/07-file-path-typed-1.jpg": { + "bytes": 62035, + "sha256": "500ebf0e521e09bdcbaf38a0f6dba5f476bec3bb089e7c6d23af83fa5a621ea7" + }, + "runs/run-1/raw/07-file-path-typed.json": { + "bytes": 5643, + "sha256": "2f7f78bb515b1fbcdb2e41f2265ac6d270624cebdcdca0b8f73a29041fcf1c96" + }, + "runs/run-1/raw/08-loaded-0.jpg": { + "bytes": 103776, + "sha256": "0bea954479204da6dba6d44d906b1448465c59ddd7b0d5a9b3e1f9e830a7f867" + }, + "runs/run-1/raw/08-loaded.json": { + "bytes": 936, + "sha256": "dd4e46eff1e112c1aebc6dfccce525de40a270814e0bdbf5e6c4ea1ad9a80ab4" + }, + "runs/run-1/raw/09-behavior-0.jpg": { + "bytes": 117500, + "sha256": "a31940c2c191795e3a461c2436ca83e613f8f4705de8e4987cdad7009f58f1bd" + }, + "runs/run-1/raw/09-behavior.json": { + "bytes": 942, + "sha256": "6265b18fd7427f4eff32451e17bc2b048e6f03cc202d1beb9216f64dee6bac59" + }, + "runs/run-1/raw/10-oa-baseline-0.jpg": { + "bytes": 130042, + "sha256": "1588e0dc3b9418d9bd190a9096e562b24dd110d328e5dd564b898ee826716e3b" + }, + "runs/run-1/raw/10-oa-baseline.json": { + "bytes": 945, + "sha256": "b99a3098c3dda171120da4eec5931fcc78751046ddb15a8daa13958ee1e3df97" + }, + "runs/run-1/raw/11-baseline-saved-0.jpg": { + "bytes": 128248, + "sha256": "a05a81cc0a75fb69d5d9d9488a58d7afca7b48d536e40cc86faeaa69e156a7ec" + }, + "runs/run-1/raw/11-baseline-saved.json": { + "bytes": 948, + "sha256": "be476955f0ee0d007d664943f9c1caf3a567857bb992c99a08e33b2a190ce9ec" + }, + "runs/run-1/raw/12-card-selected-0.jpg": { + "bytes": 136377, + "sha256": "b0884589f99d59c3bfc1a82c0d7d3eb1dcc0cd28ac19093fd18d5bbd1f61c150" + }, + "runs/run-1/raw/12-card-selected.json": { + "bytes": 947, + "sha256": "e2e22eb351a2bca56be890309d54085c40c1aa8d0c058a22d35e205102e63f34" + }, + "runs/run-1/raw/13-link-menu-0.jpg": { + "bytes": 146294, + "sha256": "94c1deb6e124c3ddfb9e159e8cc7d13680b1c96fdb4cc64086194ba8518ab269" + }, + "runs/run-1/raw/13-link-menu.json": { + "bytes": 943, + "sha256": "aa5164a0dce191b263dfb79b591568d18912f2278daf73758a3b29100cb1a48b" + }, + "runs/run-1/raw/14-mixed-selection-0.jpg": { + "bytes": 130466, + "sha256": "c7d8c9df6ae30107ef973ae9be79577087784413814170cb46117f020f541dab" + }, + "runs/run-1/raw/14-mixed-selection.json": { + "bytes": 949, + "sha256": "3f025b01f203adf43311470576c9feafe5c8cd54ca6d387782a07ad74e1246ec" + }, + "runs/run-1/raw/15-mixed-drag-refused-0.jpg": { + "bytes": 133486, + "sha256": "8bb640d8a2ce948334dc8d4c69d5fffa035ad7a7faaaa9a38f9aadfc3bece436" + }, + "runs/run-1/raw/15-mixed-drag-refused.json": { + "bytes": 952, + "sha256": "cc7ca734f8127f1c42a64466c79103489a0bcc00475bc2537cb1cedcb55d7dc5" + }, + "runs/run-1/raw/16-mixed-saved-0.jpg": { + "bytes": 130608, + "sha256": "14dc6e368107c867cb1e3d23621d3e205d0f14bbf9c8813c2c4c5e86a249488a" + }, + "runs/run-1/raw/16-mixed-saved.json": { + "bytes": 945, + "sha256": "f547320564bbb624b3b1ad883e56a0aa3a687172580f0fbea432cac751613e95" + }, + "runs/run-1/raw/17-stationary-collapse-0.jpg": { + "bytes": 136903, + "sha256": "8e6abf6582e4d8294062e84aafffcf20c5a0642108e127e590075b1031c7c414" + }, + "runs/run-1/raw/17-stationary-collapse.json": { + "bytes": 953, + "sha256": "1140c4fd7d6ec91e99d313b5ea6e8063c113faac447ddce2dfae0421c31beea3" + }, + "runs/run-1/raw/18-qualified-owner-0.jpg": { + "bytes": 127598, + "sha256": "253432217c38e6b8a8d8318b910bb6f3c0be50c683c004fbbe1d33b331e91f54" + }, + "runs/run-1/raw/18-qualified-owner.json": { + "bytes": 949, + "sha256": "0236413d5c812a3fda8114a61bf0a24c93fc5d57b1c3a7ae3998af5e8f24a8b5" + }, + "runs/run-1/raw/19-qualified-primary-0.jpg": { + "bytes": 111178, + "sha256": "081c3b7aa547a939f5a52f65236adef343b74bb016ec462ffb81d2f68bdd9b13" + }, + "runs/run-1/raw/19-qualified-primary.json": { + "bytes": 951, + "sha256": "d3bb8dcb8dab9014a67b830013e14f71c4aa5b7c3c0ee7db64836bb8889b6d5d" + }, + "runs/run-1/raw/20-second-path-menu-0.jpg": { + "bytes": 116250, + "sha256": "8d230ca47a52b1c299374f41fd6cfe7b4f0af57c093eff6e6d17e0026b9cdf48" + }, + "runs/run-1/raw/20-second-path-menu.json": { + "bytes": 950, + "sha256": "ba05e0d700f1191415789f745ca8838fcdf1eccf1ca253da265e71cd626cac7d" + }, + "runs/run-1/raw/21-two-qualified-paths-0.jpg": { + "bytes": 110956, + "sha256": "ff60db624f81b657f30d79e4e3ee6ed09e84dd2002380576681de6374ddaef68" + }, + "runs/run-1/raw/21-two-qualified-paths.json": { + "bytes": 953, + "sha256": "72d9ea65efecc018971c6bb9819c210c24275b5b89ae1992faeec2bd6b3c8627" + }, + "runs/run-1/raw/22-qualified-drag-refused-0.jpg": { + "bytes": 113089, + "sha256": "86f9575f88b758d77d51bab120eca0a2ca3bfbf7a40de4a64f0a835949eed559" + }, + "runs/run-1/raw/22-qualified-drag-refused.json": { + "bytes": 956, + "sha256": "c760a3ebde00efe6bac104afe081a3cb57f9efb4cf209dcc13b72cb15c83f39f" + }, + "runs/run-1/raw/23-qualified-delete-refused-0.jpg": { + "bytes": 116503, + "sha256": "a4398946a8e6814e40ec68603b1d1c1250c8da26ae89734bcd25c7dd5f4b8640" + }, + "runs/run-1/raw/23-qualified-delete-refused.json": { + "bytes": 958, + "sha256": "82f6af3884baaf16b08a083a45468924e467e0dab2c9ae4f1a81c22d9f2c7527" + }, + "runs/run-1/raw/24-open-definition-0.jpg": { + "bytes": 130027, + "sha256": "5ede19d0f58d9e1fb9f51ef3f2154157bca165118ca4f41cc0c3689e058f5b72" + }, + "runs/run-1/raw/24-open-definition.json": { + "bytes": 949, + "sha256": "94771daa6317004f9bb342a8432020528c165e135f3b215fb68531eb8ba723ff" + }, + "runs/run-1/raw/25-definition-details-0.jpg": { + "bytes": 150336, + "sha256": "e678e09a1ff20ded6d307320c973a8c54c059b978fa904d6d74543405a84bee4" + }, + "runs/run-1/raw/25-definition-details.json": { + "bytes": 952, + "sha256": "613630ef997219da31be81762f5d82b69dc311944db93a06fbab7179b7bf602b" + }, + "runs/run-1/raw/26-back-to-caller-0.jpg": { + "bytes": 166409, + "sha256": "a74368cc8ce4ad3ffb397b8ad3fc88349220635320bfe7458f29a980e033dcfe" + }, + "runs/run-1/raw/26-back-to-caller.json": { + "bytes": 948, + "sha256": "e4d7a282effdfdec5bf1f2ed47892ba1237090cbcb9b8b9d345229dc512f1b4b" + }, + "runs/run-1/raw/27-qualified-saved-before-fix-0.jpg": { + "bytes": 161076, + "sha256": "d554d634cec37b1d6bdbd0f1c3c6b51ae4c51b0516cb481477ace038d49e3ca7" + }, + "runs/run-1/raw/27-qualified-saved-before-fix.json": { + "bytes": 960, + "sha256": "38a4d0cc06b3874140bc7d51f49ca05a8b66ff0d171ef522dd0c43ffe8911a1f" + }, + "runs/run-1/raw/app.stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "runs/run-1/raw/app.stdout.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "runs/run-1/raw/capture-executed.js": { + "bytes": 1255, + "sha256": "d2c9a3d2bcfe27e6ecd5077ef132862bcc3876f072c6abd787419e8d82de9642" + }, + "runs/run-1/raw/finished.json": { + "bytes": 380, + "sha256": "cbdf0f3a5831bd52e60cc3cd555c55976648a173ac83df20fa411badc1672e1e" + }, + "runs/run-1/raw/fixture/baseline.json": { + "bytes": 14627, + "sha256": "5cd1befea8666c5a686c22ab4bbbbf4d34523cd031b236d226371cbc19478683" + }, + "runs/run-1/raw/fixture/manifest.json": { + "bytes": 2416, + "sha256": "9ca15e323db26db695037c9d84afcffaecc8b1920026aeaa16336cb9df5d2a46" + }, + "runs/run-1/raw/fixture/source/oa/activities/activity_oa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "7ebf9516f9f016139a4504649cd41e327b59b6798581bf9f65af2d30cfcd5a0e" + }, + "runs/run-1/raw/fixture/source/oa/activities/activity_oa_shared_work.arcadia": { + "bytes": 159, + "sha256": "56139bf120e41b752d50aa85955b96eddc0c7e573fe493248deed1b49933a95d" + }, + "runs/run-1/raw/fixture/source/oa/behavior/process_oa_process.arcadia": { + "bytes": 1737, + "sha256": "2f39cdf59c59bf56099ce5f07e339fa3f4fd0c8e964545f19c995a2341aba2e0" + }, + "runs/run-1/raw/fixture/source/oa/behavior/process_reusable.arcadia": { + "bytes": 429, + "sha256": "21d216c39d0990a3ebc2d40b02d00c1cc126185def1fb5342c3205ca890ae04a" + }, + "runs/run-1/raw/fixture/source/oa/behavior/process_reuse_trial.arcadia": { + "bytes": 730, + "sha256": "2384e5b81dc64ec229a0b1664333ee48a8a251b7ac8138584215a8611472fe2a" + }, + "runs/run-1/raw/fixture/source/project.arcadia": { + "bytes": 753, + "sha256": "a942705a988f5bfa35f2bdae273bce3fc6dd9afff8267a96483df598dd5a13a6" + }, + "runs/run-1/raw/fixture/source/sa/behavior/process_sa_chain.arcadia": { + "bytes": 1734, + "sha256": "b6aa1d90a113dacffdbc980f1fa6c6b2b85050921622c57492c80a1602e11a16" + }, + "runs/run-1/raw/fixture/source/sa/functions/function_sa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "95ee9f35a41a4580c51bbf56b1b00717969adb77a0c05a1f30740c4c23788a02" + }, + "runs/run-1/raw/fixture/source/sa/functions/function_sa_shared_work.arcadia": { + "bytes": 159, + "sha256": "0117bcfe32321b63d6b05b745f67aa57a565026eed68eb5a98300b7265941e9a" + }, + "runs/run-1/raw/fixture/source/traceability.arcadia": { + "bytes": 528, + "sha256": "c5eaf8dc3c09dc56129a73da9630bb3fda99a0cfc9a8fa266e3a6ee32f53deb6" + }, + "runs/run-1/raw/generation.json": { + "bytes": 1244, + "sha256": "58983ff0fc371e91ab5ed90e4a7ebffe9289685591aae384d5676490619304ca" + }, + "runs/run-1/raw/generation.stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "runs/run-1/raw/generation.stdout.log": { + "bytes": 112, + "sha256": "55f118f32a85b568edcc94bb6d91deac8785c78ad35aa3c4dc89874cc68b9b2e" + }, + "runs/run-1/raw/observations.md": { + "bytes": 1964, + "sha256": "9e16dd6d146262cb7db7c2bccfa55d7d40209847830babc4ae616df3098d323d" + }, + "runs/run-1/raw/prepared.json": { + "bytes": 4601, + "sha256": "50d53171d19f1f3cdbb932ed8b71b7317c091f9778dca8c18b0974a6f80ebeb2" + }, + "runs/run-1/raw/snapshots/baseline/result.json": { + "bytes": 3489, + "sha256": "538686103b99abd01d2784a2d2738bd8e26803eb69f1c7ff47f416332f047f2c" + }, + "runs/run-1/raw/snapshots/baseline/source/oa/activities/activity_oa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "7ebf9516f9f016139a4504649cd41e327b59b6798581bf9f65af2d30cfcd5a0e" + }, + "runs/run-1/raw/snapshots/baseline/source/oa/activities/activity_oa_shared_work.arcadia": { + "bytes": 159, + "sha256": "56139bf120e41b752d50aa85955b96eddc0c7e573fe493248deed1b49933a95d" + }, + "runs/run-1/raw/snapshots/baseline/source/oa/behavior/process_oa_process.arcadia": { + "bytes": 1737, + "sha256": "2f39cdf59c59bf56099ce5f07e339fa3f4fd0c8e964545f19c995a2341aba2e0" + }, + "runs/run-1/raw/snapshots/baseline/source/oa/behavior/process_reusable.arcadia": { + "bytes": 429, + "sha256": "21d216c39d0990a3ebc2d40b02d00c1cc126185def1fb5342c3205ca890ae04a" + }, + "runs/run-1/raw/snapshots/baseline/source/oa/behavior/process_reuse_trial.arcadia": { + "bytes": 730, + "sha256": "2384e5b81dc64ec229a0b1664333ee48a8a251b7ac8138584215a8611472fe2a" + }, + "runs/run-1/raw/snapshots/baseline/source/project.arcadia": { + "bytes": 753, + "sha256": "a942705a988f5bfa35f2bdae273bce3fc6dd9afff8267a96483df598dd5a13a6" + }, + "runs/run-1/raw/snapshots/baseline/source/sa/behavior/process_sa_chain.arcadia": { + "bytes": 1734, + "sha256": "b6aa1d90a113dacffdbc980f1fa6c6b2b85050921622c57492c80a1602e11a16" + }, + "runs/run-1/raw/snapshots/baseline/source/sa/functions/function_sa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "95ee9f35a41a4580c51bbf56b1b00717969adb77a0c05a1f30740c4c23788a02" + }, + "runs/run-1/raw/snapshots/baseline/source/sa/functions/function_sa_shared_work.arcadia": { + "bytes": 159, + "sha256": "0117bcfe32321b63d6b05b745f67aa57a565026eed68eb5a98300b7265941e9a" + }, + "runs/run-1/raw/snapshots/baseline/source/traceability.arcadia": { + "bytes": 528, + "sha256": "c5eaf8dc3c09dc56129a73da9630bb3fda99a0cfc9a8fa266e3a6ee32f53deb6" + }, + "runs/run-1/raw/snapshots/baseline/started.json": { + "bytes": 3071, + "sha256": "e50c6a04290b17af67591430169a8144db4cc663fd7930015e0ea4412bb6746b" + }, + "runs/run-1/raw/snapshots/baseline/stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "runs/run-1/raw/snapshots/baseline/stdout.log": { + "bytes": 427, + "sha256": "0b184cbe35709f4e186769d6127927b387765573d2118b6e31018bbc59c38faa" + }, + "runs/run-1/raw/snapshots/mixed-refusal/result.json": { + "bytes": 3494, + "sha256": "4b400c81b9ddaeaf9ff6869fbbe25b92a2b6e6317e071e7232a6d91e501ef871" + }, + "runs/run-1/raw/snapshots/mixed-refusal/source/oa/activities/activity_oa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "7ebf9516f9f016139a4504649cd41e327b59b6798581bf9f65af2d30cfcd5a0e" + }, + "runs/run-1/raw/snapshots/mixed-refusal/source/oa/activities/activity_oa_shared_work.arcadia": { + "bytes": 159, + "sha256": "56139bf120e41b752d50aa85955b96eddc0c7e573fe493248deed1b49933a95d" + }, + "runs/run-1/raw/snapshots/mixed-refusal/source/oa/behavior/process_oa_process.arcadia": { + "bytes": 1737, + "sha256": "2f39cdf59c59bf56099ce5f07e339fa3f4fd0c8e964545f19c995a2341aba2e0" + }, + "runs/run-1/raw/snapshots/mixed-refusal/source/oa/behavior/process_reusable.arcadia": { + "bytes": 429, + "sha256": "21d216c39d0990a3ebc2d40b02d00c1cc126185def1fb5342c3205ca890ae04a" + }, + "runs/run-1/raw/snapshots/mixed-refusal/source/oa/behavior/process_reuse_trial.arcadia": { + "bytes": 730, + "sha256": "2384e5b81dc64ec229a0b1664333ee48a8a251b7ac8138584215a8611472fe2a" + }, + "runs/run-1/raw/snapshots/mixed-refusal/source/project.arcadia": { + "bytes": 753, + "sha256": "a942705a988f5bfa35f2bdae273bce3fc6dd9afff8267a96483df598dd5a13a6" + }, + "runs/run-1/raw/snapshots/mixed-refusal/source/sa/behavior/process_sa_chain.arcadia": { + "bytes": 1734, + "sha256": "b6aa1d90a113dacffdbc980f1fa6c6b2b85050921622c57492c80a1602e11a16" + }, + "runs/run-1/raw/snapshots/mixed-refusal/source/sa/functions/function_sa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "95ee9f35a41a4580c51bbf56b1b00717969adb77a0c05a1f30740c4c23788a02" + }, + "runs/run-1/raw/snapshots/mixed-refusal/source/sa/functions/function_sa_shared_work.arcadia": { + "bytes": 159, + "sha256": "0117bcfe32321b63d6b05b745f67aa57a565026eed68eb5a98300b7265941e9a" + }, + "runs/run-1/raw/snapshots/mixed-refusal/source/traceability.arcadia": { + "bytes": 528, + "sha256": "c5eaf8dc3c09dc56129a73da9630bb3fda99a0cfc9a8fa266e3a6ee32f53deb6" + }, + "runs/run-1/raw/snapshots/mixed-refusal/started.json": { + "bytes": 3076, + "sha256": "0d09c62f6e544fdeb23263a926438efb3dda9883d37f5bf659d8145dd645edcc" + }, + "runs/run-1/raw/snapshots/mixed-refusal/stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "runs/run-1/raw/snapshots/mixed-refusal/stdout.log": { + "bytes": 432, + "sha256": "a9cdab0aa2e5bdf726672dd857be7760b763a582a5651a6c92b0141dfd6f5e46" + }, + "runs/run-1/raw/snapshots/qualified-refusal/result.json": { + "bytes": 3498, + "sha256": "8435e35149bc488e26c225d520c8fb3f7b0fa6a6ab8619449c1d029664074f46" + }, + "runs/run-1/raw/snapshots/qualified-refusal/source/oa/activities/activity_oa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "7ebf9516f9f016139a4504649cd41e327b59b6798581bf9f65af2d30cfcd5a0e" + }, + "runs/run-1/raw/snapshots/qualified-refusal/source/oa/activities/activity_oa_shared_work.arcadia": { + "bytes": 159, + "sha256": "56139bf120e41b752d50aa85955b96eddc0c7e573fe493248deed1b49933a95d" + }, + "runs/run-1/raw/snapshots/qualified-refusal/source/oa/behavior/process_oa_process.arcadia": { + "bytes": 1737, + "sha256": "2f39cdf59c59bf56099ce5f07e339fa3f4fd0c8e964545f19c995a2341aba2e0" + }, + "runs/run-1/raw/snapshots/qualified-refusal/source/oa/behavior/process_reusable.arcadia": { + "bytes": 429, + "sha256": "21d216c39d0990a3ebc2d40b02d00c1cc126185def1fb5342c3205ca890ae04a" + }, + "runs/run-1/raw/snapshots/qualified-refusal/source/oa/behavior/process_reuse_trial.arcadia": { + "bytes": 730, + "sha256": "2384e5b81dc64ec229a0b1664333ee48a8a251b7ac8138584215a8611472fe2a" + }, + "runs/run-1/raw/snapshots/qualified-refusal/source/project.arcadia": { + "bytes": 753, + "sha256": "a942705a988f5bfa35f2bdae273bce3fc6dd9afff8267a96483df598dd5a13a6" + }, + "runs/run-1/raw/snapshots/qualified-refusal/source/sa/behavior/process_sa_chain.arcadia": { + "bytes": 1734, + "sha256": "b6aa1d90a113dacffdbc980f1fa6c6b2b85050921622c57492c80a1602e11a16" + }, + "runs/run-1/raw/snapshots/qualified-refusal/source/sa/functions/function_sa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "95ee9f35a41a4580c51bbf56b1b00717969adb77a0c05a1f30740c4c23788a02" + }, + "runs/run-1/raw/snapshots/qualified-refusal/source/sa/functions/function_sa_shared_work.arcadia": { + "bytes": 159, + "sha256": "0117bcfe32321b63d6b05b745f67aa57a565026eed68eb5a98300b7265941e9a" + }, + "runs/run-1/raw/snapshots/qualified-refusal/source/traceability.arcadia": { + "bytes": 528, + "sha256": "c5eaf8dc3c09dc56129a73da9630bb3fda99a0cfc9a8fa266e3a6ee32f53deb6" + }, + "runs/run-1/raw/snapshots/qualified-refusal/started.json": { + "bytes": 3080, + "sha256": "eb8784c1c211a5e8ae95159441bb9bc24d0acffd1f6b1dc44f807bbcb608571f" + }, + "runs/run-1/raw/snapshots/qualified-refusal/stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "runs/run-1/raw/snapshots/qualified-refusal/stdout.log": { + "bytes": 436, + "sha256": "7fcbf6f663dd0deaa7036fd27b7ba5a81479ac7e460c3fd0116fa89660d19cb3" + }, + "runs/run-1/raw/started.json": { + "bytes": 1738, + "sha256": "0cf41607c190da91578ac6cf729ed939eea22bdb1af11cccfc305b1cfbd927cb" + }, + "runs/run-1/raw/working/oa/activities/activity_oa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "7ebf9516f9f016139a4504649cd41e327b59b6798581bf9f65af2d30cfcd5a0e" + }, + "runs/run-1/raw/working/oa/activities/activity_oa_shared_work.arcadia": { + "bytes": 159, + "sha256": "56139bf120e41b752d50aa85955b96eddc0c7e573fe493248deed1b49933a95d" + }, + "runs/run-1/raw/working/oa/behavior/process_oa_process.arcadia": { + "bytes": 1737, + "sha256": "2f39cdf59c59bf56099ce5f07e339fa3f4fd0c8e964545f19c995a2341aba2e0" + }, + "runs/run-1/raw/working/oa/behavior/process_reusable.arcadia": { + "bytes": 429, + "sha256": "21d216c39d0990a3ebc2d40b02d00c1cc126185def1fb5342c3205ca890ae04a" + }, + "runs/run-1/raw/working/oa/behavior/process_reuse_trial.arcadia": { + "bytes": 730, + "sha256": "2384e5b81dc64ec229a0b1664333ee48a8a251b7ac8138584215a8611472fe2a" + }, + "runs/run-1/raw/working/project.arcadia": { + "bytes": 753, + "sha256": "a942705a988f5bfa35f2bdae273bce3fc6dd9afff8267a96483df598dd5a13a6" + }, + "runs/run-1/raw/working/sa/behavior/process_sa_chain.arcadia": { + "bytes": 1734, + "sha256": "b6aa1d90a113dacffdbc980f1fa6c6b2b85050921622c57492c80a1602e11a16" + }, + "runs/run-1/raw/working/sa/functions/function_sa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "95ee9f35a41a4580c51bbf56b1b00717969adb77a0c05a1f30740c4c23788a02" + }, + "runs/run-1/raw/working/sa/functions/function_sa_shared_work.arcadia": { + "bytes": 159, + "sha256": "0117bcfe32321b63d6b05b745f67aa57a565026eed68eb5a98300b7265941e9a" + }, + "runs/run-1/raw/working/traceability.arcadia": { + "bytes": 528, + "sha256": "c5eaf8dc3c09dc56129a73da9630bb3fda99a0cfc9a8fa266e3a6ee32f53deb6" + }, + "runs/run-3/raw/01-initial-0.jpg": { + "bytes": 117454, + "sha256": "b394fc7ce880b476523ec2824a610df0d378a929832f68b51745980e31b658e8" + }, + "runs/run-3/raw/01-initial.json": { + "bytes": 922, + "sha256": "37d6c45e76725f9d1e461d83f9680b2f01ac7e4ca6a448f38d4290c0bca43e56" + }, + "runs/run-3/raw/02-open-request-0.jpg": { + "bytes": 115671, + "sha256": "d9ea0557fa0ac86676f573c0454e3c400cdd8171f725120f0d93e6a6cad75001" + }, + "runs/run-3/raw/02-open-request.json": { + "bytes": 927, + "sha256": "e6d4d18f928a997fa50e4b57d089acbbcb9a48f685275c318a2811f9c4de3480" + }, + "runs/run-3/raw/03-file-dialog-0.jpg": { + "bytes": 674, + "sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b" + }, + "runs/run-3/raw/03-file-dialog-1.jpg": { + "bytes": 56820, + "sha256": "ae98662869a277df48796ddd792313273d7d9cb7a68dc81ed59cdfa003268c23" + }, + "runs/run-3/raw/03-file-dialog.json": { + "bytes": 5363, + "sha256": "e25b68daea2273998462bec8a467ed43f029dbef5cab7afd59400e3c325fb53e" + }, + "runs/run-3/raw/04-filename-focus-0.jpg": { + "bytes": 674, + "sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b" + }, + "runs/run-3/raw/04-filename-focus-1.jpg": { + "bytes": 57188, + "sha256": "31e20c7e7a50bb0b6da7a6a73638fe3208a5626e32e5d65b5b2d1232492eac29" + }, + "runs/run-3/raw/04-filename-focus.json": { + "bytes": 5369, + "sha256": "dcf68b111a0e9ec9e148d04ba4f4218796f4ea48ae1533918c4748cb259624ae" + }, + "runs/run-3/raw/05-fixture-path-0.jpg": { + "bytes": 674, + "sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b" + }, + "runs/run-3/raw/05-fixture-path-1.jpg": { + "bytes": 60453, + "sha256": "d854f5d5cbcf2d3c981e039b3cbed95d8fcd61fe1015cbc064c3d342fab613fa" + }, + "runs/run-3/raw/05-fixture-path.json": { + "bytes": 5365, + "sha256": "cb733587c924392974862a4eb04c8a2e5a3733fd80b1ffe55dad4d786f255be9" + }, + "runs/run-3/raw/06-loaded-0.jpg": { + "bytes": 101483, + "sha256": "796119babf149db4344b67dba00be0384ecf157f68cfb730fa5364a187ec7215" + }, + "runs/run-3/raw/06-loaded.json": { + "bytes": 725, + "sha256": "882df3f992fefcfd9471838fd57a97986d0686c3b8c3a8b0659bfcc04bdf058c" + }, + "runs/run-3/raw/07-load-settled-0.jpg": { + "bytes": 101483, + "sha256": "796119babf149db4344b67dba00be0384ecf157f68cfb730fa5364a187ec7215" + }, + "runs/run-3/raw/07-load-settled.json": { + "bytes": 731, + "sha256": "1334548661f18297a1d4294c8ec9f9e1def2731a5b0d671907309efb28ccf40f" + }, + "runs/run-3/raw/08-dialog-still-open-0.jpg": { + "bytes": 674, + "sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b" + }, + "runs/run-3/raw/08-dialog-still-open-1.jpg": { + "bytes": 60405, + "sha256": "80b53b108066add1a93775a93217e5e03dbe8c18d3d78839cb0f83ee542454ab" + }, + "runs/run-3/raw/08-dialog-still-open.json": { + "bytes": 5375, + "sha256": "08bcce5860dc67f72b9b300f39657fabb11ea6bd212c202d499eacf1f170e8ad" + }, + "runs/run-3/raw/09-model-opened-0.jpg": { + "bytes": 104176, + "sha256": "b5183c42de02b1067ee03696284757a2414813b1f314db59ad700d3368cb1d61" + }, + "runs/run-3/raw/09-model-opened.json": { + "bytes": 927, + "sha256": "2ef7223922936691ff9a0eaeaebe1c5465299713f6d80060774cb359de0b7f27" + }, + "runs/run-3/raw/10-behavior-0.jpg": { + "bytes": 117859, + "sha256": "69f17271f53d2c46bb45bfbad0384736a822c38e3b0d93da68f5f6ea23b667cc" + }, + "runs/run-3/raw/10-behavior.json": { + "bytes": 943, + "sha256": "04545cf4ea7593eb637b7403b87ad50387797ada3db326a0073cfbdd89c0a734" + }, + "runs/run-3/raw/11-baseline-saved-0.jpg": { + "bytes": 116102, + "sha256": "d8d540084414eebd6f71e025fd2973dd01cfe5631d8d8d23c6f79f7145bb06d0" + }, + "runs/run-3/raw/11-baseline-saved.json": { + "bytes": 949, + "sha256": "19b64b39254a54f47d910df5fc9cfa809482e73bc1297f66cb284e7acb2335a1" + }, + "runs/run-3/raw/12-first-qualified-0.jpg": { + "bytes": 108201, + "sha256": "719838e47dc03b235803e61fc9c2eb894716f374792bb56f1f6a1d156ad49bbb" + }, + "runs/run-3/raw/12-first-qualified.json": { + "bytes": 950, + "sha256": "20e6110c9283310f725701299d94a33e6594202a8496a22aa06f911ad97cf934" + }, + "runs/run-3/raw/13-nonprimary-menu-0.jpg": { + "bytes": 113445, + "sha256": "bce5afe8629d401db1aa483e2a5ffb1eff8e760d5f2506a9c25c3ad6c8bef35c" + }, + "runs/run-3/raw/13-nonprimary-menu.json": { + "bytes": 950, + "sha256": "9050dbc099422977a52f035c62e01b95eb5e17dd019193a4e50e34465db29292" + }, + "runs/run-3/raw/14-nonprimary-definition-0.jpg": { + "bytes": 123010, + "sha256": "06520c678c6babb27fd4aa75b45e5954aed6282ee27209a0dac08a2cdea57219" + }, + "runs/run-3/raw/14-nonprimary-definition.json": { + "bytes": 956, + "sha256": "2f062e788e47afb11be17d2e16b9c0ab032748108e3fb2ccb824f9dc4a454264" + }, + "runs/run-3/raw/15-return-control-0.jpg": { + "bytes": 142967, + "sha256": "ee0065f47dca396413e025fffc65c8a50aee15bd0ac3184e211134cee4eb4be1" + }, + "runs/run-3/raw/15-return-control.json": { + "bytes": 949, + "sha256": "98076ecfe9850f09362527430df606fd030b770bb2c4291051a4910c66a070b9" + }, + "runs/run-3/raw/16-exact-qualified-back-0.jpg": { + "bytes": 129288, + "sha256": "dd32a1faceb0dcda161fce7b614ed554ad97d85471b01f09faeea319255bb7fc" + }, + "runs/run-3/raw/16-exact-qualified-back.json": { + "bytes": 955, + "sha256": "e82e5627d3ccf6a53eba65f07d8d050c7ebf39d2bd06bf7b7942e85ed9e228a3" + }, + "runs/run-3/raw/17-caller-tree-expanded-0.jpg": { + "bytes": 130054, + "sha256": "b7340dcf9e34303c3119a185ebf5ec201ca18510fe5c7a88d4978e5f9df72122" + }, + "runs/run-3/raw/17-caller-tree-expanded.json": { + "bytes": 955, + "sha256": "494656be1196b4816e4746a63055ad54ed6f903faccdb56ea496a522fb53ea7a" + }, + "runs/run-3/raw/18-explicit-outer-properties-0.jpg": { + "bytes": 147914, + "sha256": "34611d45cd5128b4c79186fe1133bf4a557bdcacde54b125762fd707504224fc" + }, + "runs/run-3/raw/18-explicit-outer-properties.json": { + "bytes": 960, + "sha256": "2d632008044c61b346e0010b8de0c2547f0f5b2b29e1cc011bab5bdd568d54b1" + }, + "runs/run-3/raw/19-current-qualified-0.jpg": { + "bytes": 130920, + "sha256": "67a730f954586352ff6547608d92a2dd4602bd697f4f50835c2e7605f7ccf9ac" + }, + "runs/run-3/raw/19-current-qualified.json": { + "bytes": 952, + "sha256": "fdc8e45964f39a2ceb7e8efe4a21f4132ebb5a0a6a949289afa0562ae909c9fe" + }, + "runs/run-3/raw/20-current-definition-0.jpg": { + "bytes": 142408, + "sha256": "91870ea8556b2512fb44c1386478a1233665fc55906b3508d17d678bba0798b7" + }, + "runs/run-3/raw/20-current-definition.json": { + "bytes": 953, + "sha256": "c034163ff6be5bcad5da49bda6a1c69b97bb66d1ebf8d82e2dd0e57d2381abc4" + }, + "runs/run-3/raw/21-current-back-readonly-0.jpg": { + "bytes": 129954, + "sha256": "d5b6569134d8507e3ded44e32552ce7d6b104dc5f74de5de991867d328267116" + }, + "runs/run-3/raw/21-current-back-readonly.json": { + "bytes": 956, + "sha256": "2d12c0aa53fc8bdba96e22d4c2ff471295990d68bbf2b10102da1950220e9bfb" + }, + "runs/run-3/raw/22-explorer-same-leaf-definition-0.jpg": { + "bytes": 141748, + "sha256": "c94bfdc7962368ff62d12327cfcf50ae8a35d737000ca85aae4dc17f64ae1dcb" + }, + "runs/run-3/raw/22-explorer-same-leaf-definition.json": { + "bytes": 964, + "sha256": "0c7e29bd1e9fa0eb36a96345f352e2cc37e20ee93ed07d6ef65b27bdb9ea8d48" + }, + "runs/run-3/raw/23-navigation-saved-0.jpg": { + "bytes": 141652, + "sha256": "e1b137d6b3ec34be5770d22b312a8706a51aee96ace8127101559ba5dde49057" + }, + "runs/run-3/raw/23-navigation-saved.json": { + "bytes": 951, + "sha256": "aa118dc6d293929ee23c2817758501b61b8a0def0499b979adf25db48f2803c3" + }, + "runs/run-3/raw/24-details-closed-0.jpg": { + "bytes": 124930, + "sha256": "f63155e2192f9da2ea3dfaa34f7d935d818db4b6639fb31c6b30d289a06ae6aa" + }, + "runs/run-3/raw/24-details-closed.json": { + "bytes": 949, + "sha256": "8f3d008db3bd3a7eff41967604f7315b15c0bd0b77b106505275e8fed4425c66" + }, + "runs/run-3/raw/25-oa-order-0.jpg": { + "bytes": 130248, + "sha256": "1b3fecb6c71ecd44504840ef07be0ba9075bb2ecfc065a798ec6f4a8315dd8d4" + }, + "runs/run-3/raw/25-oa-order.json": { + "bytes": 943, + "sha256": "3e7a2397640f8df4419f129aebdfd75b4391c351700809e5378e74cc08456047" + }, + "runs/run-3/raw/26-local-card-0.jpg": { + "bytes": 138090, + "sha256": "b8a754e653d5735395386aaccca6f7363ba0c2659e40d3da642453d75b85cc90" + }, + "runs/run-3/raw/26-local-card.json": { + "bytes": 945, + "sha256": "589620b059e71f9c6071a69e941b1d9a38b3b98e6c1b93ebdfb5d8f9adb78a74" + }, + "runs/run-3/raw/27-resumed-card-0.jpg": { + "bytes": 138211, + "sha256": "e4f85e88c153136a5902e3f0821107d2a4f0668a15af9387e229a7d2003265d1" + }, + "runs/run-3/raw/27-resumed-card.json": { + "bytes": 947, + "sha256": "55ff218bb80d82ea92d2920f95b2aca832512154157e2506fb76aa6433284f6e" + }, + "runs/run-3/raw/28-link-menu-0.jpg": { + "bytes": 148009, + "sha256": "355859d4ef776835392b1bae6450259ab1dc930400fc7941524c3e5ea7ce3021" + }, + "runs/run-3/raw/28-link-menu.json": { + "bytes": 944, + "sha256": "46949da37c6a83648f6cfe359ff7c2ea6728d0d95c95e73b863c8a9385f44bb0" + }, + "runs/run-3/raw/29-mixed-selected-0.jpg": { + "bytes": 132323, + "sha256": "5a4e8db554d7e10fc338886a5abb932c34b5a4a39b2cdce81f5ee314943c3c37" + }, + "runs/run-3/raw/29-mixed-selected.json": { + "bytes": 949, + "sha256": "46d68e59984befda9fcc22818d4c65387402fa8ece52b2ce1acc9c9be61fbfe6" + }, + "runs/run-3/raw/30-mixed-refused-0.jpg": { + "bytes": 135371, + "sha256": "6f57e9981b0e778ec3b1fda43b1802c4c02bf42e583b6d9652c3bb5a063d60bf" + }, + "runs/run-3/raw/30-mixed-refused.json": { + "bytes": 948, + "sha256": "5f646d9d26b7d94a7eb7c4cbaefbd638838c5501ab9f7e71ba1816179339e1aa" + }, + "runs/run-3/raw/31-mixed-saved-0.jpg": { + "bytes": 132386, + "sha256": "396a43ee037a33540ede05f723be906fae39e066df3798704e811ac06991e5e0" + }, + "runs/run-3/raw/31-mixed-saved.json": { + "bytes": 946, + "sha256": "ae67f67a798396b64a29b4823bd730b60309909f75fcf7c820516c6cb54d7dcc" + }, + "runs/run-3/raw/32-card-c-0.jpg": { + "bytes": 138185, + "sha256": "3b317f73949e2566698503c262cbf4cf88d8d5f22055750b90e98946c11d4e4f" + }, + "runs/run-3/raw/32-card-c.json": { + "bytes": 941, + "sha256": "c38a4def6b82f787eb066c4e5fed33b24cc33d19113cbbab83853d458f67992e" + }, + "runs/run-3/raw/33-card-a-menu-0.jpg": { + "bytes": 146387, + "sha256": "244e01ffe98fd8da081d094f24e950bea856abdde7b47fb49f3a303bfc6ad398" + }, + "runs/run-3/raw/33-card-a-menu.json": { + "bytes": 946, + "sha256": "01a59f4982fa8fc3e1cd5c103dfcbf6c7cd59e55a36aa13aa7fb07608e29d3e3" + }, + "runs/run-3/raw/34-group-primary-a-0.jpg": { + "bytes": 137527, + "sha256": "10e27d0c93f050d3bc1c2f4db6b20b7659df4f5589c1168d4d64a4c986235bb9" + }, + "runs/run-3/raw/34-group-primary-a.json": { + "bytes": 950, + "sha256": "bd184effcb83d8029e07d79667cbd044442f66c84ab744e847d7f0b3ea522823" + }, + "runs/run-3/raw/35-group-menu-c-0.jpg": { + "bytes": 148604, + "sha256": "012f60ea7c78f2d18d744e38ff0145d437d3500190376219a1087ce5339c3284" + }, + "runs/run-3/raw/35-group-menu-c.json": { + "bytes": 947, + "sha256": "84f0f1d2ee26b7c27b9cdfadc5b7c729e3181e0fc8520bd87f007ce263009555" + }, + "runs/run-3/raw/36-group-primary-c-0.jpg": { + "bytes": 137655, + "sha256": "8ba0c813893e00371ac34af5231b48e82f5b25b60c5797f4e618df7a1dab462f" + }, + "runs/run-3/raw/36-group-primary-c.json": { + "bytes": 950, + "sha256": "5a02bdceb22ea683600b40b491961561c4816a97bb666f472fd69f69b736f12b" + }, + "runs/run-3/raw/37-selected-anchor-0.jpg": { + "bytes": 138388, + "sha256": "31a9bec04d13d494e4d7053571434105caae312c2a660fc2b9d889ad22a01bd5" + }, + "runs/run-3/raw/37-selected-anchor.json": { + "bytes": 950, + "sha256": "68faad5306c55910b3de2259f9009c8b7b268c7b96efc39c2c66005a71a0156b" + }, + "runs/run-3/raw/38-anchor-saved-0.jpg": { + "bytes": 137524, + "sha256": "d10d5e8c10fd6fb2dadd088ef53b228de15187a24d2f65aa767ca48fc7973688" + }, + "runs/run-3/raw/38-anchor-saved.json": { + "bytes": 947, + "sha256": "f70232688aadc09b680b0651cf6171d44a0c18d7c518afed0cd9ccc2216bed91" + }, + "runs/run-3/raw/39-group-reordered-0.jpg": { + "bytes": 139094, + "sha256": "3f967cd523085ba01607ec33ff30e908480ed1847e2688b2b28b896f43d5c0c9" + }, + "runs/run-3/raw/39-group-reordered.json": { + "bytes": 958, + "sha256": "7275030e69892f4c8cd7aadc638360d140fb1770d77f5b9b4421bda0be01e4ad" + }, + "runs/run-3/raw/40-reordered-saved-0.jpg": { + "bytes": 137845, + "sha256": "cbf1cdd68899c1811970d228b1065317bb333e7b119c59300ab5060a1efee096" + }, + "runs/run-3/raw/40-reordered-saved.json": { + "bytes": 950, + "sha256": "5459002ad776c245bcfd53b14fb4c93973a3b42197784796fcec2adaec2ad39b" + }, + "runs/run-3/raw/41-one-undo-0.jpg": { + "bytes": 137809, + "sha256": "035edf0630cccd93bdbb97160c817b555b9009471670679d70015ce6c2c30400" + }, + "runs/run-3/raw/41-one-undo.json": { + "bytes": 953, + "sha256": "e003fd2fb778b4855b0d2ff2231d7310af7e88b8860b55566c0c993691cc5288" + }, + "runs/run-3/raw/42-undo-saved-0.jpg": { + "bytes": 137708, + "sha256": "5a07f0ad701097bcf777a32c60bc2f3532835bb176b54d0887c5ce5fbd81793d" + }, + "runs/run-3/raw/42-undo-saved.json": { + "bytes": 947, + "sha256": "9b5c2a2b45e9ec867e909c15dafc0ee23e9c857313ad9498d5c58d147d8c1134" + }, + "runs/run-3/raw/43-one-redo-0.jpg": { + "bytes": 138035, + "sha256": "8b98fbda6e6a587289cd1d46cb301acf85b2c1a680ddb452fc74b92d4c0e5c77" + }, + "runs/run-3/raw/43-one-redo.json": { + "bytes": 953, + "sha256": "a96679da85055d4dc46a580d700b5fea6c56c47da81e10213de834d1afcaaf64" + }, + "runs/run-3/raw/44-redo-saved-0.jpg": { + "bytes": 137845, + "sha256": "cbf1cdd68899c1811970d228b1065317bb333e7b119c59300ab5060a1efee096" + }, + "runs/run-3/raw/44-redo-saved.json": { + "bytes": 945, + "sha256": "2de274a0c4a64de4bfeab1a7888463a83f046016b5bccfde03670f88772508f7" + }, + "runs/run-3/raw/45-reopen-request-0.jpg": { + "bytes": 110319, + "sha256": "c1f9a681d1a4f38104d75dfdffc3b94d70bbd0735214b78afc6274950a5c3b86" + }, + "runs/run-3/raw/45-reopen-request.json": { + "bytes": 949, + "sha256": "e1c855f16a488ea7b9d7e940045baceed48b4f1e681c3e48898da92838a41411" + }, + "runs/run-3/raw/46-reopen-dialog-0.jpg": { + "bytes": 674, + "sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b" + }, + "runs/run-3/raw/46-reopen-dialog-1.jpg": { + "bytes": 56513, + "sha256": "b66715c568db538617e7cbdcf4ec7dee9e7e78d9dcad3d3e4f4970a4887a141c" + }, + "runs/run-3/raw/46-reopen-dialog.json": { + "bytes": 5369, + "sha256": "59fc90e97e131ffddb8f08b8724910fb2047f33c1f77c660faacb92ec3d088a0" + }, + "runs/run-3/raw/47-reopen-filename-focus-0.jpg": { + "bytes": 674, + "sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b" + }, + "runs/run-3/raw/47-reopen-filename-focus-1.jpg": { + "bytes": 56915, + "sha256": "d295eb318dfe1dc3ca43d96f1b0a707f46ecc1871fa9d15937acf4347e4b83e5" + }, + "runs/run-3/raw/47-reopen-filename-focus.json": { + "bytes": 5385, + "sha256": "70fbaef2181d63002d325701ae61fed1868958fbb2eac912110daab2f35e2515" + }, + "runs/run-3/raw/48-reopen-path-0.jpg": { + "bytes": 674, + "sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b" + }, + "runs/run-3/raw/48-reopen-path-1.jpg": { + "bytes": 60144, + "sha256": "b7ff90cf853f39b9d28b6df02ba8c613b4c484ec329ab5e5150807b2e67952f1" + }, + "runs/run-3/raw/48-reopen-path.json": { + "bytes": 5365, + "sha256": "d2756c9a604e4762fb75c7369644adf751ee6caf118c8ed7a620d23ce9f5e2b8" + }, + "runs/run-3/raw/49-reopened-0.jpg": { + "bytes": 103619, + "sha256": "0e6f7d26d951607b23f1a780c78209a698b663ee41f8125055a75ae074af1bde" + }, + "runs/run-3/raw/49-reopened.json": { + "bytes": 943, + "sha256": "e2edb80c611df6f205954e6a099011d951f327a87218716c977f17bbf4bb547b" + }, + "runs/run-3/raw/50-reopened-behavior-0.jpg": { + "bytes": 117246, + "sha256": "1ff7dabb2022cc1b0488cb224ff3f2273809a55c47790b01e47e66edf133265e" + }, + "runs/run-3/raw/50-reopened-behavior.json": { + "bytes": 952, + "sha256": "1d7d48298782d22902a85c87c099734fec129408f00ddb1e0afa030a95ea0345" + }, + "runs/run-3/raw/51-reopened-order-0.jpg": { + "bytes": 130526, + "sha256": "26c51898a24624514f636a390f5a0cddef2a11bc3ebff9f3359bf61d54c2c9f5" + }, + "runs/run-3/raw/51-reopened-order.json": { + "bytes": 949, + "sha256": "4e4496ff615fb4c2a09679655eebae24c68ef4da13828741412fb4dcf2c7c233" + }, + "runs/run-3/raw/52-reopened-saved-0.jpg": { + "bytes": 128777, + "sha256": "2e71a4dd0cd4ab7e224ae1e1be37b576e0947f2190e3cc49b59ce6ac58895fc9" + }, + "runs/run-3/raw/52-reopened-saved.json": { + "bytes": 949, + "sha256": "620d5485447fdf9541a3d50743ff685017dddd81429a92618dc5bee63e280683" + }, + "runs/run-3/raw/app.stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "runs/run-3/raw/app.stdout.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "runs/run-3/raw/capture-executed.js": { + "bytes": 1255, + "sha256": "d2c9a3d2bcfe27e6ecd5077ef132862bcc3876f072c6abd787419e8d82de9642" + }, + "runs/run-3/raw/finished.json": { + "bytes": 380, + "sha256": "6044948da93f4e7aa9d0914fbaf08013d196eef868f1f603ba5014f780b79e19" + }, + "runs/run-3/raw/fixture/baseline.json": { + "bytes": 14627, + "sha256": "5cd1befea8666c5a686c22ab4bbbbf4d34523cd031b236d226371cbc19478683" + }, + "runs/run-3/raw/fixture/manifest.json": { + "bytes": 2449, + "sha256": "ef76db9595f5888c0207e2e42d13acbf0a6cda8d97fc5ab70b35183e8255b041" + }, + "runs/run-3/raw/fixture/source/oa/activities/activity_oa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "7ebf9516f9f016139a4504649cd41e327b59b6798581bf9f65af2d30cfcd5a0e" + }, + "runs/run-3/raw/fixture/source/oa/activities/activity_oa_shared_work.arcadia": { + "bytes": 159, + "sha256": "56139bf120e41b752d50aa85955b96eddc0c7e573fe493248deed1b49933a95d" + }, + "runs/run-3/raw/fixture/source/oa/behavior/process_oa_process.arcadia": { + "bytes": 1737, + "sha256": "2f39cdf59c59bf56099ce5f07e339fa3f4fd0c8e964545f19c995a2341aba2e0" + }, + "runs/run-3/raw/fixture/source/oa/behavior/process_reusable.arcadia": { + "bytes": 429, + "sha256": "21d216c39d0990a3ebc2d40b02d00c1cc126185def1fb5342c3205ca890ae04a" + }, + "runs/run-3/raw/fixture/source/oa/behavior/process_reuse_trial.arcadia": { + "bytes": 730, + "sha256": "2384e5b81dc64ec229a0b1664333ee48a8a251b7ac8138584215a8611472fe2a" + }, + "runs/run-3/raw/fixture/source/project.arcadia": { + "bytes": 753, + "sha256": "a942705a988f5bfa35f2bdae273bce3fc6dd9afff8267a96483df598dd5a13a6" + }, + "runs/run-3/raw/fixture/source/sa/behavior/process_sa_chain.arcadia": { + "bytes": 1734, + "sha256": "b6aa1d90a113dacffdbc980f1fa6c6b2b85050921622c57492c80a1602e11a16" + }, + "runs/run-3/raw/fixture/source/sa/functions/function_sa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "95ee9f35a41a4580c51bbf56b1b00717969adb77a0c05a1f30740c4c23788a02" + }, + "runs/run-3/raw/fixture/source/sa/functions/function_sa_shared_work.arcadia": { + "bytes": 159, + "sha256": "0117bcfe32321b63d6b05b745f67aa57a565026eed68eb5a98300b7265941e9a" + }, + "runs/run-3/raw/fixture/source/traceability.arcadia": { + "bytes": 528, + "sha256": "c5eaf8dc3c09dc56129a73da9630bb3fda99a0cfc9a8fa266e3a6ee32f53deb6" + }, + "runs/run-3/raw/generation.json": { + "bytes": 1244, + "sha256": "1a02afe08db16914c72ddab1eb9bfde5bbf0d5609ad31975a0be461c2cd8b864" + }, + "runs/run-3/raw/generation.stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "runs/run-3/raw/generation.stdout.log": { + "bytes": 112, + "sha256": "74c4b10c056ca7b1ff6b0cca5e1b5db17fb97047e0422b2a04e6eb3f7a042bea" + }, + "runs/run-3/raw/history-bytes.json": { + "bytes": 1885, + "sha256": "5b70ea68e8bacf9e2557ca7db8af9d166d02ca56872be2af4265bb6cf2c727db" + }, + "runs/run-3/raw/observations.md": { + "bytes": 5124, + "sha256": "d5bccef8f0492e180aaa71d0d470c461d571c6ce3ad2c2fbd43c63762af43cac" + }, + "runs/run-3/raw/prepared.json": { + "bytes": 4600, + "sha256": "c75ef9e3019f54a8fdd3f98e2d520fca1657faf535ba08a5bdb88067f9461998" + }, + "runs/run-3/raw/snapshots/anchor-noop/result.json": { + "bytes": 3492, + "sha256": "cf056d517764f2a0f46371423d5b78204baf747eb8dcc27f03b6dffc86fc0d48" + }, + "runs/run-3/raw/snapshots/anchor-noop/source/oa/activities/activity_oa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "7ebf9516f9f016139a4504649cd41e327b59b6798581bf9f65af2d30cfcd5a0e" + }, + "runs/run-3/raw/snapshots/anchor-noop/source/oa/activities/activity_oa_shared_work.arcadia": { + "bytes": 159, + "sha256": "56139bf120e41b752d50aa85955b96eddc0c7e573fe493248deed1b49933a95d" + }, + "runs/run-3/raw/snapshots/anchor-noop/source/oa/behavior/process_oa_process.arcadia": { + "bytes": 1737, + "sha256": "2f39cdf59c59bf56099ce5f07e339fa3f4fd0c8e964545f19c995a2341aba2e0" + }, + "runs/run-3/raw/snapshots/anchor-noop/source/oa/behavior/process_reusable.arcadia": { + "bytes": 429, + "sha256": "21d216c39d0990a3ebc2d40b02d00c1cc126185def1fb5342c3205ca890ae04a" + }, + "runs/run-3/raw/snapshots/anchor-noop/source/oa/behavior/process_reuse_trial.arcadia": { + "bytes": 730, + "sha256": "2384e5b81dc64ec229a0b1664333ee48a8a251b7ac8138584215a8611472fe2a" + }, + "runs/run-3/raw/snapshots/anchor-noop/source/project.arcadia": { + "bytes": 753, + "sha256": "a942705a988f5bfa35f2bdae273bce3fc6dd9afff8267a96483df598dd5a13a6" + }, + "runs/run-3/raw/snapshots/anchor-noop/source/sa/behavior/process_sa_chain.arcadia": { + "bytes": 1734, + "sha256": "b6aa1d90a113dacffdbc980f1fa6c6b2b85050921622c57492c80a1602e11a16" + }, + "runs/run-3/raw/snapshots/anchor-noop/source/sa/functions/function_sa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "95ee9f35a41a4580c51bbf56b1b00717969adb77a0c05a1f30740c4c23788a02" + }, + "runs/run-3/raw/snapshots/anchor-noop/source/sa/functions/function_sa_shared_work.arcadia": { + "bytes": 159, + "sha256": "0117bcfe32321b63d6b05b745f67aa57a565026eed68eb5a98300b7265941e9a" + }, + "runs/run-3/raw/snapshots/anchor-noop/source/traceability.arcadia": { + "bytes": 528, + "sha256": "c5eaf8dc3c09dc56129a73da9630bb3fda99a0cfc9a8fa266e3a6ee32f53deb6" + }, + "runs/run-3/raw/snapshots/anchor-noop/started.json": { + "bytes": 3074, + "sha256": "e4e50d3c45d9644c8e832d56730416d5be00203832111c7b7c8bd3dbf0c2cd78" + }, + "runs/run-3/raw/snapshots/anchor-noop/stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "runs/run-3/raw/snapshots/anchor-noop/stdout.log": { + "bytes": 430, + "sha256": "f65ba21f51a6a43191dbd27b29ba764739ae954212675ed89fef6b6276a97a92" + }, + "runs/run-3/raw/snapshots/baseline/result.json": { + "bytes": 3489, + "sha256": "6a883d21bf0f549e042dc5b9b4644714c9e7fe8ee0c52e0db551d1d6ec4a10d6" + }, + "runs/run-3/raw/snapshots/baseline/source/oa/activities/activity_oa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "7ebf9516f9f016139a4504649cd41e327b59b6798581bf9f65af2d30cfcd5a0e" + }, + "runs/run-3/raw/snapshots/baseline/source/oa/activities/activity_oa_shared_work.arcadia": { + "bytes": 159, + "sha256": "56139bf120e41b752d50aa85955b96eddc0c7e573fe493248deed1b49933a95d" + }, + "runs/run-3/raw/snapshots/baseline/source/oa/behavior/process_oa_process.arcadia": { + "bytes": 1737, + "sha256": "2f39cdf59c59bf56099ce5f07e339fa3f4fd0c8e964545f19c995a2341aba2e0" + }, + "runs/run-3/raw/snapshots/baseline/source/oa/behavior/process_reusable.arcadia": { + "bytes": 429, + "sha256": "21d216c39d0990a3ebc2d40b02d00c1cc126185def1fb5342c3205ca890ae04a" + }, + "runs/run-3/raw/snapshots/baseline/source/oa/behavior/process_reuse_trial.arcadia": { + "bytes": 730, + "sha256": "2384e5b81dc64ec229a0b1664333ee48a8a251b7ac8138584215a8611472fe2a" + }, + "runs/run-3/raw/snapshots/baseline/source/project.arcadia": { + "bytes": 753, + "sha256": "a942705a988f5bfa35f2bdae273bce3fc6dd9afff8267a96483df598dd5a13a6" + }, + "runs/run-3/raw/snapshots/baseline/source/sa/behavior/process_sa_chain.arcadia": { + "bytes": 1734, + "sha256": "b6aa1d90a113dacffdbc980f1fa6c6b2b85050921622c57492c80a1602e11a16" + }, + "runs/run-3/raw/snapshots/baseline/source/sa/functions/function_sa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "95ee9f35a41a4580c51bbf56b1b00717969adb77a0c05a1f30740c4c23788a02" + }, + "runs/run-3/raw/snapshots/baseline/source/sa/functions/function_sa_shared_work.arcadia": { + "bytes": 159, + "sha256": "0117bcfe32321b63d6b05b745f67aa57a565026eed68eb5a98300b7265941e9a" + }, + "runs/run-3/raw/snapshots/baseline/source/traceability.arcadia": { + "bytes": 528, + "sha256": "c5eaf8dc3c09dc56129a73da9630bb3fda99a0cfc9a8fa266e3a6ee32f53deb6" + }, + "runs/run-3/raw/snapshots/baseline/started.json": { + "bytes": 3071, + "sha256": "a0102c7dc3e7a591ab8d7c2800400d67169de1144dde08647c9c24645432a918" + }, + "runs/run-3/raw/snapshots/baseline/stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "runs/run-3/raw/snapshots/baseline/stdout.log": { + "bytes": 427, + "sha256": "b25adffce038f9b24a5f6e1a396aca6176c3d5f47ad0faa5c0abc2609ee454ce" + }, + "runs/run-3/raw/snapshots/mixed-refusal/result.json": { + "bytes": 3494, + "sha256": "a796e6b135cc9a065855cdfc1a89c86621a2a400438ccf464b1db5e6f5159059" + }, + "runs/run-3/raw/snapshots/mixed-refusal/source/oa/activities/activity_oa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "7ebf9516f9f016139a4504649cd41e327b59b6798581bf9f65af2d30cfcd5a0e" + }, + "runs/run-3/raw/snapshots/mixed-refusal/source/oa/activities/activity_oa_shared_work.arcadia": { + "bytes": 159, + "sha256": "56139bf120e41b752d50aa85955b96eddc0c7e573fe493248deed1b49933a95d" + }, + "runs/run-3/raw/snapshots/mixed-refusal/source/oa/behavior/process_oa_process.arcadia": { + "bytes": 1737, + "sha256": "2f39cdf59c59bf56099ce5f07e339fa3f4fd0c8e964545f19c995a2341aba2e0" + }, + "runs/run-3/raw/snapshots/mixed-refusal/source/oa/behavior/process_reusable.arcadia": { + "bytes": 429, + "sha256": "21d216c39d0990a3ebc2d40b02d00c1cc126185def1fb5342c3205ca890ae04a" + }, + "runs/run-3/raw/snapshots/mixed-refusal/source/oa/behavior/process_reuse_trial.arcadia": { + "bytes": 730, + "sha256": "2384e5b81dc64ec229a0b1664333ee48a8a251b7ac8138584215a8611472fe2a" + }, + "runs/run-3/raw/snapshots/mixed-refusal/source/project.arcadia": { + "bytes": 753, + "sha256": "a942705a988f5bfa35f2bdae273bce3fc6dd9afff8267a96483df598dd5a13a6" + }, + "runs/run-3/raw/snapshots/mixed-refusal/source/sa/behavior/process_sa_chain.arcadia": { + "bytes": 1734, + "sha256": "b6aa1d90a113dacffdbc980f1fa6c6b2b85050921622c57492c80a1602e11a16" + }, + "runs/run-3/raw/snapshots/mixed-refusal/source/sa/functions/function_sa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "95ee9f35a41a4580c51bbf56b1b00717969adb77a0c05a1f30740c4c23788a02" + }, + "runs/run-3/raw/snapshots/mixed-refusal/source/sa/functions/function_sa_shared_work.arcadia": { + "bytes": 159, + "sha256": "0117bcfe32321b63d6b05b745f67aa57a565026eed68eb5a98300b7265941e9a" + }, + "runs/run-3/raw/snapshots/mixed-refusal/source/traceability.arcadia": { + "bytes": 528, + "sha256": "c5eaf8dc3c09dc56129a73da9630bb3fda99a0cfc9a8fa266e3a6ee32f53deb6" + }, + "runs/run-3/raw/snapshots/mixed-refusal/started.json": { + "bytes": 3076, + "sha256": "59f380abe57cb10caa3722759c18619325b78ea6c09b223d1f588fa0c59706a3" + }, + "runs/run-3/raw/snapshots/mixed-refusal/stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "runs/run-3/raw/snapshots/mixed-refusal/stdout.log": { + "bytes": 432, + "sha256": "dfa538b7e8315285ded86a8ad9ba2337134638b64c0dbfd03643c29c7ff79eae" + }, + "runs/run-3/raw/snapshots/qualified-navigation/result.json": { + "bytes": 3501, + "sha256": "69ce6543babe7a0364cf15717a837cebff07ae65e1d1ebf7d9d2a196c8db56e0" + }, + "runs/run-3/raw/snapshots/qualified-navigation/source/oa/activities/activity_oa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "7ebf9516f9f016139a4504649cd41e327b59b6798581bf9f65af2d30cfcd5a0e" + }, + "runs/run-3/raw/snapshots/qualified-navigation/source/oa/activities/activity_oa_shared_work.arcadia": { + "bytes": 159, + "sha256": "56139bf120e41b752d50aa85955b96eddc0c7e573fe493248deed1b49933a95d" + }, + "runs/run-3/raw/snapshots/qualified-navigation/source/oa/behavior/process_oa_process.arcadia": { + "bytes": 1737, + "sha256": "2f39cdf59c59bf56099ce5f07e339fa3f4fd0c8e964545f19c995a2341aba2e0" + }, + "runs/run-3/raw/snapshots/qualified-navigation/source/oa/behavior/process_reusable.arcadia": { + "bytes": 429, + "sha256": "21d216c39d0990a3ebc2d40b02d00c1cc126185def1fb5342c3205ca890ae04a" + }, + "runs/run-3/raw/snapshots/qualified-navigation/source/oa/behavior/process_reuse_trial.arcadia": { + "bytes": 730, + "sha256": "2384e5b81dc64ec229a0b1664333ee48a8a251b7ac8138584215a8611472fe2a" + }, + "runs/run-3/raw/snapshots/qualified-navigation/source/project.arcadia": { + "bytes": 753, + "sha256": "a942705a988f5bfa35f2bdae273bce3fc6dd9afff8267a96483df598dd5a13a6" + }, + "runs/run-3/raw/snapshots/qualified-navigation/source/sa/behavior/process_sa_chain.arcadia": { + "bytes": 1734, + "sha256": "b6aa1d90a113dacffdbc980f1fa6c6b2b85050921622c57492c80a1602e11a16" + }, + "runs/run-3/raw/snapshots/qualified-navigation/source/sa/functions/function_sa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "95ee9f35a41a4580c51bbf56b1b00717969adb77a0c05a1f30740c4c23788a02" + }, + "runs/run-3/raw/snapshots/qualified-navigation/source/sa/functions/function_sa_shared_work.arcadia": { + "bytes": 159, + "sha256": "0117bcfe32321b63d6b05b745f67aa57a565026eed68eb5a98300b7265941e9a" + }, + "runs/run-3/raw/snapshots/qualified-navigation/source/traceability.arcadia": { + "bytes": 528, + "sha256": "c5eaf8dc3c09dc56129a73da9630bb3fda99a0cfc9a8fa266e3a6ee32f53deb6" + }, + "runs/run-3/raw/snapshots/qualified-navigation/started.json": { + "bytes": 3083, + "sha256": "eef5f16c3c8bf5e8e0f5c553177bd798f6300bdf3b07f7bf700cfef0ae0c8832" + }, + "runs/run-3/raw/snapshots/qualified-navigation/stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "runs/run-3/raw/snapshots/qualified-navigation/stdout.log": { + "bytes": 439, + "sha256": "adc403e0006c6543ed20e6abd681055e1a825ca127d18dc432789fdddf40a429" + }, + "runs/run-3/raw/snapshots/redo/result.json": { + "bytes": 3485, + "sha256": "148458cb2c9877e67dc534b1bf14ea3652f4b2c856e972d6029dbce228a6a8d4" + }, + "runs/run-3/raw/snapshots/redo/source/oa/activities/activity_oa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "7ebf9516f9f016139a4504649cd41e327b59b6798581bf9f65af2d30cfcd5a0e" + }, + "runs/run-3/raw/snapshots/redo/source/oa/activities/activity_oa_shared_work.arcadia": { + "bytes": 159, + "sha256": "56139bf120e41b752d50aa85955b96eddc0c7e573fe493248deed1b49933a95d" + }, + "runs/run-3/raw/snapshots/redo/source/oa/behavior/process_oa_process.arcadia": { + "bytes": 1737, + "sha256": "3aa5cbb23ecc74bec7f31a0d7f7270b1f49b3444d3f35cf4baacaebfa6597999" + }, + "runs/run-3/raw/snapshots/redo/source/oa/behavior/process_reusable.arcadia": { + "bytes": 429, + "sha256": "21d216c39d0990a3ebc2d40b02d00c1cc126185def1fb5342c3205ca890ae04a" + }, + "runs/run-3/raw/snapshots/redo/source/oa/behavior/process_reuse_trial.arcadia": { + "bytes": 730, + "sha256": "2384e5b81dc64ec229a0b1664333ee48a8a251b7ac8138584215a8611472fe2a" + }, + "runs/run-3/raw/snapshots/redo/source/project.arcadia": { + "bytes": 753, + "sha256": "a942705a988f5bfa35f2bdae273bce3fc6dd9afff8267a96483df598dd5a13a6" + }, + "runs/run-3/raw/snapshots/redo/source/sa/behavior/process_sa_chain.arcadia": { + "bytes": 1734, + "sha256": "b6aa1d90a113dacffdbc980f1fa6c6b2b85050921622c57492c80a1602e11a16" + }, + "runs/run-3/raw/snapshots/redo/source/sa/functions/function_sa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "95ee9f35a41a4580c51bbf56b1b00717969adb77a0c05a1f30740c4c23788a02" + }, + "runs/run-3/raw/snapshots/redo/source/sa/functions/function_sa_shared_work.arcadia": { + "bytes": 159, + "sha256": "0117bcfe32321b63d6b05b745f67aa57a565026eed68eb5a98300b7265941e9a" + }, + "runs/run-3/raw/snapshots/redo/source/traceability.arcadia": { + "bytes": 528, + "sha256": "c5eaf8dc3c09dc56129a73da9630bb3fda99a0cfc9a8fa266e3a6ee32f53deb6" + }, + "runs/run-3/raw/snapshots/redo/started.json": { + "bytes": 3067, + "sha256": "f5165650693e2e749f7675b9957a21a365d8afbcfd37f5133853b44eaa5d362e" + }, + "runs/run-3/raw/snapshots/redo/stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "runs/run-3/raw/snapshots/redo/stdout.log": { + "bytes": 423, + "sha256": "18fe05afbf0193fd4ab892e9e64ac6793df5f3d863a2fafd1c92aa9f5cad2dd7" + }, + "runs/run-3/raw/snapshots/reopened/result.json": { + "bytes": 3489, + "sha256": "7f5c338b3c49219b2a59274ae0f38f2816a961e04d1552d69b10120142c65974" + }, + "runs/run-3/raw/snapshots/reopened/source/oa/activities/activity_oa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "7ebf9516f9f016139a4504649cd41e327b59b6798581bf9f65af2d30cfcd5a0e" + }, + "runs/run-3/raw/snapshots/reopened/source/oa/activities/activity_oa_shared_work.arcadia": { + "bytes": 159, + "sha256": "56139bf120e41b752d50aa85955b96eddc0c7e573fe493248deed1b49933a95d" + }, + "runs/run-3/raw/snapshots/reopened/source/oa/behavior/process_oa_process.arcadia": { + "bytes": 1737, + "sha256": "3aa5cbb23ecc74bec7f31a0d7f7270b1f49b3444d3f35cf4baacaebfa6597999" + }, + "runs/run-3/raw/snapshots/reopened/source/oa/behavior/process_reusable.arcadia": { + "bytes": 429, + "sha256": "21d216c39d0990a3ebc2d40b02d00c1cc126185def1fb5342c3205ca890ae04a" + }, + "runs/run-3/raw/snapshots/reopened/source/oa/behavior/process_reuse_trial.arcadia": { + "bytes": 730, + "sha256": "2384e5b81dc64ec229a0b1664333ee48a8a251b7ac8138584215a8611472fe2a" + }, + "runs/run-3/raw/snapshots/reopened/source/project.arcadia": { + "bytes": 753, + "sha256": "a942705a988f5bfa35f2bdae273bce3fc6dd9afff8267a96483df598dd5a13a6" + }, + "runs/run-3/raw/snapshots/reopened/source/sa/behavior/process_sa_chain.arcadia": { + "bytes": 1734, + "sha256": "b6aa1d90a113dacffdbc980f1fa6c6b2b85050921622c57492c80a1602e11a16" + }, + "runs/run-3/raw/snapshots/reopened/source/sa/functions/function_sa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "95ee9f35a41a4580c51bbf56b1b00717969adb77a0c05a1f30740c4c23788a02" + }, + "runs/run-3/raw/snapshots/reopened/source/sa/functions/function_sa_shared_work.arcadia": { + "bytes": 159, + "sha256": "0117bcfe32321b63d6b05b745f67aa57a565026eed68eb5a98300b7265941e9a" + }, + "runs/run-3/raw/snapshots/reopened/source/traceability.arcadia": { + "bytes": 528, + "sha256": "c5eaf8dc3c09dc56129a73da9630bb3fda99a0cfc9a8fa266e3a6ee32f53deb6" + }, + "runs/run-3/raw/snapshots/reopened/started.json": { + "bytes": 3071, + "sha256": "a6a3a9b64b7398a00be9fed9bf67013e8b4fe5a24a6d344c051e7a4ae164f1a1" + }, + "runs/run-3/raw/snapshots/reopened/stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "runs/run-3/raw/snapshots/reopened/stdout.log": { + "bytes": 427, + "sha256": "ab357e3de52126f520721782309c09e2d7dec59d515aa625834c90e7d542b8a6" + }, + "runs/run-3/raw/snapshots/reordered/result.json": { + "bytes": 3490, + "sha256": "6378ec2ce1d560459a0a4683b5dfb6f3519cfcf3d21e320c6d1bbe5a9dbb652b" + }, + "runs/run-3/raw/snapshots/reordered/source/oa/activities/activity_oa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "7ebf9516f9f016139a4504649cd41e327b59b6798581bf9f65af2d30cfcd5a0e" + }, + "runs/run-3/raw/snapshots/reordered/source/oa/activities/activity_oa_shared_work.arcadia": { + "bytes": 159, + "sha256": "56139bf120e41b752d50aa85955b96eddc0c7e573fe493248deed1b49933a95d" + }, + "runs/run-3/raw/snapshots/reordered/source/oa/behavior/process_oa_process.arcadia": { + "bytes": 1737, + "sha256": "3aa5cbb23ecc74bec7f31a0d7f7270b1f49b3444d3f35cf4baacaebfa6597999" + }, + "runs/run-3/raw/snapshots/reordered/source/oa/behavior/process_reusable.arcadia": { + "bytes": 429, + "sha256": "21d216c39d0990a3ebc2d40b02d00c1cc126185def1fb5342c3205ca890ae04a" + }, + "runs/run-3/raw/snapshots/reordered/source/oa/behavior/process_reuse_trial.arcadia": { + "bytes": 730, + "sha256": "2384e5b81dc64ec229a0b1664333ee48a8a251b7ac8138584215a8611472fe2a" + }, + "runs/run-3/raw/snapshots/reordered/source/project.arcadia": { + "bytes": 753, + "sha256": "a942705a988f5bfa35f2bdae273bce3fc6dd9afff8267a96483df598dd5a13a6" + }, + "runs/run-3/raw/snapshots/reordered/source/sa/behavior/process_sa_chain.arcadia": { + "bytes": 1734, + "sha256": "b6aa1d90a113dacffdbc980f1fa6c6b2b85050921622c57492c80a1602e11a16" + }, + "runs/run-3/raw/snapshots/reordered/source/sa/functions/function_sa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "95ee9f35a41a4580c51bbf56b1b00717969adb77a0c05a1f30740c4c23788a02" + }, + "runs/run-3/raw/snapshots/reordered/source/sa/functions/function_sa_shared_work.arcadia": { + "bytes": 159, + "sha256": "0117bcfe32321b63d6b05b745f67aa57a565026eed68eb5a98300b7265941e9a" + }, + "runs/run-3/raw/snapshots/reordered/source/traceability.arcadia": { + "bytes": 528, + "sha256": "c5eaf8dc3c09dc56129a73da9630bb3fda99a0cfc9a8fa266e3a6ee32f53deb6" + }, + "runs/run-3/raw/snapshots/reordered/started.json": { + "bytes": 3072, + "sha256": "2f61098aa6537580f66687ccda462e578baa7e8c49ac5146ee5f7f93db5a2b6c" + }, + "runs/run-3/raw/snapshots/reordered/stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "runs/run-3/raw/snapshots/reordered/stdout.log": { + "bytes": 428, + "sha256": "c0534dbd6525c5165a54b72387d89eb798da7cd023a027c2112bf14e2d70d0cf" + }, + "runs/run-3/raw/snapshots/undo/result.json": { + "bytes": 3485, + "sha256": "7f092ca7549d5e9601bc2b3fce3ee1419ca8aad4091d874379b48588bbd795c2" + }, + "runs/run-3/raw/snapshots/undo/source/oa/activities/activity_oa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "7ebf9516f9f016139a4504649cd41e327b59b6798581bf9f65af2d30cfcd5a0e" + }, + "runs/run-3/raw/snapshots/undo/source/oa/activities/activity_oa_shared_work.arcadia": { + "bytes": 159, + "sha256": "56139bf120e41b752d50aa85955b96eddc0c7e573fe493248deed1b49933a95d" + }, + "runs/run-3/raw/snapshots/undo/source/oa/behavior/process_oa_process.arcadia": { + "bytes": 1737, + "sha256": "2f39cdf59c59bf56099ce5f07e339fa3f4fd0c8e964545f19c995a2341aba2e0" + }, + "runs/run-3/raw/snapshots/undo/source/oa/behavior/process_reusable.arcadia": { + "bytes": 429, + "sha256": "21d216c39d0990a3ebc2d40b02d00c1cc126185def1fb5342c3205ca890ae04a" + }, + "runs/run-3/raw/snapshots/undo/source/oa/behavior/process_reuse_trial.arcadia": { + "bytes": 730, + "sha256": "2384e5b81dc64ec229a0b1664333ee48a8a251b7ac8138584215a8611472fe2a" + }, + "runs/run-3/raw/snapshots/undo/source/project.arcadia": { + "bytes": 753, + "sha256": "a942705a988f5bfa35f2bdae273bce3fc6dd9afff8267a96483df598dd5a13a6" + }, + "runs/run-3/raw/snapshots/undo/source/sa/behavior/process_sa_chain.arcadia": { + "bytes": 1734, + "sha256": "b6aa1d90a113dacffdbc980f1fa6c6b2b85050921622c57492c80a1602e11a16" + }, + "runs/run-3/raw/snapshots/undo/source/sa/functions/function_sa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "95ee9f35a41a4580c51bbf56b1b00717969adb77a0c05a1f30740c4c23788a02" + }, + "runs/run-3/raw/snapshots/undo/source/sa/functions/function_sa_shared_work.arcadia": { + "bytes": 159, + "sha256": "0117bcfe32321b63d6b05b745f67aa57a565026eed68eb5a98300b7265941e9a" + }, + "runs/run-3/raw/snapshots/undo/source/traceability.arcadia": { + "bytes": 528, + "sha256": "c5eaf8dc3c09dc56129a73da9630bb3fda99a0cfc9a8fa266e3a6ee32f53deb6" + }, + "runs/run-3/raw/snapshots/undo/started.json": { + "bytes": 3067, + "sha256": "b7e634bb8f699f0fd1dee1ce981da17e47e2baa5d4f411b9ce88dddec62c4212" + }, + "runs/run-3/raw/snapshots/undo/stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "runs/run-3/raw/snapshots/undo/stdout.log": { + "bytes": 423, + "sha256": "69b8cf621ffaf1787f5c0538e2953eb31f5297fa7d97fcfcbf21f0f41a4cf85d" + }, + "runs/run-3/raw/started.json": { + "bytes": 1738, + "sha256": "510d40f4873b62ff2e2e706ba04dc20e6eba945e1087252fd6d98b8e9bf0f3f7" + }, + "runs/run-3/raw/working/oa/activities/activity_oa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "7ebf9516f9f016139a4504649cd41e327b59b6798581bf9f65af2d30cfcd5a0e" + }, + "runs/run-3/raw/working/oa/activities/activity_oa_shared_work.arcadia": { + "bytes": 159, + "sha256": "56139bf120e41b752d50aa85955b96eddc0c7e573fe493248deed1b49933a95d" + }, + "runs/run-3/raw/working/oa/behavior/process_oa_process.arcadia": { + "bytes": 1737, + "sha256": "3aa5cbb23ecc74bec7f31a0d7f7270b1f49b3444d3f35cf4baacaebfa6597999" + }, + "runs/run-3/raw/working/oa/behavior/process_reusable.arcadia": { + "bytes": 429, + "sha256": "21d216c39d0990a3ebc2d40b02d00c1cc126185def1fb5342c3205ca890ae04a" + }, + "runs/run-3/raw/working/oa/behavior/process_reuse_trial.arcadia": { + "bytes": 730, + "sha256": "2384e5b81dc64ec229a0b1664333ee48a8a251b7ac8138584215a8611472fe2a" + }, + "runs/run-3/raw/working/project.arcadia": { + "bytes": 753, + "sha256": "a942705a988f5bfa35f2bdae273bce3fc6dd9afff8267a96483df598dd5a13a6" + }, + "runs/run-3/raw/working/sa/behavior/process_sa_chain.arcadia": { + "bytes": 1734, + "sha256": "b6aa1d90a113dacffdbc980f1fa6c6b2b85050921622c57492c80a1602e11a16" + }, + "runs/run-3/raw/working/sa/functions/function_sa_downstream_work.arcadia": { + "bytes": 171, + "sha256": "95ee9f35a41a4580c51bbf56b1b00717969adb77a0c05a1f30740c4c23788a02" + }, + "runs/run-3/raw/working/sa/functions/function_sa_shared_work.arcadia": { + "bytes": 159, + "sha256": "0117bcfe32321b63d6b05b745f67aa57a565026eed68eb5a98300b7265941e9a" + }, + "runs/run-3/raw/working/traceability.arcadia": { + "bytes": 528, + "sha256": "c5eaf8dc3c09dc56129a73da9630bb3fda99a0cfc9a8fa266e3a6ee32f53deb6" + } + } +} diff --git a/harness/multiselect-process-evidence-20260923/native/prepare.py b/harness/multiselect-process-evidence-20260923/native/prepare.py new file mode 100644 index 00000000..a7eee20c --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/native/prepare.py @@ -0,0 +1,115 @@ +"""Package explicitly named closed Process native runs; never execute archived helpers.""" +from pathlib import Path +import argparse +import io +import json +import re +import zipfile +from verify import pin, parsed, need, norm, relative, safe, zip_inventory, verify_data, verify_package + +HERE = Path(__file__).resolve().parent +FAILED_RUN_ONE = "Observed Back restored qualified highlight with outer-reference editable Properties; reorder and Undo/Redo/reopen history were not performed. Failed native workflow, despite three positive unchanged Project reports." + + +def collect(root, runs, extra_helpers=()): + native = root / ".local/process-multiselect-native" + candidates = [p for p in native.iterdir() if p.is_file()] + candidates += sorted((root / ".local/process-group-gates").glob("*.py")) + candidates += list(extra_helpers) + helpers = [(p.suffix, p.read_bytes()) for p in candidates] + payload, specs = {}, {} + def add(name, data): + need(safe(name) and (name not in payload or payload[name] == data), "member collision: " + name) + payload[name] = data + return name + def helper(expected): + matches = [(suffix, data) for suffix, data in helpers if pin(data) == expected] + need(matches, "exact historical helper unavailable: " + str(expected)) + suffix, data = matches[0] + return add("helpers/" + expected["sha256"] + suffix, data) + def tree(folder, prefix): + need(folder.is_dir(), "missing directory: " + str(folder)) + for path in sorted(folder.rglob("*")): + need(not path.is_symlink() and not getattr(path, "is_junction", lambda: False)(), "linked evidence input") + if path.is_file(): + add(prefix + path.relative_to(folder).as_posix(), path.read_bytes()) + for run in runs: + folder = native / run + need((folder / "finished.json").is_file(), "open/unlaunched run refused: " + run) + prepared = parsed((folder / "prepared.json").read_bytes()) + tree(folder, "runs/" + run + "/raw/") + spec = {"originalRun": norm(prepared["cwd"]) + "/.local/process-multiselect-native/" + run, + "reviewStatus": "failed" if run == "run-1" else "unreviewed", + "reviewNote": FAILED_RUN_ONE if run == "run-1" else "Packaging consistency does not decide native acceptance. Consult the independent parent review.", + "helpers": {name: helper(expected) for name, expected in prepared["helpers"].items()}, + "executedCapture": pin((folder / "capture-executed.js").read_bytes()), "builds": {}} + for kind in ("gui", "checker"): + recorded = prepared[kind] + rel = relative(recorded["receipt"], prepared["cwd"]) + need(rel.startswith(".local/process-group-gates/") and rel.endswith("/result.json"), "unexpected receipt location") + receipt = root / rel + result_data = receipt.read_bytes() + need(pin(result_data) == recorded["receiptPin"], "historical build receipt changed") + result = parsed(result_data) + prefix = "builds/" + pin(result_data)["sha256"] + "/" + build = {"originalRelative": rel, "helper": helper(result["helper"])} + for name in ("started.json", "process.json", "result.json", "stdout.log", "stderr.log", "inputs.json", "inputs.zip"): + data = (receipt.parent / name).read_bytes() + # Deduplicate source capsules independently of differing build receipts. + member = ("inputs/" + pin(data)["sha256"] + Path(name).suffix) if name.startswith("inputs.") else prefix + name + build[name] = add(member, data) + spec["builds"][kind] = build + if kind == "checker": + capsule = payload[build["inputs.zip"]] + need(pin(capsule) == result["archive"], "historical checker capsule pin") + inputs = parsed(payload[build["inputs.json"]]) + with zipfile.ZipFile(io.BytesIO(capsule)) as archive: + zip_inventory(archive, inputs) + source = archive.read("crates/oa-core/examples/process_multiselect_native.rs") + spec["checkerSource"] = add("checker-source/" + pin(source)["sha256"] + ".rs", source) + specs[run] = spec + manifest = {"schema": 1, "kind": "process-multiselect-native", "runs": specs, + "members": {name: pin(data) for name, data in sorted(payload.items())}} + return payload, manifest, verify_data(manifest, payload.__getitem__) + + +def write_json(path, value): + with path.open("xb") as stream: + stream.write((json.dumps(value, indent=2) + "\n").encode()) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--root", type=Path, required=True) + parser.add_argument("--runs", nargs="+", required=True) + parser.add_argument("--output", type=Path) + parser.add_argument("--check-only", action="store_true") + parser.add_argument("--helper", type=Path, action="append", default=[], help="Exact historical helper bytes if current helper changed") + args = parser.parse_args() + need(len(args.runs) == len(set(args.runs)) and all(re.fullmatch(r"run-[0-9]+", name) for name in args.runs), "explicit unique run-N names required") + need(args.check_only or args.output is not None, "--output or --check-only required") + if args.output is not None: + need(not args.output.exists(), "fresh nonexistent output directory required") + payload, manifest, summary = collect(args.root.resolve(), args.runs, args.helper) + if args.check_only: + print("PASS raw consistency; no archive written:", summary) + return + out = args.output.resolve() + out.mkdir(parents=True, exist_ok=False) + for name in ("prepare.py", "verify.py", "README.md"): + with (out / name).open("xb") as stream: + stream.write((HERE / name).read_bytes()) + with zipfile.ZipFile(out / "evidence.zip", "x", compression=zipfile.ZIP_DEFLATED, compresslevel=9) as archive: + for name, data in sorted(payload.items()): + info = zipfile.ZipInfo(name, date_time=(2026, 9, 23, 0, 0, 0)) + info.compress_type = zipfile.ZIP_DEFLATED + info.external_attr = 0o100644 << 16 + archive.writestr(info, data) + write_json(out / "manifest.json", manifest) + write_json(out / "files.json", {name: pin((out / name).read_bytes()) for name in ("prepare.py", "verify.py", "README.md", "manifest.json", "evidence.zip")}) + need(verify_package(out) == summary, "written package differs from raw evidence") + print("PASS package readback:", out, summary) + + +if __name__ == "__main__": + main() diff --git a/harness/multiselect-process-evidence-20260923/native/verify.py b/harness/multiselect-process-evidence-20260923/native/verify.py new file mode 100644 index 00000000..752bdf49 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/native/verify.py @@ -0,0 +1,229 @@ +"""Verify archived native receipts and bytes; do not rerun the GUI or checker.""" +from pathlib import Path, PurePosixPath +from datetime import datetime +import argparse +import hashlib +import json +import io +import re +import stat +import zipfile + +BASE = {"prepared.json", "started.json", "finished.json", "generation.json", "generation.stdout.log", + "generation.stderr.log", "app.stdout.log", "app.stderr.log", "capture-executed.js"} +OUTER = {"prepare.py", "verify.py", "README.md", "manifest.json", "evidence.zip"} + + +def need(ok, message): + if not ok: + raise ValueError(message) + + +def pin(data): + return {"bytes": len(data), "sha256": hashlib.sha256(data).hexdigest()} + + +def safe(name): + return (isinstance(name, str) and bool(name) and "\\" not in name and ":" not in name + and not PurePosixPath(name).is_absolute() and all(ord(c) >= 32 for c in name) + and all(part not in ("", ".", "..") for part in name.split("/"))) + + +def parsed(data): + def unique(items): + result = {} + for key, value in items: + need(key not in result, "duplicate JSON key: " + key) + result[key] = value + return result + return json.loads(data, object_pairs_hook=unique) + + +def norm(path): + return path.replace("\\", "/").rstrip("/") + + +def relative(path, root): + prefix = norm(root) + "/" + need(norm(path).startswith(prefix), "recorded path outside owner: " + path) + value = norm(path)[len(prefix):] + need(safe(value), "unsafe recorded relative path") + return value + + +def ordered(*values): + times = [datetime.fromisoformat(value) for value in values] + return all(t.utcoffset() is not None for t in times) and times == sorted(times) + + +def zip_inventory(archive, members): + names = archive.namelist() + need(len(names) == len(set(names)) and set(names) == set(members), "exact archive members") + for info in archive.infolist(): + need(safe(info.filename) and not info.is_dir() and not stat.S_ISLNK(info.external_attr >> 16), "unsafe archive member") + need(info.file_size == members[info.filename]["bytes"], "archive member size") + + +def verify_data(manifest, read): + need(manifest["schema"] == 1 and manifest["kind"] == "process-multiselect-native", "manifest kind") + members, runs = manifest["members"], manifest["runs"] + need(bool(runs) and all(re.fullmatch(r"run-[0-9]+", run) for run in runs), "run names") + need(all(safe(name) for name in members), "safe member names") + for name, expected in members.items(): + need(pin(read(name)) == expected, "member pin: " + name) + used, summaries = set(), {} + def raw(name): + need(name in members, "missing member: " + name) + used.add(name) + return read(name) + def obj(name): + return parsed(raw(name)) + def tree(prefix): + return {name[len(prefix):]: raw(name) for name in members if name.startswith(prefix)} + def pinned_tree(prefix, expected): + actual = tree(prefix) + need({name: pin(data) for name, data in actual.items()} == expected, "pinned tree: " + prefix) + return actual + for run, spec in runs.items(): + prefix = "runs/" + run + "/raw/" + prepared, start, end, generation = [obj(prefix + n + ".json") for n in ("prepared", "started", "finished", "generation")] + need(spec["reviewStatus"] in ("failed", "unreviewed") and isinstance(spec["reviewNote"], str) and spec["reviewNote"], "explicit non-acceptance status") + if run == "run-1": + need(spec["reviewStatus"] == "failed", "run-1 must retain observed native failure") + origin = norm(prepared["cwd"]) + "/.local/process-multiselect-native/" + run + need(spec["originalRun"] == origin and prepared["run"] == run and start["cwd"] == prepared["cwd"], "original run mapping") + need(start["prepared"] == pin(raw(prefix + "prepared.json")), "launch preparation pin") + need(ordered(generation["start"], generation["finish"], prepared["prepared"], start["start"], end["finish"]), "native lifetime") + need(type(start["pid"]) is int and start["pid"] > 0 and type(end["exitCode"]) is int, "closed native process") + for key in ("guiUnchanged", "checkerUnchanged", "fixtureUnchanged"): + need(type(end[key]) is bool, "closure flag") + need(start["gui"] == prepared["gui"] and start["checker"] == prepared["checker"] == generation["checker"], "binary identity") + need(start["command"] == [prepared["gui"]["binary"]], "GUI command") + need(generation["exitCode"] == 0 and generation["command"][:2] == [prepared["checker"]["binary"], "generate"] and len(generation["command"]) == 3 and norm(generation["command"][2]) == origin + "/fixture", "generation command") + for stream in ("stdout", "stderr"): + need(end[stream] == pin(raw(prefix + "app." + stream + ".log")), "GUI log pin") + need(generation[stream] == pin(raw(prefix + "generation." + stream + ".log")), "generation log pin") + need(set(spec["helpers"]) == set(prepared["helpers"]), "exact prepared helper mapping") + for name, expected in prepared["helpers"].items(): + need(safe(name) and "/" not in name and pin(raw(spec["helpers"][name])) == expected, "historical helper: " + name) + need(start["helper"] == prepared["helpers"]["native.py"], "launch helper") + need(pin(raw(prefix + "capture-executed.js")) == spec["executedCapture"], "actual capture function pin") + fixture = pinned_tree(prefix + "fixture/", prepared["fixture"]) + fm = parsed(fixture["manifest.json"]) + need(fm["fixture"] == "process-multiselect-native-20260923" and fm["source_entry"] == prepared["entry"] and safe(prepared["entry"]), "fixture identity/entry") + need(parsed(fixture["baseline.json"])["id"] == fm["ids"]["project"], "complete Project baseline identity") + fixture_source = {name[7:]: data for name, data in fixture.items() if name.startswith("source/")} + need(prepared["entry"] in fixture_source and norm(prepared["workingEntry"]) == origin + "/working/" + prepared["entry"], "working entry mapping") + working = tree(prefix + "working/") + need(bool(working) and all(name.endswith(".arcadia") for name in working), "saved working tree") + build_maps = {} + for kind, target in (("gui", "arcadia-studio"), ("checker", "process_multiselect_native")): + recorded, b = prepared[kind], spec["builds"][kind] + result, began, process = [obj(b[n]) for n in ("result.json", "started.json", "process.json")] + need(pin(raw(b["result.json"])) == recorded["receiptPin"] and relative(recorded["receipt"], prepared["cwd"]) == b["originalRelative"], "build receipt mapping") + need(all(result.get(k) == v for k, v in began.items()) and process["command"] == result["command"] and type(process["pid"]) is int and process["pid"] > 0, "build start/result/process") + need(result["exitCode"] == 0 and result["inputsUnchanged"] is True and ordered(result["start"], process["observed"], result["finish"], generation["start"]), "successful preceding build") + for stream in ("stdout", "stderr"): + need(pin(raw(b[stream + ".log"])) == result[stream], "build log pin") + need(pin(raw(b["helper"])) == result["helper"], "build helper pin") + need(pin(raw(b["inputs.json"])) == recorded["inputs"] == result["inputs"], "build source map pin") + inputs = obj(b["inputs.json"]) + need(len(inputs) == result["inputCount"] and all(safe(name) for name in inputs), "source map count/paths") + capsule = raw(b["inputs.zip"]) + need(pin(capsule) == result["archive"], "build source capsule pin") + with zipfile.ZipFile(io.BytesIO(capsule)) as archive: + zip_inventory(archive, inputs) + need(all(pin(archive.read(name)) == expected for name, expected in inputs.items()), "all captured source bytes") + if kind == "checker": + path = "crates/oa-core/examples/process_multiselect_native.rs" + need(raw(spec["checkerSource"]) == archive.read(path), "historical checker source") + artifacts = [row for row in result["artifacts"] if row["cargo"]["target"]["name"] == target] + need(len(artifacts) == 1 and artifacts[0]["readback"] == recorded["pin"] and artifacts[0]["cargo"]["executable"] == recorded["binary"] and artifacts[0]["cargo"]["profile"]["test"] is False, "native executable provenance") + stdout_rows = [parsed(line) for line in raw(b["stdout.log"]).splitlines() if line.strip().startswith(b"{")] + need(artifacts[0]["cargo"] in stdout_rows, "artifact appears in raw Cargo output") + build_maps[kind] = inputs + need(prepared["gui"]["inputs"] == prepared["checker"]["inputs"] and build_maps["gui"] == build_maps["checker"], "same GUI/checker source map") + top = {name[len(prefix):] for name in members if name.startswith(prefix) and "/" not in name[len(prefix):]} + base = BASE | (top & {"history-bytes.json", "observations.md"}) + if "observations.md" in top: + raw(prefix + "observations.md") + captures = sorted(name for name in top - base if name.endswith(".json")) + need(captures, "native captures required") + expected_top = base | set(captures) + for name in captures: + capture = obj(prefix + name) + need(ordered(start["start"], capture["time"], end["finish"]), "capture lifetime") + window = capture["window"] + need(norm(window["app"]) == "process:" + norm(prepared["gui"]["binary"]) and type(window["id"]) is int and window["id"] > 0, "captured executable/window") + need(isinstance(capture["accessibility"], dict) and isinstance(capture["images"], list), "accessibility/capture payload") + for image in capture["images"]: + filename = image["file"] + need(safe(filename) and "/" not in filename and filename.startswith(name[:-5] + "-") and filename.endswith((".jpg", ".png")) and filename not in expected_top, "unique image mapping") + need(all(type(image[k]) is int and image[k] > 0 for k in ("width", "height")), "image dimensions") + expected_top.add(filename) + data = raw(prefix + filename) + need(data.startswith(b"\xff\xd8") if filename.endswith(".jpg") else data.startswith(b"\x89PNG\r\n\x1a\n"), "image signature") + need(top == expected_top, "exact top-level run files") + labels = {name[len(prefix + "snapshots/"):].split("/")[0] for name in members if name.startswith(prefix + "snapshots/")} + states, results, positive = {}, {}, [] + for label in sorted(labels): + need(re.fullmatch(r"[a-z0-9-]+", label), "snapshot label") + folder = prefix + "snapshots/" + label + "/" + began, result = obj(folder + "started.json"), obj(folder + "result.json") + need(all(result.get(k) == v for k, v in began.items()), "snapshot start/result") + need(result["prepared"] == start["prepared"] and result["checker"] == prepared["checker"] and result["helper"] == prepared["helpers"]["snapshot.py"], "snapshot provenance") + need(ordered(start["start"], result["start"], result["finish"], end["finish"]), "snapshot lifetime") + mode, command = result["mode"], result["command"] + need(mode in ("unchanged", "reordered") and len(command) == 5 and command[:3] == [prepared["checker"]["binary"], "check", mode] and norm(command[3]) == origin + "/fixture/baseline.json" and norm(command[4]) == origin + "/snapshots/" + label + "/source/" + prepared["entry"], "snapshot command") + need(result["baseline"] == pin(fixture["baseline.json"]), "snapshot baseline") + for stream in ("stdout", "stderr"): + need(result[stream] == pin(raw(folder + stream + ".log")), "snapshot log pin") + need(type(result["exitCode"]) is int and all(type(result[k]) is bool for k in ("binaryUnchanged", "workingSourceUnchanged", "snapshotUnchanged", "baselineUnchanged")), "snapshot closure") + states[label] = pinned_tree(folder + "source/", result["source"]) + need({name for name in members if name.startswith(folder)} == {folder + n for n in ("started.json", "result.json", "stdout.log", "stderr.log")} | {folder + "source/" + n for n in states[label]}, "exact snapshot files") + if result["exitCode"] == 0: + report = obj(folder + "stdout.log") + need(report["result"] == "PASS" and report["comparison"] == "complete Project equality; literal expected order" and report["mode"] == mode and report["baseline"] == command[3] and report["saved"] == command[4], "positive complete Project report") + positive.append(label) + results[label] = result + history_present = "history-bytes.json" in top + if history_present: + history = obj(prefix + "history-bytes.json") + groups = history["equalByteGroups"] + need(len(groups) == 2 and groups[0][:2] == ["baseline", "undo"] and groups[1] == ["reordered", "redo", "reopened"], "literal Process history groups") + history_labels = [label for group in groups for label in group] + need(len(history_labels) == len(set(history_labels)) and set(history_labels) == set(history["snapshots"]) and set(history_labels) <= set(positive), "history labels/positive reports") + need(history["status"] == "PASS" and history["prepared"] == start["prepared"] and history["helper"] == prepared["helpers"]["history-bytes.py"] and ordered(end["finish"], history["verified"]), "history provenance") + need(end["exitCode"] == 0 and all(end[k] is True for k in ("guiUnchanged", "checkerUnchanged", "fixtureUnchanged")), "history clean closure") + for group, mode in zip(groups, ("unchanged", "reordered")): + for label in group: + need(states[label] == states[group[0]] and results[label]["mode"] == mode and history["snapshots"][label] == pin(raw(prefix + "snapshots/" + label + "/result.json")), "literal history bytes/receipt") + need(all(results[label][k] is True for k in ("binaryUnchanged", "workingSourceUnchanged", "snapshotUnchanged", "baselineUnchanged")), "stable history snapshot") + need(len(states[label]) == history["sourceFilesPerSnapshot"], "history source count") + need(states["baseline"] == fixture_source and states["baseline"] != states["reordered"], "baseline exact and reorder changed") + changed = sorted(name for name in set(states["baseline"]) | set(states["reordered"]) if states["baseline"].get(name) != states["reordered"].get(name)) + need(changed == history["changedFilesFromBaseline"] == ["oa/behavior/process_oa_process.arcadia"], "only intended OA source changed") + sequence = [results[label] for label in ("baseline", "reordered", "undo", "redo", "reopened")] + need(all(ordered(a["finish"], b["start"]) for a, b in zip(sequence, sequence[1:])), "history chronology") + summaries[run] = {"reviewStatus": spec["reviewStatus"], "exitCode": end["exitCode"], "captures": len(captures), "snapshots": len(labels), "positiveReports": len(positive), "historyBytes": history_present} + need(used == set(members), "unreferenced package members: " + repr(set(members) - used)) + return summaries + + +def verify_package(root): + files = parsed((root / "files.json").read_bytes()) + need(set(files) == OUTER, "outer files") + for name, expected in files.items(): + need(pin((root / name).read_bytes()) == expected, "outer pin: " + name) + manifest = parsed((root / "manifest.json").read_bytes()) + with zipfile.ZipFile(root / "evidence.zip") as archive: + zip_inventory(archive, manifest["members"]) + return verify_data(manifest, archive.read) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("package", nargs="?", type=Path, default=Path(__file__).resolve().parent) + args = parser.parse_args() + print("PASS byte/receipt consistency only:", verify_package(args.package)) + print("No GUI/checker execution or native acceptance claim; see independent parent review.") diff --git a/harness/multiselect-process-evidence-20260923/preparation-run-2/.gitattributes b/harness/multiselect-process-evidence-20260923/preparation-run-2/.gitattributes new file mode 100644 index 00000000..fa1385d9 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/preparation-run-2/.gitattributes @@ -0,0 +1 @@ +* -text diff --git a/harness/multiselect-process-evidence-20260923/preparation-run-2/README.md b/harness/multiselect-process-evidence-20260923/preparation-run-2/README.md new file mode 100644 index 00000000..ca8fd614 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/preparation-run-2/README.md @@ -0,0 +1,31 @@ +# Process run-2 preparation failure + +These are the exact three files retained from +`.local/process-multiselect-native/run-2`: generation.json and its empty stdout +and stderr logs. Fixture generation exited **3221225781 (0xC0000135)** before +preparation completed. There was no GUI launch, prepared.json, started.json or +finished.json. This is a failed preparation receipt, not a native run or a +failed complete-Project comparison. + +The checker came from `native-build-2`, source commit +`b743a10d51032dc1655b94fed5e49fbbbcee83f4`. The parent diagnosed the omitted +toolchain runtime environment in its preparation shell; Windows reported the +missing-DLL status. The parent subsequently retried with that environment in +run-3 successfully. That diagnosis and retry outcome are parent observations; +the raw run-2 receipt records the exit code, executable/build pins and empty +streams, and does not record its environment or name a missing DLL. Run-3's +separate native evidence owns its acceptance claims. + +Verify with Python's standard library, using the portable sibling checks: + +```text +python -B verify.py --checks ../checks +``` + +The verifier checks exact raw/outer bytes, failed generation command and +chronology, empty stream pins, and the checker's precise build receipt, input +map and Cargo executable/readback relationship. It also checks the shared +source map against the sibling source proof for b743a10. Run the checks and +source verifiers separately for their complete gate/source verification. +No binary, capture helper or GUI is executed. Pins establish consistency, +not independent authentication or a reproduction of the environment failure. diff --git a/harness/multiselect-process-evidence-20260923/preparation-run-2/files.json b/harness/multiselect-process-evidence-20260923/preparation-run-2/files.json new file mode 100644 index 00000000..433b73d7 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/preparation-run-2/files.json @@ -0,0 +1,26 @@ +{ + ".gitattributes": { + "bytes": 8, + "sha256": "705fd4d6451a31d36b3df7de96f83f30ac976c9b4a6d1e51671d8e2f33e2d0da" + }, + "generation.json": { + "bytes": 1251, + "sha256": "a1b145327abcc8fe11a1871e1895dba4a58366e59edd7e21eda7dd971bb6106a" + }, + "generation.stderr.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "generation.stdout.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "README.md": { + "bytes": 1654, + "sha256": "774ad0e899198ab177b52e1f231d05f0b0cf953c8d8f08388b0ce3ab113e9f9c" + }, + "verify.py": { + "bytes": 6029, + "sha256": "93824a57652fad13cf780837dc19f3db0913d67893ade6ae4bc26a3569667a63" + } +} diff --git a/harness/multiselect-process-evidence-20260923/preparation-run-2/generation.json b/harness/multiselect-process-evidence-20260923/preparation-run-2/generation.json new file mode 100644 index 00000000..27badfa9 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/preparation-run-2/generation.json @@ -0,0 +1,34 @@ +{ + "start": "2026-09-23T13:29:37.155542+00:00", + "finish": "2026-09-23T13:29:37.176859+00:00", + "command": [ + "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\examples\\process_multiselect_native.exe", + "generate", + "C:\\ar-multiselect-9e8r6t\\.local\\process-multiselect-native\\run-2\\fixture" + ], + "exitCode": 3221225781, + "checker": { + "receipt": "C:\\ar-multiselect-9e8r6t\\.local\\process-group-gates\\native-build-2\\result.json", + "receiptPin": { + "bytes": 3322, + "sha256": "1df7538acda0f38b36f91d0293a7f74a5f4d308797f35b1d4dabaa7155aae23b" + }, + "binary": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\examples\\process_multiselect_native.exe", + "pin": { + "bytes": 22190080, + "sha256": "1cbafb797c9451f908d7567048ace474511a76d98129dabc635e4ee6f976367c" + }, + "inputs": { + "bytes": 124276, + "sha256": "f3fd180af294e0797f9dfdbff647274de30a907b685a4fe1a2b58027bfe7da95" + } + }, + "stdout": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "stderr": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } +} diff --git a/harness/multiselect-process-evidence-20260923/preparation-run-2/generation.stderr.log b/harness/multiselect-process-evidence-20260923/preparation-run-2/generation.stderr.log new file mode 100644 index 00000000..e69de29b diff --git a/harness/multiselect-process-evidence-20260923/preparation-run-2/generation.stdout.log b/harness/multiselect-process-evidence-20260923/preparation-run-2/generation.stdout.log new file mode 100644 index 00000000..e69de29b diff --git a/harness/multiselect-process-evidence-20260923/preparation-run-2/verify.py b/harness/multiselect-process-evidence-20260923/preparation-run-2/verify.py new file mode 100644 index 00000000..19f77dc9 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/preparation-run-2/verify.py @@ -0,0 +1,97 @@ +"""Verify a preserved failed preparation; never run its executable or helpers.""" +from pathlib import Path, PurePosixPath +from datetime import datetime +import argparse +import hashlib +import json +import stat +import zipfile + +HERE = Path(__file__).resolve().parent +COMMIT = "b743a10d51032dc1655b94fed5e49fbbbcee83f4" +FILES = {".gitattributes", "README.md", "verify.py", "generation.json", "generation.stdout.log", "generation.stderr.log"} + + +def need(ok, message): + if not ok: + raise ValueError(message) + + +def pin(data): + return {"bytes": len(data), "sha256": hashlib.sha256(data).hexdigest()} + + +def parsed(data): + def unique(items): + result = {} + for key, value in items: + need(key not in result, "duplicate JSON key") + result[key] = value + return result + return json.loads(data, object_pairs_hook=unique) + + +def safe(name): + return isinstance(name, str) and bool(name) and not PurePosixPath(name).is_absolute() and all(c not in name for c in ("\\", ":")) and all(ord(c) >= 32 for c in name) and all(p not in ("", ".", "..") for p in name.split("/")) + + +def verify(root, checks, source): + pins = parsed((root / "files.json").read_bytes()) + need(set(pins) == FILES and {p.name for p in root.iterdir()} == FILES | {"files.json"}, "exact failed-preparation files") + for name, expected in pins.items(): + need((root / name).is_file() and not (root / name).is_symlink() and pin((root / name).read_bytes()) == expected, "preserved pin: " + name) + generation = parsed((root / "generation.json").read_bytes()) + need(generation["exitCode"] == 3221225781, "original missing-DLL status") + for stream in ("stdout", "stderr"): + data = (root / ("generation." + stream + ".log")).read_bytes() + need(not data and pin(data) == generation[stream], "original empty generation stream") + recorded = generation["checker"] + outer = parsed((checks / "files.json").read_bytes()) + need(set(outer) == {"README.md", "prepare.py", "verify.py", "manifest.json", "evidence.zip"}, "checks package inventory") + for name, expected in outer.items(): + need(pin((checks / name).read_bytes()) == expected, "checks outer pin") + manifest = parsed((checks / "manifest.json").read_bytes()) + need(manifest["kind"] == "multiselect-cargo-gates", "checks kind") + with zipfile.ZipFile(checks / "evidence.zip") as archive: + need(len(archive.namelist()) == len(set(archive.namelist())) and set(archive.namelist()) == set(manifest["members"]), "checks archive inventory") + for row in archive.infolist(): + need(safe(row.filename) and not row.is_dir() and not stat.S_ISLNK(row.external_attr >> 16), "unsafe checks archive member") + def raw(name): + member = manifest["logicalFiles"]["cargo/native-build-2/" + name] + data = archive.read(member) + need(pin(data) == manifest["members"][member], "checks member pin") + return data + result_bytes, input_bytes = raw("result.json"), raw("inputs.json") + result = parsed(result_bytes) + need(recorded["receiptPin"] == pin(result_bytes), "exact checker build receipt") + need(recorded["inputs"] == result["inputs"] == pin(input_bytes), "same exact checker input map") + need(len(parsed(input_bytes)) == result["inputCount"] == 742, "complete Process source count") + need(result["head"] == COMMIT and result["exitCode"] == 0 and result["inputsUnchanged"] is True, "successful b743 checker build") + need(recorded["receipt"].replace("\\", "/") == result["cwd"].replace("\\", "/") + "/.local/process-group-gates/native-build-2/result.json", "original receipt path") + rows = [row for row in result["artifacts"] if row["cargo"]["target"]["name"] == "process_multiselect_native"] + need(len(rows) == 1 and rows[0]["readback"] == recorded["pin"] and rows[0]["cargo"]["executable"] == recorded["binary"] and rows[0]["cargo"]["profile"]["test"] is False, "exact native checker artifact") + stdout = raw("stdout.log") + need(pin(stdout) == result["stdout"], "checker build log pin") + cargo_rows = [parsed(line) for line in stdout.splitlines() if line.startswith(b"{")] + need(rows[0]["cargo"] in cargo_rows, "actual Cargo output artifact") + command = generation["command"] + need(len(command) == 3 and command[:2] == [recorded["binary"], "generate"] and command[2].replace("\\", "/") == result["cwd"].replace("\\", "/") + "/.local/process-multiselect-native/run-2/fixture", "exact failed generation command") + times = [datetime.fromisoformat(t) for t in (result["start"], result["finish"], generation["start"], generation["finish"])] + need(all(t.utcoffset() is not None for t in times) and times == sorted(times), "build then failed generation chronology") + source_pins = parsed((source / "files.json").read_bytes()) + for name in ("manifest.json", "source-core-3.json"): + need(pin((source / name).read_bytes()) == source_pins[name], "source proof pin") + spec = parsed((source / "manifest.json").read_bytes())["runs"]["core-3"] + proof_bytes = (source / "source-core-3.json").read_bytes() + proof = parsed(proof_bytes) + need(spec["receiptPin"] == pin(proof_bytes) and spec["commit"] == proof["commit"] == COMMIT and spec["inputMap"] == proof["inputMap"] == recorded["inputs"], "same b743 source proof") + return {"preparationExit": generation["exitCode"], "hexExit": hex(generation["exitCode"]), "checkerBuild": "native-build-2", "sourceCommit": COMMIT, "guiLaunch": False} + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("package", nargs="?", type=Path, default=HERE) + parser.add_argument("--checks", type=Path) + parser.add_argument("--source", type=Path) + args = parser.parse_args() + print("PASS preserved failed-preparation consistency:", verify(args.package, args.checks or args.package.parent / "checks", args.source or args.package.parent / "source")) diff --git a/harness/multiselect-process-evidence-20260923/reviews/.gitattributes b/harness/multiselect-process-evidence-20260923/reviews/.gitattributes new file mode 100644 index 00000000..fa1385d9 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/reviews/.gitattributes @@ -0,0 +1 @@ +* -text diff --git a/harness/multiselect-process-evidence-20260923/reviews/README.md b/harness/multiselect-process-evidence-20260923/reviews/README.md new file mode 100644 index 00000000..4e20e0fb --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/reviews/README.md @@ -0,0 +1,15 @@ +# Historical Process return/navigation reviews + +The two Markdown reports are byte-for-byte copies of the independent delegated +reviews `.local/process-return-review.md` and `.local/process-return-review-2.md`, +written on 2026-09-23 against successive working diffs over b153451. They record +static source inspection, findings, correction assessment and remaining test +gaps at those checkpoints. They did not execute Cargo or native UI and are not +acceptance receipts for the final source. + +Review 1 identified the invalid nonprimary menu test setup and retained qualified +identity during explicit local navigation. Review 2 assessed the broader fix +and distinguished protective test gaps from demonstrated defects. Preserve +their historical wording; subsequent gate/source/native evidence establishes +what was tested later. files.json pins both exact copied reports and this +provenance note. The [native run-3 review](process-native-review-3.md) is a portable copy with only archive-link formatting adapted; the original review hash is recorded in it. [Parent observations](run-3-observations.md) describe the actual input sequence. The four browseable screenshots under `images/` are exact copies of their native archive members. The review identifies a remaining routing readability defect, not a model-corruption result. diff --git a/harness/multiselect-process-evidence-20260923/reviews/files.json b/harness/multiselect-process-evidence-20260923/reviews/files.json new file mode 100644 index 00000000..95e4521a --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/reviews/files.json @@ -0,0 +1,42 @@ +{ + ".gitattributes": { + "bytes": 8, + "sha256": "705fd4d6451a31d36b3df7de96f83f30ac976c9b4a6d1e51671d8e2f33e2d0da" + }, + "images/run-1/26-back-to-caller-0.jpg": { + "bytes": 166409, + "sha256": "a74368cc8ce4ad3ffb397b8ad3fc88349220635320bfe7458f29a980e033dcfe" + }, + "images/run-3/16-exact-qualified-back-0.jpg": { + "bytes": 129288, + "sha256": "dd32a1faceb0dcda161fce7b614ed554ad97d85471b01f09faeea319255bb7fc" + }, + "images/run-3/36-group-primary-c-0.jpg": { + "bytes": 137655, + "sha256": "8ba0c813893e00371ac34af5231b48e82f5b25b60c5797f4e618df7a1dab462f" + }, + "images/run-3/39-group-reordered-0.jpg": { + "bytes": 139094, + "sha256": "3f967cd523085ba01607ec33ff30e908480ed1847e2688b2b28b896f43d5c0c9" + }, + "process-native-review-3.md": { + "bytes": 7040, + "sha256": "dacf078c1f3e9e669fd93bb13949851e7e2c54a9ff3e66a559c34308646af86c" + }, + "process-return-review-2.md": { + "bytes": 4489, + "sha256": "65dfd4dd26c492fc32c9c8abecea299648c560eb69ff4f73438f77302e63c4b8" + }, + "process-return-review.md": { + "bytes": 3903, + "sha256": "a2da6b641e594438b94194664a3d44ef1d07c28d080d25fc4252d45d199e5dfe" + }, + "README.md": { + "bytes": 1324, + "sha256": "ba2beda41d8e3af88e2830280364dc4791f48e159f445c99716cc2e2d32a5b76" + }, + "run-3-observations.md": { + "bytes": 5124, + "sha256": "d5bccef8f0492e180aaa71d0d470c461d571c6ce3ad2c2fbd43c63762af43cac" + } +} diff --git a/harness/multiselect-process-evidence-20260923/reviews/images/run-1/26-back-to-caller-0.jpg b/harness/multiselect-process-evidence-20260923/reviews/images/run-1/26-back-to-caller-0.jpg new file mode 100644 index 00000000..fca7a491 Binary files /dev/null and b/harness/multiselect-process-evidence-20260923/reviews/images/run-1/26-back-to-caller-0.jpg differ diff --git a/harness/multiselect-process-evidence-20260923/reviews/images/run-3/16-exact-qualified-back-0.jpg b/harness/multiselect-process-evidence-20260923/reviews/images/run-3/16-exact-qualified-back-0.jpg new file mode 100644 index 00000000..eddf2f83 Binary files /dev/null and b/harness/multiselect-process-evidence-20260923/reviews/images/run-3/16-exact-qualified-back-0.jpg differ diff --git a/harness/multiselect-process-evidence-20260923/reviews/images/run-3/36-group-primary-c-0.jpg b/harness/multiselect-process-evidence-20260923/reviews/images/run-3/36-group-primary-c-0.jpg new file mode 100644 index 00000000..32caa791 Binary files /dev/null and b/harness/multiselect-process-evidence-20260923/reviews/images/run-3/36-group-primary-c-0.jpg differ diff --git a/harness/multiselect-process-evidence-20260923/reviews/images/run-3/39-group-reordered-0.jpg b/harness/multiselect-process-evidence-20260923/reviews/images/run-3/39-group-reordered-0.jpg new file mode 100644 index 00000000..5bd02c3b Binary files /dev/null and b/harness/multiselect-process-evidence-20260923/reviews/images/run-3/39-group-reordered-0.jpg differ diff --git a/harness/multiselect-process-evidence-20260923/reviews/process-native-review-3.md b/harness/multiselect-process-evidence-20260923/reviews/process-native-review-3.md new file mode 100644 index 00000000..f28bced6 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/reviews/process-native-review-3.md @@ -0,0 +1,39 @@ +# Independent Process native review — run 3 + +Reviewed on 2026-09-23, read-only. Directly inspected run-3 images 12–23, 27–44 and 49–52, and run-1 frame 26. No source edits, builds, UI actions, commits or publication. The native window captures are 1442×932 including Windows chrome, with Process zoom 100%; this review does not generalize to other display sizes. + +Capture paths below are members of [native/evidence.zip](../native/evidence.zip). Only link formatting was adapted for this portable copy; original review SHA-256: `bbe98aa59fa9000cb612843dd2a6f5e33692a19512de32cd0baff5ff059b3a69`. + +## Result + +**No new selection, primary, qualified-return, group-order or saved-state blocker found in the reviewed evidence.** The run-1 Inspector mismatch is visibly corrected. There remains a concrete routing readability problem after reorder, described separately below; do not call routing fully accepted. + +## Visible evidence + +- 12 first qualified (`runs/run-3/raw/12-first-qualified-0.jpg`) selects Shared detail inside First use. 13 nonprimary menu (`runs/run-3/raw/13-nonprimary-menu-0.jpg`) addresses Shared detail inside Second use while First use remains selected. 14 definition (`runs/run-3/raw/14-nonprimary-definition-0.jpg`) shows the local Shared detail editor with alias `reused_leaf`. +- 16 exact Back (`runs/run-3/raw/16-exact-qualified-back-0.jpg`) and 17 (`runs/run-3/raw/17-caller-tree-expanded-0.jpg`) return to the Second use's inner Shared detail tile, with the exact Second use path in Details, Shared detail as Properties subject and a read-only Inspector. The outer card is not simultaneously highlighted. In contrast, run-1 frame 26 (`runs/run-1/raw/26-back-to-caller-0.jpg`) shows both inner/outer outlines and the editable Second use Inspector despite qualified Details. +- 18 explicit outer (`runs/run-3/raw/18-explicit-outer-properties-0.jpg`) deliberately selects Second use: outline, Properties label and editable Inspector name/alias `reference_two` agree. 19–21 (`runs/run-3/raw/21-current-back-readonly-0.jpg`) show current-qualified Open and Back again returning to read-only Shared detail. 22 same-leaf Explorer navigation (`runs/run-3/raw/22-explorer-same-leaf-definition-0.jpg`) changes to Reusable request detail and restores the editable local `reused_leaf` Inspector. Card bounds/100% scale are stable across equivalent caller states; no visual camera jump is apparent. +- 29 mixed selection (`runs/run-3/raw/29-mixed-selected-0.jpg`) displays two selected, Card A as member and A→U link as primary, with the link Inspector. 30 refusal (`runs/run-3/raw/30-mixed-refused-0.jpg`) retains those identities/positions and presents the readable status: “Reorder requires local contribution cards only; links cannot move with them.” Saved frame 31 preserves that display. +- 32 C (`runs/run-3/raw/32-card-c-0.jpg`), 33 Add A (`runs/run-3/raw/33-card-a-menu-0.jpg`), 34 primary A (`runs/run-3/raw/34-group-primary-a-0.jpg`), 35 Inspect C (`runs/run-3/raw/35-group-menu-c-0.jpg`) and 36 primary C (`runs/run-3/raw/36-group-primary-c-0.jpg`) provide consistent membership/count and primary feedback. Inspect changes the primary to C without dropping A. The menu fits and its unavailable Hide/group-delete explanations are visible. +- 37 selected anchor (`runs/run-3/raw/37-selected-anchor-0.jpg`) / 38 saved (`runs/run-3/raw/38-anchor-saved-0.jpg`) retain A/B/C order and primary C. 39 reordered (`runs/run-3/raw/39-group-reordered-0.jpg`) / 40 saved (`runs/run-3/raw/40-reordered-saved-0.jpg`) show B/A/C, U/V still in their original right-column slots, count two and primary C. This is consistent with source-order A,C despite selection C then A. 41 Undo (`runs/run-3/raw/41-one-undo-0.jpg`) returns A/B/C; 43 Redo (`runs/run-3/raw/43-one-redo-0.jpg`) restores B/A/C; primary C/count stay visible. Actions themselves were observed by the parent, not by this reviewer. +- 49 reopen (`runs/run-3/raw/49-reopened-0.jpg`), 50 Behavior (`runs/run-3/raw/50-reopened-behavior-0.jpg`), 51 order (`runs/run-3/raw/51-reopened-order-0.jpg`) and 52 saved (`runs/run-3/raw/52-reopened-saved-0.jpg`) show the reopened project and B/A/C order with zero selected. The process Inspector agrees with the newly selected process. The Explorer tooltip temporarily covers part of Card A's title in 51/52; this is transient pointer feedback, not missing content. + +## Concrete remaining visual issue + +In reordered frames 39/40/43/44/51/52, the two orthogonal A→U and B→V routes overlap along their shared middle x-coordinate and horizontal segments. Portions of the central vertical path appear interrupted, and the resulting picture can be read as B→U and A→V without carefully tracing the bends. Card titles and primary outlines remain readable, but endpoint connectivity is not reliably legible from this drawing. This is consistent with the parent's existing routing issue #32; I have not independently established its source-level attribution. The complete-Project checker establishes unchanged link records separately, so this should not be reported as group reassignment or source corruption, nor hidden by a blanket “visual pass.” + +## Receipt cross-check, independent of screenshots + +Read history-bytes.json (`runs/run-3/raw/history-bytes.json`), all eight `snapshots/*/result.json` and checker stdout/stderr, plus the actual ten saved source files for each snapshot. Independently recomputed SHA-256/size pins and confirmed: + +- All eight pinned checker receipts/logs/source maps match actual bytes; each checker reports PASS for complete Project equality against literal expected order and exits zero with unchanged baseline/checker/snapshot flags. +- Baseline = undo = qualified-navigation = mixed-refusal = anchor-noop across all ten source files. +- Reordered = redo = reopened across all ten source files. +- Only `oa/behavior/process_oa_process.arcadia` differs between baseline and reordered. +- finished.json (`runs/run-3/raw/finished.json`) records normal exit 0 at `2026-09-23T13:43:54.209222+00:00`; both actual application logs are empty and match their recorded pins. GUI/checker/fixture unchanged flags are true. + +The launch receipt records matching GUI/checker input-map pin `f3fd180af294e0797f9dfdbff647274de30a907b685a4fe1a2b58027bfe7da95`; the parent identifies this run with `b743a10`. This review did not independently repeat commit-to-build source identity proof or rerun the checker executable. + +## Limits + +Screenshots establish visible states, not exact model equality, action counts or Undo stack depth. Those conclusions rely respectively on the checker/source readbacks and the parent's observed single Undo/Redo actions. Frames 37/39 are post-action states; they do not establish native mid-drag insertion-line/count feedback (separate WGPU evidence exists). No new evidence here for SA native interaction, keyboard Shift behavior, dirty/stale guards, Escape/out-and-back, other DPI, accessibility contrast, performance or routing correctness beyond the concrete issue above. diff --git a/harness/multiselect-process-evidence-20260923/reviews/process-return-review-2.md b/harness/multiselect-process-evidence-20260923/reviews/process-return-review-2.md new file mode 100644 index 00000000..2b2fa76a --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/reviews/process-return-review-2.md @@ -0,0 +1,27 @@ +# Process return/navigation review 2 + +Read-only review on 2026-09-23 of the working diff over `b153451` in `app.rs`, `app/process_canvas.rs`, `app/process_multiselect.rs` and its tests. No source edits, Cargo, GUI, or native input. This is a correctness review, not runtime acceptance. + +## Finding + +**No concrete regression found in the reviewed fix.** The previous editable-outer-Inspector failure is addressed at its source: Back restores the validated address's actual occurrence, then reconciles exact selection and explicitly refreshes the primary Inspector. It no longer relies on ordinary object navigation or on matching the outer reference ID to an address. + +The new tests cover primary/nonprimary qualified Open and Back, exact invocation path, singleton returned selection, leaf Inspector read-only enforcement, camera/source/history stability, ordinary Select/EditProperties to both the outer reference and same-ID defining leaf, and local-reference Open after qualified inspection. These are assertions in reviewed source; I did not run them. + +## Interaction checks + +- `App::select` captures preview status before changing owner/selection. Same semantic ID is no longer an early-return when it denotes a qualified preview. Context/focus clearing occurs after `apply()` and existence admission. Existing cross-layer selection still sets layer/diagram, fits and updates the selected behavior owner through the unchanged path. +- `OpenQualified` records the requested resolved address before saving the frame, rather than relying on previous primary. Clearing the live address after saving leaves the frame's address intact. For same-ID current-preview Open, the outer update's existing `preview_read_only` refresh restores a definition draft even if `select` returns early after the owner has already changed. +- Local Open clears the old qualified address before `remember`, so ordinary Back restores a local occurrence rather than inheriting a prior preview. Its new test explicitly covers this. +- `State::back` validates a surviving return route/address and restores camera/expansion state. The App now selects its validated actual subject; `inspect_process_multiselect_primary` clears stale node/bend/attachment/navigation-focus state and restores qualified context only from the exact selected endpoint. +- Usage focus has precedence during reconciliation, but the normal update retires focus as soon as its surface/selected identity becomes invalid on definition navigation. The final inspect clears it again. I found no reachable stale caller-focus override in the reviewed Open→Back path. Existing preview-link usage tests exercise distinct invocation identities, though not this return sequence. +- The Back/Open `apply()` guard remains before frame/context mutation. This preserves the existing policy of applying valid dirty property drafts and refusing pending behavior/source or invalid property edits. It is not a new blanket prohibition on dirty property navigation. +- Qualified resolution enforces identical sequence kind and layer (`topology_context::resolve_path`), so successful qualified Back cannot require a cross-layer restoration that the new direct assignment forgot. Ordinary generic cross-layer navigation still goes through `select`. + +## Focused missing regression coverage + +The principal gap is **refused navigation at the newly sensitive same-ID boundary**. Add a test starting from a qualified preview with a dirty source draft: send `Select(leaf)` and `EditProperties(leaf)`, and assert exact owner, address, selection/primary, read-only draft, camera, source draft/cursor, and history preservation. Also open a definition, make its property draft invalid, attempt Back, then revert and Back again: the first attempt must leave the return frame available and the second must restore the exact invocation. The static guard ordering appears correct, so this is a missing protective test, not a demonstrated bug. + +A smaller extension is generic same-ID navigation from `ProcessPreviewLink`, preferably after a diagram-usage focus. The shared `process_preview_primary` path includes links, but the new generic navigation matrix tests only occurrences. Verify local defining-link selection and editable draft after navigation. Existing tests establish preview-link identity/readonly display, not this transition. + +Native pointer/menu/rebuild behavior, focused compile/test results, and final screenshot acceptance remain the parent's separate evidence. diff --git a/harness/multiselect-process-evidence-20260923/reviews/process-return-review.md b/harness/multiselect-process-evidence-20260923/reviews/process-return-review.md new file mode 100644 index 00000000..90f892b4 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/reviews/process-return-review.md @@ -0,0 +1,21 @@ +# Process qualified return review — 2026-09-23 + +Scope: static review of the two-file working diff over `b153451`, plus the existing return-frame, selection reconciliation and menu code. No production edits, Cargo, or GUI execution. The parent owns the running gate and native acceptance. + +## Findings + +1. **Concrete new test error:** `app/process_multiselect/tests.rs:676` creates a two-member group containing `second_target`, then in the nonprimary case requests its menu action “Open referenced definition.” `model_menu.rs:312` returns the selected-group menu before the qualified-open action is added. Therefore the `menu` helper cannot find that action and panics. Keep the invoked target unselected while a different qualified target is primary (optionally add a local card), or dispatch captured `OpenQualified` directly and retain a separate actual-menu case. Do not expose a new group menu action merely to satisfy this fixture. + +2. **Concrete adjacent identity mismatch remains in generic local navigation:** choose qualified `[R]/leaf`, then send `Message::Select(R)` from Explorer, or `EditProperties(R)`. `App::select` changes `selected` to R and builds its editable draft without clearing the qualified address. `reconcile_process_multiselect` accepts the address when `references.first() == selected`, so it retains the qualified leaf target. The result is the same class of disagreement: leaf highlight with editable R properties. This path predates the proposed Back fix; it is not a new regression caused by the two-file patch. Expected explicit local navigation is local R primary with its own editable draft and no retained qualified address. Add this minimal case before claiming that return/selection identity is generally reconciled. The outer-reference compatibility condition should be confined to return-frame reconstruction, not ordinary selection admission. + +## Product patch assessment + +- Seeding `resolved.address` immediately before `remember` in `app/process_canvas.rs:131` correctly records the requested qualified invocation when opening a nonprimary context target. The previous primary cannot substitute its reference path. +- Back now reconciles the restored caller scope and inspects its exact primary (`app/process_canvas.rs:226`). This repairs the observed native case: return ID is the outer reference, restored address identifies the qualified leaf, and inspection changes the semantic subject to that leaf with `draft=None` before the next render. +- Ordinary Open/Back with no qualified address continues to reconcile to the local reference and leaves its properties editable. Existing ordinary App and mounted camera-return tests exercise that simpler path (`app/process_canvas.rs:666`, `behavior/topology/layout_tests.rs:805`); this review did not rerun them. A stale qualified address from the generic-navigation finding deserves the additional ordinary-open regression case. +- The new calls do not modify pan/zoom/fit/viewport. Those remain restored by `State::back`; the added inspection clears only selection context/focus and rebuilds properties. Dirty-draft/source/behavior refusal still runs before Back, so this patch does not introduce an unapplied-draft discard path. +- Returning clears the departed surface's group and selects the invoked caller target alone, consistent with surface-scoped selection. The patch does not promise to restore the entire earlier group. Preview-link OpenQualified still transports its source endpoint, so this review does not establish restoration of the exact link selection. + +## Gate implications + +Correct the test setup, retain the ordinary return/camera checks, and add qualified-to-explicit-local navigation coverage. Native rerun must verify caller path, primary, inspector read-only state, camera and saved Project/source together. Static reasoning here is not a passing gate or native acceptance receipt. diff --git a/harness/multiselect-process-evidence-20260923/reviews/run-3-observations.md b/harness/multiselect-process-evidence-20260923/reviews/run-3-observations.md new file mode 100644 index 00000000..b68218b0 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/reviews/run-3-observations.md @@ -0,0 +1,28 @@ +# Process native run 3 — parent observations + +Root operated the Windows app through Computer Use on 2026-09-23. Source b743a10d51032dc1655b94fed5e49fbbbcee83f4; matching captured GUI/checker builds windows-build-2/native-build-2. Production is unchanged from ff712b24190342363d0275467e96f181872da6ad. This run followed a preparation-only run-2 failure; no GUI launched in run 2. Review screenshots with the same-numbered accessibility/time JSON, prepared/start/finish records, and snapshots. Native acceptance below is the parent's observed workflow judgment, separate from automated receipt consistency. + +## Observed actions and outcomes + +- 01–11: launched, opened the generated run-3 working source, selected Behavior, saved baseline. The Open dialog's accessibility click did not dismiss it; fresh window selection and screenshot-grounded coordinate Open did. UIA reports Search Box focus although the visible filename caret/text is correct. No app failure is inferred from that automation mismatch. +- 12–16: selected first invocation's Shared detail; right-clicked second invocation's tile and explicitly opened its definition while it was nonprimary. Actual defining leaf became editable. Back restored the second qualified tile alone, Shared detail read-only Properties, exact Second use → Shared detail breadcrumb, and caller camera. Outer card was not primary/highlighted. This corrects run-1 frame 26. +- 17–18: Explorer selection of the outer Second use changed to its local editable inspector and outer-card highlight; the qualified leaf was no longer primary. +- 19–21: selected the second leaf and used inspector Open referenced definition, then Back. Current-primary return again restored exact second leaf and read-only Properties. +- 22–23: Explorer selection of the same-ID Shared detail while in preview navigated to its defining owner and editable local inspector. Saved complete Project remained unchanged. +- 24–27: returned to OA group order, selected Card A. Frame 26 tool output was truncated; frame 27 reobserved before further input. +- 28–31: context Add included A-to-U link with Card A, count 2, link primary. Drag A after B was refused with the explicit local-cards-only explanation. Membership, primary, camera and order remained unchanged. Saved Project unchanged. +- 32–36: clicked C, context Add A, then context Inspect this element on C. Count stayed 2; A secondary blue and C primary teal, Properties Card C. Selection order was C then A, contrary to source A then C. +- 37–38: dragged C onto selected A's lower half. Order, count and primary remained unchanged; saved Project unchanged. +- 39–40: dragged C from (420,620) after B at (420,529). Left column became B,A,C; right column U,V unchanged. Count 2, C primary and A secondary persisted; camera stayed 100%. Status reported two contributions reordered. This discriminates against singleton pressed/primary C, whose valid same-column move after B would leave the original order. Saved complete Project matches literal [B,U,A,V,C], with all other model records identical. +- 41–42: exactly one Ctrl+Z restored A,B,C and original complete Project; selection and primary stayed stable. Saved Undo snapshot. +- 43–44: exactly one Ctrl+Y restored B,A,C and the reordered complete Project. Saved Redo snapshot. +- 45–52: opened the exact run-3 working project again in the same process, returned to Behavior/OA group owner, observed B,A,C and U,V, and saved. Transient selection cleared on reopening. Reopened complete Project matches reordered. +- Closed via Alt+F4; launch wrapper finished 13:43:54.209222Z, exit 0, empty stdout/stderr, binaries and immutable fixture unchanged. + +## Independent saved-model and byte checks + +Eight complete-Project checks passed: baseline, qualified-navigation, mixed-refusal, anchor-noop and undo equal the immutable baseline; reordered, redo and reopened equal the literal expected Project. `history-bytes.json` passes ten files per snapshot: fixture/baseline/undo/three unchanged extras are byte-identical; reordered/redo/reopened are byte-identical. Only `oa/behavior/process_oa_process.arcadia` changes across the two groups. These checks do not infer gestures, focus, selection, read-only state or one-step history; the observed actions above supply that evidence. + +## Scope and limitations + +Accepted for the observed Windows OA workflow at 1442×932 and 100% zoom. Context Add/Inspect was used; native held Shift was not exercised. Drag API executes a whole gesture, so held-motion line readability comes from the separate actual-WGPU mounted OA/SA capture. Native SA reorder, alternate DPI/minimum window, full accessibility, aggregate deletion, Allocation/Scenario adapters and Linux are not established. Run 1's qualified drag/Delete refusal is historical b153 evidence, supported by final focused/full tests; it was not repeated here. Existing crossing/routing appearance after reordered rows is visible and is not claimed repaired by this change (routing tracked separately in issue 32). This is branch-specific verification, not combined integration or release acceptance. diff --git a/harness/multiselect-process-evidence-20260923/source/.gitattributes b/harness/multiselect-process-evidence-20260923/source/.gitattributes new file mode 100644 index 00000000..fcadb2cf --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/source/.gitattributes @@ -0,0 +1 @@ +* text eol=lf diff --git a/harness/multiselect-process-evidence-20260923/source/README.md b/harness/multiselect-process-evidence-20260923/source/README.md new file mode 100644 index 00000000..28ff4dff --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/source/README.md @@ -0,0 +1,21 @@ +# Process source identity tools + +Adapted from the State source package. The Git comparator retains its exact filtered `ls-tree` inventory and `cat-file --batch` blob-byte comparison, with `GIT_NO_LAZY_FETCH=1`. Process scope always contains 742 inputs, including all 71 vendored files and both explicit compile-time fixtures. Commit IDs must be full, explicit IDs already available locally; neither captured HEAD, timestamps nor the current working tree substitutes for comparison. + +Validate completed raw captures without writing: + +```powershell +python -B prepare.py --repo CHECKOUT --raw-gates CHECKOUT/.local/process-group-gates --gate full-desktop-1 1711bff650dabb1df3a9bc37f19060d5db297feb --gate lint-2 b15345123a7feaf630ef24d45f591c76c6715778 --check-only +``` + +For the final gate, append `--gate full-desktop-2 FULL_FINAL_COMMIT` only after its result exists and the exact final source commit is available. No final commit is guessed or hardcoded. Other completed gates may be named explicitly. Failed, missing, changed-input or mismatching source gates refuse. + +For portable preparation, supply the completed Process `--checks CHECKS_PACKAGE`, remove `--check-only`, and add `--output NEW_SOURCE_PACKAGE`. `--raw-gates` may be omitted when using the package; supplying both requires their selected captured maps/results/archives to be equal. The output is create-only. Preparation validates all captures and Git comparisons before writing pinned manifest, newly generated source receipts, tools and files.json, then performs portable readback. Existing historical receipt files are neither consumed nor rewritten. + +```powershell +python -B SOURCE_PACKAGE/verify.py --checks CHECKS_PACKAGE --repo CHECKOUT +``` + +Without `--repo`, verification validates pinned receipt/map relationships and sibling archived source capsules, but explicitly reports that Git comparison was not rerun. The sibling defaults to ../checks. The checks package must use the existing `multiselect-cargo-gates` schema. All outer/member byte pins, exact ZIP inventory and source capsule mappings are checked; selected nested source archives are checked byte-for-byte against their maps. Run the sibling checks verifier separately for complete helper/process/stream relationships. No archived executable/helper is run or extracted. + +`manifest.json` pins the explicitly selected run/commit/map/count/fixture/receipt relationships; files.json pins all package bytes. These are consistency evidence, not independent authentication, hermetic build proof, native usability or release acceptance. Package source checks should be run with `python -B` to avoid an extra __pycache__ directory violating exact package inventory. diff --git a/harness/multiselect-process-evidence-20260923/source/files.json b/harness/multiselect-process-evidence-20260923/source/files.json new file mode 100644 index 00000000..c6fcf7e9 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/source/files.json @@ -0,0 +1,38 @@ +{ + ".gitattributes": { + "bytes": 14, + "sha256": "a79691a93b46e49ce460c26ef22afcc03d6eca1e63bf2edbc20e96159510f6c9" + }, + "README.md": { + "bytes": 2695, + "sha256": "7f20dc17395af4d5f7e08c2873788de9e6dffd0d0401b11efd8a9987cb78bdac" + }, + "manifest.json": { + "bytes": 2462, + "sha256": "d4a958402395d806e037dcb236e2460329db42003e72d958939133a049da8bb4" + }, + "prepare.py": { + "bytes": 3493, + "sha256": "da6a1c8da417b3caf5ba44a0848cbfd64e6d299ccf2d16f3e7ae742eed69f1c6" + }, + "source-core-3.json": { + "bytes": 570, + "sha256": "c0ad71de62a092df89c851c2be6e466c1f24932e43db1b8a7a2b188401ec12cf" + }, + "source-feedback-1.json": { + "bytes": 574, + "sha256": "b8688707c7661d22858b2b799f6c671509f8a438069085790a2e43f0fee4aa22" + }, + "source-full-desktop-1.json": { + "bytes": 578, + "sha256": "7f2f7675dc11e649a3ac3e3ee834a7dc135436747feaa789d4d7c89c41300d73" + }, + "source-full-desktop-2.json": { + "bytes": 578, + "sha256": "7d34865d642f40c865ff69be1c7d744bf1660dd8f5e7a7d421d3f05c45bd446a" + }, + "verify.py": { + "bytes": 10094, + "sha256": "7805832d5f563ab2d7a50dd3de700792b5d6f459c68f7b1d8bcfcc9800fa0c3a" + } +} diff --git a/harness/multiselect-process-evidence-20260923/source/manifest.json b/harness/multiselect-process-evidence-20260923/source/manifest.json new file mode 100644 index 00000000..40ad5205 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/source/manifest.json @@ -0,0 +1,70 @@ +{ + "kind": "process-multiselect-source", + "runs": { + "core-3": { + "commit": "b743a10d51032dc1655b94fed5e49fbbbcee83f4", + "explicitCompileTimeFixtures": [ + "harness/experiments/edge-attachments-20260922/native-fixture.arcadia", + "harness/experiments/textual-authoring-20260911/alarm-response.arcadia" + ], + "inputCount": 742, + "inputMap": { + "bytes": 124276, + "sha256": "f3fd180af294e0797f9dfdbff647274de30a907b685a4fe1a2b58027bfe7da95" + }, + "receiptPin": { + "bytes": 570, + "sha256": "c0ad71de62a092df89c851c2be6e466c1f24932e43db1b8a7a2b188401ec12cf" + } + }, + "feedback-1": { + "commit": "b15345123a7feaf630ef24d45f591c76c6715778", + "explicitCompileTimeFixtures": [ + "harness/experiments/edge-attachments-20260922/native-fixture.arcadia", + "harness/experiments/textual-authoring-20260911/alarm-response.arcadia" + ], + "inputCount": 742, + "inputMap": { + "bytes": 124276, + "sha256": "7f5b3de4d5bb70282e424fbe90211af2ac259965aef10b05438b46076467a767" + }, + "receiptPin": { + "bytes": 574, + "sha256": "b8688707c7661d22858b2b799f6c671509f8a438069085790a2e43f0fee4aa22" + } + }, + "full-desktop-1": { + "commit": "1711bff650dabb1df3a9bc37f19060d5db297feb", + "explicitCompileTimeFixtures": [ + "harness/experiments/edge-attachments-20260922/native-fixture.arcadia", + "harness/experiments/textual-authoring-20260911/alarm-response.arcadia" + ], + "inputCount": 742, + "inputMap": { + "bytes": 124276, + "sha256": "d5acfcf62fb4efd4efaf073abcc7e671644a6086e9e6cf105a06034c4a27daf8" + }, + "receiptPin": { + "bytes": 578, + "sha256": "7f2f7675dc11e649a3ac3e3ee834a7dc135436747feaa789d4d7c89c41300d73" + } + }, + "full-desktop-2": { + "commit": "ff712b24190342363d0275467e96f181872da6ad", + "explicitCompileTimeFixtures": [ + "harness/experiments/edge-attachments-20260922/native-fixture.arcadia", + "harness/experiments/textual-authoring-20260911/alarm-response.arcadia" + ], + "inputCount": 742, + "inputMap": { + "bytes": 124276, + "sha256": "1ba4ed414b3ccbc139ad4998af77370cba994f3edf4395b80acc69d3440ccc45" + }, + "receiptPin": { + "bytes": 578, + "sha256": "7d34865d642f40c865ff69be1c7d744bf1660dd8f5e7a7d421d3f05c45bd446a" + } + } + }, + "schema": 1 +} diff --git a/harness/multiselect-process-evidence-20260923/source/prepare.py b/harness/multiselect-process-evidence-20260923/source/prepare.py new file mode 100644 index 00000000..75a1b7f5 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/source/prepare.py @@ -0,0 +1,61 @@ +"""Bind explicitly named Process gate captures to Git commits; no builds or checkouts.""" +from pathlib import Path +import argparse +import datetime +import json +import re +from verify import (HERE, TOOLS, COMPARISON, EXPLICIT_FIXTURES, need, pin, parsed, + compare_commit, verify_data, raw_captures, packaged, verify_package) + +def encode(value): + return (json.dumps(value, indent=2, sort_keys=True) + "\n").encode("utf-8") + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--repo", required=True, type=Path, help="repository containing the explicitly named full commit IDs") + parser.add_argument("--raw-gates", type=Path, help="completed raw captures; required unless --checks provided") + parser.add_argument("--checks", type=Path, help="completed portable Process checks package; required for writing") + parser.add_argument("--gate", nargs=2, action="append", required=True, metavar=("RUN", "COMMIT")) + parser.add_argument("--check-only", action="store_true") + parser.add_argument("--output", type=Path, help="new source package directory") + args = parser.parse_args() + pairs = {} + for run, commit in args.gate: + need(re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9._-]*", run) is not None, "safe gate name") + need(re.fullmatch(r"[0-9a-f]{40}", commit) is not None, "explicit full commit ID required") + need(run not in pairs, "duplicate gate") + pairs[run] = commit + need(args.raw_gates is not None or args.checks is not None, "capture input required") + captured = packaged(args.checks, pairs) if args.checks else raw_captures(args.raw_gates, pairs) + if args.checks and args.raw_gates: + need(captured == raw_captures(args.raw_gates, pairs), "raw and packaged captures differ") + specs, receipts = {}, {} + for run, commit in pairs.items(): + map_bytes, result, _archive = captured[run] + spec = {"commit": commit, "inputCount": 742, "inputMap": pin(map_bytes), + "explicitCompileTimeFixtures": sorted(EXPLICIT_FIXTURES)} + # No receipt is written until every capture and exact commit comparison passes. + receipts[run] = encode({**spec, "gate": run, "comparison": COMPARISON, + "checked": datetime.datetime.now(datetime.timezone.utc).isoformat()}) + specs[run] = {**spec, "receiptPin": pin(receipts[run])} + summary = verify_data(receipts, captured, specs, args.repo) + if args.check_only: + need(args.output is None, "--check-only does not write output") + print("PASS source check-only; no package written:", summary) + return + need(args.checks is not None and args.output is not None, "writing requires completed --checks and new --output") + out = args.output.resolve() + need(not out.exists(), "existing output refused") + payload = {name:(HERE/name).read_bytes() for name in TOOLS} + payload["manifest.json"] = encode({"schema":1, "kind":"process-multiselect-source", "runs":specs}) + payload.update({"source-"+run+".json": value for run,value in receipts.items()}) + out.mkdir(parents=True) + for name, value in payload.items(): + with (out/name).open("xb") as stream: + stream.write(value) + with (out/"files.json").open("xb") as stream: + stream.write(encode({name:pin(value) for name,value in sorted(payload.items())})) + print("PASS written package readback:", verify_package(out,args.checks), out) + +if __name__ == "__main__": + main() diff --git a/harness/multiselect-process-evidence-20260923/source/source-core-3.json b/harness/multiselect-process-evidence-20260923/source/source-core-3.json new file mode 100644 index 00000000..531f43c1 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/source/source-core-3.json @@ -0,0 +1,15 @@ +{ + "checked": "2026-09-23T13:41:55.911287+00:00", + "commit": "b743a10d51032dc1655b94fed5e49fbbbcee83f4", + "comparison": "Exact committed Git blobs equal every captured input; same complete filtered inventory", + "explicitCompileTimeFixtures": [ + "harness/experiments/edge-attachments-20260922/native-fixture.arcadia", + "harness/experiments/textual-authoring-20260911/alarm-response.arcadia" + ], + "gate": "core-3", + "inputCount": 742, + "inputMap": { + "bytes": 124276, + "sha256": "f3fd180af294e0797f9dfdbff647274de30a907b685a4fe1a2b58027bfe7da95" + } +} diff --git a/harness/multiselect-process-evidence-20260923/source/source-feedback-1.json b/harness/multiselect-process-evidence-20260923/source/source-feedback-1.json new file mode 100644 index 00000000..00f8d715 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/source/source-feedback-1.json @@ -0,0 +1,15 @@ +{ + "checked": "2026-09-23T13:41:55.910110+00:00", + "commit": "b15345123a7feaf630ef24d45f591c76c6715778", + "comparison": "Exact committed Git blobs equal every captured input; same complete filtered inventory", + "explicitCompileTimeFixtures": [ + "harness/experiments/edge-attachments-20260922/native-fixture.arcadia", + "harness/experiments/textual-authoring-20260911/alarm-response.arcadia" + ], + "gate": "feedback-1", + "inputCount": 742, + "inputMap": { + "bytes": 124276, + "sha256": "7f5b3de4d5bb70282e424fbe90211af2ac259965aef10b05438b46076467a767" + } +} diff --git a/harness/multiselect-process-evidence-20260923/source/source-full-desktop-1.json b/harness/multiselect-process-evidence-20260923/source/source-full-desktop-1.json new file mode 100644 index 00000000..c3c3fe5c --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/source/source-full-desktop-1.json @@ -0,0 +1,15 @@ +{ + "checked": "2026-09-23T13:41:55.910110+00:00", + "commit": "1711bff650dabb1df3a9bc37f19060d5db297feb", + "comparison": "Exact committed Git blobs equal every captured input; same complete filtered inventory", + "explicitCompileTimeFixtures": [ + "harness/experiments/edge-attachments-20260922/native-fixture.arcadia", + "harness/experiments/textual-authoring-20260911/alarm-response.arcadia" + ], + "gate": "full-desktop-1", + "inputCount": 742, + "inputMap": { + "bytes": 124276, + "sha256": "d5acfcf62fb4efd4efaf073abcc7e671644a6086e9e6cf105a06034c4a27daf8" + } +} diff --git a/harness/multiselect-process-evidence-20260923/source/source-full-desktop-2.json b/harness/multiselect-process-evidence-20260923/source/source-full-desktop-2.json new file mode 100644 index 00000000..56a03ee7 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/source/source-full-desktop-2.json @@ -0,0 +1,15 @@ +{ + "checked": "2026-09-23T13:41:55.911287+00:00", + "commit": "ff712b24190342363d0275467e96f181872da6ad", + "comparison": "Exact committed Git blobs equal every captured input; same complete filtered inventory", + "explicitCompileTimeFixtures": [ + "harness/experiments/edge-attachments-20260922/native-fixture.arcadia", + "harness/experiments/textual-authoring-20260911/alarm-response.arcadia" + ], + "gate": "full-desktop-2", + "inputCount": 742, + "inputMap": { + "bytes": 124276, + "sha256": "1ba4ed414b3ccbc139ad4998af77370cba994f3edf4395b80acc69d3440ccc45" + } +} diff --git a/harness/multiselect-process-evidence-20260923/source/verify.py b/harness/multiselect-process-evidence-20260923/source/verify.py new file mode 100644 index 00000000..ee355970 --- /dev/null +++ b/harness/multiselect-process-evidence-20260923/source/verify.py @@ -0,0 +1,186 @@ +"""Verify pinned Process source receipts against sibling capture capsules; optionally compare Git blobs.""" +from pathlib import Path, PurePosixPath +import argparse +import hashlib +import json +import os +import subprocess +import zipfile +import io +import stat + +HERE = Path(__file__).resolve().parent +COMPARISON = "Exact committed Git blobs equal every captured input; same complete filtered inventory" +EXPLICIT_FIXTURES = { + "harness/experiments/edge-attachments-20260922/native-fixture.arcadia", + "harness/experiments/textual-authoring-20260911/alarm-response.arcadia", +} +INCLUDE_FIXTURES = True + + +def need(ok, message): + if not ok: + raise ValueError(message) + + +def pin(data): + return {"bytes": len(data), "sha256": hashlib.sha256(data).hexdigest()} + + +def parsed(data): + def unique(items): + result = {} + for key, value in items: + need(key not in result, "duplicate JSON key: " + key) + result[key] = value + return result + return json.loads(data, object_pairs_hook=unique) + + +def safe(name): + return (isinstance(name, str) and bool(name) and "\\" not in name and ":" not in name + and not PurePosixPath(name).is_absolute() + and all(part not in ("", ".", "..") for part in name.split("/"))) + + +def relevant(path): + return (INCLUDE_FIXTURES and path in EXPLICIT_FIXTURES) or path in ("Cargo.toml", "Cargo.lock", "rust-toolchain.toml") or path.startswith( + ("crates/", "build/", ".cargo/", "scripts/", "docs/", "examples/", "harness/fixtures/", "harness/prototypes/")) + + +def git(repo, *arguments, data=None): + environment = dict(os.environ, GIT_NO_LAZY_FETCH="1") + return subprocess.run(["git", *arguments], cwd=repo, input=data, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, check=True, env=environment).stdout + + +def compare_commit(repo, commit, inputs): + need(git(repo, "rev-parse", "--verify", commit + "^{commit}").decode().strip() == commit, "named commit unavailable") + entries = git(repo, "ls-tree", "-r", "--full-tree", "-z", commit).split(b"\0") + blobs = {} + for entry in filter(None, entries): + header, path_bytes = entry.split(b"\t", 1) + path = path_bytes.decode("utf-8") + if relevant(path): + _mode, kind, oid = header.split() + need(kind == b"blob", "relevant non-blob tree entry: " + path) + need(path not in blobs, "duplicate tree path") + blobs[path] = oid + need(set(blobs) == set(inputs), "complete filtered Git inventory differs; missing=" + + repr(sorted(set(inputs) - set(blobs))) + "; additional=" + repr(sorted(set(blobs) - set(inputs)))) + # Object IDs avoid path quoting and commit:path interpretation in batch input. + paths = sorted(blobs) + data = git(repo, "cat-file", "--batch", data=b"".join(blobs[path] + b"\n" for path in paths)) + offset, actual = 0, {} + for path in paths: + end = data.index(b"\n", offset) + oid, kind, size_bytes = data[offset:end].split() + size = int(size_bytes) + need(oid == blobs[path] and kind == b"blob" and size >= 0, "Git batch object relationship") + content = data[end + 1:end + 1 + size] + need(len(content) == size and data[end + 1 + size:end + 2 + size] == b"\n", "Git batch framing") + actual[path] = pin(content) + offset = end + 2 + size + need(offset == len(data), "trailing Git batch bytes") + different = [path for path in paths if actual[path] != inputs[path]] + need(not different, "captured bytes differ from named commit: " + repr(different)) + + + +def inventory(archive, expected): + names = archive.namelist() + need(len(names) == len(set(names)) and set(names) == set(expected), "exact ZIP inventory") + for item in archive.infolist(): + need(safe(item.filename) and not item.is_dir() and not stat.S_ISLNK(item.external_attr >> 16), "safe ZIP member") + need(pin(archive.read(item.filename)) == expected[item.filename], "ZIP member pin: " + item.filename) + +def verify_data(receipts, captured, specs, repo=None): + need(set(receipts) == set(captured) == set(specs), "exact source run inventory") + for run, spec in specs.items(): + receipt_bytes = receipts[run] + need(pin(receipt_bytes) == spec["receiptPin"], run + ": exact historical receipt bytes") + receipt = parsed(receipt_bytes) + need(receipt["gate"] == run and receipt["comparison"] == COMPARISON, run + ": receipt identity") + need(all(receipt[key] == spec[key] for key in ("commit", "inputCount", "inputMap", "explicitCompileTimeFixtures")), run + ": pinned receipt relationships") + map_bytes, result, archive_bytes = captured[run] + need(pin(map_bytes) == spec["inputMap"] == result["inputs"], run + ": exact captured input map") + need(result["exitCode"] == 0 and result["inputsUnchanged"] is True, run + ": accepted unchanged gate") + inputs = parsed(map_bytes) + need(len(inputs) == 742, run + ": Process 742-input scope required") + need(len(inputs) == spec["inputCount"] == result["inputCount"], run + ": input counts") + need(spec["explicitCompileTimeFixtures"] == (sorted(EXPLICIT_FIXTURES) if INCLUDE_FIXTURES else []), run + ": exact fixture scope") + need(all(safe(name) and relevant(name) for name in inputs), run + ": input scope") + need((EXPLICIT_FIXTURES & set(inputs)) == (EXPLICIT_FIXTURES if INCLUDE_FIXTURES else set()), run + ": explicit fixture membership") + need(sum(name.startswith("crates/vendor/iced_widget/") for name in inputs) == 71, run + ": vendor count") + need(pin(archive_bytes) == result["archive"], run + ": source capsule pin") + with zipfile.ZipFile(io.BytesIO(archive_bytes)) as archive: + inventory(archive, inputs) + if repo is not None: + compare_commit(repo, spec["commit"], inputs) + print("PASS", run, spec["commit"], len(inputs), "source pins" + (" and exact Git blobs" if repo is not None else " (Git comparison not rerun)")) + return {"runs": len(specs), "gitCompared": repo is not None} + +def raw_captures(gates, specs): + return {run: ((gates/run/"inputs.json").read_bytes(), parsed((gates/run/"result.json").read_bytes()), + (gates/run/"inputs.zip").read_bytes()) for run in specs} + +def packaged(checks, specs): + files = parsed((checks/"files.json").read_bytes()) + need(set(files) == {"prepare.py", "verify.py", "README.md", "manifest.json", "evidence.zip"}, "checks outer inventory") + for name, expected in files.items(): + need(pin((checks/name).read_bytes()) == expected, "checks outer pin: " + name) + manifest = parsed((checks/"manifest.json").read_bytes()) + need(manifest["schema"] == 1 and manifest["kind"] == "multiselect-cargo-gates", "checks kind") + logical, members = manifest["logicalFiles"], manifest["members"] + need(all(safe(name) and safe(target) for name,target in logical.items()) and set(logical.values()) == set(members), "checks logical inventory") + captured = {} + with zipfile.ZipFile(checks/"evidence.zip") as archive: + inventory(archive, members) + for run in specs: + prefix = "cargo/" + run + "/" + result = parsed(archive.read(logical[prefix + "result.json"])) + spec = manifest["runs"][run] + need(all(result[key] == spec[key] for key in ("command", "head", "exitCode", "inputCount")), run + ": checks relationships") + for name in ("inputs.json", "inputs.zip"): + member = logical[prefix+name] + need(member == "capsules/" + members[member]["sha256"] + Path(name).suffix, run + ": source capsule mapping") + captured[run] = (archive.read(logical[prefix+"inputs.json"]), result, archive.read(logical[prefix+"inputs.zip"])) + return captured + + +TOOLS = {".gitattributes", "prepare.py", "verify.py", "README.md"} + +def specifications(manifest): + import re + need(manifest.get("schema") == 1 and manifest.get("kind") == "process-multiselect-source", "source manifest kind") + specs = manifest["runs"] + need(isinstance(specs, dict) and bool(specs), "nonempty explicit source run inventory") + for run, spec in specs.items(): + need(isinstance(run, str) and re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9._-]*", run), "safe source gate") + need(isinstance(spec["commit"], str) and re.fullmatch(r"[0-9a-f]{40}", spec["commit"]), "full explicit commit required") + need(spec["inputCount"] == 742 and spec["explicitCompileTimeFixtures"] == sorted(EXPLICIT_FIXTURES), "fixed Process input scope") + return specs + +def verify_package(package, checks, repo=None): + files = parsed((package/"files.json").read_bytes()) + manifest = parsed((package/"manifest.json").read_bytes()) + specs = specifications(manifest) + expected = TOOLS | {"manifest.json"} | {"source-"+run+".json" for run in specs} + need(set(files) == expected, "source outer inventory") + need({p.name for p in package.iterdir()} == expected | {"files.json"}, "source exact package inventory") + for name, value in files.items(): + need((package/name).is_file() and not (package/name).is_symlink() and pin((package/name).read_bytes()) == value, "source outer pin: " + name) + receipts = {run:(package/("source-"+run+".json")).read_bytes() for run in specs} + return verify_data(receipts, packaged(checks, specs), specs, repo) + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("package", nargs="?", type=Path, default=HERE) + parser.add_argument("--checks", type=Path, help="completed sibling checks package; default ../checks") + parser.add_argument("--repo", type=Path, help="repeat exact named-commit Git inventory/blob comparison") + args = parser.parse_args() + print("PASS source evidence:", verify_package(args.package, args.checks or args.package.parent/"checks", args.repo)) + print("No builds or archived helper execution. Run checks verifier separately for full process/log relationships.") + +if __name__ == "__main__": + main()