Publish scoped e34 native editing and transition evidence

This commit is contained in:
2026-09-24 01:20:38 -07:00
parent be7470afca
commit c79708e550
9 changed files with 6677 additions and 2 deletions
+12 -2
View File
@@ -128,8 +128,18 @@ historical f82 desktop run (1,337 passed, three failed, seven ignored), the
missing-DLL listing attempt, and capture limitations. Its verifier passes the
positive case and rejects all 12 semantic mutations. The preceding
[partial gate archive](experiments/peer-union-windows-20260923/README.md) retains
earlier Scenario and lint failures. Native workflow, public format and release
acceptance are not established; accepted root production remains4ffff0d.
earlier Scenario and lint failures. The separate
[native checkpoint](experiments/peer-union-e34-native-20260924/README.md) records
33 successful whole-model/source checkpoints, the retained failed G2 pointer
attempt and its recovery, and five transition checks through fresh reopen and
unchanged reapply. The first trace identity and all resulting source-bundle bytes
remain exact. Independent review checks 245 frame pins and inspects 38 keyframes;
17 transition-oracle controls meet their expected outcomes. The original
interrupted process and later normal-close observations remain distinct. Dirty
middle-button pan, held-drag Escape and short-window Scenario Apply are unobserved.
Public format and release acceptance remain incomplete; accepted root production
remains4ffff0d. The newer prerelease candidate and live coordination are in
[issue37](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/37).
Analysis/core source checkpoint **a2a28f8d23a46ba1696b6a8410d4d3b5c1808f49**,
publication branch `codex/analysis-core-956atf-20260911`, is not integrated into
@@ -0,0 +1,2 @@
# This is a byte-pinned evidence package, including raw Windows logs.
* -text
@@ -0,0 +1,48 @@
# e34 native Windows evidence checkpoint — 2026-09-24
Recorded native work against source `e34ba27e26ede3ab55f276acc250d92b2e0c3204` passed the scoped Scenario, geometry and OA relink checks below. The archive retains the failed pointer G2 attempt and all recovery evidence. It contains **no executable or DLL** and does not itself establish release readiness.
`evidence.zip` contains 1,264 raw members, 45,897,130 uncompressed bytes. Archive size: 23,699,323 bytes; SHA256 `3aea888bca130542e731de191bb79676ab00a222f37f9884b366cf22818ffa1a`. `manifest.json` pins every member and records its original local path. Original logs, snapshots and prior preparation documents are byte-preserved; historical PREPARED/UNRUN wording inside those documents is historical, not this checkpoint's outcome.
| Recorded evidence | Result |
| --- | --- |
| Source-to-model checkpoints | 33 PASS, one retained G2 FAIL across 34 receipts |
| Native transition checks | Five PASS: baseline, Cancel, relink, fresh reopen, unchanged reapply/save |
| Transition oracle runtime admission | 17 expected outcomes: four positive, 13 negative, with raw rejection boundaries |
| Native captures | All 245 PNG pins checked; 38 selected keyframes independently inspected |
| Source binding | All 760 captured build inputs match current frozen source and Git blobs at e34 |
The portable verifier completed with exit 0 and empty stderr, including the 760 Git-blob checks. Its exact command, unchanged artifact pins and raw stdout/stderr are in `verification.json` and the accompanying logs. This verifies recorded evidence and saved-model equality; it does not replay native actions or rerun an evaluator.
## Results and boundaries
Scenario evidence covers the original Text Tab/Undo/Redo/save, saved-view name and occurrence-value Undo/Redo, same-process S2 Text roundtrip→S2L→Undo, pending inspector draft across Connections/Properties, incompatible-field rejection and Revert, independent occurrence selection across saved views, and fresh-process reopen. The S2L checkpoint changes only caller lane x200→220; Undo restores exact predicted S2 source bytes, including the Unicode/mixed-line-ending preservation prediction.
Geometry evidence covers ordinary attachment G1, bend insertion G2, bend move G3, semantic-port position G4, relevant Undo/Redo, and fresh-process reopen with complete-model equality. The first pointer G2 trial failed at (526.25,309.06247) versus the unchanged expected (526,310); Undo restored exact G1. A separately predicted Properties Actions → Add bend trial then reached the original G2. Pending-draft arrow probes were blocked. After Revert, a clean arrow actually panned the camera 60 pixels with unchanged saved model.
Transition begins with an already recreated OA root; it is **not new native deletion/recreation coverage**. Reviewed Cancel preserves the original 13-file bundle. Reviewed relink retains target name/description and creates trace `d278274e-8153-44e7-8b38-a48f5ad73c3c` in a new `traceability.arcadia` plus an entry-file include. Fresh reopen and unchanged reapply/save retain all 14 resulting files byte-for-byte and reuse the exact first identity receipt. Its SHA256 is `fa58f8f015529a9a1f44428b44df13c4edb35a1875c0550ee3e92464ff6ccd90`.
The original 40-action process was absent after interruption and was **not recorded as a normal close**. Later normal-close observations are preserved separately. Transition's first close observation has `closedNormally:false` despite its misleading label; the subsequent observation has no Arcadia windows and `closedNormally:true`. Final closure is separately observed. No GUI exit code is inferred from the launch tool.
Remaining limits: shorter Scenario window exercised Revert, not Apply; dirty-State middle-button pan and Escape during a held drag remain unobserved; unchanged source alone does not prove absence of an extra no-op history entry. This is not comprehensive accessibility, warning-multiset, performance, or all-platform acceptance. See archived `review/REVIEW.md` and `review/TRANSITION-REVIEW.md` for the independent review and precise capture references.
## Recheck and inspect
With Python 3 standard library, run from this directory:
```text
python -B verify.py
python -B verify.py --repo PATH_TO_ARCADIA_CLONE
```
The first command reads the ZIP directly without extracting it. The optional repository command additionally checks exact 760 source blobs using Git; the clone must contain e34. Neither command executes archived code or native binaries. For visual inspection, extract the ZIP with a normal ZIP reader and open `native/captures/initial/` or `native/captures/resumed/`; their action JSONs associate every frame with its recorded action.
Archive layout: `native/` holds captures, run receipts/full source snapshots and build provenance; `preparation/` holds fixed model/source expectations, comparator source and recorded comparator controls; `transition-admission/` and `runtime-controls/` hold the reviewed oracle adaptation and 17 actual controls; `review/` holds independent audits and the local package producer. The verifier checks pins, source-model comparisons including the exact G2 failure, source restoration groups, transition bundle/identity retention, action boundaries, raw runtime-control outcomes and optional Git source binding. It cannot independently prove GUI gestures from saved bytes.
Historical source-runner synthetic control directories are omitted, with their summary retained. The prior test-gate archive is already published at `be7470afca4894c265d61800f9b94d31444e7234:harness/experiments/peer-union-e34-windows-20260923` and is not duplicated. Build identities remain in this package, including the GUI SHA256 `d8f60c910c6316878538689a5ae0cc6aaf173735dcf7f5aeef75026ce86f4931` and the required `libunwind.dll` launch-recovery pin. A runnable prerelease is a separate deliverable and must include that runtime dependency.
This version-controlled checkpoint preserves the reviewed archive and verifier
bytes from the local proposal. The parent read the verifier and independent
review before publication. `.gitattributes` preserves the exact raw Windows
logs; their original local paths are provenance, not cross-machine handoff paths.
The source commit and repository-relative paths above are the portable references.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,49 @@
{
"command": [
"C:\\Users\\User\\.cache\\codex-runtimes\\codex-primary-runtime\\dependencies\\python\\python.exe",
"-B",
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-e34-publication-20260924\\verify.py",
"--repo",
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio"
],
"start_utc": "2026-09-24T08:08:55.040259+00:00",
"end_utc": "2026-09-24T08:09:09.435271+00:00",
"duration_monotonic_ns": 13922000000,
"exit": 0,
"before": {
"evidence.zip": {
"bytes": 23699323,
"sha256": "3aea888bca130542e731de191bb79676ab00a222f37f9884b366cf22818ffa1a"
},
"manifest.json": {
"bytes": 421657,
"sha256": "0db2ae91eaeae0fbafbb10b8aa326c7bdda63de90f70b9b2ef40ca107d84b567"
},
"verify.py": {
"bytes": 13060,
"sha256": "689ec010aeaa7bdae6f2ebb4a79f5d56812918d762847652665485e7908b45d9"
}
},
"after": {
"evidence.zip": {
"bytes": 23699323,
"sha256": "3aea888bca130542e731de191bb79676ab00a222f37f9884b366cf22818ffa1a"
},
"manifest.json": {
"bytes": 421657,
"sha256": "0db2ae91eaeae0fbafbb10b8aa326c7bdda63de90f70b9b2ef40ca107d84b567"
},
"verify.py": {
"bytes": 13060,
"sha256": "689ec010aeaa7bdae6f2ebb4a79f5d56812918d762847652665485e7908b45d9"
}
},
"stdout": {
"bytes": 380,
"sha256": "bf173476829963f5ac09f747ce15829833f6818ce75c4b99a96380296eda4c4d"
},
"stderr": {
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}
}
@@ -0,0 +1,13 @@
{
"status": "PASS",
"scope": "Recorded evidence integrity and semantic checkpoint recheck; no native replay",
"source": "e34ba27e26ede3ab55f276acc250d92b2e0c3204",
"members": 1264,
"frames": 245,
"source_pass": 33,
"retained_source_fail": 1,
"native_transition_pass": 5,
"runtime_positive": 4,
"runtime_negative": 13,
"git_blobs_checked": 760
}
@@ -0,0 +1,156 @@
"""Verify archived records without executing archived code or extracting files.
Python standard library only. Optional --repo checks the captured760 source blobs
against Git at the recorded commit; it never launches a subject executable.
"""
import argparse,copy,hashlib,json,math,pathlib,shutil,subprocess,zipfile
HERE=pathlib.Path(__file__).resolve().parent
SOURCE='e34ba27e26ede3ab55f276acc250d92b2e0c3204'
CATALOG='096efcb770ab383b0e293d689d6485da9066e791b35247e1232d724f89f2b09d'
INPUTS='2387e1652853389857f436ed026ec89a3dec1ae40496dcf28083be04dcb47eb6'
TRANSITION='a7a16bc291e132eaf69e1c42aa45a1440388cdf4bfb1dd4867d76f3ee7146d9a'
SNAPSHOT='60e1f5807f4959676798482c8269fe1023507ad3ac305b5750eab192e1a4d2d4'
TRACE='d278274e-8153-44e7-8b38-a48f5ad73c3c'
IDENTITIES={'source':'8eb83649-2810-58e1-94cd-71e25422658e','trace':TRACE}
def require(ok,message):
if not ok:raise ValueError(message)
def pin(raw):return {'bytes':len(raw),'sha256':hashlib.sha256(raw).hexdigest()}
def pairs(items):
d={}
for k,v in items:
require(k not in d,'duplicate JSON key: '+k);d[k]=v
return d
def load(raw):return json.loads(raw,object_pairs_hook=pairs,parse_constant=lambda v:(_ for _ in ()).throw(ValueError(v)))
def exact(a,b):
if type(a) is not type(b):return False
if isinstance(a,dict):return a.keys()==b.keys() and all(exact(a[k],b[k]) for k in a)
if isinstance(a,list):return len(a)==len(b) and all(exact(x,y) for x,y in zip(a,b))
if isinstance(a,float):return math.isfinite(a) and math.isfinite(b) and a.hex()==b.hex()
return a==b
def base(path):return path.replace('\\','/').rsplit('/',1)[-1]
def main():
ap=argparse.ArgumentParser(description=__doc__);ap.add_argument('--repo',type=pathlib.Path);args=ap.parse_args()
m=load((HERE/'manifest.json').read_bytes())
require(m['source']==SOURCE and m['schema']=='arcadia-native-e34-recorded-evidence-v1','manifest scope/source')
require(pin(pathlib.Path(__file__).read_bytes())==m['verifier'],'verifier pin')
require(pin((HERE/'evidence.zip').read_bytes())==m['archive'],'archive pin')
z=zipfile.ZipFile(HERE/'evidence.zip');names=z.namelist()
require(len(names)==len(set(names))==m['member_count'],'ZIP duplicate/count')
require(set(names)==set(m['files']),'ZIP inventory')
for name in names:
require(not name.startswith('/') and '\\' not in name and '..' not in pathlib.PurePosixPath(name).parts,'unsafe member path')
require(pathlib.PurePosixPath(name).suffix.lower() not in ('.exe','.dll','.pdb','.rlib','.lib','.a'),'unexpected binary')
require(pin(z.read(name))==m['files'][name],'member pin: '+name)
require(sum(x['bytes'] for x in m['files'].values())==m['payload_bytes'],'payload size')
def raw(n):return z.read(n)
def obj(n):return load(raw(n))
def checked(n,expected):require(pin(raw(n))=={k:expected[k] for k in ('bytes','sha256')},'recorded pin: '+n)
def inventory(prefix):return {n[len(prefix):]:pin(raw(n)) for n in names if n.startswith(prefix)}
require(pin(raw('preparation/comparator-manifest.json'))['sha256']==CATALOG,'fixed catalog')
catalog=obj('preparation/comparator-manifest.json')
for group in ('models','sources','negatives'):
for item in catalog[group].values():checked('preparation/'+item['path'],item)
require(pin(raw('native/build-evidence/native/combined-native-e34-1.inputs.json'))['sha256']==INPUTS,'fixed build inputs')
inputs=obj('native/build-evidence/native/combined-native-e34-1.inputs.json')
require(inputs['source']==SOURCE and len(inputs['inputs'])==760 and len({p['path'] for p in inputs['inputs']})==760,'source input count')
review=obj('review/audit.json');run_names=[r['run'] for r in review['receipts']]
require(m['source_runs']==run_names and len(run_names)==34 and len(set(run_names))==34,'source run inventory')
failures=[];source_pins={}
for name in run_names:
prefix='native/runs/'+name+'/';r=obj(prefix+'runner-receipt.json');cp=r['checkpoint']
require(r['subject_commit']==SOURCE and r['committed_source_binding']['source']==SOURCE,'run source')
require(r['committed_source_binding']['inputs']==760 and r['committed_source_binding']['exit']==0,'run Git admission')
require(r['evaluator_exit']==0 and r['evaluator_before']==r['evaluator_after'] and r['evaluator_before']['sha256']==SNAPSHOT,'evaluator binding')
require(base(r['evaluator_argv'][0])=='attachment_snapshot.exe' and base(r['evaluator_argv'][1])=='project.arcadia' and base(r['evaluator_argv'][2])=='actual.project.json','evaluator command')
require(r['input_before']==r['input_after'],'source changed during check')
checked(prefix+'input-before.arcadia',r['input_before']);checked(prefix+'input-after.arcadia',r['input_after'])
source_pins[name]=r['input_before']
for rel,p in r['outputs'].items():checked(prefix+rel,p)
golden='preparation/'+catalog['models'][cp]['path']
require(raw(prefix+'comparison/expected.project.json')==raw(golden),'expected copied model')
require(raw(prefix+'comparison/actual.project.json')==raw(prefix+'actual.project.json'),'actual copied model')
expected=obj(golden);actual=obj(prefix+'actual.project.json');equal=exact(expected,actual)
cr=obj(prefix+'comparison/receipt.json')
require(cr['full_project_json_exact']==equal and cr['inputs_unchanged'] is True,'comparison receipt')
require(r['status']==('PASS' if equal else 'FAIL') and r['comparator_exit']==(0 if equal else 1),'source outcome')
if not equal:
failures.append(name);require(name=='native-g2-1' and cp=='G2','unexpected source failure')
bad=copy.deepcopy(expected);point=bad['diagrams']['ea202922-0033-4000-8000-000000000200']['routes'][0]['waypoints'][1]
point.update(x=526.25,y=309.06247)
require(exact(bad,actual),'failed G2 differs beyond recorded coordinates')
if r['source_checkpoint']:
require(raw(prefix+'input-before.arcadia')==raw('preparation/'+catalog['sources'][r['source_checkpoint']]['path']),'source preservation')
require(cr['source_bytes_exact'] is True,'source comparison receipt')
require(failures==['native-g2-1'],'retained negative trial')
for group in review['equal_source_groups'].values():require(all(source_pins[n]==source_pins[group[0]] for n in group),'Undo/Redo/reopen source equality')
frame_count=0
for stream,count in [('initial',40),('resumed',199)]:
prefix='native/captures/'+stream+'/';a=obj(prefix+'actions.json');require(len(a)==count,'action count')
for action in a:
for frame in action.get('frames',[]):checked(prefix+frame['path'],frame);frame_count+=1
if stream=='resumed':
require(pin(raw(prefix+'actions.json'))['sha256']=='7b76d8db4b7fdfad0e4c455ad6b2fdfa6de4cf2f517c81e81599b03aa957c1fe','final action pin')
require(a[188]['closedNormally'] is False and a[189]['closedNormally'] is True,'close observation sequence')
require(a[-1]['label']=='transition-final-exit-observed' and a[-1]['closedNormally'] is True,'final observed close')
require(frame_count==245,'capture count')
require(obj('native/interruption-resume.json')['closedNormally'] is False,'original interruption boundary')
require(pin(raw('transition-admission/manifest.json'))['sha256']=='4bff0e62ed2e43f8bb10c0f47b53c356b66cead88a57bd1c9409f3b700a18cb9','admission manifest')
admission=obj('transition-admission/manifest.json')
for rel,p in admission['files'].items():checked('transition-admission/'+rel,p)
phases={'baseline':'oa-recreated','cancel':'oa-recreated','relink':'oa-relinked','reopened':'oa-reopened','noop':'oa-noop'}
require(set(m['transition_runs'])=={'native-transition-'+p+'-1' for p in phases},'transition inventory')
first=None;baseline=None
for phase,state in phases.items():
prefix='native/runs/native-transition-'+phase+'-1/';r=obj(prefix+'result.json');report=obj(prefix+'stdout.log')
require(r['source']==SOURCE and r['state']==state and r['exit']==0,'transition receipt')
require(r['binary_before']==r['binary_after']==admission['binary'] and r['binary_before']['sha256']==TRANSITION,'transition binary')
checked(prefix+'runner.py',r['runner']);checked(prefix+'stdout.log',r['stdout']);checked(prefix+'stderr.log',r['stderr'])
require(not raw(prefix+'stderr.log'),'transition stderr')
require(r['bundle_before']==r['bundle_after']==inventory(prefix+'input-before/'),'complete source bundle')
require(report['status']=='PASS' and report['state']==state and report['comparison']=='complete Project equality','transition report')
require(report['trace_identity_pinned']==(phase in ('reopened','noop')) and report['recreated_id_matches_snippet'] is True,'transition identity flags')
require(r['command'][1:3]==['check',state] and base(r['command'][0])=='transition-native-lifecycle.exe' and base(r['command'][3])=='oa-recreated.arcadia','transition command')
if phase in ('baseline','cancel'):
require(r['receipt_before'] is None and r['receipt_after'] is None and len(r['command'])==4,'baseline identities')
require(report['new_ids']=={'source':IDENTITIES['source']},'recreated identity')
require(raw(prefix+'input-before/oa-recreated.arcadia')==raw('transition-admission/fixtures/oa-recreated.arcadia'),'baseline entry')
if baseline is None:baseline=r['bundle_after']
else:require(baseline==r['bundle_after'],'Cancel altered bundle')
else:
checked(prefix+'identities.json',r['receipt_after'])
require(report['new_ids']==obj(prefix+'identities.json')==IDENTITIES,'native trace identity')
require(raw(prefix+'identities.json')==raw('native/native-first-relink.identities.json'),'first identity bytes')
if phase=='relink':
require(r['receipt_before'] is None and r['command'][4]=='--write-identities','first relink command')
require(set(r['bundle_after'])-set(baseline)=={'traceability.arcadia'},'new trace source member')
require([n for n in baseline if baseline[n]!=r['bundle_after'].get(n)]==['oa-recreated.arcadia'],'unrelated bundle mutation')
first=r
else:require(r['receipt_before']==r['receipt_after']==first['receipt_after'] and r['bundle_after']==first['bundle_after'] and r['command'][4]=='--identities','reopen/no-op retention')
controls=obj('runtime-controls/summary.json')
require(pin(raw('runtime-controls/summary.json'))['sha256']=='b3eac94621f1e5fd963858c45bcee9445ce020593feae14a830eaed5bf967851','fixed admitted controls')
require(controls['status']=='PASS' and len(controls['trials'])==17 and controls['all_watched_unchanged'] is True,'control summary')
positive=negative=0
for trial in controls['trials']:
prefix='runtime-controls/trials/'+trial['label']+'/'
require(obj(prefix+'result.json')==trial,'control raw receipt')
checked(prefix+'stdout.log',trial['stdout']);checked(prefix+'stderr.log',trial['stderr'])
require(trial['exit']==trial['expected_exit'] and trial['binary_before']==trial['binary_after']==admission['binary'],'control outcome/binary')
require(trial['input_before']==trial['input_after'],'control input changed')
if trial['expected_exit']==0:
positive+=1;require(not raw(prefix+'stderr.log') and obj(prefix+'stdout.log')['status']=='PASS','positive control')
else:
negative+=1;require(not raw(prefix+'stdout.log') and trial['expected_stderr'] in raw(prefix+'stderr.log').decode('utf-8'),'negative rejection boundary')
require((positive,negative)==(4,13),'control counts')
git_checked=False
if args.repo:
git=shutil.which('git');require(git is not None,'Git missing')
query=''.join(SOURCE+':'+p['path']+'\n' for p in inputs['inputs']).encode()
proc=subprocess.run([git,'-C',str(args.repo),'cat-file','--batch'],input=query,capture_output=True,check=True,timeout=60)
pos=0
for item in inputs['inputs']:
end=proc.stdout.index(b'\n',pos);head=proc.stdout[pos:end].split();require(len(head)==3 and head[1]==b'blob','Git blob response')
size=int(head[2]);body=proc.stdout[end+1:end+1+size];pos=end+size+2
require(pin(body)=={k:item[k] for k in ('bytes','sha256')},'Git source bytes: '+item['path'])
require(pos==len(proc.stdout),'Git trailing output');git_checked=True
print(json.dumps({'status':'PASS','scope':'Recorded evidence integrity and semantic checkpoint recheck; no native replay','source':SOURCE,'members':len(names),'frames':frame_count,'source_pass':33,'retained_source_fail':1,'native_transition_pass':5,'runtime_positive':positive,'runtime_negative':negative,'git_blobs_checked':760 if git_checked else 0},indent=2))
if __name__=='__main__':main()