Merge ordinary and State multiselect into the desktop candidate
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
# Native endpoint attachment acceptance
|
||||
|
||||
This is a prepared plan, not a record of passed native checks. `native-fixture.arcadia` is a deliberately small schema-7 source fixture with 49 explicit stable UUIDs. The parent must parse and validate it with the candidate before staging a working copy. No GUI, compilation, or evaluator has been run for this preparation.
|
||||
|
||||
## Bind the run
|
||||
|
||||
Record the exact candidate commit, source/worktree cleanliness, GUI/runtime hashes, successful gate receipts, fixture hash and recipe hash. Keep an immutable baseline and a separate mutable working source; use an isolated profile. Record launch, normal close, stdout/stderr, saved checkpoints, and captures. Compile baseline and checkpoints to full typed Project values with the same pinned source evaluator. Use a baseline-derived expected Project with only the named field changes; compare the entire Project, not a JSON subset or screenshot. Source text formatting may differ after save; source must parse to the exact expected Project. Save/reopen comparisons must use the same expected Project. Preserve raw files and integer precision.
|
||||
|
||||
The fixture contains two OA activities and their one interaction, one small SA state machine, and a separate two-function semantic-port regression view. Its controller is semantic ownership, not a large canvas placement. The State view places the machine, region, and all five vertices. Two saved views per edited graph expose view-isolation failures. View 05 is separate to keep the main workflows uncluttered.
|
||||
|
||||
## Identities and geometry
|
||||
|
||||
Every ID has prefix `ea202922-0033-4000-8000-`; the twelve-digit suffix below is decimal-padded. The source file is authoritative for all fields.
|
||||
|
||||
| Object / alias | ID suffix | Purpose |
|
||||
|---|---:|---|
|
||||
| `dispatch_request` | 20 | Stored source `receive_report` (10), target `dispatch_crew` (11) |
|
||||
| `dispatch_view` / `dispatch_reference` | 100 / 101 | Edited OA view / untouched OA view |
|
||||
| `readiness` / `main_region` | 31 / 32 | Machine / region membership |
|
||||
| `start`, `ready`, `active`, `decision`, `finished` | 33–37 | Initial, two stable states, choice, final |
|
||||
| `activate` | 41 | Stored Ready source → Active target |
|
||||
| `initialize` / `finish` | 40 / 44 | Circle-source / diamond-source contour checks |
|
||||
| `refresh` / `internal_check` | 45 / 46 | External self-transition / internal row |
|
||||
| `readiness_view` / `readiness_reference` | 200 / 201 | Edited State view / untouched State view |
|
||||
| `status_exchange` / `ports_view` | 54 / 300 | Real semantic ports regression |
|
||||
|
||||
Coordinates below are **diagram coordinates**, not assumed native screen coordinates. After Fit, identify bounds and zoom/pan from actual UI; map `window = canvas origin + pan + zoom × diagram`. State canvas includes a guidance strip in its offset. Confirm painted handles before pressing; retain screenshots documenting the mapping. Source and target describe stored ends, regardless of arrow appearance.
|
||||
|
||||
| View / endpoint | Baseline attachment / contour point | Intended destination |
|
||||
|---|---|---|
|
||||
| OA `dispatch_request` source | Right 0.5 → (340,240) | Top 0.25 → (160,180) |
|
||||
| OA `dispatch_request` target | Left 0.6 → (600,252) | Bottom 0.75 → (780,300) |
|
||||
| State `activate` source | Right 0.5 → (430,270) | Top 0.25 → (250,210) |
|
||||
| State `activate` target | Left 0.6 → (570,294) | Bottom 0.75 → (750,350) |
|
||||
| State `initialize` initial source | Right 0.5 → (126,260) | Top 0.5 → (118,252) |
|
||||
| State `finish` choice source | Right 0.5 → (698,444) | Top 0.5 → (684,430) |
|
||||
| Real `status_out` / `status_in` | Right 0.5 → (340,240) / Left 0.5 → (600,240) | No attachment editing permitted |
|
||||
|
||||
For rounded corners, the quarter-width points are on the straight section. Circle and diamond checks intentionally use contour extrema with unambiguous 0.5 offsets. Native drag input may quantize to adjacent hundredths: if the intended fraction is not attained, do not change the expected oracle to match output. Repeat from the prior checkpoint using the painted geometry, or record the observed limitation and narrow the claim.
|
||||
|
||||
## OA workflow and exact expectations
|
||||
|
||||
1. Open view **01 Dispatch — edit attachments** and Fit. Select `Dispatch request` on its line. Confirm distinct endpoint handles and context actions. Save baseline checkpoint `00` before edits; full Project equals baseline B.
|
||||
2. Drag source handle from (340,240) to (160,180), inspect live preview and release. Save `01`. Expected O1 = B with **only** `diagrams[100].routes[edge20].source_attachment = {Top,0.25}`. Target sentinel `{Left,0.6}`, waypoint `(440,340)`, label `{fraction:0.5,offset:(12,-18)}`, relation description/direction, nodes and all other views remain exact.
|
||||
3. Undo and save `02`: B exactly. Redo and save `03`: O1 exactly. One Undo must remove the entire drag, not a partial movement.
|
||||
4. Drag target to (780,300), save `04`: O2 = O1 with only target `{Bottom,0.75}`. Open source and target context actions to ensure end identity is clear. Use **Reset source attachment**, save `05`: O3 = O2 with source None; preserve target, waypoint and label. Undo returns O2, redo returns O3.
|
||||
5. Start a drag, move away and return within three screen pixels of the press, then release: no source/history change. Repeat a drag canceled with Escape; repeat with right click, middle pan, wheel/camera change, focus loss, and release outside. Save a checkpoint after each meaningful cancellation; expect O3 exactly. Camera-only state is outside Project. After these checks, one Undo still reverses the last real reset (O2), showing no hidden history entry; Redo restores O3.
|
||||
6. Open view **02 Dispatch — untouched reference**: its independent target `{Bottom,0.25}` and placements remain baseline. Return to 01, save, close normally, reopen the saved working file and save `06`: O3 exactly. Confirm the saved source contains the attachment and existing waypoint/label.
|
||||
|
||||
## State workflow and exact expectations
|
||||
|
||||
Continue from saved O3 so the State trial also proves preservation of the prior OA edits. The frozen expected catalog composes State changes on O3; B remains the unchanged comparison for view 201.
|
||||
|
||||
1. Open **Rescue readiness** in Behavior / State diagram and choose **03 Readiness — edit attachments**. Check source-defined membership is visible, with Ready and Active readable and no nested hierarchy. Select `Activate`; choose **Adjust source attachment** from its actions, then drag the highlighted source to (250,210). Save `S01`: S1 = O3 with only `diagrams[200].routes[edge41].source_attachment={Top,0.25}`. Preserve target `{Left,0.6}`, waypoint `(500,310)`, label `{fraction:0.5,offset:(8,-16)}`, all semantic transitions and view 201.
|
||||
2. Undo → O3, redo → S1. Adjust target to (750,350), save `S02`: S2 adds only target `{Bottom,0.75}`. Reset target and save `S03`: S3 has target None, preserves source/bend/label. Cancel an attachment gesture with Escape and perform away-return and wheel interruption; checkpoints remain S3. View **04 Readiness — untouched reference** stays B exactly.
|
||||
3. Choose `Initialize` → **Adjust source attachment**, drag the initial circle source to (118,252), save `S04`: S4 = S3 with only route edge40 source `{Top,0.5}`. Choose `Finish` → Adjust source, drag the choice source to (684,430), save `S05`: S5 = S4 with only route edge44 source `{Top,0.5}`. Capture both painted contours; the typed checkpoint is the persistence oracle. Undo/redo each as practical. Save/normal-close/reopen final checkpoint: S5 exactly.
|
||||
4. Inspect external `Refresh: Active → Active`: both Adjust source and Adjust target must be discoverable and identify the corresponding end even on a self-transition. Inspect `Internal status check` row: it must not offer external attachment handles/actions. Do not infer every symbol was exercised from these checks.
|
||||
5. **Separate reversible reconnect trial from S5:** with Select / move, drag the selected `Activate` target handle from Active to `Dispatch decision` (or use explicitly labelled Reconnect target). Expected R1 differs from S5 only in relation41's semantic target: 35 → 36. Route presentation fields and every other relation field remain unchanged. Undo must restore S5. This distinguishes semantic reconnect from Adjust; do not mix its checkpoint with S5. If cardinality/validity blocks the trial, record it and do not claim reconnect success without a valid alternative approved against source rules.
|
||||
|
||||
## Real semantic ports regression
|
||||
|
||||
Open **05 Status — semantic ports regression**. Select the `Readiness status` functional exchange. Both attachment Move/Reset actions must be disabled or absent because source_port52 and target_port53 remain authoritative. Drag Status output to its owner's Top/0.25 position through the established port-layout interaction, then Undo. That trial may change only the emitting node's port_anchor and must restore S5 exactly on Undo; relation/source_port/target_port identities must never change. No edge-attachment record should be created by port dragging. Record UI hit selection and full saved Project, then leave this trial out of the final OA/State checkpoint.
|
||||
|
||||
## Acceptance and limits
|
||||
|
||||
Require exact full-Project checks for every named checkpoint, normal-close/reopen retention, source/target discoverability, useful previews, and cancellation without hidden history. Inspect native fit/readability and any port/label/handle overlap; reduce claim or fix defects rather than interpreting screenshots as model proof. This fixture does not establish Process/Scenario authoring support, all state symbols, every projection, promoted/folded endpoints, continuous held-motion performance, or exact camera persistence. Those require separate evidence; targeted automated tests remain complementary. Runtime source parsing/validation and native execution are pending parent gates.
|
||||
|
||||
### Prepared layout clearance correction
|
||||
|
||||
The edited State view places Ready and Active at y=210 and Startup at y=252. The reference view intentionally retains its earlier positions. Region header clearance reaches y=180 (104 + 64 + 12); the planned Ready top lead now ends at y=192 (210 - 18), above the card but below the header obstacle. This changes only the three edited-view placements; the manual waypoint (500,310), both route labels, semantic objects, and reference view are preserved. `crates/oa-core/tests/attachment_workshop.rs` validates the fixture and routes the named edited edges at every planned checkpoint. Test execution is pending the parent gate; no clear-path claim is made from static inspection alone.
|
||||
@@ -0,0 +1,3 @@
|
||||
# Preserve the exact pinned evidence and verifier bytes through Git round trips.
|
||||
* -text whitespace=cr-at-eol
|
||||
incidents/**/*.arcadia whitespace=-blank-at-eof,cr-at-eol
|
||||
@@ -0,0 +1,96 @@
|
||||
# Closed multiselect gate evidence
|
||||
|
||||
This package preserves all 19 closed captures selected from
|
||||
`.local/group-movement-gates`: 14 recorded exit 0, and five recorded exit 101.
|
||||
Every run reports unchanged captured inputs. The five failures remain failures;
|
||||
their complete original receipts and streams are included. See the separate
|
||||
[saved-view report](../../../multiselect-saved-view-20260923.md) for scope and
|
||||
native observations. These standard-library Python 3.10+ tools do not run Cargo,
|
||||
Git, archived source or executables.
|
||||
|
||||
| Run | Recorded exit | Input files |
|
||||
| --- | ---: | ---: |
|
||||
| core-1 | 0 | 722 |
|
||||
| core-2 | 101 | 729 |
|
||||
| core-3 | 0 | 729 |
|
||||
| desktop-1 | 101 | 727 |
|
||||
| desktop-2 | 101 | 728 |
|
||||
| desktop-3 | 0 | 729 |
|
||||
| desktop-4 | 0 | 729 |
|
||||
| desktop-5 | 0 | 729 |
|
||||
| format-1 | 0 | 729 |
|
||||
| format-2 | 0 | 729 |
|
||||
| lint-1 | 101 | 729 |
|
||||
| lint-2 | 0 | 729 |
|
||||
| lint-3 | 0 | 729 |
|
||||
| native-build-1 | 0 | 729 |
|
||||
| native-build-2 | 0 | 729 |
|
||||
| oracle-2 | 101 | 729 |
|
||||
| oracle-3 | 0 | 729 |
|
||||
| windows-build-1 | 0 | 729 |
|
||||
| windows-build-2 | 0 | 729 |
|
||||
|
||||
Core-3, desktop-4, format-1, lint-2, native-build-1 and windows-build-1 share the
|
||||
729-file map `55a5f354bb5049a8c77ba9bafa833438ebf754649b0cf5d175d0c8dcfcedd7bb`.
|
||||
Desktop-5, format-2, lint-3, native-build-2 and windows-build-2 share the distinct
|
||||
729-file map `99dc46645236e674244e7c4867595a6000d3d85b54bcc9ab2b0c601923ecf66c`.
|
||||
The [source identity verifier](../source/README.md) compares those maps with Git
|
||||
commits `12a7352ddef5f69a144ead8219a50916233d63a9` and
|
||||
`f6a6010baed9e6164a1fcc7ecd58256a562827d7`, respectively. Earlier maps retain
|
||||
their own evidence scope; they are not reruns against the later source.
|
||||
|
||||
To validate this exact raw run list without writing a package, from the checkout
|
||||
root run:
|
||||
|
||||
```text
|
||||
python -B harness/experiments/multiselect-20260923/checks/prepare.py --root . --runs core-1 core-2 core-3 desktop-1 desktop-2 desktop-3 desktop-4 desktop-5 format-1 format-2 lint-1 lint-2 lint-3 native-build-1 native-build-2 oracle-2 oracle-3 windows-build-1 windows-build-2 --check-only
|
||||
```
|
||||
|
||||
Missing closure, changed inputs, inconsistent receipts, unavailable exact helpers,
|
||||
and extra/unexpected run files are refused. Run names must be supplied, must be
|
||||
unique, and cannot contain path separators.
|
||||
|
||||
To create a package, use the same explicit `--runs` list, omit `--check-only`, and
|
||||
optionally supply `--output PATH`. The default output is this checks directory.
|
||||
An output package is not overwritten. `--helper PATH` can be repeated to supply
|
||||
an older gate helper whose exact pinned bytes are no longer the current helper.
|
||||
Default helper candidates are `.local/group-movement-gates/*.py`.
|
||||
|
||||
Verify a completed package anywhere, without the original checkout:
|
||||
|
||||
```text
|
||||
python -B PATH_TO_PACKAGE/verify.py
|
||||
```
|
||||
|
||||
The packager preserves the seven original files per run: started/process/result
|
||||
receipts, stdout/stderr logs, the input map, and its source ZIP. It preserves the
|
||||
exact helper bytes named by each receipt. Only byte-identical input maps and ZIPs
|
||||
are deduplicated into hash-named capsules; their per-run logical mapping remains.
|
||||
ZIP member ordering and timestamps are fixed. Raw input/log bytes are unchanged.
|
||||
|
||||
`manifest.json` records the explicit run list, outcomes, commands, recorded HEADs,
|
||||
input counts, helper paths, logical mapping and every stored member pin.
|
||||
`files.json` pins `prepare.py`, `verify.py`, this README, the manifest and archive.
|
||||
The verifier checks safe exact ZIP membership (including nested source ZIPs),
|
||||
every recorded byte count/hash, input counts, the 71 vendored iced_widget files,
|
||||
start/process/finish order, receipt relationships, unchanged-input flags, helper
|
||||
identity, and exact ordered executable-artifact records parsed from Cargo JSON
|
||||
stdout. Missing JSON artifact records remain missing; they are not synthesized
|
||||
from paths or inferred from a successful exit. Non-null artifact readback pins
|
||||
are checked structurally; executable bytes are not included or independently
|
||||
verified by this package.
|
||||
|
||||
The source capsules are **local historical input snapshots**, including captured
|
||||
uncommitted work. A recorded HEAD alone does not identify their contents. They
|
||||
are not an integrated release, a hermetic toolchain distribution, or a claim that
|
||||
one run's gate applies to a later input map. Commands, paths, PIDs, times and
|
||||
artifact hashes are historical receipts, not authenticated execution records.
|
||||
The verifier checks their internal consistency and does not access historical
|
||||
absolute paths, contact services, extract archives or rerun tests. Pin integrity
|
||||
is not an external signature or proof against coordinated receipt alteration.
|
||||
|
||||
This package has no native interaction, focus, selection, movement, saved-model,
|
||||
Undo/Redo or full #29 acceptance implication. The native evidence and its
|
||||
independent evaluator belong in their separate reviewed record. The verification
|
||||
summary reports captured outcomes, including failures; it does not declare the
|
||||
feature or all captured gates successful.
|
||||
Binary file not shown.
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"prepare.py": {
|
||||
"bytes": 4818,
|
||||
"sha256": "29eedcec091874b26572530517f015ab690ed1a9040abea52248e99603ba5f25"
|
||||
},
|
||||
"verify.py": {
|
||||
"bytes": 8873,
|
||||
"sha256": "c03513407073bef092d57b968f982b8ffc0c58e095f834fe7464c6a0e8454a9a"
|
||||
},
|
||||
"README.md": {
|
||||
"bytes": 5001,
|
||||
"sha256": "3f5232af2ebb12003c833e6bc6643b4858950ebf015435a9b850c6a826fe27d0"
|
||||
},
|
||||
"manifest.json": {
|
||||
"bytes": 37083,
|
||||
"sha256": "c23269443cd059895c672330720a10508ab8ecade0d3686ec3d82ff792c9b457"
|
||||
},
|
||||
"evidence.zip": {
|
||||
"bytes": 25914867,
|
||||
"sha256": "261660dd8a5e93d917c1d36cad19d1eec0b93e312d1e0dd15f9ea16f5e11c864"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,935 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"kind": "multiselect-cargo-gates",
|
||||
"runs": {
|
||||
"core-1": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"--test",
|
||||
"group_movement",
|
||||
"--test",
|
||||
"state_diagrams",
|
||||
"--",
|
||||
"--nocapture"
|
||||
],
|
||||
"head": "b8685416f56e53e30bd11ecf93a54cea10ac8458",
|
||||
"exitCode": 0,
|
||||
"inputCount": 722,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"core-2": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"--test",
|
||||
"group_movement",
|
||||
"--test",
|
||||
"state_diagrams",
|
||||
"--example",
|
||||
"multiselect_native",
|
||||
"--",
|
||||
"--nocapture"
|
||||
],
|
||||
"head": "b8685416f56e53e30bd11ecf93a54cea10ac8458",
|
||||
"exitCode": 101,
|
||||
"inputCount": 729,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"core-3": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"--test",
|
||||
"group_movement",
|
||||
"--test",
|
||||
"state_diagrams",
|
||||
"--example",
|
||||
"multiselect_native",
|
||||
"--",
|
||||
"--nocapture"
|
||||
],
|
||||
"head": "b8685416f56e53e30bd11ecf93a54cea10ac8458",
|
||||
"exitCode": 0,
|
||||
"inputCount": 729,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"desktop-1": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"multiselect",
|
||||
"--",
|
||||
"--nocapture"
|
||||
],
|
||||
"head": "b8685416f56e53e30bd11ecf93a54cea10ac8458",
|
||||
"exitCode": 101,
|
||||
"inputCount": 727,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"desktop-2": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--",
|
||||
"--nocapture"
|
||||
],
|
||||
"head": "b8685416f56e53e30bd11ecf93a54cea10ac8458",
|
||||
"exitCode": 101,
|
||||
"inputCount": 728,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"desktop-3": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--",
|
||||
"--nocapture"
|
||||
],
|
||||
"head": "b8685416f56e53e30bd11ecf93a54cea10ac8458",
|
||||
"exitCode": 0,
|
||||
"inputCount": 729,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"desktop-4": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--",
|
||||
"--nocapture"
|
||||
],
|
||||
"head": "b8685416f56e53e30bd11ecf93a54cea10ac8458",
|
||||
"exitCode": 0,
|
||||
"inputCount": 729,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"desktop-5": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--",
|
||||
"--nocapture"
|
||||
],
|
||||
"head": "12a7352ddef5f69a144ead8219a50916233d63a9",
|
||||
"exitCode": 0,
|
||||
"inputCount": 729,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"format-1": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"fmt",
|
||||
"--all",
|
||||
"--",
|
||||
"--check"
|
||||
],
|
||||
"head": "12a7352ddef5f69a144ead8219a50916233d63a9",
|
||||
"exitCode": 0,
|
||||
"inputCount": 729,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"format-2": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"fmt",
|
||||
"--all",
|
||||
"--",
|
||||
"--check"
|
||||
],
|
||||
"head": "f6a6010baed9e6164a1fcc7ecd58256a562827d7",
|
||||
"exitCode": 0,
|
||||
"inputCount": 729,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"lint-1": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"clippy",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--all-targets",
|
||||
"--",
|
||||
"-D",
|
||||
"warnings"
|
||||
],
|
||||
"head": "b8685416f56e53e30bd11ecf93a54cea10ac8458",
|
||||
"exitCode": 101,
|
||||
"inputCount": 729,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"lint-2": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"clippy",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--all-targets",
|
||||
"--",
|
||||
"-D",
|
||||
"warnings"
|
||||
],
|
||||
"head": "b8685416f56e53e30bd11ecf93a54cea10ac8458",
|
||||
"exitCode": 0,
|
||||
"inputCount": 729,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"lint-3": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"clippy",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--all-targets",
|
||||
"--",
|
||||
"-D",
|
||||
"warnings"
|
||||
],
|
||||
"head": "12a7352ddef5f69a144ead8219a50916233d63a9",
|
||||
"exitCode": 0,
|
||||
"inputCount": 729,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"native-build-1": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"build",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"--example",
|
||||
"multiselect_native",
|
||||
"--message-format=json"
|
||||
],
|
||||
"head": "12a7352ddef5f69a144ead8219a50916233d63a9",
|
||||
"exitCode": 0,
|
||||
"inputCount": 729,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"native-build-2": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"build",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"--example",
|
||||
"multiselect_native",
|
||||
"--message-format=json"
|
||||
],
|
||||
"head": "f6a6010baed9e6164a1fcc7ecd58256a562827d7",
|
||||
"exitCode": 0,
|
||||
"inputCount": 729,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"oracle-2": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"--example",
|
||||
"multiselect_native",
|
||||
"--",
|
||||
"--nocapture"
|
||||
],
|
||||
"head": "b8685416f56e53e30bd11ecf93a54cea10ac8458",
|
||||
"exitCode": 101,
|
||||
"inputCount": 729,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"oracle-3": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"--example",
|
||||
"multiselect_native",
|
||||
"--",
|
||||
"--nocapture"
|
||||
],
|
||||
"head": "b8685416f56e53e30bd11ecf93a54cea10ac8458",
|
||||
"exitCode": 0,
|
||||
"inputCount": 729,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"windows-build-1": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"build",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--bin",
|
||||
"arcadia-studio",
|
||||
"--message-format=json"
|
||||
],
|
||||
"head": "12a7352ddef5f69a144ead8219a50916233d63a9",
|
||||
"exitCode": 0,
|
||||
"inputCount": 729,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"windows-build-2": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"build",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--bin",
|
||||
"arcadia-studio",
|
||||
"--message-format=json"
|
||||
],
|
||||
"head": "f6a6010baed9e6164a1fcc7ecd58256a562827d7",
|
||||
"exitCode": 0,
|
||||
"inputCount": 729,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
}
|
||||
},
|
||||
"logicalFiles": {
|
||||
"cargo/core-1/inputs.json": "capsules/a73d565f90b14c986e0f87a7ac3d368c93e053b7e591cffdfa20d8e81e2eae08.json",
|
||||
"cargo/core-1/inputs.zip": "capsules/2dcb54b1dd51a05cdd983432b114da8a08dce326c42b6e77a6b8772e75d2282f.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/c5b23cd340869d57bd1bc4400041d499ea06a1a7619a6fd6b51e75278c1755e1.json",
|
||||
"cargo/core-2/inputs.zip": "capsules/df441a733bf28d1c59eab52063ca4b2645067b490b0a2f0072f98fc9225ea2e8.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/55a5f354bb5049a8c77ba9bafa833438ebf754649b0cf5d175d0c8dcfcedd7bb.json",
|
||||
"cargo/core-3/inputs.zip": "capsules/e1c7f3abe7b32616d1081b4a2bb8af2d6d4b071bc2a7cbdd61e96a92ffdc0533.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/c1083b630ad79ed1fea6933de3221f05b8eb9200694fb0e5dbd637527803579c.json",
|
||||
"cargo/desktop-1/inputs.zip": "capsules/8d6b08c2b1220cdb48d32cc74004cc9b82e4385f6f50a764f76c4a8630d070bf.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/5f049dbbee443af86cde70efc74027f290a9bfbd434e5d644aa74ddb4e97566b.json",
|
||||
"cargo/desktop-2/inputs.zip": "capsules/bf7dc41142e6d087f213b2914e0ffb0e9cd52294f5830301e5e5b78c3470f725.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/6f8eae7613666bca412e62f67151d6fee9f5bd32fb50363d0ff9b9ac8b190acf.json",
|
||||
"cargo/desktop-3/inputs.zip": "capsules/cc6233ddec2db0e322659a73a55e1681f5cb3554750ba183a756a29dadf8a8c9.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/55a5f354bb5049a8c77ba9bafa833438ebf754649b0cf5d175d0c8dcfcedd7bb.json",
|
||||
"cargo/desktop-4/inputs.zip": "capsules/e1c7f3abe7b32616d1081b4a2bb8af2d6d4b071bc2a7cbdd61e96a92ffdc0533.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/99dc46645236e674244e7c4867595a6000d3d85b54bcc9ab2b0c601923ecf66c.json",
|
||||
"cargo/desktop-5/inputs.zip": "capsules/aa8bb3d7fbd1f73c36913235b0b1d3aa79f6ac418b6c07ade94a7dee4a617bd9.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/format-1/inputs.json": "capsules/55a5f354bb5049a8c77ba9bafa833438ebf754649b0cf5d175d0c8dcfcedd7bb.json",
|
||||
"cargo/format-1/inputs.zip": "capsules/e1c7f3abe7b32616d1081b4a2bb8af2d6d4b071bc2a7cbdd61e96a92ffdc0533.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/99dc46645236e674244e7c4867595a6000d3d85b54bcc9ab2b0c601923ecf66c.json",
|
||||
"cargo/format-2/inputs.zip": "capsules/aa8bb3d7fbd1f73c36913235b0b1d3aa79f6ac418b6c07ade94a7dee4a617bd9.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/lint-1/inputs.json": "capsules/292f6139450109875549801a1da337dac08a8bca4cfa0124139a5d8d042386b9.json",
|
||||
"cargo/lint-1/inputs.zip": "capsules/d2ec5025067db2c05736bb1c9c9b6250d9199f1b7190e8c09f5a777424790c10.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/55a5f354bb5049a8c77ba9bafa833438ebf754649b0cf5d175d0c8dcfcedd7bb.json",
|
||||
"cargo/lint-2/inputs.zip": "capsules/e1c7f3abe7b32616d1081b4a2bb8af2d6d4b071bc2a7cbdd61e96a92ffdc0533.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/99dc46645236e674244e7c4867595a6000d3d85b54bcc9ab2b0c601923ecf66c.json",
|
||||
"cargo/lint-3/inputs.zip": "capsules/aa8bb3d7fbd1f73c36913235b0b1d3aa79f6ac418b6c07ade94a7dee4a617bd9.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/native-build-1/inputs.json": "capsules/55a5f354bb5049a8c77ba9bafa833438ebf754649b0cf5d175d0c8dcfcedd7bb.json",
|
||||
"cargo/native-build-1/inputs.zip": "capsules/e1c7f3abe7b32616d1081b4a2bb8af2d6d4b071bc2a7cbdd61e96a92ffdc0533.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/99dc46645236e674244e7c4867595a6000d3d85b54bcc9ab2b0c601923ecf66c.json",
|
||||
"cargo/native-build-2/inputs.zip": "capsules/aa8bb3d7fbd1f73c36913235b0b1d3aa79f6ac418b6c07ade94a7dee4a617bd9.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/oracle-2/inputs.json": "capsules/ae16337dbc617e26b23468adb86d963e3bcf7eddf177e8fb4654c69019904548.json",
|
||||
"cargo/oracle-2/inputs.zip": "capsules/e99bcaf1ab2becbcad0a005bdd0a4eb14fad2075bd7a38433857df4d3cad5e4d.zip",
|
||||
"cargo/oracle-2/process.json": "cargo/oracle-2/process.json",
|
||||
"cargo/oracle-2/result.json": "cargo/oracle-2/result.json",
|
||||
"cargo/oracle-2/started.json": "cargo/oracle-2/started.json",
|
||||
"cargo/oracle-2/stderr.log": "cargo/oracle-2/stderr.log",
|
||||
"cargo/oracle-2/stdout.log": "cargo/oracle-2/stdout.log",
|
||||
"cargo/oracle-3/inputs.json": "capsules/292f6139450109875549801a1da337dac08a8bca4cfa0124139a5d8d042386b9.json",
|
||||
"cargo/oracle-3/inputs.zip": "capsules/d2ec5025067db2c05736bb1c9c9b6250d9199f1b7190e8c09f5a777424790c10.zip",
|
||||
"cargo/oracle-3/process.json": "cargo/oracle-3/process.json",
|
||||
"cargo/oracle-3/result.json": "cargo/oracle-3/result.json",
|
||||
"cargo/oracle-3/started.json": "cargo/oracle-3/started.json",
|
||||
"cargo/oracle-3/stderr.log": "cargo/oracle-3/stderr.log",
|
||||
"cargo/oracle-3/stdout.log": "cargo/oracle-3/stdout.log",
|
||||
"cargo/windows-build-1/inputs.json": "capsules/55a5f354bb5049a8c77ba9bafa833438ebf754649b0cf5d175d0c8dcfcedd7bb.json",
|
||||
"cargo/windows-build-1/inputs.zip": "capsules/e1c7f3abe7b32616d1081b4a2bb8af2d6d4b071bc2a7cbdd61e96a92ffdc0533.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/99dc46645236e674244e7c4867595a6000d3d85b54bcc9ab2b0c601923ecf66c.json",
|
||||
"cargo/windows-build-2/inputs.zip": "capsules/aa8bb3d7fbd1f73c36913235b0b1d3aa79f6ac418b6c07ade94a7dee4a617bd9.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/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"members": {
|
||||
"capsules/292f6139450109875549801a1da337dac08a8bca4cfa0124139a5d8d042386b9.json": {
|
||||
"bytes": 121985,
|
||||
"sha256": "292f6139450109875549801a1da337dac08a8bca4cfa0124139a5d8d042386b9"
|
||||
},
|
||||
"capsules/2dcb54b1dd51a05cdd983432b114da8a08dce326c42b6e77a6b8772e75d2282f.zip": {
|
||||
"bytes": 2885634,
|
||||
"sha256": "2dcb54b1dd51a05cdd983432b114da8a08dce326c42b6e77a6b8772e75d2282f"
|
||||
},
|
||||
"capsules/55a5f354bb5049a8c77ba9bafa833438ebf754649b0cf5d175d0c8dcfcedd7bb.json": {
|
||||
"bytes": 121985,
|
||||
"sha256": "55a5f354bb5049a8c77ba9bafa833438ebf754649b0cf5d175d0c8dcfcedd7bb"
|
||||
},
|
||||
"capsules/5f049dbbee443af86cde70efc74027f290a9bfbd434e5d644aa74ddb4e97566b.json": {
|
||||
"bytes": 121820,
|
||||
"sha256": "5f049dbbee443af86cde70efc74027f290a9bfbd434e5d644aa74ddb4e97566b"
|
||||
},
|
||||
"capsules/6f8eae7613666bca412e62f67151d6fee9f5bd32fb50363d0ff9b9ac8b190acf.json": {
|
||||
"bytes": 121984,
|
||||
"sha256": "6f8eae7613666bca412e62f67151d6fee9f5bd32fb50363d0ff9b9ac8b190acf"
|
||||
},
|
||||
"capsules/8d6b08c2b1220cdb48d32cc74004cc9b82e4385f6f50a764f76c4a8630d070bf.zip": {
|
||||
"bytes": 2903240,
|
||||
"sha256": "8d6b08c2b1220cdb48d32cc74004cc9b82e4385f6f50a764f76c4a8630d070bf"
|
||||
},
|
||||
"capsules/99dc46645236e674244e7c4867595a6000d3d85b54bcc9ab2b0c601923ecf66c.json": {
|
||||
"bytes": 121985,
|
||||
"sha256": "99dc46645236e674244e7c4867595a6000d3d85b54bcc9ab2b0c601923ecf66c"
|
||||
},
|
||||
"capsules/a73d565f90b14c986e0f87a7ac3d368c93e053b7e591cffdfa20d8e81e2eae08.json": {
|
||||
"bytes": 120844,
|
||||
"sha256": "a73d565f90b14c986e0f87a7ac3d368c93e053b7e591cffdfa20d8e81e2eae08"
|
||||
},
|
||||
"capsules/aa8bb3d7fbd1f73c36913235b0b1d3aa79f6ac418b6c07ade94a7dee4a617bd9.zip": {
|
||||
"bytes": 2918930,
|
||||
"sha256": "aa8bb3d7fbd1f73c36913235b0b1d3aa79f6ac418b6c07ade94a7dee4a617bd9"
|
||||
},
|
||||
"capsules/ae16337dbc617e26b23468adb86d963e3bcf7eddf177e8fb4654c69019904548.json": {
|
||||
"bytes": 121984,
|
||||
"sha256": "ae16337dbc617e26b23468adb86d963e3bcf7eddf177e8fb4654c69019904548"
|
||||
},
|
||||
"capsules/bf7dc41142e6d087f213b2914e0ffb0e9cd52294f5830301e5e5b78c3470f725.zip": {
|
||||
"bytes": 2909281,
|
||||
"sha256": "bf7dc41142e6d087f213b2914e0ffb0e9cd52294f5830301e5e5b78c3470f725"
|
||||
},
|
||||
"capsules/c1083b630ad79ed1fea6933de3221f05b8eb9200694fb0e5dbd637527803579c.json": {
|
||||
"bytes": 121652,
|
||||
"sha256": "c1083b630ad79ed1fea6933de3221f05b8eb9200694fb0e5dbd637527803579c"
|
||||
},
|
||||
"capsules/c5b23cd340869d57bd1bc4400041d499ea06a1a7619a6fd6b51e75278c1755e1.json": {
|
||||
"bytes": 121984,
|
||||
"sha256": "c5b23cd340869d57bd1bc4400041d499ea06a1a7619a6fd6b51e75278c1755e1"
|
||||
},
|
||||
"capsules/cc6233ddec2db0e322659a73a55e1681f5cb3554750ba183a756a29dadf8a8c9.zip": {
|
||||
"bytes": 2917494,
|
||||
"sha256": "cc6233ddec2db0e322659a73a55e1681f5cb3554750ba183a756a29dadf8a8c9"
|
||||
},
|
||||
"capsules/d2ec5025067db2c05736bb1c9c9b6250d9199f1b7190e8c09f5a777424790c10.zip": {
|
||||
"bytes": 2918296,
|
||||
"sha256": "d2ec5025067db2c05736bb1c9c9b6250d9199f1b7190e8c09f5a777424790c10"
|
||||
},
|
||||
"capsules/df441a733bf28d1c59eab52063ca4b2645067b490b0a2f0072f98fc9225ea2e8.zip": {
|
||||
"bytes": 2917518,
|
||||
"sha256": "df441a733bf28d1c59eab52063ca4b2645067b490b0a2f0072f98fc9225ea2e8"
|
||||
},
|
||||
"capsules/e1c7f3abe7b32616d1081b4a2bb8af2d6d4b071bc2a7cbdd61e96a92ffdc0533.zip": {
|
||||
"bytes": 2918309,
|
||||
"sha256": "e1c7f3abe7b32616d1081b4a2bb8af2d6d4b071bc2a7cbdd61e96a92ffdc0533"
|
||||
},
|
||||
"capsules/e99bcaf1ab2becbcad0a005bdd0a4eb14fad2075bd7a38433857df4d3cad5e4d.zip": {
|
||||
"bytes": 2917719,
|
||||
"sha256": "e99bcaf1ab2becbcad0a005bdd0a4eb14fad2075bd7a38433857df4d3cad5e4d"
|
||||
},
|
||||
"cargo/core-1/process.json": {
|
||||
"bytes": 210,
|
||||
"sha256": "92e5a88b5b86400c13bad4d0a9d490466bb2ef0b6077d14930ac5084187b5506"
|
||||
},
|
||||
"cargo/core-1/result.json": {
|
||||
"bytes": 1821,
|
||||
"sha256": "c90e020e6d912516fbc5ef5b4bf6a5df5fc668e5f5e19a9108c29bf3723cea9c"
|
||||
},
|
||||
"cargo/core-1/started.json": {
|
||||
"bytes": 1428,
|
||||
"sha256": "230ea369285569a0fa179fe420b0b2133e7fcb2349601a53d69881e9a66bd39b"
|
||||
},
|
||||
"cargo/core-1/stderr.log": {
|
||||
"bytes": 434,
|
||||
"sha256": "84a1b0b7352dcde2fe51293feabbddf8e94206d9278e4a38e6d354af8a1bcd48"
|
||||
},
|
||||
"cargo/core-1/stdout.log": {
|
||||
"bytes": 1671,
|
||||
"sha256": "eb04561c11e394cc368ea1c5e38aa4b1dc8b5c3c44acb168469dd941f80f14e8"
|
||||
},
|
||||
"cargo/core-2/process.json": {
|
||||
"bytes": 245,
|
||||
"sha256": "020d6cb0ce6e4b9122ac2dcbd86c9c1719479f29d3690247182ade858caba12d"
|
||||
},
|
||||
"cargo/core-2/result.json": {
|
||||
"bytes": 1870,
|
||||
"sha256": "c97cbcd85b60a3476135bf9026d41868ea091061c12ce4bbc18a40c6023c5b3e"
|
||||
},
|
||||
"cargo/core-2/started.json": {
|
||||
"bytes": 1473,
|
||||
"sha256": "f367b289c9d378975514fa450e4fa25049f4461156417ba5bd6e79836faf401e"
|
||||
},
|
||||
"cargo/core-2/stderr.log": {
|
||||
"bytes": 5287,
|
||||
"sha256": "4ea6f38eef014ab8176c3ab1ed9d3be3addb4463a8f073425f1b5493b33a7c86"
|
||||
},
|
||||
"cargo/core-2/stdout.log": {
|
||||
"bytes": 4138,
|
||||
"sha256": "a2dfdb0d7c6c7ba7e9ef86063a815f43111188a44ae4b0e20717cc3e518b7c3d"
|
||||
},
|
||||
"cargo/core-3/process.json": {
|
||||
"bytes": 245,
|
||||
"sha256": "b26f22b0aed07e55906b024d1fd94198da1ab1d56363fc5ad66868940ae1c9a4"
|
||||
},
|
||||
"cargo/core-3/result.json": {
|
||||
"bytes": 1867,
|
||||
"sha256": "6d04a2818750491cb73ebb1b257d214316c048e1ac6165a119a27534d636406c"
|
||||
},
|
||||
"cargo/core-3/started.json": {
|
||||
"bytes": 1473,
|
||||
"sha256": "49e9d637eb063277925c577266a63e5fd06723ca24726d609dc0e458596e8316"
|
||||
},
|
||||
"cargo/core-3/stderr.log": {
|
||||
"bytes": 539,
|
||||
"sha256": "f05f7ab2f0244968100eb0e0a82808af8e42dceb5b5de70d034b7ae56bad9489"
|
||||
},
|
||||
"cargo/core-3/stdout.log": {
|
||||
"bytes": 4797,
|
||||
"sha256": "d0f2180aaecc3b253b473200b77348a19a21594e193ce45c21f040b7242be253"
|
||||
},
|
||||
"cargo/desktop-1/process.json": {
|
||||
"bytes": 172,
|
||||
"sha256": "d9ba2b6a0968b702af0aa857e7bb8667680eeddc32a0403781cd3d5e2467c067"
|
||||
},
|
||||
"cargo/desktop-1/result.json": {
|
||||
"bytes": 1769,
|
||||
"sha256": "2384c076e4bbc0e15951671e3a830725213c31cfcded0a27e1bb72802c576dbc"
|
||||
},
|
||||
"cargo/desktop-1/started.json": {
|
||||
"bytes": 1375,
|
||||
"sha256": "6b1ba478ebe5e14d5ee76199a56874a6a10156c2dd7e9d3830fd5ba5311094d6"
|
||||
},
|
||||
"cargo/desktop-1/stderr.log": {
|
||||
"bytes": 4604,
|
||||
"sha256": "6a47286c4daaf9f4ac8ac8cca3e98931f7812a44b192128aa67880c1ac930b87"
|
||||
},
|
||||
"cargo/desktop-1/stdout.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"cargo/desktop-2/process.json": {
|
||||
"bytes": 157,
|
||||
"sha256": "cc037bab1ec44bd2e4095e165597f5e1d077bae5fce7a96c6a5fd814470d4244"
|
||||
},
|
||||
"cargo/desktop-2/result.json": {
|
||||
"bytes": 1753,
|
||||
"sha256": "9c037405572273086737e22b60796eff0745f4746ee3f25529f928da53c98fbc"
|
||||
},
|
||||
"cargo/desktop-2/started.json": {
|
||||
"bytes": 1355,
|
||||
"sha256": "18f71e571722bdb3696195623b3af3a2b9a45d38f98307a68049aacff3fbad9c"
|
||||
},
|
||||
"cargo/desktop-2/stderr.log": {
|
||||
"bytes": 1085,
|
||||
"sha256": "316e0179675fb071d7d9773d7073d771438ecd70e66c99559f4239e0638a3238"
|
||||
},
|
||||
"cargo/desktop-2/stdout.log": {
|
||||
"bytes": 145051,
|
||||
"sha256": "7c907317d106ff63347456b5ad2015fa8a9974ffbb7003d0a123afc99879ce42"
|
||||
},
|
||||
"cargo/desktop-3/process.json": {
|
||||
"bytes": 157,
|
||||
"sha256": "368d265e1ee5cceeb5995172c662dc3bc551591b9600a781c63ed64579760c24"
|
||||
},
|
||||
"cargo/desktop-3/result.json": {
|
||||
"bytes": 1751,
|
||||
"sha256": "32076fb49a6ddfcef63e77ca9f1edec34700ca80d36f32890581d56035f80054"
|
||||
},
|
||||
"cargo/desktop-3/started.json": {
|
||||
"bytes": 1355,
|
||||
"sha256": "da1ccd8352380b357d5954a70d86f2c51c8a2da8d1c4b553ca7b281d3000eab9"
|
||||
},
|
||||
"cargo/desktop-3/stderr.log": {
|
||||
"bytes": 626,
|
||||
"sha256": "5333e25e78f515449877867d0a2bf714b7cb3302c9497d4f4343a1e05e0f8b03"
|
||||
},
|
||||
"cargo/desktop-3/stdout.log": {
|
||||
"bytes": 145562,
|
||||
"sha256": "dc7e40a7d2ab1e78c74f0ee0344c4b2e5b1402bc6367e93a40780774000e4f81"
|
||||
},
|
||||
"cargo/desktop-4/process.json": {
|
||||
"bytes": 157,
|
||||
"sha256": "0823d0fbda95fe5efb08a7c11c98a7ac2409b5b3d170cf2e41b702895211abf4"
|
||||
},
|
||||
"cargo/desktop-4/result.json": {
|
||||
"bytes": 1750,
|
||||
"sha256": "d88b177e9d181f7c9c3685100c8676c0c8954cd0b071344ff5b4bb7a8e498865"
|
||||
},
|
||||
"cargo/desktop-4/started.json": {
|
||||
"bytes": 1355,
|
||||
"sha256": "0f9927d5c0b09c7fcc8922c68a2c88a4d840e0420a7be90193f566b02312a3d3"
|
||||
},
|
||||
"cargo/desktop-4/stderr.log": {
|
||||
"bytes": 628,
|
||||
"sha256": "992db238282b7acf1bbfeee7f2c459f9afe4bce814761d70df789e4f6239afcf"
|
||||
},
|
||||
"cargo/desktop-4/stdout.log": {
|
||||
"bytes": 145802,
|
||||
"sha256": "70c38e8c98cac4f220999481908beb549e5377f6f48c31931f9412ed25a67a41"
|
||||
},
|
||||
"cargo/desktop-5/process.json": {
|
||||
"bytes": 157,
|
||||
"sha256": "83bf9efc58fa5692f3ed038c107c081e5483d91117c73eddba62d3eb45cc7267"
|
||||
},
|
||||
"cargo/desktop-5/result.json": {
|
||||
"bytes": 1751,
|
||||
"sha256": "7cbbae8bbceec07cebb4696b999701cd29d46bfd047351aa3e20ea49d7c67ae6"
|
||||
},
|
||||
"cargo/desktop-5/started.json": {
|
||||
"bytes": 1355,
|
||||
"sha256": "0bfd2a6c185afb1b301e3b6b5f746d0e37251f147590aa2e9f25e370e99f53e8"
|
||||
},
|
||||
"cargo/desktop-5/stderr.log": {
|
||||
"bytes": 631,
|
||||
"sha256": "466f26c41956ed05629b633827d7ffca497c57c87ff67acff6351043c7bdefd4"
|
||||
},
|
||||
"cargo/desktop-5/stdout.log": {
|
||||
"bytes": 146577,
|
||||
"sha256": "e89cf5f2375fd40ae70261471d797cbaca5127cb27730e6094a616afa12514ae"
|
||||
},
|
||||
"cargo/format-1/process.json": {
|
||||
"bytes": 116,
|
||||
"sha256": "bb8e0a7620b40bb5f0932643848a57b0d207dde39006a9a20141c00f13d94284"
|
||||
},
|
||||
"cargo/format-1/result.json": {
|
||||
"bytes": 1687,
|
||||
"sha256": "967eeddb3fc6a0dc0fdf9a75f575d75fa8f8b0b5ea9c8a422590bcbece6de77b"
|
||||
},
|
||||
"cargo/format-1/started.json": {
|
||||
"bytes": 1299,
|
||||
"sha256": "ceb354dfbc4a41d72e496342e28475ddcce5a3c17a4e1553f0d699404c374657"
|
||||
},
|
||||
"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": "aa31b91d224845b7dd1df777e865c88c5b8f55b66f173053be318132d1bc3870"
|
||||
},
|
||||
"cargo/format-2/result.json": {
|
||||
"bytes": 1687,
|
||||
"sha256": "c4d5529c8d2feae1b805bd8d404a3817053a5a0cd4ec341aa8c1e0a5c05eed5b"
|
||||
},
|
||||
"cargo/format-2/started.json": {
|
||||
"bytes": 1299,
|
||||
"sha256": "2ea70bb29d7fef73a194acd7aa36836fd4a54ae8a4be173f919cd2fc32e97919"
|
||||
},
|
||||
"cargo/format-2/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"cargo/format-2/stdout.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"cargo/lint-1/process.json": {
|
||||
"bytes": 196,
|
||||
"sha256": "d30e400277dc0bb4a1618689b16ab86be7838cc1b42688185d655df235080286"
|
||||
},
|
||||
"cargo/lint-1/result.json": {
|
||||
"bytes": 1808,
|
||||
"sha256": "7ffb361d398def4520afc48683a69effbb8b066efd9442ba3b356c8124aae6d9"
|
||||
},
|
||||
"cargo/lint-1/started.json": {
|
||||
"bytes": 1414,
|
||||
"sha256": "771b5bdc31662fb3b4f76735e92b0e89d31a02188fbce35c5cfb0aea4c37c0ca"
|
||||
},
|
||||
"cargo/lint-1/stderr.log": {
|
||||
"bytes": 1023,
|
||||
"sha256": "9cbab357d810ce8164a0e614491f53529e61c1cad79793ca429e13897a8dc5ed"
|
||||
},
|
||||
"cargo/lint-1/stdout.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"cargo/lint-2/process.json": {
|
||||
"bytes": 196,
|
||||
"sha256": "f4aed65014ed120dc72bd08160559ae0285bc5c4968305a5fb86cf29e8c0d347"
|
||||
},
|
||||
"cargo/lint-2/result.json": {
|
||||
"bytes": 1805,
|
||||
"sha256": "b873add4777fd8f7516513e2423f9d3eb4a40505a3b1fa7edfbee89fb5c7e0d3"
|
||||
},
|
||||
"cargo/lint-2/started.json": {
|
||||
"bytes": 1414,
|
||||
"sha256": "0d01a20ec0f7cd796c066c95936c74df0abf8947fca655d900a5bdd4f8dbd610"
|
||||
},
|
||||
"cargo/lint-2/stderr.log": {
|
||||
"bytes": 207,
|
||||
"sha256": "e6f76746d5864a4de1e9d238c74799e2080e2c6214f51b68a4692d5e15f5b107"
|
||||
},
|
||||
"cargo/lint-2/stdout.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"cargo/lint-3/process.json": {
|
||||
"bytes": 196,
|
||||
"sha256": "620094b52dab8f23f389687cf72b8b3aa4effa55697842206a618293537eb869"
|
||||
},
|
||||
"cargo/lint-3/result.json": {
|
||||
"bytes": 1805,
|
||||
"sha256": "1e7dc472c03d653094850ed653599cee41e50d1639389bbc3fee45e40a754b5c"
|
||||
},
|
||||
"cargo/lint-3/started.json": {
|
||||
"bytes": 1414,
|
||||
"sha256": "b921ee7102386187c288c1b25aea96a3019ff00a4a508065aefbc4499b7c7818"
|
||||
},
|
||||
"cargo/lint-3/stderr.log": {
|
||||
"bytes": 137,
|
||||
"sha256": "d19e47547a69ce7956c74f2a65cd1064571985d073bcf497a11a0b0eebcfbd04"
|
||||
},
|
||||
"cargo/lint-3/stdout.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"cargo/native-build-1/process.json": {
|
||||
"bytes": 194,
|
||||
"sha256": "390cb979d680b9fdb7e0afa05d6b9d10a25dc27abaff16596d113bb0b2142b43"
|
||||
},
|
||||
"cargo/native-build-1/result.json": {
|
||||
"bytes": 3132,
|
||||
"sha256": "35f76499ac2a49446b896932c963fd8734a5755e00e3511cedf1e584e7b17704"
|
||||
},
|
||||
"cargo/native-build-1/started.json": {
|
||||
"bytes": 1397,
|
||||
"sha256": "5f37fc095aa00eae8fae043651a29f387f484bf4a0cc454e3919ea4f49567126"
|
||||
},
|
||||
"cargo/native-build-1/stderr.log": {
|
||||
"bytes": 130,
|
||||
"sha256": "731d61ee089d75c107edcd02d2cdedcddaad57ec06607ccd0822d9dc71a72720"
|
||||
},
|
||||
"cargo/native-build-1/stdout.log": {
|
||||
"bytes": 41700,
|
||||
"sha256": "832dc599cad2c9ba28ff9153537fb428390d8f25959f5b4a080cd432f6bea0e8"
|
||||
},
|
||||
"cargo/native-build-2/process.json": {
|
||||
"bytes": 194,
|
||||
"sha256": "46ff130840d8b12272be43f479adeb0b2ace94ee1d5389c5638a61b22d732496"
|
||||
},
|
||||
"cargo/native-build-2/result.json": {
|
||||
"bytes": 3131,
|
||||
"sha256": "fbecac3b0f7913db5e2ad19043c7df167a92287833ddf3ea4f24766e86ae523b"
|
||||
},
|
||||
"cargo/native-build-2/started.json": {
|
||||
"bytes": 1397,
|
||||
"sha256": "cbd2c7ad98baddc3719a5c03bef103747d4cb5c560d631376149f116ede49584"
|
||||
},
|
||||
"cargo/native-build-2/stderr.log": {
|
||||
"bytes": 60,
|
||||
"sha256": "b2558545bbfa50a0f0c26623c0982eb5f96d71ea228d7c56180edbac0d0b295d"
|
||||
},
|
||||
"cargo/native-build-2/stdout.log": {
|
||||
"bytes": 41699,
|
||||
"sha256": "7884b8ea1a92d58c7174657560ec38ff9a073e52f93cc19a78290840f2ab5486"
|
||||
},
|
||||
"cargo/oracle-2/process.json": {
|
||||
"bytes": 189,
|
||||
"sha256": "1e8ffd7a03b22bf2ec43b0d66ae3cc98016a431c4a07499faf3ca0c635b92337"
|
||||
},
|
||||
"cargo/oracle-2/result.json": {
|
||||
"bytes": 1789,
|
||||
"sha256": "e0b7331751bae8564ee5c28d05029071f1c8460195e6f9e2f0d00a5ae4e05a16"
|
||||
},
|
||||
"cargo/oracle-2/started.json": {
|
||||
"bytes": 1397,
|
||||
"sha256": "b7a8278dfa2324f0c3ff6e9616a65ef7a51c99699ad700adfe90e2accc435765"
|
||||
},
|
||||
"cargo/oracle-2/stderr.log": {
|
||||
"bytes": 520,
|
||||
"sha256": "9dd8b849afdbbb2207a9ad82f1b6c6f07fd9cd0846fe4591f33c40fdadcbb3ac"
|
||||
},
|
||||
"cargo/oracle-2/stdout.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"cargo/oracle-3/process.json": {
|
||||
"bytes": 189,
|
||||
"sha256": "a2cb30f512ee390bb03c9fcf5ea8069ca3a05da91f798985efc3f9f54670ace4"
|
||||
},
|
||||
"cargo/oracle-3/result.json": {
|
||||
"bytes": 1791,
|
||||
"sha256": "f0768fecc9f6711dd3cfc627c60aaf6118216bce47e76faa4cbdda571ac675e4"
|
||||
},
|
||||
"cargo/oracle-3/started.json": {
|
||||
"bytes": 1397,
|
||||
"sha256": "30cf614b6dede363ae4bdeca56fc4a1ddb7ee19a7e592b1b1616d4a98a53b535"
|
||||
},
|
||||
"cargo/oracle-3/stderr.log": {
|
||||
"bytes": 307,
|
||||
"sha256": "b4ccc583c5001d81b7208fe6f2e52788d0d40b63c7da034ca1fb90ec2adb18a4"
|
||||
},
|
||||
"cargo/oracle-3/stdout.log": {
|
||||
"bytes": 2968,
|
||||
"sha256": "e0a62ca8b008370c5a41378eb4c9e2a229a2fcde7bdba55426313c7d23da8aca"
|
||||
},
|
||||
"cargo/windows-build-1/process.json": {
|
||||
"bytes": 189,
|
||||
"sha256": "4e6b57dc0d5f10ac1b4af991f8b0f7558f4fc5b626e00f1a49c5782ea13abe18"
|
||||
},
|
||||
"cargo/windows-build-1/result.json": {
|
||||
"bytes": 3082,
|
||||
"sha256": "3cdd09a859288afe71dde6fb51bcc4bca84e47ceb9cb6389d57f6722d9e23fdf"
|
||||
},
|
||||
"cargo/windows-build-1/started.json": {
|
||||
"bytes": 1392,
|
||||
"sha256": "a3ebcdffc01e93fd5609005a0539eb11bf473b45bc28eee71dd175b943b387eb"
|
||||
},
|
||||
"cargo/windows-build-1/stderr.log": {
|
||||
"bytes": 319,
|
||||
"sha256": "7201ff3f71fe793907482992a00682023fc6ee1ac0a016f53a048b299ec2fffd"
|
||||
},
|
||||
"cargo/windows-build-1/stdout.log": {
|
||||
"bytes": 284182,
|
||||
"sha256": "3fc90b8c923415496c7990d33a5fe7211423b83df833a80111079fad71f04a2d"
|
||||
},
|
||||
"cargo/windows-build-2/process.json": {
|
||||
"bytes": 189,
|
||||
"sha256": "f18acb4c9feede438e1aa67bb86ce2d74f5b3aa0142499ae99b56b23daaf834b"
|
||||
},
|
||||
"cargo/windows-build-2/result.json": {
|
||||
"bytes": 3081,
|
||||
"sha256": "d7b191ee07c302ffed1017374b0c5d8b86245c0f3348fbac4778ae573397b9de"
|
||||
},
|
||||
"cargo/windows-build-2/started.json": {
|
||||
"bytes": 1392,
|
||||
"sha256": "b6a6656d966559060f01e87ccbd75837b0cf67e70c77246b20f587167bdbf651"
|
||||
},
|
||||
"cargo/windows-build-2/stderr.log": {
|
||||
"bytes": 137,
|
||||
"sha256": "aafe81cdd7c1e5558e957d4296d46e3238c72af79ba79d6147c5cc16f938d6ef"
|
||||
},
|
||||
"cargo/windows-build-2/stdout.log": {
|
||||
"bytes": 284179,
|
||||
"sha256": "cfba733cb79a9496004109bb0bc8b8996df5ec1645691fd79b952063faa519c5"
|
||||
},
|
||||
"helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py": {
|
||||
"bytes": 3502,
|
||||
"sha256": "6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
"""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/group-movement-gates"
|
||||
candidates = sorted(gates.glob("*.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
|
||||
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,
|
||||
"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, default=HERE.parents[3], help="checkout holding .local/group-movement-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, default=HERE, help="package directory; existing evidence is never overwritten")
|
||||
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")
|
||||
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=True)
|
||||
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()
|
||||
@@ -0,0 +1,164 @@
|
||||
"""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"]
|
||||
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())
|
||||
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])
|
||||
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), "logicalFiles": len(logical), "storedMembers": len(stored), "sourceCapsulePairs": len(seen_capsules)}
|
||||
|
||||
|
||||
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()
|
||||
@@ -0,0 +1,35 @@
|
||||
# Run-2 baseline checker environment incident
|
||||
|
||||
The first baseline checker invocation exited `3221225781` (`0xC0000135`) at
|
||||
2026-09-23 09:07:10 UTC with empty stdout/stderr. The parent reported that this
|
||||
shell omitted dot-sourcing the toolchain `env.ps1`. After that environment setup,
|
||||
the same checker command succeeded at 09:08:08 UTC with a complete-Project PASS.
|
||||
This records a checker-process launch incident, not a failure of the running GUI.
|
||||
No particular missing DLL was measured or identified.
|
||||
|
||||
`run-2-baseline-runtime-environment/` is an exact copy of the failed snapshot:
|
||||
started/result receipts, empty streams and all nine source files. Its unchanged
|
||||
command text still names the original `run-2/snapshots/baseline` location; the
|
||||
parent moved the failed directory aside before retrying. Paths in these records
|
||||
are historical labels and have not been rewritten.
|
||||
|
||||
`retry-baseline/` preserves the successful retry's original started/result
|
||||
receipts and streams. Direct comparison confirmed identical command, build
|
||||
receipt, binary, helper, baseline and source pins between attempts. All three
|
||||
unchanged flags are true in both results. The nine retry source files were
|
||||
also compared byte for byte with the failed snapshot and are identical; they
|
||||
are not duplicated here. The successful run's complete snapshots belong in the
|
||||
separate native evidence package.
|
||||
|
||||
`helpers/check-snapshot-2.py` matches the helper pin in both receipts.
|
||||
`helpers/env.ps1` preserves the environment setup script available when this
|
||||
incident was packaged. It sets toolchain paths and runtime search paths and
|
||||
contains no credentials. The checker receipts do not record the environment or
|
||||
pin `env.ps1`, so the omitted/setup distinction is the parent's invocation
|
||||
observation, not an independently measured environment comparison. Both scripts
|
||||
are historical data; this package does not execute them.
|
||||
|
||||
The checker binary pin in both attempts is
|
||||
`4de47a2b62192be6a1394e654f368be19e36fb966d60d6c833a5d51d18247bb1`.
|
||||
`files.json` pins every included file except itself. Raw bytes are preserved.
|
||||
No frozen checks, source-identity or native packaging tools were changed.
|
||||
@@ -0,0 +1,82 @@
|
||||
{
|
||||
"helpers/check-snapshot-2.py": {
|
||||
"bytes": 2494,
|
||||
"sha256": "1dbfff41f07bd750d4e550660d91ae9790d2442fbfe685dc88b7f63a47f5acb8"
|
||||
},
|
||||
"helpers/env.ps1": {
|
||||
"bytes": 621,
|
||||
"sha256": "d7eb6249bef73adacdb05cebefe7ca478758c3c38de17a1731bf01f8b25dc379"
|
||||
},
|
||||
"README.md": {
|
||||
"bytes": 2146,
|
||||
"sha256": "d5a853c62713a6c87d28acfbe28c03bd95459275d0a2eb752d978e5a9b427bc8"
|
||||
},
|
||||
"retry-baseline/result.json": {
|
||||
"bytes": 2758,
|
||||
"sha256": "ae16cbc54bf5b6054750ef082f47bf0a26ee2dfb7bce46f19c8fd2c1ac622d7f"
|
||||
},
|
||||
"retry-baseline/started.json": {
|
||||
"bytes": 2356,
|
||||
"sha256": "e172a36f0872d49a8fe0f7200fb56d597b71fd1849dc9902d53ac1813a3c7d4a"
|
||||
},
|
||||
"retry-baseline/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"retry-baseline/stdout.log": {
|
||||
"bytes": 441,
|
||||
"sha256": "12842cc4e483e2546f5c8615b17fe72c5fe07f3fb4440469071433c82d9a9b30"
|
||||
},
|
||||
"run-2-baseline-runtime-environment/result.json": {
|
||||
"bytes": 2765,
|
||||
"sha256": "539b950952461cc300876dbc45fa9ee02a9ecefb6d712fce6b74bad3fa701b30"
|
||||
},
|
||||
"run-2-baseline-runtime-environment/source/oa/activities/activity_activity_a.arcadia": {
|
||||
"bytes": 474,
|
||||
"sha256": "9bf7c5637d87c97213cf869118e942e8a29a67b429fa58e4de42235bba0980ee"
|
||||
},
|
||||
"run-2-baseline-runtime-environment/source/oa/activities/activity_activity_b.arcadia": {
|
||||
"bytes": 286,
|
||||
"sha256": "152007669b7c570674aff99615a48a6f557be50f88bbbb3a5edc20b423c79a1f"
|
||||
},
|
||||
"run-2-baseline-runtime-environment/source/oa/activities/activity_activity_c.arcadia": {
|
||||
"bytes": 153,
|
||||
"sha256": "d726b6b4e1200edd9ef752bb767e38d3d69dcac8eb6135d5f83c93832ff849b1"
|
||||
},
|
||||
"run-2-baseline-runtime-environment/source/project.arcadia": {
|
||||
"bytes": 597,
|
||||
"sha256": "e7bd67c5785a78766298255ed3d53ff6d65dcd24bde1570ac8a0ff45cc9dc385"
|
||||
},
|
||||
"run-2-baseline-runtime-environment/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 162,
|
||||
"sha256": "1c724a9204784435e729badd4ad164b1a6b891840bb1ddc354ac1e175e3d712c"
|
||||
},
|
||||
"run-2-baseline-runtime-environment/source/traceability.arcadia": {
|
||||
"bytes": 522,
|
||||
"sha256": "26b0b10715ced7aefcde941e6d1c1a6973f174997eae989e32a25c695dfb7cd1"
|
||||
},
|
||||
"run-2-baseline-runtime-environment/source/views/diagram_oa_other.arcadia": {
|
||||
"bytes": 315,
|
||||
"sha256": "06ceef9cfdbb3ef229a22db6c48d8bb808388e027c37294648555ecbfb6bfab9"
|
||||
},
|
||||
"run-2-baseline-runtime-environment/source/views/diagram_oa_view.arcadia": {
|
||||
"bytes": 1896,
|
||||
"sha256": "4e7d47d6a03153070687136c89faf01fc6df45ae89e2695beeab2fe4872dbc88"
|
||||
},
|
||||
"run-2-baseline-runtime-environment/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "c75b0fe14496631c9b017a32e277d1e5ad5b25e00e06b804fc54d950d7fb57f6"
|
||||
},
|
||||
"run-2-baseline-runtime-environment/started.json": {
|
||||
"bytes": 2356,
|
||||
"sha256": "338c14c7dc827bd4ab09009bb974ad3c481b07cdbad2437f5291b1ff67b5ba42"
|
||||
},
|
||||
"run-2-baseline-runtime-environment/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"run-2-baseline-runtime-environment/stdout.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
"""Copy stable native-saved source and check its complete Project independently."""
|
||||
from pathlib import Path
|
||||
import datetime, hashlib, json, re, shutil, subprocess, sys
|
||||
root = Path('C:/ar-multiselect-9e8r6t')
|
||||
native = root / '.local/multiselect-native'
|
||||
label, mode, *rest = sys.argv[1:]
|
||||
assert not rest and re.fullmatch('[a-z0-9-]+', label)
|
||||
working = native / 'working-2'
|
||||
out = native / 'run-2/snapshots' / label
|
||||
out.mkdir(parents=True, exist_ok=False)
|
||||
gate_path = root / '.local/group-movement-gates/native-build-2/result.json'
|
||||
gate = json.loads(gate_path.read_bytes())
|
||||
assert gate['exitCode'] == 0 and gate['inputsUnchanged']
|
||||
artifact, = [a for a in gate['artifacts'] if a['cargo']['target']['name'] == 'multiselect_native']
|
||||
binary = Path(artifact['cargo']['executable'])
|
||||
baseline = native / 'fixture-2/baseline.json'
|
||||
def pin(path):
|
||||
b = path.read_bytes()
|
||||
return {'bytes': len(b), 'sha256': hashlib.sha256(b).hexdigest()}
|
||||
def inventory():
|
||||
return {p.relative_to(working).as_posix():pin(p) for p in sorted(working.rglob('*.arcadia')) if p.is_file()}
|
||||
def now(): return datetime.datetime.now(datetime.timezone.utc).isoformat()
|
||||
before = inventory()
|
||||
assert 'project.arcadia' in before and pin(binary) == artifact['readback']
|
||||
for name in before:
|
||||
target = out/'source'/name
|
||||
target.parent.mkdir(parents=True, exist_ok=True)
|
||||
shutil.copyfile(working/name, target)
|
||||
assert before == inventory() == {name:pin(out/'source'/name) for name in before}
|
||||
command = [str(binary), 'check', mode, str(baseline), str(out/'source/project.arcadia')]
|
||||
start = {'start':now(), 'command':command, 'buildReceipt':pin(gate_path), 'binary':pin(binary), 'helper':pin(Path(__file__)), 'source':before, 'baseline':pin(baseline)}
|
||||
(out/'started.json').write_text(json.dumps(start,indent=2),encoding='utf-8')
|
||||
r = subprocess.run(command,cwd=root,capture_output=True)
|
||||
(out/'stdout.log').write_bytes(r.stdout)
|
||||
(out/'stderr.log').write_bytes(r.stderr)
|
||||
result = {**start, 'finish':now(), 'exitCode':r.returncode, 'binaryUnchanged':pin(binary)==artifact['readback'], 'workingSourceUnchanged':before==inventory(), 'baselineUnchanged':pin(baseline)==start['baseline'], 'stdout':pin(out/'stdout.log'), 'stderr':pin(out/'stderr.log')}
|
||||
(out/'result.json').write_text(json.dumps(result,indent=2),encoding='utf-8')
|
||||
print(r.stdout.decode(errors='replace'))
|
||||
print(r.stderr.decode(errors='replace'))
|
||||
assert result['binaryUnchanged'] and result['workingSourceUnchanged'] and result['baselineUnchanged']
|
||||
sys.exit(r.returncode)
|
||||
@@ -0,0 +1,9 @@
|
||||
$taskRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
|
||||
$env:RUSTUP_HOME = Join-Path $taskRoot '.local\toolchain\rustup'
|
||||
$env:CARGO_HOME = Join-Path $taskRoot '.local\toolchain\cargo'
|
||||
$env:RUSTUP_TOOLCHAIN = 'stable-x86_64-pc-windows-gnullvm'
|
||||
$env:PATH = "$env:CARGO_HOME\bin;$(Join-Path $taskRoot '.local\toolchain\llvm-mingw-20260826-ucrt-x86_64\bin');$env:PATH"
|
||||
$env:CARGO_TARGET_DIR = Join-Path $taskRoot '.local\target-gnullvm'
|
||||
# Keep this small development disk from accumulating multi-GiB incremental caches.
|
||||
$env:CARGO_INCREMENTAL = '0'
|
||||
$env:CARGO_TARGET_X86_64_PC_WINDOWS_GNULLVM_LINKER = 'clang.exe'
|
||||
@@ -0,0 +1,77 @@
|
||||
{
|
||||
"start": "2026-09-23T09:08:07.906733+00:00",
|
||||
"command": [
|
||||
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\examples\\multiselect_native.exe",
|
||||
"check",
|
||||
"unchanged",
|
||||
"C:\\ar-multiselect-9e8r6t\\.local\\multiselect-native\\fixture-2\\baseline.json",
|
||||
"C:\\ar-multiselect-9e8r6t\\.local\\multiselect-native\\run-2\\snapshots\\baseline\\source\\project.arcadia"
|
||||
],
|
||||
"buildReceipt": {
|
||||
"bytes": 3131,
|
||||
"sha256": "fbecac3b0f7913db5e2ad19043c7df167a92287833ddf3ea4f24766e86ae523b"
|
||||
},
|
||||
"binary": {
|
||||
"bytes": 22162432,
|
||||
"sha256": "4de47a2b62192be6a1394e654f368be19e36fb966d60d6c833a5d51d18247bb1"
|
||||
},
|
||||
"helper": {
|
||||
"bytes": 2494,
|
||||
"sha256": "1dbfff41f07bd750d4e550660d91ae9790d2442fbfe685dc88b7f63a47f5acb8"
|
||||
},
|
||||
"source": {
|
||||
"oa/activities/activity_activity_a.arcadia": {
|
||||
"bytes": 474,
|
||||
"sha256": "9bf7c5637d87c97213cf869118e942e8a29a67b429fa58e4de42235bba0980ee"
|
||||
},
|
||||
"oa/activities/activity_activity_b.arcadia": {
|
||||
"bytes": 286,
|
||||
"sha256": "152007669b7c570674aff99615a48a6f557be50f88bbbb3a5edc20b423c79a1f"
|
||||
},
|
||||
"oa/activities/activity_activity_c.arcadia": {
|
||||
"bytes": 153,
|
||||
"sha256": "d726b6b4e1200edd9ef752bb767e38d3d69dcac8eb6135d5f83c93832ff849b1"
|
||||
},
|
||||
"project.arcadia": {
|
||||
"bytes": 597,
|
||||
"sha256": "e7bd67c5785a78766298255ed3d53ff6d65dcd24bde1570ac8a0ff45cc9dc385"
|
||||
},
|
||||
"sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 162,
|
||||
"sha256": "1c724a9204784435e729badd4ad164b1a6b891840bb1ddc354ac1e175e3d712c"
|
||||
},
|
||||
"traceability.arcadia": {
|
||||
"bytes": 522,
|
||||
"sha256": "26b0b10715ced7aefcde941e6d1c1a6973f174997eae989e32a25c695dfb7cd1"
|
||||
},
|
||||
"views/diagram_oa_other.arcadia": {
|
||||
"bytes": 315,
|
||||
"sha256": "06ceef9cfdbb3ef229a22db6c48d8bb808388e027c37294648555ecbfb6bfab9"
|
||||
},
|
||||
"views/diagram_oa_view.arcadia": {
|
||||
"bytes": 1896,
|
||||
"sha256": "4e7d47d6a03153070687136c89faf01fc6df45ae89e2695beeab2fe4872dbc88"
|
||||
},
|
||||
"views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "c75b0fe14496631c9b017a32e277d1e5ad5b25e00e06b804fc54d950d7fb57f6"
|
||||
}
|
||||
},
|
||||
"baseline": {
|
||||
"bytes": 8944,
|
||||
"sha256": "d1278e58cd31e1d61093292eddc1d7b2cc9c8cdc7fe5dd3801de8411af8db89d"
|
||||
},
|
||||
"finish": "2026-09-23T09:08:08.158861+00:00",
|
||||
"exitCode": 0,
|
||||
"binaryUnchanged": true,
|
||||
"workingSourceUnchanged": true,
|
||||
"baselineUnchanged": true,
|
||||
"stdout": {
|
||||
"bytes": 441,
|
||||
"sha256": "12842cc4e483e2546f5c8615b17fe72c5fe07f3fb4440469071433c82d9a9b30"
|
||||
},
|
||||
"stderr": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"start": "2026-09-23T09:08:07.906733+00:00",
|
||||
"command": [
|
||||
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\examples\\multiselect_native.exe",
|
||||
"check",
|
||||
"unchanged",
|
||||
"C:\\ar-multiselect-9e8r6t\\.local\\multiselect-native\\fixture-2\\baseline.json",
|
||||
"C:\\ar-multiselect-9e8r6t\\.local\\multiselect-native\\run-2\\snapshots\\baseline\\source\\project.arcadia"
|
||||
],
|
||||
"buildReceipt": {
|
||||
"bytes": 3131,
|
||||
"sha256": "fbecac3b0f7913db5e2ad19043c7df167a92287833ddf3ea4f24766e86ae523b"
|
||||
},
|
||||
"binary": {
|
||||
"bytes": 22162432,
|
||||
"sha256": "4de47a2b62192be6a1394e654f368be19e36fb966d60d6c833a5d51d18247bb1"
|
||||
},
|
||||
"helper": {
|
||||
"bytes": 2494,
|
||||
"sha256": "1dbfff41f07bd750d4e550660d91ae9790d2442fbfe685dc88b7f63a47f5acb8"
|
||||
},
|
||||
"source": {
|
||||
"oa/activities/activity_activity_a.arcadia": {
|
||||
"bytes": 474,
|
||||
"sha256": "9bf7c5637d87c97213cf869118e942e8a29a67b429fa58e4de42235bba0980ee"
|
||||
},
|
||||
"oa/activities/activity_activity_b.arcadia": {
|
||||
"bytes": 286,
|
||||
"sha256": "152007669b7c570674aff99615a48a6f557be50f88bbbb3a5edc20b423c79a1f"
|
||||
},
|
||||
"oa/activities/activity_activity_c.arcadia": {
|
||||
"bytes": 153,
|
||||
"sha256": "d726b6b4e1200edd9ef752bb767e38d3d69dcac8eb6135d5f83c93832ff849b1"
|
||||
},
|
||||
"project.arcadia": {
|
||||
"bytes": 597,
|
||||
"sha256": "e7bd67c5785a78766298255ed3d53ff6d65dcd24bde1570ac8a0ff45cc9dc385"
|
||||
},
|
||||
"sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 162,
|
||||
"sha256": "1c724a9204784435e729badd4ad164b1a6b891840bb1ddc354ac1e175e3d712c"
|
||||
},
|
||||
"traceability.arcadia": {
|
||||
"bytes": 522,
|
||||
"sha256": "26b0b10715ced7aefcde941e6d1c1a6973f174997eae989e32a25c695dfb7cd1"
|
||||
},
|
||||
"views/diagram_oa_other.arcadia": {
|
||||
"bytes": 315,
|
||||
"sha256": "06ceef9cfdbb3ef229a22db6c48d8bb808388e027c37294648555ecbfb6bfab9"
|
||||
},
|
||||
"views/diagram_oa_view.arcadia": {
|
||||
"bytes": 1896,
|
||||
"sha256": "4e7d47d6a03153070687136c89faf01fc6df45ae89e2695beeab2fe4872dbc88"
|
||||
},
|
||||
"views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "c75b0fe14496631c9b017a32e277d1e5ad5b25e00e06b804fc54d950d7fb57f6"
|
||||
}
|
||||
},
|
||||
"baseline": {
|
||||
"bytes": 8944,
|
||||
"sha256": "d1278e58cd31e1d61093292eddc1d7b2cc9c8cdc7fe5dd3801de8411af8db89d"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"baseline": "C:\\ar-multiselect-9e8r6t\\.local\\multiselect-native\\fixture-2\\baseline.json",
|
||||
"comparison": "complete Project equality",
|
||||
"inferred_common_delta": null,
|
||||
"limits": "Invariant evaluator only; no pointer/action/focus/Undo/source-byte acceptance claim",
|
||||
"mode": "unchanged",
|
||||
"result": "PASS",
|
||||
"saved": "C:\\ar-multiselect-9e8r6t\\.local\\multiselect-native\\run-2\\snapshots\\baseline\\source\\project.arcadia"
|
||||
}
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
{
|
||||
"start": "2026-09-23T09:07:10.546708+00:00",
|
||||
"command": [
|
||||
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\examples\\multiselect_native.exe",
|
||||
"check",
|
||||
"unchanged",
|
||||
"C:\\ar-multiselect-9e8r6t\\.local\\multiselect-native\\fixture-2\\baseline.json",
|
||||
"C:\\ar-multiselect-9e8r6t\\.local\\multiselect-native\\run-2\\snapshots\\baseline\\source\\project.arcadia"
|
||||
],
|
||||
"buildReceipt": {
|
||||
"bytes": 3131,
|
||||
"sha256": "fbecac3b0f7913db5e2ad19043c7df167a92287833ddf3ea4f24766e86ae523b"
|
||||
},
|
||||
"binary": {
|
||||
"bytes": 22162432,
|
||||
"sha256": "4de47a2b62192be6a1394e654f368be19e36fb966d60d6c833a5d51d18247bb1"
|
||||
},
|
||||
"helper": {
|
||||
"bytes": 2494,
|
||||
"sha256": "1dbfff41f07bd750d4e550660d91ae9790d2442fbfe685dc88b7f63a47f5acb8"
|
||||
},
|
||||
"source": {
|
||||
"oa/activities/activity_activity_a.arcadia": {
|
||||
"bytes": 474,
|
||||
"sha256": "9bf7c5637d87c97213cf869118e942e8a29a67b429fa58e4de42235bba0980ee"
|
||||
},
|
||||
"oa/activities/activity_activity_b.arcadia": {
|
||||
"bytes": 286,
|
||||
"sha256": "152007669b7c570674aff99615a48a6f557be50f88bbbb3a5edc20b423c79a1f"
|
||||
},
|
||||
"oa/activities/activity_activity_c.arcadia": {
|
||||
"bytes": 153,
|
||||
"sha256": "d726b6b4e1200edd9ef752bb767e38d3d69dcac8eb6135d5f83c93832ff849b1"
|
||||
},
|
||||
"project.arcadia": {
|
||||
"bytes": 597,
|
||||
"sha256": "e7bd67c5785a78766298255ed3d53ff6d65dcd24bde1570ac8a0ff45cc9dc385"
|
||||
},
|
||||
"sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 162,
|
||||
"sha256": "1c724a9204784435e729badd4ad164b1a6b891840bb1ddc354ac1e175e3d712c"
|
||||
},
|
||||
"traceability.arcadia": {
|
||||
"bytes": 522,
|
||||
"sha256": "26b0b10715ced7aefcde941e6d1c1a6973f174997eae989e32a25c695dfb7cd1"
|
||||
},
|
||||
"views/diagram_oa_other.arcadia": {
|
||||
"bytes": 315,
|
||||
"sha256": "06ceef9cfdbb3ef229a22db6c48d8bb808388e027c37294648555ecbfb6bfab9"
|
||||
},
|
||||
"views/diagram_oa_view.arcadia": {
|
||||
"bytes": 1896,
|
||||
"sha256": "4e7d47d6a03153070687136c89faf01fc6df45ae89e2695beeab2fe4872dbc88"
|
||||
},
|
||||
"views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "c75b0fe14496631c9b017a32e277d1e5ad5b25e00e06b804fc54d950d7fb57f6"
|
||||
}
|
||||
},
|
||||
"baseline": {
|
||||
"bytes": 8944,
|
||||
"sha256": "d1278e58cd31e1d61093292eddc1d7b2cc9c8cdc7fe5dd3801de8411af8db89d"
|
||||
},
|
||||
"finish": "2026-09-23T09:07:10.828848+00:00",
|
||||
"exitCode": 3221225781,
|
||||
"binaryUnchanged": true,
|
||||
"workingSourceUnchanged": true,
|
||||
"baselineUnchanged": true,
|
||||
"stdout": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"stderr": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
}
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
oa_activity activity_a "A - receive request" id "f0149281-4798-58d3-acff-131eed250959" {
|
||||
description "Preserve engineering record activity_a.";
|
||||
}
|
||||
|
||||
oa_activity activity_child "A.1 - classify request" id "5a80d3af-c7ee-59eb-9680-eb80d60cb94f" {
|
||||
description "Preserve engineering record activity_child.";
|
||||
parent @activity_a;
|
||||
}
|
||||
|
||||
interaction internal "Request assessment" id "be7a39d9-3463-534e-b37b-76a74077d434" {
|
||||
source @activity_a;
|
||||
target @activity_b;
|
||||
}
|
||||
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
oa_activity activity_b "B - assess request" id "ecf076b7-e8be-5f64-8808-6a2edae5b9e2" {
|
||||
description "Preserve engineering record activity_b.";
|
||||
}
|
||||
|
||||
interaction external "Response decision" id "927dfa82-40d2-5c5f-a525-6a884725ea1d" {
|
||||
source @activity_b;
|
||||
target @activity_c;
|
||||
}
|
||||
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
oa_activity activity_c "C - dispatch response" id "3b258d00-854d-5ddd-a057-16eedbe31714" {
|
||||
description "Preserve engineering record activity_c.";
|
||||
}
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
arcadia 7;
|
||||
project multiselect_native "Multiselect native" id "c1deb118-0fb0-5692-8b80-d24339e5b6c3" {
|
||||
description "Shift-select A and B; move together, retain C and engineering semantics.";
|
||||
include "oa/activities/activity_activity_a.arcadia";
|
||||
include "oa/activities/activity_activity_b.arcadia";
|
||||
include "oa/activities/activity_activity_c.arcadia";
|
||||
include "sa/functions/function_sa_function.arcadia";
|
||||
include "traceability.arcadia";
|
||||
include "views/diagram_oa_other.arcadia";
|
||||
include "views/diagram_oa_view.arcadia";
|
||||
include "views/diagram_sa_view.arcadia";
|
||||
}
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
sa_function sa_function "Technical request processing" id "878a1b33-a7c2-5a68-a8b6-d8273c6354e0" {
|
||||
description "Preserve engineering record sa_function.";
|
||||
}
|
||||
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
trace preserved_refinement "Reviewed request refinement" id "b42fb6e3-db90-5349-b957-faeba373ba91" {
|
||||
baseline {
|
||||
oa {
|
||||
description "Preserve engineering record activity_a.";
|
||||
name "A - receive request";
|
||||
};
|
||||
sa {
|
||||
description "Preserve engineering record sa_function.";
|
||||
name "Technical request processing";
|
||||
};
|
||||
};
|
||||
description "Group geometry and Hide preserve this trace and both endpoints.";
|
||||
oa @activity_a;
|
||||
sa @sa_function;
|
||||
}
|
||||
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
diagram oa_other "Other OA view - preserve" id "c4a58011-d2d7-59b1-ad58-feacef0e2d78" {
|
||||
description "Selection changes placement geometry only.";
|
||||
}
|
||||
|
||||
node other_a id "9aa9a68b-4c26-5d21-bc35-63d3f0f311d6" {
|
||||
diagram @oa_other;
|
||||
element @activity_a;
|
||||
position {
|
||||
x 40.0;
|
||||
y 60.0;
|
||||
};
|
||||
}
|
||||
|
||||
+93
@@ -0,0 +1,93 @@
|
||||
diagram oa_view "Multiselect native - OA overview" id "00000000-0000-0000-0000-000000290001" {
|
||||
description "Selection changes placement geometry only.";
|
||||
routes [{
|
||||
edge @internal;
|
||||
label {
|
||||
fraction 0.44999998807907104;
|
||||
offset {
|
||||
x 7.0;
|
||||
y -19.0;
|
||||
};
|
||||
};
|
||||
source_attachment {
|
||||
offset 0.25;
|
||||
side Right;
|
||||
};
|
||||
target_attachment {
|
||||
offset 0.699999988079071;
|
||||
side Left;
|
||||
};
|
||||
waypoints [{
|
||||
x 420.0;
|
||||
y 145.0;
|
||||
}, {
|
||||
x 420.0;
|
||||
y 186.0;
|
||||
}];
|
||||
}, {
|
||||
edge @external;
|
||||
label {
|
||||
fraction 0.44999998807907104;
|
||||
offset {
|
||||
x 7.0;
|
||||
y -19.0;
|
||||
};
|
||||
};
|
||||
source_attachment {
|
||||
offset 0.25;
|
||||
side Right;
|
||||
};
|
||||
target_attachment {
|
||||
offset 0.699999988079071;
|
||||
side Left;
|
||||
};
|
||||
waypoints [{
|
||||
x 725.0;
|
||||
y 150.0;
|
||||
}, {
|
||||
x 725.0;
|
||||
y 336.0;
|
||||
}];
|
||||
}];
|
||||
}
|
||||
|
||||
node node_a id "2670dd46-9fe7-5047-b13d-59817cff96dd" {
|
||||
diagram @oa_view;
|
||||
element @activity_a;
|
||||
position {
|
||||
x 80.0;
|
||||
y 80.0;
|
||||
};
|
||||
size {
|
||||
height 260.0;
|
||||
width 310.0;
|
||||
};
|
||||
}
|
||||
|
||||
node node_b id "70e322db-f401-58c8-a50e-2f71c61ad721" {
|
||||
diagram @oa_view;
|
||||
element @activity_b;
|
||||
position {
|
||||
x 470.0;
|
||||
y 120.0;
|
||||
};
|
||||
}
|
||||
|
||||
node node_c id "d6b89a5a-6e2f-50f9-9d1e-993304a54583" {
|
||||
diagram @oa_view;
|
||||
element @activity_c;
|
||||
position {
|
||||
x 780.0;
|
||||
y 270.0;
|
||||
};
|
||||
}
|
||||
|
||||
node node_child id "87f4652b-15ef-55ed-ad7e-cc5d22b7facb" {
|
||||
diagram @oa_view;
|
||||
element @activity_child;
|
||||
position {
|
||||
x 120.0;
|
||||
y 210.0;
|
||||
};
|
||||
}
|
||||
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
diagram sa_view "SA engineering - preserve" id "637b9a3e-bd74-534c-9be5-4470a408729f" {
|
||||
description "Selection changes placement geometry only.";
|
||||
layer Sa;
|
||||
}
|
||||
|
||||
node sa_node id "5f1b1c24-0583-5923-a69c-d0ea99ccb18c" {
|
||||
diagram @sa_view;
|
||||
element @sa_function;
|
||||
position {
|
||||
x 100.0;
|
||||
y 110.0;
|
||||
};
|
||||
}
|
||||
|
||||
+64
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"start": "2026-09-23T09:07:10.546708+00:00",
|
||||
"command": [
|
||||
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\examples\\multiselect_native.exe",
|
||||
"check",
|
||||
"unchanged",
|
||||
"C:\\ar-multiselect-9e8r6t\\.local\\multiselect-native\\fixture-2\\baseline.json",
|
||||
"C:\\ar-multiselect-9e8r6t\\.local\\multiselect-native\\run-2\\snapshots\\baseline\\source\\project.arcadia"
|
||||
],
|
||||
"buildReceipt": {
|
||||
"bytes": 3131,
|
||||
"sha256": "fbecac3b0f7913db5e2ad19043c7df167a92287833ddf3ea4f24766e86ae523b"
|
||||
},
|
||||
"binary": {
|
||||
"bytes": 22162432,
|
||||
"sha256": "4de47a2b62192be6a1394e654f368be19e36fb966d60d6c833a5d51d18247bb1"
|
||||
},
|
||||
"helper": {
|
||||
"bytes": 2494,
|
||||
"sha256": "1dbfff41f07bd750d4e550660d91ae9790d2442fbfe685dc88b7f63a47f5acb8"
|
||||
},
|
||||
"source": {
|
||||
"oa/activities/activity_activity_a.arcadia": {
|
||||
"bytes": 474,
|
||||
"sha256": "9bf7c5637d87c97213cf869118e942e8a29a67b429fa58e4de42235bba0980ee"
|
||||
},
|
||||
"oa/activities/activity_activity_b.arcadia": {
|
||||
"bytes": 286,
|
||||
"sha256": "152007669b7c570674aff99615a48a6f557be50f88bbbb3a5edc20b423c79a1f"
|
||||
},
|
||||
"oa/activities/activity_activity_c.arcadia": {
|
||||
"bytes": 153,
|
||||
"sha256": "d726b6b4e1200edd9ef752bb767e38d3d69dcac8eb6135d5f83c93832ff849b1"
|
||||
},
|
||||
"project.arcadia": {
|
||||
"bytes": 597,
|
||||
"sha256": "e7bd67c5785a78766298255ed3d53ff6d65dcd24bde1570ac8a0ff45cc9dc385"
|
||||
},
|
||||
"sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 162,
|
||||
"sha256": "1c724a9204784435e729badd4ad164b1a6b891840bb1ddc354ac1e175e3d712c"
|
||||
},
|
||||
"traceability.arcadia": {
|
||||
"bytes": 522,
|
||||
"sha256": "26b0b10715ced7aefcde941e6d1c1a6973f174997eae989e32a25c695dfb7cd1"
|
||||
},
|
||||
"views/diagram_oa_other.arcadia": {
|
||||
"bytes": 315,
|
||||
"sha256": "06ceef9cfdbb3ef229a22db6c48d8bb808388e027c37294648555ecbfb6bfab9"
|
||||
},
|
||||
"views/diagram_oa_view.arcadia": {
|
||||
"bytes": 1896,
|
||||
"sha256": "4e7d47d6a03153070687136c89faf01fc6df45ae89e2695beeab2fe4872dbc88"
|
||||
},
|
||||
"views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "c75b0fe14496631c9b017a32e277d1e5ad5b25e00e06b804fc54d950d7fb57f6"
|
||||
}
|
||||
},
|
||||
"baseline": {
|
||||
"bytes": 8944,
|
||||
"sha256": "d1278e58cd31e1d61093292eddc1d7b2cc9c8cdc7fe5dd3801de8411af8db89d"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
# Native multiselect evidence package
|
||||
|
||||
This package preserves native run-1 and run-2, both closed with exit 0, empty app
|
||||
stdout/stderr and all three GUI/checker/fixture unchanged flags true. Each run
|
||||
contains nine positive complete-Project checker snapshots, nine source files per
|
||||
snapshot and three exact source-history equality groups. Only
|
||||
`views/diagram_oa_view.arcadia` differs from baseline in its move and hidden
|
||||
states. These artifacts do not establish native acceptance on their own; consult
|
||||
the separate [saved-view report](../../../multiselect-saved-view-20260923.md) for
|
||||
action observations, usability findings and the implemented subset of issue 29.
|
||||
|
||||
| Run | Source commit | Captures | Layout scope |
|
||||
| --- | --- | ---: | --- |
|
||||
| run-1 | `12a7352ddef5f69a144ead8219a50916233d63a9` | 27 | Before selection/status toolbar correction |
|
||||
| run-2 | `f6a6010baed9e6164a1fcc7ecd58256a562827d7` | 24 | Corrected toolbar layout build |
|
||||
|
||||
Run-1 GUI/checker build receipts refer to the 729-file input map
|
||||
`55a5f354bb5049a8c77ba9bafa833438ebf754649b0cf5d175d0c8dcfcedd7bb`;
|
||||
run-2 refers to the distinct 729-file map
|
||||
`99dc46645236e674244e7c4867595a6000d3d85b54bcc9ab2b0c601923ecf66c`.
|
||||
The [source identity evidence](../source/README.md) ties those maps to the commits
|
||||
above. The GUI binary pins differ; the recorded checker binary pins match.
|
||||
Run-1 is retained as evidence of the earlier layout, not as verification of the
|
||||
corrected build.
|
||||
|
||||
The first run-2 baseline checker attempt failed before the successful retry after
|
||||
the toolchain environment was initialized. Its unchanged raw snapshot and retry
|
||||
comparison are preserved separately in the [environment incident](../incidents/README.md).
|
||||
The successful retry is the baseline snapshot included in this native package;
|
||||
the failed invocation is not silently reclassified or presented as a GUI failure.
|
||||
|
||||
These Python 3.10+ standard-library tools never operate the GUI or rerun the model
|
||||
checker. From the checkout root, validate both raw runs without writing a package:
|
||||
|
||||
```text
|
||||
python -B harness/experiments/multiselect-20260923/native/prepare.py --root . --runs run-1 run-2 --check-only
|
||||
```
|
||||
|
||||
Omit `--check-only` to package; optionally choose `--output DIRECTORY`. The default
|
||||
is this native directory. Existing package outputs are not overwritten. A missing
|
||||
or unfinished run, changed recorded inputs, missing/extra fixture or snapshot
|
||||
files, unmatched helper bytes, or inconsistent receipts fails preparation.
|
||||
|
||||
Verify a completed package independently of the original machine:
|
||||
|
||||
```text
|
||||
python -B PATH_TO_PACKAGE/verify.py
|
||||
```
|
||||
|
||||
Each run includes all original capture JSON/images, process/start/finish records,
|
||||
generation and app streams, all nine source snapshots and checker streams/receipts,
|
||||
and the history-bytes record. Its fixture includes baseline JSON, the manifest,
|
||||
and canonical source files. Exact helpers are found by their recorded hashes among
|
||||
the native directory's `.py`/`.js` files, so original and suffixed run-2 helpers can
|
||||
coexist. Helpers are archived as data and never executed by these tools.
|
||||
|
||||
Referenced GUI/checker build results, exact gate helpers and input maps are
|
||||
included. The checker example is read from its pinned historical input ZIP, not
|
||||
from current source.
|
||||
Full build logs and large source ZIPs belong in the sibling `checks` package;
|
||||
verify that package separately. This package validates build receipt, input map,
|
||||
example-source and executable-pin relationships without duplicating those ZIPs.
|
||||
It does not contain or execute the GUI/checker binaries.
|
||||
|
||||
The verifier checks every archived byte pin and exact safe membership, clean
|
||||
recorded exit and unchanged flags, process and capture lifetimes, each capture's
|
||||
normalized executable path against the launched GUI, one consistent positive
|
||||
window ID per run, fixture/source inventories, nine positive complete-Project
|
||||
checker reports, baseline/binary/helper
|
||||
relationships, and the actual archived bytes in three history equality groups.
|
||||
It verifies that only `views/diagram_oa_view.arcadia` differs from baseline in the
|
||||
move and hidden source states, and that baseline source bytes match the fixture.
|
||||
Window identity checks join recorded metadata; the receipts do not independently
|
||||
map that window handle to the recorded PID. Source models are not recompiled by
|
||||
this offline Python verifier. Screenshot dimensions are recorded metadata, not a
|
||||
minimum-window usability evaluation.
|
||||
|
||||
`manifest.json` maps each run's original historical paths to archived run,
|
||||
fixture, helper, build and checker-source members and pins their bytes.
|
||||
`files.json` pins the packager, verifier, README, manifest and archive. Raw bytes
|
||||
are preserved; ZIP ordering and timestamps are fixed. Historic absolute paths are
|
||||
labels and are not accessed by offline verification.
|
||||
|
||||
GUI actions remain separately documented parent observations. Screenshots do
|
||||
not prove which inputs occurred, and the checker infers a bounded common delta
|
||||
from saved geometry; it cannot validate the exact pointer destination. Source
|
||||
history byte equality supports the stated saved-state relationships but does not
|
||||
independently authenticate button presses, focus behavior or Undo stack structure.
|
||||
Run-1 evidence does not establish the corrected toolbar's usability or any later
|
||||
binary's behavior. Consult the parent report for the evaluated version, observed
|
||||
limitations, run differences and the remaining full-issue acceptance work.
|
||||
Binary file not shown.
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"prepare.py": {
|
||||
"bytes": 7237,
|
||||
"sha256": "d9d49d3082e485e670b43010822ebd3ab7a79762b36a247dcd3bdfc6b5d7f41d"
|
||||
},
|
||||
"verify.py": {
|
||||
"bytes": 14703,
|
||||
"sha256": "7ef5f28b6c9a43bf0361eec2d8be33a1e9f284d0ffc21b50fd09a2d082642ce3"
|
||||
},
|
||||
"README.md": {
|
||||
"bytes": 5418,
|
||||
"sha256": "8d6fa25d8bd97c654e78b89194bd499637427ce027157d568215e13421b22c03"
|
||||
},
|
||||
"manifest.json": {
|
||||
"bytes": 72794,
|
||||
"sha256": "de7642ad43aa881f7d984629db52ea41b62d0ebacc09260edd80a5c1fee7dd7b"
|
||||
},
|
||||
"evidence.zip": {
|
||||
"bytes": 4399281,
|
||||
"sha256": "7dc3e0571179e0f67fefe3c73462308b79e4c7f7a09bbd805e0acf0e4faeb1cf"
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,129 @@
|
||||
"""Package explicit completed native runs; helpers are pinned data, never executed."""
|
||||
from pathlib import Path
|
||||
import argparse
|
||||
import json
|
||||
import re
|
||||
import zipfile
|
||||
from verify import pin, parsed, need, norm, relative, safe, verify_data, verify_package
|
||||
|
||||
HERE = Path(__file__).resolve().parent
|
||||
|
||||
|
||||
def collect(root, runs):
|
||||
native = root / ".local/multiselect-native"
|
||||
candidates = [path for path in native.iterdir() if path.is_file() and path.suffix in (".py", ".js")]
|
||||
candidates.extend(sorted((root / ".local/group-movement-gates").glob("*.py")))
|
||||
helpers = [(path.suffix, path.read_bytes()) for path 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
|
||||
def tree(folder, prefix):
|
||||
need(folder.is_dir(), "missing directory: " + str(folder))
|
||||
for path in sorted(folder.rglob("*")):
|
||||
need(not path.is_symlink(), "symlink evidence input")
|
||||
if path.is_file():
|
||||
add(prefix + path.relative_to(folder).as_posix(), path.read_bytes())
|
||||
for run in runs:
|
||||
folder = native / run
|
||||
start = parsed((folder / "started.json").read_bytes())
|
||||
end = parsed((folder / "finished.json").read_bytes())
|
||||
need(end["exitCode"] == 0 and all(end[k] is True for k in
|
||||
("guiUnchanged", "checkerUnchanged", "fixtureUnchanged")), "unfinished/changed native run: " + run)
|
||||
generation = parsed((folder / "generation.json").read_bytes())
|
||||
history = parsed((folder / "history-bytes.json").read_bytes())
|
||||
tree(folder, "runs/" + run + "/raw/")
|
||||
fixture_relative = relative(generation["command"][2], start["cwd"])
|
||||
need(fixture_relative.startswith(".local/multiselect-native/"), "fixture outside native root")
|
||||
tree(root / fixture_relative, "runs/" + run + "/fixture/")
|
||||
spec = {"originalRun": norm(start["cwd"]) + "/.local/multiselect-native/" + run,
|
||||
"originalFixture": norm(generation["command"][2]), "helpers": {}, "builds": {}}
|
||||
for key, expected in [("helper", start["helper"]), ("capture", start["capture"]),
|
||||
("snapshotHelper", start["snapshotHelper"]), ("history", history["helper"])]:
|
||||
matches = [(suffix, data) for suffix, data in helpers if pin(data) == expected]
|
||||
need(bool(matches), "exact historical helper unavailable: " + key)
|
||||
suffix, data = matches[0]
|
||||
member = "helpers/" + expected["sha256"] + suffix
|
||||
add(member, data)
|
||||
spec["helpers"][key] = member
|
||||
for kind in ("gui", "checker"):
|
||||
recorded = start[kind]
|
||||
rel = relative(recorded["receipt"], start["cwd"])
|
||||
need(rel.startswith(".local/group-movement-gates/") and rel.endswith("/result.json"), "unexpected build receipt location")
|
||||
receipt = root / rel
|
||||
data = receipt.read_bytes()
|
||||
need(pin(data) == recorded["receiptPin"], "historical build receipt changed")
|
||||
prefix = "builds/" + pin(data)["sha256"] + "/"
|
||||
add(prefix + "result.json", data)
|
||||
inputs_data = (receipt.parent / "inputs.json").read_bytes()
|
||||
need(pin(inputs_data) == recorded["inputs"], "historical build input map changed")
|
||||
add(prefix + "inputs.json", inputs_data)
|
||||
spec["builds"][kind] = {"receipt": prefix + "result.json", "inputs": prefix + "inputs.json", "originalRelative": rel}
|
||||
build_helper = parsed(data)["helper"]
|
||||
matching_helpers = [(suffix, value) for suffix, value in helpers if pin(value) == build_helper]
|
||||
need(bool(matching_helpers), "exact historical build helper unavailable")
|
||||
suffix, helper_data = matching_helpers[0]
|
||||
helper_member = "helpers/" + build_helper["sha256"] + suffix
|
||||
add(helper_member, helper_data)
|
||||
spec["builds"][kind]["helper"] = helper_member
|
||||
if kind == "checker":
|
||||
# Read only the pinned historical example, not today's checkout.
|
||||
archive_path = receipt.parent / "inputs.zip"
|
||||
need(pin(archive_path.read_bytes()) == parsed(data)["archive"], "checker input archive pin")
|
||||
source_path = "crates/oa-core/examples/multiselect_native.rs"
|
||||
with zipfile.ZipFile(archive_path) as archive:
|
||||
source = archive.read(source_path)
|
||||
need(pin(source) == parsed(inputs_data)[source_path], "historical checker source pin")
|
||||
member = "checker-source/" + pin(source)["sha256"] + ".rs"
|
||||
add(member, source)
|
||||
spec["checkerSource"] = {"inputPath": source_path, "member": member}
|
||||
specs[run] = spec
|
||||
manifest = {"schema": 1, "kind": "multiselect-native", "runs": specs,
|
||||
"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 stream:
|
||||
stream.write((json.dumps(value, indent=2) + "\n").encode())
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--root", type=Path, default=HERE.parents[3])
|
||||
parser.add_argument("--runs", nargs="+", required=True)
|
||||
parser.add_argument("--output", type=Path, default=HERE)
|
||||
parser.add_argument("--check-only", action="store_true")
|
||||
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")
|
||||
payload, manifest, summary = collect(args.root.resolve(), args.runs)
|
||||
if args.check_only:
|
||||
print("PASS raw consistency; no archive written:", summary)
|
||||
return
|
||||
out = args.output.resolve()
|
||||
out.mkdir(parents=True, exist_ok=True)
|
||||
for name in ("evidence.zip", "manifest.json", "files.json"):
|
||||
need(not (out / name).exists(), "existing output refused: " + name)
|
||||
for name in ("prepare.py", "verify.py", "README.md"):
|
||||
data = (HERE / name).read_bytes()
|
||||
if (out / name).exists():
|
||||
need((out / name).read_bytes() == data, "different existing package tool")
|
||||
else:
|
||||
with (out / name).open("xb") as stream:
|
||||
stream.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 evidence")
|
||||
print("PASS package readback:", out, summary)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,235 @@
|
||||
"""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 math
|
||||
import stat
|
||||
import zipfile
|
||||
|
||||
BASE = {"started.json", "finished.json", "generation.json", "generation.stdout.log",
|
||||
"generation.stderr.log", "app.stdout.log", "app.stderr.log", "processes.json", "history-bytes.json"}
|
||||
GROUPS = [["baseline", "move-undo", "before-hide", "hide-undo"], ["move", "move-redo"],
|
||||
["hidden", "hide-redo", "reopened-hidden"]]
|
||||
MODES = {name: mode for group, mode in zip(GROUPS, ["unchanged", "moved", "hide"]) for name in group}
|
||||
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"] == "multiselect-native", "manifest kind")
|
||||
members, runs = manifest["members"], manifest["runs"]
|
||||
need(bool(runs) and all(safe(run) and "/" not in 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 = 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, "exact pinned tree: " + prefix)
|
||||
return actual
|
||||
for run, spec in runs.items():
|
||||
prefix = "runs/" + run + "/raw/"
|
||||
start, end = obj(prefix + "started.json"), obj(prefix + "finished.json")
|
||||
generation, process = obj(prefix + "generation.json"), obj(prefix + "processes.json")
|
||||
history = obj(prefix + "history-bytes.json")
|
||||
need(end["exitCode"] == 0 and all(end[key] is True for key in
|
||||
("guiUnchanged", "checkerUnchanged", "fixtureUnchanged")), run + ": clean unchanged closure")
|
||||
need(ordered(generation["start"], generation["finish"], process["CreationDate"], start["start"], end["finish"], history["verified"]), run + ": process/generation times")
|
||||
need(process["ProcessId"] == start["pid"] and type(start["pid"]) is int and start["pid"] > 0, run + ": process identity")
|
||||
need(norm(process["ExecutablePath"]) == norm(start["gui"]["binary"])
|
||||
and start["command"] == [start["gui"]["binary"]], run + ": GUI command")
|
||||
need(spec["originalRun"] == norm(start["cwd"]) + "/.local/multiselect-native/" + run, run + ": original run mapping")
|
||||
need(generation["exitCode"] == 0 and generation["checker"] == start["checker"], run + ": generation checker")
|
||||
need(generation["command"][:2] == [start["checker"]["binary"], "generate"]
|
||||
and len(generation["command"]) == 3 and norm(generation["command"][2]) == spec["originalFixture"], run + ": generation command")
|
||||
for stream in ("stdout", "stderr"):
|
||||
need(end[stream] == pin(raw(prefix + "app." + stream + ".log")), run + ": app stream")
|
||||
need(generation[stream] == pin(raw(prefix + "generation." + stream + ".log")), run + ": generation stream")
|
||||
fixture = pinned_tree("runs/" + run + "/fixture/", start["fixture"])
|
||||
need(set(fixture) == {"baseline.json", "manifest.json"} | {"source/" + name for name in
|
||||
obj(prefix + "snapshots/baseline/result.json")["source"]}, run + ": fixture membership")
|
||||
fixture_manifest = parsed(fixture["manifest.json"])
|
||||
need(fixture_manifest["fixture"] == "multiselect-native-20260923"
|
||||
and fixture_manifest["source_entry"] == "project.arcadia", run + ": fixture identity")
|
||||
need(parsed(fixture["baseline.json"])["id"] == fixture_manifest["ids"]["project"], run + ": baseline identity")
|
||||
for key, expected in [("helper", start["helper"]), ("capture", start["capture"]),
|
||||
("snapshotHelper", start["snapshotHelper"]), ("history", history["helper"])]:
|
||||
need(pin(raw(spec["helpers"][key])) == expected, run + ": helper " + key)
|
||||
builds = {}
|
||||
for kind, target in [("gui", "arcadia-studio"), ("checker", "multiselect_native")]:
|
||||
recorded = start[kind]
|
||||
build = obj(spec["builds"][kind]["receipt"])
|
||||
need(pin(raw(spec["builds"][kind]["receipt"])) == recorded["receiptPin"], run + ": build receipt pin")
|
||||
need(relative(recorded["receipt"], start["cwd"]) == spec["builds"][kind]["originalRelative"], run + ": build path mapping")
|
||||
need(build["exitCode"] == 0 and build["inputsUnchanged"] is True
|
||||
and ordered(build["start"], build["finish"], generation["start"]), run + ": accepted preceding build")
|
||||
need(build["inputs"] == recorded["inputs"] == pin(raw(spec["builds"][kind]["inputs"])), run + ": build input map")
|
||||
need(pin(raw(spec["builds"][kind]["helper"])) == build["helper"], run + ": build helper pin")
|
||||
inputs = obj(spec["builds"][kind]["inputs"])
|
||||
need(len(inputs) == build["inputCount"] and sum(name.startswith("crates/vendor/iced_widget/") for name in inputs) == 71, run + ": build input count")
|
||||
artifacts = [item for item in build["artifacts"] if item["cargo"]["target"]["name"] == target]
|
||||
need(len(artifacts) == 1 and artifacts[0]["readback"] == recorded["pin"]
|
||||
and artifacts[0]["cargo"]["executable"] == recorded["binary"], run + ": executable relationship")
|
||||
builds[kind] = inputs
|
||||
need(start["gui"]["inputs"] == start["checker"]["inputs"], run + ": matching GUI/checker inputs")
|
||||
source = spec["checkerSource"]
|
||||
need(source["inputPath"] == "crates/oa-core/examples/multiselect_native.rs"
|
||||
and pin(raw(source["member"])) == builds["checker"][source["inputPath"]], run + ": archived exact checker source")
|
||||
|
||||
top = {name[len(prefix):] for name in members if name.startswith(prefix) and "/" not in name[len(prefix):]}
|
||||
captures = sorted(name for name in top - BASE if name.endswith(".json"))
|
||||
need(bool(captures), run + ": missing captures")
|
||||
expected_top = set(BASE) | set(captures)
|
||||
captured_window = None
|
||||
for name in captures:
|
||||
capture = obj(prefix + name)
|
||||
need(ordered(start["start"], capture["time"], end["finish"]), run + ": capture lifetime")
|
||||
window = capture["window"]
|
||||
app = window["app"]
|
||||
need(isinstance(app, str) and app.startswith("process:")
|
||||
and norm(app[len("process:"):]) == norm(start["gui"]["binary"]), run + ": captured executable relationship")
|
||||
need(type(window["id"]) is int and window["id"] > 0, run + ": captured window identity")
|
||||
if captured_window is None:
|
||||
captured_window = window["id"]
|
||||
need(window["id"] == captured_window, run + ": inconsistent captured window identity")
|
||||
need(isinstance(capture["images"], list), run + ": capture images")
|
||||
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")), run + ": capture image mapping")
|
||||
need(type(image["width"]) is int and image["width"] > 0
|
||||
and type(image["height"]) is int and image["height"] > 0, run + ": image dimensions")
|
||||
need(filename not in expected_top, run + ": duplicate image reference")
|
||||
expected_top.add(filename)
|
||||
raw(prefix + filename)
|
||||
need(top == expected_top, run + ": extra/missing top-level run files")
|
||||
|
||||
snapshots = {name[len(prefix + "snapshots/"):].split("/")[0] for name in members if name.startswith(prefix + "snapshots/")}
|
||||
need(snapshots == set(MODES), run + ": exact nine snapshot labels")
|
||||
states = {}
|
||||
for label, mode in MODES.items():
|
||||
folder = prefix + "snapshots/" + label + "/"
|
||||
began, result = obj(folder + "started.json"), obj(folder + "result.json")
|
||||
need(all(result.get(key) == value for key, value in began.items()), label + ": start/result")
|
||||
need(result["exitCode"] == 0 and all(result[key] is True for key in
|
||||
("binaryUnchanged", "workingSourceUnchanged", "baselineUnchanged")), label + ": unchanged successful checker")
|
||||
need(ordered(start["start"], result["start"], result["finish"], end["finish"]), label + ": checker lifetime")
|
||||
need(result["buildReceipt"] == start["checker"]["receiptPin"] and result["binary"] == start["checker"]["pin"]
|
||||
and result["helper"] == start["snapshotHelper"], label + ": checker provenance")
|
||||
need(result["baseline"] == pin(fixture["baseline.json"]), label + ": baseline pin")
|
||||
command = result["command"]
|
||||
need(len(command) == 5 and command[:3] == [start["checker"]["binary"], "check", mode]
|
||||
and norm(command[3]) == spec["originalFixture"] + "/baseline.json"
|
||||
and norm(command[4]) == spec["originalRun"] + "/snapshots/" + label + "/source/project.arcadia", label + ": exact checker command")
|
||||
for stream in ("stdout", "stderr"):
|
||||
need(result[stream] == pin(raw(folder + stream + ".log")), label + ": stream pin")
|
||||
need(not raw(folder + "stderr.log"), label + ": checker stderr")
|
||||
report = obj(folder + "stdout.log")
|
||||
need(report["result"] == "PASS" and report["comparison"] == "complete Project equality"
|
||||
and report["mode"] == mode and report["baseline"] == command[3] and report["saved"] == command[4], label + ": positive checker report")
|
||||
delta = report["inferred_common_delta"]
|
||||
if mode == "moved":
|
||||
need(isinstance(delta, dict) and set(delta) == {"x", "y"}
|
||||
and all(type(v) in (int, float) and math.isfinite(v) and abs(v) <= 500 for v in delta.values())
|
||||
and math.hypot(delta["x"], delta["y"]) >= 10, label + ": inferred movement bounds")
|
||||
else:
|
||||
need(delta is None, label + ": unexpected inferred delta")
|
||||
states[label] = pinned_tree(folder + "source/", result["source"])
|
||||
need(len(states[label]) == history["sourceFilesPerSnapshot"] == 9, label + ": source count")
|
||||
expected = {folder + name for name in ("started.json", "result.json", "stdout.log", "stderr.log")}
|
||||
expected.update(folder + "source/" + name for name in states[label])
|
||||
need({name for name in members if name.startswith(folder)} == expected, label + ": extra snapshot files")
|
||||
need(history["status"] == "PASS" and history["equalByteGroups"] == GROUPS, run + ": history groups")
|
||||
for group in GROUPS:
|
||||
need(all(states[label] == states[group[0]] for label in group), run + ": actual history bytes " + str(group))
|
||||
need(all(states[a[0]] != states[b[0]] for i, a in enumerate(GROUPS) for b in GROUPS[i + 1:]), run + ": distinct history states")
|
||||
need(states["baseline"] == {name[7:]: data for name, data in fixture.items() if name.startswith("source/")}, run + ": baseline source exact")
|
||||
changed = {label: sorted(name for name in set(states["baseline"]) | set(states[label])
|
||||
if states["baseline"].get(name) != states[label].get(name)) for label in ("move", "hidden")}
|
||||
need(changed == history["changedFilesFromBaseline"]
|
||||
== {label: ["views/diagram_oa_view.arcadia"] for label in ("move", "hidden")}, run + ": changed source files")
|
||||
print(run, "closed exit 0;", len(captures), "captures; nine positive snapshots; exact three-group source history")
|
||||
need(used == set(members), "unreferenced/extra package members")
|
||||
return {"runs": len(runs), "members": len(members)}
|
||||
|
||||
|
||||
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)
|
||||
|
||||
|
||||
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 native evidence byte/receipt consistency:", verify_package(args.package))
|
||||
print("No GUI/checker execution; actions and native acceptance require the separate parent review.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,2 @@
|
||||
# Preserve pinned historical receipts and helper bytes through Git round trips.
|
||||
* -text whitespace=cr-at-eol
|
||||
@@ -0,0 +1,52 @@
|
||||
# Captured inputs and committed source identity
|
||||
|
||||
This directory preserves exact historical `committed-desktop-4.json` and
|
||||
`committed-desktop-5.json` receipts plus `verify-committed-inputs.py` as data.
|
||||
The original helper contains its historical absolute checkout path; do not run
|
||||
it for portable verification. The receipts do not themselves pin that helper;
|
||||
`files.json` pins the copies distributed here and the new verifier/README.
|
||||
The local `.gitattributes` preserves those pinned bytes through Git round trips;
|
||||
retain it with this directory rather than normalizing the historical text.
|
||||
|
||||
With Python 3.10+, Git, a repository containing both commits, and the completed
|
||||
sibling checks package, run:
|
||||
|
||||
```text
|
||||
python -B SOURCE_DIRECTORY/verify.py --repo REPOSITORY --checks CHECKS_PACKAGE_DIRECTORY
|
||||
```
|
||||
|
||||
Before that package exists, an explicitly optional raw-input mode is available:
|
||||
|
||||
```text
|
||||
python -B harness/experiments/multiselect-20260923/source/verify.py --repo . --raw-gates .local/group-movement-gates
|
||||
```
|
||||
|
||||
The verifier checks source-evidence pins, captured map byte hashes, recorded gate
|
||||
success/unchanged flags, counts and 71 vendored iced_widget inputs. It compares the
|
||||
complete relevant Git tree inventory and every blob's size/SHA-256 at these
|
||||
commits with their corresponding captured input maps:
|
||||
|
||||
- `desktop-4`: `12a7352ddef5f69a144ead8219a50916233d63a9`
|
||||
- `desktop-5`: `f6a6010baed9e6164a1fcc7ecd58256a562827d7`
|
||||
|
||||
The scope matches the historical helper: Cargo manifests/lock/toolchain file,
|
||||
`crates/`, `build/`, `.cargo/`, `scripts/`, `docs/`, `examples/`,
|
||||
`harness/fixtures/`, and `harness/prototypes/`. This is the complete inventory
|
||||
within that scope, not a whole-repository identity claim. Worktree contents,
|
||||
current HEAD, line-ending checkout conversion and original machine paths do not
|
||||
participate. Git objects are read by object ID; no checkout, build or archived
|
||||
helper runs. Both commits must already be available; lazy object fetching is
|
||||
disabled for these reads.
|
||||
|
||||
In package mode, outer checks-package pins and selected member/run relationships
|
||||
are also checked. Run the checks package's own verifier for its full source ZIP,
|
||||
logs, helpers and all other gate relationships. Raw mode reads the named local
|
||||
maps/receipts directly and is not a substitute for packaged-evidence verification.
|
||||
No source maps or ZIPs are duplicated in this directory.
|
||||
|
||||
Historical receipts report an earlier comparison. A successful run of this new
|
||||
verifier performs a fresh Git-object comparison against the pinned maps. A gate's
|
||||
recorded HEAD can predate its later source-identical commit; that difference is
|
||||
why blob comparison is necessary. This evidence identifies tested source bytes;
|
||||
it does not rerun tests or establish native usability, release integration or
|
||||
full #29 acceptance.
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"checked": "2026-09-23T08:11:54.115058+00:00",
|
||||
"commit": "12a7352ddef5f69a144ead8219a50916233d63a9",
|
||||
"gate": "desktop-4",
|
||||
"inputCount": 729,
|
||||
"inputMap": {
|
||||
"bytes": 121985,
|
||||
"sha256": "55a5f354bb5049a8c77ba9bafa833438ebf754649b0cf5d175d0c8dcfcedd7bb"
|
||||
},
|
||||
"comparison": "Exact committed Git blobs equal every captured input; same complete filtered inventory"
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"checked": "2026-09-23T08:53:15.452246+00:00",
|
||||
"commit": "f6a6010baed9e6164a1fcc7ecd58256a562827d7",
|
||||
"gate": "desktop-5",
|
||||
"inputCount": 729,
|
||||
"inputMap": {
|
||||
"bytes": 121985,
|
||||
"sha256": "99dc46645236e674244e7c4867595a6000d3d85b54bcc9ab2b0c601923ecf66c"
|
||||
},
|
||||
"comparison": "Exact committed Git blobs equal every captured input; same complete filtered inventory"
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
".gitattributes": {
|
||||
"bytes": 109,
|
||||
"sha256": "aca8eef17dbab8cfedcbe18e1175cfee115802376fac4ec69e8c3320a6399d6c"
|
||||
},
|
||||
"README.md": {
|
||||
"bytes": 2792,
|
||||
"sha256": "b8db0c2c71e491b6179b3e57d27e5dfb23c9283894219feea328bc632603f2aa"
|
||||
},
|
||||
"verify.py": {
|
||||
"bytes": 7255,
|
||||
"sha256": "2ed667c127470efb669fb43d5dcdb288f891e42e10e67ef98ca4cd1125df09d1"
|
||||
},
|
||||
"verify-committed-inputs.py": {
|
||||
"bytes": 2138,
|
||||
"sha256": "ac2b50a73f678456b9628684347484c013f5f9c78f054de72b74f56a34c990d5"
|
||||
},
|
||||
"committed-desktop-4.json": {
|
||||
"bytes": 390,
|
||||
"sha256": "47c6774bcb7d0c37c50e0ed50f8fb58ee9b55c6fcee30af488481c314a4e66e8"
|
||||
},
|
||||
"committed-desktop-5.json": {
|
||||
"bytes": 390,
|
||||
"sha256": "da1f08e06bd0af6512da4196618b71d0c4ecc090012f061bb82b6a36f5b7686c"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
"""Check the tested source inventory against exact Git blobs, not HEAD alone."""
|
||||
from pathlib import Path
|
||||
import datetime, hashlib, json, subprocess, sys
|
||||
root=Path('C:/ar-multiselect-9e8r6t')
|
||||
run,=sys.argv[1:]
|
||||
gate=root/'.local/group-movement-gates'/run
|
||||
inputs=json.loads((gate/'inputs.json').read_bytes())
|
||||
result=json.loads((gate/'result.json').read_bytes())
|
||||
assert result['exitCode']==0 and result['inputsUnchanged']
|
||||
head=subprocess.check_output(['git','rev-parse','HEAD'],cwd=root,text=True).strip()
|
||||
def relevant(p):
|
||||
return p in ('Cargo.toml','Cargo.lock','rust-toolchain.toml') or p.startswith(('crates/','build/','.cargo/','scripts/','docs/','examples/','harness/fixtures/','harness/prototypes/'))
|
||||
paths=subprocess.check_output(['git','ls-tree','-r','--name-only','-z',head],cwd=root).decode().split('\0')
|
||||
assert set(inputs)=={p for p in paths if p and relevant(p)}, 'Committed input inventory differs'
|
||||
assert all('\n' not in p for p in inputs)
|
||||
request=''.join(head+':'+p+'\n' for p in inputs).encode()
|
||||
raw=subprocess.run(['git','cat-file','--batch'],cwd=root,input=request,capture_output=True,check=True).stdout
|
||||
offset=0
|
||||
actual={}
|
||||
for path in inputs:
|
||||
end=raw.index(b'\n',offset)
|
||||
oid,kind,size=raw[offset:end].split()
|
||||
assert kind==b'blob'
|
||||
size=int(size)
|
||||
data=raw[end+1:end+1+size]
|
||||
assert len(data)==size and raw[end+1+size:end+2+size]==b'\n'
|
||||
actual[path]={'bytes':size,'sha256':hashlib.sha256(data).hexdigest()}
|
||||
offset=end+2+size
|
||||
assert offset==len(raw)
|
||||
changed=[p for p in inputs if inputs[p]!=actual[p]]
|
||||
assert not changed, 'Tested bytes differ from committed blobs: '+repr(changed)
|
||||
data=(gate/'inputs.json').read_bytes()
|
||||
report={'checked':datetime.datetime.now(datetime.timezone.utc).isoformat(),'commit':head,'gate':run,'inputCount':len(inputs),'inputMap':{'bytes':len(data),'sha256':hashlib.sha256(data).hexdigest()},'comparison':'Exact committed Git blobs equal every captured input; same complete filtered inventory'}
|
||||
out=root/'.local/group-movement-gates'/('committed-'+run+'.json')
|
||||
with out.open('x',encoding='utf-8') as f: json.dump(report,f,indent=2)
|
||||
print(json.dumps(report,indent=2))
|
||||
@@ -0,0 +1,149 @@
|
||||
"""Compare captured input maps to exact named Git trees; no builds or checkouts."""
|
||||
from pathlib import Path, PurePosixPath
|
||||
import argparse
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
import zipfile
|
||||
|
||||
HERE = Path(__file__).resolve().parent
|
||||
COMMITS = {"desktop-4": "12a7352ddef5f69a144ead8219a50916233d63a9",
|
||||
"desktop-5": "f6a6010baed9e6164a1fcc7ecd58256a562827d7"}
|
||||
COMPARISON = "Exact committed Git blobs equal every captured input; same complete filtered inventory"
|
||||
FILES = {".gitattributes", "verify.py", "README.md", "verify-committed-inputs.py",
|
||||
"committed-desktop-4.json", "committed-desktop-5.json"}
|
||||
|
||||
|
||||
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 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 packaged(checks, runs):
|
||||
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 manifest kind")
|
||||
captured = {}
|
||||
with zipfile.ZipFile(checks / "evidence.zip") as archive:
|
||||
names = archive.namelist()
|
||||
need(len(names) == len(set(names)) and set(names) == set(manifest["members"])
|
||||
and all(safe(name) for name in names), "checks exact safe members")
|
||||
def raw(logical):
|
||||
member = manifest["logicalFiles"][logical]
|
||||
data = archive.read(member)
|
||||
need(pin(data) == manifest["members"][member], "checks member pin: " + logical)
|
||||
return data
|
||||
for run in runs:
|
||||
prefix = "cargo/" + run + "/"
|
||||
result = parsed(raw(prefix + "result.json"))
|
||||
spec = manifest["runs"][run]
|
||||
need(all(result[key] == spec[key] for key in ("command", "head", "exitCode", "inputCount")), run + ": checks run relationships")
|
||||
captured[run] = (raw(prefix + "inputs.json"), result)
|
||||
return captured
|
||||
|
||||
|
||||
def verify(repo, captured):
|
||||
outer = parsed((HERE / "files.json").read_bytes())
|
||||
need(set(outer) == FILES, "source evidence file inventory")
|
||||
for name, expected in outer.items():
|
||||
need(pin((HERE / name).read_bytes()) == expected, "source evidence pin: " + name)
|
||||
for run, commit in COMMITS.items():
|
||||
receipt = parsed((HERE / ("committed-" + run + ".json")).read_bytes())
|
||||
need(receipt["gate"] == run and receipt["commit"] == commit
|
||||
and receipt["comparison"] == COMPARISON, run + ": historical identity relationship")
|
||||
map_bytes, result = captured[run]
|
||||
inputs = parsed(map_bytes)
|
||||
need(pin(map_bytes) == receipt["inputMap"] == result["inputs"], run + ": exact captured input map")
|
||||
need(result["exitCode"] == 0 and result["inputsUnchanged"] is True, run + ": accepted unchanged gate")
|
||||
need(len(inputs) == receipt["inputCount"] == result["inputCount"], run + ": input counts")
|
||||
need(all(safe(path) and relevant(path) for path in inputs), run + ": input scope")
|
||||
need(sum(path.startswith("crates/vendor/iced_widget/") for path in inputs) == 71, run + ": vendor count")
|
||||
compare_commit(repo, commit, inputs)
|
||||
print("PASS exact Git tree/blobs:", run, commit, len(inputs), "captured inputs")
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--repo", type=Path, required=True, help="repository with both named commits already present")
|
||||
source = parser.add_mutually_exclusive_group(required=True)
|
||||
source.add_argument("--checks", type=Path, help="portable checks package directory")
|
||||
source.add_argument("--raw-gates", type=Path, help="optional preparation mode: raw gate directory, not a packaged-evidence verification")
|
||||
args = parser.parse_args()
|
||||
if args.checks:
|
||||
captured = packaged(args.checks, COMMITS)
|
||||
else:
|
||||
captured = {run: ((args.raw_gates / run / "inputs.json").read_bytes(),
|
||||
parsed((args.raw_gates / run / "result.json").read_bytes())) for run in COMMITS}
|
||||
verify(args.repo, captured)
|
||||
print("Source identity only; no build, checkout, helper execution or native acceptance claim.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,23 @@
|
||||
# Process column-slot experiment — exploratory evidence
|
||||
|
||||
Question: does simultaneous column-slot permutation preserve presentation boundaries and stable order without hidden no-op mutations? Separately, can object-anchored Before/After retain selected-target no-op while reaching every useful destination?
|
||||
|
||||
Expected: preserve the entire ID set, exact other-column indices, selected source order, unselected within-column order, a contiguous moved block, equivalent normalized-gap results, click-order independence and frozen ID-to-rank map. Identical column order must return unchanged. Cross-column selections must refuse.
|
||||
|
||||
Run from the repository root with `node harness/experiments/process-column-slots-20260923/experiment.cjs` and `node harness/experiments/process-column-slots-20260923/anchor-policies.cjs`. Scripts overwrite only their own JSON results. Node was the existing bundled runtime. The parent inspected and reran both original scripts before copying them here. No Cargo, production edits or GUI were used by the experiment.
|
||||
|
||||
Results: both scripts exited 0. The first exhausted every steps permutation, set partition, nonempty selected subset and column gap through five IDs: 214,990 admitted property cases, 140,024 cross-column refusals and 127,950 unchanged cases. It separately exhausted all 4,096 directed simple graphs on four IDs and their 24 step permutations: 98,304 graph orders, 861,096 admitted plans, zero changed-rank counterexamples. Its longest-path/fallback rank model follows the documented algorithm but does not execute Rust. The no-source-change assertion uses a sentinel JSON envelope and suppresses serialization for unchanged results; it does not prove the application source writer or history implementation.
|
||||
|
||||
Concrete counterexample to global splicing: `[a,u,b,v,c]`, column `[a,b,c]`, selection `{b,c}`, after `a` is unchanged. Column-slot permutation preserves the exact original array; global splicing would write `[a,b,c,u,v]`. Moving that block before `a` produces `[b,u,c,v,a]`: `u` and `v` retain exact indices. Consequently, preserving all globally unselected relative order is intentionally not a requirement (`a` moves relative to `u` and `v`).
|
||||
|
||||
Anchor-policy follow-up: all nonempty subsets for column lengths 1..10 (2,036 cases, 18,324 unselected Before/After anchors) reached every remainder-list gap using an unselected neighbor. Raw normalization differs from selected-anchor no-op in 17,004 selected-anchor cases. Example: `[a,b,c,d]`, selection `{b,d}`, Before `d` normalizes to `[a,c,b,d]`; the object-anchor policy keeps `[a,b,c,d]`. The changed result is still reachable through After `c`. The APIs are distinct: normalization does not automatically supersede selected-target no-op. Prefer retaining the latter for object-anchored UI if that is the chosen interaction; every changed result remains reachable. When all are selected, the sole destination is inherently unchanged.
|
||||
|
||||
The selected-anchor no-op guard belongs before invoking a block planner: noncontiguous selected items can legitimately remain noncontiguous after that no-op. The block-contiguity postcondition applies to planned moves, not every selected-target gesture.
|
||||
|
||||
Legacy exchange-only ordering assigns successive ranks, and cycle-blocked fallback assigns unique ranks. Multi-member sets spanning these ranks refuse. Four-node enumeration cannot exercise a changed multiple-member group beside a cycle: two cycle nodes leave only two peers, whose entire block has nowhere to move. Independent review identified this limit; an added five-node case checks `[a,u,b,v,c]`, cycle `u→v→u`, selection `{b,c}` before `a`, exact result `[b,u,c,v,a]`, and unchanged full ranks. Production should still validate the complete recomputed rank map. The experiment freezes graph edges; it does not rederive legacy OrderedPath adjacency. Valid legacy columns contain one node, so admitted moves are no-op and multiple-member groups refuse under this candidate.
|
||||
|
||||
The same independent reviewer confirmed the rank model agrees with current Rust, found no planner counterexample under its assumptions, and noted that anchor reachability does not execute a selected-target guard or test actual pointer hit regions. Existing singleton reorder globally splices steps, so routing it through this planner would intentionally change invisible cross-column source ordering; the candidate must make that migration explicit.
|
||||
|
||||
Limitations and next Rust checks: these scripts assume valid unique step IDs, valid complete rank maps, visible local occurrence selection, and valid destination bounds. Rust must reject duplicate/missing/wrong-owner IDs, qualified/link mixtures, stale snapshots and dirty drafts before side effects. Explicitly choose raw-gap versus object-anchor input; keep before-first/after-last reachable. Verify production layout with different card heights and expansion, preview/commit plan identity, OA/SA source roundtrip, unchanged semantics outside steps, one Undo/Redo, no history for no-op, source limits/refusal, and native slot feedback. Deletion mode switching and aggregate removal were not investigated by these movement scripts.
|
||||
|
||||
Artifacts are exploratory evidence. They do not establish State acceptance or Process implementation acceptance.
|
||||
@@ -0,0 +1,31 @@
|
||||
const fs=require('fs'), assert=require('assert/strict');
|
||||
let cases=0, anchors=0, divergent=0;
|
||||
for(let n=1;n<=10;n++) {
|
||||
const column=Array.from({length:n},(_,i)=>i);
|
||||
for(let mask=1;mask<(1<<n);mask++) {
|
||||
const selected=new Set(column.filter(id=>mask&(1<<id)));
|
||||
const remainder=column.filter(id=>!selected.has(id));
|
||||
const reached=new Set();
|
||||
for(const anchor of remainder) for(const after of [false,true]) {
|
||||
const rawGap=column.indexOf(anchor)+(after?1:0);
|
||||
const gap=column.slice(0,rawGap).filter(id=>!selected.has(id)).length;
|
||||
reached.add(gap); anchors++;
|
||||
assert.equal(gap,remainder.indexOf(anchor)+(after?1:0));
|
||||
}
|
||||
if(remainder.length) assert.deepEqual([...reached].sort((a,b)=>a-b),Array.from({length:remainder.length+1},(_,i)=>i));
|
||||
else assert.equal(selected.size,n); // Only one mathematical gap, all-selected no-op.
|
||||
for(const anchor of selected) for(const after of [false,true]) {
|
||||
const rawGap=column.indexOf(anchor)+(after?1:0);
|
||||
const gap=column.slice(0,rawGap).filter(id=>!selected.has(id)).length;
|
||||
const block=column.filter(id=>selected.has(id));
|
||||
const normalized=[...remainder.slice(0,gap),...block,...remainder.slice(gap)];
|
||||
if(normalized.some((id,i)=>id!==column[i]))divergent++;
|
||||
// Object policy intentionally preserves original order for selected anchors.
|
||||
// It need not form a contiguous block when this operation is a no-op.
|
||||
}
|
||||
cases++;
|
||||
}
|
||||
}
|
||||
const result={passed:true,method:'All nonempty subsets for column lengths 1..10, all unselected and selected Before/After anchors. Order-label equivariance makes separate ID permutations redundant for this reachability property.',cases,unselectedAnchors:anchors,selectedAnchorRawNormalizationDivergences:divergent,conclusion:'Every remainder gap is reachable via an unselected Before/After anchor. Selected-anchor no-op does not remove any possible changed result. Raw-gap and object-anchor policies remain distinct APIs; neither silently supersedes the other.',counterexample:{column:['a','b','c','d'],selected:['b','d'],drop:'Before d',rawGapResult:['a','c','b','d'],objectAnchorResult:['a','b','c','d'],equivalentUnselectedDrop:'After c'}};
|
||||
fs.writeFileSync(__dirname+'/anchor-results.json',JSON.stringify(result,null,2)+'\n');
|
||||
console.log(JSON.stringify(result,null,2));
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"passed": true,
|
||||
"method": "All nonempty subsets for column lengths 1..10, all unselected and selected Before/After anchors. Order-label equivariance makes separate ID permutations redundant for this reachability property.",
|
||||
"cases": 2036,
|
||||
"unselectedAnchors": 18324,
|
||||
"selectedAnchorRawNormalizationDivergences": 17004,
|
||||
"conclusion": "Every remainder gap is reachable via an unselected Before/After anchor. Selected-anchor no-op does not remove any possible changed result. Raw-gap and object-anchor policies remain distinct APIs; neither silently supersedes the other.",
|
||||
"counterexample": {
|
||||
"column": [
|
||||
"a",
|
||||
"b",
|
||||
"c",
|
||||
"d"
|
||||
],
|
||||
"selected": [
|
||||
"b",
|
||||
"d"
|
||||
],
|
||||
"drop": "Before d",
|
||||
"rawGapResult": [
|
||||
"a",
|
||||
"c",
|
||||
"b",
|
||||
"d"
|
||||
],
|
||||
"objectAnchorResult": [
|
||||
"a",
|
||||
"b",
|
||||
"c",
|
||||
"d"
|
||||
],
|
||||
"equivalentUnselectedDrop": "After c"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
// Exploratory model, not production code or a test of the Rust implementation.
|
||||
const fs = require('fs');
|
||||
const assert = require('assert/strict');
|
||||
let count = 0, graphCount = 0, admitted = 0, refused = 0, noops = 0;
|
||||
function* permutations(a) {
|
||||
if (!a.length) { yield []; return; }
|
||||
for (let i=0;i<a.length;i++) for (const tail of permutations(a.filter((_,j)=>i!==j))) yield [a[i],...tail];
|
||||
}
|
||||
function* partitions(n, prefix=[]) {
|
||||
if(prefix.length===n) { yield prefix; return; }
|
||||
const max=prefix.length?Math.max(...prefix)+1:0;
|
||||
for(let x=0;x<=max;x++) yield* partitions(n,[...prefix,x]);
|
||||
}
|
||||
function plan(steps, ranks, selected, rawGap) {
|
||||
const rank=ranks[selected[0]];
|
||||
if(!selected.length || selected.some(id=>ranks[id]!==rank)) return null;
|
||||
const indices=steps.flatMap((id,i)=>ranks[id]===rank?[i]:[]);
|
||||
const column=indices.map(i=>steps[i]), set=new Set(selected);
|
||||
assert(rawGap>=0 && rawGap<=column.length);
|
||||
const block=column.filter(id=>set.has(id));
|
||||
const remainder=column.filter(id=>!set.has(id));
|
||||
const gap=column.slice(0,rawGap).filter(id=>!set.has(id)).length;
|
||||
const order=[...remainder.slice(0,gap),...block,...remainder.slice(gap)];
|
||||
const result=steps.slice();
|
||||
indices.forEach((index,i)=>result[index]=order[i]);
|
||||
return {result, order, gap, changed:result.some((id,i)=>id!==steps[i])};
|
||||
}
|
||||
function verify(steps,ranks,selected,rawGap,p) {
|
||||
const set=new Set(selected), rank=ranks[selected[0]];
|
||||
const old=steps.filter(id=>ranks[id]===rank), got=p.result.filter(id=>ranks[id]===rank);
|
||||
assert.deepEqual([...p.result].sort(),[...steps].sort());
|
||||
steps.forEach((id,i)=>{if(ranks[id]!==rank) assert.equal(p.result[i],id);});
|
||||
assert.deepEqual(got.filter(id=>set.has(id)),old.filter(id=>set.has(id)));
|
||||
assert.deepEqual(got.filter(id=>!set.has(id)),old.filter(id=>!set.has(id)));
|
||||
const first=got.findIndex(id=>set.has(id));
|
||||
assert.equal(got.slice(first,first+set.size).every(id=>set.has(id)),true);
|
||||
// Independent gap oracle: every original unselected item before boundary
|
||||
// precedes every selected item; all remaining unselected items follow them.
|
||||
old.forEach((id,i)=>{if(!set.has(id)) selected.forEach(s=>assert.equal(got.indexOf(id)<got.indexOf(s),i<rawGap));});
|
||||
const stableAlready=old.every((id,i)=>id===got[i]);
|
||||
assert.equal(p.changed,!stableAlready);
|
||||
const source=JSON.stringify({steps,untouched:'sentinel'});
|
||||
const after=p.changed?JSON.stringify({steps:p.result,untouched:'sentinel'}):source;
|
||||
if(stableAlready) {assert.equal(after,source); noops++;}
|
||||
count++;
|
||||
}
|
||||
for(let n=1;n<=5;n++) {
|
||||
const ids=Array.from({length:n},(_,i)=>i);
|
||||
for(const ranks of partitions(n)) for(const steps of permutations(ids)) {
|
||||
for(let mask=1;mask<(1<<n);mask++) {
|
||||
const selected=ids.filter(id=>mask&(1<<id));
|
||||
if(selected.some(id=>ranks[id]!==ranks[selected[0]])) {
|
||||
assert.equal(plan(steps,ranks,selected,0),null); refused++; continue;
|
||||
}
|
||||
const column=steps.filter(id=>ranks[id]===ranks[selected[0]]);
|
||||
const equivalents=new Map();
|
||||
for(let gap=0;gap<=column.length;gap++) {
|
||||
const p=plan(steps,ranks,selected,gap);
|
||||
verify(steps,ranks,selected,gap,p);
|
||||
assert.deepEqual(p,plan(steps,ranks,[...selected].reverse(),gap));
|
||||
if(equivalents.has(p.gap)) assert.deepEqual(p.result,equivalents.get(p.gap));
|
||||
equivalents.set(p.gap,p.result);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Semantic column model: longest-path Kahn ranks and deterministic residual
|
||||
// fallback, matching the documented algorithm, independently of planner.
|
||||
function ranksOf(steps,edges) {
|
||||
const indegree=Object.fromEntries(steps.map(id=>[id,0]));
|
||||
const ranks=Object.fromEntries(steps.map(id=>[id,0]));
|
||||
edges.forEach(([,b])=>indegree[b]++);
|
||||
const queue=steps.filter(id=>indegree[id]===0), done=new Set();
|
||||
for(let i=0;i<queue.length;i++) {
|
||||
const id=queue[i]; if(done.has(id))continue; done.add(id);
|
||||
for(const [a,b] of edges) if(a===id) {
|
||||
ranks[b]=Math.max(ranks[b],ranks[a]+1);
|
||||
if(--indegree[b]===0)queue.push(b);
|
||||
}
|
||||
}
|
||||
let fallback=Math.max(...Object.values(ranks))+1;
|
||||
steps.forEach(id=>{if(!done.has(id))ranks[id]=fallback++;});
|
||||
return ranks;
|
||||
}
|
||||
const ids=[0,1,2,3], possible=ids.flatMap(a=>ids.filter(b=>a!==b).map(b=>[a,b]));
|
||||
for(let mask=0;mask<(1<<possible.length);mask++) {
|
||||
const edges=possible.filter((_,i)=>mask&(1<<i));
|
||||
for(const steps of permutations(ids)) {
|
||||
const ranks=ranksOf(steps,edges); graphCount++;
|
||||
for(let subset=1;subset<16;subset++) {
|
||||
const selected=ids.filter(id=>subset&(1<<id));
|
||||
if(selected.some(id=>ranks[id]!==ranks[selected[0]]))continue;
|
||||
const column=steps.filter(id=>ranks[id]===ranks[selected[0]]);
|
||||
for(let gap=0;gap<=column.length;gap++) {
|
||||
const p=plan(steps,ranks,selected,gap);
|
||||
assert.deepEqual(ranksOf(p.result,edges),ranks); admitted++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
const concrete=[];
|
||||
function example(name,steps,ranks,selected,gap,expected) {
|
||||
const p=plan(steps,ranks,selected,gap); assert.deepEqual(p?.result??null,expected);
|
||||
concrete.push({name,steps,ranks,selected,rawGap:gap,result:p?.result??null,changed:p?.changed??false});
|
||||
}
|
||||
example('interleaved visual no-op',['a','u','b','v','c'],{a:0,b:0,c:0,u:1,v:1},['c','b'],1,['a','u','b','v','c']);
|
||||
example('column slot move preserves other indices',['a','u','b','v','c'],{a:0,b:0,c:0,u:1,v:1},['c','b'],0,['b','u','c','v','a']);
|
||||
example('selected-anchor normalization is not always no-op',['a','b','c','d'],{a:0,b:0,c:0,d:0},['b','d'],3,['a','c','b','d']);
|
||||
example('legacy successive-rank refusal',['a','b','c'],{a:0,b:1,c:2},['a','c'],0,null);
|
||||
const cyclicRanks=ranksOf([0,1,2,3],[[2,3],[3,2]]);
|
||||
example('cycle fallback group refusal',[0,1,2,3],cyclicRanks,[2,3],0,null);
|
||||
example('acyclic peers beside cycle',[0,1,2,3],cyclicRanks,[1],0,[1,0,2,3]);
|
||||
const besideCycleSteps=['a','u','b','v','c'], besideCycleEdges=[['u','v'],['v','u']];
|
||||
const besideCycleRanks=ranksOf(besideCycleSteps,besideCycleEdges);
|
||||
example('changed multiple-member group beside cycle',besideCycleSteps,besideCycleRanks,['c','b'],0,['b','u','c','v','a']);
|
||||
assert.deepEqual(ranksOf(['b','u','c','v','a'],besideCycleEdges),besideCycleRanks);
|
||||
const result={expectation:'Column-slot permutation satisfies stable-block/gap/index invariants; recomputed ranks remain exact.',method:'All permutations and set partitions through n=5; every nonempty subset and raw column gap. Every directed simple graph on 4 IDs, all 24 step permutations, all admitted subsets/gaps. No Rust, source serializer, or GUI exercised.',passed:true,counts:{propertyCases:count,crossColumnRefusals:refused,noops,graphOrders:graphCount,rankCheckedPlans:admitted},concrete};
|
||||
fs.writeFileSync(__dirname+'/results.json',JSON.stringify(result,null,2)+'\n');
|
||||
console.log(JSON.stringify(result,null,2));
|
||||
@@ -0,0 +1,199 @@
|
||||
{
|
||||
"expectation": "Column-slot permutation satisfies stable-block/gap/index invariants; recomputed ranks remain exact.",
|
||||
"method": "All permutations and set partitions through n=5; every nonempty subset and raw column gap. Every directed simple graph on 4 IDs, all 24 step permutations, all admitted subsets/gaps. No Rust, source serializer, or GUI exercised.",
|
||||
"passed": true,
|
||||
"counts": {
|
||||
"propertyCases": 214990,
|
||||
"crossColumnRefusals": 140024,
|
||||
"noops": 127950,
|
||||
"graphOrders": 98304,
|
||||
"rankCheckedPlans": 861096
|
||||
},
|
||||
"concrete": [
|
||||
{
|
||||
"name": "interleaved visual no-op",
|
||||
"steps": [
|
||||
"a",
|
||||
"u",
|
||||
"b",
|
||||
"v",
|
||||
"c"
|
||||
],
|
||||
"ranks": {
|
||||
"a": 0,
|
||||
"b": 0,
|
||||
"c": 0,
|
||||
"u": 1,
|
||||
"v": 1
|
||||
},
|
||||
"selected": [
|
||||
"c",
|
||||
"b"
|
||||
],
|
||||
"rawGap": 1,
|
||||
"result": [
|
||||
"a",
|
||||
"u",
|
||||
"b",
|
||||
"v",
|
||||
"c"
|
||||
],
|
||||
"changed": false
|
||||
},
|
||||
{
|
||||
"name": "column slot move preserves other indices",
|
||||
"steps": [
|
||||
"a",
|
||||
"u",
|
||||
"b",
|
||||
"v",
|
||||
"c"
|
||||
],
|
||||
"ranks": {
|
||||
"a": 0,
|
||||
"b": 0,
|
||||
"c": 0,
|
||||
"u": 1,
|
||||
"v": 1
|
||||
},
|
||||
"selected": [
|
||||
"c",
|
||||
"b"
|
||||
],
|
||||
"rawGap": 0,
|
||||
"result": [
|
||||
"b",
|
||||
"u",
|
||||
"c",
|
||||
"v",
|
||||
"a"
|
||||
],
|
||||
"changed": true
|
||||
},
|
||||
{
|
||||
"name": "selected-anchor normalization is not always no-op",
|
||||
"steps": [
|
||||
"a",
|
||||
"b",
|
||||
"c",
|
||||
"d"
|
||||
],
|
||||
"ranks": {
|
||||
"a": 0,
|
||||
"b": 0,
|
||||
"c": 0,
|
||||
"d": 0
|
||||
},
|
||||
"selected": [
|
||||
"b",
|
||||
"d"
|
||||
],
|
||||
"rawGap": 3,
|
||||
"result": [
|
||||
"a",
|
||||
"c",
|
||||
"b",
|
||||
"d"
|
||||
],
|
||||
"changed": true
|
||||
},
|
||||
{
|
||||
"name": "legacy successive-rank refusal",
|
||||
"steps": [
|
||||
"a",
|
||||
"b",
|
||||
"c"
|
||||
],
|
||||
"ranks": {
|
||||
"a": 0,
|
||||
"b": 1,
|
||||
"c": 2
|
||||
},
|
||||
"selected": [
|
||||
"a",
|
||||
"c"
|
||||
],
|
||||
"rawGap": 0,
|
||||
"result": null,
|
||||
"changed": false
|
||||
},
|
||||
{
|
||||
"name": "cycle fallback group refusal",
|
||||
"steps": [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3
|
||||
],
|
||||
"ranks": {
|
||||
"0": 0,
|
||||
"1": 0,
|
||||
"2": 1,
|
||||
"3": 2
|
||||
},
|
||||
"selected": [
|
||||
2,
|
||||
3
|
||||
],
|
||||
"rawGap": 0,
|
||||
"result": null,
|
||||
"changed": false
|
||||
},
|
||||
{
|
||||
"name": "acyclic peers beside cycle",
|
||||
"steps": [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3
|
||||
],
|
||||
"ranks": {
|
||||
"0": 0,
|
||||
"1": 0,
|
||||
"2": 1,
|
||||
"3": 2
|
||||
},
|
||||
"selected": [
|
||||
1
|
||||
],
|
||||
"rawGap": 0,
|
||||
"result": [
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
3
|
||||
],
|
||||
"changed": true
|
||||
},
|
||||
{
|
||||
"name": "changed multiple-member group beside cycle",
|
||||
"steps": [
|
||||
"a",
|
||||
"u",
|
||||
"b",
|
||||
"v",
|
||||
"c"
|
||||
],
|
||||
"ranks": {
|
||||
"a": 0,
|
||||
"u": 1,
|
||||
"b": 0,
|
||||
"v": 2,
|
||||
"c": 0
|
||||
},
|
||||
"selected": [
|
||||
"c",
|
||||
"b"
|
||||
],
|
||||
"rawGap": 0,
|
||||
"result": [
|
||||
"b",
|
||||
"u",
|
||||
"c",
|
||||
"v",
|
||||
"a"
|
||||
],
|
||||
"changed": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
# Preserve exact pinned captures and verification tools through Git round trips.
|
||||
* -text whitespace=cr-at-eol
|
||||
incidents/core-1/core-1/*.log whitespace=-blank-at-eof,cr-at-eol
|
||||
@@ -0,0 +1,35 @@
|
||||
# State multiselect closed gate evidence tools
|
||||
|
||||
Preparation requires an explicit closed run list from `.local/state-group-gates`.
|
||||
Preserve failed `desktop-1` alongside accepted unchanged runs. Exclude `core-1`
|
||||
from this package: its false unchanged-input flag and one map/archive mismatch
|
||||
belong in the separate pinned incident. Neither failures nor incidents are passes.
|
||||
|
||||
Example check-only invocation (extend with every subsequent closed run):
|
||||
|
||||
```
|
||||
python -B prepare.py --root CHECKOUT --runs desktop-1 core-2 desktop-2 --check-only
|
||||
```
|
||||
|
||||
Only after all selected captures close, omit `--check-only` and provide
|
||||
`--output CHECKOUT/harness/experiments/state-multiselect-20260923/checks`.
|
||||
Historical helper copies may be passed via repeatable `--helper PATH`.
|
||||
No existing output is overwritten. Run `python -B verify.py PACKAGE` for readback.
|
||||
|
||||
The strict verifier is unchanged from the ordinary multiselect package: exact
|
||||
seven raw files, helper bytes, safe archive inventories, all input-map/archive
|
||||
bytes equal, receipt relationships and inputsUnchanged exactly true are required.
|
||||
Failures retain their actual exits and streams. Source capsules preserve local
|
||||
historical bytes; recorded HEAD alone does not identify those bytes.
|
||||
|
||||
The earlier 733-input helper omitted the core compile-time integration fixture
|
||||
`harness/experiments/edge-attachments-20260922/native-fixture.arcadia` and the CLI
|
||||
fixture `harness/experiments/textual-authoring-20260911/alarm-response.arcadia`.
|
||||
Lint-1 failed, and its all-target capture additionally has a source-capsule
|
||||
scope limitation for the core fixture. Later 735-input captures add both explicit
|
||||
inputs. Desktop/core
|
||||
example captures retain their actual tested scope; do not infer that one map
|
||||
establishes a later map or complete all-target source identity.
|
||||
|
||||
Offline pin/receipt consistency is not test execution, authentication, native
|
||||
acceptance, or proof of usability. Executables and toolchains are not distributed.
|
||||
Binary file not shown.
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"prepare.py": {
|
||||
"bytes": 4802,
|
||||
"sha256": "24f59b1e61a1e9c93d4aa9a47a998cbf9c2058e966cc5a7beceba73e2138943c"
|
||||
},
|
||||
"verify.py": {
|
||||
"bytes": 8873,
|
||||
"sha256": "c03513407073bef092d57b968f982b8ffc0c58e095f834fe7464c6a0e8454a9a"
|
||||
},
|
||||
"README.md": {
|
||||
"bytes": 1984,
|
||||
"sha256": "157584ed470fb8320d5a03b79388c6e1b7818b25fee1dee913083a41ff847f60"
|
||||
},
|
||||
"manifest.json": {
|
||||
"bytes": 17487,
|
||||
"sha256": "d5d71a7352fe8ab8cd63d3ce907c875d98ab048080c28868571819e9afa61e4f"
|
||||
},
|
||||
"evidence.zip": {
|
||||
"bytes": 8859169,
|
||||
"sha256": "48a47389ffdba1180b1340c3471f3d8615790e709fe563c39941d95f3f242f77"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,431 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"kind": "multiselect-cargo-gates",
|
||||
"runs": {
|
||||
"desktop-1": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--message-format=json",
|
||||
"state_multiselect",
|
||||
"--",
|
||||
"--test-threads=1"
|
||||
],
|
||||
"head": "7e348d967d1787c052a145b7448636613a6a7054",
|
||||
"exitCode": 101,
|
||||
"inputCount": 733,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"core-2": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"--example",
|
||||
"state_multiselect_native",
|
||||
"--message-format=json",
|
||||
"--",
|
||||
"--test-threads=1"
|
||||
],
|
||||
"head": "7e348d967d1787c052a145b7448636613a6a7054",
|
||||
"exitCode": 0,
|
||||
"inputCount": 733,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"desktop-2": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--message-format=json",
|
||||
"--",
|
||||
"--test-threads=1"
|
||||
],
|
||||
"head": "7e348d967d1787c052a145b7448636613a6a7054",
|
||||
"exitCode": 0,
|
||||
"inputCount": 733,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"lint-1": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"clippy",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--all-targets",
|
||||
"--message-format=json",
|
||||
"--",
|
||||
"-D",
|
||||
"warnings"
|
||||
],
|
||||
"head": "7e348d967d1787c052a145b7448636613a6a7054",
|
||||
"exitCode": 101,
|
||||
"inputCount": 733,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"lint-2": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"clippy",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--all-targets",
|
||||
"--message-format=json",
|
||||
"--",
|
||||
"-D",
|
||||
"warnings"
|
||||
],
|
||||
"head": "7e348d967d1787c052a145b7448636613a6a7054",
|
||||
"exitCode": 0,
|
||||
"inputCount": 735,
|
||||
"helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py"
|
||||
},
|
||||
"format-1": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"fmt",
|
||||
"--all",
|
||||
"--",
|
||||
"--check"
|
||||
],
|
||||
"head": "7e348d967d1787c052a145b7448636613a6a7054",
|
||||
"exitCode": 0,
|
||||
"inputCount": 735,
|
||||
"helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py"
|
||||
},
|
||||
"desktop-3": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--message-format=json",
|
||||
"--",
|
||||
"state_",
|
||||
"model_menu",
|
||||
"--test-threads=1"
|
||||
],
|
||||
"head": "3480b54201a5f361cca0bcd0d45dd6546a7a7bc9",
|
||||
"exitCode": 0,
|
||||
"inputCount": 735,
|
||||
"helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py"
|
||||
},
|
||||
"native-build-1": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"build",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"--example",
|
||||
"state_multiselect_native",
|
||||
"--message-format=json"
|
||||
],
|
||||
"head": "3480b54201a5f361cca0bcd0d45dd6546a7a7bc9",
|
||||
"exitCode": 0,
|
||||
"inputCount": 735,
|
||||
"helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py"
|
||||
},
|
||||
"windows-build-1": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"build",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--message-format=json"
|
||||
],
|
||||
"head": "3480b54201a5f361cca0bcd0d45dd6546a7a7bc9",
|
||||
"exitCode": 0,
|
||||
"inputCount": 735,
|
||||
"helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py"
|
||||
}
|
||||
},
|
||||
"logicalFiles": {
|
||||
"cargo/core-2/inputs.json": "capsules/9cf85879dfb0bb5ec3b15c66b23df316e6bfe8451b6cf0c895bf7b9b5fbdde4a.json",
|
||||
"cargo/core-2/inputs.zip": "capsules/3419218f9917de0ac689a32dd622ebe55487fa5a37ffaba4b8fa662bc15a5cb9.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/desktop-1/inputs.json": "capsules/d8a64b62b68ac1c37bc3fe9309abc4dc314e343ce546bba4b9445f68dddeda5d.json",
|
||||
"cargo/desktop-1/inputs.zip": "capsules/cecd6ae0ba45add8e913d9913cd4960c01928db0a4bc795902b7954ffb6f692e.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/9cf85879dfb0bb5ec3b15c66b23df316e6bfe8451b6cf0c895bf7b9b5fbdde4a.json",
|
||||
"cargo/desktop-2/inputs.zip": "capsules/3419218f9917de0ac689a32dd622ebe55487fa5a37ffaba4b8fa662bc15a5cb9.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/4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf.json",
|
||||
"cargo/desktop-3/inputs.zip": "capsules/1e7f68e8d6156ec608b58ff70f7ddcaf690d38da1d5066092c218bce190d3a4c.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/format-1/inputs.json": "capsules/4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf.json",
|
||||
"cargo/format-1/inputs.zip": "capsules/1e7f68e8d6156ec608b58ff70f7ddcaf690d38da1d5066092c218bce190d3a4c.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/lint-1/inputs.json": "capsules/9cf85879dfb0bb5ec3b15c66b23df316e6bfe8451b6cf0c895bf7b9b5fbdde4a.json",
|
||||
"cargo/lint-1/inputs.zip": "capsules/3419218f9917de0ac689a32dd622ebe55487fa5a37ffaba4b8fa662bc15a5cb9.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/4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf.json",
|
||||
"cargo/lint-2/inputs.zip": "capsules/1e7f68e8d6156ec608b58ff70f7ddcaf690d38da1d5066092c218bce190d3a4c.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/native-build-1/inputs.json": "capsules/4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf.json",
|
||||
"cargo/native-build-1/inputs.zip": "capsules/1e7f68e8d6156ec608b58ff70f7ddcaf690d38da1d5066092c218bce190d3a4c.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/windows-build-1/inputs.json": "capsules/4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf.json",
|
||||
"cargo/windows-build-1/inputs.zip": "capsules/1e7f68e8d6156ec608b58ff70f7ddcaf690d38da1d5066092c218bce190d3a4c.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",
|
||||
"helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py",
|
||||
"helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"members": {
|
||||
"capsules/1e7f68e8d6156ec608b58ff70f7ddcaf690d38da1d5066092c218bce190d3a4c.zip": {
|
||||
"bytes": 2952517,
|
||||
"sha256": "1e7f68e8d6156ec608b58ff70f7ddcaf690d38da1d5066092c218bce190d3a4c"
|
||||
},
|
||||
"capsules/3419218f9917de0ac689a32dd622ebe55487fa5a37ffaba4b8fa662bc15a5cb9.zip": {
|
||||
"bytes": 2948937,
|
||||
"sha256": "3419218f9917de0ac689a32dd622ebe55487fa5a37ffaba4b8fa662bc15a5cb9"
|
||||
},
|
||||
"capsules/4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf.json": {
|
||||
"bytes": 123053,
|
||||
"sha256": "4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf"
|
||||
},
|
||||
"capsules/9cf85879dfb0bb5ec3b15c66b23df316e6bfe8451b6cf0c895bf7b9b5fbdde4a.json": {
|
||||
"bytes": 122682,
|
||||
"sha256": "9cf85879dfb0bb5ec3b15c66b23df316e6bfe8451b6cf0c895bf7b9b5fbdde4a"
|
||||
},
|
||||
"capsules/cecd6ae0ba45add8e913d9913cd4960c01928db0a4bc795902b7954ffb6f692e.zip": {
|
||||
"bytes": 2947000,
|
||||
"sha256": "cecd6ae0ba45add8e913d9913cd4960c01928db0a4bc795902b7954ffb6f692e"
|
||||
},
|
||||
"capsules/d8a64b62b68ac1c37bc3fe9309abc4dc314e343ce546bba4b9445f68dddeda5d.json": {
|
||||
"bytes": 122682,
|
||||
"sha256": "d8a64b62b68ac1c37bc3fe9309abc4dc314e343ce546bba4b9445f68dddeda5d"
|
||||
},
|
||||
"cargo/core-2/process.json": {
|
||||
"bytes": 200,
|
||||
"sha256": "744543a3f69d993977f0d15bce6e1ab3f64329eda4bb2d80375a8c8794ee83c0"
|
||||
},
|
||||
"cargo/core-2/result.json": {
|
||||
"bytes": 3196,
|
||||
"sha256": "4625b4558263524424fe6465aea20d1e9831f4c1cb6298124fa3683957f5880e"
|
||||
},
|
||||
"cargo/core-2/started.json": {
|
||||
"bytes": 1403,
|
||||
"sha256": "965d45f368d29ecbea6a7aa9b8881fe18a652928bad8f3e7665443acee52e19b"
|
||||
},
|
||||
"cargo/core-2/stderr.log": {
|
||||
"bytes": 320,
|
||||
"sha256": "42a28434514f50c42782a469c68e6aad8644592b9a09c4b50cc43d987bd2fd5d"
|
||||
},
|
||||
"cargo/core-2/stdout.log": {
|
||||
"bytes": 42721,
|
||||
"sha256": "862bd3e57a3454d29cb6d9ad7673e5bc4b25ab2a288e15d1a7d8dfb912a1457f"
|
||||
},
|
||||
"cargo/desktop-1/process.json": {
|
||||
"bytes": 183,
|
||||
"sha256": "bc57e00984823c7f417c8455f0db3da10f8e453c7db7a808f115b818525227ac"
|
||||
},
|
||||
"cargo/desktop-1/result.json": {
|
||||
"bytes": 1778,
|
||||
"sha256": "25f62fde1985dafcf3467895c6a2f389c886e92ceaa9d63ff513f3d4365ffe79"
|
||||
},
|
||||
"cargo/desktop-1/started.json": {
|
||||
"bytes": 1381,
|
||||
"sha256": "fd570a96b6dc5fc9e750634ef23093a7205cd953be5a7782485e8dbe509098a6"
|
||||
},
|
||||
"cargo/desktop-1/stderr.log": {
|
||||
"bytes": 166,
|
||||
"sha256": "ad39fc56f685f7f3c6a9b4a342abff1f19f9daad28c394673be0e3a2a1cf2523"
|
||||
},
|
||||
"cargo/desktop-1/stdout.log": {
|
||||
"bytes": 297269,
|
||||
"sha256": "d1cdbd43e8fe41e4af6fe2d99d665700a78c1d38185d3a373a33895f296e7b93"
|
||||
},
|
||||
"cargo/desktop-2/process.json": {
|
||||
"bytes": 162,
|
||||
"sha256": "86efe98400b268723e0c3b38b4bcd270f888215060548181b6f4695774a9b640"
|
||||
},
|
||||
"cargo/desktop-2/result.json": {
|
||||
"bytes": 3090,
|
||||
"sha256": "1ae8d0229e429001c2e6214e94e9c4156eb5db75ad1907f421ec87bdeac22f2e"
|
||||
},
|
||||
"cargo/desktop-2/started.json": {
|
||||
"bytes": 1355,
|
||||
"sha256": "71356cc6cdcd01d3620a4bd73c8eee2ccbcb870466b7b0419be8e76cd95e4c02"
|
||||
},
|
||||
"cargo/desktop-2/stderr.log": {
|
||||
"bytes": 288,
|
||||
"sha256": "5e3681e5c50d0d6b25d9594f87a7767456cefefb35ed0575b5d035202d00070f"
|
||||
},
|
||||
"cargo/desktop-2/stdout.log": {
|
||||
"bytes": 441409,
|
||||
"sha256": "f301281be9caa78720540f89548fc1bb80f9b28cda18e4f6425178d4995ed1ec"
|
||||
},
|
||||
"cargo/desktop-3/process.json": {
|
||||
"bytes": 186,
|
||||
"sha256": "963dea7f8d8663873ca087b025e53b6555af28a20cce4d5cbdc740c00c4c874d"
|
||||
},
|
||||
"cargo/desktop-3/result.json": {
|
||||
"bytes": 3307,
|
||||
"sha256": "ecdb5366bb2ca064924e8e967491a7b3db4adffec5cc8cb3370b7afaf739546b"
|
||||
},
|
||||
"cargo/desktop-3/started.json": {
|
||||
"bytes": 1573,
|
||||
"sha256": "5ddbc4ca4954ca732248437cf774cb7803ddec06bef42c11c63b27295be744b2"
|
||||
},
|
||||
"cargo/desktop-3/stderr.log": {
|
||||
"bytes": 287,
|
||||
"sha256": "e0d9090ebcc83418a064f8876ec587e4e741a65e380490999c169fa69628fe3b"
|
||||
},
|
||||
"cargo/desktop-3/stdout.log": {
|
||||
"bytes": 307286,
|
||||
"sha256": "c91fae7883b55901a2c3ab249650c2bb12a991e744a09c18159ffb3bf0079650"
|
||||
},
|
||||
"cargo/format-1/process.json": {
|
||||
"bytes": 116,
|
||||
"sha256": "d316037b78abff45a450b1c116d0c214d1d3831b6c375538779959e1dec652fb"
|
||||
},
|
||||
"cargo/format-1/result.json": {
|
||||
"bytes": 1871,
|
||||
"sha256": "2216bb25ce81504c61353456823ec38d77703dd6747f80f2d53b4267799ce21c"
|
||||
},
|
||||
"cargo/format-1/started.json": {
|
||||
"bytes": 1483,
|
||||
"sha256": "415e0776ec74ee486f2895e3581a8f78308dda9142d4e542442db9979408788b"
|
||||
},
|
||||
"cargo/format-1/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"cargo/format-1/stdout.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"cargo/lint-1/process.json": {
|
||||
"bytes": 195,
|
||||
"sha256": "286ba22c1994dfd70834adf811c103057724942f85fa5fbfa22e75e563ac376d"
|
||||
},
|
||||
"cargo/lint-1/result.json": {
|
||||
"bytes": 1806,
|
||||
"sha256": "7be8d8e2add4ceb69d5814326e4db91c33e804608e0998323dd72d388cf88def"
|
||||
},
|
||||
"cargo/lint-1/started.json": {
|
||||
"bytes": 1409,
|
||||
"sha256": "2fba3385528cf09df0382cbf4ec3867cdd109daad6de3fbfbc3663dbde7a1610"
|
||||
},
|
||||
"cargo/lint-1/stderr.log": {
|
||||
"bytes": 166,
|
||||
"sha256": "649dcf5fdf4a79dc2f3b315ef9e6735af44b50c40526c8593d2ce54a834a809d"
|
||||
},
|
||||
"cargo/lint-1/stdout.log": {
|
||||
"bytes": 271410,
|
||||
"sha256": "c7085d514e4dbdfc7c3b633911793071e13c27775edfe7ca8cc8f02b70219804"
|
||||
},
|
||||
"cargo/lint-2/process.json": {
|
||||
"bytes": 196,
|
||||
"sha256": "d6370e0e1aede61d5cae46028a6a7bab00e25429d1539e0989ef369d318d06c7"
|
||||
},
|
||||
"cargo/lint-2/result.json": {
|
||||
"bytes": 1988,
|
||||
"sha256": "0b5458c8567fa43a40c2fcf810999c0bc565d56635ff6fdb9484d79d88c69108"
|
||||
},
|
||||
"cargo/lint-2/started.json": {
|
||||
"bytes": 1593,
|
||||
"sha256": "4923e64c03112589eea0c15e3d67f66a94e4fdc1012356f24d67aad94142f386"
|
||||
},
|
||||
"cargo/lint-2/stderr.log": {
|
||||
"bytes": 207,
|
||||
"sha256": "d48449d9fa8226c728f9c979d930e91ebd55b84266edd3f7fb308b88a6451009"
|
||||
},
|
||||
"cargo/lint-2/stdout.log": {
|
||||
"bytes": 309558,
|
||||
"sha256": "de51e727c694ce4f35e4e732ab820488da053470538f20bdbffd55970eb2caad"
|
||||
},
|
||||
"cargo/native-build-1/process.json": {
|
||||
"bytes": 175,
|
||||
"sha256": "30f54028726b906c20cc9b7b0c7c965e3f1e54e6d4d54d99088da6b1c65c2f5e"
|
||||
},
|
||||
"cargo/native-build-1/result.json": {
|
||||
"bytes": 3311,
|
||||
"sha256": "03c22f6269b023f77d0fb3e713d5bbab8d14cf6e67ab4dfc613b4691fe4a6955"
|
||||
},
|
||||
"cargo/native-build-1/started.json": {
|
||||
"bytes": 1552,
|
||||
"sha256": "340989981b2db65bb194883c1a608f60cacf9a31d36a930dc39da28f5224cb88"
|
||||
},
|
||||
"cargo/native-build-1/stderr.log": {
|
||||
"bytes": 131,
|
||||
"sha256": "781b5778b0e781b52c25f5342c9c25d3fc45fe7c0da5bf5c94c86ba80ba7e2d2"
|
||||
},
|
||||
"cargo/native-build-1/stdout.log": {
|
||||
"bytes": 41724,
|
||||
"sha256": "5da6c22e3eef843f8be4539a7692e212c0c74461aaf4bf72ce2dd651abe165ac"
|
||||
},
|
||||
"cargo/windows-build-1/process.json": {
|
||||
"bytes": 137,
|
||||
"sha256": "2414e8af081cb683edbee3d6b89e5a323b08cce449058d453bffbc9736c1ea12"
|
||||
},
|
||||
"cargo/windows-build-1/result.json": {
|
||||
"bytes": 3193,
|
||||
"sha256": "172faec4d7708e4539468c3a9062d424f0e00cb80e827cd579274942c757eccb"
|
||||
},
|
||||
"cargo/windows-build-1/started.json": {
|
||||
"bytes": 1504,
|
||||
"sha256": "fefb683ef0e99046f5a18cbad56b8bb8bddc45b8abd322cb2c1d83e2acb26565"
|
||||
},
|
||||
"cargo/windows-build-1/stderr.log": {
|
||||
"bytes": 137,
|
||||
"sha256": "f75aa57fe559820a680c771701ea5737995528f29d7dae20e2ae265c07c0b8bb"
|
||||
},
|
||||
"cargo/windows-build-1/stdout.log": {
|
||||
"bytes": 284179,
|
||||
"sha256": "04422dbc4d720707d951d0654da39921c0a526b0eb0c33088a3a7e0d85686c31"
|
||||
},
|
||||
"helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py": {
|
||||
"bytes": 3827,
|
||||
"sha256": "1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20"
|
||||
},
|
||||
"helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py": {
|
||||
"bytes": 3502,
|
||||
"sha256": "6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
"""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/state-group-gates"
|
||||
candidates = sorted(gates.glob("*.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
|
||||
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,
|
||||
"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/state-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, default=HERE, help="package directory; existing evidence is never overwritten")
|
||||
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")
|
||||
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=True)
|
||||
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()
|
||||
@@ -0,0 +1,164 @@
|
||||
"""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"]
|
||||
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())
|
||||
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])
|
||||
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), "logicalFiles": len(logical), "storedMembers": len(stored), "sourceCapsulePairs": len(seen_capsules)}
|
||||
|
||||
|
||||
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()
|
||||
@@ -0,0 +1,18 @@
|
||||
# Core-1 capture incident
|
||||
|
||||
The original Cargo command recorded exit 0 and eleven tests passing, but
|
||||
inputsUnchanged is false. Its source archive differs from its earlier input map
|
||||
only in crates/oa-desktop/src/model_menu.rs (44572 versus 44757 bytes).
|
||||
This is an invalid capture for normal gate evidence and is never counted as one.
|
||||
A later unchanged capture must supply the accepted core gate.
|
||||
|
||||
The fixed identity file pins the exact original seven raw files and gate helper,
|
||||
and the exact two byte hashes for the sole map/archive mismatch. The incident
|
||||
verifier requires that known mismatch and rejects any other mismatch. It does not
|
||||
repair or rewrite raw receipts, source bytes, or the false unchanged-input flag.
|
||||
|
||||
Use `python -B prepare.py --root CHECKOUT --check-only` to verify originals.
|
||||
After review, omit --check-only and supply --output NEW_DIRECTORY. This copies
|
||||
seven raw files, helper, identity and tools without wrapping a new ZIP. The raw
|
||||
inputs.zip remains byte-identical. Verify with `python -B verify.py PACKAGE`.
|
||||
Pin consistency records an incident; it does not prove the cause or execution.
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -0,0 +1 @@
|
||||
{"pid": 772, "observed": "2026-09-23T09:44:19.087478+00:00", "command": ["cargo", "test", "-p", "oa-core", "--example", "state_multiselect_native", "--message-format=json", "--", "--test-threads=1"]}
|
||||
@@ -0,0 +1,91 @@
|
||||
{
|
||||
"start": "2026-09-23T09:44:18.183228+00:00",
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"--example",
|
||||
"state_multiselect_native",
|
||||
"--message-format=json",
|
||||
"--",
|
||||
"--test-threads=1"
|
||||
],
|
||||
"cwd": "C:\\ar-multiselect-9e8r6t",
|
||||
"head": "7e348d967d1787c052a145b7448636613a6a7054",
|
||||
"scope": "All Git-visible Cargo manifests/lock, crates (including patched dependency), build, .cargo, docs, examples, harness fixtures, compiled prototypes, and packaging scripts; all 71 tracked vendored files included",
|
||||
"inputs": {
|
||||
"bytes": 122682,
|
||||
"sha256": "81318b52a4f2659f0687bfa459c7e3a24f39996dd5a8b6d7f21c3c78fa16c3b4"
|
||||
},
|
||||
"archive": {
|
||||
"bytes": 2947000,
|
||||
"sha256": "cecd6ae0ba45add8e913d9913cd4960c01928db0a4bc795902b7954ffb6f692e"
|
||||
},
|
||||
"inputCount": 733,
|
||||
"environment": {
|
||||
"RUSTUP_TOOLCHAIN": "stable-x86_64-pc-windows-gnullvm",
|
||||
"CARGO_HOME": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo",
|
||||
"CARGO_TARGET_DIR": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm",
|
||||
"CARGO_BUILD_JOBS": "1",
|
||||
"CARGO_INCREMENTAL": "0"
|
||||
},
|
||||
"helper": {
|
||||
"bytes": 3502,
|
||||
"sha256": "6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06"
|
||||
},
|
||||
"cargo": "cargo 1.98.1 (797e8a9bc 2026-08-05)",
|
||||
"rustc": "rustc 1.98.1 (48a229cea 2026-09-01)",
|
||||
"finish": "2026-09-23T09:44:55.179378+00:00",
|
||||
"seconds": 36.09660960000474,
|
||||
"exitCode": 0,
|
||||
"inputsUnchanged": false,
|
||||
"stdout": {
|
||||
"bytes": 42721,
|
||||
"sha256": "93c11a194e1c97abcdbce56c9b45be479bd1e60cfa5ecd873773246a696d146d"
|
||||
},
|
||||
"stderr": {
|
||||
"bytes": 320,
|
||||
"sha256": "1b7e7597c4c20f47faf6695a257cc32bfce21b7fedcbf3a57cac6ea40114cd22"
|
||||
},
|
||||
"artifacts": [
|
||||
{
|
||||
"cargo": {
|
||||
"reason": "compiler-artifact",
|
||||
"package_id": "path+file:///C:/ar-multiselect-9e8r6t/crates/oa-core#0.2.0",
|
||||
"manifest_path": "C:\\ar-multiselect-9e8r6t\\crates\\oa-core\\Cargo.toml",
|
||||
"target": {
|
||||
"kind": [
|
||||
"example"
|
||||
],
|
||||
"crate_types": [
|
||||
"bin"
|
||||
],
|
||||
"name": "state_multiselect_native",
|
||||
"src_path": "C:\\ar-multiselect-9e8r6t\\crates\\oa-core\\examples\\state_multiselect_native.rs",
|
||||
"edition": "2024",
|
||||
"doc": false,
|
||||
"doctest": false,
|
||||
"test": false
|
||||
},
|
||||
"profile": {
|
||||
"opt_level": "0",
|
||||
"debuginfo": 0,
|
||||
"debug_assertions": true,
|
||||
"overflow_checks": true,
|
||||
"test": true
|
||||
},
|
||||
"features": [],
|
||||
"filenames": [
|
||||
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\examples\\state_multiselect_native-d2e54d8aa041abf6.exe"
|
||||
],
|
||||
"executable": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\examples\\state_multiselect_native-d2e54d8aa041abf6.exe",
|
||||
"fresh": false
|
||||
},
|
||||
"readback": {
|
||||
"bytes": 25410048,
|
||||
"sha256": "1c77465fc9c95e0a7079e23fa534c6f8e469b8b8b3a258fc8cdd47e02ff183c7"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"start": "2026-09-23T09:44:18.183228+00:00",
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"--example",
|
||||
"state_multiselect_native",
|
||||
"--message-format=json",
|
||||
"--",
|
||||
"--test-threads=1"
|
||||
],
|
||||
"cwd": "C:\\ar-multiselect-9e8r6t",
|
||||
"head": "7e348d967d1787c052a145b7448636613a6a7054",
|
||||
"scope": "All Git-visible Cargo manifests/lock, crates (including patched dependency), build, .cargo, docs, examples, harness fixtures, compiled prototypes, and packaging scripts; all 71 tracked vendored files included",
|
||||
"inputs": {
|
||||
"bytes": 122682,
|
||||
"sha256": "81318b52a4f2659f0687bfa459c7e3a24f39996dd5a8b6d7f21c3c78fa16c3b4"
|
||||
},
|
||||
"archive": {
|
||||
"bytes": 2947000,
|
||||
"sha256": "cecd6ae0ba45add8e913d9913cd4960c01928db0a4bc795902b7954ffb6f692e"
|
||||
},
|
||||
"inputCount": 733,
|
||||
"environment": {
|
||||
"RUSTUP_TOOLCHAIN": "stable-x86_64-pc-windows-gnullvm",
|
||||
"CARGO_HOME": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo",
|
||||
"CARGO_TARGET_DIR": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm",
|
||||
"CARGO_BUILD_JOBS": "1",
|
||||
"CARGO_INCREMENTAL": "0"
|
||||
},
|
||||
"helper": {
|
||||
"bytes": 3502,
|
||||
"sha256": "6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06"
|
||||
},
|
||||
"cargo": "cargo 1.98.1 (797e8a9bc 2026-08-05)",
|
||||
"rustc": "rustc 1.98.1 (48a229cea 2026-09-01)"
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
Compiling oa-core v0.2.0 (C:\ar-multiselect-9e8r6t\crates\oa-core)
|
||||
Finished `test` profile [unoptimized] target(s) in 28.51s
|
||||
Running unittests examples\state_multiselect_native.rs (C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\examples\state_multiselect_native-d2e54d8aa041abf6.exe)
|
||||
@@ -0,0 +1,67 @@
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.107","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\proc-macro2-1.0.107\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\proc-macro2-1.0.107\\build.rs","edition":"2021","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","proc-macro"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\proc-macro2-8bd275bc14efcc6d\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.107","linked_libs":[],"linked_paths":[],"cfgs":["wrap_proc_macro","proc_macro_span_location","proc_macro_span_file"],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\proc-macro2-678fa29727a3d951\\out"}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#unicode-ident@1.0.24","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\unicode-ident-1.0.24\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"unicode_ident","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\unicode-ident-1.0.24\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libunicode_ident-37cacd323a49429c.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libunicode_ident-37cacd323a49429c.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#quote@1.0.47","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\quote-1.0.47\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\quote-1.0.47\\build.rs","edition":"2021","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","proc-macro"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\quote-78b7b00c15767e2b\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#quote@1.0.47","linked_libs":[],"linked_paths":[],"cfgs":[],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\quote-db749d68bbb2dbfe\\out"}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.107","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\proc-macro2-1.0.107\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"proc_macro2","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\proc-macro2-1.0.107\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","proc-macro"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libproc_macro2-80e9e45547beebf5.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libproc_macro2-80e9e45547beebf5.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#quote@1.0.47","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\quote-1.0.47\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"quote","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\quote-1.0.47\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","proc-macro"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libquote-b79aec363b458000.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libquote-b79aec363b458000.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#autocfg@1.5.1","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\autocfg-1.5.1\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"autocfg","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\autocfg-1.5.1\\src\\lib.rs","edition":"2015","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libautocfg-58f70baf3de29c77.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libautocfg-58f70baf3de29c77.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde_core@1.0.229","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_core-1.0.229\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_core-1.0.229\\build.rs","edition":"2021","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["result","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\serde_core-161b3ae2683262f1\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde_core@1.0.229","linked_libs":[],"linked_paths":[],"cfgs":[],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\serde_core-a1da37301c02ee2a\\out"}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#num-traits@0.2.19","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\num-traits-0.2.19\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\num-traits-0.2.19\\build.rs","edition":"2021","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","i128","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\num-traits-34ffb4c64e9b5e22\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#syn@3.0.5","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\syn-3.0.5\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"syn","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\syn-3.0.5\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["clone-impls","default","derive","parsing","printing","proc-macro"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libsyn-2232b8c89352da95.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libsyn-2232b8c89352da95.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#getrandom@0.4.3","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\getrandom-0.4.3\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\getrandom-0.4.3\\build.rs","edition":"2024","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\getrandom-168cb7f91c8645ca\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#windows-link@0.2.1","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\windows-link-0.2.1\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"windows_link","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\windows-link-0.2.1\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libwindows_link-23f115c823619f71.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libwindows_link-23f115c823619f71.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#windows-sys@0.61.2","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\windows-sys-0.61.2\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"windows_sys","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\windows-sys-0.61.2\\src\\lib.rs","edition":"2021","doc":true,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["Win32","Win32_Foundation","Win32_Storage","Win32_Storage_FileSystem","Win32_System","Win32_System_Console","Win32_System_SystemInformation","default"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libwindows_sys-43b3d9a205b229b7.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libwindows_sys-43b3d9a205b229b7.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#getrandom@0.4.3","linked_libs":[],"linked_paths":[],"cfgs":[],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\getrandom-4967b63cf7b288b8\\out"}
|
||||
{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#num-traits@0.2.19","linked_libs":[],"linked_paths":[],"cfgs":["has_total_cmp"],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\num-traits-418230edfe1b6b90\\out"}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde_core@1.0.229","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_core-1.0.229\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"serde_core","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_core-1.0.229\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["result","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libserde_core-f52ac0796dd4fc39.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libserde_core-f52ac0796dd4fc39.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#zmij@1.0.23","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\zmij-1.0.23\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\zmij-1.0.23\\build.rs","edition":"2021","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\zmij-e8f67a20243f3063\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.4","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\cfg-if-1.0.4\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"cfg_if","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\cfg-if-1.0.4\\src\\lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libcfg_if-805b2ebc84d544f1.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libcfg_if-805b2ebc84d544f1.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#getrandom@0.4.3","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\getrandom-0.4.3\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"getrandom","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\getrandom-0.4.3\\src\\lib.rs","edition":"2024","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libgetrandom-6e8efb5a01ff0cbb.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libgetrandom-6e8efb5a01ff0cbb.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#zmij@1.0.23","linked_libs":[],"linked_paths":[],"cfgs":[],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\zmij-c8f8f3187a72be14\\out"}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#num-traits@0.2.19","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\num-traits-0.2.19\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"num_traits","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\num-traits-0.2.19\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","i128","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libnum_traits-49c57447e2766d62.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libnum_traits-49c57447e2766d62.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#thiserror@2.0.20","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\thiserror-2.0.20\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\thiserror-2.0.20\\build.rs","edition":"2021","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\thiserror-d9d1cecb0b9dfa9d\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde@1.0.229","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde-1.0.229\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde-1.0.229\\build.rs","edition":"2021","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","derive","serde_derive","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\serde-c9911adbe87e85d2\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde_json@1.0.151","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_json-1.0.151\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_json-1.0.151\\build.rs","edition":"2021","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\serde_json-28521d5277e5c15b\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde_json@1.0.151","linked_libs":[],"linked_paths":[],"cfgs":["fast_arithmetic=\"64\""],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\serde_json-908788f6700df5fb\\out"}
|
||||
{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde@1.0.229","linked_libs":[],"linked_paths":[],"cfgs":["if_docsrs_then_no_serde_core"],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\serde-963672309bf9e4ba\\out"}
|
||||
{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#thiserror@2.0.20","linked_libs":[],"linked_paths":[],"cfgs":[],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\thiserror-2e28320913ae6f8a\\out"}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#num-integer@0.1.47","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\num-integer-0.1.47\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"num_integer","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\num-integer-0.1.47\\src\\lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","i128","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libnum_integer-cf43e8f5b615e1d9.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libnum_integer-cf43e8f5b615e1d9.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#zmij@1.0.23","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\zmij-1.0.23\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"zmij","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\zmij-1.0.23\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libzmij-9f8770986f00ef15.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libzmij-9f8770986f00ef15.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#winapi-util@0.1.11","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\winapi-util-0.1.11\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"winapi_util","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\winapi-util-0.1.11\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libwinapi_util-be9ab0847edf5b05.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libwinapi_util-be9ab0847edf5b05.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#thiserror-impl@2.0.20","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\thiserror-impl-2.0.20\\Cargo.toml","target":{"kind":["proc-macro"],"crate_types":["proc-macro"],"name":"thiserror_impl","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\thiserror-impl-2.0.20\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\thiserror_impl-774eb7636a800724.dll","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libthiserror_impl-774eb7636a800724.dll.a"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde_derive@1.0.229","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_derive-1.0.229\\Cargo.toml","target":{"kind":["proc-macro"],"crate_types":["proc-macro"],"name":"serde_derive","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_derive-1.0.229\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\serde_derive-c07a6353fdd1d8a1.dll","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libserde_derive-c07a6353fdd1d8a1.dll.a"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#once_cell@1.21.4","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\once_cell-1.21.4\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"once_cell","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\once_cell-1.21.4\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["alloc","race","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libonce_cell-f7e62c44737ecbb9.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libonce_cell-f7e62c44737ecbb9.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#sha1_smol@1.0.1","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\sha1_smol-1.0.1\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"sha1_smol","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\sha1_smol-1.0.1\\src\\lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libsha1_smol-c4b7e5ec8b41792e.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libsha1_smol-c4b7e5ec8b41792e.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#memchr@2.8.3","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\memchr-2.8.3\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"memchr","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\memchr-2.8.3\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["alloc","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libmemchr-088af8780d4df76d.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libmemchr-088af8780d4df76d.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#itoa@1.0.18","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\itoa-1.0.18\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"itoa","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\itoa-1.0.18\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libitoa-971c3e13d32ffcf2.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libitoa-971c3e13d32ffcf2.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"path+file:///C:/ar-multiselect-9e8r6t/crates/oa-core#0.2.0","manifest_path":"C:\\ar-multiselect-9e8r6t\\crates\\oa-core\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\ar-multiselect-9e8r6t\\crates\\oa-core\\build.rs","edition":"2024","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\oa-core-1fac039e071a74d1\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#fastrand@2.5.0","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\fastrand-2.5.0\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"fastrand","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\fastrand-2.5.0\\src\\lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["alloc","default","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libfastrand-3df248e815d242e1.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libfastrand-3df248e815d242e1.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#tempfile@3.27.0","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\tempfile-3.27.0\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"tempfile","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\tempfile-3.27.0\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","getrandom"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libtempfile-20c336358d7a22b5.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libtempfile-20c336358d7a22b5.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"build-script-executed","package_id":"path+file:///C:/ar-multiselect-9e8r6t/crates/oa-core#0.2.0","linked_libs":[],"linked_paths":[],"cfgs":[],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\oa-core-70aec2be9e005f38\\out"}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde_json@1.0.151","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_json-1.0.151\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"serde_json","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_json-1.0.151\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libserde_json-b48005beba7e4267.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libserde_json-b48005beba7e4267.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#uuid@1.26.0","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\uuid-1.26.0\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"uuid","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\uuid-1.26.0\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","rng","serde","sha1","std","v4","v5"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libuuid-f7851e8936dae115.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libuuid-f7851e8936dae115.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde@1.0.229","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde-1.0.229\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"serde","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde-1.0.229\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","derive","serde_derive","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libserde-968c91fb77bb5d38.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libserde-968c91fb77bb5d38.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#thiserror@2.0.20","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\thiserror-2.0.20\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"thiserror","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\thiserror-2.0.20\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libthiserror-add096f46a35d6d2.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libthiserror-add096f46a35d6d2.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#same-file@1.0.6","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\same-file-1.0.6\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"same_file","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\same-file-1.0.6\\src\\lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libsame_file-a21d6395ce590b18.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libsame_file-a21d6395ce590b18.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#num-bigint@0.5.1","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\num-bigint-0.5.1\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"num_bigint","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\num-bigint-0.5.1\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libnum_bigint-7e87a41b738c784b.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libnum_bigint-7e87a41b738c784b.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"path+file:///C:/ar-multiselect-9e8r6t/crates/oa-core#0.2.0","manifest_path":"C:\\ar-multiselect-9e8r6t\\crates\\oa-core\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"oa_core","src_path":"C:\\ar-multiselect-9e8r6t\\crates\\oa-core\\src\\lib.rs","edition":"2024","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\liboa_core-b1d9f219f5e0886b.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\liboa_core-b1d9f219f5e0886b.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"path+file:///C:/ar-multiselect-9e8r6t/crates/oa-core#0.2.0","manifest_path":"C:\\ar-multiselect-9e8r6t\\crates\\oa-core\\Cargo.toml","target":{"kind":["example"],"crate_types":["bin"],"name":"state_multiselect_native","src_path":"C:\\ar-multiselect-9e8r6t\\crates\\oa-core\\examples\\state_multiselect_native.rs","edition":"2024","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":true},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\examples\\state_multiselect_native-d2e54d8aa041abf6.exe"],"executable":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\examples\\state_multiselect_native-d2e54d8aa041abf6.exe","fresh":false}
|
||||
{"reason":"build-finished","success":true}
|
||||
|
||||
running 11 tests
|
||||
test tests::generated_json_and_real_source_bundle_are_accepted_unchanged ... ok
|
||||
test tests::hide_must_preserve_child_routes_and_semantic_objects ... ok
|
||||
test tests::internal_pins_left_behind_and_external_pins_moved_are_rejected ... ok
|
||||
test tests::manual_attachments_and_label_data_must_remain_exact ... ok
|
||||
test tests::moved_and_hidden_source_inputs_are_checked_against_complete_expected_projects ... ok
|
||||
test tests::omitted_and_double_moved_child_are_rejected ... ok
|
||||
test tests::real_group_command_outputs_pass_and_are_not_unchanged ... ok
|
||||
test tests::real_hide_command_outputs_pass_before_and_after_movement ... ok
|
||||
test tests::semantic_other_view_fixed_node_and_trace_drift_are_rejected ... ok
|
||||
test tests::unchanged_rejects_valid_semantic_drift_without_geometry_changes ... ok
|
||||
test tests::zero_and_excessive_moves_cannot_satisfy_move_evidence ... ok
|
||||
|
||||
test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 6.25s
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"README.md": {
|
||||
"bytes": 1113,
|
||||
"sha256": "23b6099c058997f1ed12c20b0dd89d124d2e6915eccf02bdbe1068544256a748"
|
||||
},
|
||||
"core-1/inputs.json": {
|
||||
"bytes": 122682,
|
||||
"sha256": "81318b52a4f2659f0687bfa459c7e3a24f39996dd5a8b6d7f21c3c78fa16c3b4"
|
||||
},
|
||||
"core-1/inputs.zip": {
|
||||
"bytes": 2947000,
|
||||
"sha256": "cecd6ae0ba45add8e913d9913cd4960c01928db0a4bc795902b7954ffb6f692e"
|
||||
},
|
||||
"core-1/process.json": {
|
||||
"bytes": 199,
|
||||
"sha256": "c59cb33a7a7339a9b876b87e377ef57a8840bf76a411dc80d6cf5e32d365a9f8"
|
||||
},
|
||||
"core-1/result.json": {
|
||||
"bytes": 3196,
|
||||
"sha256": "ca61228c182b4824492a6248e2c37dc4519e35b5b077212e72a4283bf3b0ffab"
|
||||
},
|
||||
"core-1/started.json": {
|
||||
"bytes": 1403,
|
||||
"sha256": "2aa37908fb7eb8f49819fe8e96c59e6254f560b5c7058f7491c6c38d4b304487"
|
||||
},
|
||||
"core-1/stderr.log": {
|
||||
"bytes": 320,
|
||||
"sha256": "1b7e7597c4c20f47faf6695a257cc32bfce21b7fedcbf3a57cac6ea40114cd22"
|
||||
},
|
||||
"core-1/stdout.log": {
|
||||
"bytes": 42721,
|
||||
"sha256": "93c11a194e1c97abcdbce56c9b45be479bd1e60cfa5ecd873773246a696d146d"
|
||||
},
|
||||
"gate-helper.py": {
|
||||
"bytes": 3502,
|
||||
"sha256": "6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06"
|
||||
},
|
||||
"identity.json": {
|
||||
"bytes": 1455,
|
||||
"sha256": "b065e20e1130fbd1caff052e71e01da083c14eaf785748b3d32c3a691f7146a9"
|
||||
},
|
||||
"prepare.py": {
|
||||
"bytes": 1866,
|
||||
"sha256": "0550fb880635e27a193d2b5166f1dbbe1edb2091f3bf5d23be5fc3fa3b4ae63b"
|
||||
},
|
||||
"verify.py": {
|
||||
"bytes": 3726,
|
||||
"sha256": "3a33fb46f3b9b8a30a35dbc6469d404cca94fa2ed40804101719f2d2e686d6d0"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
from pathlib import Path
|
||||
import datetime, hashlib, json, os, subprocess, sys, time, zipfile
|
||||
|
||||
# Process-local disk recovery: do not write another Rust incremental cache.
|
||||
os.environ['CARGO_INCREMENTAL'] = '0'
|
||||
|
||||
root = Path('C:/ar-multiselect-9e8r6t')
|
||||
out = Path(__file__).resolve().parent / sys.argv[1]
|
||||
out.mkdir(parents=True, exist_ok=False)
|
||||
def now(): return datetime.datetime.now(datetime.timezone.utc).isoformat()
|
||||
def digest(path):
|
||||
data = path.read_bytes()
|
||||
return {'bytes': len(data), 'sha256': hashlib.sha256(data).hexdigest()}
|
||||
def inputs():
|
||||
paths = subprocess.check_output(['git','ls-files','--cached','--others','--exclude-standard','-z'],cwd=root).decode().split('\0')
|
||||
return {p:digest(root/p) for p in sorted(set(paths)) if p and (p in ('Cargo.toml','Cargo.lock','rust-toolchain.toml') or p.startswith(('crates/','build/','.cargo/','scripts/','docs/','examples/','harness/fixtures/','harness/prototypes/')))}
|
||||
before=inputs()
|
||||
assert len([p for p in before if p.startswith('crates/vendor/iced_widget/')]) == 71, 'Vendored input inventory changed'
|
||||
assert all(before[p] == digest(root/p) for p in before)
|
||||
(out/'inputs.json').write_text(json.dumps(before,indent=2),encoding='utf-8')
|
||||
with zipfile.ZipFile(out/'inputs.zip','x',compression=zipfile.ZIP_DEFLATED) as z:
|
||||
for p in before: z.write(root/p,p)
|
||||
command=['cargo',*sys.argv[2:]]
|
||||
start={'start':now(),'command':command,'cwd':str(root),'head':subprocess.check_output(['git','rev-parse','HEAD'],cwd=root,text=True).strip(),
|
||||
'scope':'All Git-visible Cargo manifests/lock, crates (including patched dependency), build, .cargo, docs, examples, harness fixtures, compiled prototypes, and packaging scripts; all 71 tracked vendored files included',
|
||||
'inputs':digest(out/'inputs.json'),'archive':digest(out/'inputs.zip'),'inputCount':len(before),
|
||||
'environment':{k:os.environ.get(k) for k in ('RUSTUP_TOOLCHAIN','CARGO_HOME','CARGO_TARGET_DIR','CARGO_BUILD_JOBS','CARGO_INCREMENTAL')},
|
||||
'helper':digest(Path(__file__).resolve()),
|
||||
'cargo':subprocess.check_output(['cargo','--version'],text=True).strip(),'rustc':subprocess.check_output(['rustc','--version'],text=True).strip()}
|
||||
(out/'started.json').write_text(json.dumps(start,indent=2),encoding='utf-8')
|
||||
t=time.perf_counter()
|
||||
with (out/'stdout.log').open('xb') as stdout,(out/'stderr.log').open('xb') as stderr:
|
||||
r=subprocess.Popen(command,cwd=root,stdout=stdout,stderr=stderr)
|
||||
(out/'process.json').write_text(json.dumps({'pid':r.pid,'observed':now(),'command':command}),encoding='utf-8')
|
||||
r.wait()
|
||||
artifacts=[]
|
||||
for line in (out/'stdout.log').read_text(encoding='utf-8',errors='replace').splitlines():
|
||||
try: item=json.loads(line)
|
||||
except json.JSONDecodeError: continue
|
||||
if isinstance(item,dict) and item.get('reason')=='compiler-artifact' and item.get('executable'):
|
||||
path=Path(item['executable'])
|
||||
artifacts.append({'cargo':item,'readback':digest(path) if path.exists() else None})
|
||||
result={**start,'finish':now(),'seconds':time.perf_counter()-t,'exitCode':r.returncode,'inputsUnchanged':before==inputs(),
|
||||
'stdout':digest(out/'stdout.log'),'stderr':digest(out/'stderr.log'),'artifacts':artifacts}
|
||||
(out/'result.json').write_text(json.dumps(result,indent=2),encoding='utf-8')
|
||||
print(json.dumps({k:v for k,v in result.items() if k!='artifacts'},indent=2))
|
||||
print('Executable artifacts:',len(artifacts))
|
||||
sys.exit(0 if r.returncode==0 and result['inputsUnchanged'] else 1)
|
||||
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"raw": {
|
||||
"inputs.json": {
|
||||
"bytes": 122682,
|
||||
"sha256": "81318b52a4f2659f0687bfa459c7e3a24f39996dd5a8b6d7f21c3c78fa16c3b4"
|
||||
},
|
||||
"inputs.zip": {
|
||||
"bytes": 2947000,
|
||||
"sha256": "cecd6ae0ba45add8e913d9913cd4960c01928db0a4bc795902b7954ffb6f692e"
|
||||
},
|
||||
"process.json": {
|
||||
"bytes": 199,
|
||||
"sha256": "c59cb33a7a7339a9b876b87e377ef57a8840bf76a411dc80d6cf5e32d365a9f8"
|
||||
},
|
||||
"result.json": {
|
||||
"bytes": 3196,
|
||||
"sha256": "ca61228c182b4824492a6248e2c37dc4519e35b5b077212e72a4283bf3b0ffab"
|
||||
},
|
||||
"started.json": {
|
||||
"bytes": 1403,
|
||||
"sha256": "2aa37908fb7eb8f49819fe8e96c59e6254f560b5c7058f7491c6c38d4b304487"
|
||||
},
|
||||
"stderr.log": {
|
||||
"bytes": 320,
|
||||
"sha256": "1b7e7597c4c20f47faf6695a257cc32bfce21b7fedcbf3a57cac6ea40114cd22"
|
||||
},
|
||||
"stdout.log": {
|
||||
"bytes": 42721,
|
||||
"sha256": "93c11a194e1c97abcdbce56c9b45be479bd1e60cfa5ecd873773246a696d146d"
|
||||
}
|
||||
},
|
||||
"helper": {
|
||||
"bytes": 3502,
|
||||
"sha256": "6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06"
|
||||
},
|
||||
"mismatches": {
|
||||
"crates/oa-desktop/src/model_menu.rs": {
|
||||
"map": {
|
||||
"bytes": 44572,
|
||||
"sha256": "3844be8ec15fe2c5614ff5625ec7b63234fbf5a6d126de5a85c8f5c51dfa7101"
|
||||
},
|
||||
"archive": {
|
||||
"bytes": 44757,
|
||||
"sha256": "82998c97e8d706b1ce1c1fb7058eaeabfceae3004e38f60d6076194968dc5272"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
"""Preserve the raw core-1 capture incident separately from strict gate packages."""
|
||||
from pathlib import Path
|
||||
import argparse, json
|
||||
from verify import HERE, RAW, need, pin, parsed, verify
|
||||
|
||||
def main():
|
||||
parser=argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('--root',type=Path,required=True)
|
||||
parser.add_argument('--helper',type=Path,action='append',default=[])
|
||||
parser.add_argument('--output',type=Path)
|
||||
parser.add_argument('--check-only',action='store_true')
|
||||
args=parser.parse_args()
|
||||
gates=args.root/'.local/state-group-gates'; folder=gates/'core-1'
|
||||
need(all(p.is_file() and not p.is_symlink() for p in folder.iterdir()) and {p.name for p in folder.iterdir()}==RAW,'exact closed raw inventory')
|
||||
raw={n:(folder/n).read_bytes() for n in RAW}
|
||||
identity=parsed((HERE/'identity.json').read_bytes())
|
||||
matches=[p.read_bytes() for p in list(gates.glob('*.py'))+args.helper if pin(p.read_bytes())==identity['helper']]
|
||||
need(bool(matches),'exact historical helper required')
|
||||
summary=verify(raw,matches[0],identity)
|
||||
if args.check_only:
|
||||
print('PASS incident check-only, no package written:',summary); return
|
||||
need(args.output is not None,'explicit --output required')
|
||||
out=args.output.resolve(); need(not out.exists(),'existing output refused')
|
||||
out.mkdir(parents=True); (out/'core-1').mkdir()
|
||||
payload={'core-1/'+n:b for n,b in raw.items()}
|
||||
payload['gate-helper.py']=matches[0]
|
||||
for n in ('prepare.py','verify.py','README.md','identity.json'): payload[n]=(HERE/n).read_bytes()
|
||||
for n,b in payload.items():
|
||||
with (out/n).open('xb') as f: f.write(b)
|
||||
with (out/'files.json').open('x',encoding='utf-8') as f: json.dump({n:pin(b) for n,b in sorted(payload.items())},f,indent=2)
|
||||
print('Preserved incident, not a gate pass:',out,summary)
|
||||
if __name__=='__main__': main()
|
||||
@@ -0,0 +1,53 @@
|
||||
"""Verify one pinned capture incident; never count it as a normal gate pass."""
|
||||
from pathlib import Path
|
||||
import argparse, hashlib, io, json, stat, zipfile
|
||||
HERE = Path(__file__).resolve().parent
|
||||
RAW = {'started.json','process.json','result.json','stdout.log','stderr.log','inputs.json','inputs.zip'}
|
||||
COMMAND = ['cargo','test','-p','oa-core','--example','state_multiselect_native','--message-format=json','--','--test-threads=1']
|
||||
CHANGED = 'crates/oa-desktop/src/model_menu.rs'
|
||||
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):
|
||||
out={}
|
||||
for k,v in items:
|
||||
need(k not in out, 'duplicate JSON key')
|
||||
out[k]=v
|
||||
return out
|
||||
return json.loads(data, object_pairs_hook=unique)
|
||||
def verify(raw, helper, identity):
|
||||
need(set(raw)==set(identity['raw'])==RAW, 'exact seven raw files')
|
||||
need({n:pin(b) for n,b in raw.items()}==identity['raw'], 'exact incident raw pins')
|
||||
start,process,result=[parsed(raw[n+'.json']) for n in ('started','process','result')]
|
||||
need(all(result.get(k)==v for k,v in start.items()), 'start/result relationship')
|
||||
need(result['command']==process['command']==COMMAND, 'specific core example test command')
|
||||
need(result['exitCode']==0 and result['inputsUnchanged'] is False, 'incident status, not accepted gate')
|
||||
need(pin(helper)==identity['helper']==result['helper'], 'historical helper pin')
|
||||
for field,name in [('inputs','inputs.json'),('archive','inputs.zip'),('stdout','stdout.log'),('stderr','stderr.log')]:
|
||||
need(result[field]==pin(raw[name]), field+' pin')
|
||||
inputs=parsed(raw['inputs.json'])
|
||||
need(len(inputs)==result['inputCount']==733, 'historical input count')
|
||||
actual={}
|
||||
with zipfile.ZipFile(io.BytesIO(raw['inputs.zip'])) as z:
|
||||
need(len(z.namelist())==len(set(z.namelist())) and set(z.namelist())==set(inputs), 'exact source inventory')
|
||||
for item in z.infolist():
|
||||
name=item.filename
|
||||
need(not item.is_dir() and not stat.S_ISLNK(item.external_attr>>16) and '\\' not in name and ':' not in name and not name.startswith('/') and all(p not in ('','.','..') for p in name.split('/')), 'safe source name')
|
||||
actual[name]=pin(z.read(name))
|
||||
mismatch={n:{'map':inputs[n],'archive':actual[n]} for n in inputs if inputs[n]!=actual[n]}
|
||||
need(set(mismatch)=={CHANGED} and mismatch==identity['mismatches'], 'exact sole known map/archive mismatch')
|
||||
need(mismatch[CHANGED]['map']['bytes']==44572 and mismatch[CHANGED]['archive']['bytes']==44757, 'known mismatch sizes')
|
||||
need(b'test result: ok. 11 passed; 0 failed;' in raw['stdout.log'], 'recorded eleven-test result')
|
||||
return {'incident':'core-1','acceptedGate':False,'rawFiles':7,'mismatchedInputs':list(mismatch)}
|
||||
def main():
|
||||
parser=argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('package',nargs='?',type=Path,default=HERE)
|
||||
args=parser.parse_args(); root=args.package
|
||||
files=parsed((root/'files.json').read_bytes())
|
||||
expected={'prepare.py','verify.py','README.md','identity.json','gate-helper.py'}|{'core-1/'+n for n in RAW}
|
||||
need(set(files)==expected, 'package file inventory')
|
||||
need({p.relative_to(root).as_posix() for p in root.rglob('*') if p.is_file()}==expected|{'files.json'}, 'exact on-disk package files')
|
||||
for n,p in files.items(): need(pin((root/n).read_bytes())==p, 'package pin '+n)
|
||||
print('PASS incident consistency; not a gate pass:', verify({n:(root/'core-1'/n).read_bytes() for n in RAW},(root/'gate-helper.py').read_bytes(),parsed((root/'identity.json').read_bytes())))
|
||||
if __name__=='__main__': main()
|
||||
@@ -0,0 +1,27 @@
|
||||
# State multiselect native evidence tools
|
||||
|
||||
Candidate tools; no native run or acceptance is asserted by their presence.
|
||||
Prepare only a closed `.local/state-multiselect-native/run-1`:
|
||||
|
||||
```
|
||||
python -B prepare.py --root CHECKOUT --runs run-1 --check-only
|
||||
```
|
||||
|
||||
Declare any additional unchanged snapshot labels with `--extra-unchanged LABEL ...`.
|
||||
Nine original history snapshots remain mandatory. Each additional snapshot must
|
||||
pass every checker/provenance/time/source check and equal baseline bytes exactly.
|
||||
All three distinct history byte groups, complete-Project comparisons, input-map
|
||||
and executable relationships, unchanged flags, captured-window relationships,
|
||||
and exact archive inventories remain required. Source count must match the
|
||||
fixture and history record. Only `views/diagram_state_view.arcadia` may change.
|
||||
|
||||
After completed native observation and final source verification, omit
|
||||
`--check-only` and provide
|
||||
`--output CHECKOUT/harness/experiments/state-multiselect-20260923/native`.
|
||||
Run `python -B verify.py PACKAGE` to check a written package. Existing outputs
|
||||
are refused. Helpers are preserved as pinned data; they are never executed.
|
||||
Referenced full build capsules/logs belong in the sibling checks package.
|
||||
|
||||
Offline byte/receipt consistency does not authenticate actions, establish
|
||||
usability, rerun the checker, or prove native acceptance. Native action
|
||||
observations and limitations require a separate reviewed record.
|
||||
Binary file not shown.
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"prepare.py": {
|
||||
"bytes": 7494,
|
||||
"sha256": "0ba52dc39d08888e34d2b84e25f40acbcfda97aa74c2fd21319967867e0008ae"
|
||||
},
|
||||
"verify.py": {
|
||||
"bytes": 15255,
|
||||
"sha256": "26e08398561c1753926cb994d674d311307970f06f0f8ae68ca6dec4f5e9a8e4"
|
||||
},
|
||||
"README.md": {
|
||||
"bytes": 1457,
|
||||
"sha256": "dc13ee4603368a86b49cd54d5c3b19c7759e81a16ccc3c782882285db0758d26"
|
||||
},
|
||||
"manifest.json": {
|
||||
"bytes": 42972,
|
||||
"sha256": "088fd71a7e41536287aeeed32ab6da41130a0f3b3621dd752b88290a435bff50"
|
||||
},
|
||||
"evidence.zip": {
|
||||
"bytes": 3384779,
|
||||
"sha256": "1d08c1bc6af4856a569ddd320ddf5403a302b8d9437750663a498541e489d663"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,975 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"kind": "multiselect-native",
|
||||
"runs": {
|
||||
"run-1": {
|
||||
"originalRun": "C:/ar-multiselect-9e8r6t/.local/state-multiselect-native/run-1",
|
||||
"originalFixture": "C:/ar-multiselect-9e8r6t/.local/state-multiselect-native/fixture-1",
|
||||
"helpers": {
|
||||
"helper": "helpers/68c17b874f25c2b65a0aa81b6db6de9a28184388fee04185e47615b022cfbdf3.py",
|
||||
"capture": "helpers/c11446a694a6357c77e2cba405c5a078b29eef5cdd2342579d234b4e20270eb1.js",
|
||||
"snapshotHelper": "helpers/4301a93f23db7d43399ed87c6eede2196d38911aba09a391fae5bcd4b691fa7b.py",
|
||||
"history": "helpers/dc3ad2c3491acda3290099e4c3af0ef6d5c2362ca1df9c2ee3b8f113b2f5e723.py"
|
||||
},
|
||||
"builds": {
|
||||
"gui": {
|
||||
"receipt": "builds/172faec4d7708e4539468c3a9062d424f0e00cb80e827cd579274942c757eccb/result.json",
|
||||
"inputs": "builds/172faec4d7708e4539468c3a9062d424f0e00cb80e827cd579274942c757eccb/inputs.json",
|
||||
"originalRelative": ".local/state-group-gates/windows-build-1/result.json",
|
||||
"helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py"
|
||||
},
|
||||
"checker": {
|
||||
"receipt": "builds/03c22f6269b023f77d0fb3e713d5bbab8d14cf6e67ab4dfc613b4691fe4a6955/result.json",
|
||||
"inputs": "builds/03c22f6269b023f77d0fb3e713d5bbab8d14cf6e67ab4dfc613b4691fe4a6955/inputs.json",
|
||||
"originalRelative": ".local/state-group-gates/native-build-1/result.json",
|
||||
"helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py"
|
||||
}
|
||||
},
|
||||
"extraUnchangedSnapshots": [
|
||||
"row-mixed-unchanged"
|
||||
],
|
||||
"checkerSource": {
|
||||
"inputPath": "crates/oa-core/examples/state_multiselect_native.rs",
|
||||
"member": "checker-source/5db7a00b044c27b851731b3d8cb16cc3f638a5242bf53bd46b3a5e1df4de0460.rs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"members": {
|
||||
"builds/03c22f6269b023f77d0fb3e713d5bbab8d14cf6e67ab4dfc613b4691fe4a6955/inputs.json": {
|
||||
"bytes": 123053,
|
||||
"sha256": "4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf"
|
||||
},
|
||||
"builds/03c22f6269b023f77d0fb3e713d5bbab8d14cf6e67ab4dfc613b4691fe4a6955/result.json": {
|
||||
"bytes": 3311,
|
||||
"sha256": "03c22f6269b023f77d0fb3e713d5bbab8d14cf6e67ab4dfc613b4691fe4a6955"
|
||||
},
|
||||
"builds/172faec4d7708e4539468c3a9062d424f0e00cb80e827cd579274942c757eccb/inputs.json": {
|
||||
"bytes": 123053,
|
||||
"sha256": "4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf"
|
||||
},
|
||||
"builds/172faec4d7708e4539468c3a9062d424f0e00cb80e827cd579274942c757eccb/result.json": {
|
||||
"bytes": 3193,
|
||||
"sha256": "172faec4d7708e4539468c3a9062d424f0e00cb80e827cd579274942c757eccb"
|
||||
},
|
||||
"checker-source/5db7a00b044c27b851731b3d8cb16cc3f638a5242bf53bd46b3a5e1df4de0460.rs": {
|
||||
"bytes": 31343,
|
||||
"sha256": "5db7a00b044c27b851731b3d8cb16cc3f638a5242bf53bd46b3a5e1df4de0460"
|
||||
},
|
||||
"helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py": {
|
||||
"bytes": 3827,
|
||||
"sha256": "1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20"
|
||||
},
|
||||
"helpers/4301a93f23db7d43399ed87c6eede2196d38911aba09a391fae5bcd4b691fa7b.py": {
|
||||
"bytes": 2503,
|
||||
"sha256": "4301a93f23db7d43399ed87c6eede2196d38911aba09a391fae5bcd4b691fa7b"
|
||||
},
|
||||
"helpers/68c17b874f25c2b65a0aa81b6db6de9a28184388fee04185e47615b022cfbdf3.py": {
|
||||
"bytes": 3411,
|
||||
"sha256": "68c17b874f25c2b65a0aa81b6db6de9a28184388fee04185e47615b022cfbdf3"
|
||||
},
|
||||
"helpers/c11446a694a6357c77e2cba405c5a078b29eef5cdd2342579d234b4e20270eb1.js": {
|
||||
"bytes": 1405,
|
||||
"sha256": "c11446a694a6357c77e2cba405c5a078b29eef5cdd2342579d234b4e20270eb1"
|
||||
},
|
||||
"helpers/dc3ad2c3491acda3290099e4c3af0ef6d5c2362ca1df9c2ee3b8f113b2f5e723.py": {
|
||||
"bytes": 2192,
|
||||
"sha256": "dc3ad2c3491acda3290099e4c3af0ef6d5c2362ca1df9c2ee3b8f113b2f5e723"
|
||||
},
|
||||
"runs/run-1/fixture/baseline.json": {
|
||||
"bytes": 18490,
|
||||
"sha256": "07432f30fecbf0710ab3c01dbfa760df18e781ac81713ed86fa2ea232eff0d07"
|
||||
},
|
||||
"runs/run-1/fixture/manifest.json": {
|
||||
"bytes": 2897,
|
||||
"sha256": "2d4a067b45181b9b66b84598464b20045f13ce23890d3a7c5b195e2f7f9f7b64"
|
||||
},
|
||||
"runs/run-1/fixture/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/fixture/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/fixture/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/fixture/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/fixture/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/fixture/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/fixture/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/fixture/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/fixture/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 3781,
|
||||
"sha256": "feda42f7f4329b925b7f87289b384f075705616a09a310a99c96e4177f6fee85"
|
||||
},
|
||||
"runs/run-1/raw/01-start-0.jpg": {
|
||||
"bytes": 116250,
|
||||
"sha256": "dcaf44d81bf7d9bccabe1aab8e6d1143e29c3561b56bda56da5fbcfe5ce7094f"
|
||||
},
|
||||
"runs/run-1/raw/01-start.json": {
|
||||
"bytes": 919,
|
||||
"sha256": "5422b74fa139899ab9f355c787aed483bd7a8e40a8796aa291e3bf8a884947d3"
|
||||
},
|
||||
"runs/run-1/raw/02-open-dialog-0.jpg": {
|
||||
"bytes": 114527,
|
||||
"sha256": "a2622f57aa5e83353244216c177110d7627605cbef02cfde3ea4ceb5d543d72c"
|
||||
},
|
||||
"runs/run-1/raw/02-open-dialog.json": {
|
||||
"bytes": 925,
|
||||
"sha256": "300dfa12f3c5f170130bc4b2a6ef0eb1d75ecddc7497f3b325e174165d6e389d"
|
||||
},
|
||||
"runs/run-1/raw/03-project-open-0.jpg": {
|
||||
"bytes": 133077,
|
||||
"sha256": "d08a5d7a3c65b079de4d83af523d8398732e976fc4cd7c1672e5e1231ee8fd36"
|
||||
},
|
||||
"runs/run-1/raw/03-project-open.json": {
|
||||
"bytes": 934,
|
||||
"sha256": "1cf0f6b55cfc904c0e023e463d844aa3929c6728da6b826a8c1b3a87ccf371c9"
|
||||
},
|
||||
"runs/run-1/raw/04-baseline-saved-0.jpg": {
|
||||
"bytes": 131419,
|
||||
"sha256": "64e2fdea1f0372024bf377493416f75fce34f3ae6d6cdf1870b40c8ab7ae0e0b"
|
||||
},
|
||||
"runs/run-1/raw/04-baseline-saved.json": {
|
||||
"bytes": 938,
|
||||
"sha256": "2cd7ccc03073bda0c2468437dcd90cf00e06354cac8cafba0cfd73aae944d640"
|
||||
},
|
||||
"runs/run-1/raw/05-a-selected-0.jpg": {
|
||||
"bytes": 146454,
|
||||
"sha256": "a1b3da460a3e3aeaf611321bc2436dd0551463dce0b03a28ef60d509daec671c"
|
||||
},
|
||||
"runs/run-1/raw/05-a-selected.json": {
|
||||
"bytes": 934,
|
||||
"sha256": "74d3eda5e9b8512e8a842cc302183ac97b64cdcf46602519dfa2ac624542b3db"
|
||||
},
|
||||
"runs/run-1/raw/06-row-context-0.jpg": {
|
||||
"bytes": 148643,
|
||||
"sha256": "97c37986756b9a64d3995ea824b5d6c5124345bda0c309e1da09f7aaf1554491"
|
||||
},
|
||||
"runs/run-1/raw/06-row-context.json": {
|
||||
"bytes": 935,
|
||||
"sha256": "6edea69009268837c510666a7697700a081fd8685c12aef0b34485965225a4a7"
|
||||
},
|
||||
"runs/run-1/raw/07-row-added-0.jpg": {
|
||||
"bytes": 145885,
|
||||
"sha256": "ea7a830f2ed4b35b4173dc828de2184e65162c39c73b19cc1ea0c90c5cfa0ab4"
|
||||
},
|
||||
"runs/run-1/raw/07-row-added.json": {
|
||||
"bytes": 933,
|
||||
"sha256": "d087cebd389786ba05a6dc355410fa371f7e369b692d93a6805684091b7fb11e"
|
||||
},
|
||||
"runs/run-1/raw/08-mixed-drag-refused-0.jpg": {
|
||||
"bytes": 151098,
|
||||
"sha256": "3ad911c0f3a44d3078411570bb87ddecb7d5e27661b1d0421275210290668201"
|
||||
},
|
||||
"runs/run-1/raw/08-mixed-drag-refused.json": {
|
||||
"bytes": 942,
|
||||
"sha256": "eb4c94795c8ed43e492e9748ba2fb95d8f56020e91d9cd93ccafd777c8f61331"
|
||||
},
|
||||
"runs/run-1/raw/09-mixed-refusal-saved-0.jpg": {
|
||||
"bytes": 148444,
|
||||
"sha256": "d268d68462744bc54cdc2f333ce1d119178d17b6746dc5aede2cae226fe2f89a"
|
||||
},
|
||||
"runs/run-1/raw/09-mixed-refusal-saved.json": {
|
||||
"bytes": 943,
|
||||
"sha256": "1b971ab580bd8a27c74ae29f71a9c6a94022fb025b6c739923954a64efaa014b"
|
||||
},
|
||||
"runs/run-1/raw/10-stationary-collapse-0.jpg": {
|
||||
"bytes": 146515,
|
||||
"sha256": "430f5c79dd891d88c4a8e25f02d644d9e23e709bbdd9229c1668e486a65dffad"
|
||||
},
|
||||
"runs/run-1/raw/10-stationary-collapse.json": {
|
||||
"bytes": 943,
|
||||
"sha256": "037cc2690a0334b7f0032e4fdffe9e81793267ca47184d0b78fc10a2d13c1c7e"
|
||||
},
|
||||
"runs/run-1/raw/11-b-context-0.jpg": {
|
||||
"bytes": 155065,
|
||||
"sha256": "4321ffcff5b002ada96714d7e5d8c6ac55db76e1fdd539ab3f3a053ac9b43ac6"
|
||||
},
|
||||
"runs/run-1/raw/11-b-context.json": {
|
||||
"bytes": 933,
|
||||
"sha256": "f9cdd902dda8e296a733e2d8728b22f3908da6be97d7e0c3c297bb05ec7c529b"
|
||||
},
|
||||
"runs/run-1/raw/12-placement-group-0.jpg": {
|
||||
"bytes": 147223,
|
||||
"sha256": "ffdd50679ebf1f4ef581e943e4c8edd4e0170d721a38e1b2e4f9090c570d58a4"
|
||||
},
|
||||
"runs/run-1/raw/12-placement-group.json": {
|
||||
"bytes": 939,
|
||||
"sha256": "cf462a9354aa79af5e0975162d530bb4adf1e89f7d52492b62ae7da7034928b1"
|
||||
},
|
||||
"runs/run-1/raw/13-group-moved-0.jpg": {
|
||||
"bytes": 147935,
|
||||
"sha256": "fa65ffefd695b4b5aef67c22bf23148906182c769e0e512e98a1f7c32435035f"
|
||||
},
|
||||
"runs/run-1/raw/13-group-moved.json": {
|
||||
"bytes": 943,
|
||||
"sha256": "9261f3bb668dd6660c2a0355adb982a0f00f6961159d8706bdc1c982a0b7a816"
|
||||
},
|
||||
"runs/run-1/raw/14-move-saved-0.jpg": {
|
||||
"bytes": 146770,
|
||||
"sha256": "f055b46341c302063cb702dc6619f2509f5c4a80adc5eb6bcf48d77098c0026f"
|
||||
},
|
||||
"runs/run-1/raw/14-move-saved.json": {
|
||||
"bytes": 934,
|
||||
"sha256": "306876d9b6de633d623227a16a84f9fcc066b37008c436e670bfd3df9d816cc8"
|
||||
},
|
||||
"runs/run-1/raw/15-move-undo-0.jpg": {
|
||||
"bytes": 148428,
|
||||
"sha256": "268fdaaa4d4832cf3bdcbd69d6ac062ece52301b7cd0ae38cd1edd38fa157fe3"
|
||||
},
|
||||
"runs/run-1/raw/15-move-undo.json": {
|
||||
"bytes": 943,
|
||||
"sha256": "300a234ed16f53fce88f7f8eaf9d252af8e98122f5c1f8aa13f6dbad8d56012c"
|
||||
},
|
||||
"runs/run-1/raw/16-move-undo-saved-0.jpg": {
|
||||
"bytes": 148316,
|
||||
"sha256": "c4e986553c2938bffca8ee1f7e6ee7c4a3aa077e6ff6bd9da50d35e10684a9f3"
|
||||
},
|
||||
"runs/run-1/raw/16-move-undo-saved.json": {
|
||||
"bytes": 941,
|
||||
"sha256": "fef07b40f46a6138623de1f10d5e74c81f87f18a35059b132fe2af192e6d17dc"
|
||||
},
|
||||
"runs/run-1/raw/17-move-redo-0.jpg": {
|
||||
"bytes": 146795,
|
||||
"sha256": "37476c5a02d9ca0db214e244040b112dc50fd4d1418ec3af96f0a4f4776e4dde"
|
||||
},
|
||||
"runs/run-1/raw/17-move-redo.json": {
|
||||
"bytes": 943,
|
||||
"sha256": "751ccfe6dc9acecdc0e7225aedd17be44ea374f368cba5ab2191c8c659a55af2"
|
||||
},
|
||||
"runs/run-1/raw/18-move-redo-saved-0.jpg": {
|
||||
"bytes": 146823,
|
||||
"sha256": "c248b70901e52881bce338b6fe0f7fdcaf19df8fad349f24b2c64be54a187069"
|
||||
},
|
||||
"runs/run-1/raw/18-move-redo-saved.json": {
|
||||
"bytes": 939,
|
||||
"sha256": "cfb609930813f6b8cd051c7daf538f8feb04be374be28c65fbd498dd937d82d9"
|
||||
},
|
||||
"runs/run-1/raw/19-before-hide-undo-0.jpg": {
|
||||
"bytes": 148446,
|
||||
"sha256": "a2870258332cc555c9b8abfc3db070ff1582ea449ed6d1d7eedd19e977ea8021"
|
||||
},
|
||||
"runs/run-1/raw/19-before-hide-undo.json": {
|
||||
"bytes": 950,
|
||||
"sha256": "4336190711b265ab5bf508a48528fd0e4b448b48cca86d9907d4704a05087de7"
|
||||
},
|
||||
"runs/run-1/raw/20-before-hide-saved-0.jpg": {
|
||||
"bytes": 148362,
|
||||
"sha256": "6cf90eb40ba2d70dd66da6fd5eb4ef07a787a11a05841d5fd2abe04630b34e02"
|
||||
},
|
||||
"runs/run-1/raw/20-before-hide-saved.json": {
|
||||
"bytes": 943,
|
||||
"sha256": "1c74bc7db156e7aa9a79dea803b77d991a5ae242fbfc82884fcea2235714d6d7"
|
||||
},
|
||||
"runs/run-1/raw/21-group-menu-0.jpg": {
|
||||
"bytes": 153978,
|
||||
"sha256": "472f92a8a5aaa9ca983e5ad9262414e3abe82b0618996206fdd28199d543bcdd"
|
||||
},
|
||||
"runs/run-1/raw/21-group-menu.json": {
|
||||
"bytes": 934,
|
||||
"sha256": "cfbba47a72d05700bd6c159175250bb3dcb7a4277527df4c0873853fb87661df"
|
||||
},
|
||||
"runs/run-1/raw/22-group-hidden-0.jpg": {
|
||||
"bytes": 137291,
|
||||
"sha256": "30112dfcead6736041c506fbe6f9f4abd67808bcd59ec96fb684839ed9fef071"
|
||||
},
|
||||
"runs/run-1/raw/22-group-hidden.json": {
|
||||
"bytes": 944,
|
||||
"sha256": "0985c92ce81de4240451e074c361929a9ae90525d83feeba94c6a7022268683d"
|
||||
},
|
||||
"runs/run-1/raw/23-hidden-saved-0.jpg": {
|
||||
"bytes": 136419,
|
||||
"sha256": "59e0770669d39cacc14ac5f958739d06cf0b647b02f096ff97ab7f65c3448758"
|
||||
},
|
||||
"runs/run-1/raw/23-hidden-saved.json": {
|
||||
"bytes": 938,
|
||||
"sha256": "3f5e4122c005b0af25b54f91fa75640c1379afbcc2b5a26c36b89df91c354418"
|
||||
},
|
||||
"runs/run-1/raw/24-hidden-placement-picker-0.jpg": {
|
||||
"bytes": 137734,
|
||||
"sha256": "f4fd098b9d64194846bfc3912a11ee20a09abd042bb8a33e8bc5a52e0b393a5f"
|
||||
},
|
||||
"runs/run-1/raw/24-hidden-placement-picker.json": {
|
||||
"bytes": 947,
|
||||
"sha256": "f345669592b3efa382a9f688d0e97291c045c2734dba11ad0262ba1be3178273"
|
||||
},
|
||||
"runs/run-1/raw/25-picker-dismissed-0.jpg": {
|
||||
"bytes": 137694,
|
||||
"sha256": "e5af5ad56705204d79352869f362ab430d1c5cbafce5ae1dba5093a8311728a8"
|
||||
},
|
||||
"runs/run-1/raw/25-picker-dismissed.json": {
|
||||
"bytes": 940,
|
||||
"sha256": "317c8c7e5e1f9a0bb7ac1de51b8a75318ac29d67f81142d46214a013f53def18"
|
||||
},
|
||||
"runs/run-1/raw/26-picker-click-dismissed-0.jpg": {
|
||||
"bytes": 136300,
|
||||
"sha256": "c5e1c4f8ed3fbb68b67429220d3a5db6a846f6753c297d194fcdeaba0ef268a0"
|
||||
},
|
||||
"runs/run-1/raw/26-picker-click-dismissed.json": {
|
||||
"bytes": 946,
|
||||
"sha256": "938fe444bbff489676da4e36b8b9272f78739b520aca23264b7a2001c352f283"
|
||||
},
|
||||
"runs/run-1/raw/27-hide-undo-0.jpg": {
|
||||
"bytes": 145506,
|
||||
"sha256": "712d6b3863bef24458e31be2b86fcc2b4e1f08a340ed78dda0c27f2d20992275"
|
||||
},
|
||||
"runs/run-1/raw/27-hide-undo.json": {
|
||||
"bytes": 943,
|
||||
"sha256": "4b7c9088978c6bef6c60cfb9401f39b6c1460f92382a54db60c1e30bac97c4e6"
|
||||
},
|
||||
"runs/run-1/raw/28-hide-undo-saved-0.jpg": {
|
||||
"bytes": 145429,
|
||||
"sha256": "848082bd3d40431dbd559896cf203c7d4a58385518b3ca02559a4b66633b8ccb"
|
||||
},
|
||||
"runs/run-1/raw/28-hide-undo-saved.json": {
|
||||
"bytes": 939,
|
||||
"sha256": "8311eeb6bce344a989ffd7441ccfe75fd248d57a3e7013c8d7fd770850485d72"
|
||||
},
|
||||
"runs/run-1/raw/29-hide-redo-0.jpg": {
|
||||
"bytes": 136428,
|
||||
"sha256": "280ccb922882c3419c84d7cae928d62c0cc1cd7a8b0b6a5a1245be0046895ae0"
|
||||
},
|
||||
"runs/run-1/raw/29-hide-redo.json": {
|
||||
"bytes": 943,
|
||||
"sha256": "e238877bc772c25f2f05a2a4e75d2d78c349c2d1c27ab7fe49f05cc73599f435"
|
||||
},
|
||||
"runs/run-1/raw/30-hide-redo-saved-0.jpg": {
|
||||
"bytes": 136444,
|
||||
"sha256": "5a81ae63d47528fdab27b987f1b9d996cc188f96b26c4d6b3009b4f637562ae4"
|
||||
},
|
||||
"runs/run-1/raw/30-hide-redo-saved.json": {
|
||||
"bytes": 941,
|
||||
"sha256": "932f541a8e9364a50c714401a915717d69035cd9e15c415454d169749c0bc16f"
|
||||
},
|
||||
"runs/run-1/raw/31-reopen-request-0.jpg": {
|
||||
"bytes": 107440,
|
||||
"sha256": "88b53c5f37b0107a1842c3b79b6258b255ef6bf41f6fd5df76fd8cc1d4cdd48f"
|
||||
},
|
||||
"runs/run-1/raw/31-reopen-request.json": {
|
||||
"bytes": 938,
|
||||
"sha256": "c65e7668bad5c08953e6bf03ada8f304d9b5512751b8cb19657d84cf7d6f869c"
|
||||
},
|
||||
"runs/run-1/raw/32-reopened-hidden-0.jpg": {
|
||||
"bytes": 104737,
|
||||
"sha256": "ef52c777acfc3acf9914e3703601d96e9fcc20095870852d02b696a50317c8ad"
|
||||
},
|
||||
"runs/run-1/raw/32-reopened-hidden-1.jpg": {
|
||||
"bytes": 4207,
|
||||
"sha256": "147948d69961c42f1feea9449df477b8436250388a1ae070e744ed4709a49bf3"
|
||||
},
|
||||
"runs/run-1/raw/32-reopened-hidden-2.jpg": {
|
||||
"bytes": 4000,
|
||||
"sha256": "9110bb88fff054f17fa7f2574a409f27755a72ffe6c14b42097db201a80d2b3f"
|
||||
},
|
||||
"runs/run-1/raw/32-reopened-hidden.json": {
|
||||
"bytes": 983,
|
||||
"sha256": "e265715f1893419799423d265cb1d07d0554fa03fe25346cf5377669448aceea"
|
||||
},
|
||||
"runs/run-1/raw/33-reopen-settled-0.jpg": {
|
||||
"bytes": 104737,
|
||||
"sha256": "ef52c777acfc3acf9914e3703601d96e9fcc20095870852d02b696a50317c8ad"
|
||||
},
|
||||
"runs/run-1/raw/33-reopen-settled-1.jpg": {
|
||||
"bytes": 4207,
|
||||
"sha256": "147948d69961c42f1feea9449df477b8436250388a1ae070e744ed4709a49bf3"
|
||||
},
|
||||
"runs/run-1/raw/33-reopen-settled-2.jpg": {
|
||||
"bytes": 4000,
|
||||
"sha256": "9110bb88fff054f17fa7f2574a409f27755a72ffe6c14b42097db201a80d2b3f"
|
||||
},
|
||||
"runs/run-1/raw/33-reopen-settled.json": {
|
||||
"bytes": 660,
|
||||
"sha256": "9c254237908dbfa081000f6c44adc013120975388dc8902414caeb1028d1e23b"
|
||||
},
|
||||
"runs/run-1/raw/34-reopened-source-0.jpg": {
|
||||
"bytes": 123459,
|
||||
"sha256": "dc824c52b07a8505c82420c581e87cfc6e0759428bceaf8cf84d7fcc981cfefc"
|
||||
},
|
||||
"runs/run-1/raw/34-reopened-source.json": {
|
||||
"bytes": 939,
|
||||
"sha256": "b0fb2a67daa2eb4beef93ba181d5c6a73a734695a218f57725962d428ffe6bc2"
|
||||
},
|
||||
"runs/run-1/raw/35-reopened-saved-0.jpg": {
|
||||
"bytes": 121731,
|
||||
"sha256": "0019c2970ab87c54760fd1ba922aa4471a598888635e835a3a56cc2ce966ba08"
|
||||
},
|
||||
"runs/run-1/raw/35-reopened-saved.json": {
|
||||
"bytes": 938,
|
||||
"sha256": "e8382c2a32bae5febc5f90c0b09fe9353990c7d8b131d038bb0fc556c84b7ca3"
|
||||
},
|
||||
"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/finished.json": {
|
||||
"bytes": 393,
|
||||
"sha256": "c5d9ee9618bab59c55cafa20ba8568b53efe3246d8d7eb2432fd3e2a95a0da03"
|
||||
},
|
||||
"runs/run-1/raw/generation.json": {
|
||||
"bytes": 1263,
|
||||
"sha256": "e112c1aea1fe70f03a239597a494170b9f292bf57f1decf870c768d76a9eeb30"
|
||||
},
|
||||
"runs/run-1/raw/generation.stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/generation.stdout.log": {
|
||||
"bytes": 106,
|
||||
"sha256": "461a61cfb7c5b139a790db5fba4c9fb98dd4951308c63365ef339a388d7e7b2c"
|
||||
},
|
||||
"runs/run-1/raw/history-bytes.json": {
|
||||
"bytes": 786,
|
||||
"sha256": "a8948f0172aa550a5fb63a66396f771e1ba36f437fe76f5775bb35829f70219c"
|
||||
},
|
||||
"runs/run-1/raw/processes.json": {
|
||||
"bytes": 201,
|
||||
"sha256": "4626c05bb8eb58e8d3acd1dc4157299d2c6c5eb0e0200e259a117a2517414cc0"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/result.json": {
|
||||
"bytes": 2767,
|
||||
"sha256": "779cfef18da513f0aa699975be2487435182bf063ad6c1635d92f557e23eeee4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 3781,
|
||||
"sha256": "feda42f7f4329b925b7f87289b384f075705616a09a310a99c96e4177f6fee85"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/started.json": {
|
||||
"bytes": 2365,
|
||||
"sha256": "2f5c987ed6c8114d99751d6dd2cfa38c1b26496aa91043c06da3c0ae0d35ae82"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/stdout.log": {
|
||||
"bytes": 453,
|
||||
"sha256": "7e3c8332c974e194a96381c3e3b7118fd9f7436405688c068b00186d46449a1b"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/result.json": {
|
||||
"bytes": 2770,
|
||||
"sha256": "a43fc74c00e4a47550aee83d7d5d67ab899d5e148e7bbc91ad3a0083b8eec0d7"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 3781,
|
||||
"sha256": "feda42f7f4329b925b7f87289b384f075705616a09a310a99c96e4177f6fee85"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/started.json": {
|
||||
"bytes": 2368,
|
||||
"sha256": "64a60222db7778d75e913869de0d727623caf91aff1f356c5056b9fb98355bf0"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/stdout.log": {
|
||||
"bytes": 456,
|
||||
"sha256": "357e77e5bea40d18e1927e4d1195dbd9dffac5374f286125535495a635e00dea"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/result.json": {
|
||||
"bytes": 2760,
|
||||
"sha256": "f428ba297e8a029722ac742e311f4517409e8e38467574bc81c9525ff275dcf0"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 3531,
|
||||
"sha256": "e0e79284e24387d257f7d72937ff849da16730f9d06a2ce1c2f43c73b1c29548"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/started.json": {
|
||||
"bytes": 2358,
|
||||
"sha256": "a8031748a9c2374d36f90dcfdc639eec6e4407f7f89a43357252500ac6a5aafa"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/stdout.log": {
|
||||
"bytes": 446,
|
||||
"sha256": "e04ab66dd7715906946086d4507987858a4d960327ceb9f4987c6e3629dadc00"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/result.json": {
|
||||
"bytes": 2763,
|
||||
"sha256": "4b8a0060987ea8fff904b244d5e28792382a223bc7473cf13e0679eae6f7c528"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 3531,
|
||||
"sha256": "e0e79284e24387d257f7d72937ff849da16730f9d06a2ce1c2f43c73b1c29548"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/started.json": {
|
||||
"bytes": 2361,
|
||||
"sha256": "a25b92331de234fc267412e5450e0c566f74b811304a6e43a7fd410527181c0a"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/stdout.log": {
|
||||
"bytes": 449,
|
||||
"sha256": "a2f840d03f9813fb0c2f52db73ece05a62e7176da9ec29687e9e8cfe98ea28d1"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/result.json": {
|
||||
"bytes": 2768,
|
||||
"sha256": "d7d71c33427319b1711b2136d1db4aef5718ce1a2790b04eed9c641e9011b1c3"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 3781,
|
||||
"sha256": "feda42f7f4329b925b7f87289b384f075705616a09a310a99c96e4177f6fee85"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/started.json": {
|
||||
"bytes": 2366,
|
||||
"sha256": "8be41b35f8fbd9eecda396d30779b9050f91bcf99e2d8b642456f1020e95de8c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/stdout.log": {
|
||||
"bytes": 454,
|
||||
"sha256": "6613b0a845fa99299f8654c0060d169cefaf16c50962a877e70ac6de61bd4e10"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/result.json": {
|
||||
"bytes": 2764,
|
||||
"sha256": "c90801f95afa47a513ed387b97a22a813c87c97f1dcfbe98dd19d7b842ddb9b3"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 4133,
|
||||
"sha256": "d68617ffcf8a5421f432a225f171df0debf84d4b7d925ed4bd3c6e772bf2f138"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/started.json": {
|
||||
"bytes": 2362,
|
||||
"sha256": "563ac107a3d36ef76841a50b46d55706f3735b0d90fcba996b9d8c8330bdb239"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/stdout.log": {
|
||||
"bytes": 506,
|
||||
"sha256": "12d6629adf26066d1bd57c79081e236fd0c2aa6b2f91fd8b31166ac3c498012b"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/result.json": {
|
||||
"bytes": 2768,
|
||||
"sha256": "629bfb2ccda6bbf45b4601bb80fb5cd0d4de3ae7b393c75270af1f9254b2c6b0"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 3781,
|
||||
"sha256": "feda42f7f4329b925b7f87289b384f075705616a09a310a99c96e4177f6fee85"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/started.json": {
|
||||
"bytes": 2366,
|
||||
"sha256": "4c0951301a0925ecd6910b4267d718212dc985f5d517d702b84a3408549a641e"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/stdout.log": {
|
||||
"bytes": 454,
|
||||
"sha256": "3eaa06dfb71a848b41ff52ba07b70b0c67d4ea6585a90410e6a5944d46b766ff"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/result.json": {
|
||||
"bytes": 2759,
|
||||
"sha256": "b6475c4f754aed0a551c0e6a474e8d1d62d479b40d997c9ce23bd95b3a4ff018"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 4133,
|
||||
"sha256": "d68617ffcf8a5421f432a225f171df0debf84d4b7d925ed4bd3c6e772bf2f138"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/started.json": {
|
||||
"bytes": 2357,
|
||||
"sha256": "7f51cd0a4dc037b47ed110546898f0cf3d7495332416607db9c2a739928e3a69"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/stdout.log": {
|
||||
"bytes": 501,
|
||||
"sha256": "ec0470cbcaf044dcbd76018b77ce00d6479f9e07d0165a09264465bb50c6996e"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/result.json": {
|
||||
"bytes": 2769,
|
||||
"sha256": "51b2a225dc10fa0d2c5481568ef272fb87bf0bef87a583d363badcf185651590"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 3531,
|
||||
"sha256": "e0e79284e24387d257f7d72937ff849da16730f9d06a2ce1c2f43c73b1c29548"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/started.json": {
|
||||
"bytes": 2367,
|
||||
"sha256": "93733f75546fa2fafcef90bb9b968e0ba96b5c521ed1035ef260e0df10a70efa"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/stdout.log": {
|
||||
"bytes": 455,
|
||||
"sha256": "1e3fed0f40c77e81b7aa443787f12c132519efaff128cf6cb3e0222575d932fd"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/result.json": {
|
||||
"bytes": 2778,
|
||||
"sha256": "e174aa5452873191caf62f18e01d3db9e13cc3cd4720cee1ea193ee6c67f52e1"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 3781,
|
||||
"sha256": "feda42f7f4329b925b7f87289b384f075705616a09a310a99c96e4177f6fee85"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/started.json": {
|
||||
"bytes": 2376,
|
||||
"sha256": "1c0c2799b5d579e5ae07da8dbb589985cca9cfb6f8b880ab5bf0c4b0da306814"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/stdout.log": {
|
||||
"bytes": 464,
|
||||
"sha256": "26b9c11ecda895b50cdcdcac984d9792e6149df95db7a5def42207bb73c367ce"
|
||||
},
|
||||
"runs/run-1/raw/started.json": {
|
||||
"bytes": 4006,
|
||||
"sha256": "ae508e19b35b2a399c19099882cf01b8c511fcf6dfa3cebd8578477136d3831d"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,131 @@
|
||||
"""Package explicit completed native runs; helpers are pinned data, never executed."""
|
||||
from pathlib import Path
|
||||
import argparse
|
||||
import json
|
||||
import re
|
||||
import zipfile
|
||||
from verify import pin, parsed, need, norm, relative, safe, verify_data, verify_package
|
||||
|
||||
HERE = Path(__file__).resolve().parent
|
||||
|
||||
|
||||
def collect(root, runs, extra_unchanged=()):
|
||||
native = root / ".local/state-multiselect-native"
|
||||
candidates = [path for path in native.iterdir() if path.is_file() and path.suffix in (".py", ".js")]
|
||||
candidates.extend(sorted((root / ".local/state-group-gates").glob("*.py")))
|
||||
helpers = [(path.suffix, path.read_bytes()) for path 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
|
||||
def tree(folder, prefix):
|
||||
need(folder.is_dir(), "missing directory: " + str(folder))
|
||||
for path in sorted(folder.rglob("*")):
|
||||
need(not path.is_symlink(), "symlink evidence input")
|
||||
if path.is_file():
|
||||
add(prefix + path.relative_to(folder).as_posix(), path.read_bytes())
|
||||
for run in runs:
|
||||
folder = native / run
|
||||
start = parsed((folder / "started.json").read_bytes())
|
||||
end = parsed((folder / "finished.json").read_bytes())
|
||||
need(end["exitCode"] == 0 and all(end[k] is True for k in
|
||||
("guiUnchanged", "checkerUnchanged", "fixtureUnchanged")), "unfinished/changed native run: " + run)
|
||||
generation = parsed((folder / "generation.json").read_bytes())
|
||||
history = parsed((folder / "history-bytes.json").read_bytes())
|
||||
tree(folder, "runs/" + run + "/raw/")
|
||||
fixture_relative = relative(generation["command"][2], start["cwd"])
|
||||
need(fixture_relative.startswith(".local/state-multiselect-native/"), "fixture outside native root")
|
||||
tree(root / fixture_relative, "runs/" + run + "/fixture/")
|
||||
spec = {"originalRun": norm(start["cwd"]) + "/.local/state-multiselect-native/" + run,
|
||||
"originalFixture": norm(generation["command"][2]), "helpers": {}, "builds": {},
|
||||
"extraUnchangedSnapshots": list(extra_unchanged)}
|
||||
for key, expected in [("helper", start["helper"]), ("capture", start["capture"]),
|
||||
("snapshotHelper", start["snapshotHelper"]), ("history", history["helper"])]:
|
||||
matches = [(suffix, data) for suffix, data in helpers if pin(data) == expected]
|
||||
need(bool(matches), "exact historical helper unavailable: " + key)
|
||||
suffix, data = matches[0]
|
||||
member = "helpers/" + expected["sha256"] + suffix
|
||||
add(member, data)
|
||||
spec["helpers"][key] = member
|
||||
for kind in ("gui", "checker"):
|
||||
recorded = start[kind]
|
||||
rel = relative(recorded["receipt"], start["cwd"])
|
||||
need(rel.startswith(".local/state-group-gates/") and rel.endswith("/result.json"), "unexpected build receipt location")
|
||||
receipt = root / rel
|
||||
data = receipt.read_bytes()
|
||||
need(pin(data) == recorded["receiptPin"], "historical build receipt changed")
|
||||
prefix = "builds/" + pin(data)["sha256"] + "/"
|
||||
add(prefix + "result.json", data)
|
||||
inputs_data = (receipt.parent / "inputs.json").read_bytes()
|
||||
need(pin(inputs_data) == recorded["inputs"], "historical build input map changed")
|
||||
add(prefix + "inputs.json", inputs_data)
|
||||
spec["builds"][kind] = {"receipt": prefix + "result.json", "inputs": prefix + "inputs.json", "originalRelative": rel}
|
||||
build_helper = parsed(data)["helper"]
|
||||
matching_helpers = [(suffix, value) for suffix, value in helpers if pin(value) == build_helper]
|
||||
need(bool(matching_helpers), "exact historical build helper unavailable")
|
||||
suffix, helper_data = matching_helpers[0]
|
||||
helper_member = "helpers/" + build_helper["sha256"] + suffix
|
||||
add(helper_member, helper_data)
|
||||
spec["builds"][kind]["helper"] = helper_member
|
||||
if kind == "checker":
|
||||
# Read only the pinned historical example, not today's checkout.
|
||||
archive_path = receipt.parent / "inputs.zip"
|
||||
need(pin(archive_path.read_bytes()) == parsed(data)["archive"], "checker input archive pin")
|
||||
source_path = "crates/oa-core/examples/state_multiselect_native.rs"
|
||||
with zipfile.ZipFile(archive_path) as archive:
|
||||
source = archive.read(source_path)
|
||||
need(pin(source) == parsed(inputs_data)[source_path], "historical checker source pin")
|
||||
member = "checker-source/" + pin(source)["sha256"] + ".rs"
|
||||
add(member, source)
|
||||
spec["checkerSource"] = {"inputPath": source_path, "member": member}
|
||||
specs[run] = spec
|
||||
manifest = {"schema": 1, "kind": "multiselect-native", "runs": specs,
|
||||
"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 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, default=HERE)
|
||||
parser.add_argument("--check-only", action="store_true")
|
||||
parser.add_argument("--extra-unchanged", nargs="*", default=[], help="explicit additional unchanged snapshot labels, same for all runs")
|
||||
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")
|
||||
payload, manifest, summary = collect(args.root.resolve(), args.runs, args.extra_unchanged)
|
||||
if args.check_only:
|
||||
print("PASS raw consistency; no archive written:", summary)
|
||||
return
|
||||
out = args.output.resolve()
|
||||
out.mkdir(parents=True, exist_ok=True)
|
||||
for name in ("evidence.zip", "manifest.json", "files.json"):
|
||||
need(not (out / name).exists(), "existing output refused: " + name)
|
||||
for name in ("prepare.py", "verify.py", "README.md"):
|
||||
data = (HERE / name).read_bytes()
|
||||
if (out / name).exists():
|
||||
need((out / name).read_bytes() == data, "different existing package tool")
|
||||
else:
|
||||
with (out / name).open("xb") as stream:
|
||||
stream.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 evidence")
|
||||
print("PASS package readback:", out, summary)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,240 @@
|
||||
"""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 math
|
||||
import stat
|
||||
import zipfile
|
||||
|
||||
BASE = {"started.json", "finished.json", "generation.json", "generation.stdout.log",
|
||||
"generation.stderr.log", "app.stdout.log", "app.stderr.log", "processes.json", "history-bytes.json"}
|
||||
GROUPS = [["baseline", "move-undo", "before-hide", "hide-undo"], ["move", "move-redo"],
|
||||
["hidden", "hide-redo", "reopened-hidden"]]
|
||||
MODES = {name: mode for group, mode in zip(GROUPS, ["unchanged", "moved", "hide"]) for name in group}
|
||||
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"] == "multiselect-native", "manifest kind")
|
||||
members, runs = manifest["members"], manifest["runs"]
|
||||
need(bool(runs) and all(safe(run) and "/" not in 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 = 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, "exact pinned tree: " + prefix)
|
||||
return actual
|
||||
for run, spec in runs.items():
|
||||
prefix = "runs/" + run + "/raw/"
|
||||
start, end = obj(prefix + "started.json"), obj(prefix + "finished.json")
|
||||
generation, process = obj(prefix + "generation.json"), obj(prefix + "processes.json")
|
||||
history = obj(prefix + "history-bytes.json")
|
||||
need(end["exitCode"] == 0 and all(end[key] is True for key in
|
||||
("guiUnchanged", "checkerUnchanged", "fixtureUnchanged")), run + ": clean unchanged closure")
|
||||
need(ordered(generation["start"], generation["finish"], process["CreationDate"], start["start"], end["finish"], history["verified"]), run + ": process/generation times")
|
||||
need(process["ProcessId"] == start["pid"] and type(start["pid"]) is int and start["pid"] > 0, run + ": process identity")
|
||||
need(norm(process["ExecutablePath"]) == norm(start["gui"]["binary"])
|
||||
and start["command"] == [start["gui"]["binary"]], run + ": GUI command")
|
||||
need(spec["originalRun"] == norm(start["cwd"]) + "/.local/state-multiselect-native/" + run, run + ": original run mapping")
|
||||
need(generation["exitCode"] == 0 and generation["checker"] == start["checker"], run + ": generation checker")
|
||||
need(generation["command"][:2] == [start["checker"]["binary"], "generate"]
|
||||
and len(generation["command"]) == 3 and norm(generation["command"][2]) == spec["originalFixture"], run + ": generation command")
|
||||
for stream in ("stdout", "stderr"):
|
||||
need(end[stream] == pin(raw(prefix + "app." + stream + ".log")), run + ": app stream")
|
||||
need(generation[stream] == pin(raw(prefix + "generation." + stream + ".log")), run + ": generation stream")
|
||||
fixture = pinned_tree("runs/" + run + "/fixture/", start["fixture"])
|
||||
need(set(fixture) == {"baseline.json", "manifest.json"} | {"source/" + name for name in
|
||||
obj(prefix + "snapshots/baseline/result.json")["source"]}, run + ": fixture membership")
|
||||
fixture_manifest = parsed(fixture["manifest.json"])
|
||||
need(fixture_manifest["fixture"] == "state-multiselect-native-20260923"
|
||||
and fixture_manifest["source_entry"] == "project.arcadia", run + ": fixture identity")
|
||||
need(parsed(fixture["baseline.json"])["id"] == fixture_manifest["ids"]["project"], run + ": baseline identity")
|
||||
for key, expected in [("helper", start["helper"]), ("capture", start["capture"]),
|
||||
("snapshotHelper", start["snapshotHelper"]), ("history", history["helper"])]:
|
||||
need(pin(raw(spec["helpers"][key])) == expected, run + ": helper " + key)
|
||||
builds = {}
|
||||
for kind, target in [("gui", "arcadia-studio"), ("checker", "state_multiselect_native")]:
|
||||
recorded = start[kind]
|
||||
build = obj(spec["builds"][kind]["receipt"])
|
||||
need(pin(raw(spec["builds"][kind]["receipt"])) == recorded["receiptPin"], run + ": build receipt pin")
|
||||
need(relative(recorded["receipt"], start["cwd"]) == spec["builds"][kind]["originalRelative"], run + ": build path mapping")
|
||||
need(build["exitCode"] == 0 and build["inputsUnchanged"] is True
|
||||
and ordered(build["start"], build["finish"], generation["start"]), run + ": accepted preceding build")
|
||||
need(build["inputs"] == recorded["inputs"] == pin(raw(spec["builds"][kind]["inputs"])), run + ": build input map")
|
||||
need(pin(raw(spec["builds"][kind]["helper"])) == build["helper"], run + ": build helper pin")
|
||||
inputs = obj(spec["builds"][kind]["inputs"])
|
||||
need(len(inputs) == build["inputCount"] and sum(name.startswith("crates/vendor/iced_widget/") for name in inputs) == 71, run + ": build input count")
|
||||
artifacts = [item for item in build["artifacts"] if item["cargo"]["target"]["name"] == target]
|
||||
need(len(artifacts) == 1 and artifacts[0]["readback"] == recorded["pin"]
|
||||
and artifacts[0]["cargo"]["executable"] == recorded["binary"], run + ": executable relationship")
|
||||
builds[kind] = inputs
|
||||
need(start["gui"]["inputs"] == start["checker"]["inputs"], run + ": matching GUI/checker inputs")
|
||||
source = spec["checkerSource"]
|
||||
need(source["inputPath"] == "crates/oa-core/examples/state_multiselect_native.rs"
|
||||
and pin(raw(source["member"])) == builds["checker"][source["inputPath"]], run + ": archived exact checker source")
|
||||
|
||||
top = {name[len(prefix):] for name in members if name.startswith(prefix) and "/" not in name[len(prefix):]}
|
||||
captures = sorted(name for name in top - BASE if name.endswith(".json"))
|
||||
need(bool(captures), run + ": missing captures")
|
||||
expected_top = set(BASE) | set(captures)
|
||||
captured_window = None
|
||||
for name in captures:
|
||||
capture = obj(prefix + name)
|
||||
need(ordered(start["start"], capture["time"], end["finish"]), run + ": capture lifetime")
|
||||
window = capture["window"]
|
||||
app = window["app"]
|
||||
need(isinstance(app, str) and app.startswith("process:")
|
||||
and norm(app[len("process:"):]) == norm(start["gui"]["binary"]), run + ": captured executable relationship")
|
||||
need(type(window["id"]) is int and window["id"] > 0, run + ": captured window identity")
|
||||
if captured_window is None:
|
||||
captured_window = window["id"]
|
||||
need(window["id"] == captured_window, run + ": inconsistent captured window identity")
|
||||
need(isinstance(capture["images"], list), run + ": capture images")
|
||||
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")), run + ": capture image mapping")
|
||||
need(type(image["width"]) is int and image["width"] > 0
|
||||
and type(image["height"]) is int and image["height"] > 0, run + ": image dimensions")
|
||||
need(filename not in expected_top, run + ": duplicate image reference")
|
||||
expected_top.add(filename)
|
||||
raw(prefix + filename)
|
||||
need(top == expected_top, run + ": extra/missing top-level run files")
|
||||
|
||||
snapshots = {name[len(prefix + "snapshots/"):].split("/")[0] for name in members if name.startswith(prefix + "snapshots/")}
|
||||
extras = spec["extraUnchangedSnapshots"]
|
||||
need(isinstance(extras, list) and len(extras) == len(set(extras))
|
||||
and all(safe(label) and "/" not in label and label not in MODES for label in extras), run + ": explicit extra unchanged labels")
|
||||
modes = dict(MODES, **{label: "unchanged" for label in extras})
|
||||
need(snapshots == set(modes), run + ": exact nine history plus declared unchanged snapshot labels")
|
||||
states = {}
|
||||
for label, mode in modes.items():
|
||||
folder = prefix + "snapshots/" + label + "/"
|
||||
began, result = obj(folder + "started.json"), obj(folder + "result.json")
|
||||
need(all(result.get(key) == value for key, value in began.items()), label + ": start/result")
|
||||
need(result["exitCode"] == 0 and all(result[key] is True for key in
|
||||
("binaryUnchanged", "workingSourceUnchanged", "baselineUnchanged")), label + ": unchanged successful checker")
|
||||
need(ordered(start["start"], result["start"], result["finish"], end["finish"]), label + ": checker lifetime")
|
||||
need(result["buildReceipt"] == start["checker"]["receiptPin"] and result["binary"] == start["checker"]["pin"]
|
||||
and result["helper"] == start["snapshotHelper"], label + ": checker provenance")
|
||||
need(result["baseline"] == pin(fixture["baseline.json"]), label + ": baseline pin")
|
||||
command = result["command"]
|
||||
need(len(command) == 5 and command[:3] == [start["checker"]["binary"], "check", mode]
|
||||
and norm(command[3]) == spec["originalFixture"] + "/baseline.json"
|
||||
and norm(command[4]) == spec["originalRun"] + "/snapshots/" + label + "/source/project.arcadia", label + ": exact checker command")
|
||||
for stream in ("stdout", "stderr"):
|
||||
need(result[stream] == pin(raw(folder + stream + ".log")), label + ": stream pin")
|
||||
need(not raw(folder + "stderr.log"), label + ": checker stderr")
|
||||
report = obj(folder + "stdout.log")
|
||||
need(report["result"] == "PASS" and report["comparison"] == "complete Project equality"
|
||||
and report["mode"] == mode and report["baseline"] == command[3] and report["saved"] == command[4], label + ": positive checker report")
|
||||
delta = report["inferred_common_delta"]
|
||||
if mode == "moved":
|
||||
need(isinstance(delta, dict) and set(delta) == {"x", "y"}
|
||||
and all(type(v) in (int, float) and math.isfinite(v) and abs(v) <= 300 for v in delta.values())
|
||||
and math.hypot(delta["x"], delta["y"]) >= 0.01, label + ": inferred State movement bounds")
|
||||
else:
|
||||
need(delta is None, label + ": unexpected inferred delta")
|
||||
states[label] = pinned_tree(folder + "source/", result["source"])
|
||||
need(len(states[label]) == history["sourceFilesPerSnapshot"] == len(fixture) - 2, label + ": source count")
|
||||
expected = {folder + name for name in ("started.json", "result.json", "stdout.log", "stderr.log")}
|
||||
expected.update(folder + "source/" + name for name in states[label])
|
||||
need({name for name in members if name.startswith(folder)} == expected, label + ": extra snapshot files")
|
||||
need(all(states[label] == states["baseline"] for label in extras), run + ": extra snapshots equal baseline bytes")
|
||||
need(history["status"] == "PASS" and history["equalByteGroups"] == GROUPS, run + ": history groups")
|
||||
for group in GROUPS:
|
||||
need(all(states[label] == states[group[0]] for label in group), run + ": actual history bytes " + str(group))
|
||||
need(all(states[a[0]] != states[b[0]] for i, a in enumerate(GROUPS) for b in GROUPS[i + 1:]), run + ": distinct history states")
|
||||
need(states["baseline"] == {name[7:]: data for name, data in fixture.items() if name.startswith("source/")}, run + ": baseline source exact")
|
||||
changed = {label: sorted(name for name in set(states["baseline"]) | set(states[label])
|
||||
if states["baseline"].get(name) != states[label].get(name)) for label in ("move", "hidden")}
|
||||
need(changed == history["changedFilesFromBaseline"]
|
||||
== {label: ["views/diagram_state_view.arcadia"] for label in ("move", "hidden")}, run + ": changed source files")
|
||||
print(run, "closed exit 0;", len(captures), "captures;", len(modes), "positive snapshots; exact three-group source history")
|
||||
need(used == set(members), "unreferenced/extra package members")
|
||||
return {"runs": len(runs), "members": len(members)}
|
||||
|
||||
|
||||
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)
|
||||
|
||||
|
||||
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 native evidence byte/receipt consistency:", verify_package(args.package))
|
||||
print("No GUI/checker execution; actions and native acceptance require the separate parent review.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1 @@
|
||||
* -text
|
||||
@@ -0,0 +1,58 @@
|
||||
# State multiselect source identity evidence
|
||||
|
||||
The source receipts bind two historical captured input maps to exact Git trees:
|
||||
|
||||
| Gate | Commit | Inputs | Input-map SHA-256 |
|
||||
| --- | --- | ---: | --- |
|
||||
| desktop-2 | 2a3b9ba822a49ead233c4b5f98412a07c1c1da12 | 733 | 9cf85879dfb0bb5ec3b15c66b23df316e6bfe8451b6cf0c895bf7b9b5fbdde4a |
|
||||
| lint-2 | 3480b54201a5f361cca0bcd0d45dd6546a7a7bc9 | 735 | 4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf |
|
||||
|
||||
The original receipts are preserved without rewriting. The verifier fixes their
|
||||
exact byte pins, commit IDs, map pins/counts and explicitCompileTimeFixtures.
|
||||
The historical 733-input scope excludes two compile-time fixtures; the final
|
||||
735-input scope explicitly includes both:
|
||||
|
||||
- harness/experiments/edge-attachments-20260922/native-fixture.arcadia
|
||||
- harness/experiments/textual-authoring-20260911/alarm-response.arcadia
|
||||
|
||||
Matching an old Git tree does not correct those historical scope omissions or
|
||||
establish the final source's behavior. A gate applies to its captured input map.
|
||||
Later native build maps must independently match the final 735-input map before
|
||||
using this source identity evidence for those builds.
|
||||
|
||||
From this tool directory, prepare against completed raw captures without writing:
|
||||
|
||||
```
|
||||
python -B prepare.py --raw-gates CHECKOUT/.local/state-group-gates --repo CHECKOUT --check-only
|
||||
```
|
||||
|
||||
After the strict sibling checks package is complete, add --checks CHECKS_PACKAGE,
|
||||
omit --check-only, and provide --output NEW_SOURCE_PACKAGE. Existing output is
|
||||
refused. Preparation preserves the source receipts, tools and README, writes
|
||||
files.json pins, and performs readback. No ZIP is created by the source preparer.
|
||||
|
||||
A completed portable package can be verified without the original checkout:
|
||||
|
||||
```
|
||||
python -B SOURCE_PACKAGE/verify.py
|
||||
```
|
||||
|
||||
By default it reads the sibling ../checks package; override with --checks PATH.
|
||||
It verifies checks outer/member pins, capsule relationships and both selected
|
||||
nested source ZIPs against their exact maps. It checks source receipt identity,
|
||||
accepted unchanged gate flags, scope/counts and all source package pins. Run the
|
||||
sibling checks verifier separately for full process/helper/stream relationships.
|
||||
|
||||
Add --repo CHECKOUT to independently repeat the complete filtered Git inventory
|
||||
and exact blob-byte comparison against both pinned commits already present there.
|
||||
Without --repo, verification checks historical receipt/capsule consistency and
|
||||
explicitly reports that Git comparison was not rerun. No archived helpers or
|
||||
source executables are run; no build, checkout, extraction or network is needed.
|
||||
|
||||
verify-committed-inputs.py remains the generic comparator used to create source
|
||||
receipts. Its --include-fixtures option includes both explicit fixtures; omission
|
||||
keeps the historical scope. It accepts explicit gate/full commit IDs, defaults to
|
||||
read-only comparison, and writes only an optional new --output receipt.
|
||||
|
||||
Receipts and pins establish internal byte consistency, not external authentication,
|
||||
hermetic toolchains, test execution, native usability or complete issue acceptance.
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
".gitattributes": {
|
||||
"bytes": 9,
|
||||
"sha256": "8b9c3028d6467ff3be7c793141927841d70f47f52d0590677438f488ca154992"
|
||||
},
|
||||
"README.md": {
|
||||
"bytes": 3092,
|
||||
"sha256": "b122e41bb9c52b4384e09cd62ee4115a68ff16d5aefee2f92fe632b07276d017"
|
||||
},
|
||||
"prepare.py": {
|
||||
"bytes": 2100,
|
||||
"sha256": "1be2f2a402b493a1c9700044f1119ed8ccddaa02baec2ecd25a185aba6253112"
|
||||
},
|
||||
"source-desktop-2.json": {
|
||||
"bytes": 428,
|
||||
"sha256": "6012bdc52a3843c9cfd5f3c80ec4270a7c0f1e13ef4738b0e3f4ed048ff8d885"
|
||||
},
|
||||
"source-lint-2.json": {
|
||||
"bytes": 583,
|
||||
"sha256": "e0a6deab68683278965643f6f34a1038fcea25c1f242b6f75f5559b7697ec7d6"
|
||||
},
|
||||
"verify-committed-inputs.py": {
|
||||
"bytes": 5712,
|
||||
"sha256": "3cd4f0155cd29c6786f467562d458a380084b2a510eac6454a29388f8f048772"
|
||||
},
|
||||
"verify.py": {
|
||||
"bytes": 10126,
|
||||
"sha256": "e670dc47e89a6ad5cdf7f9adfb6a50797270e475d6b312f159f7aef941ae723b"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
"""Prepare pinned source receipts after raw/sibling capture validation; never build."""
|
||||
from pathlib import Path
|
||||
import argparse, json
|
||||
from verify import HERE, SPECS, TOOLS, FILES, need, pin, verify_data, raw_captures, packaged, verify_package
|
||||
|
||||
def main():
|
||||
parser=argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('--raw-gates',type=Path,required=True,help='original raw gates and source-RUN.json receipts')
|
||||
parser.add_argument('--checks',type=Path,help='completed sibling checks package; required when writing')
|
||||
parser.add_argument('--repo',type=Path,help='optionally rerun exact committed Git-blob comparison')
|
||||
parser.add_argument('--output',type=Path,help='new source package directory')
|
||||
parser.add_argument('--check-only',action='store_true')
|
||||
args=parser.parse_args()
|
||||
receipts={run:(args.raw_gates/('source-'+run+'.json')).read_bytes() for run in SPECS}
|
||||
captured=packaged(args.checks) if args.checks else raw_captures(args.raw_gates)
|
||||
summary=verify_data(receipts,captured,args.repo)
|
||||
if args.check_only:
|
||||
print('PASS source check-only; no package written:',summary); return
|
||||
need(args.checks is not None,'written portable source package requires completed --checks package')
|
||||
need(args.output is not None,'explicit new --output required')
|
||||
out=args.output.resolve(); need(not out.exists(),'existing package refused')
|
||||
payload={name:(HERE/name).read_bytes() for name in TOOLS}
|
||||
payload.update({'source-'+run+'.json':data for run,data in receipts.items()})
|
||||
need(set(payload)==FILES,'exact source files')
|
||||
out.mkdir(parents=True)
|
||||
for name,data in payload.items():
|
||||
with (out/name).open('xb') as stream: stream.write(data)
|
||||
with (out/'files.json').open('x',encoding='utf-8') as stream:
|
||||
json.dump({name:pin(data) for name,data in sorted(payload.items())},stream,indent=2)
|
||||
# Git comparison was already performed above when requested; readback is byte-only.
|
||||
verify_package(out,args.checks)
|
||||
print('PASS written source package readback:',out,summary)
|
||||
if __name__=='__main__': main()
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"checked": "2026-09-23T10:37:38.419535+00:00",
|
||||
"commit": "2a3b9ba822a49ead233c4b5f98412a07c1c1da12",
|
||||
"gate": "desktop-2",
|
||||
"inputCount": 733,
|
||||
"inputMap": {
|
||||
"bytes": 122682,
|
||||
"sha256": "9cf85879dfb0bb5ec3b15c66b23df316e6bfe8451b6cf0c895bf7b9b5fbdde4a"
|
||||
},
|
||||
"comparison": "Exact committed Git blobs equal every captured input; same complete filtered inventory",
|
||||
"explicitCompileTimeFixtures": []
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"checked": "2026-09-23T10:37:40.478617+00:00",
|
||||
"commit": "3480b54201a5f361cca0bcd0d45dd6546a7a7bc9",
|
||||
"gate": "lint-2",
|
||||
"inputCount": 735,
|
||||
"inputMap": {
|
||||
"bytes": 123053,
|
||||
"sha256": "4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf"
|
||||
},
|
||||
"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"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
"""Compare captured input maps to exact named Git trees; no builds or checkouts."""
|
||||
from pathlib import Path, PurePosixPath
|
||||
import argparse
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
import zipfile
|
||||
|
||||
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 = False
|
||||
|
||||
|
||||
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 main():
|
||||
import datetime
|
||||
global INCLUDE_FIXTURES
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--repo", type=Path, required=True)
|
||||
parser.add_argument("--raw-gates", type=Path, required=True)
|
||||
parser.add_argument("--gate", required=True)
|
||||
parser.add_argument("--commit", required=True, help="exact full commit object ID, not a branch")
|
||||
parser.add_argument("--include-fixtures", action="store_true", help="include both compile-time fixtures for the revised 735-input scope; default preserves historical 733-input scope")
|
||||
parser.add_argument("--output", type=Path, help="optional new receipt file; otherwise read-only check")
|
||||
args = parser.parse_args()
|
||||
INCLUDE_FIXTURES = args.include_fixtures
|
||||
need(safe(args.gate) and "/" not in args.gate, "safe gate name")
|
||||
folder = args.raw_gates / args.gate
|
||||
map_bytes = (folder / "inputs.json").read_bytes()
|
||||
result = parsed((folder / "result.json").read_bytes())
|
||||
inputs = parsed(map_bytes)
|
||||
need(result["exitCode"] == 0 and result["inputsUnchanged"] is True, "accepted unchanged gate required")
|
||||
need(result["inputs"] == pin(map_bytes) and result["inputCount"] == len(inputs), "map relationship")
|
||||
need(all(safe(path) and relevant(path) for path in inputs), "input scope")
|
||||
need(sum(path.startswith("crates/vendor/iced_widget/") for path in inputs) == 71, "vendor inventory")
|
||||
compare_commit(args.repo, args.commit, inputs)
|
||||
report = {"checked": datetime.datetime.now(datetime.timezone.utc).isoformat(),
|
||||
"commit": args.commit, "gate": args.gate, "inputCount": len(inputs),
|
||||
"inputMap": pin(map_bytes), "comparison": COMPARISON,
|
||||
"explicitCompileTimeFixtures": sorted(EXPLICIT_FIXTURES) if INCLUDE_FIXTURES else []}
|
||||
if args.output:
|
||||
with args.output.open("x", encoding="utf-8") as stream:
|
||||
json.dump(report, stream, indent=2)
|
||||
print("PASS exact Git tree/blobs:", json.dumps(report))
|
||||
print("Source identity only; separately verify capture/archive consistency. No build, checkout or native acceptance claim.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,173 @@
|
||||
"""Verify pinned State 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 = False
|
||||
|
||||
|
||||
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))
|
||||
|
||||
|
||||
|
||||
SPECS = {'desktop-2': {'commit': '2a3b9ba822a49ead233c4b5f98412a07c1c1da12', 'inputCount': 733, 'inputMap': {'bytes': 122682, 'sha256': '9cf85879dfb0bb5ec3b15c66b23df316e6bfe8451b6cf0c895bf7b9b5fbdde4a'}, 'explicitCompileTimeFixtures': [], 'receiptPin': {'bytes': 428, 'sha256': '6012bdc52a3843c9cfd5f3c80ec4270a7c0f1e13ef4738b0e3f4ed048ff8d885'}}, 'lint-2': {'commit': '3480b54201a5f361cca0bcd0d45dd6546a7a7bc9', 'inputCount': 735, 'inputMap': {'bytes': 123053, 'sha256': '4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf'}, 'explicitCompileTimeFixtures': ['harness/experiments/edge-attachments-20260922/native-fixture.arcadia', 'harness/experiments/textual-authoring-20260911/alarm-response.arcadia'], 'receiptPin': {'bytes': 583, 'sha256': 'e0a6deab68683278965643f6f34a1038fcea25c1f242b6f75f5559b7697ec7d6'}}}
|
||||
TOOLS = {".gitattributes", "prepare.py", "verify.py", "verify-committed-inputs.py", "README.md"}
|
||||
FILES = TOOLS | {"source-" + run + ".json" for run in SPECS}
|
||||
|
||||
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, repo=None):
|
||||
global INCLUDE_FIXTURES
|
||||
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) == spec["inputCount"] == result["inputCount"], run + ": input counts")
|
||||
INCLUDE_FIXTURES = bool(spec["explicitCompileTimeFixtures"])
|
||||
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):
|
||||
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):
|
||||
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
|
||||
|
||||
def verify_package(package, checks, repo=None):
|
||||
files = parsed((package/"files.json").read_bytes())
|
||||
need(set(files) == FILES, "source outer inventory")
|
||||
need({p.name for p in package.iterdir()} == FILES | {"files.json"}, "source exact package inventory")
|
||||
for name, expected in files.items():
|
||||
need((package/name).is_file() and not (package/name).is_symlink() and pin((package/name).read_bytes()) == expected, "source outer pin: " + name)
|
||||
return verify_data({run:(package/("source-"+run+".json")).read_bytes() for run in SPECS}, packaged(checks), repo)
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("package", nargs="?", type=Path, default=HERE)
|
||||
parser.add_argument("--checks", type=Path, help="sibling checks package; default PACKAGE/../checks")
|
||||
parser.add_argument("--repo", type=Path, help="optional repository containing both exact commits, for renewed Git-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, checkouts, helper execution or native acceptance claim. Run the checks verifier separately for full gate relationships.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user