docs: publish State multiselect verification and native evidence
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
# Process column-slot experiment — exploratory evidence
|
||||
|
||||
Question: does simultaneous column-slot permutation preserve presentation boundaries and stable order without hidden no-op mutations? Separately, can object-anchored Before/After retain selected-target no-op while reaching every useful destination?
|
||||
|
||||
Expected: preserve the entire ID set, exact other-column indices, selected source order, unselected within-column order, a contiguous moved block, equivalent normalized-gap results, click-order independence and frozen ID-to-rank map. Identical column order must return unchanged. Cross-column selections must refuse.
|
||||
|
||||
Run from the repository root with `node harness/experiments/process-column-slots-20260923/experiment.cjs` and `node harness/experiments/process-column-slots-20260923/anchor-policies.cjs`. Scripts overwrite only their own JSON results. Node was the existing bundled runtime. The parent inspected and reran both original scripts before copying them here. No Cargo, production edits or GUI were used by the experiment.
|
||||
|
||||
Results: both scripts exited 0. The first exhausted every steps permutation, set partition, nonempty selected subset and column gap through five IDs: 214,990 admitted property cases, 140,024 cross-column refusals and 127,950 unchanged cases. It separately exhausted all 4,096 directed simple graphs on four IDs and their 24 step permutations: 98,304 graph orders, 861,096 admitted plans, zero changed-rank counterexamples. Its longest-path/fallback rank model follows the documented algorithm but does not execute Rust. The no-source-change assertion uses a sentinel JSON envelope and suppresses serialization for unchanged results; it does not prove the application source writer or history implementation.
|
||||
|
||||
Concrete counterexample to global splicing: `[a,u,b,v,c]`, column `[a,b,c]`, selection `{b,c}`, after `a` is unchanged. Column-slot permutation preserves the exact original array; global splicing would write `[a,b,c,u,v]`. Moving that block before `a` produces `[b,u,c,v,a]`: `u` and `v` retain exact indices. Consequently, preserving all globally unselected relative order is intentionally not a requirement (`a` moves relative to `u` and `v`).
|
||||
|
||||
Anchor-policy follow-up: all nonempty subsets for column lengths 1..10 (2,036 cases, 18,324 unselected Before/After anchors) reached every remainder-list gap using an unselected neighbor. Raw normalization differs from selected-anchor no-op in 17,004 selected-anchor cases. Example: `[a,b,c,d]`, selection `{b,d}`, Before `d` normalizes to `[a,c,b,d]`; the object-anchor policy keeps `[a,b,c,d]`. The changed result is still reachable through After `c`. The APIs are distinct: normalization does not automatically supersede selected-target no-op. Prefer retaining the latter for object-anchored UI if that is the chosen interaction; every changed result remains reachable. When all are selected, the sole destination is inherently unchanged.
|
||||
|
||||
The selected-anchor no-op guard belongs before invoking a block planner: noncontiguous selected items can legitimately remain noncontiguous after that no-op. The block-contiguity postcondition applies to planned moves, not every selected-target gesture.
|
||||
|
||||
Legacy exchange-only ordering assigns successive ranks, and cycle-blocked fallback assigns unique ranks. Multi-member sets spanning these ranks refuse. Four-node enumeration cannot exercise a changed multiple-member group beside a cycle: two cycle nodes leave only two peers, whose entire block has nowhere to move. Independent review identified this limit; an added five-node case checks `[a,u,b,v,c]`, cycle `u→v→u`, selection `{b,c}` before `a`, exact result `[b,u,c,v,a]`, and unchanged full ranks. Production should still validate the complete recomputed rank map. The experiment freezes graph edges; it does not rederive legacy OrderedPath adjacency. Valid legacy columns contain one node, so admitted moves are no-op and multiple-member groups refuse under this candidate.
|
||||
|
||||
The same independent reviewer confirmed the rank model agrees with current Rust, found no planner counterexample under its assumptions, and noted that anchor reachability does not execute a selected-target guard or test actual pointer hit regions. Existing singleton reorder globally splices steps, so routing it through this planner would intentionally change invisible cross-column source ordering; the candidate must make that migration explicit.
|
||||
|
||||
Limitations and next Rust checks: these scripts assume valid unique step IDs, valid complete rank maps, visible local occurrence selection, and valid destination bounds. Rust must reject duplicate/missing/wrong-owner IDs, qualified/link mixtures, stale snapshots and dirty drafts before side effects. Explicitly choose raw-gap versus object-anchor input; keep before-first/after-last reachable. Verify production layout with different card heights and expansion, preview/commit plan identity, OA/SA source roundtrip, unchanged semantics outside steps, one Undo/Redo, no history for no-op, source limits/refusal, and native slot feedback. Deletion mode switching and aggregate removal were not investigated by these movement scripts.
|
||||
|
||||
Artifacts are exploratory evidence. They do not establish State acceptance or Process implementation acceptance.
|
||||
@@ -0,0 +1,31 @@
|
||||
const fs=require('fs'), assert=require('assert/strict');
|
||||
let cases=0, anchors=0, divergent=0;
|
||||
for(let n=1;n<=10;n++) {
|
||||
const column=Array.from({length:n},(_,i)=>i);
|
||||
for(let mask=1;mask<(1<<n);mask++) {
|
||||
const selected=new Set(column.filter(id=>mask&(1<<id)));
|
||||
const remainder=column.filter(id=>!selected.has(id));
|
||||
const reached=new Set();
|
||||
for(const anchor of remainder) for(const after of [false,true]) {
|
||||
const rawGap=column.indexOf(anchor)+(after?1:0);
|
||||
const gap=column.slice(0,rawGap).filter(id=>!selected.has(id)).length;
|
||||
reached.add(gap); anchors++;
|
||||
assert.equal(gap,remainder.indexOf(anchor)+(after?1:0));
|
||||
}
|
||||
if(remainder.length) assert.deepEqual([...reached].sort((a,b)=>a-b),Array.from({length:remainder.length+1},(_,i)=>i));
|
||||
else assert.equal(selected.size,n); // Only one mathematical gap, all-selected no-op.
|
||||
for(const anchor of selected) for(const after of [false,true]) {
|
||||
const rawGap=column.indexOf(anchor)+(after?1:0);
|
||||
const gap=column.slice(0,rawGap).filter(id=>!selected.has(id)).length;
|
||||
const block=column.filter(id=>selected.has(id));
|
||||
const normalized=[...remainder.slice(0,gap),...block,...remainder.slice(gap)];
|
||||
if(normalized.some((id,i)=>id!==column[i]))divergent++;
|
||||
// Object policy intentionally preserves original order for selected anchors.
|
||||
// It need not form a contiguous block when this operation is a no-op.
|
||||
}
|
||||
cases++;
|
||||
}
|
||||
}
|
||||
const result={passed:true,method:'All nonempty subsets for column lengths 1..10, all unselected and selected Before/After anchors. Order-label equivariance makes separate ID permutations redundant for this reachability property.',cases,unselectedAnchors:anchors,selectedAnchorRawNormalizationDivergences:divergent,conclusion:'Every remainder gap is reachable via an unselected Before/After anchor. Selected-anchor no-op does not remove any possible changed result. Raw-gap and object-anchor policies remain distinct APIs; neither silently supersedes the other.',counterexample:{column:['a','b','c','d'],selected:['b','d'],drop:'Before d',rawGapResult:['a','c','b','d'],objectAnchorResult:['a','b','c','d'],equivalentUnselectedDrop:'After c'}};
|
||||
fs.writeFileSync(__dirname+'/anchor-results.json',JSON.stringify(result,null,2)+'\n');
|
||||
console.log(JSON.stringify(result,null,2));
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"passed": true,
|
||||
"method": "All nonempty subsets for column lengths 1..10, all unselected and selected Before/After anchors. Order-label equivariance makes separate ID permutations redundant for this reachability property.",
|
||||
"cases": 2036,
|
||||
"unselectedAnchors": 18324,
|
||||
"selectedAnchorRawNormalizationDivergences": 17004,
|
||||
"conclusion": "Every remainder gap is reachable via an unselected Before/After anchor. Selected-anchor no-op does not remove any possible changed result. Raw-gap and object-anchor policies remain distinct APIs; neither silently supersedes the other.",
|
||||
"counterexample": {
|
||||
"column": [
|
||||
"a",
|
||||
"b",
|
||||
"c",
|
||||
"d"
|
||||
],
|
||||
"selected": [
|
||||
"b",
|
||||
"d"
|
||||
],
|
||||
"drop": "Before d",
|
||||
"rawGapResult": [
|
||||
"a",
|
||||
"c",
|
||||
"b",
|
||||
"d"
|
||||
],
|
||||
"objectAnchorResult": [
|
||||
"a",
|
||||
"b",
|
||||
"c",
|
||||
"d"
|
||||
],
|
||||
"equivalentUnselectedDrop": "After c"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
// Exploratory model, not production code or a test of the Rust implementation.
|
||||
const fs = require('fs');
|
||||
const assert = require('assert/strict');
|
||||
let count = 0, graphCount = 0, admitted = 0, refused = 0, noops = 0;
|
||||
function* permutations(a) {
|
||||
if (!a.length) { yield []; return; }
|
||||
for (let i=0;i<a.length;i++) for (const tail of permutations(a.filter((_,j)=>i!==j))) yield [a[i],...tail];
|
||||
}
|
||||
function* partitions(n, prefix=[]) {
|
||||
if(prefix.length===n) { yield prefix; return; }
|
||||
const max=prefix.length?Math.max(...prefix)+1:0;
|
||||
for(let x=0;x<=max;x++) yield* partitions(n,[...prefix,x]);
|
||||
}
|
||||
function plan(steps, ranks, selected, rawGap) {
|
||||
const rank=ranks[selected[0]];
|
||||
if(!selected.length || selected.some(id=>ranks[id]!==rank)) return null;
|
||||
const indices=steps.flatMap((id,i)=>ranks[id]===rank?[i]:[]);
|
||||
const column=indices.map(i=>steps[i]), set=new Set(selected);
|
||||
assert(rawGap>=0 && rawGap<=column.length);
|
||||
const block=column.filter(id=>set.has(id));
|
||||
const remainder=column.filter(id=>!set.has(id));
|
||||
const gap=column.slice(0,rawGap).filter(id=>!set.has(id)).length;
|
||||
const order=[...remainder.slice(0,gap),...block,...remainder.slice(gap)];
|
||||
const result=steps.slice();
|
||||
indices.forEach((index,i)=>result[index]=order[i]);
|
||||
return {result, order, gap, changed:result.some((id,i)=>id!==steps[i])};
|
||||
}
|
||||
function verify(steps,ranks,selected,rawGap,p) {
|
||||
const set=new Set(selected), rank=ranks[selected[0]];
|
||||
const old=steps.filter(id=>ranks[id]===rank), got=p.result.filter(id=>ranks[id]===rank);
|
||||
assert.deepEqual([...p.result].sort(),[...steps].sort());
|
||||
steps.forEach((id,i)=>{if(ranks[id]!==rank) assert.equal(p.result[i],id);});
|
||||
assert.deepEqual(got.filter(id=>set.has(id)),old.filter(id=>set.has(id)));
|
||||
assert.deepEqual(got.filter(id=>!set.has(id)),old.filter(id=>!set.has(id)));
|
||||
const first=got.findIndex(id=>set.has(id));
|
||||
assert.equal(got.slice(first,first+set.size).every(id=>set.has(id)),true);
|
||||
// Independent gap oracle: every original unselected item before boundary
|
||||
// precedes every selected item; all remaining unselected items follow them.
|
||||
old.forEach((id,i)=>{if(!set.has(id)) selected.forEach(s=>assert.equal(got.indexOf(id)<got.indexOf(s),i<rawGap));});
|
||||
const stableAlready=old.every((id,i)=>id===got[i]);
|
||||
assert.equal(p.changed,!stableAlready);
|
||||
const source=JSON.stringify({steps,untouched:'sentinel'});
|
||||
const after=p.changed?JSON.stringify({steps:p.result,untouched:'sentinel'}):source;
|
||||
if(stableAlready) {assert.equal(after,source); noops++;}
|
||||
count++;
|
||||
}
|
||||
for(let n=1;n<=5;n++) {
|
||||
const ids=Array.from({length:n},(_,i)=>i);
|
||||
for(const ranks of partitions(n)) for(const steps of permutations(ids)) {
|
||||
for(let mask=1;mask<(1<<n);mask++) {
|
||||
const selected=ids.filter(id=>mask&(1<<id));
|
||||
if(selected.some(id=>ranks[id]!==ranks[selected[0]])) {
|
||||
assert.equal(plan(steps,ranks,selected,0),null); refused++; continue;
|
||||
}
|
||||
const column=steps.filter(id=>ranks[id]===ranks[selected[0]]);
|
||||
const equivalents=new Map();
|
||||
for(let gap=0;gap<=column.length;gap++) {
|
||||
const p=plan(steps,ranks,selected,gap);
|
||||
verify(steps,ranks,selected,gap,p);
|
||||
assert.deepEqual(p,plan(steps,ranks,[...selected].reverse(),gap));
|
||||
if(equivalents.has(p.gap)) assert.deepEqual(p.result,equivalents.get(p.gap));
|
||||
equivalents.set(p.gap,p.result);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Semantic column model: longest-path Kahn ranks and deterministic residual
|
||||
// fallback, matching the documented algorithm, independently of planner.
|
||||
function ranksOf(steps,edges) {
|
||||
const indegree=Object.fromEntries(steps.map(id=>[id,0]));
|
||||
const ranks=Object.fromEntries(steps.map(id=>[id,0]));
|
||||
edges.forEach(([,b])=>indegree[b]++);
|
||||
const queue=steps.filter(id=>indegree[id]===0), done=new Set();
|
||||
for(let i=0;i<queue.length;i++) {
|
||||
const id=queue[i]; if(done.has(id))continue; done.add(id);
|
||||
for(const [a,b] of edges) if(a===id) {
|
||||
ranks[b]=Math.max(ranks[b],ranks[a]+1);
|
||||
if(--indegree[b]===0)queue.push(b);
|
||||
}
|
||||
}
|
||||
let fallback=Math.max(...Object.values(ranks))+1;
|
||||
steps.forEach(id=>{if(!done.has(id))ranks[id]=fallback++;});
|
||||
return ranks;
|
||||
}
|
||||
const ids=[0,1,2,3], possible=ids.flatMap(a=>ids.filter(b=>a!==b).map(b=>[a,b]));
|
||||
for(let mask=0;mask<(1<<possible.length);mask++) {
|
||||
const edges=possible.filter((_,i)=>mask&(1<<i));
|
||||
for(const steps of permutations(ids)) {
|
||||
const ranks=ranksOf(steps,edges); graphCount++;
|
||||
for(let subset=1;subset<16;subset++) {
|
||||
const selected=ids.filter(id=>subset&(1<<id));
|
||||
if(selected.some(id=>ranks[id]!==ranks[selected[0]]))continue;
|
||||
const column=steps.filter(id=>ranks[id]===ranks[selected[0]]);
|
||||
for(let gap=0;gap<=column.length;gap++) {
|
||||
const p=plan(steps,ranks,selected,gap);
|
||||
assert.deepEqual(ranksOf(p.result,edges),ranks); admitted++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
const concrete=[];
|
||||
function example(name,steps,ranks,selected,gap,expected) {
|
||||
const p=plan(steps,ranks,selected,gap); assert.deepEqual(p?.result??null,expected);
|
||||
concrete.push({name,steps,ranks,selected,rawGap:gap,result:p?.result??null,changed:p?.changed??false});
|
||||
}
|
||||
example('interleaved visual no-op',['a','u','b','v','c'],{a:0,b:0,c:0,u:1,v:1},['c','b'],1,['a','u','b','v','c']);
|
||||
example('column slot move preserves other indices',['a','u','b','v','c'],{a:0,b:0,c:0,u:1,v:1},['c','b'],0,['b','u','c','v','a']);
|
||||
example('selected-anchor normalization is not always no-op',['a','b','c','d'],{a:0,b:0,c:0,d:0},['b','d'],3,['a','c','b','d']);
|
||||
example('legacy successive-rank refusal',['a','b','c'],{a:0,b:1,c:2},['a','c'],0,null);
|
||||
const cyclicRanks=ranksOf([0,1,2,3],[[2,3],[3,2]]);
|
||||
example('cycle fallback group refusal',[0,1,2,3],cyclicRanks,[2,3],0,null);
|
||||
example('acyclic peers beside cycle',[0,1,2,3],cyclicRanks,[1],0,[1,0,2,3]);
|
||||
const besideCycleSteps=['a','u','b','v','c'], besideCycleEdges=[['u','v'],['v','u']];
|
||||
const besideCycleRanks=ranksOf(besideCycleSteps,besideCycleEdges);
|
||||
example('changed multiple-member group beside cycle',besideCycleSteps,besideCycleRanks,['c','b'],0,['b','u','c','v','a']);
|
||||
assert.deepEqual(ranksOf(['b','u','c','v','a'],besideCycleEdges),besideCycleRanks);
|
||||
const result={expectation:'Column-slot permutation satisfies stable-block/gap/index invariants; recomputed ranks remain exact.',method:'All permutations and set partitions through n=5; every nonempty subset and raw column gap. Every directed simple graph on 4 IDs, all 24 step permutations, all admitted subsets/gaps. No Rust, source serializer, or GUI exercised.',passed:true,counts:{propertyCases:count,crossColumnRefusals:refused,noops,graphOrders:graphCount,rankCheckedPlans:admitted},concrete};
|
||||
fs.writeFileSync(__dirname+'/results.json',JSON.stringify(result,null,2)+'\n');
|
||||
console.log(JSON.stringify(result,null,2));
|
||||
@@ -0,0 +1,199 @@
|
||||
{
|
||||
"expectation": "Column-slot permutation satisfies stable-block/gap/index invariants; recomputed ranks remain exact.",
|
||||
"method": "All permutations and set partitions through n=5; every nonempty subset and raw column gap. Every directed simple graph on 4 IDs, all 24 step permutations, all admitted subsets/gaps. No Rust, source serializer, or GUI exercised.",
|
||||
"passed": true,
|
||||
"counts": {
|
||||
"propertyCases": 214990,
|
||||
"crossColumnRefusals": 140024,
|
||||
"noops": 127950,
|
||||
"graphOrders": 98304,
|
||||
"rankCheckedPlans": 861096
|
||||
},
|
||||
"concrete": [
|
||||
{
|
||||
"name": "interleaved visual no-op",
|
||||
"steps": [
|
||||
"a",
|
||||
"u",
|
||||
"b",
|
||||
"v",
|
||||
"c"
|
||||
],
|
||||
"ranks": {
|
||||
"a": 0,
|
||||
"b": 0,
|
||||
"c": 0,
|
||||
"u": 1,
|
||||
"v": 1
|
||||
},
|
||||
"selected": [
|
||||
"c",
|
||||
"b"
|
||||
],
|
||||
"rawGap": 1,
|
||||
"result": [
|
||||
"a",
|
||||
"u",
|
||||
"b",
|
||||
"v",
|
||||
"c"
|
||||
],
|
||||
"changed": false
|
||||
},
|
||||
{
|
||||
"name": "column slot move preserves other indices",
|
||||
"steps": [
|
||||
"a",
|
||||
"u",
|
||||
"b",
|
||||
"v",
|
||||
"c"
|
||||
],
|
||||
"ranks": {
|
||||
"a": 0,
|
||||
"b": 0,
|
||||
"c": 0,
|
||||
"u": 1,
|
||||
"v": 1
|
||||
},
|
||||
"selected": [
|
||||
"c",
|
||||
"b"
|
||||
],
|
||||
"rawGap": 0,
|
||||
"result": [
|
||||
"b",
|
||||
"u",
|
||||
"c",
|
||||
"v",
|
||||
"a"
|
||||
],
|
||||
"changed": true
|
||||
},
|
||||
{
|
||||
"name": "selected-anchor normalization is not always no-op",
|
||||
"steps": [
|
||||
"a",
|
||||
"b",
|
||||
"c",
|
||||
"d"
|
||||
],
|
||||
"ranks": {
|
||||
"a": 0,
|
||||
"b": 0,
|
||||
"c": 0,
|
||||
"d": 0
|
||||
},
|
||||
"selected": [
|
||||
"b",
|
||||
"d"
|
||||
],
|
||||
"rawGap": 3,
|
||||
"result": [
|
||||
"a",
|
||||
"c",
|
||||
"b",
|
||||
"d"
|
||||
],
|
||||
"changed": true
|
||||
},
|
||||
{
|
||||
"name": "legacy successive-rank refusal",
|
||||
"steps": [
|
||||
"a",
|
||||
"b",
|
||||
"c"
|
||||
],
|
||||
"ranks": {
|
||||
"a": 0,
|
||||
"b": 1,
|
||||
"c": 2
|
||||
},
|
||||
"selected": [
|
||||
"a",
|
||||
"c"
|
||||
],
|
||||
"rawGap": 0,
|
||||
"result": null,
|
||||
"changed": false
|
||||
},
|
||||
{
|
||||
"name": "cycle fallback group refusal",
|
||||
"steps": [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3
|
||||
],
|
||||
"ranks": {
|
||||
"0": 0,
|
||||
"1": 0,
|
||||
"2": 1,
|
||||
"3": 2
|
||||
},
|
||||
"selected": [
|
||||
2,
|
||||
3
|
||||
],
|
||||
"rawGap": 0,
|
||||
"result": null,
|
||||
"changed": false
|
||||
},
|
||||
{
|
||||
"name": "acyclic peers beside cycle",
|
||||
"steps": [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3
|
||||
],
|
||||
"ranks": {
|
||||
"0": 0,
|
||||
"1": 0,
|
||||
"2": 1,
|
||||
"3": 2
|
||||
},
|
||||
"selected": [
|
||||
1
|
||||
],
|
||||
"rawGap": 0,
|
||||
"result": [
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
3
|
||||
],
|
||||
"changed": true
|
||||
},
|
||||
{
|
||||
"name": "changed multiple-member group beside cycle",
|
||||
"steps": [
|
||||
"a",
|
||||
"u",
|
||||
"b",
|
||||
"v",
|
||||
"c"
|
||||
],
|
||||
"ranks": {
|
||||
"a": 0,
|
||||
"u": 1,
|
||||
"b": 0,
|
||||
"v": 2,
|
||||
"c": 0
|
||||
},
|
||||
"selected": [
|
||||
"c",
|
||||
"b"
|
||||
],
|
||||
"rawGap": 0,
|
||||
"result": [
|
||||
"b",
|
||||
"u",
|
||||
"c",
|
||||
"v",
|
||||
"a"
|
||||
],
|
||||
"changed": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
# Preserve exact pinned captures and verification tools through Git round trips.
|
||||
* -text whitespace=cr-at-eol
|
||||
incidents/core-1/core-1/*.log whitespace=-blank-at-eof,cr-at-eol
|
||||
@@ -0,0 +1,35 @@
|
||||
# State multiselect closed gate evidence tools
|
||||
|
||||
Preparation requires an explicit closed run list from `.local/state-group-gates`.
|
||||
Preserve failed `desktop-1` alongside accepted unchanged runs. Exclude `core-1`
|
||||
from this package: its false unchanged-input flag and one map/archive mismatch
|
||||
belong in the separate pinned incident. Neither failures nor incidents are passes.
|
||||
|
||||
Example check-only invocation (extend with every subsequent closed run):
|
||||
|
||||
```
|
||||
python -B prepare.py --root CHECKOUT --runs desktop-1 core-2 desktop-2 --check-only
|
||||
```
|
||||
|
||||
Only after all selected captures close, omit `--check-only` and provide
|
||||
`--output CHECKOUT/harness/experiments/state-multiselect-20260923/checks`.
|
||||
Historical helper copies may be passed via repeatable `--helper PATH`.
|
||||
No existing output is overwritten. Run `python -B verify.py PACKAGE` for readback.
|
||||
|
||||
The strict verifier is unchanged from the ordinary multiselect package: exact
|
||||
seven raw files, helper bytes, safe archive inventories, all input-map/archive
|
||||
bytes equal, receipt relationships and inputsUnchanged exactly true are required.
|
||||
Failures retain their actual exits and streams. Source capsules preserve local
|
||||
historical bytes; recorded HEAD alone does not identify those bytes.
|
||||
|
||||
The earlier 733-input helper omitted the core compile-time integration fixture
|
||||
`harness/experiments/edge-attachments-20260922/native-fixture.arcadia` and the CLI
|
||||
fixture `harness/experiments/textual-authoring-20260911/alarm-response.arcadia`.
|
||||
Lint-1 failed, and its all-target capture additionally has a source-capsule
|
||||
scope limitation for the core fixture. Later 735-input captures add both explicit
|
||||
inputs. Desktop/core
|
||||
example captures retain their actual tested scope; do not infer that one map
|
||||
establishes a later map or complete all-target source identity.
|
||||
|
||||
Offline pin/receipt consistency is not test execution, authentication, native
|
||||
acceptance, or proof of usability. Executables and toolchains are not distributed.
|
||||
Binary file not shown.
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"prepare.py": {
|
||||
"bytes": 4802,
|
||||
"sha256": "24f59b1e61a1e9c93d4aa9a47a998cbf9c2058e966cc5a7beceba73e2138943c"
|
||||
},
|
||||
"verify.py": {
|
||||
"bytes": 8873,
|
||||
"sha256": "c03513407073bef092d57b968f982b8ffc0c58e095f834fe7464c6a0e8454a9a"
|
||||
},
|
||||
"README.md": {
|
||||
"bytes": 1984,
|
||||
"sha256": "157584ed470fb8320d5a03b79388c6e1b7818b25fee1dee913083a41ff847f60"
|
||||
},
|
||||
"manifest.json": {
|
||||
"bytes": 17487,
|
||||
"sha256": "d5d71a7352fe8ab8cd63d3ce907c875d98ab048080c28868571819e9afa61e4f"
|
||||
},
|
||||
"evidence.zip": {
|
||||
"bytes": 8859169,
|
||||
"sha256": "48a47389ffdba1180b1340c3471f3d8615790e709fe563c39941d95f3f242f77"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,431 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"kind": "multiselect-cargo-gates",
|
||||
"runs": {
|
||||
"desktop-1": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--message-format=json",
|
||||
"state_multiselect",
|
||||
"--",
|
||||
"--test-threads=1"
|
||||
],
|
||||
"head": "7e348d967d1787c052a145b7448636613a6a7054",
|
||||
"exitCode": 101,
|
||||
"inputCount": 733,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"core-2": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"--example",
|
||||
"state_multiselect_native",
|
||||
"--message-format=json",
|
||||
"--",
|
||||
"--test-threads=1"
|
||||
],
|
||||
"head": "7e348d967d1787c052a145b7448636613a6a7054",
|
||||
"exitCode": 0,
|
||||
"inputCount": 733,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"desktop-2": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--message-format=json",
|
||||
"--",
|
||||
"--test-threads=1"
|
||||
],
|
||||
"head": "7e348d967d1787c052a145b7448636613a6a7054",
|
||||
"exitCode": 0,
|
||||
"inputCount": 733,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"lint-1": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"clippy",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--all-targets",
|
||||
"--message-format=json",
|
||||
"--",
|
||||
"-D",
|
||||
"warnings"
|
||||
],
|
||||
"head": "7e348d967d1787c052a145b7448636613a6a7054",
|
||||
"exitCode": 101,
|
||||
"inputCount": 733,
|
||||
"helper": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"lint-2": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"clippy",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--all-targets",
|
||||
"--message-format=json",
|
||||
"--",
|
||||
"-D",
|
||||
"warnings"
|
||||
],
|
||||
"head": "7e348d967d1787c052a145b7448636613a6a7054",
|
||||
"exitCode": 0,
|
||||
"inputCount": 735,
|
||||
"helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py"
|
||||
},
|
||||
"format-1": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"fmt",
|
||||
"--all",
|
||||
"--",
|
||||
"--check"
|
||||
],
|
||||
"head": "7e348d967d1787c052a145b7448636613a6a7054",
|
||||
"exitCode": 0,
|
||||
"inputCount": 735,
|
||||
"helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py"
|
||||
},
|
||||
"desktop-3": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--message-format=json",
|
||||
"--",
|
||||
"state_",
|
||||
"model_menu",
|
||||
"--test-threads=1"
|
||||
],
|
||||
"head": "3480b54201a5f361cca0bcd0d45dd6546a7a7bc9",
|
||||
"exitCode": 0,
|
||||
"inputCount": 735,
|
||||
"helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py"
|
||||
},
|
||||
"native-build-1": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"build",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"--example",
|
||||
"state_multiselect_native",
|
||||
"--message-format=json"
|
||||
],
|
||||
"head": "3480b54201a5f361cca0bcd0d45dd6546a7a7bc9",
|
||||
"exitCode": 0,
|
||||
"inputCount": 735,
|
||||
"helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py"
|
||||
},
|
||||
"windows-build-1": {
|
||||
"command": [
|
||||
"cargo",
|
||||
"build",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--message-format=json"
|
||||
],
|
||||
"head": "3480b54201a5f361cca0bcd0d45dd6546a7a7bc9",
|
||||
"exitCode": 0,
|
||||
"inputCount": 735,
|
||||
"helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py"
|
||||
}
|
||||
},
|
||||
"logicalFiles": {
|
||||
"cargo/core-2/inputs.json": "capsules/9cf85879dfb0bb5ec3b15c66b23df316e6bfe8451b6cf0c895bf7b9b5fbdde4a.json",
|
||||
"cargo/core-2/inputs.zip": "capsules/3419218f9917de0ac689a32dd622ebe55487fa5a37ffaba4b8fa662bc15a5cb9.zip",
|
||||
"cargo/core-2/process.json": "cargo/core-2/process.json",
|
||||
"cargo/core-2/result.json": "cargo/core-2/result.json",
|
||||
"cargo/core-2/started.json": "cargo/core-2/started.json",
|
||||
"cargo/core-2/stderr.log": "cargo/core-2/stderr.log",
|
||||
"cargo/core-2/stdout.log": "cargo/core-2/stdout.log",
|
||||
"cargo/desktop-1/inputs.json": "capsules/d8a64b62b68ac1c37bc3fe9309abc4dc314e343ce546bba4b9445f68dddeda5d.json",
|
||||
"cargo/desktop-1/inputs.zip": "capsules/cecd6ae0ba45add8e913d9913cd4960c01928db0a4bc795902b7954ffb6f692e.zip",
|
||||
"cargo/desktop-1/process.json": "cargo/desktop-1/process.json",
|
||||
"cargo/desktop-1/result.json": "cargo/desktop-1/result.json",
|
||||
"cargo/desktop-1/started.json": "cargo/desktop-1/started.json",
|
||||
"cargo/desktop-1/stderr.log": "cargo/desktop-1/stderr.log",
|
||||
"cargo/desktop-1/stdout.log": "cargo/desktop-1/stdout.log",
|
||||
"cargo/desktop-2/inputs.json": "capsules/9cf85879dfb0bb5ec3b15c66b23df316e6bfe8451b6cf0c895bf7b9b5fbdde4a.json",
|
||||
"cargo/desktop-2/inputs.zip": "capsules/3419218f9917de0ac689a32dd622ebe55487fa5a37ffaba4b8fa662bc15a5cb9.zip",
|
||||
"cargo/desktop-2/process.json": "cargo/desktop-2/process.json",
|
||||
"cargo/desktop-2/result.json": "cargo/desktop-2/result.json",
|
||||
"cargo/desktop-2/started.json": "cargo/desktop-2/started.json",
|
||||
"cargo/desktop-2/stderr.log": "cargo/desktop-2/stderr.log",
|
||||
"cargo/desktop-2/stdout.log": "cargo/desktop-2/stdout.log",
|
||||
"cargo/desktop-3/inputs.json": "capsules/4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf.json",
|
||||
"cargo/desktop-3/inputs.zip": "capsules/1e7f68e8d6156ec608b58ff70f7ddcaf690d38da1d5066092c218bce190d3a4c.zip",
|
||||
"cargo/desktop-3/process.json": "cargo/desktop-3/process.json",
|
||||
"cargo/desktop-3/result.json": "cargo/desktop-3/result.json",
|
||||
"cargo/desktop-3/started.json": "cargo/desktop-3/started.json",
|
||||
"cargo/desktop-3/stderr.log": "cargo/desktop-3/stderr.log",
|
||||
"cargo/desktop-3/stdout.log": "cargo/desktop-3/stdout.log",
|
||||
"cargo/format-1/inputs.json": "capsules/4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf.json",
|
||||
"cargo/format-1/inputs.zip": "capsules/1e7f68e8d6156ec608b58ff70f7ddcaf690d38da1d5066092c218bce190d3a4c.zip",
|
||||
"cargo/format-1/process.json": "cargo/format-1/process.json",
|
||||
"cargo/format-1/result.json": "cargo/format-1/result.json",
|
||||
"cargo/format-1/started.json": "cargo/format-1/started.json",
|
||||
"cargo/format-1/stderr.log": "cargo/format-1/stderr.log",
|
||||
"cargo/format-1/stdout.log": "cargo/format-1/stdout.log",
|
||||
"cargo/lint-1/inputs.json": "capsules/9cf85879dfb0bb5ec3b15c66b23df316e6bfe8451b6cf0c895bf7b9b5fbdde4a.json",
|
||||
"cargo/lint-1/inputs.zip": "capsules/3419218f9917de0ac689a32dd622ebe55487fa5a37ffaba4b8fa662bc15a5cb9.zip",
|
||||
"cargo/lint-1/process.json": "cargo/lint-1/process.json",
|
||||
"cargo/lint-1/result.json": "cargo/lint-1/result.json",
|
||||
"cargo/lint-1/started.json": "cargo/lint-1/started.json",
|
||||
"cargo/lint-1/stderr.log": "cargo/lint-1/stderr.log",
|
||||
"cargo/lint-1/stdout.log": "cargo/lint-1/stdout.log",
|
||||
"cargo/lint-2/inputs.json": "capsules/4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf.json",
|
||||
"cargo/lint-2/inputs.zip": "capsules/1e7f68e8d6156ec608b58ff70f7ddcaf690d38da1d5066092c218bce190d3a4c.zip",
|
||||
"cargo/lint-2/process.json": "cargo/lint-2/process.json",
|
||||
"cargo/lint-2/result.json": "cargo/lint-2/result.json",
|
||||
"cargo/lint-2/started.json": "cargo/lint-2/started.json",
|
||||
"cargo/lint-2/stderr.log": "cargo/lint-2/stderr.log",
|
||||
"cargo/lint-2/stdout.log": "cargo/lint-2/stdout.log",
|
||||
"cargo/native-build-1/inputs.json": "capsules/4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf.json",
|
||||
"cargo/native-build-1/inputs.zip": "capsules/1e7f68e8d6156ec608b58ff70f7ddcaf690d38da1d5066092c218bce190d3a4c.zip",
|
||||
"cargo/native-build-1/process.json": "cargo/native-build-1/process.json",
|
||||
"cargo/native-build-1/result.json": "cargo/native-build-1/result.json",
|
||||
"cargo/native-build-1/started.json": "cargo/native-build-1/started.json",
|
||||
"cargo/native-build-1/stderr.log": "cargo/native-build-1/stderr.log",
|
||||
"cargo/native-build-1/stdout.log": "cargo/native-build-1/stdout.log",
|
||||
"cargo/windows-build-1/inputs.json": "capsules/4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf.json",
|
||||
"cargo/windows-build-1/inputs.zip": "capsules/1e7f68e8d6156ec608b58ff70f7ddcaf690d38da1d5066092c218bce190d3a4c.zip",
|
||||
"cargo/windows-build-1/process.json": "cargo/windows-build-1/process.json",
|
||||
"cargo/windows-build-1/result.json": "cargo/windows-build-1/result.json",
|
||||
"cargo/windows-build-1/started.json": "cargo/windows-build-1/started.json",
|
||||
"cargo/windows-build-1/stderr.log": "cargo/windows-build-1/stderr.log",
|
||||
"cargo/windows-build-1/stdout.log": "cargo/windows-build-1/stdout.log",
|
||||
"helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py",
|
||||
"helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py": "helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py"
|
||||
},
|
||||
"members": {
|
||||
"capsules/1e7f68e8d6156ec608b58ff70f7ddcaf690d38da1d5066092c218bce190d3a4c.zip": {
|
||||
"bytes": 2952517,
|
||||
"sha256": "1e7f68e8d6156ec608b58ff70f7ddcaf690d38da1d5066092c218bce190d3a4c"
|
||||
},
|
||||
"capsules/3419218f9917de0ac689a32dd622ebe55487fa5a37ffaba4b8fa662bc15a5cb9.zip": {
|
||||
"bytes": 2948937,
|
||||
"sha256": "3419218f9917de0ac689a32dd622ebe55487fa5a37ffaba4b8fa662bc15a5cb9"
|
||||
},
|
||||
"capsules/4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf.json": {
|
||||
"bytes": 123053,
|
||||
"sha256": "4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf"
|
||||
},
|
||||
"capsules/9cf85879dfb0bb5ec3b15c66b23df316e6bfe8451b6cf0c895bf7b9b5fbdde4a.json": {
|
||||
"bytes": 122682,
|
||||
"sha256": "9cf85879dfb0bb5ec3b15c66b23df316e6bfe8451b6cf0c895bf7b9b5fbdde4a"
|
||||
},
|
||||
"capsules/cecd6ae0ba45add8e913d9913cd4960c01928db0a4bc795902b7954ffb6f692e.zip": {
|
||||
"bytes": 2947000,
|
||||
"sha256": "cecd6ae0ba45add8e913d9913cd4960c01928db0a4bc795902b7954ffb6f692e"
|
||||
},
|
||||
"capsules/d8a64b62b68ac1c37bc3fe9309abc4dc314e343ce546bba4b9445f68dddeda5d.json": {
|
||||
"bytes": 122682,
|
||||
"sha256": "d8a64b62b68ac1c37bc3fe9309abc4dc314e343ce546bba4b9445f68dddeda5d"
|
||||
},
|
||||
"cargo/core-2/process.json": {
|
||||
"bytes": 200,
|
||||
"sha256": "744543a3f69d993977f0d15bce6e1ab3f64329eda4bb2d80375a8c8794ee83c0"
|
||||
},
|
||||
"cargo/core-2/result.json": {
|
||||
"bytes": 3196,
|
||||
"sha256": "4625b4558263524424fe6465aea20d1e9831f4c1cb6298124fa3683957f5880e"
|
||||
},
|
||||
"cargo/core-2/started.json": {
|
||||
"bytes": 1403,
|
||||
"sha256": "965d45f368d29ecbea6a7aa9b8881fe18a652928bad8f3e7665443acee52e19b"
|
||||
},
|
||||
"cargo/core-2/stderr.log": {
|
||||
"bytes": 320,
|
||||
"sha256": "42a28434514f50c42782a469c68e6aad8644592b9a09c4b50cc43d987bd2fd5d"
|
||||
},
|
||||
"cargo/core-2/stdout.log": {
|
||||
"bytes": 42721,
|
||||
"sha256": "862bd3e57a3454d29cb6d9ad7673e5bc4b25ab2a288e15d1a7d8dfb912a1457f"
|
||||
},
|
||||
"cargo/desktop-1/process.json": {
|
||||
"bytes": 183,
|
||||
"sha256": "bc57e00984823c7f417c8455f0db3da10f8e453c7db7a808f115b818525227ac"
|
||||
},
|
||||
"cargo/desktop-1/result.json": {
|
||||
"bytes": 1778,
|
||||
"sha256": "25f62fde1985dafcf3467895c6a2f389c886e92ceaa9d63ff513f3d4365ffe79"
|
||||
},
|
||||
"cargo/desktop-1/started.json": {
|
||||
"bytes": 1381,
|
||||
"sha256": "fd570a96b6dc5fc9e750634ef23093a7205cd953be5a7782485e8dbe509098a6"
|
||||
},
|
||||
"cargo/desktop-1/stderr.log": {
|
||||
"bytes": 166,
|
||||
"sha256": "ad39fc56f685f7f3c6a9b4a342abff1f19f9daad28c394673be0e3a2a1cf2523"
|
||||
},
|
||||
"cargo/desktop-1/stdout.log": {
|
||||
"bytes": 297269,
|
||||
"sha256": "d1cdbd43e8fe41e4af6fe2d99d665700a78c1d38185d3a373a33895f296e7b93"
|
||||
},
|
||||
"cargo/desktop-2/process.json": {
|
||||
"bytes": 162,
|
||||
"sha256": "86efe98400b268723e0c3b38b4bcd270f888215060548181b6f4695774a9b640"
|
||||
},
|
||||
"cargo/desktop-2/result.json": {
|
||||
"bytes": 3090,
|
||||
"sha256": "1ae8d0229e429001c2e6214e94e9c4156eb5db75ad1907f421ec87bdeac22f2e"
|
||||
},
|
||||
"cargo/desktop-2/started.json": {
|
||||
"bytes": 1355,
|
||||
"sha256": "71356cc6cdcd01d3620a4bd73c8eee2ccbcb870466b7b0419be8e76cd95e4c02"
|
||||
},
|
||||
"cargo/desktop-2/stderr.log": {
|
||||
"bytes": 288,
|
||||
"sha256": "5e3681e5c50d0d6b25d9594f87a7767456cefefb35ed0575b5d035202d00070f"
|
||||
},
|
||||
"cargo/desktop-2/stdout.log": {
|
||||
"bytes": 441409,
|
||||
"sha256": "f301281be9caa78720540f89548fc1bb80f9b28cda18e4f6425178d4995ed1ec"
|
||||
},
|
||||
"cargo/desktop-3/process.json": {
|
||||
"bytes": 186,
|
||||
"sha256": "963dea7f8d8663873ca087b025e53b6555af28a20cce4d5cbdc740c00c4c874d"
|
||||
},
|
||||
"cargo/desktop-3/result.json": {
|
||||
"bytes": 3307,
|
||||
"sha256": "ecdb5366bb2ca064924e8e967491a7b3db4adffec5cc8cb3370b7afaf739546b"
|
||||
},
|
||||
"cargo/desktop-3/started.json": {
|
||||
"bytes": 1573,
|
||||
"sha256": "5ddbc4ca4954ca732248437cf774cb7803ddec06bef42c11c63b27295be744b2"
|
||||
},
|
||||
"cargo/desktop-3/stderr.log": {
|
||||
"bytes": 287,
|
||||
"sha256": "e0d9090ebcc83418a064f8876ec587e4e741a65e380490999c169fa69628fe3b"
|
||||
},
|
||||
"cargo/desktop-3/stdout.log": {
|
||||
"bytes": 307286,
|
||||
"sha256": "c91fae7883b55901a2c3ab249650c2bb12a991e744a09c18159ffb3bf0079650"
|
||||
},
|
||||
"cargo/format-1/process.json": {
|
||||
"bytes": 116,
|
||||
"sha256": "d316037b78abff45a450b1c116d0c214d1d3831b6c375538779959e1dec652fb"
|
||||
},
|
||||
"cargo/format-1/result.json": {
|
||||
"bytes": 1871,
|
||||
"sha256": "2216bb25ce81504c61353456823ec38d77703dd6747f80f2d53b4267799ce21c"
|
||||
},
|
||||
"cargo/format-1/started.json": {
|
||||
"bytes": 1483,
|
||||
"sha256": "415e0776ec74ee486f2895e3581a8f78308dda9142d4e542442db9979408788b"
|
||||
},
|
||||
"cargo/format-1/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"cargo/format-1/stdout.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"cargo/lint-1/process.json": {
|
||||
"bytes": 195,
|
||||
"sha256": "286ba22c1994dfd70834adf811c103057724942f85fa5fbfa22e75e563ac376d"
|
||||
},
|
||||
"cargo/lint-1/result.json": {
|
||||
"bytes": 1806,
|
||||
"sha256": "7be8d8e2add4ceb69d5814326e4db91c33e804608e0998323dd72d388cf88def"
|
||||
},
|
||||
"cargo/lint-1/started.json": {
|
||||
"bytes": 1409,
|
||||
"sha256": "2fba3385528cf09df0382cbf4ec3867cdd109daad6de3fbfbc3663dbde7a1610"
|
||||
},
|
||||
"cargo/lint-1/stderr.log": {
|
||||
"bytes": 166,
|
||||
"sha256": "649dcf5fdf4a79dc2f3b315ef9e6735af44b50c40526c8593d2ce54a834a809d"
|
||||
},
|
||||
"cargo/lint-1/stdout.log": {
|
||||
"bytes": 271410,
|
||||
"sha256": "c7085d514e4dbdfc7c3b633911793071e13c27775edfe7ca8cc8f02b70219804"
|
||||
},
|
||||
"cargo/lint-2/process.json": {
|
||||
"bytes": 196,
|
||||
"sha256": "d6370e0e1aede61d5cae46028a6a7bab00e25429d1539e0989ef369d318d06c7"
|
||||
},
|
||||
"cargo/lint-2/result.json": {
|
||||
"bytes": 1988,
|
||||
"sha256": "0b5458c8567fa43a40c2fcf810999c0bc565d56635ff6fdb9484d79d88c69108"
|
||||
},
|
||||
"cargo/lint-2/started.json": {
|
||||
"bytes": 1593,
|
||||
"sha256": "4923e64c03112589eea0c15e3d67f66a94e4fdc1012356f24d67aad94142f386"
|
||||
},
|
||||
"cargo/lint-2/stderr.log": {
|
||||
"bytes": 207,
|
||||
"sha256": "d48449d9fa8226c728f9c979d930e91ebd55b84266edd3f7fb308b88a6451009"
|
||||
},
|
||||
"cargo/lint-2/stdout.log": {
|
||||
"bytes": 309558,
|
||||
"sha256": "de51e727c694ce4f35e4e732ab820488da053470538f20bdbffd55970eb2caad"
|
||||
},
|
||||
"cargo/native-build-1/process.json": {
|
||||
"bytes": 175,
|
||||
"sha256": "30f54028726b906c20cc9b7b0c7c965e3f1e54e6d4d54d99088da6b1c65c2f5e"
|
||||
},
|
||||
"cargo/native-build-1/result.json": {
|
||||
"bytes": 3311,
|
||||
"sha256": "03c22f6269b023f77d0fb3e713d5bbab8d14cf6e67ab4dfc613b4691fe4a6955"
|
||||
},
|
||||
"cargo/native-build-1/started.json": {
|
||||
"bytes": 1552,
|
||||
"sha256": "340989981b2db65bb194883c1a608f60cacf9a31d36a930dc39da28f5224cb88"
|
||||
},
|
||||
"cargo/native-build-1/stderr.log": {
|
||||
"bytes": 131,
|
||||
"sha256": "781b5778b0e781b52c25f5342c9c25d3fc45fe7c0da5bf5c94c86ba80ba7e2d2"
|
||||
},
|
||||
"cargo/native-build-1/stdout.log": {
|
||||
"bytes": 41724,
|
||||
"sha256": "5da6c22e3eef843f8be4539a7692e212c0c74461aaf4bf72ce2dd651abe165ac"
|
||||
},
|
||||
"cargo/windows-build-1/process.json": {
|
||||
"bytes": 137,
|
||||
"sha256": "2414e8af081cb683edbee3d6b89e5a323b08cce449058d453bffbc9736c1ea12"
|
||||
},
|
||||
"cargo/windows-build-1/result.json": {
|
||||
"bytes": 3193,
|
||||
"sha256": "172faec4d7708e4539468c3a9062d424f0e00cb80e827cd579274942c757eccb"
|
||||
},
|
||||
"cargo/windows-build-1/started.json": {
|
||||
"bytes": 1504,
|
||||
"sha256": "fefb683ef0e99046f5a18cbad56b8bb8bddc45b8abd322cb2c1d83e2acb26565"
|
||||
},
|
||||
"cargo/windows-build-1/stderr.log": {
|
||||
"bytes": 137,
|
||||
"sha256": "f75aa57fe559820a680c771701ea5737995528f29d7dae20e2ae265c07c0b8bb"
|
||||
},
|
||||
"cargo/windows-build-1/stdout.log": {
|
||||
"bytes": 284179,
|
||||
"sha256": "04422dbc4d720707d951d0654da39921c0a526b0eb0c33088a3a7e0d85686c31"
|
||||
},
|
||||
"helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py": {
|
||||
"bytes": 3827,
|
||||
"sha256": "1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20"
|
||||
},
|
||||
"helpers/6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06.py": {
|
||||
"bytes": 3502,
|
||||
"sha256": "6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
"""Package explicitly selected closed gate captures without running Cargo."""
|
||||
from pathlib import Path
|
||||
import argparse
|
||||
import json
|
||||
import zipfile
|
||||
from verify import RAW_FILES, pin, parsed, need, run_name, verify_data, verify_package
|
||||
|
||||
HERE = Path(__file__).resolve().parent
|
||||
|
||||
|
||||
def collect(root, runs, helpers):
|
||||
gates = root / ".local/state-group-gates"
|
||||
candidates = sorted(gates.glob("*.py")) + helpers
|
||||
helper_bytes = [path.read_bytes() for path in candidates]
|
||||
payload, logical, specs = {}, {}, {}
|
||||
def add(name, data):
|
||||
stored = ("capsules/" + pin(data)["sha256"] + Path(name).suffix
|
||||
if name.rsplit("/", 1)[1] in {"inputs.json", "inputs.zip"} else name)
|
||||
need(stored not in payload or payload[stored] == data, "deduplication collision")
|
||||
payload[stored] = data
|
||||
logical[name] = stored
|
||||
for run in runs:
|
||||
folder = gates / run
|
||||
need(folder.is_dir(), "run directory missing: " + run)
|
||||
paths = list(folder.iterdir())
|
||||
need(all(path.is_file() and not path.is_symlink() for path in paths)
|
||||
and {path.name for path in paths} == RAW_FILES, "exact closed raw files required: " + run)
|
||||
raw = {path.name: path.read_bytes() for path in paths}
|
||||
result = parsed(raw["result.json"])
|
||||
need("finish" in result and result["inputsUnchanged"] is True, "unfinished/changed run refused: " + run)
|
||||
matches = [data for data in helper_bytes if pin(data) == result["helper"]]
|
||||
need(bool(matches), "exact historical helper unavailable for " + run + "; supply --helper PATH")
|
||||
helper = "helpers/" + result["helper"]["sha256"] + ".py"
|
||||
add(helper, matches[0])
|
||||
for name, data in sorted(raw.items()):
|
||||
add("cargo/" + run + "/" + name, data)
|
||||
specs[run] = {key: result[key] for key in ("command", "head", "exitCode", "inputCount")}
|
||||
specs[run]["helper"] = helper
|
||||
manifest = {"schema": 1, "kind": "multiselect-cargo-gates", "runs": specs,
|
||||
"logicalFiles": dict(sorted(logical.items())),
|
||||
"members": {name: pin(data) for name, data in sorted(payload.items())}}
|
||||
summary = verify_data(manifest, payload.__getitem__)
|
||||
return payload, manifest, summary
|
||||
|
||||
|
||||
def write_json(path, value):
|
||||
with path.open("xb") as output:
|
||||
output.write((json.dumps(value, indent=2) + "\n").encode("utf-8"))
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--root", type=Path, required=True, help="checkout holding .local/state-group-gates")
|
||||
parser.add_argument("--runs", nargs="+", required=True, help="explicit run names, including failures to retain")
|
||||
parser.add_argument("--helper", type=Path, action="append", default=[], help="additional exact historical helper (repeatable)")
|
||||
parser.add_argument("--output", type=Path, default=HERE, help="package directory; existing evidence is never overwritten")
|
||||
parser.add_argument("--check-only", action="store_true", help="validate raw captures in memory without creating an archive")
|
||||
args = parser.parse_args()
|
||||
need(all(run_name(run) for run in args.runs) and len(args.runs) == len(set(args.runs)), "unique safe run names required")
|
||||
payload, manifest, summary = collect(args.root.resolve(), args.runs, args.helper)
|
||||
if args.check_only:
|
||||
print("PASS raw consistency; no package written:", summary)
|
||||
return
|
||||
out = args.output.resolve()
|
||||
out.mkdir(parents=True, exist_ok=True)
|
||||
for name in ("evidence.zip", "manifest.json", "files.json"):
|
||||
need(not (out / name).exists(), "existing package output refused: " + name)
|
||||
for name in ("prepare.py", "verify.py", "README.md"):
|
||||
data = (HERE / name).read_bytes()
|
||||
destination = out / name
|
||||
if destination.exists():
|
||||
need(destination.read_bytes() == data, "different existing package tool: " + name)
|
||||
else:
|
||||
with destination.open("xb") as output:
|
||||
output.write(data)
|
||||
with zipfile.ZipFile(out / "evidence.zip", "x", compression=zipfile.ZIP_DEFLATED, compresslevel=9) as archive:
|
||||
for name, data in sorted(payload.items()):
|
||||
info = zipfile.ZipInfo(name, date_time=(2026, 9, 23, 0, 0, 0))
|
||||
info.compress_type = zipfile.ZIP_DEFLATED
|
||||
info.external_attr = 0o100644 << 16
|
||||
archive.writestr(info, data)
|
||||
write_json(out / "manifest.json", manifest)
|
||||
names = ("prepare.py", "verify.py", "README.md", "manifest.json", "evidence.zip")
|
||||
write_json(out / "files.json", {name: pin((out / name).read_bytes()) for name in names})
|
||||
need(verify_package(out) == summary, "written package differs from validated captures")
|
||||
print("PASS package readback:", out, summary)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,164 @@
|
||||
"""Offline consistency checks only; never execute or extract archived inputs."""
|
||||
from pathlib import Path, PurePosixPath
|
||||
from datetime import datetime
|
||||
import argparse
|
||||
import hashlib
|
||||
import io
|
||||
import json
|
||||
import math
|
||||
import re
|
||||
import stat
|
||||
import zipfile
|
||||
|
||||
RAW_FILES = {"started.json", "process.json", "result.json", "stdout.log", "stderr.log", "inputs.json", "inputs.zip"}
|
||||
OUTER_FILES = {"prepare.py", "verify.py", "README.md", "manifest.json", "evidence.zip"}
|
||||
|
||||
|
||||
def need(condition, message):
|
||||
if not condition:
|
||||
raise ValueError(message)
|
||||
|
||||
|
||||
def pin(data):
|
||||
return {"bytes": len(data), "sha256": hashlib.sha256(data).hexdigest()}
|
||||
|
||||
|
||||
def valid_pin(value):
|
||||
return (isinstance(value, dict) and set(value) == {"bytes", "sha256"}
|
||||
and type(value["bytes"]) is int and value["bytes"] >= 0
|
||||
and isinstance(value["sha256"], str)
|
||||
and re.fullmatch(r"[0-9a-f]{64}", value["sha256"]) is not None)
|
||||
|
||||
|
||||
def safe(name):
|
||||
return (isinstance(name, str) and bool(name) and "\\" not in name and ":" not in name
|
||||
and all(ord(char) >= 32 for char in name)
|
||||
and not PurePosixPath(name).is_absolute()
|
||||
and all(part not in ("", ".", "..") for part in name.split("/")))
|
||||
|
||||
|
||||
def run_name(name):
|
||||
return isinstance(name, str) and re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9._-]*", name) is not None
|
||||
|
||||
|
||||
def parsed(data):
|
||||
def pairs(items):
|
||||
result = {}
|
||||
for key, value in items:
|
||||
need(key not in result, "duplicate JSON key: " + key)
|
||||
result[key] = value
|
||||
return result
|
||||
def constant(value):
|
||||
raise ValueError("nonfinite JSON constant: " + value)
|
||||
return json.loads(data, object_pairs_hook=pairs, parse_constant=constant)
|
||||
|
||||
|
||||
def inventory(archive, expected):
|
||||
names = archive.namelist()
|
||||
need(len(names) == len(set(names)) and set(names) == set(expected), "exact ZIP membership")
|
||||
for entry in archive.infolist():
|
||||
need(safe(entry.filename) and not entry.is_dir(), "unsafe ZIP member: " + entry.filename)
|
||||
need(not stat.S_ISLNK(entry.external_attr >> 16), "ZIP symlink: " + entry.filename)
|
||||
need(valid_pin(expected[entry.filename]), "invalid member pin: " + entry.filename)
|
||||
need(entry.file_size == expected[entry.filename]["bytes"], "ZIP recorded size: " + entry.filename)
|
||||
|
||||
|
||||
def ordered_times(*values):
|
||||
times = [datetime.fromisoformat(value) for value in values]
|
||||
return all(value.utcoffset() is not None for value in times) and times == sorted(times)
|
||||
|
||||
|
||||
def verify_data(manifest, read):
|
||||
"""Shared read-only verifier for packaged bytes or prepare's in-memory payload."""
|
||||
need(manifest["schema"] == 1 and manifest["kind"] == "multiselect-cargo-gates", "manifest schema")
|
||||
runs, logical, stored = manifest["runs"], manifest["logicalFiles"], manifest["members"]
|
||||
need(isinstance(runs, dict) and bool(runs) and all(run_name(run) for run in runs), "explicit run inventory")
|
||||
need(all(safe(name) for name in logical) and all(safe(name) for name in stored), "unsafe manifest path")
|
||||
need(set(logical.values()) == set(stored), "unreferenced or absent stored members")
|
||||
for name, expected in stored.items():
|
||||
need(valid_pin(expected) and pin(read(name)) == expected, "stored member hash: " + name)
|
||||
expected_logical = {"cargo/" + run + "/" + name for run in runs for name in RAW_FILES}
|
||||
expected_logical.update(spec["helper"] for spec in runs.values())
|
||||
need(set(logical) == expected_logical, "exact logical raw/helper inventory")
|
||||
for name, destination in logical.items():
|
||||
if name.startswith("cargo/") and name.rsplit("/", 1)[1] in {"inputs.json", "inputs.zip"}:
|
||||
expected = "capsules/" + stored[destination]["sha256"] + PurePosixPath(name).suffix
|
||||
need(destination == expected, "input capsule mapping: " + name)
|
||||
else:
|
||||
need(destination == name, "only input maps/archives may be deduplicated: " + name)
|
||||
def raw(name):
|
||||
return read(logical[name])
|
||||
seen_capsules = set()
|
||||
for run, spec in runs.items():
|
||||
prefix = "cargo/" + run + "/"
|
||||
start = parsed(raw(prefix + "started.json"))
|
||||
process = parsed(raw(prefix + "process.json"))
|
||||
result = parsed(raw(prefix + "result.json"))
|
||||
required_start = {"start", "command", "cwd", "head", "scope", "inputs", "archive",
|
||||
"inputCount", "environment", "helper", "cargo", "rustc"}
|
||||
need(required_start <= start.keys(), run + ": incomplete start receipt")
|
||||
need(all(result.get(key) == value for key, value in start.items()), run + ": start/result relationship")
|
||||
command = result["command"]
|
||||
need(isinstance(command, list) and command and command[0] == "cargo"
|
||||
and all(isinstance(arg, str) for arg in command), run + ": Cargo command")
|
||||
need(command == process["command"] == spec["command"], run + ": command relationship")
|
||||
need(result["head"] == spec["head"] and re.fullmatch(r"(?:[0-9a-f]{40}|[0-9a-f]{64})", result["head"]), run + ": HEAD")
|
||||
need(type(result["exitCode"]) is int and result["exitCode"] == spec["exitCode"], run + ": recorded exit")
|
||||
need(result["inputsUnchanged"] is True, run + ": changed inputs refused")
|
||||
need(type(result["seconds"]) in (int, float) and math.isfinite(result["seconds"])
|
||||
and result["seconds"] >= 0, run + ": duration")
|
||||
need(type(process["pid"]) is int and process["pid"] > 0, run + ": process identity")
|
||||
need(ordered_times(start["start"], process["observed"], result["finish"]), run + ": completed timestamp order")
|
||||
for field, filename in [("inputs", "inputs.json"), ("archive", "inputs.zip"), ("stdout", "stdout.log"), ("stderr", "stderr.log")]:
|
||||
need(result[field] == pin(raw(prefix + filename)), run + ": " + field + " pin")
|
||||
need(valid_pin(result["helper"]) and result["helper"] == pin(raw(spec["helper"])), run + ": helper pin")
|
||||
need(spec["helper"] == "helpers/" + result["helper"]["sha256"] + ".py", run + ": helper mapping")
|
||||
inputs = parsed(raw(prefix + "inputs.json"))
|
||||
need(isinstance(inputs, dict) and all(safe(name) for name in inputs), run + ": safe input inventory")
|
||||
need(type(result["inputCount"]) is int and len(inputs) == result["inputCount"] == spec["inputCount"], run + ": input counts")
|
||||
need(sum(name.startswith("crates/vendor/iced_widget/") for name in inputs) == 71, run + ": vendor count")
|
||||
capsule = (logical[prefix + "inputs.json"], logical[prefix + "inputs.zip"])
|
||||
if capsule not in seen_capsules:
|
||||
with zipfile.ZipFile(io.BytesIO(raw(prefix + "inputs.zip"))) as source:
|
||||
inventory(source, inputs)
|
||||
for name, expected in inputs.items():
|
||||
need(pin(source.read(name)) == expected, run + ": source hash " + name)
|
||||
seen_capsules.add(capsule)
|
||||
artifacts = []
|
||||
for line in raw(prefix + "stdout.log").decode("utf-8", errors="replace").splitlines():
|
||||
try:
|
||||
value = json.loads(line)
|
||||
except json.JSONDecodeError:
|
||||
continue
|
||||
if isinstance(value, dict) and value.get("reason") == "compiler-artifact" and value.get("executable"):
|
||||
artifacts.append(value)
|
||||
need(isinstance(result["artifacts"], list), run + ": artifact records")
|
||||
need(artifacts == [record["cargo"] for record in result["artifacts"]], run + ": Cargo JSON artifact relationship")
|
||||
for record in result["artifacts"]:
|
||||
need(set(record) == {"cargo", "readback"}
|
||||
and (record["readback"] is None or valid_pin(record["readback"])), run + ": artifact readback pin")
|
||||
print(run, "recorded exit", result["exitCode"], "inputs", len(inputs), "executable records", len(artifacts))
|
||||
return {"runs": len(runs), "logicalFiles": len(logical), "storedMembers": len(stored), "sourceCapsulePairs": len(seen_capsules)}
|
||||
|
||||
|
||||
def verify_package(root):
|
||||
files = parsed((root / "files.json").read_bytes())
|
||||
need(set(files) == OUTER_FILES, "outer file inventory")
|
||||
for name, expected in files.items():
|
||||
need(valid_pin(expected) and pin((root / name).read_bytes()) == expected, "outer hash: " + name)
|
||||
manifest = parsed((root / "manifest.json").read_bytes())
|
||||
with zipfile.ZipFile(root / "evidence.zip") as archive:
|
||||
inventory(archive, manifest["members"])
|
||||
return verify_data(manifest, archive.read)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("package", nargs="?", type=Path, default=Path(__file__).resolve().parent)
|
||||
args = parser.parse_args()
|
||||
print("PASS offline consistency:", verify_package(args.package))
|
||||
print("Historical receipts only; no source/binary execution or native acceptance claim.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,18 @@
|
||||
# Core-1 capture incident
|
||||
|
||||
The original Cargo command recorded exit 0 and eleven tests passing, but
|
||||
inputsUnchanged is false. Its source archive differs from its earlier input map
|
||||
only in crates/oa-desktop/src/model_menu.rs (44572 versus 44757 bytes).
|
||||
This is an invalid capture for normal gate evidence and is never counted as one.
|
||||
A later unchanged capture must supply the accepted core gate.
|
||||
|
||||
The fixed identity file pins the exact original seven raw files and gate helper,
|
||||
and the exact two byte hashes for the sole map/archive mismatch. The incident
|
||||
verifier requires that known mismatch and rejects any other mismatch. It does not
|
||||
repair or rewrite raw receipts, source bytes, or the false unchanged-input flag.
|
||||
|
||||
Use `python -B prepare.py --root CHECKOUT --check-only` to verify originals.
|
||||
After review, omit --check-only and supply --output NEW_DIRECTORY. This copies
|
||||
seven raw files, helper, identity and tools without wrapping a new ZIP. The raw
|
||||
inputs.zip remains byte-identical. Verify with `python -B verify.py PACKAGE`.
|
||||
Pin consistency records an incident; it does not prove the cause or execution.
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -0,0 +1 @@
|
||||
{"pid": 772, "observed": "2026-09-23T09:44:19.087478+00:00", "command": ["cargo", "test", "-p", "oa-core", "--example", "state_multiselect_native", "--message-format=json", "--", "--test-threads=1"]}
|
||||
@@ -0,0 +1,91 @@
|
||||
{
|
||||
"start": "2026-09-23T09:44:18.183228+00:00",
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"--example",
|
||||
"state_multiselect_native",
|
||||
"--message-format=json",
|
||||
"--",
|
||||
"--test-threads=1"
|
||||
],
|
||||
"cwd": "C:\\ar-multiselect-9e8r6t",
|
||||
"head": "7e348d967d1787c052a145b7448636613a6a7054",
|
||||
"scope": "All Git-visible Cargo manifests/lock, crates (including patched dependency), build, .cargo, docs, examples, harness fixtures, compiled prototypes, and packaging scripts; all 71 tracked vendored files included",
|
||||
"inputs": {
|
||||
"bytes": 122682,
|
||||
"sha256": "81318b52a4f2659f0687bfa459c7e3a24f39996dd5a8b6d7f21c3c78fa16c3b4"
|
||||
},
|
||||
"archive": {
|
||||
"bytes": 2947000,
|
||||
"sha256": "cecd6ae0ba45add8e913d9913cd4960c01928db0a4bc795902b7954ffb6f692e"
|
||||
},
|
||||
"inputCount": 733,
|
||||
"environment": {
|
||||
"RUSTUP_TOOLCHAIN": "stable-x86_64-pc-windows-gnullvm",
|
||||
"CARGO_HOME": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo",
|
||||
"CARGO_TARGET_DIR": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm",
|
||||
"CARGO_BUILD_JOBS": "1",
|
||||
"CARGO_INCREMENTAL": "0"
|
||||
},
|
||||
"helper": {
|
||||
"bytes": 3502,
|
||||
"sha256": "6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06"
|
||||
},
|
||||
"cargo": "cargo 1.98.1 (797e8a9bc 2026-08-05)",
|
||||
"rustc": "rustc 1.98.1 (48a229cea 2026-09-01)",
|
||||
"finish": "2026-09-23T09:44:55.179378+00:00",
|
||||
"seconds": 36.09660960000474,
|
||||
"exitCode": 0,
|
||||
"inputsUnchanged": false,
|
||||
"stdout": {
|
||||
"bytes": 42721,
|
||||
"sha256": "93c11a194e1c97abcdbce56c9b45be479bd1e60cfa5ecd873773246a696d146d"
|
||||
},
|
||||
"stderr": {
|
||||
"bytes": 320,
|
||||
"sha256": "1b7e7597c4c20f47faf6695a257cc32bfce21b7fedcbf3a57cac6ea40114cd22"
|
||||
},
|
||||
"artifacts": [
|
||||
{
|
||||
"cargo": {
|
||||
"reason": "compiler-artifact",
|
||||
"package_id": "path+file:///C:/ar-multiselect-9e8r6t/crates/oa-core#0.2.0",
|
||||
"manifest_path": "C:\\ar-multiselect-9e8r6t\\crates\\oa-core\\Cargo.toml",
|
||||
"target": {
|
||||
"kind": [
|
||||
"example"
|
||||
],
|
||||
"crate_types": [
|
||||
"bin"
|
||||
],
|
||||
"name": "state_multiselect_native",
|
||||
"src_path": "C:\\ar-multiselect-9e8r6t\\crates\\oa-core\\examples\\state_multiselect_native.rs",
|
||||
"edition": "2024",
|
||||
"doc": false,
|
||||
"doctest": false,
|
||||
"test": false
|
||||
},
|
||||
"profile": {
|
||||
"opt_level": "0",
|
||||
"debuginfo": 0,
|
||||
"debug_assertions": true,
|
||||
"overflow_checks": true,
|
||||
"test": true
|
||||
},
|
||||
"features": [],
|
||||
"filenames": [
|
||||
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\examples\\state_multiselect_native-d2e54d8aa041abf6.exe"
|
||||
],
|
||||
"executable": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\examples\\state_multiselect_native-d2e54d8aa041abf6.exe",
|
||||
"fresh": false
|
||||
},
|
||||
"readback": {
|
||||
"bytes": 25410048,
|
||||
"sha256": "1c77465fc9c95e0a7079e23fa534c6f8e469b8b8b3a258fc8cdd47e02ff183c7"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"start": "2026-09-23T09:44:18.183228+00:00",
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"--example",
|
||||
"state_multiselect_native",
|
||||
"--message-format=json",
|
||||
"--",
|
||||
"--test-threads=1"
|
||||
],
|
||||
"cwd": "C:\\ar-multiselect-9e8r6t",
|
||||
"head": "7e348d967d1787c052a145b7448636613a6a7054",
|
||||
"scope": "All Git-visible Cargo manifests/lock, crates (including patched dependency), build, .cargo, docs, examples, harness fixtures, compiled prototypes, and packaging scripts; all 71 tracked vendored files included",
|
||||
"inputs": {
|
||||
"bytes": 122682,
|
||||
"sha256": "81318b52a4f2659f0687bfa459c7e3a24f39996dd5a8b6d7f21c3c78fa16c3b4"
|
||||
},
|
||||
"archive": {
|
||||
"bytes": 2947000,
|
||||
"sha256": "cecd6ae0ba45add8e913d9913cd4960c01928db0a4bc795902b7954ffb6f692e"
|
||||
},
|
||||
"inputCount": 733,
|
||||
"environment": {
|
||||
"RUSTUP_TOOLCHAIN": "stable-x86_64-pc-windows-gnullvm",
|
||||
"CARGO_HOME": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo",
|
||||
"CARGO_TARGET_DIR": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm",
|
||||
"CARGO_BUILD_JOBS": "1",
|
||||
"CARGO_INCREMENTAL": "0"
|
||||
},
|
||||
"helper": {
|
||||
"bytes": 3502,
|
||||
"sha256": "6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06"
|
||||
},
|
||||
"cargo": "cargo 1.98.1 (797e8a9bc 2026-08-05)",
|
||||
"rustc": "rustc 1.98.1 (48a229cea 2026-09-01)"
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
Compiling oa-core v0.2.0 (C:\ar-multiselect-9e8r6t\crates\oa-core)
|
||||
Finished `test` profile [unoptimized] target(s) in 28.51s
|
||||
Running unittests examples\state_multiselect_native.rs (C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\examples\state_multiselect_native-d2e54d8aa041abf6.exe)
|
||||
@@ -0,0 +1,67 @@
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.107","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\proc-macro2-1.0.107\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\proc-macro2-1.0.107\\build.rs","edition":"2021","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","proc-macro"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\proc-macro2-8bd275bc14efcc6d\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.107","linked_libs":[],"linked_paths":[],"cfgs":["wrap_proc_macro","proc_macro_span_location","proc_macro_span_file"],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\proc-macro2-678fa29727a3d951\\out"}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#unicode-ident@1.0.24","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\unicode-ident-1.0.24\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"unicode_ident","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\unicode-ident-1.0.24\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libunicode_ident-37cacd323a49429c.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libunicode_ident-37cacd323a49429c.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#quote@1.0.47","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\quote-1.0.47\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\quote-1.0.47\\build.rs","edition":"2021","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","proc-macro"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\quote-78b7b00c15767e2b\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#quote@1.0.47","linked_libs":[],"linked_paths":[],"cfgs":[],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\quote-db749d68bbb2dbfe\\out"}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.107","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\proc-macro2-1.0.107\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"proc_macro2","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\proc-macro2-1.0.107\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","proc-macro"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libproc_macro2-80e9e45547beebf5.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libproc_macro2-80e9e45547beebf5.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#quote@1.0.47","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\quote-1.0.47\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"quote","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\quote-1.0.47\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","proc-macro"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libquote-b79aec363b458000.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libquote-b79aec363b458000.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#autocfg@1.5.1","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\autocfg-1.5.1\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"autocfg","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\autocfg-1.5.1\\src\\lib.rs","edition":"2015","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libautocfg-58f70baf3de29c77.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libautocfg-58f70baf3de29c77.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde_core@1.0.229","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_core-1.0.229\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_core-1.0.229\\build.rs","edition":"2021","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["result","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\serde_core-161b3ae2683262f1\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde_core@1.0.229","linked_libs":[],"linked_paths":[],"cfgs":[],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\serde_core-a1da37301c02ee2a\\out"}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#num-traits@0.2.19","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\num-traits-0.2.19\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\num-traits-0.2.19\\build.rs","edition":"2021","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","i128","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\num-traits-34ffb4c64e9b5e22\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#syn@3.0.5","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\syn-3.0.5\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"syn","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\syn-3.0.5\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["clone-impls","default","derive","parsing","printing","proc-macro"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libsyn-2232b8c89352da95.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libsyn-2232b8c89352da95.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#getrandom@0.4.3","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\getrandom-0.4.3\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\getrandom-0.4.3\\build.rs","edition":"2024","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\getrandom-168cb7f91c8645ca\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#windows-link@0.2.1","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\windows-link-0.2.1\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"windows_link","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\windows-link-0.2.1\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libwindows_link-23f115c823619f71.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libwindows_link-23f115c823619f71.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#windows-sys@0.61.2","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\windows-sys-0.61.2\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"windows_sys","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\windows-sys-0.61.2\\src\\lib.rs","edition":"2021","doc":true,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["Win32","Win32_Foundation","Win32_Storage","Win32_Storage_FileSystem","Win32_System","Win32_System_Console","Win32_System_SystemInformation","default"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libwindows_sys-43b3d9a205b229b7.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libwindows_sys-43b3d9a205b229b7.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#getrandom@0.4.3","linked_libs":[],"linked_paths":[],"cfgs":[],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\getrandom-4967b63cf7b288b8\\out"}
|
||||
{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#num-traits@0.2.19","linked_libs":[],"linked_paths":[],"cfgs":["has_total_cmp"],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\num-traits-418230edfe1b6b90\\out"}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde_core@1.0.229","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_core-1.0.229\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"serde_core","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_core-1.0.229\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["result","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libserde_core-f52ac0796dd4fc39.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libserde_core-f52ac0796dd4fc39.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#zmij@1.0.23","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\zmij-1.0.23\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\zmij-1.0.23\\build.rs","edition":"2021","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\zmij-e8f67a20243f3063\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.4","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\cfg-if-1.0.4\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"cfg_if","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\cfg-if-1.0.4\\src\\lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libcfg_if-805b2ebc84d544f1.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libcfg_if-805b2ebc84d544f1.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#getrandom@0.4.3","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\getrandom-0.4.3\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"getrandom","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\getrandom-0.4.3\\src\\lib.rs","edition":"2024","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libgetrandom-6e8efb5a01ff0cbb.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libgetrandom-6e8efb5a01ff0cbb.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#zmij@1.0.23","linked_libs":[],"linked_paths":[],"cfgs":[],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\zmij-c8f8f3187a72be14\\out"}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#num-traits@0.2.19","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\num-traits-0.2.19\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"num_traits","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\num-traits-0.2.19\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","i128","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libnum_traits-49c57447e2766d62.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libnum_traits-49c57447e2766d62.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#thiserror@2.0.20","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\thiserror-2.0.20\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\thiserror-2.0.20\\build.rs","edition":"2021","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\thiserror-d9d1cecb0b9dfa9d\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde@1.0.229","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde-1.0.229\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde-1.0.229\\build.rs","edition":"2021","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","derive","serde_derive","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\serde-c9911adbe87e85d2\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde_json@1.0.151","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_json-1.0.151\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_json-1.0.151\\build.rs","edition":"2021","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\serde_json-28521d5277e5c15b\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde_json@1.0.151","linked_libs":[],"linked_paths":[],"cfgs":["fast_arithmetic=\"64\""],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\serde_json-908788f6700df5fb\\out"}
|
||||
{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde@1.0.229","linked_libs":[],"linked_paths":[],"cfgs":["if_docsrs_then_no_serde_core"],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\serde-963672309bf9e4ba\\out"}
|
||||
{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#thiserror@2.0.20","linked_libs":[],"linked_paths":[],"cfgs":[],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\thiserror-2e28320913ae6f8a\\out"}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#num-integer@0.1.47","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\num-integer-0.1.47\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"num_integer","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\num-integer-0.1.47\\src\\lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","i128","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libnum_integer-cf43e8f5b615e1d9.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libnum_integer-cf43e8f5b615e1d9.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#zmij@1.0.23","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\zmij-1.0.23\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"zmij","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\zmij-1.0.23\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libzmij-9f8770986f00ef15.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libzmij-9f8770986f00ef15.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#winapi-util@0.1.11","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\winapi-util-0.1.11\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"winapi_util","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\winapi-util-0.1.11\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libwinapi_util-be9ab0847edf5b05.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libwinapi_util-be9ab0847edf5b05.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#thiserror-impl@2.0.20","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\thiserror-impl-2.0.20\\Cargo.toml","target":{"kind":["proc-macro"],"crate_types":["proc-macro"],"name":"thiserror_impl","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\thiserror-impl-2.0.20\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\thiserror_impl-774eb7636a800724.dll","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libthiserror_impl-774eb7636a800724.dll.a"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde_derive@1.0.229","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_derive-1.0.229\\Cargo.toml","target":{"kind":["proc-macro"],"crate_types":["proc-macro"],"name":"serde_derive","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_derive-1.0.229\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\serde_derive-c07a6353fdd1d8a1.dll","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libserde_derive-c07a6353fdd1d8a1.dll.a"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#once_cell@1.21.4","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\once_cell-1.21.4\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"once_cell","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\once_cell-1.21.4\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["alloc","race","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libonce_cell-f7e62c44737ecbb9.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libonce_cell-f7e62c44737ecbb9.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#sha1_smol@1.0.1","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\sha1_smol-1.0.1\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"sha1_smol","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\sha1_smol-1.0.1\\src\\lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libsha1_smol-c4b7e5ec8b41792e.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libsha1_smol-c4b7e5ec8b41792e.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#memchr@2.8.3","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\memchr-2.8.3\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"memchr","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\memchr-2.8.3\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["alloc","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libmemchr-088af8780d4df76d.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libmemchr-088af8780d4df76d.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#itoa@1.0.18","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\itoa-1.0.18\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"itoa","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\itoa-1.0.18\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libitoa-971c3e13d32ffcf2.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libitoa-971c3e13d32ffcf2.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"path+file:///C:/ar-multiselect-9e8r6t/crates/oa-core#0.2.0","manifest_path":"C:\\ar-multiselect-9e8r6t\\crates\\oa-core\\Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"C:\\ar-multiselect-9e8r6t\\crates\\oa-core\\build.rs","edition":"2024","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\oa-core-1fac039e071a74d1\\build-script-build.exe"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#fastrand@2.5.0","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\fastrand-2.5.0\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"fastrand","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\fastrand-2.5.0\\src\\lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["alloc","default","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libfastrand-3df248e815d242e1.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libfastrand-3df248e815d242e1.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#tempfile@3.27.0","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\tempfile-3.27.0\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"tempfile","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\tempfile-3.27.0\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","getrandom"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libtempfile-20c336358d7a22b5.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libtempfile-20c336358d7a22b5.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"build-script-executed","package_id":"path+file:///C:/ar-multiselect-9e8r6t/crates/oa-core#0.2.0","linked_libs":[],"linked_paths":[],"cfgs":[],"env":[],"out_dir":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\oa-core-70aec2be9e005f38\\out"}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde_json@1.0.151","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_json-1.0.151\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"serde_json","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde_json-1.0.151\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libserde_json-b48005beba7e4267.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libserde_json-b48005beba7e4267.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#uuid@1.26.0","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\uuid-1.26.0\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"uuid","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\uuid-1.26.0\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","rng","serde","sha1","std","v4","v5"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libuuid-f7851e8936dae115.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libuuid-f7851e8936dae115.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#serde@1.0.229","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde-1.0.229\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"serde","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\serde-1.0.229\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","derive","serde_derive","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libserde-968c91fb77bb5d38.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libserde-968c91fb77bb5d38.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#thiserror@2.0.20","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\thiserror-2.0.20\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"thiserror","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\thiserror-2.0.20\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libthiserror-add096f46a35d6d2.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libthiserror-add096f46a35d6d2.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#same-file@1.0.6","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\same-file-1.0.6\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"same_file","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\same-file-1.0.6\\src\\lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libsame_file-a21d6395ce590b18.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libsame_file-a21d6395ce590b18.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#num-bigint@0.5.1","manifest_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\num-bigint-0.5.1\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"num_bigint","src_path":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\num-bigint-0.5.1\\src\\lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","std"],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libnum_bigint-7e87a41b738c784b.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libnum_bigint-7e87a41b738c784b.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"path+file:///C:/ar-multiselect-9e8r6t/crates/oa-core#0.2.0","manifest_path":"C:\\ar-multiselect-9e8r6t\\crates\\oa-core\\Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"oa_core","src_path":"C:\\ar-multiselect-9e8r6t\\crates\\oa-core\\src\\lib.rs","edition":"2024","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\liboa_core-b1d9f219f5e0886b.rlib","C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\liboa_core-b1d9f219f5e0886b.rmeta"],"executable":null,"fresh":true}
|
||||
{"reason":"compiler-artifact","package_id":"path+file:///C:/ar-multiselect-9e8r6t/crates/oa-core#0.2.0","manifest_path":"C:\\ar-multiselect-9e8r6t\\crates\\oa-core\\Cargo.toml","target":{"kind":["example"],"crate_types":["bin"],"name":"state_multiselect_native","src_path":"C:\\ar-multiselect-9e8r6t\\crates\\oa-core\\examples\\state_multiselect_native.rs","edition":"2024","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":true},"features":[],"filenames":["C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\examples\\state_multiselect_native-d2e54d8aa041abf6.exe"],"executable":"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\examples\\state_multiselect_native-d2e54d8aa041abf6.exe","fresh":false}
|
||||
{"reason":"build-finished","success":true}
|
||||
|
||||
running 11 tests
|
||||
test tests::generated_json_and_real_source_bundle_are_accepted_unchanged ... ok
|
||||
test tests::hide_must_preserve_child_routes_and_semantic_objects ... ok
|
||||
test tests::internal_pins_left_behind_and_external_pins_moved_are_rejected ... ok
|
||||
test tests::manual_attachments_and_label_data_must_remain_exact ... ok
|
||||
test tests::moved_and_hidden_source_inputs_are_checked_against_complete_expected_projects ... ok
|
||||
test tests::omitted_and_double_moved_child_are_rejected ... ok
|
||||
test tests::real_group_command_outputs_pass_and_are_not_unchanged ... ok
|
||||
test tests::real_hide_command_outputs_pass_before_and_after_movement ... ok
|
||||
test tests::semantic_other_view_fixed_node_and_trace_drift_are_rejected ... ok
|
||||
test tests::unchanged_rejects_valid_semantic_drift_without_geometry_changes ... ok
|
||||
test tests::zero_and_excessive_moves_cannot_satisfy_move_evidence ... ok
|
||||
|
||||
test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 6.25s
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"README.md": {
|
||||
"bytes": 1113,
|
||||
"sha256": "23b6099c058997f1ed12c20b0dd89d124d2e6915eccf02bdbe1068544256a748"
|
||||
},
|
||||
"core-1/inputs.json": {
|
||||
"bytes": 122682,
|
||||
"sha256": "81318b52a4f2659f0687bfa459c7e3a24f39996dd5a8b6d7f21c3c78fa16c3b4"
|
||||
},
|
||||
"core-1/inputs.zip": {
|
||||
"bytes": 2947000,
|
||||
"sha256": "cecd6ae0ba45add8e913d9913cd4960c01928db0a4bc795902b7954ffb6f692e"
|
||||
},
|
||||
"core-1/process.json": {
|
||||
"bytes": 199,
|
||||
"sha256": "c59cb33a7a7339a9b876b87e377ef57a8840bf76a411dc80d6cf5e32d365a9f8"
|
||||
},
|
||||
"core-1/result.json": {
|
||||
"bytes": 3196,
|
||||
"sha256": "ca61228c182b4824492a6248e2c37dc4519e35b5b077212e72a4283bf3b0ffab"
|
||||
},
|
||||
"core-1/started.json": {
|
||||
"bytes": 1403,
|
||||
"sha256": "2aa37908fb7eb8f49819fe8e96c59e6254f560b5c7058f7491c6c38d4b304487"
|
||||
},
|
||||
"core-1/stderr.log": {
|
||||
"bytes": 320,
|
||||
"sha256": "1b7e7597c4c20f47faf6695a257cc32bfce21b7fedcbf3a57cac6ea40114cd22"
|
||||
},
|
||||
"core-1/stdout.log": {
|
||||
"bytes": 42721,
|
||||
"sha256": "93c11a194e1c97abcdbce56c9b45be479bd1e60cfa5ecd873773246a696d146d"
|
||||
},
|
||||
"gate-helper.py": {
|
||||
"bytes": 3502,
|
||||
"sha256": "6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06"
|
||||
},
|
||||
"identity.json": {
|
||||
"bytes": 1455,
|
||||
"sha256": "b065e20e1130fbd1caff052e71e01da083c14eaf785748b3d32c3a691f7146a9"
|
||||
},
|
||||
"prepare.py": {
|
||||
"bytes": 1866,
|
||||
"sha256": "0550fb880635e27a193d2b5166f1dbbe1edb2091f3bf5d23be5fc3fa3b4ae63b"
|
||||
},
|
||||
"verify.py": {
|
||||
"bytes": 3726,
|
||||
"sha256": "3a33fb46f3b9b8a30a35dbc6469d404cca94fa2ed40804101719f2d2e686d6d0"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
from pathlib import Path
|
||||
import datetime, hashlib, json, os, subprocess, sys, time, zipfile
|
||||
|
||||
# Process-local disk recovery: do not write another Rust incremental cache.
|
||||
os.environ['CARGO_INCREMENTAL'] = '0'
|
||||
|
||||
root = Path('C:/ar-multiselect-9e8r6t')
|
||||
out = Path(__file__).resolve().parent / sys.argv[1]
|
||||
out.mkdir(parents=True, exist_ok=False)
|
||||
def now(): return datetime.datetime.now(datetime.timezone.utc).isoformat()
|
||||
def digest(path):
|
||||
data = path.read_bytes()
|
||||
return {'bytes': len(data), 'sha256': hashlib.sha256(data).hexdigest()}
|
||||
def inputs():
|
||||
paths = subprocess.check_output(['git','ls-files','--cached','--others','--exclude-standard','-z'],cwd=root).decode().split('\0')
|
||||
return {p:digest(root/p) for p in sorted(set(paths)) if p and (p in ('Cargo.toml','Cargo.lock','rust-toolchain.toml') or p.startswith(('crates/','build/','.cargo/','scripts/','docs/','examples/','harness/fixtures/','harness/prototypes/')))}
|
||||
before=inputs()
|
||||
assert len([p for p in before if p.startswith('crates/vendor/iced_widget/')]) == 71, 'Vendored input inventory changed'
|
||||
assert all(before[p] == digest(root/p) for p in before)
|
||||
(out/'inputs.json').write_text(json.dumps(before,indent=2),encoding='utf-8')
|
||||
with zipfile.ZipFile(out/'inputs.zip','x',compression=zipfile.ZIP_DEFLATED) as z:
|
||||
for p in before: z.write(root/p,p)
|
||||
command=['cargo',*sys.argv[2:]]
|
||||
start={'start':now(),'command':command,'cwd':str(root),'head':subprocess.check_output(['git','rev-parse','HEAD'],cwd=root,text=True).strip(),
|
||||
'scope':'All Git-visible Cargo manifests/lock, crates (including patched dependency), build, .cargo, docs, examples, harness fixtures, compiled prototypes, and packaging scripts; all 71 tracked vendored files included',
|
||||
'inputs':digest(out/'inputs.json'),'archive':digest(out/'inputs.zip'),'inputCount':len(before),
|
||||
'environment':{k:os.environ.get(k) for k in ('RUSTUP_TOOLCHAIN','CARGO_HOME','CARGO_TARGET_DIR','CARGO_BUILD_JOBS','CARGO_INCREMENTAL')},
|
||||
'helper':digest(Path(__file__).resolve()),
|
||||
'cargo':subprocess.check_output(['cargo','--version'],text=True).strip(),'rustc':subprocess.check_output(['rustc','--version'],text=True).strip()}
|
||||
(out/'started.json').write_text(json.dumps(start,indent=2),encoding='utf-8')
|
||||
t=time.perf_counter()
|
||||
with (out/'stdout.log').open('xb') as stdout,(out/'stderr.log').open('xb') as stderr:
|
||||
r=subprocess.Popen(command,cwd=root,stdout=stdout,stderr=stderr)
|
||||
(out/'process.json').write_text(json.dumps({'pid':r.pid,'observed':now(),'command':command}),encoding='utf-8')
|
||||
r.wait()
|
||||
artifacts=[]
|
||||
for line in (out/'stdout.log').read_text(encoding='utf-8',errors='replace').splitlines():
|
||||
try: item=json.loads(line)
|
||||
except json.JSONDecodeError: continue
|
||||
if isinstance(item,dict) and item.get('reason')=='compiler-artifact' and item.get('executable'):
|
||||
path=Path(item['executable'])
|
||||
artifacts.append({'cargo':item,'readback':digest(path) if path.exists() else None})
|
||||
result={**start,'finish':now(),'seconds':time.perf_counter()-t,'exitCode':r.returncode,'inputsUnchanged':before==inputs(),
|
||||
'stdout':digest(out/'stdout.log'),'stderr':digest(out/'stderr.log'),'artifacts':artifacts}
|
||||
(out/'result.json').write_text(json.dumps(result,indent=2),encoding='utf-8')
|
||||
print(json.dumps({k:v for k,v in result.items() if k!='artifacts'},indent=2))
|
||||
print('Executable artifacts:',len(artifacts))
|
||||
sys.exit(0 if r.returncode==0 and result['inputsUnchanged'] else 1)
|
||||
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"raw": {
|
||||
"inputs.json": {
|
||||
"bytes": 122682,
|
||||
"sha256": "81318b52a4f2659f0687bfa459c7e3a24f39996dd5a8b6d7f21c3c78fa16c3b4"
|
||||
},
|
||||
"inputs.zip": {
|
||||
"bytes": 2947000,
|
||||
"sha256": "cecd6ae0ba45add8e913d9913cd4960c01928db0a4bc795902b7954ffb6f692e"
|
||||
},
|
||||
"process.json": {
|
||||
"bytes": 199,
|
||||
"sha256": "c59cb33a7a7339a9b876b87e377ef57a8840bf76a411dc80d6cf5e32d365a9f8"
|
||||
},
|
||||
"result.json": {
|
||||
"bytes": 3196,
|
||||
"sha256": "ca61228c182b4824492a6248e2c37dc4519e35b5b077212e72a4283bf3b0ffab"
|
||||
},
|
||||
"started.json": {
|
||||
"bytes": 1403,
|
||||
"sha256": "2aa37908fb7eb8f49819fe8e96c59e6254f560b5c7058f7491c6c38d4b304487"
|
||||
},
|
||||
"stderr.log": {
|
||||
"bytes": 320,
|
||||
"sha256": "1b7e7597c4c20f47faf6695a257cc32bfce21b7fedcbf3a57cac6ea40114cd22"
|
||||
},
|
||||
"stdout.log": {
|
||||
"bytes": 42721,
|
||||
"sha256": "93c11a194e1c97abcdbce56c9b45be479bd1e60cfa5ecd873773246a696d146d"
|
||||
}
|
||||
},
|
||||
"helper": {
|
||||
"bytes": 3502,
|
||||
"sha256": "6b8fcf64a1eb0869ae29abd66b4e89564a1813fef5898b54f2a17a3230dbaa06"
|
||||
},
|
||||
"mismatches": {
|
||||
"crates/oa-desktop/src/model_menu.rs": {
|
||||
"map": {
|
||||
"bytes": 44572,
|
||||
"sha256": "3844be8ec15fe2c5614ff5625ec7b63234fbf5a6d126de5a85c8f5c51dfa7101"
|
||||
},
|
||||
"archive": {
|
||||
"bytes": 44757,
|
||||
"sha256": "82998c97e8d706b1ce1c1fb7058eaeabfceae3004e38f60d6076194968dc5272"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
"""Preserve the raw core-1 capture incident separately from strict gate packages."""
|
||||
from pathlib import Path
|
||||
import argparse, json
|
||||
from verify import HERE, RAW, need, pin, parsed, verify
|
||||
|
||||
def main():
|
||||
parser=argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('--root',type=Path,required=True)
|
||||
parser.add_argument('--helper',type=Path,action='append',default=[])
|
||||
parser.add_argument('--output',type=Path)
|
||||
parser.add_argument('--check-only',action='store_true')
|
||||
args=parser.parse_args()
|
||||
gates=args.root/'.local/state-group-gates'; folder=gates/'core-1'
|
||||
need(all(p.is_file() and not p.is_symlink() for p in folder.iterdir()) and {p.name for p in folder.iterdir()}==RAW,'exact closed raw inventory')
|
||||
raw={n:(folder/n).read_bytes() for n in RAW}
|
||||
identity=parsed((HERE/'identity.json').read_bytes())
|
||||
matches=[p.read_bytes() for p in list(gates.glob('*.py'))+args.helper if pin(p.read_bytes())==identity['helper']]
|
||||
need(bool(matches),'exact historical helper required')
|
||||
summary=verify(raw,matches[0],identity)
|
||||
if args.check_only:
|
||||
print('PASS incident check-only, no package written:',summary); return
|
||||
need(args.output is not None,'explicit --output required')
|
||||
out=args.output.resolve(); need(not out.exists(),'existing output refused')
|
||||
out.mkdir(parents=True); (out/'core-1').mkdir()
|
||||
payload={'core-1/'+n:b for n,b in raw.items()}
|
||||
payload['gate-helper.py']=matches[0]
|
||||
for n in ('prepare.py','verify.py','README.md','identity.json'): payload[n]=(HERE/n).read_bytes()
|
||||
for n,b in payload.items():
|
||||
with (out/n).open('xb') as f: f.write(b)
|
||||
with (out/'files.json').open('x',encoding='utf-8') as f: json.dump({n:pin(b) for n,b in sorted(payload.items())},f,indent=2)
|
||||
print('Preserved incident, not a gate pass:',out,summary)
|
||||
if __name__=='__main__': main()
|
||||
@@ -0,0 +1,53 @@
|
||||
"""Verify one pinned capture incident; never count it as a normal gate pass."""
|
||||
from pathlib import Path
|
||||
import argparse, hashlib, io, json, stat, zipfile
|
||||
HERE = Path(__file__).resolve().parent
|
||||
RAW = {'started.json','process.json','result.json','stdout.log','stderr.log','inputs.json','inputs.zip'}
|
||||
COMMAND = ['cargo','test','-p','oa-core','--example','state_multiselect_native','--message-format=json','--','--test-threads=1']
|
||||
CHANGED = 'crates/oa-desktop/src/model_menu.rs'
|
||||
def need(ok, message):
|
||||
if not ok: raise ValueError(message)
|
||||
def pin(data): return {'bytes':len(data),'sha256':hashlib.sha256(data).hexdigest()}
|
||||
def parsed(data):
|
||||
def unique(items):
|
||||
out={}
|
||||
for k,v in items:
|
||||
need(k not in out, 'duplicate JSON key')
|
||||
out[k]=v
|
||||
return out
|
||||
return json.loads(data, object_pairs_hook=unique)
|
||||
def verify(raw, helper, identity):
|
||||
need(set(raw)==set(identity['raw'])==RAW, 'exact seven raw files')
|
||||
need({n:pin(b) for n,b in raw.items()}==identity['raw'], 'exact incident raw pins')
|
||||
start,process,result=[parsed(raw[n+'.json']) for n in ('started','process','result')]
|
||||
need(all(result.get(k)==v for k,v in start.items()), 'start/result relationship')
|
||||
need(result['command']==process['command']==COMMAND, 'specific core example test command')
|
||||
need(result['exitCode']==0 and result['inputsUnchanged'] is False, 'incident status, not accepted gate')
|
||||
need(pin(helper)==identity['helper']==result['helper'], 'historical helper pin')
|
||||
for field,name in [('inputs','inputs.json'),('archive','inputs.zip'),('stdout','stdout.log'),('stderr','stderr.log')]:
|
||||
need(result[field]==pin(raw[name]), field+' pin')
|
||||
inputs=parsed(raw['inputs.json'])
|
||||
need(len(inputs)==result['inputCount']==733, 'historical input count')
|
||||
actual={}
|
||||
with zipfile.ZipFile(io.BytesIO(raw['inputs.zip'])) as z:
|
||||
need(len(z.namelist())==len(set(z.namelist())) and set(z.namelist())==set(inputs), 'exact source inventory')
|
||||
for item in z.infolist():
|
||||
name=item.filename
|
||||
need(not item.is_dir() and not stat.S_ISLNK(item.external_attr>>16) and '\\' not in name and ':' not in name and not name.startswith('/') and all(p not in ('','.','..') for p in name.split('/')), 'safe source name')
|
||||
actual[name]=pin(z.read(name))
|
||||
mismatch={n:{'map':inputs[n],'archive':actual[n]} for n in inputs if inputs[n]!=actual[n]}
|
||||
need(set(mismatch)=={CHANGED} and mismatch==identity['mismatches'], 'exact sole known map/archive mismatch')
|
||||
need(mismatch[CHANGED]['map']['bytes']==44572 and mismatch[CHANGED]['archive']['bytes']==44757, 'known mismatch sizes')
|
||||
need(b'test result: ok. 11 passed; 0 failed;' in raw['stdout.log'], 'recorded eleven-test result')
|
||||
return {'incident':'core-1','acceptedGate':False,'rawFiles':7,'mismatchedInputs':list(mismatch)}
|
||||
def main():
|
||||
parser=argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('package',nargs='?',type=Path,default=HERE)
|
||||
args=parser.parse_args(); root=args.package
|
||||
files=parsed((root/'files.json').read_bytes())
|
||||
expected={'prepare.py','verify.py','README.md','identity.json','gate-helper.py'}|{'core-1/'+n for n in RAW}
|
||||
need(set(files)==expected, 'package file inventory')
|
||||
need({p.relative_to(root).as_posix() for p in root.rglob('*') if p.is_file()}==expected|{'files.json'}, 'exact on-disk package files')
|
||||
for n,p in files.items(): need(pin((root/n).read_bytes())==p, 'package pin '+n)
|
||||
print('PASS incident consistency; not a gate pass:', verify({n:(root/'core-1'/n).read_bytes() for n in RAW},(root/'gate-helper.py').read_bytes(),parsed((root/'identity.json').read_bytes())))
|
||||
if __name__=='__main__': main()
|
||||
@@ -0,0 +1,27 @@
|
||||
# State multiselect native evidence tools
|
||||
|
||||
Candidate tools; no native run or acceptance is asserted by their presence.
|
||||
Prepare only a closed `.local/state-multiselect-native/run-1`:
|
||||
|
||||
```
|
||||
python -B prepare.py --root CHECKOUT --runs run-1 --check-only
|
||||
```
|
||||
|
||||
Declare any additional unchanged snapshot labels with `--extra-unchanged LABEL ...`.
|
||||
Nine original history snapshots remain mandatory. Each additional snapshot must
|
||||
pass every checker/provenance/time/source check and equal baseline bytes exactly.
|
||||
All three distinct history byte groups, complete-Project comparisons, input-map
|
||||
and executable relationships, unchanged flags, captured-window relationships,
|
||||
and exact archive inventories remain required. Source count must match the
|
||||
fixture and history record. Only `views/diagram_state_view.arcadia` may change.
|
||||
|
||||
After completed native observation and final source verification, omit
|
||||
`--check-only` and provide
|
||||
`--output CHECKOUT/harness/experiments/state-multiselect-20260923/native`.
|
||||
Run `python -B verify.py PACKAGE` to check a written package. Existing outputs
|
||||
are refused. Helpers are preserved as pinned data; they are never executed.
|
||||
Referenced full build capsules/logs belong in the sibling checks package.
|
||||
|
||||
Offline byte/receipt consistency does not authenticate actions, establish
|
||||
usability, rerun the checker, or prove native acceptance. Native action
|
||||
observations and limitations require a separate reviewed record.
|
||||
Binary file not shown.
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"prepare.py": {
|
||||
"bytes": 7494,
|
||||
"sha256": "0ba52dc39d08888e34d2b84e25f40acbcfda97aa74c2fd21319967867e0008ae"
|
||||
},
|
||||
"verify.py": {
|
||||
"bytes": 15255,
|
||||
"sha256": "26e08398561c1753926cb994d674d311307970f06f0f8ae68ca6dec4f5e9a8e4"
|
||||
},
|
||||
"README.md": {
|
||||
"bytes": 1457,
|
||||
"sha256": "dc13ee4603368a86b49cd54d5c3b19c7759e81a16ccc3c782882285db0758d26"
|
||||
},
|
||||
"manifest.json": {
|
||||
"bytes": 42972,
|
||||
"sha256": "088fd71a7e41536287aeeed32ab6da41130a0f3b3621dd752b88290a435bff50"
|
||||
},
|
||||
"evidence.zip": {
|
||||
"bytes": 3384779,
|
||||
"sha256": "1d08c1bc6af4856a569ddd320ddf5403a302b8d9437750663a498541e489d663"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,975 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"kind": "multiselect-native",
|
||||
"runs": {
|
||||
"run-1": {
|
||||
"originalRun": "C:/ar-multiselect-9e8r6t/.local/state-multiselect-native/run-1",
|
||||
"originalFixture": "C:/ar-multiselect-9e8r6t/.local/state-multiselect-native/fixture-1",
|
||||
"helpers": {
|
||||
"helper": "helpers/68c17b874f25c2b65a0aa81b6db6de9a28184388fee04185e47615b022cfbdf3.py",
|
||||
"capture": "helpers/c11446a694a6357c77e2cba405c5a078b29eef5cdd2342579d234b4e20270eb1.js",
|
||||
"snapshotHelper": "helpers/4301a93f23db7d43399ed87c6eede2196d38911aba09a391fae5bcd4b691fa7b.py",
|
||||
"history": "helpers/dc3ad2c3491acda3290099e4c3af0ef6d5c2362ca1df9c2ee3b8f113b2f5e723.py"
|
||||
},
|
||||
"builds": {
|
||||
"gui": {
|
||||
"receipt": "builds/172faec4d7708e4539468c3a9062d424f0e00cb80e827cd579274942c757eccb/result.json",
|
||||
"inputs": "builds/172faec4d7708e4539468c3a9062d424f0e00cb80e827cd579274942c757eccb/inputs.json",
|
||||
"originalRelative": ".local/state-group-gates/windows-build-1/result.json",
|
||||
"helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py"
|
||||
},
|
||||
"checker": {
|
||||
"receipt": "builds/03c22f6269b023f77d0fb3e713d5bbab8d14cf6e67ab4dfc613b4691fe4a6955/result.json",
|
||||
"inputs": "builds/03c22f6269b023f77d0fb3e713d5bbab8d14cf6e67ab4dfc613b4691fe4a6955/inputs.json",
|
||||
"originalRelative": ".local/state-group-gates/native-build-1/result.json",
|
||||
"helper": "helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py"
|
||||
}
|
||||
},
|
||||
"extraUnchangedSnapshots": [
|
||||
"row-mixed-unchanged"
|
||||
],
|
||||
"checkerSource": {
|
||||
"inputPath": "crates/oa-core/examples/state_multiselect_native.rs",
|
||||
"member": "checker-source/5db7a00b044c27b851731b3d8cb16cc3f638a5242bf53bd46b3a5e1df4de0460.rs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"members": {
|
||||
"builds/03c22f6269b023f77d0fb3e713d5bbab8d14cf6e67ab4dfc613b4691fe4a6955/inputs.json": {
|
||||
"bytes": 123053,
|
||||
"sha256": "4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf"
|
||||
},
|
||||
"builds/03c22f6269b023f77d0fb3e713d5bbab8d14cf6e67ab4dfc613b4691fe4a6955/result.json": {
|
||||
"bytes": 3311,
|
||||
"sha256": "03c22f6269b023f77d0fb3e713d5bbab8d14cf6e67ab4dfc613b4691fe4a6955"
|
||||
},
|
||||
"builds/172faec4d7708e4539468c3a9062d424f0e00cb80e827cd579274942c757eccb/inputs.json": {
|
||||
"bytes": 123053,
|
||||
"sha256": "4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf"
|
||||
},
|
||||
"builds/172faec4d7708e4539468c3a9062d424f0e00cb80e827cd579274942c757eccb/result.json": {
|
||||
"bytes": 3193,
|
||||
"sha256": "172faec4d7708e4539468c3a9062d424f0e00cb80e827cd579274942c757eccb"
|
||||
},
|
||||
"checker-source/5db7a00b044c27b851731b3d8cb16cc3f638a5242bf53bd46b3a5e1df4de0460.rs": {
|
||||
"bytes": 31343,
|
||||
"sha256": "5db7a00b044c27b851731b3d8cb16cc3f638a5242bf53bd46b3a5e1df4de0460"
|
||||
},
|
||||
"helpers/1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20.py": {
|
||||
"bytes": 3827,
|
||||
"sha256": "1368375b1fba0dfc50b77ea4f406dba71960a78317ce8f259d4c4a0254863a20"
|
||||
},
|
||||
"helpers/4301a93f23db7d43399ed87c6eede2196d38911aba09a391fae5bcd4b691fa7b.py": {
|
||||
"bytes": 2503,
|
||||
"sha256": "4301a93f23db7d43399ed87c6eede2196d38911aba09a391fae5bcd4b691fa7b"
|
||||
},
|
||||
"helpers/68c17b874f25c2b65a0aa81b6db6de9a28184388fee04185e47615b022cfbdf3.py": {
|
||||
"bytes": 3411,
|
||||
"sha256": "68c17b874f25c2b65a0aa81b6db6de9a28184388fee04185e47615b022cfbdf3"
|
||||
},
|
||||
"helpers/c11446a694a6357c77e2cba405c5a078b29eef5cdd2342579d234b4e20270eb1.js": {
|
||||
"bytes": 1405,
|
||||
"sha256": "c11446a694a6357c77e2cba405c5a078b29eef5cdd2342579d234b4e20270eb1"
|
||||
},
|
||||
"helpers/dc3ad2c3491acda3290099e4c3af0ef6d5c2362ca1df9c2ee3b8f113b2f5e723.py": {
|
||||
"bytes": 2192,
|
||||
"sha256": "dc3ad2c3491acda3290099e4c3af0ef6d5c2362ca1df9c2ee3b8f113b2f5e723"
|
||||
},
|
||||
"runs/run-1/fixture/baseline.json": {
|
||||
"bytes": 18490,
|
||||
"sha256": "07432f30fecbf0710ab3c01dbfa760df18e781ac81713ed86fa2ea232eff0d07"
|
||||
},
|
||||
"runs/run-1/fixture/manifest.json": {
|
||||
"bytes": 2897,
|
||||
"sha256": "2d4a067b45181b9b66b84598464b20045f13ce23890d3a7c5b195e2f7f9f7b64"
|
||||
},
|
||||
"runs/run-1/fixture/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/fixture/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/fixture/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/fixture/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/fixture/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/fixture/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/fixture/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/fixture/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/fixture/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 3781,
|
||||
"sha256": "feda42f7f4329b925b7f87289b384f075705616a09a310a99c96e4177f6fee85"
|
||||
},
|
||||
"runs/run-1/raw/01-start-0.jpg": {
|
||||
"bytes": 116250,
|
||||
"sha256": "dcaf44d81bf7d9bccabe1aab8e6d1143e29c3561b56bda56da5fbcfe5ce7094f"
|
||||
},
|
||||
"runs/run-1/raw/01-start.json": {
|
||||
"bytes": 919,
|
||||
"sha256": "5422b74fa139899ab9f355c787aed483bd7a8e40a8796aa291e3bf8a884947d3"
|
||||
},
|
||||
"runs/run-1/raw/02-open-dialog-0.jpg": {
|
||||
"bytes": 114527,
|
||||
"sha256": "a2622f57aa5e83353244216c177110d7627605cbef02cfde3ea4ceb5d543d72c"
|
||||
},
|
||||
"runs/run-1/raw/02-open-dialog.json": {
|
||||
"bytes": 925,
|
||||
"sha256": "300dfa12f3c5f170130bc4b2a6ef0eb1d75ecddc7497f3b325e174165d6e389d"
|
||||
},
|
||||
"runs/run-1/raw/03-project-open-0.jpg": {
|
||||
"bytes": 133077,
|
||||
"sha256": "d08a5d7a3c65b079de4d83af523d8398732e976fc4cd7c1672e5e1231ee8fd36"
|
||||
},
|
||||
"runs/run-1/raw/03-project-open.json": {
|
||||
"bytes": 934,
|
||||
"sha256": "1cf0f6b55cfc904c0e023e463d844aa3929c6728da6b826a8c1b3a87ccf371c9"
|
||||
},
|
||||
"runs/run-1/raw/04-baseline-saved-0.jpg": {
|
||||
"bytes": 131419,
|
||||
"sha256": "64e2fdea1f0372024bf377493416f75fce34f3ae6d6cdf1870b40c8ab7ae0e0b"
|
||||
},
|
||||
"runs/run-1/raw/04-baseline-saved.json": {
|
||||
"bytes": 938,
|
||||
"sha256": "2cd7ccc03073bda0c2468437dcd90cf00e06354cac8cafba0cfd73aae944d640"
|
||||
},
|
||||
"runs/run-1/raw/05-a-selected-0.jpg": {
|
||||
"bytes": 146454,
|
||||
"sha256": "a1b3da460a3e3aeaf611321bc2436dd0551463dce0b03a28ef60d509daec671c"
|
||||
},
|
||||
"runs/run-1/raw/05-a-selected.json": {
|
||||
"bytes": 934,
|
||||
"sha256": "74d3eda5e9b8512e8a842cc302183ac97b64cdcf46602519dfa2ac624542b3db"
|
||||
},
|
||||
"runs/run-1/raw/06-row-context-0.jpg": {
|
||||
"bytes": 148643,
|
||||
"sha256": "97c37986756b9a64d3995ea824b5d6c5124345bda0c309e1da09f7aaf1554491"
|
||||
},
|
||||
"runs/run-1/raw/06-row-context.json": {
|
||||
"bytes": 935,
|
||||
"sha256": "6edea69009268837c510666a7697700a081fd8685c12aef0b34485965225a4a7"
|
||||
},
|
||||
"runs/run-1/raw/07-row-added-0.jpg": {
|
||||
"bytes": 145885,
|
||||
"sha256": "ea7a830f2ed4b35b4173dc828de2184e65162c39c73b19cc1ea0c90c5cfa0ab4"
|
||||
},
|
||||
"runs/run-1/raw/07-row-added.json": {
|
||||
"bytes": 933,
|
||||
"sha256": "d087cebd389786ba05a6dc355410fa371f7e369b692d93a6805684091b7fb11e"
|
||||
},
|
||||
"runs/run-1/raw/08-mixed-drag-refused-0.jpg": {
|
||||
"bytes": 151098,
|
||||
"sha256": "3ad911c0f3a44d3078411570bb87ddecb7d5e27661b1d0421275210290668201"
|
||||
},
|
||||
"runs/run-1/raw/08-mixed-drag-refused.json": {
|
||||
"bytes": 942,
|
||||
"sha256": "eb4c94795c8ed43e492e9748ba2fb95d8f56020e91d9cd93ccafd777c8f61331"
|
||||
},
|
||||
"runs/run-1/raw/09-mixed-refusal-saved-0.jpg": {
|
||||
"bytes": 148444,
|
||||
"sha256": "d268d68462744bc54cdc2f333ce1d119178d17b6746dc5aede2cae226fe2f89a"
|
||||
},
|
||||
"runs/run-1/raw/09-mixed-refusal-saved.json": {
|
||||
"bytes": 943,
|
||||
"sha256": "1b971ab580bd8a27c74ae29f71a9c6a94022fb025b6c739923954a64efaa014b"
|
||||
},
|
||||
"runs/run-1/raw/10-stationary-collapse-0.jpg": {
|
||||
"bytes": 146515,
|
||||
"sha256": "430f5c79dd891d88c4a8e25f02d644d9e23e709bbdd9229c1668e486a65dffad"
|
||||
},
|
||||
"runs/run-1/raw/10-stationary-collapse.json": {
|
||||
"bytes": 943,
|
||||
"sha256": "037cc2690a0334b7f0032e4fdffe9e81793267ca47184d0b78fc10a2d13c1c7e"
|
||||
},
|
||||
"runs/run-1/raw/11-b-context-0.jpg": {
|
||||
"bytes": 155065,
|
||||
"sha256": "4321ffcff5b002ada96714d7e5d8c6ac55db76e1fdd539ab3f3a053ac9b43ac6"
|
||||
},
|
||||
"runs/run-1/raw/11-b-context.json": {
|
||||
"bytes": 933,
|
||||
"sha256": "f9cdd902dda8e296a733e2d8728b22f3908da6be97d7e0c3c297bb05ec7c529b"
|
||||
},
|
||||
"runs/run-1/raw/12-placement-group-0.jpg": {
|
||||
"bytes": 147223,
|
||||
"sha256": "ffdd50679ebf1f4ef581e943e4c8edd4e0170d721a38e1b2e4f9090c570d58a4"
|
||||
},
|
||||
"runs/run-1/raw/12-placement-group.json": {
|
||||
"bytes": 939,
|
||||
"sha256": "cf462a9354aa79af5e0975162d530bb4adf1e89f7d52492b62ae7da7034928b1"
|
||||
},
|
||||
"runs/run-1/raw/13-group-moved-0.jpg": {
|
||||
"bytes": 147935,
|
||||
"sha256": "fa65ffefd695b4b5aef67c22bf23148906182c769e0e512e98a1f7c32435035f"
|
||||
},
|
||||
"runs/run-1/raw/13-group-moved.json": {
|
||||
"bytes": 943,
|
||||
"sha256": "9261f3bb668dd6660c2a0355adb982a0f00f6961159d8706bdc1c982a0b7a816"
|
||||
},
|
||||
"runs/run-1/raw/14-move-saved-0.jpg": {
|
||||
"bytes": 146770,
|
||||
"sha256": "f055b46341c302063cb702dc6619f2509f5c4a80adc5eb6bcf48d77098c0026f"
|
||||
},
|
||||
"runs/run-1/raw/14-move-saved.json": {
|
||||
"bytes": 934,
|
||||
"sha256": "306876d9b6de633d623227a16a84f9fcc066b37008c436e670bfd3df9d816cc8"
|
||||
},
|
||||
"runs/run-1/raw/15-move-undo-0.jpg": {
|
||||
"bytes": 148428,
|
||||
"sha256": "268fdaaa4d4832cf3bdcbd69d6ac062ece52301b7cd0ae38cd1edd38fa157fe3"
|
||||
},
|
||||
"runs/run-1/raw/15-move-undo.json": {
|
||||
"bytes": 943,
|
||||
"sha256": "300a234ed16f53fce88f7f8eaf9d252af8e98122f5c1f8aa13f6dbad8d56012c"
|
||||
},
|
||||
"runs/run-1/raw/16-move-undo-saved-0.jpg": {
|
||||
"bytes": 148316,
|
||||
"sha256": "c4e986553c2938bffca8ee1f7e6ee7c4a3aa077e6ff6bd9da50d35e10684a9f3"
|
||||
},
|
||||
"runs/run-1/raw/16-move-undo-saved.json": {
|
||||
"bytes": 941,
|
||||
"sha256": "fef07b40f46a6138623de1f10d5e74c81f87f18a35059b132fe2af192e6d17dc"
|
||||
},
|
||||
"runs/run-1/raw/17-move-redo-0.jpg": {
|
||||
"bytes": 146795,
|
||||
"sha256": "37476c5a02d9ca0db214e244040b112dc50fd4d1418ec3af96f0a4f4776e4dde"
|
||||
},
|
||||
"runs/run-1/raw/17-move-redo.json": {
|
||||
"bytes": 943,
|
||||
"sha256": "751ccfe6dc9acecdc0e7225aedd17be44ea374f368cba5ab2191c8c659a55af2"
|
||||
},
|
||||
"runs/run-1/raw/18-move-redo-saved-0.jpg": {
|
||||
"bytes": 146823,
|
||||
"sha256": "c248b70901e52881bce338b6fe0f7fdcaf19df8fad349f24b2c64be54a187069"
|
||||
},
|
||||
"runs/run-1/raw/18-move-redo-saved.json": {
|
||||
"bytes": 939,
|
||||
"sha256": "cfb609930813f6b8cd051c7daf538f8feb04be374be28c65fbd498dd937d82d9"
|
||||
},
|
||||
"runs/run-1/raw/19-before-hide-undo-0.jpg": {
|
||||
"bytes": 148446,
|
||||
"sha256": "a2870258332cc555c9b8abfc3db070ff1582ea449ed6d1d7eedd19e977ea8021"
|
||||
},
|
||||
"runs/run-1/raw/19-before-hide-undo.json": {
|
||||
"bytes": 950,
|
||||
"sha256": "4336190711b265ab5bf508a48528fd0e4b448b48cca86d9907d4704a05087de7"
|
||||
},
|
||||
"runs/run-1/raw/20-before-hide-saved-0.jpg": {
|
||||
"bytes": 148362,
|
||||
"sha256": "6cf90eb40ba2d70dd66da6fd5eb4ef07a787a11a05841d5fd2abe04630b34e02"
|
||||
},
|
||||
"runs/run-1/raw/20-before-hide-saved.json": {
|
||||
"bytes": 943,
|
||||
"sha256": "1c74bc7db156e7aa9a79dea803b77d991a5ae242fbfc82884fcea2235714d6d7"
|
||||
},
|
||||
"runs/run-1/raw/21-group-menu-0.jpg": {
|
||||
"bytes": 153978,
|
||||
"sha256": "472f92a8a5aaa9ca983e5ad9262414e3abe82b0618996206fdd28199d543bcdd"
|
||||
},
|
||||
"runs/run-1/raw/21-group-menu.json": {
|
||||
"bytes": 934,
|
||||
"sha256": "cfbba47a72d05700bd6c159175250bb3dcb7a4277527df4c0873853fb87661df"
|
||||
},
|
||||
"runs/run-1/raw/22-group-hidden-0.jpg": {
|
||||
"bytes": 137291,
|
||||
"sha256": "30112dfcead6736041c506fbe6f9f4abd67808bcd59ec96fb684839ed9fef071"
|
||||
},
|
||||
"runs/run-1/raw/22-group-hidden.json": {
|
||||
"bytes": 944,
|
||||
"sha256": "0985c92ce81de4240451e074c361929a9ae90525d83feeba94c6a7022268683d"
|
||||
},
|
||||
"runs/run-1/raw/23-hidden-saved-0.jpg": {
|
||||
"bytes": 136419,
|
||||
"sha256": "59e0770669d39cacc14ac5f958739d06cf0b647b02f096ff97ab7f65c3448758"
|
||||
},
|
||||
"runs/run-1/raw/23-hidden-saved.json": {
|
||||
"bytes": 938,
|
||||
"sha256": "3f5e4122c005b0af25b54f91fa75640c1379afbcc2b5a26c36b89df91c354418"
|
||||
},
|
||||
"runs/run-1/raw/24-hidden-placement-picker-0.jpg": {
|
||||
"bytes": 137734,
|
||||
"sha256": "f4fd098b9d64194846bfc3912a11ee20a09abd042bb8a33e8bc5a52e0b393a5f"
|
||||
},
|
||||
"runs/run-1/raw/24-hidden-placement-picker.json": {
|
||||
"bytes": 947,
|
||||
"sha256": "f345669592b3efa382a9f688d0e97291c045c2734dba11ad0262ba1be3178273"
|
||||
},
|
||||
"runs/run-1/raw/25-picker-dismissed-0.jpg": {
|
||||
"bytes": 137694,
|
||||
"sha256": "e5af5ad56705204d79352869f362ab430d1c5cbafce5ae1dba5093a8311728a8"
|
||||
},
|
||||
"runs/run-1/raw/25-picker-dismissed.json": {
|
||||
"bytes": 940,
|
||||
"sha256": "317c8c7e5e1f9a0bb7ac1de51b8a75318ac29d67f81142d46214a013f53def18"
|
||||
},
|
||||
"runs/run-1/raw/26-picker-click-dismissed-0.jpg": {
|
||||
"bytes": 136300,
|
||||
"sha256": "c5e1c4f8ed3fbb68b67429220d3a5db6a846f6753c297d194fcdeaba0ef268a0"
|
||||
},
|
||||
"runs/run-1/raw/26-picker-click-dismissed.json": {
|
||||
"bytes": 946,
|
||||
"sha256": "938fe444bbff489676da4e36b8b9272f78739b520aca23264b7a2001c352f283"
|
||||
},
|
||||
"runs/run-1/raw/27-hide-undo-0.jpg": {
|
||||
"bytes": 145506,
|
||||
"sha256": "712d6b3863bef24458e31be2b86fcc2b4e1f08a340ed78dda0c27f2d20992275"
|
||||
},
|
||||
"runs/run-1/raw/27-hide-undo.json": {
|
||||
"bytes": 943,
|
||||
"sha256": "4b7c9088978c6bef6c60cfb9401f39b6c1460f92382a54db60c1e30bac97c4e6"
|
||||
},
|
||||
"runs/run-1/raw/28-hide-undo-saved-0.jpg": {
|
||||
"bytes": 145429,
|
||||
"sha256": "848082bd3d40431dbd559896cf203c7d4a58385518b3ca02559a4b66633b8ccb"
|
||||
},
|
||||
"runs/run-1/raw/28-hide-undo-saved.json": {
|
||||
"bytes": 939,
|
||||
"sha256": "8311eeb6bce344a989ffd7441ccfe75fd248d57a3e7013c8d7fd770850485d72"
|
||||
},
|
||||
"runs/run-1/raw/29-hide-redo-0.jpg": {
|
||||
"bytes": 136428,
|
||||
"sha256": "280ccb922882c3419c84d7cae928d62c0cc1cd7a8b0b6a5a1245be0046895ae0"
|
||||
},
|
||||
"runs/run-1/raw/29-hide-redo.json": {
|
||||
"bytes": 943,
|
||||
"sha256": "e238877bc772c25f2f05a2a4e75d2d78c349c2d1c27ab7fe49f05cc73599f435"
|
||||
},
|
||||
"runs/run-1/raw/30-hide-redo-saved-0.jpg": {
|
||||
"bytes": 136444,
|
||||
"sha256": "5a81ae63d47528fdab27b987f1b9d996cc188f96b26c4d6b3009b4f637562ae4"
|
||||
},
|
||||
"runs/run-1/raw/30-hide-redo-saved.json": {
|
||||
"bytes": 941,
|
||||
"sha256": "932f541a8e9364a50c714401a915717d69035cd9e15c415454d169749c0bc16f"
|
||||
},
|
||||
"runs/run-1/raw/31-reopen-request-0.jpg": {
|
||||
"bytes": 107440,
|
||||
"sha256": "88b53c5f37b0107a1842c3b79b6258b255ef6bf41f6fd5df76fd8cc1d4cdd48f"
|
||||
},
|
||||
"runs/run-1/raw/31-reopen-request.json": {
|
||||
"bytes": 938,
|
||||
"sha256": "c65e7668bad5c08953e6bf03ada8f304d9b5512751b8cb19657d84cf7d6f869c"
|
||||
},
|
||||
"runs/run-1/raw/32-reopened-hidden-0.jpg": {
|
||||
"bytes": 104737,
|
||||
"sha256": "ef52c777acfc3acf9914e3703601d96e9fcc20095870852d02b696a50317c8ad"
|
||||
},
|
||||
"runs/run-1/raw/32-reopened-hidden-1.jpg": {
|
||||
"bytes": 4207,
|
||||
"sha256": "147948d69961c42f1feea9449df477b8436250388a1ae070e744ed4709a49bf3"
|
||||
},
|
||||
"runs/run-1/raw/32-reopened-hidden-2.jpg": {
|
||||
"bytes": 4000,
|
||||
"sha256": "9110bb88fff054f17fa7f2574a409f27755a72ffe6c14b42097db201a80d2b3f"
|
||||
},
|
||||
"runs/run-1/raw/32-reopened-hidden.json": {
|
||||
"bytes": 983,
|
||||
"sha256": "e265715f1893419799423d265cb1d07d0554fa03fe25346cf5377669448aceea"
|
||||
},
|
||||
"runs/run-1/raw/33-reopen-settled-0.jpg": {
|
||||
"bytes": 104737,
|
||||
"sha256": "ef52c777acfc3acf9914e3703601d96e9fcc20095870852d02b696a50317c8ad"
|
||||
},
|
||||
"runs/run-1/raw/33-reopen-settled-1.jpg": {
|
||||
"bytes": 4207,
|
||||
"sha256": "147948d69961c42f1feea9449df477b8436250388a1ae070e744ed4709a49bf3"
|
||||
},
|
||||
"runs/run-1/raw/33-reopen-settled-2.jpg": {
|
||||
"bytes": 4000,
|
||||
"sha256": "9110bb88fff054f17fa7f2574a409f27755a72ffe6c14b42097db201a80d2b3f"
|
||||
},
|
||||
"runs/run-1/raw/33-reopen-settled.json": {
|
||||
"bytes": 660,
|
||||
"sha256": "9c254237908dbfa081000f6c44adc013120975388dc8902414caeb1028d1e23b"
|
||||
},
|
||||
"runs/run-1/raw/34-reopened-source-0.jpg": {
|
||||
"bytes": 123459,
|
||||
"sha256": "dc824c52b07a8505c82420c581e87cfc6e0759428bceaf8cf84d7fcc981cfefc"
|
||||
},
|
||||
"runs/run-1/raw/34-reopened-source.json": {
|
||||
"bytes": 939,
|
||||
"sha256": "b0fb2a67daa2eb4beef93ba181d5c6a73a734695a218f57725962d428ffe6bc2"
|
||||
},
|
||||
"runs/run-1/raw/35-reopened-saved-0.jpg": {
|
||||
"bytes": 121731,
|
||||
"sha256": "0019c2970ab87c54760fd1ba922aa4471a598888635e835a3a56cc2ce966ba08"
|
||||
},
|
||||
"runs/run-1/raw/35-reopened-saved.json": {
|
||||
"bytes": 938,
|
||||
"sha256": "e8382c2a32bae5febc5f90c0b09fe9353990c7d8b131d038bb0fc556c84b7ca3"
|
||||
},
|
||||
"runs/run-1/raw/app.stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/app.stdout.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/finished.json": {
|
||||
"bytes": 393,
|
||||
"sha256": "c5d9ee9618bab59c55cafa20ba8568b53efe3246d8d7eb2432fd3e2a95a0da03"
|
||||
},
|
||||
"runs/run-1/raw/generation.json": {
|
||||
"bytes": 1263,
|
||||
"sha256": "e112c1aea1fe70f03a239597a494170b9f292bf57f1decf870c768d76a9eeb30"
|
||||
},
|
||||
"runs/run-1/raw/generation.stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/generation.stdout.log": {
|
||||
"bytes": 106,
|
||||
"sha256": "461a61cfb7c5b139a790db5fba4c9fb98dd4951308c63365ef339a388d7e7b2c"
|
||||
},
|
||||
"runs/run-1/raw/history-bytes.json": {
|
||||
"bytes": 786,
|
||||
"sha256": "a8948f0172aa550a5fb63a66396f771e1ba36f437fe76f5775bb35829f70219c"
|
||||
},
|
||||
"runs/run-1/raw/processes.json": {
|
||||
"bytes": 201,
|
||||
"sha256": "4626c05bb8eb58e8d3acd1dc4157299d2c6c5eb0e0200e259a117a2517414cc0"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/result.json": {
|
||||
"bytes": 2767,
|
||||
"sha256": "779cfef18da513f0aa699975be2487435182bf063ad6c1635d92f557e23eeee4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 3781,
|
||||
"sha256": "feda42f7f4329b925b7f87289b384f075705616a09a310a99c96e4177f6fee85"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/started.json": {
|
||||
"bytes": 2365,
|
||||
"sha256": "2f5c987ed6c8114d99751d6dd2cfa38c1b26496aa91043c06da3c0ae0d35ae82"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/baseline/stdout.log": {
|
||||
"bytes": 453,
|
||||
"sha256": "7e3c8332c974e194a96381c3e3b7118fd9f7436405688c068b00186d46449a1b"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/result.json": {
|
||||
"bytes": 2770,
|
||||
"sha256": "a43fc74c00e4a47550aee83d7d5d67ab899d5e148e7bbc91ad3a0083b8eec0d7"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 3781,
|
||||
"sha256": "feda42f7f4329b925b7f87289b384f075705616a09a310a99c96e4177f6fee85"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/started.json": {
|
||||
"bytes": 2368,
|
||||
"sha256": "64a60222db7778d75e913869de0d727623caf91aff1f356c5056b9fb98355bf0"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/before-hide/stdout.log": {
|
||||
"bytes": 456,
|
||||
"sha256": "357e77e5bea40d18e1927e4d1195dbd9dffac5374f286125535495a635e00dea"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/result.json": {
|
||||
"bytes": 2760,
|
||||
"sha256": "f428ba297e8a029722ac742e311f4517409e8e38467574bc81c9525ff275dcf0"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 3531,
|
||||
"sha256": "e0e79284e24387d257f7d72937ff849da16730f9d06a2ce1c2f43c73b1c29548"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/started.json": {
|
||||
"bytes": 2358,
|
||||
"sha256": "a8031748a9c2374d36f90dcfdc639eec6e4407f7f89a43357252500ac6a5aafa"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hidden/stdout.log": {
|
||||
"bytes": 446,
|
||||
"sha256": "e04ab66dd7715906946086d4507987858a4d960327ceb9f4987c6e3629dadc00"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/result.json": {
|
||||
"bytes": 2763,
|
||||
"sha256": "4b8a0060987ea8fff904b244d5e28792382a223bc7473cf13e0679eae6f7c528"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 3531,
|
||||
"sha256": "e0e79284e24387d257f7d72937ff849da16730f9d06a2ce1c2f43c73b1c29548"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/started.json": {
|
||||
"bytes": 2361,
|
||||
"sha256": "a25b92331de234fc267412e5450e0c566f74b811304a6e43a7fd410527181c0a"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-redo/stdout.log": {
|
||||
"bytes": 449,
|
||||
"sha256": "a2f840d03f9813fb0c2f52db73ece05a62e7176da9ec29687e9e8cfe98ea28d1"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/result.json": {
|
||||
"bytes": 2768,
|
||||
"sha256": "d7d71c33427319b1711b2136d1db4aef5718ce1a2790b04eed9c641e9011b1c3"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 3781,
|
||||
"sha256": "feda42f7f4329b925b7f87289b384f075705616a09a310a99c96e4177f6fee85"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/started.json": {
|
||||
"bytes": 2366,
|
||||
"sha256": "8be41b35f8fbd9eecda396d30779b9050f91bcf99e2d8b642456f1020e95de8c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/hide-undo/stdout.log": {
|
||||
"bytes": 454,
|
||||
"sha256": "6613b0a845fa99299f8654c0060d169cefaf16c50962a877e70ac6de61bd4e10"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/result.json": {
|
||||
"bytes": 2764,
|
||||
"sha256": "c90801f95afa47a513ed387b97a22a813c87c97f1dcfbe98dd19d7b842ddb9b3"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 4133,
|
||||
"sha256": "d68617ffcf8a5421f432a225f171df0debf84d4b7d925ed4bd3c6e772bf2f138"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/started.json": {
|
||||
"bytes": 2362,
|
||||
"sha256": "563ac107a3d36ef76841a50b46d55706f3735b0d90fcba996b9d8c8330bdb239"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-redo/stdout.log": {
|
||||
"bytes": 506,
|
||||
"sha256": "12d6629adf26066d1bd57c79081e236fd0c2aa6b2f91fd8b31166ac3c498012b"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/result.json": {
|
||||
"bytes": 2768,
|
||||
"sha256": "629bfb2ccda6bbf45b4601bb80fb5cd0d4de3ae7b393c75270af1f9254b2c6b0"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 3781,
|
||||
"sha256": "feda42f7f4329b925b7f87289b384f075705616a09a310a99c96e4177f6fee85"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/started.json": {
|
||||
"bytes": 2366,
|
||||
"sha256": "4c0951301a0925ecd6910b4267d718212dc985f5d517d702b84a3408549a641e"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move-undo/stdout.log": {
|
||||
"bytes": 454,
|
||||
"sha256": "3eaa06dfb71a848b41ff52ba07b70b0c67d4ea6585a90410e6a5944d46b766ff"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/result.json": {
|
||||
"bytes": 2759,
|
||||
"sha256": "b6475c4f754aed0a551c0e6a474e8d1d62d479b40d997c9ce23bd95b3a4ff018"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 4133,
|
||||
"sha256": "d68617ffcf8a5421f432a225f171df0debf84d4b7d925ed4bd3c6e772bf2f138"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/started.json": {
|
||||
"bytes": 2357,
|
||||
"sha256": "7f51cd0a4dc037b47ed110546898f0cf3d7495332416607db9c2a739928e3a69"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/move/stdout.log": {
|
||||
"bytes": 501,
|
||||
"sha256": "ec0470cbcaf044dcbd76018b77ce00d6479f9e07d0165a09264465bb50c6996e"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/result.json": {
|
||||
"bytes": 2769,
|
||||
"sha256": "51b2a225dc10fa0d2c5481568ef272fb87bf0bef87a583d363badcf185651590"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 3531,
|
||||
"sha256": "e0e79284e24387d257f7d72937ff849da16730f9d06a2ce1c2f43c73b1c29548"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/started.json": {
|
||||
"bytes": 2367,
|
||||
"sha256": "93733f75546fa2fafcef90bb9b968e0ba96b5c521ed1035ef260e0df10a70efa"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/reopened-hidden/stdout.log": {
|
||||
"bytes": 455,
|
||||
"sha256": "1e3fed0f40c77e81b7aa443787f12c132519efaff128cf6cb3e0222575d932fd"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/result.json": {
|
||||
"bytes": 2778,
|
||||
"sha256": "e174aa5452873191caf62f18e01d3db9e13cc3cd4720cee1ea193ee6c67f52e1"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/source/oa/activities/activity_shared_work.arcadia": {
|
||||
"bytes": 148,
|
||||
"sha256": "bea5df0da731e2277ccb26f7949b43f5393d309d92364cc49746052bf5ff9881"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/source/oa/behavior/state_machine_machine.arcadia": {
|
||||
"bytes": 2820,
|
||||
"sha256": "268098238fd3ae9da7b29e4583b11947501a64628622a0ee89b792cabf0a67ed"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/source/oa/participants.arcadia": {
|
||||
"bytes": 133,
|
||||
"sha256": "0f7db5cb2f8ba9642a93182e53f30bd6c593099d1f82ce1f2c503bb617cf917c"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/source/project.arcadia": {
|
||||
"bytes": 618,
|
||||
"sha256": "f6612ff6fe68e2eea2609a9e5168f6295a4e817792f41755ea7e16c8f7b970c2"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/source/sa/functions/function_sa_function.arcadia": {
|
||||
"bytes": 158,
|
||||
"sha256": "9d88c6450101fb66a6b52da4b0a154c272c168ae76a40ed15ebed4631740f607"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/source/traceability.arcadia": {
|
||||
"bytes": 534,
|
||||
"sha256": "8346e4a434095e423c1409f4291fff213d354ddb4a6ae09283dba2bc31391368"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/source/views/diagram_sa_view.arcadia": {
|
||||
"bytes": 331,
|
||||
"sha256": "1f0e7af9ebb2889bf43f7ea0e57f7cf47ef1f0ee661056dc71716a1b50bd5145"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/source/views/diagram_state_other.arcadia": {
|
||||
"bytes": 633,
|
||||
"sha256": "b8014eadf8166f4f9ff6e5f215e7660b2652c27f4f80cc02a2fabfcdee8a4aa4"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/source/views/diagram_state_view.arcadia": {
|
||||
"bytes": 3781,
|
||||
"sha256": "feda42f7f4329b925b7f87289b384f075705616a09a310a99c96e4177f6fee85"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/started.json": {
|
||||
"bytes": 2376,
|
||||
"sha256": "1c0c2799b5d579e5ae07da8dbb589985cca9cfb6f8b880ab5bf0c4b0da306814"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/stderr.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/run-1/raw/snapshots/row-mixed-unchanged/stdout.log": {
|
||||
"bytes": 464,
|
||||
"sha256": "26b9c11ecda895b50cdcdcac984d9792e6149df95db7a5def42207bb73c367ce"
|
||||
},
|
||||
"runs/run-1/raw/started.json": {
|
||||
"bytes": 4006,
|
||||
"sha256": "ae508e19b35b2a399c19099882cf01b8c511fcf6dfa3cebd8578477136d3831d"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,131 @@
|
||||
"""Package explicit completed native runs; helpers are pinned data, never executed."""
|
||||
from pathlib import Path
|
||||
import argparse
|
||||
import json
|
||||
import re
|
||||
import zipfile
|
||||
from verify import pin, parsed, need, norm, relative, safe, verify_data, verify_package
|
||||
|
||||
HERE = Path(__file__).resolve().parent
|
||||
|
||||
|
||||
def collect(root, runs, extra_unchanged=()):
|
||||
native = root / ".local/state-multiselect-native"
|
||||
candidates = [path for path in native.iterdir() if path.is_file() and path.suffix in (".py", ".js")]
|
||||
candidates.extend(sorted((root / ".local/state-group-gates").glob("*.py")))
|
||||
helpers = [(path.suffix, path.read_bytes()) for path in candidates]
|
||||
payload, specs = {}, {}
|
||||
def add(name, data):
|
||||
need(safe(name) and (name not in payload or payload[name] == data), "member collision: " + name)
|
||||
payload[name] = data
|
||||
def tree(folder, prefix):
|
||||
need(folder.is_dir(), "missing directory: " + str(folder))
|
||||
for path in sorted(folder.rglob("*")):
|
||||
need(not path.is_symlink(), "symlink evidence input")
|
||||
if path.is_file():
|
||||
add(prefix + path.relative_to(folder).as_posix(), path.read_bytes())
|
||||
for run in runs:
|
||||
folder = native / run
|
||||
start = parsed((folder / "started.json").read_bytes())
|
||||
end = parsed((folder / "finished.json").read_bytes())
|
||||
need(end["exitCode"] == 0 and all(end[k] is True for k in
|
||||
("guiUnchanged", "checkerUnchanged", "fixtureUnchanged")), "unfinished/changed native run: " + run)
|
||||
generation = parsed((folder / "generation.json").read_bytes())
|
||||
history = parsed((folder / "history-bytes.json").read_bytes())
|
||||
tree(folder, "runs/" + run + "/raw/")
|
||||
fixture_relative = relative(generation["command"][2], start["cwd"])
|
||||
need(fixture_relative.startswith(".local/state-multiselect-native/"), "fixture outside native root")
|
||||
tree(root / fixture_relative, "runs/" + run + "/fixture/")
|
||||
spec = {"originalRun": norm(start["cwd"]) + "/.local/state-multiselect-native/" + run,
|
||||
"originalFixture": norm(generation["command"][2]), "helpers": {}, "builds": {},
|
||||
"extraUnchangedSnapshots": list(extra_unchanged)}
|
||||
for key, expected in [("helper", start["helper"]), ("capture", start["capture"]),
|
||||
("snapshotHelper", start["snapshotHelper"]), ("history", history["helper"])]:
|
||||
matches = [(suffix, data) for suffix, data in helpers if pin(data) == expected]
|
||||
need(bool(matches), "exact historical helper unavailable: " + key)
|
||||
suffix, data = matches[0]
|
||||
member = "helpers/" + expected["sha256"] + suffix
|
||||
add(member, data)
|
||||
spec["helpers"][key] = member
|
||||
for kind in ("gui", "checker"):
|
||||
recorded = start[kind]
|
||||
rel = relative(recorded["receipt"], start["cwd"])
|
||||
need(rel.startswith(".local/state-group-gates/") and rel.endswith("/result.json"), "unexpected build receipt location")
|
||||
receipt = root / rel
|
||||
data = receipt.read_bytes()
|
||||
need(pin(data) == recorded["receiptPin"], "historical build receipt changed")
|
||||
prefix = "builds/" + pin(data)["sha256"] + "/"
|
||||
add(prefix + "result.json", data)
|
||||
inputs_data = (receipt.parent / "inputs.json").read_bytes()
|
||||
need(pin(inputs_data) == recorded["inputs"], "historical build input map changed")
|
||||
add(prefix + "inputs.json", inputs_data)
|
||||
spec["builds"][kind] = {"receipt": prefix + "result.json", "inputs": prefix + "inputs.json", "originalRelative": rel}
|
||||
build_helper = parsed(data)["helper"]
|
||||
matching_helpers = [(suffix, value) for suffix, value in helpers if pin(value) == build_helper]
|
||||
need(bool(matching_helpers), "exact historical build helper unavailable")
|
||||
suffix, helper_data = matching_helpers[0]
|
||||
helper_member = "helpers/" + build_helper["sha256"] + suffix
|
||||
add(helper_member, helper_data)
|
||||
spec["builds"][kind]["helper"] = helper_member
|
||||
if kind == "checker":
|
||||
# Read only the pinned historical example, not today's checkout.
|
||||
archive_path = receipt.parent / "inputs.zip"
|
||||
need(pin(archive_path.read_bytes()) == parsed(data)["archive"], "checker input archive pin")
|
||||
source_path = "crates/oa-core/examples/state_multiselect_native.rs"
|
||||
with zipfile.ZipFile(archive_path) as archive:
|
||||
source = archive.read(source_path)
|
||||
need(pin(source) == parsed(inputs_data)[source_path], "historical checker source pin")
|
||||
member = "checker-source/" + pin(source)["sha256"] + ".rs"
|
||||
add(member, source)
|
||||
spec["checkerSource"] = {"inputPath": source_path, "member": member}
|
||||
specs[run] = spec
|
||||
manifest = {"schema": 1, "kind": "multiselect-native", "runs": specs,
|
||||
"members": {name: pin(data) for name, data in sorted(payload.items())}}
|
||||
summary = verify_data(manifest, payload.__getitem__)
|
||||
return payload, manifest, summary
|
||||
|
||||
|
||||
def write_json(path, value):
|
||||
with path.open("xb") as stream:
|
||||
stream.write((json.dumps(value, indent=2) + "\n").encode())
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--root", type=Path, required=True)
|
||||
parser.add_argument("--runs", nargs="+", required=True)
|
||||
parser.add_argument("--output", type=Path, default=HERE)
|
||||
parser.add_argument("--check-only", action="store_true")
|
||||
parser.add_argument("--extra-unchanged", nargs="*", default=[], help="explicit additional unchanged snapshot labels, same for all runs")
|
||||
args = parser.parse_args()
|
||||
need(len(args.runs) == len(set(args.runs)) and all(re.fullmatch(r"run-[0-9]+", name) for name in args.runs), "explicit unique run-N names required")
|
||||
payload, manifest, summary = collect(args.root.resolve(), args.runs, args.extra_unchanged)
|
||||
if args.check_only:
|
||||
print("PASS raw consistency; no archive written:", summary)
|
||||
return
|
||||
out = args.output.resolve()
|
||||
out.mkdir(parents=True, exist_ok=True)
|
||||
for name in ("evidence.zip", "manifest.json", "files.json"):
|
||||
need(not (out / name).exists(), "existing output refused: " + name)
|
||||
for name in ("prepare.py", "verify.py", "README.md"):
|
||||
data = (HERE / name).read_bytes()
|
||||
if (out / name).exists():
|
||||
need((out / name).read_bytes() == data, "different existing package tool")
|
||||
else:
|
||||
with (out / name).open("xb") as stream:
|
||||
stream.write(data)
|
||||
with zipfile.ZipFile(out / "evidence.zip", "x", compression=zipfile.ZIP_DEFLATED, compresslevel=9) as archive:
|
||||
for name, data in sorted(payload.items()):
|
||||
info = zipfile.ZipInfo(name, date_time=(2026, 9, 23, 0, 0, 0))
|
||||
info.compress_type = zipfile.ZIP_DEFLATED
|
||||
info.external_attr = 0o100644 << 16
|
||||
archive.writestr(info, data)
|
||||
write_json(out / "manifest.json", manifest)
|
||||
names = ("prepare.py", "verify.py", "README.md", "manifest.json", "evidence.zip")
|
||||
write_json(out / "files.json", {name: pin((out / name).read_bytes()) for name in names})
|
||||
need(verify_package(out) == summary, "written package differs from validated evidence")
|
||||
print("PASS package readback:", out, summary)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,240 @@
|
||||
"""Verify archived native receipts and bytes; do not rerun the GUI or checker."""
|
||||
from pathlib import Path, PurePosixPath
|
||||
from datetime import datetime
|
||||
import argparse
|
||||
import hashlib
|
||||
import json
|
||||
import math
|
||||
import stat
|
||||
import zipfile
|
||||
|
||||
BASE = {"started.json", "finished.json", "generation.json", "generation.stdout.log",
|
||||
"generation.stderr.log", "app.stdout.log", "app.stderr.log", "processes.json", "history-bytes.json"}
|
||||
GROUPS = [["baseline", "move-undo", "before-hide", "hide-undo"], ["move", "move-redo"],
|
||||
["hidden", "hide-redo", "reopened-hidden"]]
|
||||
MODES = {name: mode for group, mode in zip(GROUPS, ["unchanged", "moved", "hide"]) for name in group}
|
||||
OUTER = {"prepare.py", "verify.py", "README.md", "manifest.json", "evidence.zip"}
|
||||
|
||||
|
||||
def need(ok, message):
|
||||
if not ok:
|
||||
raise ValueError(message)
|
||||
|
||||
|
||||
def pin(data):
|
||||
return {"bytes": len(data), "sha256": hashlib.sha256(data).hexdigest()}
|
||||
|
||||
|
||||
def safe(name):
|
||||
return (isinstance(name, str) and bool(name) and "\\" not in name and ":" not in name
|
||||
and not PurePosixPath(name).is_absolute() and all(ord(c) >= 32 for c in name)
|
||||
and all(part not in ("", ".", "..") for part in name.split("/")))
|
||||
|
||||
|
||||
def parsed(data):
|
||||
def unique(items):
|
||||
result = {}
|
||||
for key, value in items:
|
||||
need(key not in result, "duplicate JSON key: " + key)
|
||||
result[key] = value
|
||||
return result
|
||||
return json.loads(data, object_pairs_hook=unique)
|
||||
|
||||
|
||||
def norm(path):
|
||||
return path.replace("\\", "/").rstrip("/")
|
||||
|
||||
|
||||
def relative(path, root):
|
||||
prefix = norm(root) + "/"
|
||||
need(norm(path).startswith(prefix), "recorded path outside owner: " + path)
|
||||
value = norm(path)[len(prefix):]
|
||||
need(safe(value), "unsafe recorded relative path")
|
||||
return value
|
||||
|
||||
|
||||
def ordered(*values):
|
||||
times = [datetime.fromisoformat(value) for value in values]
|
||||
return all(t.utcoffset() is not None for t in times) and times == sorted(times)
|
||||
|
||||
|
||||
def zip_inventory(archive, members):
|
||||
names = archive.namelist()
|
||||
need(len(names) == len(set(names)) and set(names) == set(members), "exact archive members")
|
||||
for info in archive.infolist():
|
||||
need(safe(info.filename) and not info.is_dir() and not stat.S_ISLNK(info.external_attr >> 16), "unsafe archive member")
|
||||
need(info.file_size == members[info.filename]["bytes"], "archive member size")
|
||||
|
||||
|
||||
def verify_data(manifest, read):
|
||||
need(manifest["schema"] == 1 and manifest["kind"] == "multiselect-native", "manifest kind")
|
||||
members, runs = manifest["members"], manifest["runs"]
|
||||
need(bool(runs) and all(safe(run) and "/" not in run for run in runs), "run names")
|
||||
need(all(safe(name) for name in members), "safe member names")
|
||||
for name, expected in members.items():
|
||||
need(pin(read(name)) == expected, "member pin: " + name)
|
||||
used = set()
|
||||
def raw(name):
|
||||
need(name in members, "missing member: " + name)
|
||||
used.add(name)
|
||||
return read(name)
|
||||
def obj(name):
|
||||
return parsed(raw(name))
|
||||
def tree(prefix):
|
||||
return {name[len(prefix):]: raw(name) for name in members if name.startswith(prefix)}
|
||||
def pinned_tree(prefix, expected):
|
||||
actual = tree(prefix)
|
||||
need({name: pin(data) for name, data in actual.items()} == expected, "exact pinned tree: " + prefix)
|
||||
return actual
|
||||
for run, spec in runs.items():
|
||||
prefix = "runs/" + run + "/raw/"
|
||||
start, end = obj(prefix + "started.json"), obj(prefix + "finished.json")
|
||||
generation, process = obj(prefix + "generation.json"), obj(prefix + "processes.json")
|
||||
history = obj(prefix + "history-bytes.json")
|
||||
need(end["exitCode"] == 0 and all(end[key] is True for key in
|
||||
("guiUnchanged", "checkerUnchanged", "fixtureUnchanged")), run + ": clean unchanged closure")
|
||||
need(ordered(generation["start"], generation["finish"], process["CreationDate"], start["start"], end["finish"], history["verified"]), run + ": process/generation times")
|
||||
need(process["ProcessId"] == start["pid"] and type(start["pid"]) is int and start["pid"] > 0, run + ": process identity")
|
||||
need(norm(process["ExecutablePath"]) == norm(start["gui"]["binary"])
|
||||
and start["command"] == [start["gui"]["binary"]], run + ": GUI command")
|
||||
need(spec["originalRun"] == norm(start["cwd"]) + "/.local/state-multiselect-native/" + run, run + ": original run mapping")
|
||||
need(generation["exitCode"] == 0 and generation["checker"] == start["checker"], run + ": generation checker")
|
||||
need(generation["command"][:2] == [start["checker"]["binary"], "generate"]
|
||||
and len(generation["command"]) == 3 and norm(generation["command"][2]) == spec["originalFixture"], run + ": generation command")
|
||||
for stream in ("stdout", "stderr"):
|
||||
need(end[stream] == pin(raw(prefix + "app." + stream + ".log")), run + ": app stream")
|
||||
need(generation[stream] == pin(raw(prefix + "generation." + stream + ".log")), run + ": generation stream")
|
||||
fixture = pinned_tree("runs/" + run + "/fixture/", start["fixture"])
|
||||
need(set(fixture) == {"baseline.json", "manifest.json"} | {"source/" + name for name in
|
||||
obj(prefix + "snapshots/baseline/result.json")["source"]}, run + ": fixture membership")
|
||||
fixture_manifest = parsed(fixture["manifest.json"])
|
||||
need(fixture_manifest["fixture"] == "state-multiselect-native-20260923"
|
||||
and fixture_manifest["source_entry"] == "project.arcadia", run + ": fixture identity")
|
||||
need(parsed(fixture["baseline.json"])["id"] == fixture_manifest["ids"]["project"], run + ": baseline identity")
|
||||
for key, expected in [("helper", start["helper"]), ("capture", start["capture"]),
|
||||
("snapshotHelper", start["snapshotHelper"]), ("history", history["helper"])]:
|
||||
need(pin(raw(spec["helpers"][key])) == expected, run + ": helper " + key)
|
||||
builds = {}
|
||||
for kind, target in [("gui", "arcadia-studio"), ("checker", "state_multiselect_native")]:
|
||||
recorded = start[kind]
|
||||
build = obj(spec["builds"][kind]["receipt"])
|
||||
need(pin(raw(spec["builds"][kind]["receipt"])) == recorded["receiptPin"], run + ": build receipt pin")
|
||||
need(relative(recorded["receipt"], start["cwd"]) == spec["builds"][kind]["originalRelative"], run + ": build path mapping")
|
||||
need(build["exitCode"] == 0 and build["inputsUnchanged"] is True
|
||||
and ordered(build["start"], build["finish"], generation["start"]), run + ": accepted preceding build")
|
||||
need(build["inputs"] == recorded["inputs"] == pin(raw(spec["builds"][kind]["inputs"])), run + ": build input map")
|
||||
need(pin(raw(spec["builds"][kind]["helper"])) == build["helper"], run + ": build helper pin")
|
||||
inputs = obj(spec["builds"][kind]["inputs"])
|
||||
need(len(inputs) == build["inputCount"] and sum(name.startswith("crates/vendor/iced_widget/") for name in inputs) == 71, run + ": build input count")
|
||||
artifacts = [item for item in build["artifacts"] if item["cargo"]["target"]["name"] == target]
|
||||
need(len(artifacts) == 1 and artifacts[0]["readback"] == recorded["pin"]
|
||||
and artifacts[0]["cargo"]["executable"] == recorded["binary"], run + ": executable relationship")
|
||||
builds[kind] = inputs
|
||||
need(start["gui"]["inputs"] == start["checker"]["inputs"], run + ": matching GUI/checker inputs")
|
||||
source = spec["checkerSource"]
|
||||
need(source["inputPath"] == "crates/oa-core/examples/state_multiselect_native.rs"
|
||||
and pin(raw(source["member"])) == builds["checker"][source["inputPath"]], run + ": archived exact checker source")
|
||||
|
||||
top = {name[len(prefix):] for name in members if name.startswith(prefix) and "/" not in name[len(prefix):]}
|
||||
captures = sorted(name for name in top - BASE if name.endswith(".json"))
|
||||
need(bool(captures), run + ": missing captures")
|
||||
expected_top = set(BASE) | set(captures)
|
||||
captured_window = None
|
||||
for name in captures:
|
||||
capture = obj(prefix + name)
|
||||
need(ordered(start["start"], capture["time"], end["finish"]), run + ": capture lifetime")
|
||||
window = capture["window"]
|
||||
app = window["app"]
|
||||
need(isinstance(app, str) and app.startswith("process:")
|
||||
and norm(app[len("process:"):]) == norm(start["gui"]["binary"]), run + ": captured executable relationship")
|
||||
need(type(window["id"]) is int and window["id"] > 0, run + ": captured window identity")
|
||||
if captured_window is None:
|
||||
captured_window = window["id"]
|
||||
need(window["id"] == captured_window, run + ": inconsistent captured window identity")
|
||||
need(isinstance(capture["images"], list), run + ": capture images")
|
||||
for image in capture["images"]:
|
||||
filename = image["file"]
|
||||
need(safe(filename) and "/" not in filename and filename.startswith(name[:-5] + "-")
|
||||
and filename.endswith((".jpg", ".png")), run + ": capture image mapping")
|
||||
need(type(image["width"]) is int and image["width"] > 0
|
||||
and type(image["height"]) is int and image["height"] > 0, run + ": image dimensions")
|
||||
need(filename not in expected_top, run + ": duplicate image reference")
|
||||
expected_top.add(filename)
|
||||
raw(prefix + filename)
|
||||
need(top == expected_top, run + ": extra/missing top-level run files")
|
||||
|
||||
snapshots = {name[len(prefix + "snapshots/"):].split("/")[0] for name in members if name.startswith(prefix + "snapshots/")}
|
||||
extras = spec["extraUnchangedSnapshots"]
|
||||
need(isinstance(extras, list) and len(extras) == len(set(extras))
|
||||
and all(safe(label) and "/" not in label and label not in MODES for label in extras), run + ": explicit extra unchanged labels")
|
||||
modes = dict(MODES, **{label: "unchanged" for label in extras})
|
||||
need(snapshots == set(modes), run + ": exact nine history plus declared unchanged snapshot labels")
|
||||
states = {}
|
||||
for label, mode in modes.items():
|
||||
folder = prefix + "snapshots/" + label + "/"
|
||||
began, result = obj(folder + "started.json"), obj(folder + "result.json")
|
||||
need(all(result.get(key) == value for key, value in began.items()), label + ": start/result")
|
||||
need(result["exitCode"] == 0 and all(result[key] is True for key in
|
||||
("binaryUnchanged", "workingSourceUnchanged", "baselineUnchanged")), label + ": unchanged successful checker")
|
||||
need(ordered(start["start"], result["start"], result["finish"], end["finish"]), label + ": checker lifetime")
|
||||
need(result["buildReceipt"] == start["checker"]["receiptPin"] and result["binary"] == start["checker"]["pin"]
|
||||
and result["helper"] == start["snapshotHelper"], label + ": checker provenance")
|
||||
need(result["baseline"] == pin(fixture["baseline.json"]), label + ": baseline pin")
|
||||
command = result["command"]
|
||||
need(len(command) == 5 and command[:3] == [start["checker"]["binary"], "check", mode]
|
||||
and norm(command[3]) == spec["originalFixture"] + "/baseline.json"
|
||||
and norm(command[4]) == spec["originalRun"] + "/snapshots/" + label + "/source/project.arcadia", label + ": exact checker command")
|
||||
for stream in ("stdout", "stderr"):
|
||||
need(result[stream] == pin(raw(folder + stream + ".log")), label + ": stream pin")
|
||||
need(not raw(folder + "stderr.log"), label + ": checker stderr")
|
||||
report = obj(folder + "stdout.log")
|
||||
need(report["result"] == "PASS" and report["comparison"] == "complete Project equality"
|
||||
and report["mode"] == mode and report["baseline"] == command[3] and report["saved"] == command[4], label + ": positive checker report")
|
||||
delta = report["inferred_common_delta"]
|
||||
if mode == "moved":
|
||||
need(isinstance(delta, dict) and set(delta) == {"x", "y"}
|
||||
and all(type(v) in (int, float) and math.isfinite(v) and abs(v) <= 300 for v in delta.values())
|
||||
and math.hypot(delta["x"], delta["y"]) >= 0.01, label + ": inferred State movement bounds")
|
||||
else:
|
||||
need(delta is None, label + ": unexpected inferred delta")
|
||||
states[label] = pinned_tree(folder + "source/", result["source"])
|
||||
need(len(states[label]) == history["sourceFilesPerSnapshot"] == len(fixture) - 2, label + ": source count")
|
||||
expected = {folder + name for name in ("started.json", "result.json", "stdout.log", "stderr.log")}
|
||||
expected.update(folder + "source/" + name for name in states[label])
|
||||
need({name for name in members if name.startswith(folder)} == expected, label + ": extra snapshot files")
|
||||
need(all(states[label] == states["baseline"] for label in extras), run + ": extra snapshots equal baseline bytes")
|
||||
need(history["status"] == "PASS" and history["equalByteGroups"] == GROUPS, run + ": history groups")
|
||||
for group in GROUPS:
|
||||
need(all(states[label] == states[group[0]] for label in group), run + ": actual history bytes " + str(group))
|
||||
need(all(states[a[0]] != states[b[0]] for i, a in enumerate(GROUPS) for b in GROUPS[i + 1:]), run + ": distinct history states")
|
||||
need(states["baseline"] == {name[7:]: data for name, data in fixture.items() if name.startswith("source/")}, run + ": baseline source exact")
|
||||
changed = {label: sorted(name for name in set(states["baseline"]) | set(states[label])
|
||||
if states["baseline"].get(name) != states[label].get(name)) for label in ("move", "hidden")}
|
||||
need(changed == history["changedFilesFromBaseline"]
|
||||
== {label: ["views/diagram_state_view.arcadia"] for label in ("move", "hidden")}, run + ": changed source files")
|
||||
print(run, "closed exit 0;", len(captures), "captures;", len(modes), "positive snapshots; exact three-group source history")
|
||||
need(used == set(members), "unreferenced/extra package members")
|
||||
return {"runs": len(runs), "members": len(members)}
|
||||
|
||||
|
||||
def verify_package(root):
|
||||
files = parsed((root / "files.json").read_bytes())
|
||||
need(set(files) == OUTER, "outer files")
|
||||
for name, expected in files.items():
|
||||
need(pin((root / name).read_bytes()) == expected, "outer pin: " + name)
|
||||
manifest = parsed((root / "manifest.json").read_bytes())
|
||||
with zipfile.ZipFile(root / "evidence.zip") as archive:
|
||||
zip_inventory(archive, manifest["members"])
|
||||
return verify_data(manifest, archive.read)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("package", nargs="?", type=Path, default=Path(__file__).resolve().parent)
|
||||
args = parser.parse_args()
|
||||
print("PASS native evidence byte/receipt consistency:", verify_package(args.package))
|
||||
print("No GUI/checker execution; actions and native acceptance require the separate parent review.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1 @@
|
||||
* -text
|
||||
@@ -0,0 +1,58 @@
|
||||
# State multiselect source identity evidence
|
||||
|
||||
The source receipts bind two historical captured input maps to exact Git trees:
|
||||
|
||||
| Gate | Commit | Inputs | Input-map SHA-256 |
|
||||
| --- | --- | ---: | --- |
|
||||
| desktop-2 | 2a3b9ba822a49ead233c4b5f98412a07c1c1da12 | 733 | 9cf85879dfb0bb5ec3b15c66b23df316e6bfe8451b6cf0c895bf7b9b5fbdde4a |
|
||||
| lint-2 | 3480b54201a5f361cca0bcd0d45dd6546a7a7bc9 | 735 | 4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf |
|
||||
|
||||
The original receipts are preserved without rewriting. The verifier fixes their
|
||||
exact byte pins, commit IDs, map pins/counts and explicitCompileTimeFixtures.
|
||||
The historical 733-input scope excludes two compile-time fixtures; the final
|
||||
735-input scope explicitly includes both:
|
||||
|
||||
- harness/experiments/edge-attachments-20260922/native-fixture.arcadia
|
||||
- harness/experiments/textual-authoring-20260911/alarm-response.arcadia
|
||||
|
||||
Matching an old Git tree does not correct those historical scope omissions or
|
||||
establish the final source's behavior. A gate applies to its captured input map.
|
||||
Later native build maps must independently match the final 735-input map before
|
||||
using this source identity evidence for those builds.
|
||||
|
||||
From this tool directory, prepare against completed raw captures without writing:
|
||||
|
||||
```
|
||||
python -B prepare.py --raw-gates CHECKOUT/.local/state-group-gates --repo CHECKOUT --check-only
|
||||
```
|
||||
|
||||
After the strict sibling checks package is complete, add --checks CHECKS_PACKAGE,
|
||||
omit --check-only, and provide --output NEW_SOURCE_PACKAGE. Existing output is
|
||||
refused. Preparation preserves the source receipts, tools and README, writes
|
||||
files.json pins, and performs readback. No ZIP is created by the source preparer.
|
||||
|
||||
A completed portable package can be verified without the original checkout:
|
||||
|
||||
```
|
||||
python -B SOURCE_PACKAGE/verify.py
|
||||
```
|
||||
|
||||
By default it reads the sibling ../checks package; override with --checks PATH.
|
||||
It verifies checks outer/member pins, capsule relationships and both selected
|
||||
nested source ZIPs against their exact maps. It checks source receipt identity,
|
||||
accepted unchanged gate flags, scope/counts and all source package pins. Run the
|
||||
sibling checks verifier separately for full process/helper/stream relationships.
|
||||
|
||||
Add --repo CHECKOUT to independently repeat the complete filtered Git inventory
|
||||
and exact blob-byte comparison against both pinned commits already present there.
|
||||
Without --repo, verification checks historical receipt/capsule consistency and
|
||||
explicitly reports that Git comparison was not rerun. No archived helpers or
|
||||
source executables are run; no build, checkout, extraction or network is needed.
|
||||
|
||||
verify-committed-inputs.py remains the generic comparator used to create source
|
||||
receipts. Its --include-fixtures option includes both explicit fixtures; omission
|
||||
keeps the historical scope. It accepts explicit gate/full commit IDs, defaults to
|
||||
read-only comparison, and writes only an optional new --output receipt.
|
||||
|
||||
Receipts and pins establish internal byte consistency, not external authentication,
|
||||
hermetic toolchains, test execution, native usability or complete issue acceptance.
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
".gitattributes": {
|
||||
"bytes": 9,
|
||||
"sha256": "8b9c3028d6467ff3be7c793141927841d70f47f52d0590677438f488ca154992"
|
||||
},
|
||||
"README.md": {
|
||||
"bytes": 3092,
|
||||
"sha256": "b122e41bb9c52b4384e09cd62ee4115a68ff16d5aefee2f92fe632b07276d017"
|
||||
},
|
||||
"prepare.py": {
|
||||
"bytes": 2100,
|
||||
"sha256": "1be2f2a402b493a1c9700044f1119ed8ccddaa02baec2ecd25a185aba6253112"
|
||||
},
|
||||
"source-desktop-2.json": {
|
||||
"bytes": 428,
|
||||
"sha256": "6012bdc52a3843c9cfd5f3c80ec4270a7c0f1e13ef4738b0e3f4ed048ff8d885"
|
||||
},
|
||||
"source-lint-2.json": {
|
||||
"bytes": 583,
|
||||
"sha256": "e0a6deab68683278965643f6f34a1038fcea25c1f242b6f75f5559b7697ec7d6"
|
||||
},
|
||||
"verify-committed-inputs.py": {
|
||||
"bytes": 5712,
|
||||
"sha256": "3cd4f0155cd29c6786f467562d458a380084b2a510eac6454a29388f8f048772"
|
||||
},
|
||||
"verify.py": {
|
||||
"bytes": 10126,
|
||||
"sha256": "e670dc47e89a6ad5cdf7f9adfb6a50797270e475d6b312f159f7aef941ae723b"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
"""Prepare pinned source receipts after raw/sibling capture validation; never build."""
|
||||
from pathlib import Path
|
||||
import argparse, json
|
||||
from verify import HERE, SPECS, TOOLS, FILES, need, pin, verify_data, raw_captures, packaged, verify_package
|
||||
|
||||
def main():
|
||||
parser=argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('--raw-gates',type=Path,required=True,help='original raw gates and source-RUN.json receipts')
|
||||
parser.add_argument('--checks',type=Path,help='completed sibling checks package; required when writing')
|
||||
parser.add_argument('--repo',type=Path,help='optionally rerun exact committed Git-blob comparison')
|
||||
parser.add_argument('--output',type=Path,help='new source package directory')
|
||||
parser.add_argument('--check-only',action='store_true')
|
||||
args=parser.parse_args()
|
||||
receipts={run:(args.raw_gates/('source-'+run+'.json')).read_bytes() for run in SPECS}
|
||||
captured=packaged(args.checks) if args.checks else raw_captures(args.raw_gates)
|
||||
summary=verify_data(receipts,captured,args.repo)
|
||||
if args.check_only:
|
||||
print('PASS source check-only; no package written:',summary); return
|
||||
need(args.checks is not None,'written portable source package requires completed --checks package')
|
||||
need(args.output is not None,'explicit new --output required')
|
||||
out=args.output.resolve(); need(not out.exists(),'existing package refused')
|
||||
payload={name:(HERE/name).read_bytes() for name in TOOLS}
|
||||
payload.update({'source-'+run+'.json':data for run,data in receipts.items()})
|
||||
need(set(payload)==FILES,'exact source files')
|
||||
out.mkdir(parents=True)
|
||||
for name,data in payload.items():
|
||||
with (out/name).open('xb') as stream: stream.write(data)
|
||||
with (out/'files.json').open('x',encoding='utf-8') as stream:
|
||||
json.dump({name:pin(data) for name,data in sorted(payload.items())},stream,indent=2)
|
||||
# Git comparison was already performed above when requested; readback is byte-only.
|
||||
verify_package(out,args.checks)
|
||||
print('PASS written source package readback:',out,summary)
|
||||
if __name__=='__main__': main()
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"checked": "2026-09-23T10:37:38.419535+00:00",
|
||||
"commit": "2a3b9ba822a49ead233c4b5f98412a07c1c1da12",
|
||||
"gate": "desktop-2",
|
||||
"inputCount": 733,
|
||||
"inputMap": {
|
||||
"bytes": 122682,
|
||||
"sha256": "9cf85879dfb0bb5ec3b15c66b23df316e6bfe8451b6cf0c895bf7b9b5fbdde4a"
|
||||
},
|
||||
"comparison": "Exact committed Git blobs equal every captured input; same complete filtered inventory",
|
||||
"explicitCompileTimeFixtures": []
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"checked": "2026-09-23T10:37:40.478617+00:00",
|
||||
"commit": "3480b54201a5f361cca0bcd0d45dd6546a7a7bc9",
|
||||
"gate": "lint-2",
|
||||
"inputCount": 735,
|
||||
"inputMap": {
|
||||
"bytes": 123053,
|
||||
"sha256": "4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf"
|
||||
},
|
||||
"comparison": "Exact committed Git blobs equal every captured input; same complete filtered inventory",
|
||||
"explicitCompileTimeFixtures": [
|
||||
"harness/experiments/edge-attachments-20260922/native-fixture.arcadia",
|
||||
"harness/experiments/textual-authoring-20260911/alarm-response.arcadia"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
"""Compare captured input maps to exact named Git trees; no builds or checkouts."""
|
||||
from pathlib import Path, PurePosixPath
|
||||
import argparse
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
import zipfile
|
||||
|
||||
HERE = Path(__file__).resolve().parent
|
||||
COMPARISON = "Exact committed Git blobs equal every captured input; same complete filtered inventory"
|
||||
EXPLICIT_FIXTURES = {
|
||||
"harness/experiments/edge-attachments-20260922/native-fixture.arcadia",
|
||||
"harness/experiments/textual-authoring-20260911/alarm-response.arcadia",
|
||||
}
|
||||
INCLUDE_FIXTURES = False
|
||||
|
||||
|
||||
def need(ok, message):
|
||||
if not ok:
|
||||
raise ValueError(message)
|
||||
|
||||
|
||||
def pin(data):
|
||||
return {"bytes": len(data), "sha256": hashlib.sha256(data).hexdigest()}
|
||||
|
||||
|
||||
def parsed(data):
|
||||
def unique(items):
|
||||
result = {}
|
||||
for key, value in items:
|
||||
need(key not in result, "duplicate JSON key: " + key)
|
||||
result[key] = value
|
||||
return result
|
||||
return json.loads(data, object_pairs_hook=unique)
|
||||
|
||||
|
||||
def safe(name):
|
||||
return (isinstance(name, str) and bool(name) and "\\" not in name and ":" not in name
|
||||
and not PurePosixPath(name).is_absolute()
|
||||
and all(part not in ("", ".", "..") for part in name.split("/")))
|
||||
|
||||
|
||||
def relevant(path):
|
||||
return (INCLUDE_FIXTURES and path in EXPLICIT_FIXTURES) or path in ("Cargo.toml", "Cargo.lock", "rust-toolchain.toml") or path.startswith(
|
||||
("crates/", "build/", ".cargo/", "scripts/", "docs/", "examples/", "harness/fixtures/", "harness/prototypes/"))
|
||||
|
||||
|
||||
def git(repo, *arguments, data=None):
|
||||
environment = dict(os.environ, GIT_NO_LAZY_FETCH="1")
|
||||
return subprocess.run(["git", *arguments], cwd=repo, input=data, stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE, check=True, env=environment).stdout
|
||||
|
||||
|
||||
def compare_commit(repo, commit, inputs):
|
||||
need(git(repo, "rev-parse", "--verify", commit + "^{commit}").decode().strip() == commit, "named commit unavailable")
|
||||
entries = git(repo, "ls-tree", "-r", "--full-tree", "-z", commit).split(b"\0")
|
||||
blobs = {}
|
||||
for entry in filter(None, entries):
|
||||
header, path_bytes = entry.split(b"\t", 1)
|
||||
path = path_bytes.decode("utf-8")
|
||||
if relevant(path):
|
||||
_mode, kind, oid = header.split()
|
||||
need(kind == b"blob", "relevant non-blob tree entry: " + path)
|
||||
need(path not in blobs, "duplicate tree path")
|
||||
blobs[path] = oid
|
||||
need(set(blobs) == set(inputs), "complete filtered Git inventory differs; missing="
|
||||
+ repr(sorted(set(inputs) - set(blobs))) + "; additional=" + repr(sorted(set(blobs) - set(inputs))))
|
||||
# Object IDs avoid path quoting and commit:path interpretation in batch input.
|
||||
paths = sorted(blobs)
|
||||
data = git(repo, "cat-file", "--batch", data=b"".join(blobs[path] + b"\n" for path in paths))
|
||||
offset, actual = 0, {}
|
||||
for path in paths:
|
||||
end = data.index(b"\n", offset)
|
||||
oid, kind, size_bytes = data[offset:end].split()
|
||||
size = int(size_bytes)
|
||||
need(oid == blobs[path] and kind == b"blob" and size >= 0, "Git batch object relationship")
|
||||
content = data[end + 1:end + 1 + size]
|
||||
need(len(content) == size and data[end + 1 + size:end + 2 + size] == b"\n", "Git batch framing")
|
||||
actual[path] = pin(content)
|
||||
offset = end + 2 + size
|
||||
need(offset == len(data), "trailing Git batch bytes")
|
||||
different = [path for path in paths if actual[path] != inputs[path]]
|
||||
need(not different, "captured bytes differ from named commit: " + repr(different))
|
||||
|
||||
|
||||
|
||||
def main():
|
||||
import datetime
|
||||
global INCLUDE_FIXTURES
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--repo", type=Path, required=True)
|
||||
parser.add_argument("--raw-gates", type=Path, required=True)
|
||||
parser.add_argument("--gate", required=True)
|
||||
parser.add_argument("--commit", required=True, help="exact full commit object ID, not a branch")
|
||||
parser.add_argument("--include-fixtures", action="store_true", help="include both compile-time fixtures for the revised 735-input scope; default preserves historical 733-input scope")
|
||||
parser.add_argument("--output", type=Path, help="optional new receipt file; otherwise read-only check")
|
||||
args = parser.parse_args()
|
||||
INCLUDE_FIXTURES = args.include_fixtures
|
||||
need(safe(args.gate) and "/" not in args.gate, "safe gate name")
|
||||
folder = args.raw_gates / args.gate
|
||||
map_bytes = (folder / "inputs.json").read_bytes()
|
||||
result = parsed((folder / "result.json").read_bytes())
|
||||
inputs = parsed(map_bytes)
|
||||
need(result["exitCode"] == 0 and result["inputsUnchanged"] is True, "accepted unchanged gate required")
|
||||
need(result["inputs"] == pin(map_bytes) and result["inputCount"] == len(inputs), "map relationship")
|
||||
need(all(safe(path) and relevant(path) for path in inputs), "input scope")
|
||||
need(sum(path.startswith("crates/vendor/iced_widget/") for path in inputs) == 71, "vendor inventory")
|
||||
compare_commit(args.repo, args.commit, inputs)
|
||||
report = {"checked": datetime.datetime.now(datetime.timezone.utc).isoformat(),
|
||||
"commit": args.commit, "gate": args.gate, "inputCount": len(inputs),
|
||||
"inputMap": pin(map_bytes), "comparison": COMPARISON,
|
||||
"explicitCompileTimeFixtures": sorted(EXPLICIT_FIXTURES) if INCLUDE_FIXTURES else []}
|
||||
if args.output:
|
||||
with args.output.open("x", encoding="utf-8") as stream:
|
||||
json.dump(report, stream, indent=2)
|
||||
print("PASS exact Git tree/blobs:", json.dumps(report))
|
||||
print("Source identity only; separately verify capture/archive consistency. No build, checkout or native acceptance claim.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,173 @@
|
||||
"""Verify pinned State source receipts against sibling capture capsules; optionally compare Git blobs."""
|
||||
from pathlib import Path, PurePosixPath
|
||||
import argparse
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
import zipfile
|
||||
import io
|
||||
import stat
|
||||
|
||||
HERE = Path(__file__).resolve().parent
|
||||
COMPARISON = "Exact committed Git blobs equal every captured input; same complete filtered inventory"
|
||||
EXPLICIT_FIXTURES = {
|
||||
"harness/experiments/edge-attachments-20260922/native-fixture.arcadia",
|
||||
"harness/experiments/textual-authoring-20260911/alarm-response.arcadia",
|
||||
}
|
||||
INCLUDE_FIXTURES = False
|
||||
|
||||
|
||||
def need(ok, message):
|
||||
if not ok:
|
||||
raise ValueError(message)
|
||||
|
||||
|
||||
def pin(data):
|
||||
return {"bytes": len(data), "sha256": hashlib.sha256(data).hexdigest()}
|
||||
|
||||
|
||||
def parsed(data):
|
||||
def unique(items):
|
||||
result = {}
|
||||
for key, value in items:
|
||||
need(key not in result, "duplicate JSON key: " + key)
|
||||
result[key] = value
|
||||
return result
|
||||
return json.loads(data, object_pairs_hook=unique)
|
||||
|
||||
|
||||
def safe(name):
|
||||
return (isinstance(name, str) and bool(name) and "\\" not in name and ":" not in name
|
||||
and not PurePosixPath(name).is_absolute()
|
||||
and all(part not in ("", ".", "..") for part in name.split("/")))
|
||||
|
||||
|
||||
def relevant(path):
|
||||
return (INCLUDE_FIXTURES and path in EXPLICIT_FIXTURES) or path in ("Cargo.toml", "Cargo.lock", "rust-toolchain.toml") or path.startswith(
|
||||
("crates/", "build/", ".cargo/", "scripts/", "docs/", "examples/", "harness/fixtures/", "harness/prototypes/"))
|
||||
|
||||
|
||||
def git(repo, *arguments, data=None):
|
||||
environment = dict(os.environ, GIT_NO_LAZY_FETCH="1")
|
||||
return subprocess.run(["git", *arguments], cwd=repo, input=data, stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE, check=True, env=environment).stdout
|
||||
|
||||
|
||||
def compare_commit(repo, commit, inputs):
|
||||
need(git(repo, "rev-parse", "--verify", commit + "^{commit}").decode().strip() == commit, "named commit unavailable")
|
||||
entries = git(repo, "ls-tree", "-r", "--full-tree", "-z", commit).split(b"\0")
|
||||
blobs = {}
|
||||
for entry in filter(None, entries):
|
||||
header, path_bytes = entry.split(b"\t", 1)
|
||||
path = path_bytes.decode("utf-8")
|
||||
if relevant(path):
|
||||
_mode, kind, oid = header.split()
|
||||
need(kind == b"blob", "relevant non-blob tree entry: " + path)
|
||||
need(path not in blobs, "duplicate tree path")
|
||||
blobs[path] = oid
|
||||
need(set(blobs) == set(inputs), "complete filtered Git inventory differs; missing="
|
||||
+ repr(sorted(set(inputs) - set(blobs))) + "; additional=" + repr(sorted(set(blobs) - set(inputs))))
|
||||
# Object IDs avoid path quoting and commit:path interpretation in batch input.
|
||||
paths = sorted(blobs)
|
||||
data = git(repo, "cat-file", "--batch", data=b"".join(blobs[path] + b"\n" for path in paths))
|
||||
offset, actual = 0, {}
|
||||
for path in paths:
|
||||
end = data.index(b"\n", offset)
|
||||
oid, kind, size_bytes = data[offset:end].split()
|
||||
size = int(size_bytes)
|
||||
need(oid == blobs[path] and kind == b"blob" and size >= 0, "Git batch object relationship")
|
||||
content = data[end + 1:end + 1 + size]
|
||||
need(len(content) == size and data[end + 1 + size:end + 2 + size] == b"\n", "Git batch framing")
|
||||
actual[path] = pin(content)
|
||||
offset = end + 2 + size
|
||||
need(offset == len(data), "trailing Git batch bytes")
|
||||
different = [path for path in paths if actual[path] != inputs[path]]
|
||||
need(not different, "captured bytes differ from named commit: " + repr(different))
|
||||
|
||||
|
||||
|
||||
SPECS = {'desktop-2': {'commit': '2a3b9ba822a49ead233c4b5f98412a07c1c1da12', 'inputCount': 733, 'inputMap': {'bytes': 122682, 'sha256': '9cf85879dfb0bb5ec3b15c66b23df316e6bfe8451b6cf0c895bf7b9b5fbdde4a'}, 'explicitCompileTimeFixtures': [], 'receiptPin': {'bytes': 428, 'sha256': '6012bdc52a3843c9cfd5f3c80ec4270a7c0f1e13ef4738b0e3f4ed048ff8d885'}}, 'lint-2': {'commit': '3480b54201a5f361cca0bcd0d45dd6546a7a7bc9', 'inputCount': 735, 'inputMap': {'bytes': 123053, 'sha256': '4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf'}, 'explicitCompileTimeFixtures': ['harness/experiments/edge-attachments-20260922/native-fixture.arcadia', 'harness/experiments/textual-authoring-20260911/alarm-response.arcadia'], 'receiptPin': {'bytes': 583, 'sha256': 'e0a6deab68683278965643f6f34a1038fcea25c1f242b6f75f5559b7697ec7d6'}}}
|
||||
TOOLS = {".gitattributes", "prepare.py", "verify.py", "verify-committed-inputs.py", "README.md"}
|
||||
FILES = TOOLS | {"source-" + run + ".json" for run in SPECS}
|
||||
|
||||
def inventory(archive, expected):
|
||||
names = archive.namelist()
|
||||
need(len(names) == len(set(names)) and set(names) == set(expected), "exact ZIP inventory")
|
||||
for item in archive.infolist():
|
||||
need(safe(item.filename) and not item.is_dir() and not stat.S_ISLNK(item.external_attr >> 16), "safe ZIP member")
|
||||
need(pin(archive.read(item.filename)) == expected[item.filename], "ZIP member pin: " + item.filename)
|
||||
|
||||
def verify_data(receipts, captured, repo=None):
|
||||
global INCLUDE_FIXTURES
|
||||
need(set(receipts) == set(captured) == set(SPECS), "exact source run inventory")
|
||||
for run, spec in SPECS.items():
|
||||
receipt_bytes = receipts[run]
|
||||
need(pin(receipt_bytes) == spec["receiptPin"], run + ": exact historical receipt bytes")
|
||||
receipt = parsed(receipt_bytes)
|
||||
need(receipt["gate"] == run and receipt["comparison"] == COMPARISON, run + ": receipt identity")
|
||||
need(all(receipt[key] == spec[key] for key in ("commit", "inputCount", "inputMap", "explicitCompileTimeFixtures")), run + ": pinned receipt relationships")
|
||||
map_bytes, result, archive_bytes = captured[run]
|
||||
need(pin(map_bytes) == spec["inputMap"] == result["inputs"], run + ": exact captured input map")
|
||||
need(result["exitCode"] == 0 and result["inputsUnchanged"] is True, run + ": accepted unchanged gate")
|
||||
inputs = parsed(map_bytes)
|
||||
need(len(inputs) == spec["inputCount"] == result["inputCount"], run + ": input counts")
|
||||
INCLUDE_FIXTURES = bool(spec["explicitCompileTimeFixtures"])
|
||||
need(spec["explicitCompileTimeFixtures"] == (sorted(EXPLICIT_FIXTURES) if INCLUDE_FIXTURES else []), run + ": exact fixture scope")
|
||||
need(all(safe(name) and relevant(name) for name in inputs), run + ": input scope")
|
||||
need((EXPLICIT_FIXTURES & set(inputs)) == (EXPLICIT_FIXTURES if INCLUDE_FIXTURES else set()), run + ": explicit fixture membership")
|
||||
need(sum(name.startswith("crates/vendor/iced_widget/") for name in inputs) == 71, run + ": vendor count")
|
||||
need(pin(archive_bytes) == result["archive"], run + ": source capsule pin")
|
||||
with zipfile.ZipFile(io.BytesIO(archive_bytes)) as archive:
|
||||
inventory(archive, inputs)
|
||||
if repo is not None:
|
||||
compare_commit(repo, spec["commit"], inputs)
|
||||
print("PASS", run, spec["commit"], len(inputs), "source pins" + (" and exact Git blobs" if repo is not None else " (Git comparison not rerun)"))
|
||||
return {"runs": len(SPECS), "gitCompared": repo is not None}
|
||||
|
||||
def raw_captures(gates):
|
||||
return {run: ((gates/run/"inputs.json").read_bytes(), parsed((gates/run/"result.json").read_bytes()),
|
||||
(gates/run/"inputs.zip").read_bytes()) for run in SPECS}
|
||||
|
||||
def packaged(checks):
|
||||
files = parsed((checks/"files.json").read_bytes())
|
||||
need(set(files) == {"prepare.py", "verify.py", "README.md", "manifest.json", "evidence.zip"}, "checks outer inventory")
|
||||
for name, expected in files.items():
|
||||
need(pin((checks/name).read_bytes()) == expected, "checks outer pin: " + name)
|
||||
manifest = parsed((checks/"manifest.json").read_bytes())
|
||||
need(manifest["schema"] == 1 and manifest["kind"] == "multiselect-cargo-gates", "checks kind")
|
||||
logical, members = manifest["logicalFiles"], manifest["members"]
|
||||
need(all(safe(name) and safe(target) for name,target in logical.items()) and set(logical.values()) == set(members), "checks logical inventory")
|
||||
captured = {}
|
||||
with zipfile.ZipFile(checks/"evidence.zip") as archive:
|
||||
inventory(archive, members)
|
||||
for run in SPECS:
|
||||
prefix = "cargo/" + run + "/"
|
||||
result = parsed(archive.read(logical[prefix + "result.json"]))
|
||||
spec = manifest["runs"][run]
|
||||
need(all(result[key] == spec[key] for key in ("command", "head", "exitCode", "inputCount")), run + ": checks relationships")
|
||||
for name in ("inputs.json", "inputs.zip"):
|
||||
member = logical[prefix+name]
|
||||
need(member == "capsules/" + members[member]["sha256"] + Path(name).suffix, run + ": source capsule mapping")
|
||||
captured[run] = (archive.read(logical[prefix+"inputs.json"]), result, archive.read(logical[prefix+"inputs.zip"]))
|
||||
return captured
|
||||
|
||||
def verify_package(package, checks, repo=None):
|
||||
files = parsed((package/"files.json").read_bytes())
|
||||
need(set(files) == FILES, "source outer inventory")
|
||||
need({p.name for p in package.iterdir()} == FILES | {"files.json"}, "source exact package inventory")
|
||||
for name, expected in files.items():
|
||||
need((package/name).is_file() and not (package/name).is_symlink() and pin((package/name).read_bytes()) == expected, "source outer pin: " + name)
|
||||
return verify_data({run:(package/("source-"+run+".json")).read_bytes() for run in SPECS}, packaged(checks), repo)
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("package", nargs="?", type=Path, default=HERE)
|
||||
parser.add_argument("--checks", type=Path, help="sibling checks package; default PACKAGE/../checks")
|
||||
parser.add_argument("--repo", type=Path, help="optional repository containing both exact commits, for renewed Git-blob comparison")
|
||||
args = parser.parse_args()
|
||||
print("PASS source evidence:", verify_package(args.package, args.checks or args.package.parent/"checks", args.repo))
|
||||
print("No builds, checkouts, helper execution or native acceptance claim. Run the checks verifier separately for full gate relationships.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -19,7 +19,7 @@ Read-only Astra investigation against the State follow-up working tree above `7e
|
||||
|
||||
Existing `topology/direct.rs::reorder` verifies local contributions and equal original graph X-columns, then validates `SetSteps`. `Graph::expanded_qualified` derives ranks from sequence links and legacy order, with steps supplying vertical order; cyclic fallback can depend on enumeration order.
|
||||
|
||||
The proposed pure planner admits the whole nonempty set only if every target is a visible local occurrence with an empty reference path and belongs to this owner. Selected IDs and the destination must share one original column. Build the block in original steps order, remove its IDs once, then insert at an explicit before/after unselected destination slot. Preserve all unselected relative order. Selected-target drops are no-op unless an external slot is explicit. Check the candidate's columns remain unchanged, especially cycle fallback. Distinguish no-op from a command so it creates no source/history entry. Preview and commit must consume this same planned order; do not freely translate cards.
|
||||
The proposed pure planner admits the whole nonempty set only if every target is a visible local occurrence with an empty reference path and belongs to this owner. Selected IDs and the destination must share one original column. Build the block in original steps order, then use the column-slot permutation below: preserve other-column indices and unselected order within this column. Object-anchored drops on selected items are no-op; a raw gap is a separate API. Check the complete rank map remains unchanged, especially cycle fallback. Distinguish no-op from a command so it creates no source/history entry. Preview and commit must consume this same planned order; do not freely translate cards.
|
||||
|
||||
Before-card only could reuse existing behavior but makes moving to the end awkward. Before/after slots are the preferred candidate, subject to independent review and actual interaction testing. Participation of each occurrence-body type also needs a precise decision.
|
||||
|
||||
@@ -37,7 +37,7 @@ The current shared group gesture requires saved placements and an XY anchor; reu
|
||||
|
||||
First useful outcome: exact local/qualified/link selection with whole-set refusals, plus one atomic same-column local-occurrence reorder and one Undo/Redo. Aggregate removal remains separate acceptance if omitted from that outcome.
|
||||
|
||||
Tests must independently assert source-order blocks from noncontiguous reverse-click selections; unchanged unselected order, relations and reusable definitions; identical referenced work represented by distinct occurrences; distinct qualified paths and collapse visibility; full refusal of cross-column/mixed/stale sets; no-op history; ordered pointer/focus/Shift/cancellation/camera behavior; no primary-only reconnect bypass; OA and SA, legacy exchange order, explicit branches and cyclic fallback. Native slot feedback, stable canvas/camera, source save/reopen and one-step history are required beyond compilation.
|
||||
Tests must independently assert source-order blocks from noncontiguous reverse-click selections; unchanged other-column indices and unselected order within the affected column, relations and reusable definitions; identical referenced work represented by distinct occurrences; distinct qualified paths and collapse visibility; full refusal of cross-column/mixed/stale sets; no-op history; ordered pointer/focus/Shift/cancellation/camera behavior; no primary-only reconnect bypass; OA and SA, legacy exchange order, explicit branches and cyclic fallback. Native slot feedback, stable canvas/camera, source save/reopen and one-step history are required beyond compilation.
|
||||
|
||||
## Independent critique: revise before implementation
|
||||
|
||||
@@ -49,4 +49,12 @@ Scope correction: legacy ordered-path nodes have successive ranks, and cycle-blo
|
||||
|
||||
Removal has an additional semantic consequence: `behavior.rs` derives explicit-versus-legacy interpretation from remaining occurrence kinds and SequenceLinks. Deleting action/control from `[action,exchange1,control,exchange2]` without links leaves an exchange-only sequence with implicit ordered-linear meaning. Aggregate review must expose this transition or initially refuse it. Include caller-owned ContextualLinks targeting removed occurrences in the impact union (`references.rs` cleanup), not just local links. See the presentation-versus-legacy distinction in `docs/language.rst`.
|
||||
|
||||
Smallest experiment: independent OA/SA fixtures with interleaved steps and different card heights; reverse-click selection; before-first/after-last and equivalent gaps; already-positioned no-ops; literal expected steps; complete Project equality outside steps; unchanged ranks; exact source roundtrip and one Undo/Redo. Add legacy and cycle refusal plus acyclic peers beside a cycle. Separately demonstrate deletion-induced mode switching before designing confirmation. No such experiment has run yet.
|
||||
Smallest production experiment: independent OA/SA fixtures with interleaved steps and different card heights; reverse-click selection; before-first/after-last and equivalent gaps; already-positioned no-ops; literal expected steps; complete Project equality outside steps; unchanged ranks; exact source roundtrip and one Undo/Redo. Add legacy and cycle refusal plus acyclic peers beside a cycle. Separately demonstrate deletion-induced mode switching before designing confirmation. These Rust/application checks have not run yet.
|
||||
|
||||
## Bounded permutation experiment
|
||||
|
||||
[Executable exploratory model and results](experiments/process-column-slots-20260923/README.md) isolate the order transformation from production architecture. An independent Astra investigator implemented it; the parent read both scripts and reran them successfully. The experiment covers 214,990 column cases and 861,096 plans against a four-node graph rank model, with no invariant failures. Its modeled ranks and sentinel serialization do not execute the Rust layout, source writer or history.
|
||||
|
||||
An object-anchored Before/After interface can keep selected-target no-op without losing changed destinations: all remainder gaps were reachable using unselected anchors in 2,036 bounded subsets. Raw-gap normalization is different: in `[a,b,c,d]`, selecting `{b,d}` and normalizing Before `d` gives `[a,c,b,d]`; selected-target no-op keeps the original, while After unselected `c` reaches the changed order. This supports the simpler selected-target no-op interaction. Block contiguity applies to an admitted planned move, not to that no-op. Actual pointer feedback, production graph admission, serialization and history remain unverified.
|
||||
|
||||
An independent critic matched the experiment's rank algorithm to Rust and found no counterexample under the stated valid-input assumptions. The review prompted an explicit five-node changed group beside a cycle; four-node enumeration could only cover singleton movement or unchanged whole-peer blocks there. It also identified a compatibility choice: current singleton `direct::reorder` globally splices, so moving `b` before `a` in `[a,u,b,v,c]` writes `[b,a,u,v,c]`, while this candidate writes `[b,u,a,v,c]` with the same display. Prefer one column-slot planner for both singleton and group reorder, preserving unrelated column indices consistently. This would intentionally revise singleton source ordering and requires production regression/roundtrip/history checks; no such migration is implemented here. Retaining global singleton splice was rejected as two source transformation rules for the same visible operation. Native anchor reachability and selected-target guard execution remain separate checks.
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
# State multiple selection — branch evidence
|
||||
|
||||
This contribution continues [issue 29](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/29) above the delivered ordinary saved-view head `7e348d967d1787c052a145b7448636613a6a7054`. It is not a combined release or completion of the full multiple-selection requirement. Integration remains with the owner in [issue 27](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/27).
|
||||
|
||||
Source commits on `codex/multiselect-state-9e8r6t-20260923`:
|
||||
|
||||
- `2a3b9ba822a49ead233c4b5f98412a07c1c1da12`: State adapter and independent evaluator, exact source of the full desktop result.
|
||||
- `3480b54201a5f361cca0bcd0d45dd6546a7a7bc9`: box the optional exact menu target to keep the menu event small. Three files change; matching/selection behavior is unchanged.
|
||||
|
||||
The scoped Windows gates and native workflow below pass. Portable evidence is included with this contribution; combined integration and release acceptance remain separate.
|
||||
|
||||
## Behavior and implementation
|
||||
|
||||
State views share the transient typed selection model with ordinary saved views. Shift-click and contextual Add/Remove preserve exact placement, transition-edge and action/internal-transition row identities. A row includes its owner placement and relation, so replacing a placement or reassigning a relation cannot silently bind an old selection to another occurrence. Primary inspection uses State's own placement field; row inspection does not promote the owner placement or reusable work target. Properties edit only the primary item.
|
||||
|
||||
Placement groups move through one simultaneous core plan and one document command. Preview applies only the returned node/route changes to a cloned diagram, not a full Project clone or a sequence of singleton moves. State movement retains fractional unsnapped displacement; ordinary saved views retain their ten-unit grid and State bend editing its five-unit grid. Composite descendants and boundary-projected entry/exit symbols use their authored anchors and move once; hard pins translate only when all required endpoint/boundary owners move. Authored attachment/label metadata stays unchanged even when derived paths and label positions rerender.
|
||||
|
||||
Pressing a selected member defers primary changes until the gesture outcome. A stationary release collapses to that item; movement beyond threshold remains a group gesture even after returning to the start. Escape, focus loss, changed viewport/tool/selection/document context, or suspended editing retires captured gestures. Mixed row/edge/placement groups refuse movement and Hide as a whole. Group menus expose captured-set actions, without singleton destructive fallbacks. Placement-only Hide removes just selected placements in one history entry; model elements, relations, reusable work and other views survive.
|
||||
|
||||
State reserves fixed selection-feedback and unplaced-picker space so selecting, hiding and Undo do not resize/refit the canvas. Mounted checks exercise those transitions and focus ownership. Singleton transition routing remains available with the new selection path: bend snapping/commit/cancel, endpoint stationary/cancel/commit and Shift priority have dedicated production-input checks.
|
||||
|
||||
Stale envelopes and queued legacy singleton State Select/Move/Remove events under a group are rejected before shared App navigation/reveal/allocation side effects. Dirty forms/source, active tools, read-only context and busy I/O preserve their established edit ownership.
|
||||
|
||||
No schema, persistence field, public REST command or new core geometry command is introduced. Important seams for integration are `app.rs` early admission/reconciliation, `app/multiselect.rs`, State context menu target transport, State canvas input/preview, and fixed State controls. Preserve the integration branch's newer Scenario/source/Properties logic. The independent example may need the newer `Diagram.layout: None` field when composed with the integration owner's schema extension.
|
||||
|
||||
## Review and evaluators
|
||||
|
||||
[State design](multiselect-state-adapter-design-20260923.md), [fresh independent review](state-multiselect-review-20260923.md), and [native evaluator design](state-multiselect-native-design-20260923.md) record the contract and falsifiers. The independent critic did not author the adapter or evaluator. Two verified findings were fixed: fractional-delta inference from a nonzero checker anchor, and late queued-singleton refusal mutating shared App state. The reviewer rechecked both corrections statically; parent tests supply execution evidence.
|
||||
|
||||
The deterministic native example constructs a composite A, unrelated B, fixed C, nested region/leaf, projected entry/exit points, internal and external hard routes, shared work, another State view, and SA/trace records. Its checker independently enumerates the expected complete Project for unchanged/moved/Hide modes. A is at the authored origin so its saved position preserves the actual `f32` group delta, including nonbinary fractions. This verifies resulting model invariants, not exact pointer-to-world fidelity. It rejects malformed source and unrelated changes; eleven tests include genuine command results and corruption falsifiers.
|
||||
|
||||
## Completed Windows checks
|
||||
|
||||
Environment: Rust/Cargo 1.98.1, `stable-x86_64-pc-windows-gnullvm`, LLVM MinGW 20260826, one Cargo job, incremental compilation disabled. Linux/WSL checks remain user-paused.
|
||||
|
||||
| Capture | Source | Result |
|
||||
| --- | --- | --- |
|
||||
| `core-2` | `2a3b9ba` | 11 State native-evaluator tests passed |
|
||||
| `desktop-2` | `2a3b9ba` | 1,286 passed, 0 failed, 6 existing ignored; includes 29 added cases |
|
||||
| `lint-2` | `3480b54` | strict core/desktop Clippy, all targets, passed |
|
||||
| `format-1` | `3480b54` | workspace formatting check passed |
|
||||
| `desktop-3` | `3480b54` | 122 focused State/menu tests passed; 1,170 filtered out |
|
||||
| `native-build-1` | `3480b54` | matching State evaluator build passed |
|
||||
| `windows-build-1` | `3480b54` | matching Windows GUI build passed |
|
||||
|
||||
Full desktop compile took 13m20s; execution 607.72s. Core-2 and desktop-2 share 733 unchanged inputs (map SHA-256 `9cf85879dfb0bb5ec3b15c66b23df316e6bfe8451b6cf0c895bf7b9b5fbdde4a`). Lint-2 and format-1 share 735 unchanged inputs (map `4215d0ca0319282768f1acdf05c2c094ea7432e17ed3a715df73aa05cef851bf`). Parent compared complete inventories and exact Git blobs at both source commits. Recorded run HEAD alone does not identify the originally uncommitted bytes: the first source commit preserves the earlier three menu-field blobs from the verified desktop capsule, followed by the boxing correction, without replacing the working files.
|
||||
|
||||
The revised 735-input scope adds two existing literal compile-time fixtures outside the usual source directories: `harness/experiments/edge-attachments-20260922/native-fixture.arcadia` and `harness/experiments/textual-authoring-20260911/alarm-response.arcadia`. An audit covered 71 Rust literal include references with no unsupported pattern. The historical 733-input desktop/core-example captures contain their actual compile-time dependencies; historical all-target lint lacks the core attachment fixture and does not establish full all-target source identity.
|
||||
|
||||
Commands (with the described toolchain environment):
|
||||
|
||||
```text
|
||||
cargo test -p oa-core --example state_multiselect_native --message-format=json -- --test-threads=1
|
||||
cargo test -p oa-desktop --message-format=json -- --test-threads=1
|
||||
cargo test -p oa-desktop --message-format=json -- state_ model_menu --test-threads=1
|
||||
cargo clippy -p oa-core -p oa-desktop --all-targets --message-format=json -- -D warnings
|
||||
cargo fmt --all -- --check
|
||||
```
|
||||
|
||||
Final focused compilation took 9m26s and test execution 30.85s. The 122 tests cover the changed State/menu paths; the complete earlier suite remains tied to `2a3b9ba` rather than relabeled as final-source execution. Both native binaries use the identical final 735-input map.
|
||||
|
||||
## Native Windows observation
|
||||
|
||||
The exact recorded GUI and checker ran against an immutable generated fixture and a separate working source copy. The GUI image is 117,615,104 bytes, SHA-256 `01cc30dac3a71e847415c86e2e08b0da45989aac260a82bbb00f048c3eb8a448`. Run 1 closed normally with exit 0; stdout/stderr are empty, and both binaries and the fixture remained unchanged. The archive retains 35 app-window observations (main window 1442×932, plus related transient images), ten successful complete-Project snapshots, and their helpers and build receipts.
|
||||
|
||||
Observed sequence:
|
||||
|
||||
1. Open and save the State source baseline. Select composite A, context-add its exact entry-action row, and drag the selected State. The mixed set is refused; row-primary Properties still describe the StateAction and reusable work remains separate. Saving gives the unchanged complete Project. A stationary State click collapses to A without geometry changes.
|
||||
2. Context-add B. The two placement outlines and primary-only Properties disclosure appear without a viewport jump. Drag nonprimary A by 47×29 screen pixels at the displayed 79% zoom. Both roots, A's descendants and eligible internal pins move; B stays primary and C stays fixed. The saved checker infers exact shared displacement `(59.72580337524414, 36.85209274291992)` and matches the independently expected complete Project.
|
||||
3. Save, one Undo, save, one Redo, save. All three checks pass; Undo restores baseline bytes and Redo restores the moved bytes across all nine source files.
|
||||
4. Undo back to baseline, save, open B's selected-member menu. It reports two selected, offers group Hide and disables aggregate model deletion. Hide removes A/B placements, clears their transient membership, retains model-tree elements and the inner region/leaf, and leaves C's screen position unchanged. The unplaced picker lists A and B. One Undo/Redo with saves restores the exact baseline/hidden source byte groups.
|
||||
5. Reopen the saved project through the native file dialog, then save again. A/B remain hidden, the selection is empty, and the complete Project and nine source files exactly equal the earlier hidden state. Reopening fits the surviving content (71%); camera state is transient and this is not a claim of persisted viewport equality.
|
||||
|
||||
Only `views/diagram_state_view.arcadia` changes for either movement or Hide. The nine required history snapshots form three distinct exact-byte groups; the additional `row-mixed-unchanged` snapshot also equals baseline. The checker conserves all other model/source records, including the other State/SA views, shared work, trace/refinement relations, route attachments and labels. Hide deliberately removes only selected placements: the extreme authored entry/exit anchors become exposed when their displayed State boundary is absent; they extend beyond the current viewport until Fit/reopen. No authored anchor changes are introduced to conceal that derived geometry.
|
||||
|
||||
Native limitations: contextual Add exercises actual user operations but does not inject held Shift; mounted/input tests cover modifier lifetimes. No minimum-window/DPI, SA native trial, aggregate semantic deletion or combined-release claim is made. The fixture has 13 model-check findings visible in the UI; this finite geometry/identity evaluator requires valid source and exact expected Project, not a completeness-warning-free engineering model.
|
||||
|
||||
A fresh independent native review inspected representative actual screenshots, all ten checker receipts, the source snapshots and outer package pins. It found no new blocker for this bounded State delivery and confirmed the scope distinctions above; it did not rerun archive verifiers or Git comparison. The review also noted visible overlap between the fixture's multiline A→B label, its secondary summary and nearby row area before and after movement. This report does not claim flawless State label layout. The picker was inspected for recovery choices, but selecting a choice to restore a placement was not exercised; recovery through Undo was exercised.
|
||||
|
||||
The native trial exposed [issue 35: picker Escape dismissal](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/35). Capture 24 opens the picker, 25 shows Escape leaving it open, and 26 shows successful outside-click dismissal. A fresh code review identifies existing shared Iced picker behavior, not a State multiselect regression; the creation/source-modal Escape priority also needs verification before a shared fix. This recoverable usability defect remains open, not silently treated as accepted behavior.
|
||||
|
||||
Automation recovery is retained: the first reopen attempt navigated the file dialog into `views` instead of opening the project; one dialog capture returned `no monitor found`, then fresh window selection/activation recovered it. Captures 32/33 have intent-based filenames but still show the open dialog. Successful explicit-path reopen is capture 34; save is 35. No failed attempt is counted as a successful reopen.
|
||||
|
||||
## Portable evidence
|
||||
|
||||
- [Checks](experiments/state-multiselect-20260923/checks/README.md): nine closed captures, including two failed gates, with three exact source-capsule pairs and both historical helpers.
|
||||
- [Native](experiments/state-multiselect-20260923/native/README.md): run 1 screenshots, ten complete-Project checks, three-group source history, fixture and executable provenance.
|
||||
- [Source identity](experiments/state-multiselect-20260923/source/README.md): exact 733/735-input relationships to the two source commits; optional renewed Git-blob comparison.
|
||||
- [Invalid first-capture incident](experiments/state-multiselect-20260923/incidents/core-1/README.md): original bytes and the single known mismatch, never an accepted gate.
|
||||
|
||||
Run with Python 3.10+ from the repository root:
|
||||
|
||||
```text
|
||||
python -B harness/experiments/state-multiselect-20260923/checks/verify.py
|
||||
python -B harness/experiments/state-multiselect-20260923/native/verify.py
|
||||
python -B harness/experiments/state-multiselect-20260923/source/verify.py --repo .
|
||||
python -B harness/experiments/state-multiselect-20260923/incidents/core-1/verify.py
|
||||
```
|
||||
|
||||
These commands verify archived bytes/relationships and optional source identity, not new execution or authentication. To reproduce the native trial, build both packages at `3480b54`, run `state_multiselect_native generate NEW_FIXTURE_DIRECTORY`, copy its `source` directory, open that copy's `project.arcadia` in the GUI, and use `state_multiselect_native check unchanged|moved|hide BASELINE_JSON SAVED_PROJECT_ARCADIA` at the corresponding stages. The checker requires the MinGW runtime environment on Windows.
|
||||
|
||||
## Historical failures and scope
|
||||
|
||||
Keep the first desktop compile failure (a test helper shadowed by a local placement UUID) and first strict lint failure (large enum variant) with their actual exit 101. Neither is a pass. Core-1 recorded eleven passing tests but is an invalid capture: concurrent formatting changed `model_menu.rs`, yielding a false unchanged-input flag and one map/archive mismatch. Its exact seven raw files and helper belong in a separately pinned incident, never the strict accepted-capture package. Stable core-2 supplies the actual accepted result. No historical receipt is repaired or relabeled.
|
||||
|
||||
Process, Allocation and Scenario group adapters and aggregate semantic deletion are still required for issue 29. Unsupported groups currently receive whole-set refusals. The [Process candidate and bounded permutation experiment](multiselect-process-adapter-design-20260923.md) are exploratory evidence only, not implemented functionality. Full combined release, minimum-window/DPI behavior and Linux acceptance are not claimed here.
|
||||
@@ -1,6 +1,6 @@
|
||||
# State multiple-selection independent review
|
||||
|
||||
Scope: uncommitted State adapter above `7e348d967d1787c052a145b7448636613a6a7054` on `codex/multiselect-state-9e8r6t-20260923`. This is branch-specific review evidence, not integrated acceptance. The reviewer was a fresh GPT-6 Astra agent and did not author the adapter or checker. Parent owns verification and integration.
|
||||
Scope: State adapter above `7e348d967d1787c052a145b7448636613a6a7054` on `codex/multiselect-state-9e8r6t-20260923`, subsequently committed as `2a3b9ba822a49ead233c4b5f98412a07c1c1da12`. This is branch-specific review evidence, not integrated acceptance. The reviewer was a fresh GPT-6 Astra agent and did not author the adapter or checker. Parent owns verification and integration.
|
||||
|
||||
The read-only review covered App admission, exact State row identity, context-menu ownership, the unsnapped gesture policy, diagram-only simultaneous preview, fixed State controls, and the independent native checker. No Cargo or native GUI execution was performed by the reviewer.
|
||||
|
||||
@@ -20,4 +20,8 @@ Run current-State App and mounted focus tests, existing State bend/reconnect/att
|
||||
|
||||
The same independent reviewer inspected both corrections and found them addressed statically: the main fixture positions, pins and recorded header points shift consistently by `(-30,-100)`; A is at the origin; `(0.01,10)` and `(0.1,-0.2)` are real-command positive cases. The legacy State rejection now precedes the shared hooks, with a regression comparing valid navigation markers, full selection, model/source, camera, epochs, feedback and history. Three singleton-selection route tests cover snapping, commit/cancel, stationary reconnect and Shift priority. No new blocking finding was reported. A minor fidelity note remains: the legacy queued Select probe uses a placement UUID rather than the semantic UUID normally emitted by the canvas; the admission rejects the whole legacy variant independently of that UUID.
|
||||
|
||||
Parent Windows `core-2` ran all 11 State native-checker tests successfully with 733 unchanged captured inputs (input-map SHA-256 `9cf85879dfb0bb5ec3b15c66b23df316e6bfe8451b6cf0c895bf7b9b5fbdde4a`). This includes the new nonbinary fractions. The full desktop gate and native trial remain separate requirements; this result is not their acceptance.
|
||||
Parent Windows `core-2` ran all 11 State native-checker tests successfully with 733 unchanged captured inputs (input-map SHA-256 `9cf85879dfb0bb5ec3b15c66b23df316e6bfe8451b6cf0c895bf7b9b5fbdde4a`). This includes the new nonbinary fractions. Full `desktop-2` passed 1,286 tests with six existing ignored on the same inputs, now compared exactly to committed Git blobs at `2a3b9ba`. Native acceptance remains separate.
|
||||
|
||||
Strict Clippy then found the optional exact menu target enlarged the message enum. Commit `3480b54201a5f361cca0bcd0d45dd6546a7a7bc9` boxes that field without changing its matching rules. Strict core/desktop all-target lint, formatting and all 122 focused State/menu tests pass on 735 unchanged inputs exactly equal to that commit. The revised capture scope explicitly includes the existing attachment and textual-authoring compile-time fixtures outside the usual source directories; historical receipts remain unchanged. Native verification remains separate.
|
||||
|
||||
The subsequent [native result and limitations](multiselect-state-20260923.md) record parent execution and the critic's independent screenshot/receipt/source-history review. No new blocker was identified for the State contribution. Shared picker Escape behavior is tracked as issue 35; multiline transition-label overlap and the distinction between recovery-choice visibility and actual recovery through the picker remain explicit limitations.
|
||||
|
||||
Reference in New Issue
Block a user