docs: publish State multiselect verification and native evidence

This commit is contained in:
2026-09-23 04:41:42 -07:00
parent 3480b54201
commit bed7f825fd
42 changed files with 6496 additions and 5 deletions
@@ -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.
@@ -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.
@@ -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.
@@ -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()