docs: archive two-axis optical result and falsifiers
This commit is contained in:
@@ -498,3 +498,22 @@ editing remains separate from semantic reconnect. The [decision and evidence
|
||||
map](edge-attachments-20260922.md) records alternatives, lifecycle rules,
|
||||
independent falsifiers, evaluators and the Process/Scenario applicability limits.
|
||||
This is branch-specific work; it does not establish an integrated release.
|
||||
|
||||
## Two-axis Focus optical scope — 2026-10-01
|
||||
|
||||
Use a private, opt-in inert runner to measure complete-scene magnification before
|
||||
implementing an editable Focus workspace. Width-only recovery was rejected for
|
||||
this question because height limits Fit; a hand-built blank Baseline would not
|
||||
represent real chrome. Freeze complete model/projection/routes/labels/ports and
|
||||
reuse production drawing with actual measured viewports. Reject unmeasured or
|
||||
stale captures; draw acknowledgment is CPU evidence, not GPU completion.
|
||||
|
||||
The [predeclared comparison](experiments/focus-optical-20261001/plan.md) and
|
||||
[native result](focus-optical-validation-20261001.md) establish substantial
|
||||
two-axis gains on the mixed and nested examples while conserving whole recorded
|
||||
values/bytes. They do not establish unassisted reading: fresh-reader availability
|
||||
failed and shared runs/foreign-label crossings remain. Retain a workspace
|
||||
hypothesis without promoting the experiment or closing #38. Category recognition
|
||||
and individual connection identity are distinct next questions. Editable
|
||||
promotion must separately prove draft/caret/focus/input, camera, gesture,
|
||||
navigation, history/save/reopen and native behavior with #43 coordination.
|
||||
|
||||
@@ -58,6 +58,16 @@ remain in Gitea.
|
||||
|
||||
## Contribution-specific verification
|
||||
|
||||
This experiment branch also contains a private, explicitly opted-in read-only
|
||||
[two-axis Focus runner](focus-optical-validation-20261001.md), tested at
|
||||
`38789512626cb24f78f274998977fc8c6cf960d1`. Its 92 focused checks, strict desktop
|
||||
Clippy, matching Windows build, five normal native exits and 22 complete-value/
|
||||
byte captures pass within the documented mechanical scope. Full-scene Fit gains
|
||||
about79% on the mixed example,67% on nested OA and58% on nested SA; the small
|
||||
view correctly remains at its clamp. Shared-path/label ownership and fresh-reader
|
||||
acceptance remain unresolved. This is branch-specific optical evidence, not an
|
||||
editable workspace, production promotion, new release or complete #38 remedy.
|
||||
|
||||
The following records retain their original source and runtime scope; they are
|
||||
not relabeled as acceptance of the combined source above.
|
||||
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
proposal*.md -text whitespace=cr-at-eol
|
||||
evidence/** -text whitespace=-blank-at-eof,-blank-at-eol,cr-at-eol
|
||||
next-category-critique.md -text whitespace=cr-at-eol
|
||||
handoff-review.md -text whitespace=cr-at-eol
|
||||
publication-check-first.json -text whitespace=cr-at-eol
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
# Focus optical experiment evidence
|
||||
|
||||
Tested Rust source: `38789512626cb24f78f274998977fc8c6cf960d1`.
|
||||
The [plan](plan.md) precedes implementation; the
|
||||
[result and reproduction instructions](../../focus-optical-validation-20261001.md)
|
||||
state the acceptance limits. This is a private read-only optical experiment,
|
||||
not an editable workspace or release package.
|
||||
|
||||
[Final content inventory](evidence/index-final.json) covers 29 files, 17465556
|
||||
stored bytes and 1805 archived members / 86189726 uncompressed bytes. The
|
||||
original index and original two archives remain unchanged; a separate supplement
|
||||
adds the later independent checker review and parent observations. Final index
|
||||
SHA-256: `7bf2380b49c307fd24ff0289586668359e24947f40630f9f05442bc74a6205a1`.
|
||||
The index excludes its own recursive hash; this README and the portable verifier
|
||||
are outside the raw packet inventory.
|
||||
|
||||
The later [category-stroke critique](next-category-critique.md) is also outside
|
||||
that frozen packet. It examines a possible next hypothesis against the exact
|
||||
frozen scene and primary Capella/Sirius sources; no dash implementation or
|
||||
perception acceptance is claimed.
|
||||
|
||||
The [handoff narrative review](handoff-review.md) pins its exact inspected
|
||||
document hashes and finds no narrative blocker. The
|
||||
[first publication check](publication-check-first.json) verifies unchanged source
|
||||
inputs and an empty successful staged whitespace check; later navigation-pointer
|
||||
additions do not claim retrospective review. Both are outside the frozen raw index.
|
||||
|
||||
| Archive / record | Contents |
|
||||
| --- | --- |
|
||||
| [raw-native.zip](evidence/raw-native.zip) | Five actual native case directories, 62 original screenshots, complete optical inputs/models/scenes/SVGs/measurements, watcher/Close receipts, logs, gate and formatting records, final mechanical oracle |
|
||||
| [oracle-challenges.zip](evidence/oracle-challenges.zip) | Original and repaired checker's isolated synthetic challenge corpus, exact mutations, failures and result records; these are not native runs |
|
||||
| [supplemental-final-review.zip](evidence/supplemental-final-review.zip) | Complete independent repair-review probe corpus, original report/probe, parent associations and their write helper |
|
||||
| [source review](evidence/reviews/focus-source-review.md) | Independent preformat source handoff review; original scope retained |
|
||||
| [evaluator review and repair](evidence/reviews/focus-oracle-review.md) | Original defects, authorized repair and fourteen copied-corpus falsifiers |
|
||||
| [independent final checker review](evidence/reviews/final-review.md) | Four actual cases, 22 captures, 533 gate-source hashes and twelve further falsifiers; explicitly limited checker/evidence scope |
|
||||
| [parent observations](evidence/parent-observations.json) | Assisted native notes and exact SHA-bound associations for all 22 measurement/screenshot pairs, including unsuccessful probes |
|
||||
|
||||
Executables/runtime are local-only, excluded from the packet, and pinned in
|
||||
[provenance](evidence/provenance.json). Host-specific original helpers and paths
|
||||
are preserved; relocating them requires an explicit adaptation. A future build
|
||||
is a new result, not automatically the historically pinned executable.
|
||||
|
||||
Verify content without extraction or executable launch, from any host with Python3:
|
||||
|
||||
```powershell
|
||||
python harness/experiments/focus-optical-20261001/verify_evidence.py
|
||||
```
|
||||
|
||||
On the original evidence host, `--originals` also compares all 1823 retained
|
||||
archived/copied source files. After staging the packet, `--git-index` additionally
|
||||
compares its exact staged bytes. Synthetic adversarial data must never replace
|
||||
the native corpus when running the actual mechanical checker. Byte integrity
|
||||
verification makes no new semantic, rendering or readability claim.
|
||||
@@ -0,0 +1,63 @@
|
||||
"""Create a separate final-review supplement without modifying the first packet."""
|
||||
from pathlib import Path
|
||||
import hashlib,json,runpy,zipfile
|
||||
|
||||
ROOT=Path('C:/ar-focus-01a0d717')
|
||||
OUT=Path(__file__).resolve().parent
|
||||
sha=lambda data:hashlib.sha256(data).hexdigest()
|
||||
|
||||
def main():
|
||||
original_index=OUT/'index.json'
|
||||
assert sha(original_index.read_bytes())=='a632f68e43ae8cfbbe87092f8023d80bcc9c2f29079e56b7f09b83fa3628d1e2'
|
||||
original=json.loads(original_index.read_bytes())
|
||||
def verify_original():
|
||||
for item in original['files']:
|
||||
data=(OUT/item['path']).read_bytes()
|
||||
assert len(data)==item['bytes'] and sha(data)==item['sha256'],item['path']
|
||||
assert sha(original_index.read_bytes())=='a632f68e43ae8cfbbe87092f8023d80bcc9c2f29079e56b7f09b83fa3628d1e2'
|
||||
verify_original()
|
||||
helpers=runpy.run_path(str(OUT/'collect.py'))
|
||||
local=ROOT/'.local'
|
||||
assert sha((local/'focus-native/parent-observations.json').read_bytes())=='73189f8a597d52e893ccc23ba0ed11cc4bec99d2ec07b45f7d5c52772d44de72'
|
||||
corpus=local/'focus-final-review-dwb4lmy7'
|
||||
sources=[(p,p.relative_to(local).as_posix()) for p in corpus.rglob('*') if p.is_file()]
|
||||
extra=['focus-final-review-probe.py','focus-final-oracle-review.md','focus-native/parent-observations.json','write-focus-observations.py']
|
||||
sources.extend((local/name,name) for name in extra)
|
||||
supplement=helpers['archive']('supplemental-final-review.zip',sources)
|
||||
copies=[helpers['copy'](local/'focus-final-oracle-review.md','reviews/final-review.md'),
|
||||
helpers['copy'](local/'focus-native/parent-observations.json','parent-observations.json')]
|
||||
verify_original()
|
||||
files=[helpers['record'](p) for p in sorted(OUT.rglob('*')) if p.is_file()]
|
||||
archives=original['archives']+[supplement]
|
||||
final={'source':original['source'],
|
||||
'scope':'Final content inventory, not an experiment verdict. Includes the first packet unchanged plus a separate final-review/parent-observation supplement. This index excludes only its own recursively unhashable entry.',
|
||||
'original_index':helpers['record'](original_index),
|
||||
'original_packet_unchanged':True,
|
||||
'supplement_scope':'The formerly pending fresh repair review is now included, with its complete private probe corpus and the later parent observation receipt. Historical provenance text and raw filenames remain unchanged.',
|
||||
'standalone_file_count':len(files),'standalone_bytes':sum(r['bytes'] for r in files),'files':files,
|
||||
'archives':archives,'archived_member_count':sum(a['member_count'] for a in archives),
|
||||
'archived_uncompressed_bytes':sum(a['uncompressed_bytes'] for a in archives),
|
||||
'copied_sources':original['copied_sources']+copies,'skipped':original['skipped'],
|
||||
'supplement_skipped':[]}
|
||||
helpers['emit'](OUT/'index-final.json',final)
|
||||
# Independently read back the newly added ZIP and compare every original source.
|
||||
manifest=json.loads((OUT/supplement['member_inventory']['path']).read_bytes())
|
||||
with zipfile.ZipFile(OUT/supplement['archive']['path']) as archive:
|
||||
assert set(archive.namelist())=={item['path'] for item in manifest['members']}
|
||||
for item in manifest['members']:
|
||||
data=archive.read(item['path'])
|
||||
assert len(data)==item['bytes'] and sha(data)==item['sha256']
|
||||
assert data==Path(item['original_source_path']).read_bytes()
|
||||
for item in files:
|
||||
data=(OUT/item['path']).read_bytes()
|
||||
assert len(data)==item['bytes'] and sha(data)==item['sha256']
|
||||
verify_original()
|
||||
print(json.dumps({'index_final':helpers['record'](OUT/'index-final.json'),
|
||||
'supplement':supplement,'standalone_copies':copies,
|
||||
'files_including_final_index':len(files)+1,
|
||||
'bytes_including_final_index':sum(r['bytes'] for r in files)+(OUT/'index-final.json').stat().st_size,
|
||||
'all_archived_member_count':final['archived_member_count'],
|
||||
'all_archived_uncompressed_bytes':final['archived_uncompressed_bytes'],
|
||||
'original_packet_unchanged':True,'supplement_skipped':[]},indent=2))
|
||||
|
||||
if __name__=='__main__':main()
|
||||
@@ -0,0 +1,91 @@
|
||||
"""Create-only collection of the declared Focus evidence; never edits source inputs."""
|
||||
from pathlib import Path
|
||||
import hashlib,json,zipfile
|
||||
|
||||
ROOT=Path('C:/ar-focus-01a0d717')
|
||||
OUT=Path(__file__).resolve().parent
|
||||
SOURCE='38789512626cb24f78f274998977fc8c6cf960d1'
|
||||
sha=lambda data:hashlib.sha256(data).hexdigest()
|
||||
def emit(path,value):
|
||||
with path.open('x',encoding='utf-8',newline='\n') as f:json.dump(value,f,indent=2);f.write('\n')
|
||||
def record(path):
|
||||
data=path.read_bytes();return {'path':path.relative_to(OUT).as_posix(),'bytes':len(data),'sha256':sha(data)}
|
||||
def copy(source,relative):
|
||||
data=source.read_bytes();target=OUT/relative;target.parent.mkdir(parents=True,exist_ok=True)
|
||||
with target.open('xb') as f:f.write(data)
|
||||
assert target.read_bytes()==source.read_bytes(),f'Source changed during collection: {source}'
|
||||
return {**record(target),'original_source_path':str(source)}
|
||||
def archive(name,sources):
|
||||
members=[]
|
||||
with zipfile.ZipFile(OUT/name,'x',compression=zipfile.ZIP_DEFLATED,compresslevel=9) as archive:
|
||||
for source,member in sorted(sources,key=lambda item:item[1]):
|
||||
assert source.is_file() and not source.is_symlink(),source
|
||||
data=source.read_bytes()
|
||||
info=zipfile.ZipInfo(member,date_time=(2026,10,2,0,0,0));info.compress_type=zipfile.ZIP_DEFLATED
|
||||
info.external_attr=0o100644<<16
|
||||
archive.writestr(info,data,compress_type=zipfile.ZIP_DEFLATED,compresslevel=9)
|
||||
assert source.read_bytes()==data,f'Source changed during archive: {source}'
|
||||
members.append({'path':member,'bytes':len(data),'sha256':sha(data),'original_source_path':str(source)})
|
||||
assert len({r['path'] for r in members})==len(members)
|
||||
with zipfile.ZipFile(OUT/name) as archive:
|
||||
assert archive.testzip() is None
|
||||
assert sorted(archive.namelist())==sorted(r['path'] for r in members)
|
||||
for item in members:
|
||||
data=archive.read(item['path'])
|
||||
assert len(data)==item['bytes'] and sha(data)==item['sha256']
|
||||
manifest=name.removesuffix('.zip')+'-members.json'
|
||||
emit(OUT/manifest,{'archive':name,'member_count':len(members),'uncompressed_bytes':sum(r['bytes'] for r in members),'members':members})
|
||||
return {'archive':record(OUT/name),'member_inventory':record(OUT/manifest),'member_count':len(members),'uncompressed_bytes':sum(r['bytes'] for r in members)}
|
||||
|
||||
def main():
|
||||
assert OUT==ROOT/'harness/experiments/focus-optical-20261001/evidence'
|
||||
assert set(OUT.iterdir())=={Path(__file__).resolve()},'Evidence directory must contain only this collector before first run'
|
||||
local=ROOT/'.local'
|
||||
assert json.loads((local/'focus-build-pins.json').read_bytes())['source']==SOURCE
|
||||
oracle=local/'focus-native/independent-oracle.json'
|
||||
assert sha(oracle.read_bytes())=='0ba442b4eff4138821baa1a2687d8af2f38aa8c3a5016a8abc4985722926a402'
|
||||
for case in ['eight','oa','sa','small','ordinary']:
|
||||
result=json.loads((local/f'focus-native/{case}/finished.json').read_bytes())
|
||||
assert result['source']==SOURCE and result['exit_code']==0 and result['stderr_bytes']==0
|
||||
copies=[]
|
||||
for name in ['verify-focus-native.py','verify-focus-native-original.py','launch-focus-native.py','run-focus-gates.py','run-focus-oracle.py','focus-build-pins.json','focus-expected-eight-diagnostics.json']:
|
||||
copies.append(copy(local/name,'helpers/'+name))
|
||||
copies.append(copy(Path('C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/env.ps1'),'helpers/toolchain-env.ps1'))
|
||||
for name in ['focus-optical-seams.md','focus-proposal-review-original.md','focus-proposal-review.md','focus-source-review.md','focus-oracle-review.md','semantic-connection-next.md']:
|
||||
copies.append(copy(local/name,'reviews/'+name))
|
||||
for name in ['diagram-next-action-design.md','diagram-workspace-focus-design.md']:
|
||||
copies.append(copy(Path('C:/ar-diagram-01a0d717/.local')/name,'reviews/'+name))
|
||||
sources=[]
|
||||
for dirname in ['focus-native','focus-gates/attempt01','focus-formatter','focus-oracle-attempt01']:
|
||||
for path in (local/dirname).rglob('*'):
|
||||
if path.is_file() and not path.is_relative_to(local/'focus-native/bin'):
|
||||
sources.append((path,path.relative_to(local).as_posix()))
|
||||
raw=archive('raw-native.zip',sources)
|
||||
challenges=local/'focus-oracle-review-vwkxuhp0'
|
||||
challenge=archive('oracle-challenges.zip',[(p,'focus-oracle-review-vwkxuhp0/'+p.relative_to(challenges).as_posix()) for p in challenges.rglob('*') if p.is_file()])
|
||||
gates=json.loads((local/'focus-gates/attempt01/result.json').read_bytes())
|
||||
skipped=[]
|
||||
for p in sorted((local/'focus-native/bin').rglob('*')):
|
||||
if p.is_file():skipped.append({'path':str(p),'bytes':p.stat().st_size,'sha256':sha(p.read_bytes()),'reason':'Local-only executable/runtime intentionally excluded; rebuild from identified source/toolchain. Not a release package.'})
|
||||
provenance={'scope':'Raw evidence collection and byte inventories only; no new experiment verdict or publication.',
|
||||
'source':SOURCE,'toolchain_record':gates['environment'],'source_input_count':len(gates['source_inputs']),
|
||||
'source_input_inventory':'raw-native.zip!focus-gates/attempt01/result.json',
|
||||
'source_build_commands':gates['steps'],'binary_pins':json.loads((local/'focus-build-pins.json').read_bytes()),
|
||||
'oracle_report_sha256':sha(oracle.read_bytes()),
|
||||
'preservation':'All copied and archived contents retain original bytes and names, including failures, synthetic adversarial records, early mislabeled ordinary captures and zero-byte logs. ZIP metadata is normalized; file bytes are not.',
|
||||
'path_scope':'Captured scripts retain original host paths. helpers/toolchain-env.ps1 is an unmodified historical copy whose relative PSScriptRoot assumes its original location. Collection does not claim these scripts are portable without path setup.',
|
||||
'known_limits':'Synthetic oracle-challenge directories are not native runs. CPU draw receipts and temporal conservation are not GPU/glyph or fresh perception acceptance. Fresh reader unavailable.',
|
||||
'skipped':skipped,
|
||||
'not_collected_yet':['The separate fresh repair/final-review contribution was still active during collection; parent owns attaching its final handed-off review outside these raw inventories.'],
|
||||
'copies':copies}
|
||||
emit(OUT/'provenance.json',provenance)
|
||||
files=[record(p) for p in sorted(OUT.rglob('*')) if p.is_file()]
|
||||
index={'source':SOURCE,'scope':'Content inventory, not acceptance; index excludes its own recursively unhashable entry.',
|
||||
'standalone_file_count':len(files),'standalone_bytes':sum(r['bytes'] for r in files),'files':files,
|
||||
'archives':[raw,challenge],'archived_member_count':raw['member_count']+challenge['member_count'],
|
||||
'archived_uncompressed_bytes':raw['uncompressed_bytes']+challenge['uncompressed_bytes'],
|
||||
'copied_sources':copies,'skipped':skipped}
|
||||
emit(OUT/'index.json',index)
|
||||
print(json.dumps({'index':record(OUT/'index.json'),'standalone_file_count_excluding_index':len(files),'standalone_bytes_excluding_index':sum(r['bytes'] for r in files),'archives':[raw,challenge],'skipped':skipped},indent=2))
|
||||
|
||||
if __name__=='__main__':main()
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"source": "38789512626cb24f78f274998977fc8c6cf960d1",
|
||||
"gates": "attempt01",
|
||||
"binaries": {
|
||||
".local/focus-native/bin/arcadia-studio.exe": "1be6034951f664b493c5cf7ab806618e216dc840f30ea849dc2354893ab195e4",
|
||||
".local/focus-native/bin/libunwind.dll": "f45604a12e8bcd839fd86f667c1be1cc7c4f9da2b3c69ff381ac708f0e1ae7d4"
|
||||
},
|
||||
"bytes": {
|
||||
"arcadia-studio.exe": 121832448,
|
||||
"libunwind.dll": 190976
|
||||
}
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"source_receipt": "C:\\ar-diagram-01a0d717\\.local\\native-reading\\manual\\geometry-before.json",
|
||||
"receipt_sha256": "497605352c2a746ab1908324016b9bb8b1540e34433449c91135418e7d0e88d8",
|
||||
"fixture_sha256": "9db1015369f450d5810c96a01fddb8a009d57f6aafbda5182703f15ded23d9c8",
|
||||
"diagnostics": [
|
||||
{
|
||||
"code": "work_without_behavior_context",
|
||||
"element": "4149a872-3440-59de-9879-8981e78d27ab",
|
||||
"field": null,
|
||||
"message": "Include this leaf activity/function in a process/chain or scenario through a work action or exchange occurrence.",
|
||||
"severity": "Warning"
|
||||
}
|
||||
],
|
||||
"expected_scope": "Complete unchanged eight-card fixture only; other legacy examples require fresh admission inventory"
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
from pathlib import Path
|
||||
import datetime,hashlib,json,os,subprocess,sys,shutil
|
||||
ROOT=Path('C:/ar-focus-01a0d717')
|
||||
assert Path.cwd().resolve()==ROOT
|
||||
assert len(sys.argv)==2 and sys.argv[1] in ['eight','oa','sa','small','ordinary']
|
||||
case=sys.argv[1]
|
||||
pins=json.loads((ROOT/'.local/focus-build-pins.json').read_text(encoding='utf-8'))
|
||||
sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest()
|
||||
fixtures={
|
||||
'eight':('harness/experiments/focus-optical-20261001/eight-card.json','9db1015369f450d5810c96a01fddb8a009d57f6aafbda5182703f15ded23d9c8','00000000-0038-4000-8000-000000000001'),
|
||||
'oa':('examples/routing-workshop.json','8592714f75b271133f21ce017d87896b6cf91ea0e4837f1c2ed453e21be26b14','945a7c88-a352-5028-b808-73d852e5abe6'),
|
||||
'sa':('examples/routing-workshop.json','8592714f75b271133f21ce017d87896b6cf91ea0e4837f1c2ed453e21be26b14','cb21862d-79e1-5a9d-bdf0-ee344c2fb219'),
|
||||
'small':('examples/coastal-rescue.json','242f0b031229a87af5c4ebe5d651defe59c191a6b7a69dc0a77f7e203411f195','487c064d-df33-45f2-b4b7-6dd68d7b601f')}
|
||||
run=ROOT/'.local/focus-native'/case
|
||||
assert not run.exists(),'Preserve previous runs'
|
||||
run.mkdir(parents=True)
|
||||
(run/'working').mkdir();(run/'captures').mkdir()
|
||||
for rel,expected in pins['binaries'].items():assert sha(ROOT/rel)==expected
|
||||
args=[str(ROOT/'.local/focus-native/bin/arcadia-studio.exe')]
|
||||
fixture=None
|
||||
if case!='ordinary':
|
||||
rel,expected,diagram=fixtures[case]
|
||||
assert sha(ROOT/rel)==expected
|
||||
fixture=run/'working/fixture.json';shutil.copyfile(ROOT/rel,fixture);assert sha(fixture)==expected
|
||||
args+=['--focus-optical',str(fixture),diagram,str(run/'output')]
|
||||
system=os.environ['SystemRoot'];env=os.environ.copy();env['PATH']=str(Path(system)/'System32')+';'+system
|
||||
for k in list(env):
|
||||
if k.startswith(('CARGO_','RUST','LLVM','WGPU','ARCADIA_')):del env[k]
|
||||
receipt={'case':case,'source':pins['source'],'start':datetime.datetime.now(datetime.timezone.utc).isoformat(),'binary_pins':pins['binaries'],'argv':args,'cwd':str(run/'working'),'path':env['PATH'],'fixture_sha256':sha(fixture) if fixture else None,'schema_before':json.loads(fixture.read_bytes())['schema_version'] if fixture else None}
|
||||
with (run/'stdout.log').open('xb') as out,(run/'stderr.log').open('xb') as err:
|
||||
child=subprocess.Popen(args,cwd=run/'working',env=env,stdout=out,stderr=err,creationflags=subprocess.CREATE_NO_WINDOW)
|
||||
receipt['pid']=child.pid
|
||||
(run/'started.json').write_text(json.dumps(receipt,indent=2)+'\n',encoding='utf-8')
|
||||
print(json.dumps(receipt,indent=2),flush=True)
|
||||
code=child.wait()
|
||||
receipt.update({'exit_code':code,'finished':datetime.datetime.now(datetime.timezone.utc).isoformat(),'stdout_bytes':(run/'stdout.log').stat().st_size,'stderr_bytes':(run/'stderr.log').stat().st_size,'binary_pins_unchanged':all(sha(ROOT/r)==h for r,h in pins['binaries'].items()),'fixture_unchanged':sha(fixture)==receipt['fixture_sha256'] if fixture else True})
|
||||
(run/'finished.json').write_text(json.dumps(receipt,indent=2)+'\n',encoding='utf-8')
|
||||
print(json.dumps(receipt,indent=2),flush=True)
|
||||
assert code==0 and receipt['stderr_bytes']==0 and receipt['binary_pins_unchanged'] and receipt['fixture_unchanged']
|
||||
@@ -0,0 +1,25 @@
|
||||
from pathlib import Path
|
||||
import subprocess,json,hashlib,datetime,sys
|
||||
root=Path('C:/ar-focus-01a0d717');assert Path.cwd().resolve()==root
|
||||
assert len(sys.argv)==2 and sys.argv[1].startswith('attempt')
|
||||
out=root/'.local/focus-gates'/sys.argv[1];out.mkdir(parents=True,exist_ok=False)
|
||||
head=subprocess.check_output(['git','rev-parse','HEAD'],text=True).strip()
|
||||
assert not subprocess.check_output(['git','status','--porcelain'],text=True).strip()
|
||||
files=subprocess.check_output(['git','ls-files','Cargo.toml','Cargo.lock','crates'],text=True).splitlines()
|
||||
source={p:hashlib.sha256((root/p).read_bytes()).hexdigest() for p in files}
|
||||
records={'source':head,'started':datetime.datetime.now(datetime.timezone.utc).isoformat(),'environment':'Rust1.98.1 gnullvm; LLVM-MinGW20260826UCRT; sharedtarget; jobs1/incremental0','source_inputs':source,'steps':[]}
|
||||
(out/'initial.json').write_text(json.dumps(records,indent=2)+'\n',encoding='utf-8')
|
||||
for label,command in [('fmt','cargo fmt --all -- --check'),('focused','cargo test --locked -p oa-desktop -- focus_optical diagram:: --test-threads=1'),('clippy','cargo clippy --locked -p oa-desktop --all-targets -- -D warnings'),('gui-build','cargo build --locked -p oa-desktop --bin arcadia-studio')]:
|
||||
print(json.dumps({'running':label,'command':command,'source':head}),flush=True)
|
||||
shell=". 'C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/env.ps1'; $env:CARGO_BUILD_JOBS='1'; "+command+'; exit $LASTEXITCODE'
|
||||
start=datetime.datetime.now(datetime.timezone.utc).isoformat()
|
||||
with (out/(label+'.stdout')).open('xb') as a,(out/(label+'.stderr')).open('xb') as b:
|
||||
r=subprocess.run(['pwsh','-NoLogo','-NoProfile','-NonInteractive','-Command',shell],cwd=root,stdout=a,stderr=b)
|
||||
rec={'label':label,'command':command,'exit_code':r.returncode,'start':start,'finished':datetime.datetime.now(datetime.timezone.utc).isoformat(),'stdout_bytes':(out/(label+'.stdout')).stat().st_size,'stderr_bytes':(out/(label+'.stderr')).stat().st_size}
|
||||
records['steps'].append(rec)
|
||||
records['inputs_unchanged']=all(hashlib.sha256((root/p).read_bytes()).hexdigest()==h for p,h in source.items())
|
||||
(out/'result.json').write_text(json.dumps(records,indent=2)+'\n',encoding='utf-8')
|
||||
print(json.dumps(rec),flush=True)
|
||||
if r.returncode:raise SystemExit(r.returncode)
|
||||
assert records['inputs_unchanged']
|
||||
print('All four declared gates pass on unchanged source inputs',flush=True)
|
||||
@@ -0,0 +1,32 @@
|
||||
from pathlib import Path
|
||||
import datetime, hashlib, json, subprocess, sys
|
||||
|
||||
root = Path('C:/ar-focus-01a0d717')
|
||||
assert Path.cwd().resolve() == root
|
||||
checker = root / '.local/verify-focus-native.py'
|
||||
expected = '8b88f148e6a4137375d9784494a15c894c45bb8f3c2379ea2bc954e68c61421f'
|
||||
digest = lambda p: hashlib.sha256(p.read_bytes()).hexdigest()
|
||||
assert digest(checker) == expected
|
||||
attempt = root / '.local/focus-oracle-attempt01'
|
||||
attempt.mkdir()
|
||||
start = datetime.datetime.now(datetime.timezone.utc).isoformat()
|
||||
with (attempt / 'stdout.log').open('xb') as out, (attempt / 'stderr.log').open('xb') as err:
|
||||
result = subprocess.run([sys.executable, str(checker)], cwd=root, stdout=out, stderr=err)
|
||||
receipt = {'source': '38789512626cb24f78f274998977fc8c6cf960d1',
|
||||
'checker_sha256': expected, 'checker_unchanged': digest(checker) == expected,
|
||||
'start': start, 'finish': datetime.datetime.now(datetime.timezone.utc).isoformat(),
|
||||
'exit_code': result.returncode, 'stdout_bytes': (attempt / 'stdout.log').stat().st_size,
|
||||
'stderr_bytes': (attempt / 'stderr.log').stat().st_size}
|
||||
if result.returncode == 0:
|
||||
report = root / '.local/focus-native/independent-oracle.json'
|
||||
receipt['report_sha256'] = digest(report)
|
||||
receipt['cases'] = {case: {'captures': len(value['captures']), 'nodes': value['nodes'],
|
||||
'ports': value['ports'], 'edges': value['edges'],
|
||||
'warnings': len(value['diagnostics']), 'focus_gain': value['focus_gain']}
|
||||
for case, value in json.loads(report.read_bytes())['cases'].items()}
|
||||
with (attempt / 'result.json').open('x', encoding='utf-8') as output:
|
||||
json.dump(receipt, output, indent=2); output.write('\n')
|
||||
print(json.dumps(receipt, indent=2))
|
||||
if result.returncode:
|
||||
print((attempt / 'stderr.log').read_text(encoding='utf-8'))
|
||||
assert result.returncode == 0 and receipt['checker_unchanged'] and receipt['stderr_bytes'] == 0
|
||||
@@ -0,0 +1,9 @@
|
||||
$taskRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
|
||||
$env:RUSTUP_HOME = Join-Path $taskRoot '.local\toolchain\rustup'
|
||||
$env:CARGO_HOME = Join-Path $taskRoot '.local\toolchain\cargo'
|
||||
$env:RUSTUP_TOOLCHAIN = 'stable-x86_64-pc-windows-gnullvm'
|
||||
$env:PATH = "$env:CARGO_HOME\bin;$(Join-Path $taskRoot '.local\toolchain\llvm-mingw-20260826-ucrt-x86_64\bin');$env:PATH"
|
||||
$env:CARGO_TARGET_DIR = Join-Path $taskRoot '.local\target-gnullvm'
|
||||
# Keep this small development disk from accumulating multi-GiB incremental caches.
|
||||
$env:CARGO_INCREMENTAL = '0'
|
||||
$env:CARGO_TARGET_X86_64_PC_WINDOWS_GNULLVM_LINKER = 'clang.exe'
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
from pathlib import Path
|
||||
import json,hashlib,struct
|
||||
ROOT=Path('C:/ar-focus-01a0d717');BASE=ROOT/'.local/focus-native'
|
||||
J=lambda p:json.loads(p.read_bytes())
|
||||
H=lambda p:hashlib.sha256(p.read_bytes()).hexdigest()
|
||||
F=lambda x:struct.unpack('<f',struct.pack('<f',x))[0]
|
||||
def camera(b,v,empty):
|
||||
if empty:return 1.0,30.0,30.0
|
||||
left=F(b['position']['x']);top=F(b['position']['y'])
|
||||
right=F(left+F(b['size']['width']));bottom=F(top+F(b['size']['height']))
|
||||
w=max(F(F(v['width'])-48.0),1.0);h=max(F(F(v['height'])-48.0),1.0)
|
||||
ew=F(right-left);eh=F(bottom-top)
|
||||
z=max(.0001,min(1.5,F(w/max(ew,1.0)),F(h/max(eh,1.0))))
|
||||
z=F(z)
|
||||
x=F(F(24.0+F(F(w-F(ew*z))/2.0))-F(left*z))
|
||||
y=F(F(24.0+F(F(h-F(eh*z))/2.0))-F(top*z))
|
||||
return z,x,y
|
||||
results={};admitted={};diags={}
|
||||
for case in ['eight','oa','sa','small']:
|
||||
run=BASE/case;finish=J(run/'finished.json');assert finish['exit_code']==0 and finish['stderr_bytes']==0 and finish['binary_pins_unchanged'] and finish['fixture_unchanged']
|
||||
output=run/'output';closed=J(output/'finished.json');assert closed['status']=='PASS' and closed['complete_project_scene_svg_and_input_unchanged'] and closed['error'] is None
|
||||
assert (output/'input.json').read_bytes()==(run/'working/fixture.json').read_bytes()
|
||||
adm=J(output/'admission.json');assert adm['document_equals_admitted_complete_project']
|
||||
assert not any(x['severity']=='Error' for x in adm['diagnostics'])
|
||||
if case=='eight':
|
||||
assert adm['diagnostics']==J(ROOT/'.local/focus-expected-eight-diagnostics.json')['diagnostics']
|
||||
assert J(output/'project.json')==J(output/'input.json')
|
||||
admitted[case]=J(output/'project.json');diags[case]=adm['diagnostics']
|
||||
scene=J(output/'scene.json');bounds=scene['routed']['bounds']
|
||||
if case=='eight':assert len(scene['projected']['nodes'])==8 and len(scene['projected']['edges'])==12
|
||||
captures=sorted(output.glob('capture-*'));assert len(captures)==closed['captures'] and len(captures)>=3
|
||||
summaries=[]
|
||||
for cap in captures:
|
||||
for filename in ['project.json','scene.json','diagram.svg']:assert (cap/filename).read_bytes()==(output/filename).read_bytes()
|
||||
m=J(cap/'measurement.json');assert m['draw_acknowledged'] and not m['gpu_completion_claimed'] and m['complete_project_projection_routed_svg_equal']
|
||||
z,x,y=camera(bounds,m['viewport'],not scene['projected']['nodes'])
|
||||
assert (F(m['zoom']),F(m['pan']['x']),F(m['pan']['y']))==(z,x,y)
|
||||
for axis,pos,length,pan,size in [('x',bounds['position']['x'],bounds['size']['width'],x,m['viewport']['width']),('y',bounds['position']['y'],bounds['size']['height'],y,m['viewport']['height'])]:
|
||||
assert pos*z+pan>=23.99 and (pos+length)*z+pan<=size-23.99,(case,axis,m)
|
||||
summaries.append({'capture':cap.name,**{k:m[k] for k in ['variant','generation','viewport','zoom','pan','logical_client','scale_factor','measured_header_height']}})
|
||||
assert [r['variant'] for r in summaries[:3]]==['Baseline','Focus','Baseline']
|
||||
a,b,c=summaries[:3]
|
||||
for k in ['viewport','zoom','pan','logical_client','scale_factor','measured_header_height']:assert a[k]==c[k]
|
||||
assert a['logical_client']==b['logical_client'] and a['scale_factor']==b['scale_factor']
|
||||
results[case]={'diagnostics':len(adm['diagnostics']),'raw_schema':adm['raw_schema'],'admitted_schema':adm['admitted_schema'],'nodes':len(scene['projected']['nodes']),'ports':len(scene['projected']['ports']),'edges':len(scene['projected']['edges']),'bounds':bounds,'captures':summaries,'focus_gain':b['zoom']/a['zoom'],'project_sha256':H(output/'project.json'),'scene_sha256':H(output/'scene.json'),'svg_sha256':H(output/'diagram.svg')}
|
||||
assert admitted['oa']==admitted['sa'] and diags['oa']==diags['sa'],'SamelegacyProjectmustadmitdeterministicallyinbothprocesses'
|
||||
report={'status':'PASS','scope':'Full source/project/scene/SVG conservation and independent f32 Fit; native screenshots are separate; no fresh reading acceptance','cases':results}
|
||||
p=BASE/'independent-oracle.json';assert not p.exists();p.write_text(json.dumps(report,indent=2)+'\n',encoding='utf-8')
|
||||
print(json.dumps(report,indent=2))
|
||||
@@ -0,0 +1,126 @@
|
||||
from pathlib import Path
|
||||
import hashlib,json,math,struct
|
||||
ROOT=Path('C:/ar-focus-01a0d717'); BASE=ROOT/'.local/focus-native'
|
||||
SOURCE='38789512626cb24f78f274998977fc8c6cf960d1'
|
||||
BINARIES={
|
||||
'.local/focus-native/bin/arcadia-studio.exe':'1be6034951f664b493c5cf7ab806618e216dc840f30ea849dc2354893ab195e4',
|
||||
'.local/focus-native/bin/libunwind.dll':'f45604a12e8bcd839fd86f667c1be1cc7c4f9da2b3c69ff381ac708f0e1ae7d4'}
|
||||
CASES={
|
||||
'eight':('9db1015369f450d5810c96a01fddb8a009d57f6aafbda5182703f15ded23d9c8','00000000-0038-4000-8000-000000000001',7,'Sa'),
|
||||
'oa':('8592714f75b271133f21ce017d87896b6cf91ea0e4837f1c2ed453e21be26b14','945a7c88-a352-5028-b808-73d852e5abe6',3,'Oa'),
|
||||
'sa':('8592714f75b271133f21ce017d87896b6cf91ea0e4837f1c2ed453e21be26b14','cb21862d-79e1-5a9d-bdf0-ee344c2fb219',3,'Sa'),
|
||||
'small':('242f0b031229a87af5c4ebe5d651defe59c191a6b7a69dc0a77f7e203411f195','487c064d-df33-45f2-b4b7-6dd68d7b601f',3,'Oa')}
|
||||
DIAGNOSTICS_SHA='634908836604d501ddec9c0ce0f80b5be6e5cc0d2cbe4d850d3703679898383f'
|
||||
J=lambda p:json.loads(p.read_bytes())
|
||||
H=lambda p:hashlib.sha256(p.read_bytes()).hexdigest()
|
||||
F=lambda x:struct.unpack('<f',struct.pack('<f',x))[0]
|
||||
|
||||
def require(ok,reason):
|
||||
if not ok:raise AssertionError(reason)
|
||||
|
||||
def finite(x,positive=False):
|
||||
return type(x) in (int,float) and math.isfinite(x) and (not positive or x>0)
|
||||
|
||||
def same_path(recorded,expected):
|
||||
# Windows resolve preserves the extended prefix; samefile compares the actual object.
|
||||
actual=Path(recorded)
|
||||
return actual.resolve()==expected.resolve() or actual.samefile(expected)
|
||||
|
||||
def camera(b,v,empty):
|
||||
if empty:return 1.0,30.0,30.0
|
||||
left=F(b['position']['x']);top=F(b['position']['y'])
|
||||
right=F(left+F(b['size']['width']));bottom=F(top+F(b['size']['height']))
|
||||
w=max(F(F(v['width'])-48.0),1.0);h=max(F(F(v['height'])-48.0),1.0)
|
||||
ew=F(right-left);eh=F(bottom-top)
|
||||
z=F(max(.0001,min(1.5,F(w/max(ew,1.0)),F(h/max(eh,1.0)))))
|
||||
x=F(F(24.0+F(F(w-F(ew*z))/2.0))-F(left*z))
|
||||
y=F(F(24.0+F(F(h-F(eh*z))/2.0))-F(top*z))
|
||||
return z,x,y
|
||||
|
||||
def verify_pins(root=ROOT):
|
||||
pins=J(root/'.local/focus-build-pins.json')
|
||||
require(pins['source']==SOURCE and pins['binaries']==BINARIES,'Unexpected source/build pins')
|
||||
for relative,expected in BINARIES.items():
|
||||
require(H(root/relative)==expected,f'Actual binary hash differs: {relative}')
|
||||
require((root/relative).stat().st_size==pins['bytes'][Path(relative).name],f'Binary byte count differs: {relative}')
|
||||
expected=root/'.local/focus-expected-eight-diagnostics.json'
|
||||
require(H(expected)==DIAGNOSTICS_SHA,'Expected eight-case diagnostics reference changed')
|
||||
require(J(expected)['fixture_sha256']==CASES['eight'][0],'Diagnostics reference belongs to another fixture')
|
||||
|
||||
def verify_case(case,root=ROOT):
|
||||
expected_hash,diagram,schema,layer=CASES[case]
|
||||
run=root/'.local/focus-native'/case;output=run/'output'
|
||||
started=J(run/'started.json');finish=J(run/'finished.json')
|
||||
require(all(finish.get(k)==v for k,v in started.items()),f'{case}: start/final watcher receipt mismatch')
|
||||
require(started['case']==case and started['source']==SOURCE,f'{case}: wrong case/source')
|
||||
require(started['binary_pins']==BINARIES,f'{case}: wrong watcher binary pins')
|
||||
require(type(started['pid']) is int and started['pid']>0,f'{case}: invalid pid')
|
||||
require(started['fixture_sha256']==expected_hash and started['schema_before']==schema,f'{case}: wrong fixture receipt')
|
||||
require(same_path(started['cwd'],run/'working'),f'{case}: wrong working directory')
|
||||
argv=started['argv']
|
||||
require(len(argv)==5 and argv[1]=='--focus-optical' and argv[3]==diagram,f'{case}: wrong launch arguments')
|
||||
require(same_path(argv[0],root/'.local/focus-native/bin/arcadia-studio.exe') and same_path(argv[2],run/'working/fixture.json') and same_path(argv[4],output),f'{case}: wrong launch paths')
|
||||
require(finish['exit_code']==0 and finish['binary_pins_unchanged'] is True and finish['fixture_unchanged'] is True,f'{case}: watcher failure')
|
||||
require(finish['stderr_bytes']==(run/'stderr.log').stat().st_size==0,f'{case}: stderr or receipt mismatch')
|
||||
require(finish['stdout_bytes']==(run/'stdout.log').stat().st_size,f'{case}: stdout receipt mismatch')
|
||||
require(H(output/'input.json')==H(run/'working/fixture.json')==expected_hash,f'{case}: actual fixture hash mismatch')
|
||||
raw=J(output/'input.json');require(raw['schema_version']==schema,f'{case}: wrong raw schema')
|
||||
closed=J(output/'finished.json')
|
||||
require(closed['status']=='PASS' and closed['complete_project_scene_svg_and_input_unchanged'] is True and closed['error'] is None,f'{case}: failed runner close')
|
||||
adm=J(output/'admission.json');project=J(output/'project.json');scene=J(output/'scene.json')
|
||||
require(adm['document_equals_admitted_complete_project'] is True,f'{case}: Document admission mismatch')
|
||||
require(adm['diagram']==scene['diagram']==diagram and adm['layer']==layer,f'{case}: wrong admitted diagram/layer')
|
||||
saved=project['diagrams'][diagram]
|
||||
require(saved['layer']==layer and saved['projection']==adm['projection'],f'{case}: projection receipt mismatch')
|
||||
require(adm['projection'] in ['Overview','Decomposition','Allocation','Traceability','FunctionalDataflow','Capabilities'],f'{case}: non-Architecture projection')
|
||||
require(adm['input_bytes']==(output/'input.json').stat().st_size and same_path(adm['input_path'],run/'working/fixture.json'),f'{case}: wrong admitted input')
|
||||
require(adm['raw_schema']==schema and adm['admitted_schema']==project['schema_version']==7,f'{case}: admitted schema mismatch')
|
||||
require((adm['migration'] is None)==(schema==7),f'{case}: migration receipt mismatch')
|
||||
require(all(issue['severity']=='Warning' for issue in adm['diagnostics']),f'{case}: error or unknown diagnostic severity')
|
||||
if case=='eight':
|
||||
require(adm['diagnostics']==J(root/'.local/focus-expected-eight-diagnostics.json')['diagnostics'],'eight: warning baseline mismatch')
|
||||
require(project==raw,'eight: complete admitted Project differs from schema7 input')
|
||||
require(len(scene['projected']['nodes'])==8 and len(scene['projected']['edges'])==12,'eight: wrong scene counts')
|
||||
bounds=scene['routed']['bounds']
|
||||
require(all(finite(bounds['position'][a]) for a in ['x','y']) and all(finite(bounds['size'][a]) and bounds['size'][a]>=0 for a in ['width','height']),f'{case}: invalid bounds')
|
||||
captures=sorted(output.glob('capture-*'))
|
||||
require(type(closed['captures']) is int and len(captures)==closed['captures'] and len(captures)>=3,f'{case}: incomplete captures')
|
||||
require([p.name for p in captures]==[f'capture-{n:03}' for n in range(1,len(captures)+1)],f'{case}: capture sequence gaps')
|
||||
summaries=[]
|
||||
for cap in captures:
|
||||
for filename in ['project.json','scene.json','diagram.svg']:
|
||||
require((cap/filename).read_bytes()==(output/filename).read_bytes(),f'{case}/{cap.name}: {filename} changed')
|
||||
m=J(cap/'measurement.json')
|
||||
require(m['diagram']==diagram and m['variant'] in ['Baseline','Focus'],f'{case}/{cap.name}: wrong measurement identity')
|
||||
require(m['draw_acknowledged'] is True and m['gpu_completion_claimed'] is False and m['complete_project_projection_routed_svg_equal'] is True,f'{case}/{cap.name}: missing draw/conservation receipt')
|
||||
require(m['hover'] is False and m['palette_expanded'] is False and m['selection']=='project (no projected object)',f'{case}/{cap.name}: nonneutral measurement')
|
||||
require(type(m['generation']) is int and m['generation']>=0,f'{case}/{cap.name}: invalid generation')
|
||||
require(all(finite(m[k][a],True) for k in ['viewport','logical_client'] for a in ['width','height']) and all(finite(m[k],True) for k in ['zoom','scale_factor','measured_header_height']) and all(finite(m['pan'][a]) for a in ['x','y']),f'{case}/{cap.name}: invalid measurement number')
|
||||
require(all(m['viewport'][a]<=m['logical_client'][a]+.001 for a in ['width','height']) and m['measured_header_height']<m['logical_client']['height'],f'{case}/{cap.name}: impossible viewport/header')
|
||||
z,x,y=camera(bounds,m['viewport'],not scene['projected']['nodes'])
|
||||
require((F(m['zoom']),F(m['pan']['x']),F(m['pan']['y']))==(z,x,y),f'{case}/{cap.name}: independent f32 Fit differs')
|
||||
for axis,pos,length,pan,size in [('x',bounds['position']['x'],bounds['size']['width'],x,m['viewport']['width']),('y',bounds['position']['y'],bounds['size']['height'],y,m['viewport']['height'])]:
|
||||
require(pos*z+pan>=23.99 and (pos+length)*z+pan<=size-23.99,f'{case}/{cap.name}: routed bounds not contained on {axis}')
|
||||
if summaries:
|
||||
previous=summaries[-1]
|
||||
require(m['generation']>=previous['generation'],f'{case}/{cap.name}: generation moved backward')
|
||||
changed=any(m[k]!=previous[k] for k in ['variant','viewport','logical_client','scale_factor'])
|
||||
require(not changed or m['generation']>previous['generation'],f'{case}/{cap.name}: stale generation on transition')
|
||||
summaries.append({'capture':cap.name,**{k:m[k] for k in ['variant','generation','viewport','zoom','pan','logical_client','scale_factor','measured_header_height']}})
|
||||
require([r['variant'] for r in summaries[:3]]==['Baseline','Focus','Baseline'],f'{case}: missing comparison sequence')
|
||||
a,b,c=summaries[:3]
|
||||
require(all(a[k]==c[k] for k in ['viewport','zoom','pan','logical_client','scale_factor','measured_header_height']),f'{case}: Baseline return differs')
|
||||
require(a['logical_client']==b['logical_client'] and a['scale_factor']==b['scale_factor'],f'{case}: comparison window/DPI changed')
|
||||
result={'diagnostics':adm['diagnostics'],'raw_schema':adm['raw_schema'],'admitted_schema':adm['admitted_schema'],'nodes':len(scene['projected']['nodes']),'ports':len(scene['projected']['ports']),'edges':len(scene['projected']['edges']),'bounds':bounds,'captures':summaries,'focus_gain':b['zoom']/a['zoom'],'input_sha256':H(output/'input.json'),'project_sha256':H(output/'project.json'),'scene_sha256':H(output/'scene.json'),'svg_sha256':H(output/'diagram.svg')}
|
||||
return result,project,adm['diagnostics']
|
||||
|
||||
def main():
|
||||
verify_pins()
|
||||
results={};admitted={};diags={}
|
||||
for case in CASES:results[case],admitted[case],diags[case]=verify_case(case)
|
||||
require(admitted['oa']==admitted['sa'] and diags['oa']==diags['sa'],'Same legacy Project admitted inconsistently in OA/SA runs')
|
||||
report={'status':'PASS','source':SOURCE,'scope':'Pinned input/build and receipt attribution; temporal whole-Project/scene/SVG conservation; independent f32 Fit from recorded bounds. No independent projection/routing/schema3 migration regeneration, semantic SVG validation, screenshot or fresh-reading acceptance. Legacy warnings are inventoried, not compared to an independently predeclared warning baseline.','cases':results}
|
||||
with (BASE/'independent-oracle.json').open('x',encoding='utf-8') as output:json.dump(report,output,indent=2);output.write('\n')
|
||||
print(json.dumps(report,indent=2))
|
||||
|
||||
if __name__=='__main__':main()
|
||||
@@ -0,0 +1,326 @@
|
||||
{
|
||||
"source": "38789512626cb24f78f274998977fc8c6cf960d1",
|
||||
"scope": "Final content inventory, not an experiment verdict. Includes the first packet unchanged plus a separate final-review/parent-observation supplement. This index excludes only its own recursively unhashable entry.",
|
||||
"original_index": {
|
||||
"path": "index.json",
|
||||
"bytes": 9746,
|
||||
"sha256": "a632f68e43ae8cfbbe87092f8023d80bcc9c2f29079e56b7f09b83fa3628d1e2"
|
||||
},
|
||||
"original_packet_unchanged": true,
|
||||
"supplement_scope": "The formerly pending fresh repair review is now included, with its complete private probe corpus and the later parent observation receipt. Historical provenance text and raw filenames remain unchanged.",
|
||||
"standalone_file_count": 28,
|
||||
"standalone_bytes": 17453302,
|
||||
"files": [
|
||||
{
|
||||
"path": "collect-supplement.py",
|
||||
"bytes": 3887,
|
||||
"sha256": "d6113e320d4802766bff7bcbc3e86960d3ef73e16063eef8e08b8fdada48b95e"
|
||||
},
|
||||
{
|
||||
"path": "collect.py",
|
||||
"bytes": 6914,
|
||||
"sha256": "6ae9f2edf01748ea026314cdc56233f09d54f9340b880abd738d7085452ad5fb"
|
||||
},
|
||||
{
|
||||
"path": "helpers/focus-build-pins.json",
|
||||
"bytes": 429,
|
||||
"sha256": "3b6e19269916be30293701367e5814d916abcd2a0158c0bb4862a279f50f99d7"
|
||||
},
|
||||
{
|
||||
"path": "helpers/focus-expected-eight-diagnostics.json",
|
||||
"bytes": 740,
|
||||
"sha256": "634908836604d501ddec9c0ce0f80b5be6e5cc0d2cbe4d850d3703679898383f"
|
||||
},
|
||||
{
|
||||
"path": "helpers/launch-focus-native.py",
|
||||
"bytes": 3108,
|
||||
"sha256": "eed344ed12e8f9f42733815559a8694dacc1862061cd95b17c6d017aee28de0d"
|
||||
},
|
||||
{
|
||||
"path": "helpers/run-focus-gates.py",
|
||||
"bytes": 2392,
|
||||
"sha256": "7a82f3c73f9e13259bc57a7fb2a590b72afdb132a5d2cc7de24bf058ea26ca9f"
|
||||
},
|
||||
{
|
||||
"path": "helpers/run-focus-oracle.py",
|
||||
"bytes": 1960,
|
||||
"sha256": "eb8622da94dda48a581d48f6e46a4bc64d51a011520d3a64c9a167bfe775c4b0"
|
||||
},
|
||||
{
|
||||
"path": "helpers/toolchain-env.ps1",
|
||||
"bytes": 621,
|
||||
"sha256": "d7eb6249bef73adacdb05cebefe7ca478758c3c38de17a1731bf01f8b25dc379"
|
||||
},
|
||||
{
|
||||
"path": "helpers/verify-focus-native-original.py",
|
||||
"bytes": 3987,
|
||||
"sha256": "505f9657f33eab102a638e9f58a60a607a6b88231705ab5c85ac9662ad35c500"
|
||||
},
|
||||
{
|
||||
"path": "helpers/verify-focus-native.py",
|
||||
"bytes": 10686,
|
||||
"sha256": "8b88f148e6a4137375d9784494a15c894c45bb8f3c2379ea2bc954e68c61421f"
|
||||
},
|
||||
{
|
||||
"path": "index.json",
|
||||
"bytes": 9746,
|
||||
"sha256": "a632f68e43ae8cfbbe87092f8023d80bcc9c2f29079e56b7f09b83fa3628d1e2"
|
||||
},
|
||||
{
|
||||
"path": "oracle-challenges-members.json",
|
||||
"bytes": 608599,
|
||||
"sha256": "cfc13cabd2c71251d6a305d5a8476ab01751fbd22003ed09f76c1ab760e48829"
|
||||
},
|
||||
{
|
||||
"path": "oracle-challenges.zip",
|
||||
"bytes": 9706512,
|
||||
"sha256": "194b8bd327885f24105d197e7669f78a4e5b6bb7733bc3b0b3005e0a6d17fe25"
|
||||
},
|
||||
{
|
||||
"path": "parent-observations.json",
|
||||
"bytes": 10560,
|
||||
"sha256": "73189f8a597d52e893ccc23ba0ed11cc4bec99d2ec07b45f7d5c52772d44de72"
|
||||
},
|
||||
{
|
||||
"path": "provenance.json",
|
||||
"bytes": 7918,
|
||||
"sha256": "062f6f1d8b8fb23767a90d04050f0c4246cab196b35ab7f936f37d2c669370eb"
|
||||
},
|
||||
{
|
||||
"path": "raw-native-members.json",
|
||||
"bytes": 64454,
|
||||
"sha256": "708ffb7fb52370e3084349f5bb3354970a5ea6dcfb1786e3128a77cfb974dfe2"
|
||||
},
|
||||
{
|
||||
"path": "raw-native.zip",
|
||||
"bytes": 6135957,
|
||||
"sha256": "178c1c4abfa69fc598eed47af554e4e40e790fd9fe7b277afa301a4088fcf3cd"
|
||||
},
|
||||
{
|
||||
"path": "reviews/diagram-next-action-design.md",
|
||||
"bytes": 22887,
|
||||
"sha256": "fb251fe1de186b559559f1874763b1d7027bee9b2dcd13cc4dc653a432571d82"
|
||||
},
|
||||
{
|
||||
"path": "reviews/diagram-workspace-focus-design.md",
|
||||
"bytes": 16840,
|
||||
"sha256": "a3cc070c39c2a1b62bc33d5b7f65d77a4e5c29e7edd4c734a2b0717847b7b9e5"
|
||||
},
|
||||
{
|
||||
"path": "reviews/final-review.md",
|
||||
"bytes": 9069,
|
||||
"sha256": "c76acf5eaf46db5110c92fbf2f6c8accb9987c919d6897ad9720f65e729a5bc1"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-optical-seams.md",
|
||||
"bytes": 13976,
|
||||
"sha256": "4616c63feb707c973d59483b70c62c26b7a5226e475e9cf29f25298431fe8a92"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-oracle-review.md",
|
||||
"bytes": 9406,
|
||||
"sha256": "e23ee11bc0a3d8e4015452d799686d8a23c7ffa5b85711e5e3b6c85004eb8aee"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-proposal-review-original.md",
|
||||
"bytes": 19129,
|
||||
"sha256": "685d89bf3138734d2d4ec3d85ed3b7e8d744ccbd9918ada99ba0fa09ae2f3b2f"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-proposal-review.md",
|
||||
"bytes": 19923,
|
||||
"sha256": "1c9db8bd49527700522cace85040f42a98bbb66a217534be0d18ca1948c7b0a9"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-source-review.md",
|
||||
"bytes": 15098,
|
||||
"sha256": "8be498404e83cfb398286fa23b31257ef7d662385affda737c8c84a6bc221b27"
|
||||
},
|
||||
{
|
||||
"path": "reviews/semantic-connection-next.md",
|
||||
"bytes": 14755,
|
||||
"sha256": "11f2c516b8762fd5e524c2f1f84acf6a87421549abe2fffce054814ddefba05b"
|
||||
},
|
||||
{
|
||||
"path": "supplemental-final-review-members.json",
|
||||
"bytes": 49772,
|
||||
"sha256": "b2601503e274ba33834fdc71e5899f4b0dd202d26420caf87473033b8675ec6d"
|
||||
},
|
||||
{
|
||||
"path": "supplemental-final-review.zip",
|
||||
"bytes": 683977,
|
||||
"sha256": "1979606e4d5ffc1661e61c2e9ab5398a9956f681dc3c84ad69d836ba0e28f604"
|
||||
}
|
||||
],
|
||||
"archives": [
|
||||
{
|
||||
"archive": {
|
||||
"path": "raw-native.zip",
|
||||
"bytes": 6135957,
|
||||
"sha256": "178c1c4abfa69fc598eed47af554e4e40e790fd9fe7b277afa301a4088fcf3cd"
|
||||
},
|
||||
"member_inventory": {
|
||||
"path": "raw-native-members.json",
|
||||
"bytes": 64454,
|
||||
"sha256": "708ffb7fb52370e3084349f5bb3354970a5ea6dcfb1786e3128a77cfb974dfe2"
|
||||
},
|
||||
"member_count": 218,
|
||||
"uncompressed_bytes": 12407341
|
||||
},
|
||||
{
|
||||
"archive": {
|
||||
"path": "oracle-challenges.zip",
|
||||
"bytes": 9706512,
|
||||
"sha256": "194b8bd327885f24105d197e7669f78a4e5b6bb7733bc3b0b3005e0a6d17fe25"
|
||||
},
|
||||
"member_inventory": {
|
||||
"path": "oracle-challenges-members.json",
|
||||
"bytes": 608599,
|
||||
"sha256": "cfc13cabd2c71251d6a305d5a8476ab01751fbd22003ed09f76c1ab760e48829"
|
||||
},
|
||||
"member_count": 1449,
|
||||
"uncompressed_bytes": 69148612
|
||||
},
|
||||
{
|
||||
"archive": {
|
||||
"path": "supplemental-final-review.zip",
|
||||
"bytes": 683977,
|
||||
"sha256": "1979606e4d5ffc1661e61c2e9ab5398a9956f681dc3c84ad69d836ba0e28f604"
|
||||
},
|
||||
"member_inventory": {
|
||||
"path": "supplemental-final-review-members.json",
|
||||
"bytes": 49772,
|
||||
"sha256": "b2601503e274ba33834fdc71e5899f4b0dd202d26420caf87473033b8675ec6d"
|
||||
},
|
||||
"member_count": 138,
|
||||
"uncompressed_bytes": 4633773
|
||||
}
|
||||
],
|
||||
"archived_member_count": 1805,
|
||||
"archived_uncompressed_bytes": 86189726,
|
||||
"copied_sources": [
|
||||
{
|
||||
"path": "helpers/verify-focus-native.py",
|
||||
"bytes": 10686,
|
||||
"sha256": "8b88f148e6a4137375d9784494a15c894c45bb8f3c2379ea2bc954e68c61421f",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\verify-focus-native.py"
|
||||
},
|
||||
{
|
||||
"path": "helpers/verify-focus-native-original.py",
|
||||
"bytes": 3987,
|
||||
"sha256": "505f9657f33eab102a638e9f58a60a607a6b88231705ab5c85ac9662ad35c500",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\verify-focus-native-original.py"
|
||||
},
|
||||
{
|
||||
"path": "helpers/launch-focus-native.py",
|
||||
"bytes": 3108,
|
||||
"sha256": "eed344ed12e8f9f42733815559a8694dacc1862061cd95b17c6d017aee28de0d",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\launch-focus-native.py"
|
||||
},
|
||||
{
|
||||
"path": "helpers/run-focus-gates.py",
|
||||
"bytes": 2392,
|
||||
"sha256": "7a82f3c73f9e13259bc57a7fb2a590b72afdb132a5d2cc7de24bf058ea26ca9f",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\run-focus-gates.py"
|
||||
},
|
||||
{
|
||||
"path": "helpers/run-focus-oracle.py",
|
||||
"bytes": 1960,
|
||||
"sha256": "eb8622da94dda48a581d48f6e46a4bc64d51a011520d3a64c9a167bfe775c4b0",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\run-focus-oracle.py"
|
||||
},
|
||||
{
|
||||
"path": "helpers/focus-build-pins.json",
|
||||
"bytes": 429,
|
||||
"sha256": "3b6e19269916be30293701367e5814d916abcd2a0158c0bb4862a279f50f99d7",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-build-pins.json"
|
||||
},
|
||||
{
|
||||
"path": "helpers/focus-expected-eight-diagnostics.json",
|
||||
"bytes": 740,
|
||||
"sha256": "634908836604d501ddec9c0ce0f80b5be6e5cc0d2cbe4d850d3703679898383f",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-expected-eight-diagnostics.json"
|
||||
},
|
||||
{
|
||||
"path": "helpers/toolchain-env.ps1",
|
||||
"bytes": 621,
|
||||
"sha256": "d7eb6249bef73adacdb05cebefe7ca478758c3c38de17a1731bf01f8b25dc379",
|
||||
"original_source_path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\env.ps1"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-optical-seams.md",
|
||||
"bytes": 13976,
|
||||
"sha256": "4616c63feb707c973d59483b70c62c26b7a5226e475e9cf29f25298431fe8a92",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-optical-seams.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-proposal-review-original.md",
|
||||
"bytes": 19129,
|
||||
"sha256": "685d89bf3138734d2d4ec3d85ed3b7e8d744ccbd9918ada99ba0fa09ae2f3b2f",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-proposal-review-original.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-proposal-review.md",
|
||||
"bytes": 19923,
|
||||
"sha256": "1c9db8bd49527700522cace85040f42a98bbb66a217534be0d18ca1948c7b0a9",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-proposal-review.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-source-review.md",
|
||||
"bytes": 15098,
|
||||
"sha256": "8be498404e83cfb398286fa23b31257ef7d662385affda737c8c84a6bc221b27",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-source-review.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-oracle-review.md",
|
||||
"bytes": 9406,
|
||||
"sha256": "e23ee11bc0a3d8e4015452d799686d8a23c7ffa5b85711e5e3b6c85004eb8aee",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-oracle-review.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/semantic-connection-next.md",
|
||||
"bytes": 14755,
|
||||
"sha256": "11f2c516b8762fd5e524c2f1f84acf6a87421549abe2fffce054814ddefba05b",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\semantic-connection-next.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/diagram-next-action-design.md",
|
||||
"bytes": 22887,
|
||||
"sha256": "fb251fe1de186b559559f1874763b1d7027bee9b2dcd13cc4dc653a432571d82",
|
||||
"original_source_path": "C:\\ar-diagram-01a0d717\\.local\\diagram-next-action-design.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/diagram-workspace-focus-design.md",
|
||||
"bytes": 16840,
|
||||
"sha256": "a3cc070c39c2a1b62bc33d5b7f65d77a4e5c29e7edd4c734a2b0717847b7b9e5",
|
||||
"original_source_path": "C:\\ar-diagram-01a0d717\\.local\\diagram-workspace-focus-design.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/final-review.md",
|
||||
"bytes": 9069,
|
||||
"sha256": "c76acf5eaf46db5110c92fbf2f6c8accb9987c919d6897ad9720f65e729a5bc1",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-oracle-review.md"
|
||||
},
|
||||
{
|
||||
"path": "parent-observations.json",
|
||||
"bytes": 10560,
|
||||
"sha256": "73189f8a597d52e893ccc23ba0ed11cc4bec99d2ec07b45f7d5c52772d44de72",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-native\\parent-observations.json"
|
||||
}
|
||||
],
|
||||
"skipped": [
|
||||
{
|
||||
"path": "C:\\ar-focus-01a0d717\\.local\\focus-native\\bin\\arcadia-studio.exe",
|
||||
"bytes": 121832448,
|
||||
"sha256": "1be6034951f664b493c5cf7ab806618e216dc840f30ea849dc2354893ab195e4",
|
||||
"reason": "Local-only executable/runtime intentionally excluded; rebuild from identified source/toolchain. Not a release package."
|
||||
},
|
||||
{
|
||||
"path": "C:\\ar-focus-01a0d717\\.local\\focus-native\\bin\\libunwind.dll",
|
||||
"bytes": 190976,
|
||||
"sha256": "f45604a12e8bcd839fd86f667c1be1cc7c4f9da2b3c69ff381ac708f0e1ae7d4",
|
||||
"reason": "Local-only executable/runtime intentionally excluded; rebuild from identified source/toolchain. Not a release package."
|
||||
}
|
||||
],
|
||||
"supplement_skipped": []
|
||||
}
|
||||
@@ -0,0 +1,262 @@
|
||||
{
|
||||
"source": "38789512626cb24f78f274998977fc8c6cf960d1",
|
||||
"scope": "Content inventory, not acceptance; index excludes its own recursively unhashable entry.",
|
||||
"standalone_file_count": 22,
|
||||
"standalone_bytes": 16686291,
|
||||
"files": [
|
||||
{
|
||||
"path": "collect.py",
|
||||
"bytes": 6914,
|
||||
"sha256": "6ae9f2edf01748ea026314cdc56233f09d54f9340b880abd738d7085452ad5fb"
|
||||
},
|
||||
{
|
||||
"path": "helpers/focus-build-pins.json",
|
||||
"bytes": 429,
|
||||
"sha256": "3b6e19269916be30293701367e5814d916abcd2a0158c0bb4862a279f50f99d7"
|
||||
},
|
||||
{
|
||||
"path": "helpers/focus-expected-eight-diagnostics.json",
|
||||
"bytes": 740,
|
||||
"sha256": "634908836604d501ddec9c0ce0f80b5be6e5cc0d2cbe4d850d3703679898383f"
|
||||
},
|
||||
{
|
||||
"path": "helpers/launch-focus-native.py",
|
||||
"bytes": 3108,
|
||||
"sha256": "eed344ed12e8f9f42733815559a8694dacc1862061cd95b17c6d017aee28de0d"
|
||||
},
|
||||
{
|
||||
"path": "helpers/run-focus-gates.py",
|
||||
"bytes": 2392,
|
||||
"sha256": "7a82f3c73f9e13259bc57a7fb2a590b72afdb132a5d2cc7de24bf058ea26ca9f"
|
||||
},
|
||||
{
|
||||
"path": "helpers/run-focus-oracle.py",
|
||||
"bytes": 1960,
|
||||
"sha256": "eb8622da94dda48a581d48f6e46a4bc64d51a011520d3a64c9a167bfe775c4b0"
|
||||
},
|
||||
{
|
||||
"path": "helpers/toolchain-env.ps1",
|
||||
"bytes": 621,
|
||||
"sha256": "d7eb6249bef73adacdb05cebefe7ca478758c3c38de17a1731bf01f8b25dc379"
|
||||
},
|
||||
{
|
||||
"path": "helpers/verify-focus-native-original.py",
|
||||
"bytes": 3987,
|
||||
"sha256": "505f9657f33eab102a638e9f58a60a607a6b88231705ab5c85ac9662ad35c500"
|
||||
},
|
||||
{
|
||||
"path": "helpers/verify-focus-native.py",
|
||||
"bytes": 10686,
|
||||
"sha256": "8b88f148e6a4137375d9784494a15c894c45bb8f3c2379ea2bc954e68c61421f"
|
||||
},
|
||||
{
|
||||
"path": "oracle-challenges-members.json",
|
||||
"bytes": 608599,
|
||||
"sha256": "cfc13cabd2c71251d6a305d5a8476ab01751fbd22003ed09f76c1ab760e48829"
|
||||
},
|
||||
{
|
||||
"path": "oracle-challenges.zip",
|
||||
"bytes": 9706512,
|
||||
"sha256": "194b8bd327885f24105d197e7669f78a4e5b6bb7733bc3b0b3005e0a6d17fe25"
|
||||
},
|
||||
{
|
||||
"path": "provenance.json",
|
||||
"bytes": 7918,
|
||||
"sha256": "062f6f1d8b8fb23767a90d04050f0c4246cab196b35ab7f936f37d2c669370eb"
|
||||
},
|
||||
{
|
||||
"path": "raw-native-members.json",
|
||||
"bytes": 64454,
|
||||
"sha256": "708ffb7fb52370e3084349f5bb3354970a5ea6dcfb1786e3128a77cfb974dfe2"
|
||||
},
|
||||
{
|
||||
"path": "raw-native.zip",
|
||||
"bytes": 6135957,
|
||||
"sha256": "178c1c4abfa69fc598eed47af554e4e40e790fd9fe7b277afa301a4088fcf3cd"
|
||||
},
|
||||
{
|
||||
"path": "reviews/diagram-next-action-design.md",
|
||||
"bytes": 22887,
|
||||
"sha256": "fb251fe1de186b559559f1874763b1d7027bee9b2dcd13cc4dc653a432571d82"
|
||||
},
|
||||
{
|
||||
"path": "reviews/diagram-workspace-focus-design.md",
|
||||
"bytes": 16840,
|
||||
"sha256": "a3cc070c39c2a1b62bc33d5b7f65d77a4e5c29e7edd4c734a2b0717847b7b9e5"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-optical-seams.md",
|
||||
"bytes": 13976,
|
||||
"sha256": "4616c63feb707c973d59483b70c62c26b7a5226e475e9cf29f25298431fe8a92"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-oracle-review.md",
|
||||
"bytes": 9406,
|
||||
"sha256": "e23ee11bc0a3d8e4015452d799686d8a23c7ffa5b85711e5e3b6c85004eb8aee"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-proposal-review-original.md",
|
||||
"bytes": 19129,
|
||||
"sha256": "685d89bf3138734d2d4ec3d85ed3b7e8d744ccbd9918ada99ba0fa09ae2f3b2f"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-proposal-review.md",
|
||||
"bytes": 19923,
|
||||
"sha256": "1c9db8bd49527700522cace85040f42a98bbb66a217534be0d18ca1948c7b0a9"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-source-review.md",
|
||||
"bytes": 15098,
|
||||
"sha256": "8be498404e83cfb398286fa23b31257ef7d662385affda737c8c84a6bc221b27"
|
||||
},
|
||||
{
|
||||
"path": "reviews/semantic-connection-next.md",
|
||||
"bytes": 14755,
|
||||
"sha256": "11f2c516b8762fd5e524c2f1f84acf6a87421549abe2fffce054814ddefba05b"
|
||||
}
|
||||
],
|
||||
"archives": [
|
||||
{
|
||||
"archive": {
|
||||
"path": "raw-native.zip",
|
||||
"bytes": 6135957,
|
||||
"sha256": "178c1c4abfa69fc598eed47af554e4e40e790fd9fe7b277afa301a4088fcf3cd"
|
||||
},
|
||||
"member_inventory": {
|
||||
"path": "raw-native-members.json",
|
||||
"bytes": 64454,
|
||||
"sha256": "708ffb7fb52370e3084349f5bb3354970a5ea6dcfb1786e3128a77cfb974dfe2"
|
||||
},
|
||||
"member_count": 218,
|
||||
"uncompressed_bytes": 12407341
|
||||
},
|
||||
{
|
||||
"archive": {
|
||||
"path": "oracle-challenges.zip",
|
||||
"bytes": 9706512,
|
||||
"sha256": "194b8bd327885f24105d197e7669f78a4e5b6bb7733bc3b0b3005e0a6d17fe25"
|
||||
},
|
||||
"member_inventory": {
|
||||
"path": "oracle-challenges-members.json",
|
||||
"bytes": 608599,
|
||||
"sha256": "cfc13cabd2c71251d6a305d5a8476ab01751fbd22003ed09f76c1ab760e48829"
|
||||
},
|
||||
"member_count": 1449,
|
||||
"uncompressed_bytes": 69148612
|
||||
}
|
||||
],
|
||||
"archived_member_count": 1667,
|
||||
"archived_uncompressed_bytes": 81555953,
|
||||
"copied_sources": [
|
||||
{
|
||||
"path": "helpers/verify-focus-native.py",
|
||||
"bytes": 10686,
|
||||
"sha256": "8b88f148e6a4137375d9784494a15c894c45bb8f3c2379ea2bc954e68c61421f",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\verify-focus-native.py"
|
||||
},
|
||||
{
|
||||
"path": "helpers/verify-focus-native-original.py",
|
||||
"bytes": 3987,
|
||||
"sha256": "505f9657f33eab102a638e9f58a60a607a6b88231705ab5c85ac9662ad35c500",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\verify-focus-native-original.py"
|
||||
},
|
||||
{
|
||||
"path": "helpers/launch-focus-native.py",
|
||||
"bytes": 3108,
|
||||
"sha256": "eed344ed12e8f9f42733815559a8694dacc1862061cd95b17c6d017aee28de0d",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\launch-focus-native.py"
|
||||
},
|
||||
{
|
||||
"path": "helpers/run-focus-gates.py",
|
||||
"bytes": 2392,
|
||||
"sha256": "7a82f3c73f9e13259bc57a7fb2a590b72afdb132a5d2cc7de24bf058ea26ca9f",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\run-focus-gates.py"
|
||||
},
|
||||
{
|
||||
"path": "helpers/run-focus-oracle.py",
|
||||
"bytes": 1960,
|
||||
"sha256": "eb8622da94dda48a581d48f6e46a4bc64d51a011520d3a64c9a167bfe775c4b0",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\run-focus-oracle.py"
|
||||
},
|
||||
{
|
||||
"path": "helpers/focus-build-pins.json",
|
||||
"bytes": 429,
|
||||
"sha256": "3b6e19269916be30293701367e5814d916abcd2a0158c0bb4862a279f50f99d7",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-build-pins.json"
|
||||
},
|
||||
{
|
||||
"path": "helpers/focus-expected-eight-diagnostics.json",
|
||||
"bytes": 740,
|
||||
"sha256": "634908836604d501ddec9c0ce0f80b5be6e5cc0d2cbe4d850d3703679898383f",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-expected-eight-diagnostics.json"
|
||||
},
|
||||
{
|
||||
"path": "helpers/toolchain-env.ps1",
|
||||
"bytes": 621,
|
||||
"sha256": "d7eb6249bef73adacdb05cebefe7ca478758c3c38de17a1731bf01f8b25dc379",
|
||||
"original_source_path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\env.ps1"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-optical-seams.md",
|
||||
"bytes": 13976,
|
||||
"sha256": "4616c63feb707c973d59483b70c62c26b7a5226e475e9cf29f25298431fe8a92",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-optical-seams.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-proposal-review-original.md",
|
||||
"bytes": 19129,
|
||||
"sha256": "685d89bf3138734d2d4ec3d85ed3b7e8d744ccbd9918ada99ba0fa09ae2f3b2f",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-proposal-review-original.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-proposal-review.md",
|
||||
"bytes": 19923,
|
||||
"sha256": "1c9db8bd49527700522cace85040f42a98bbb66a217534be0d18ca1948c7b0a9",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-proposal-review.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-source-review.md",
|
||||
"bytes": 15098,
|
||||
"sha256": "8be498404e83cfb398286fa23b31257ef7d662385affda737c8c84a6bc221b27",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-source-review.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-oracle-review.md",
|
||||
"bytes": 9406,
|
||||
"sha256": "e23ee11bc0a3d8e4015452d799686d8a23c7ffa5b85711e5e3b6c85004eb8aee",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-oracle-review.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/semantic-connection-next.md",
|
||||
"bytes": 14755,
|
||||
"sha256": "11f2c516b8762fd5e524c2f1f84acf6a87421549abe2fffce054814ddefba05b",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\semantic-connection-next.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/diagram-next-action-design.md",
|
||||
"bytes": 22887,
|
||||
"sha256": "fb251fe1de186b559559f1874763b1d7027bee9b2dcd13cc4dc653a432571d82",
|
||||
"original_source_path": "C:\\ar-diagram-01a0d717\\.local\\diagram-next-action-design.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/diagram-workspace-focus-design.md",
|
||||
"bytes": 16840,
|
||||
"sha256": "a3cc070c39c2a1b62bc33d5b7f65d77a4e5c29e7edd4c734a2b0717847b7b9e5",
|
||||
"original_source_path": "C:\\ar-diagram-01a0d717\\.local\\diagram-workspace-focus-design.md"
|
||||
}
|
||||
],
|
||||
"skipped": [
|
||||
{
|
||||
"path": "C:\\ar-focus-01a0d717\\.local\\focus-native\\bin\\arcadia-studio.exe",
|
||||
"bytes": 121832448,
|
||||
"sha256": "1be6034951f664b493c5cf7ab806618e216dc840f30ea849dc2354893ab195e4",
|
||||
"reason": "Local-only executable/runtime intentionally excluded; rebuild from identified source/toolchain. Not a release package."
|
||||
},
|
||||
{
|
||||
"path": "C:\\ar-focus-01a0d717\\.local\\focus-native\\bin\\libunwind.dll",
|
||||
"bytes": 190976,
|
||||
"sha256": "f45604a12e8bcd839fd86f667c1be1cc7c4f9da2b3c69ff381ac708f0e1ae7d4",
|
||||
"reason": "Local-only executable/runtime intentionally excluded; rebuild from identified source/toolchain. Not a release package."
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -0,0 +1,199 @@
|
||||
{
|
||||
"source": "38789512626cb24f78f274998977fc8c6cf960d1",
|
||||
"author": "01a0d717/root; assisted native operator, knows semantic answer key",
|
||||
"scope": "Manual association of actual observed captures with private measurements; no fresh perception, pixel equality, normal header instrumentation or GPU completion claim.",
|
||||
"capture_associations": [
|
||||
{
|
||||
"case": "eight",
|
||||
"capture": "capture-001",
|
||||
"measurement": "eight/output/capture-001/measurement.json",
|
||||
"measurement_sha256": "0ba9b9f9bc0d5fad9e4dfa3f6d5210609fcdef58c764f77c58c30861d5567c7c",
|
||||
"screenshot": "eight/captures/01-baseline-capture-001.jpg",
|
||||
"screenshot_sha256": "cc073acbe88078c39c801ae3e1866f8d1b0fd0a3acb83d33237a92f38e3e0e15"
|
||||
},
|
||||
{
|
||||
"case": "eight",
|
||||
"capture": "capture-002",
|
||||
"measurement": "eight/output/capture-002/measurement.json",
|
||||
"measurement_sha256": "3dcf5ee7ed63a4d7e17c8fc28d176a4bd2c339f98629b7beafd239f307d99d2b",
|
||||
"screenshot": "eight/captures/03-focus-capture-002.jpg",
|
||||
"screenshot_sha256": "9a7883cb78f7190a4434dede3ca599fb48c0fcd51dc88138b67bb3828ff709bd"
|
||||
},
|
||||
{
|
||||
"case": "eight",
|
||||
"capture": "capture-003",
|
||||
"measurement": "eight/output/capture-003/measurement.json",
|
||||
"measurement_sha256": "a9c203d7c9d5cbde5c98907223b0a81352dc6e5a450b0025a4abf0796db726e8",
|
||||
"screenshot": "eight/captures/05-baseline-capture-003.jpg",
|
||||
"screenshot_sha256": "07341e509169403ff5a835a9baf78eeca1423f28f28224c71010496812d75268"
|
||||
},
|
||||
{
|
||||
"case": "eight",
|
||||
"capture": "capture-004",
|
||||
"measurement": "eight/output/capture-004/measurement.json",
|
||||
"measurement_sha256": "a9c203d7c9d5cbde5c98907223b0a81352dc6e5a450b0025a4abf0796db726e8",
|
||||
"screenshot": "eight/captures/09-inert-input-capture-004.jpg",
|
||||
"screenshot_sha256": "7ce81b08b69872d2d59a8dc3532970bf28d3fe2e5c2e9fdad08501a8375f4d3b"
|
||||
},
|
||||
{
|
||||
"case": "eight",
|
||||
"capture": "capture-005",
|
||||
"measurement": "eight/output/capture-005/measurement.json",
|
||||
"measurement_sha256": "c143bff61e1adf787fd30de969e1dac4e5e5f51ca6003c1c96f0dec053f37ba9",
|
||||
"screenshot": "eight/captures/13-small-baseline-capture-005.jpg",
|
||||
"screenshot_sha256": "5b9c97bd6c98291733dddb2e7c604c34e98d5f1f6f1ea787ba8123321a1b55fb"
|
||||
},
|
||||
{
|
||||
"case": "eight",
|
||||
"capture": "capture-006",
|
||||
"measurement": "eight/output/capture-006/measurement.json",
|
||||
"measurement_sha256": "67c14768620e5f69617ffa6c97c273dad8ba0c13bc60fb32134d4b87b3ef9e12",
|
||||
"screenshot": "eight/captures/15-small-focus-capture-006.jpg",
|
||||
"screenshot_sha256": "bb1ae3f78b1e9d85dfcfb22532845f84b023817ff401e39dddda15c389273460"
|
||||
},
|
||||
{
|
||||
"case": "eight",
|
||||
"capture": "capture-007",
|
||||
"measurement": "eight/output/capture-007/measurement.json",
|
||||
"measurement_sha256": "9a2824b5ec340131ac68f5ec08b3442fd742f87717954f5d757961ab36f9834f",
|
||||
"screenshot": "eight/captures/19-small-baseline-return-capture-007.jpg",
|
||||
"screenshot_sha256": "d7bc0b1eec8e5c206172c6f5805cbba01dcfd45e8d7331712a86825dc165d0d3"
|
||||
},
|
||||
{
|
||||
"case": "oa",
|
||||
"capture": "capture-001",
|
||||
"measurement": "oa/output/capture-001/measurement.json",
|
||||
"measurement_sha256": "d3aee905d0790d04eb327c0ce91d4d2d43306d493b2770ab4ef1d3a849e30ecb",
|
||||
"screenshot": "oa/captures/01-baseline-capture-001.jpg",
|
||||
"screenshot_sha256": "81f5a2cf987a943c5e3da0f2ace6914b4352478d3b23fb630c0278bcb78ecb22"
|
||||
},
|
||||
{
|
||||
"case": "oa",
|
||||
"capture": "capture-002",
|
||||
"measurement": "oa/output/capture-002/measurement.json",
|
||||
"measurement_sha256": "598f2290815c617fd5469eab24ccb40a4fba68febe3aadccb4fa9cb3c21ade31",
|
||||
"screenshot": "oa/captures/03-focus-capture-002.jpg",
|
||||
"screenshot_sha256": "25f09e896cc746afa3e7da20769e27deb46dceb15d5b1e467fb005ad83875a26"
|
||||
},
|
||||
{
|
||||
"case": "oa",
|
||||
"capture": "capture-003",
|
||||
"measurement": "oa/output/capture-003/measurement.json",
|
||||
"measurement_sha256": "e4401d397f80e3ec4976becf571076fbcca7fa52d0fdd87c3456257627d04f18",
|
||||
"screenshot": "oa/captures/05-baseline-return-capture-003.jpg",
|
||||
"screenshot_sha256": "926bc3e561c62a072afd41ddcaf101191715eeef74e078acc39117b6c4932d2f"
|
||||
},
|
||||
{
|
||||
"case": "oa",
|
||||
"capture": "capture-004",
|
||||
"measurement": "oa/output/capture-004/measurement.json",
|
||||
"measurement_sha256": "e3af4b55c349f7c2ddedeb5e6d82a936374c324ec516c5b87861d605f3104ca5",
|
||||
"screenshot": "oa/captures/08-small-baseline-capture-004.jpg",
|
||||
"screenshot_sha256": "0d4926cb6908bdcceecd7b55d365b021a46eff4e54d90560149d3d6c54f437fa"
|
||||
},
|
||||
{
|
||||
"case": "oa",
|
||||
"capture": "capture-005",
|
||||
"measurement": "oa/output/capture-005/measurement.json",
|
||||
"measurement_sha256": "ffc9dbda36a67b9e885f4750b478eaae5b8b74dc430fa137fb85dbf6ccf26f10",
|
||||
"screenshot": "oa/captures/10-small-focus-capture-005.jpg",
|
||||
"screenshot_sha256": "e8cad79675c60a03ccabdae915bc1dea70515518df2b36bf856e567b57354245"
|
||||
},
|
||||
{
|
||||
"case": "sa",
|
||||
"capture": "capture-001",
|
||||
"measurement": "sa/output/capture-001/measurement.json",
|
||||
"measurement_sha256": "942b6c681133e01c8e6eb7fc554d9446b17dab6df6a349f48a001921e9871bcf",
|
||||
"screenshot": "sa/captures/01-baseline-capture-001.jpg",
|
||||
"screenshot_sha256": "42a887dab76370f806ccea198e0ceab75bbfaa2c8da37f0725fbec568f726fbc"
|
||||
},
|
||||
{
|
||||
"case": "sa",
|
||||
"capture": "capture-002",
|
||||
"measurement": "sa/output/capture-002/measurement.json",
|
||||
"measurement_sha256": "a83fe22366517bc9b1f513aa29d3d51ff2c3f7e9ecb3c428e82e4bc1eaabf78f",
|
||||
"screenshot": "sa/captures/03-focus-capture-002.jpg",
|
||||
"screenshot_sha256": "9fe9a262ac3a144da04b828f2fe4c56c953a6e8cbf0f6af710c394ca418e3d42"
|
||||
},
|
||||
{
|
||||
"case": "sa",
|
||||
"capture": "capture-003",
|
||||
"measurement": "sa/output/capture-003/measurement.json",
|
||||
"measurement_sha256": "6eb4974da115427dd858ce0d30c8c390a30bf9beb6a6c1f67e15d46a40191b18",
|
||||
"screenshot": "sa/captures/05-baseline-return-capture-003.jpg",
|
||||
"screenshot_sha256": "1787c071d9f7a2afb34ab5e2490dafb2f3c667194674fe3f4761f76d3c7b3de4"
|
||||
},
|
||||
{
|
||||
"case": "sa",
|
||||
"capture": "capture-004",
|
||||
"measurement": "sa/output/capture-004/measurement.json",
|
||||
"measurement_sha256": "37da0619b9d90e5e0be8a3efbf9e66057d9dd9095aeb297581a92ed4a866a256",
|
||||
"screenshot": "sa/captures/08-small-baseline-capture-004.jpg",
|
||||
"screenshot_sha256": "b554867bbec179590283bc3cd9e29f4b1c997218f6319ecaff5fee322ccd9f4d"
|
||||
},
|
||||
{
|
||||
"case": "sa",
|
||||
"capture": "capture-005",
|
||||
"measurement": "sa/output/capture-005/measurement.json",
|
||||
"measurement_sha256": "f0559e863cdd868ecbee3f3d13446d3a40c892ed99ee77b69e82ae56e1af60a7",
|
||||
"screenshot": "sa/captures/10-small-focus-capture-005.jpg",
|
||||
"screenshot_sha256": "8ffeefbcc91dfb7844d19c0080ae4c5aa1ebae62805def8c924618cc5bc9f943"
|
||||
},
|
||||
{
|
||||
"case": "small",
|
||||
"capture": "capture-001",
|
||||
"measurement": "small/output/capture-001/measurement.json",
|
||||
"measurement_sha256": "05615ac13fefd7b69a305fecd980173d3138adb2f3017a04278f5b63c7c064e4",
|
||||
"screenshot": "small/captures/01-baseline-capture-001.jpg",
|
||||
"screenshot_sha256": "ce0531786e4f7dd77d658f5660d09f59581dfc6c236aee106aff278c331d42fd"
|
||||
},
|
||||
{
|
||||
"case": "small",
|
||||
"capture": "capture-002",
|
||||
"measurement": "small/output/capture-002/measurement.json",
|
||||
"measurement_sha256": "2d553ce4ec6ba33fd0ce25d7fb5585ca8f9857d51be56915ba08fabae6d89a73",
|
||||
"screenshot": "small/captures/03-focus-capture-002.jpg",
|
||||
"screenshot_sha256": "4e00db179dabd052e2006d3499d3ff13356fae0aab20cc70b46bfecd3f31fbc0"
|
||||
},
|
||||
{
|
||||
"case": "small",
|
||||
"capture": "capture-003",
|
||||
"measurement": "small/output/capture-003/measurement.json",
|
||||
"measurement_sha256": "7c620cc9b3e51795939889b494bbf594b2044604b1dc30b0e549e456ee8cbc9c",
|
||||
"screenshot": "small/captures/05-baseline-return-capture-003.jpg",
|
||||
"screenshot_sha256": "0c42c480ce7f7965eeb06ed690ff61ee22ddb9f9645d2ec94d9f66ce02f904fe"
|
||||
},
|
||||
{
|
||||
"case": "small",
|
||||
"capture": "capture-004",
|
||||
"measurement": "small/output/capture-004/measurement.json",
|
||||
"measurement_sha256": "db8f3d566acdacb9fd45b701a8af86eccdc6a9dec27f8cfdaea8151eed7e7d9b",
|
||||
"screenshot": "small/captures/08-small-baseline-capture-004.jpg",
|
||||
"screenshot_sha256": "b91a1176dc1d541fa85b7e2c6e09504df94b6af9b5572e4634d28d00784cd8d8"
|
||||
},
|
||||
{
|
||||
"case": "small",
|
||||
"capture": "capture-005",
|
||||
"measurement": "small/output/capture-005/measurement.json",
|
||||
"measurement_sha256": "373080bf3a327212d2c2569c14c5a8df1cf0a9b6bd95c9dec31e01ece21b50b1",
|
||||
"screenshot": "small/captures/10-small-focus-capture-005.jpg",
|
||||
"screenshot_sha256": "460f7ae09ee03f6afe2cba4cea2e9e08309689a4ac1921c0aedb3f68b2fb7ada"
|
||||
}
|
||||
],
|
||||
"ordinary": {
|
||||
"copy_bytes": 138661,
|
||||
"copy_sha256": "9db1015369f450d5810c96a01fddb8a009d57f6aafbda5182703f15ded23d9c8",
|
||||
"completed_load": "ordinary/captures/03-normal-load-visible.jpg",
|
||||
"same_saved_diagram": "ordinary/captures/05-normal-exact-eight-view.jpg",
|
||||
"native_header_comparison": "At full window and width1100, observed header/body boundaries align visually with optical Baseline, all original controls visible. No numerical normal-header measurement.",
|
||||
"height_resize": "Attempt had no observed height change; frames07/08 remain1102x932. Only1100x900 client is inferred from observed outer width and unchanged decoration, not1100x700.",
|
||||
"early_file_names": "Frames01-normal-loaded-model and02-normal-load-settled still show Open; filenames are not successful-load assertions."
|
||||
},
|
||||
"inert_input": "Eight canvas drag, Inspector field click and Delete had no observed effect; capture004 exactly conserves full Project/scene/SVG. No literal text injected because focused field was not established.",
|
||||
"known_probe_failures": [
|
||||
"Initial body/border drag did not resize.",
|
||||
"Window growth drag rejected as outside bounds before input.",
|
||||
"Indexed native Open actions ineffective; refreshed center-coordinate click completed load."
|
||||
],
|
||||
"reading": "Larger labels aided assisted inspection, but foreign-line label crossings/shared allocation runs remain. No fresh reader available; no readability acceptance."
|
||||
}
|
||||
@@ -0,0 +1,176 @@
|
||||
{
|
||||
"scope": "Raw evidence collection and byte inventories only; no new experiment verdict or publication.",
|
||||
"source": "38789512626cb24f78f274998977fc8c6cf960d1",
|
||||
"toolchain_record": "Rust1.98.1 gnullvm; LLVM-MinGW20260826UCRT; sharedtarget; jobs1/incremental0",
|
||||
"source_input_count": 533,
|
||||
"source_input_inventory": "raw-native.zip!focus-gates/attempt01/result.json",
|
||||
"source_build_commands": [
|
||||
{
|
||||
"label": "fmt",
|
||||
"command": "cargo fmt --all -- --check",
|
||||
"exit_code": 0,
|
||||
"start": "2026-10-02T03:54:47.103759+00:00",
|
||||
"finished": "2026-10-02T03:55:01.008556+00:00",
|
||||
"stdout_bytes": 0,
|
||||
"stderr_bytes": 0
|
||||
},
|
||||
{
|
||||
"label": "focused",
|
||||
"command": "cargo test --locked -p oa-desktop -- focus_optical diagram:: --test-threads=1",
|
||||
"exit_code": 0,
|
||||
"start": "2026-10-02T03:55:01.115537+00:00",
|
||||
"finished": "2026-10-02T04:02:27.438381+00:00",
|
||||
"stdout_bytes": 9888,
|
||||
"stderr_bytes": 527
|
||||
},
|
||||
{
|
||||
"label": "clippy",
|
||||
"command": "cargo clippy --locked -p oa-desktop --all-targets -- -D warnings",
|
||||
"exit_code": 0,
|
||||
"start": "2026-10-02T04:02:27.730348+00:00",
|
||||
"finished": "2026-10-02T04:06:03.077659+00:00",
|
||||
"stdout_bytes": 0,
|
||||
"stderr_bytes": 377
|
||||
},
|
||||
{
|
||||
"label": "gui-build",
|
||||
"command": "cargo build --locked -p oa-desktop --bin arcadia-studio",
|
||||
"exit_code": 0,
|
||||
"start": "2026-10-02T04:06:03.279482+00:00",
|
||||
"finished": "2026-10-02T04:10:50.154580+00:00",
|
||||
"stdout_bytes": 0,
|
||||
"stderr_bytes": 307
|
||||
}
|
||||
],
|
||||
"binary_pins": {
|
||||
"source": "38789512626cb24f78f274998977fc8c6cf960d1",
|
||||
"gates": "attempt01",
|
||||
"binaries": {
|
||||
".local/focus-native/bin/arcadia-studio.exe": "1be6034951f664b493c5cf7ab806618e216dc840f30ea849dc2354893ab195e4",
|
||||
".local/focus-native/bin/libunwind.dll": "f45604a12e8bcd839fd86f667c1be1cc7c4f9da2b3c69ff381ac708f0e1ae7d4"
|
||||
},
|
||||
"bytes": {
|
||||
"arcadia-studio.exe": 121832448,
|
||||
"libunwind.dll": 190976
|
||||
}
|
||||
},
|
||||
"oracle_report_sha256": "0ba442b4eff4138821baa1a2687d8af2f38aa8c3a5016a8abc4985722926a402",
|
||||
"preservation": "All copied and archived contents retain original bytes and names, including failures, synthetic adversarial records, early mislabeled ordinary captures and zero-byte logs. ZIP metadata is normalized; file bytes are not.",
|
||||
"path_scope": "Captured scripts retain original host paths. helpers/toolchain-env.ps1 is an unmodified historical copy whose relative PSScriptRoot assumes its original location. Collection does not claim these scripts are portable without path setup.",
|
||||
"known_limits": "Synthetic oracle-challenge directories are not native runs. CPU draw receipts and temporal conservation are not GPU/glyph or fresh perception acceptance. Fresh reader unavailable.",
|
||||
"skipped": [
|
||||
{
|
||||
"path": "C:\\ar-focus-01a0d717\\.local\\focus-native\\bin\\arcadia-studio.exe",
|
||||
"bytes": 121832448,
|
||||
"sha256": "1be6034951f664b493c5cf7ab806618e216dc840f30ea849dc2354893ab195e4",
|
||||
"reason": "Local-only executable/runtime intentionally excluded; rebuild from identified source/toolchain. Not a release package."
|
||||
},
|
||||
{
|
||||
"path": "C:\\ar-focus-01a0d717\\.local\\focus-native\\bin\\libunwind.dll",
|
||||
"bytes": 190976,
|
||||
"sha256": "f45604a12e8bcd839fd86f667c1be1cc7c4f9da2b3c69ff381ac708f0e1ae7d4",
|
||||
"reason": "Local-only executable/runtime intentionally excluded; rebuild from identified source/toolchain. Not a release package."
|
||||
}
|
||||
],
|
||||
"not_collected_yet": [
|
||||
"The separate fresh repair/final-review contribution was still active during collection; parent owns attaching its final handed-off review outside these raw inventories."
|
||||
],
|
||||
"copies": [
|
||||
{
|
||||
"path": "helpers/verify-focus-native.py",
|
||||
"bytes": 10686,
|
||||
"sha256": "8b88f148e6a4137375d9784494a15c894c45bb8f3c2379ea2bc954e68c61421f",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\verify-focus-native.py"
|
||||
},
|
||||
{
|
||||
"path": "helpers/verify-focus-native-original.py",
|
||||
"bytes": 3987,
|
||||
"sha256": "505f9657f33eab102a638e9f58a60a607a6b88231705ab5c85ac9662ad35c500",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\verify-focus-native-original.py"
|
||||
},
|
||||
{
|
||||
"path": "helpers/launch-focus-native.py",
|
||||
"bytes": 3108,
|
||||
"sha256": "eed344ed12e8f9f42733815559a8694dacc1862061cd95b17c6d017aee28de0d",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\launch-focus-native.py"
|
||||
},
|
||||
{
|
||||
"path": "helpers/run-focus-gates.py",
|
||||
"bytes": 2392,
|
||||
"sha256": "7a82f3c73f9e13259bc57a7fb2a590b72afdb132a5d2cc7de24bf058ea26ca9f",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\run-focus-gates.py"
|
||||
},
|
||||
{
|
||||
"path": "helpers/run-focus-oracle.py",
|
||||
"bytes": 1960,
|
||||
"sha256": "eb8622da94dda48a581d48f6e46a4bc64d51a011520d3a64c9a167bfe775c4b0",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\run-focus-oracle.py"
|
||||
},
|
||||
{
|
||||
"path": "helpers/focus-build-pins.json",
|
||||
"bytes": 429,
|
||||
"sha256": "3b6e19269916be30293701367e5814d916abcd2a0158c0bb4862a279f50f99d7",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-build-pins.json"
|
||||
},
|
||||
{
|
||||
"path": "helpers/focus-expected-eight-diagnostics.json",
|
||||
"bytes": 740,
|
||||
"sha256": "634908836604d501ddec9c0ce0f80b5be6e5cc0d2cbe4d850d3703679898383f",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-expected-eight-diagnostics.json"
|
||||
},
|
||||
{
|
||||
"path": "helpers/toolchain-env.ps1",
|
||||
"bytes": 621,
|
||||
"sha256": "d7eb6249bef73adacdb05cebefe7ca478758c3c38de17a1731bf01f8b25dc379",
|
||||
"original_source_path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\env.ps1"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-optical-seams.md",
|
||||
"bytes": 13976,
|
||||
"sha256": "4616c63feb707c973d59483b70c62c26b7a5226e475e9cf29f25298431fe8a92",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-optical-seams.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-proposal-review-original.md",
|
||||
"bytes": 19129,
|
||||
"sha256": "685d89bf3138734d2d4ec3d85ed3b7e8d744ccbd9918ada99ba0fa09ae2f3b2f",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-proposal-review-original.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-proposal-review.md",
|
||||
"bytes": 19923,
|
||||
"sha256": "1c9db8bd49527700522cace85040f42a98bbb66a217534be0d18ca1948c7b0a9",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-proposal-review.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-source-review.md",
|
||||
"bytes": 15098,
|
||||
"sha256": "8be498404e83cfb398286fa23b31257ef7d662385affda737c8c84a6bc221b27",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-source-review.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/focus-oracle-review.md",
|
||||
"bytes": 9406,
|
||||
"sha256": "e23ee11bc0a3d8e4015452d799686d8a23c7ffa5b85711e5e3b6c85004eb8aee",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-oracle-review.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/semantic-connection-next.md",
|
||||
"bytes": 14755,
|
||||
"sha256": "11f2c516b8762fd5e524c2f1f84acf6a87421549abe2fffce054814ddefba05b",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\semantic-connection-next.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/diagram-next-action-design.md",
|
||||
"bytes": 22887,
|
||||
"sha256": "fb251fe1de186b559559f1874763b1d7027bee9b2dcd13cc4dc653a432571d82",
|
||||
"original_source_path": "C:\\ar-diagram-01a0d717\\.local\\diagram-next-action-design.md"
|
||||
},
|
||||
{
|
||||
"path": "reviews/diagram-workspace-focus-design.md",
|
||||
"bytes": 16840,
|
||||
"sha256": "a3cc070c39c2a1b62bc33d5b7f65d77a4e5c29e7edd4c734a2b0717847b7b9e5",
|
||||
"original_source_path": "C:\\ar-diagram-01a0d717\\.local\\diagram-workspace-focus-design.md"
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
+105
@@ -0,0 +1,105 @@
|
||||
# Next #38 action: two-axis diagram workspace trial
|
||||
|
||||
Status: independent design recommendation, 2026-10-01. Not an accepted decision, implementation, native result, or #38 closure. Parent chooses after the separately owned #46 package work. No GUI, Cargo, Gitea, source mutation, or external product research was performed for this review. Only this local report was written.
|
||||
|
||||
## Recommendation and scope
|
||||
|
||||
Test an explicit **Focus diagram** workspace that recovers both horizontal and vertical space before investing in another automatic label algorithm. First resolve whether a materially larger native canvas improves full-scene reading; only then pay for an editable workspace's preservation contract. Keep the distinction between useful workspace improvement and success on #38: magnification cannot remove a foreign line intersecting a label, separate coincident paths, or establish semantic ownership.
|
||||
|
||||
The prior focus note is directionally useful but its horizontal-only first step is insufficiently strong for this specimen. Its tool/draft/camera preservation statements are proposed requirements, not behavior already provided by the current source. Several would fail with a straightforward boolean and conditional Row children.
|
||||
|
||||
Use a separate opt-in experiment against production 6ea, with all original nodes, ports, relations, authored routes and labels unchanged. No E/F wrapping, cue, altered label scorer, hiding relations, or auto-layout in the comparison. Initially support saved non-scenario Architecture diagrams, including OA and SA projections. This is a general workspace experiment on that existing surface, not an eight-card special case. Behavior/scenario adoption is a separate dependent decision because it has different camera, form and input ownership machinery. Do not reopen accepted compact Help or overlap #43's projection/navigation work.
|
||||
|
||||
User-derived criteria are PROJECT_GOAL.md:38–60 and 110: a general OA/SA tool for engineers, modern and intuitive, less permanent chrome and noise, maintainable and extensible, with useful nesting rather than unnecessary relationship lines. The task-specific criteria are complete-scene reading, honest relation/port semantics, authored-layout preservation, and reliable editing/recovery. None authorizes silently changing the model or passing a read test by omitting difficult relationships.
|
||||
|
||||
## Correct the viewport premise before estimating benefit
|
||||
|
||||
The supplied 1566 × 874 extent and the checked historical geometry are different rectangles. `native-reading/manual/geometry-before.json` contains routed bounds at (54,18), size **1506 × 814**. Do not relabel the supplied number as routed bounds. Production `App::fit` uses `geometry.bounds`, subtracts 48 screen units from each measured canvas dimension, then takes the smaller dimension ratio and clamps at 1.5. The paired observed 826 × 534 canvas and approximately 0.515 zoom agree with the historical routed bounds: min(778/1506,486/814) = **0.51660**. Using 1566 × 874 instead gives 0.49681; that inconsistency requires a same-build measurement, not a favorable rounding choice.
|
||||
|
||||
Conditional arithmetic, not measured Focus results:
|
||||
|
||||
| Assumed viewport | Fit with 1506 × 814 routed bounds | Limiting dimension |
|
||||
| --- | --- | --- |
|
||||
| 826 × 534 | 0.51660 | width |
|
||||
| 1406 × 534, recovering the two 260/320 panels only | 0.59705 | height |
|
||||
| 1406 × 750 | 0.86241 | height |
|
||||
| 1406 × 800 | 0.90173 | width |
|
||||
|
||||
Thus the width-only example gains about 15.6%, not 70%, in Fit. If 1566 × 874 were the actual routed bounds, its corresponding width-only limit would be 0.55606. In either interpretation, vertical recovery is necessary. For a provisional 0.85 Fit target, the historical routed bounds require at least 1328.1 × 739.9 canvas units; the supplied larger bounds would require 1379.1 × 790.9. These are useful layout feasibility targets, not acceptance or a promise. At 0.85, the current 13-world-unit edge text is nominally 11.05 screen units; raster legibility still needs observation. Even the impossible best case of every 1442 × 932 client unit becoming canvas only fits the historical bounds at about 0.926. This window cannot deliver a full-scene 1:1 view with margins.
|
||||
|
||||
Current vertical consumers are real: the large application header, wrapping task navigation, diagram chooser and control rows, view-content/Help row, traceability actions, the stable selection row, and footer. `views.rs:68–148, 266–300, 475–526, 638–732` expose them. A Focus switch which only suppresses the sidebar and Inspector leaves this stack intact. The prior accepted compact Help already removed prose; do not count that recovery again.
|
||||
|
||||
Before any comparison, record the actual routed bounds, native canvas bounds, client size, DPI, palette state, projection, selection state, and zoom from the same source/input. Do not combine an old extent, a newer screenshot and an assumed header height.
|
||||
|
||||
## Materially different candidates
|
||||
|
||||
| Candidate | What it can improve | What could defeat it | Relative implementation burden / decision |
|
||||
| --- | --- | --- | --- |
|
||||
| Explicit two-axis Focus workspace | Full-scene text and port size, less persistent chrome, larger editing targets across OA/SA diagrams. No new diagram ink or authored geometry changes. | Exact collisions and shared strokes remain; compact controls may become undiscoverable; draft/focus/gesture regressions; larger view may still not yield confident ownership. | Moderate UI lifecycle work, low semantic risk if isolated. Preferred next experiment because it tests a neglected general cause and has bounded rollback. |
|
||||
| Semantic stroke/port/ownership vocabulary | Helps distinguish ordinary allocation, port allocation, exchange, trace, and ownership at a glance. More directly addresses interpreting the mixed diagram. | Pattern/color may not survive Fit, monochrome or warning/selection overlays; shared segments can still erase identity; a new arrow or junction can imply false semantics. Duplicating every port name adds clutter. | Small renderer changes can conceal substantial semantic design work. Best follow-up if Focus makes text readable but relation identity remains wrong. Evaluate one coherent vocabulary in Canvas and SVG, not UUID colors or fixture-specific cues. |
|
||||
| New label generator plus global objective / new diagram layout | Can actually eliminate some geometric conflicts and increase proximity to the owning route. | A/E/F falsifiers show clear rectangles do not establish ownership; exact coincidence can make a local zero-foreign-stroke solution impossible; moving boxes increases extent and worsens Fit; automatic updates can destabilize authored diagrams. | Highest state/cache/export/performance burden. Defer until the remaining failure is identified at adequate native scale. No further fixed-generator tie-break experiment. |
|
||||
|
||||
The semantic candidate is materially different from B's short attachment cue. Current `diagram.rs:1308–1334` mostly uses the same inactive boundary stroke for the ordinary classes, apart from warning, trace, and include/extend styling; orientation is separately and correctly controlled by `edge.oriented`. A bounded alternative could distinguish allocation from exchange with a documented pattern/weight vocabulary and use port shape/owner feedback consistently, while preserving exact paths, endpoint markers, and orientation. Any choice of pattern remains an unvalidated design decision: do not appropriate an existing inclusion/trace notation or add arrowheads to the unoriented conversation. The existing `PortLabels` layer gives name/owner/alias on hover or selected port; it is useful assisted inspection, not evidence of unselected full-scene readability. Extend that only against a demonstrated gap, rather than adding a second Inspector.
|
||||
|
||||
A future label experiment must change the feasible candidate set and objective, not repeat the fixed fractions/offsets already falsified. Plausible candidates remain measured word wrapping with route-aligned placement, orthogonal free-corridor candidates, or explicit user placement with reliable ownership inspection. Score node, foreign-stroke, other-label and association-end conflicts separately from own-route intersection; do not reward disconnection from one's own edge. Demand stable behavior under unrelated insertion/UUID ordering, nested visibility, coincident routes, authored labels, font changes, previews, exports and a bounded whole-scene budget. E/F geometric and logical export successes did not establish visual ownership; they remain rejected promotion evidence. Automatic graph layout would also move authored nodes/routes and change the experiment substantially. Do not smuggle it into a workspace test.
|
||||
|
||||
## Preferred architecture if the optical hypothesis survives
|
||||
|
||||
### Compact presentation and access
|
||||
|
||||
Use transient App workspace state, outside Project, persisted source, undo history and routed geometry. Effective only on supported Architecture surfaces. A visible text button enters Focus and an equally visible **Exit focus** returns. Do not introduce a shortcut in the first trial: current `app.rs:1345–1354` maps command-f without a Shift exclusion, so the earlier Ctrl+Shift+F suggestion already falls through to Find. Escape retains existing modal/gesture meaning.
|
||||
|
||||
In Focus, replace the large header, task strip and multirow diagram toolbar with a compact, bounded-height command area. Keep project/diagram/layer identity, saved-view chooser, Fit, zoom, Help, and Exit focus immediately available. Provide clearly labeled access to Explorer, Properties and the existing view/edit actions. The first bounded editable trial can make Explorer/Properties return to the retained normal workspace, with focus sent to the requested pane. This is simpler than adding drawers, splitters and multiple independent panel combinations. It must be explicitly labeled; an action named Properties must not secretly select the diagram and Apply a draft. Subsequent one-pane Focus docking needs evidence, not speculative infrastructure.
|
||||
|
||||
Keep the footer/status and current palette affordance visible, including meaningful dirty-draft and active-tool state. Do not remove failure reasons or lower text size to meet a canvas target. Move infrequent controls behind the explicit normal-workspace return initially; preserve their existing command implementations. Selection and feedback must not change command-area height: the current stable 32-pixel selection slot and allocation destination slot were deliberate gesture safeguards. A compact trial can use a stable short status for them, not dynamically insert a row. Validate wrapping and narrow-window behavior; allow a deliberate fallback to normal workspace instead of silently clipping the Exit or dirty-state access.
|
||||
|
||||
### Mounted state is an implementation dependency
|
||||
|
||||
Retain the same diagram subtree and stable slots for both chrome variants and side panels. A proposed narrow visibility wrapper must retain each child Tree when hidden, contribute zero to the hidden axis, avoid drawing, overlays, pointer/keyboard/IME input and focus traversal, and resume with the same text selection/caret and scroll state. These requirements are not satisfied by setting width zero or omitting the subtree. Vendored `iced_widget` is 0.14.2; Row calls `tree.diff_children` and delegates operations to children; TextInput stores cursor, selection, preedit and focus inside its Tree, independently of App draft values. Keeping the draft String alone is not enough.
|
||||
|
||||
Existing `guide/context_help.rs::WorkspaceInput` is a concrete adapter example, not a ready hidden-pane component. It retains its child, blocks modal input, suppresses overlays and retires held pointer state, but still lays out/draws the workspace and delegates `operate`. Copying it unchanged would leave hidden controls in focus traversal. Do not lay a hidden scrollable out at zero size and assume its scroll survives. A scoped wrapper should preserve the last useful child layout or avoid hidden relayout until shown; the exact implementation must be proven against actual Iced behavior, including window resizing while hidden. Avoid inventing a docking framework or relying on arbitrary widget IDs to repair a changed tree.
|
||||
|
||||
Move keyboard focus to a visible control on entry; prevent hidden fields accepting typing, clipboard or IME composition. Preserve the caret/selection data without leaving a hidden input as the effective owner. Restoring focus on exit must be conditional on the same document/editor still existing and on newer user focus intent. Modal Help, file dialogs, model menus, reference choosers and busy work retain priority. The existing `keyboard_owner_enabled` predicate omits some Architecture-specific inline/modal cases, while `diagram_removal::focus_enabled` additionally forbids dirty drafts; neither is a complete ready-made Focus admission rule. A dirty property draft should survive Focus and have visible access to its error, while the canvas remains disabled under existing rules.
|
||||
|
||||
### Explicit layout transition, camera and pending navigation
|
||||
|
||||
Handle the new workspace message as presentation state only. It must not dispatch `Page`, `Select`, `Diagram`, `Apply`, `Command(Layout)` or refresh the draft. `Page/Layer/Diagram` currently clear selection and advance epochs. Existing source/model bytes, selection/occurrence and history are invariants, not assumed consequences of using a boolean.
|
||||
|
||||
Fit mode: consume the new positive measured viewport, then call the existing Fit computation. Manual mode: retain zoom and the world point at the old viewport center. With local pan p, scale z and sizes s_old/s_new, use world center c=(s_old/2-p)/z and p_new=s_new/2-z*c. This is proposed behavior; current `CanvasResized` merely stores size and refits when first measured or `fit_to_view` is true. It does not preserve manual center. Repeated identical sensor reports must be idempotent. Return-to-normal should restore the same world center/zoom within f32 tolerance when the user made no intervening camera change, rather than replaying a stale camera snapshot over new user work.
|
||||
|
||||
Use a layout-generation token tied to document, diagram and transition to reject stale measurements. Current ordinary `CanvasResized(Size)` is unstamped; the reveal path has a separate stamp. Do not reuse window_size or mark fit true as a surrogate for a layout transition. Navigation has priority over automatic camera compensation: `diagram_reveal.rs:87` treats an unrecognized message as a new intent and clears pending reveal and navigation focus. A Focus message needs an explicit compatible rule for preserving a same-target pending reveal, updating its layout/epoch binding, and completing it once in the new measured viewport. Otherwise a simpler declared trial gate must defer Focus while that reveal is pending. Coordinate this narrow seam with #43; do not change navigation semantics or claim the peer's future behavior.
|
||||
|
||||
### Gesture and cache boundaries
|
||||
|
||||
Retire old press/move/release capabilities before geometry changes. `DiagramCanvas::update` clears group, route, node, port, connection press and pan state when its Context changes; attachment drags additionally compare zoom/pan/bounds. Existing App allocation guards have another epoch and consider canvas size. A panel transition cannot rely on a native WindowResized event, because the window did not resize. Test same-native-batch toggle/release and queued stale toolbar/viewport messages, not only a redraw between actions.
|
||||
|
||||
Do not promise selected drawing-tool preservation merely by bumping `canvas_epoch`: `connection_edit::Session` stores context, tool, source and candidates, and `update_inner` drops the entire session when context becomes stale (`app.rs:2098` region). `allocation_before` also retires Arrange-next state for a new ordinary message. A clear contract is needed: cancel an in-flight pointer gesture with no commit; retain a chosen tool by reconstructing a valid current session through existing `Session::new`, with any pending endpoint/candidate state explicitly validated or explicitly cancelled. Do not just restamp an old authority token. Keep meaningful status for cancelled partial drawing. Inline forms need their own acceptance gate; initially defer a workspace transition while an inline placement/name interaction owns input rather than silently discarding it.
|
||||
|
||||
Production `CachedScene` keys context plus node/route/port preview, not pan/zoom/viewport. An epoch change therefore permits one scene rebuild even though the geometry is unchanged. Do not claim zero routing work, and do not cache different geometry solely for Focus. No per-pointermove label search is needed. Check that no repeated viewport feedback causes a reroute/refit loop and that port tooltip/selection overlays follow the new canvas bounds. Exports remain independent of chrome; no new serialization or SVG layout setting should be introduced by this experiment.
|
||||
|
||||
## Bounded experiment and decision gates
|
||||
|
||||
1. **Freeze the comparison before implementation.** Parent chooses a clean isolated source branch after #46 and checks #43 ownership. Record exact input hashes, semantic answer key and before geometry. Use the original full 8-card/12-relation case plus at least one unrelated nested OA/SA diagram with long names and association-end labels; retain all content. Record an ordinary small diagram for regressions. Lock questions and success/failure rubric before showing variants.
|
||||
2. **Optical feasibility first.** In a throwaway opt-in native presentation trial, show the same complete diagram and existing Canvas renderer at the same window/DPI in ordinary versus compact two-axis layout. A read-only presentation spike may omit editable-pane behavior, but must then be visibly experimental and cannot be accepted as an editable workspace. Measure actual viewports and Fit. The proposed 0.85 target is only a scale feasibility discriminator, not a readability threshold. A large gain without correct reading rejects Focus as the sufficient #38 remedy. If a compact layout cannot gain meaningful height while keeping essential controls readable, reject that layout before building retention machinery.
|
||||
3. **Unassisted reading.** A reader with no answer-key exposure identifies both functional exchange endpoints/direction, the unoriented conversation participants, allocations versus port allocations, and port ownership across the complete scene. Record answers, uncertainty, plausible alternative paths, task time and any missing/illegible names before selection/hover/zoom or hints. Do not grade absent conversation direction as wrong. Require no wrong critical association and no unresolved competing ownership for the declared critical paths to call this case readable. A previously exposed reader's improvement is useful assisted evidence, not a fresh perception pass. A single fresh pass also does not establish general OA/SA usability.
|
||||
4. **Assisted engineering workflow, separately scored.** Discover Focus, inspect a port, open the correct Properties, compare another diagram, return, use Help, return again, arrange an element, edit one authored edge label, Undo/Redo and Save/reopen. Reopen in normal layout without losing model state; transient Focus need not persist. Readability after selected highlighting does not retroactively pass unassisted reading. Measure extra pane-return steps and whether engineers lose task context.
|
||||
5. **Only if proceeding to an editable trial, verify lifecycle invariants first.** Valid and invalid property drafts; search text/caret/selection; scrolled Explorer/Inspector; held node/group/route/label/port/attachment/allocation and pan gestures; armed connection tool; inline form; Help/modal; rapid toggle/resize; pending reveal and stale same-batch release; manual versus Fit camera; narrow/high-DPI layout. Assert exact complete Project/source/history conservation for pure toggles and exactly the intended edit delta for the workflow. Test hidden focus/input/IME, not merely App draft values. A lost draft, hidden edit, accidental commit, stale navigation override or repeat refit loop blocks workspace promotion regardless of reading benefit.
|
||||
|
||||
Stopping rules: if larger scale fixes text reading but the same plausible wrong ownership remains, retain the result as a workspace benefit hypothesis and move the next #38 experiment to semantic distinction/shared-route ownership. Do not polish more chrome or tweak more label offsets to avoid that result. If reading becomes correct but pane round trips frustrate editing, compare a single retained Properties dock against exit-to-properties; do not immediately build a general docking system. If Focus fails the scale premise or invariants, leave production unchanged and archive the bounded failure. No combination of viewport arithmetic, screenshots, compilation or matching geometry alone closes #38.
|
||||
|
||||
## Evidence and limits
|
||||
|
||||
Read source at clean `C:/ar-compact-01a0d717`, HEAD `6ea7518e7be5b5f17d5fbc5d667da8b388058af4`; `git status --short` was empty. Current STATE distinguishes accepted compact Help from excluded peer contributions and records #46 separately. This report does not claim a new remote ownership check. Previous A/B/E/F findings are used with their existing scope and remain unchanged. No new Capella feature claim is needed for this bounded local experiment; the user's ergonomic requirement and actual current layout provide the primary rationale. A later semantic notation proposal should consult primary Capella semantics before selecting patterns.
|
||||
|
||||
SHA-256 of reviewed inputs / principal source (paths relative to the stated source worktree unless absolute):
|
||||
|
||||
- `crates/oa-desktop/src/views.rs`: `774f68523df85850d95af11f1792057a9eee5234ca98a46c3a6eb5ae7bf50bf0`
|
||||
- `crates/oa-desktop/src/app.rs`: `19e4e6f22302540e699c164184d6dda38b5b1e6e78463fa9993edd3fcc6cfab5`
|
||||
- `crates/oa-desktop/src/guide/context_help.rs`: `fb6a98c40f45ba78bca29ef8a016dd10f5c4397bece05b821912dfceeaf24a6f`
|
||||
- `crates/oa-desktop/src/diagram.rs`: `3170397b82236d6db2a57a1bb860c3c44fd8ec16172701e6784d4bf1314d140f`
|
||||
- `crates/oa-desktop/src/app/diagram_reveal.rs`: `50f9e456646a84946e7c311c04cad2c330be544a7692ed412c6b23a8f18e4de5`
|
||||
- `crates/oa-desktop/src/app/allocation_drag.rs`: `69541bacb24dd7ec89e56fadd7af29eb23608902bcc41ffd110ee0bdb2eab0e2`
|
||||
- `crates/vendor/iced_widget/src/row.rs`: `2566e8868bced1a6b7d455c9f1ab61c7025772b27bf843ee806d5c7806fcd44b`
|
||||
- `crates/vendor/iced_widget/src/text_input.rs`: `7cd64b0f79c6000f2985cc290642698a814be5dcd7b7a56ae463b13ffe5c3b47`
|
||||
- `C:/ar-diagram-01a0d717/.local/diagram-workspace-focus-design.md`: `a3cc070c39c2a1b62bc33d5b7f65d77a4e5c29e7edd4c734a2b0717847b7b9e5`
|
||||
- `C:/ar-diagram-01a0d717/.local/native-reading/manual/geometry-before.json`: `497605352c2a746ab1908324016b9bb8b1540e34433449c91135418e7d0e88d8`
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
# Diagram workspace investigation — 2026-10-01
|
||||
|
||||
Local-only design evidence for the parent’s issue #38 work. Read-only source investigation; no implementation, GUI trial, compiler run, Gitea change, or claim of acceptance. Inspected clean `codex/label-cue-experiment-01a0d717-20261001`, commit `3e5e094bb17877674f4f3ea027a25fc0bdecdfe7`, in `C:/ar-label-cue-01a0d717`. Parent owns synthesis/publication and remote coordination. Independent peer #43 retains projection/navigation ownership. Accepted compact Help (#39, production `6e7c4dd`) is a foundation, not reopened unfinished work.
|
||||
|
||||
## Verified current behavior
|
||||
|
||||
Source references below are relative to that commit.
|
||||
|
||||
- `crates/oa-desktop/src/views.rs:222–258`: the model/source sidebar is fixed at 260 px; every non-Home page includes it. Every page except Home/Text/Guide also includes the Inspector. All Inspector variants are fixed at 320 px (`766–1064`). Architecture therefore always reserves both side panels. There is no workspace layout condition in the root composition beyond those page conditions.
|
||||
- `app.rs:505–594` retains draft, selection, diagram, zoom/pan, search/explorer state, Inspector tab and palette state, but no sidebar visibility, Inspector visibility, pane sizes or diagram focus mode. Message definitions and keyboard subscriptions likewise provide no workspace toggle. Existing “focus” names describe input ownership or reveal targets, not chrome reduction. This absence claim is based on root composition, state, messages, and shortcut routing together.
|
||||
- `app/architecture_authoring/palette.rs:128–144,175–282` and `architecture_authoring.rs:330`: the chevron only toggles the tool palette between 36 and 156 px. It neither hides the Inspector nor changes its width. The parent independently verified this natively.
|
||||
- `views.rs:435–593`: saved Architecture has a diagram chooser, View properties, Fit, minus/plus, zoom readout, Export, Auto-layout, projection picker, Help/F1 and creation palette. Projection changes are view-content changes; they are not substitutes for reducing chrome. `navigation.rs:187` and `model_menu.rs:525–531` expose Show in diagrams and Connections. The existing model browser, search, Locate, and view chooser can support navigation while detail work occurs in a larger canvas.
|
||||
- `app.rs:5403–5446`: Fit derives zoom from full routed geometry and the measured canvas dimensions, preserves a 24 px margin, and caps zoom at 150%. `CanvasResized` (`4443`) recomputes Fit only on the first measurement or a changed size while `fit_to_view` is true. Manual zoom/pan makes `fit_to_view` false (`3932`). More width therefore only raises Fit zoom when width was limiting; taller geometry can remain height-limited.
|
||||
- `views.rs:531`: canvas editing is disabled while property/source drafts are dirty. `app.rs:1175` ordinarily applies a property draft on selection change and refuses invalid application. A new layout command must bypass selection/page commands and must not accidentally apply a draft.
|
||||
- `diagram.rs:758–847` supports focused F2, context menu/Shift+F10, Insert and Delete; arrow panning in this block is conditional on an active connection tool. `behavior/canvas_workspace.rs:33–80` separately provides F6/Tab keyboard camera controls for Process/Scenario. Do not advertise those as an already universal Architecture keyboard navigation system.
|
||||
- `guide/context_help.rs:87–279`, `views.rs:298–414`, `app.rs:1373` preserve the mounted editor and exact caret behind Help, block background input/overlays, and retire held gestures without committing their release. Existing mounted tests cover caret preservation (`app/context_help_tests.rs:377`). This is useful precedent, but a hidden pane needs additional focus/traversal/visibility handling; the Help wrapper itself still delegates widget operations.
|
||||
- `diagram/focus.rs:89–119`, `diagram.rs:669–682`, and `behavior/canvas_workspace/viewport.rs:100–124,177–185` show several independent input lifetimes. Architecture route context changes clear held gestures; behavior viewport bounds/epoch changes clear panning. Changing a Row’s children is not evidence that every old gesture is safe.
|
||||
|
||||
## Criteria and candidates
|
||||
|
||||
User-owned requirements: modern, intuitive OA/SA engineering workflows; reduced cognitive load for small and large models; editable diagrams and text parity. Additional current scope from parent: complete model/context unchanged, no hidden relationships, preservation of draft/caret/selection/camera/history, safe gesture retirement, continued navigation and Help.
|
||||
|
||||
| Candidate | Workflow benefit | Material costs / risks | Assessment |
|
||||
| --- | --- | --- | --- |
|
||||
| Independently resizable and collapsible side panels | Engineer can keep navigation or properties alongside detail work; adjustable text width; good for repeated inspect/edit cycles | Splitter pointer handling, minimum widths, keyboard resizing, layout persistence, and live canvas-origin/size changes enlarge the input lifecycle work considerably. Two collapsed states need clear reopen affordances | Strong eventual workspace model, but resizing is unnecessary to test whether recovered area solves the observed task |
|
||||
| Selection-triggered transient Inspector/drawer | Most canvas area available until properties are wanted | Auto-opening on every selection produces repeated scene reflow or covers target/route geometry. Auto-dismiss conflicts with dirty drafts and exact caret. Multi-selection and invalid properties make dismissal rules harder to understand | Reject automatic selection-triggered behavior. An explicitly requested dock is safer than an overlay for spatial comparison |
|
||||
| Explicit Focus diagram mode, with optional docked panels | One clear reversible action provides more space without changing view content; retains existing editors and workflow commands; bounded native evaluator | Needs robust hidden-widget retention, focus ownership and camera policy. Extra space cannot make an arbitrary large full graph readable. A purely canvas-only mode would strand property/navigation workflows | Recommended first implementation, with explicit Explorer/Properties reopen controls, fixed existing widths, and restore action |
|
||||
|
||||
The recommendation is a reversible layout preference, not a new projection, persisted diagram property, filter, or model transaction. It preserves every node, edge, route and source file. It does not solve ambiguous label-to-route association by itself.
|
||||
|
||||
## Recommended interaction contract
|
||||
|
||||
1. On supported diagram pages, provide a text-labeled **Focus diagram** action in the existing toolbar. Active mode keeps **Restore workspace**, **Explorer**, and **Properties** visibly reachable. Do not make a bare chevron the only entrance/exit. Keep the project/context identity, diagram chooser, zoom/Fit, creation tools, navigation tabs, status and Help. The modest first scope recovers horizontal space without inventing a second application navigation system.
|
||||
2. Entering hides both side panels. Explorer and Properties explicitly reopen independently as docks, using existing 260/320 widths initially. They do not auto-open on selection. Properties means the same Inspector, including Connections; a dirty-state indicator on its reopen control makes retained pending edits visible. Reopening restores tab, scrolling, text selection/caret and draft. Do not provide a blank or duplicate editor. A focused dirty draft remains unapplied; the disabled canvas must have a concise visible reason and a direct Properties action.
|
||||
3. Restore workspace exits the mode and reinstates pre-entry panel visibility/widths (initially both visible/fixed). It does not restore old model selection, undo valid edits, or rewind the camera after the user navigated. Use a small transient `WorkspaceLayout` state owned by App, outside Document/source/history. Persistence across application restart can wait for user evidence; avoid model-format work.
|
||||
4. A diagram layout preference should be effective only on supported diagram surfaces. Moving to Text, Home, Guide or a non-diagram page presents its ordinary complete workspace. Returning to a diagram may retain the mode preference. Navigation continues through existing guarded handlers and retains their pending-draft rules. A first Architecture-only release must say so explicitly and must not pretend Behavior has parity; the preferred scope covers Architecture and actual State/Process/Scenario diagram surfaces through shared root composition, retaining their internal toolbars.
|
||||
5. Preserve semantic/occurrence selection, active view, projection, Inspector tab, source/model bytes, accepted revision and Undo/Redo stacks exactly across layout-only actions. Do not call `apply`, `select`, `refresh_draft`, `fit` unconditionally, or page navigation to implement them. Stamped handle selections must be safely revalidated/restamped or cleared explicitly when their gesture epoch changes; never let stale handles silently retarget an operation.
|
||||
6. Camera policy: if currently fitted, retain Fit intent and recompute against the new measured canvas. If manually positioned, retain zoom and the world point at the viewport center when its bounds change. A hide/show round trip without camera actions should restore the original camera within floating-point tolerance. If the user pans/zooms in focus mode, exiting preserves that current engineering location, not the entry location. This manual-center behavior is a new requirement, not existing `CanvasResized` behavior. Reuse explicit reveal/navigation arbitration; never overwrite a newer pending target reveal with a stale resize.
|
||||
7. Layout changes terminate pointer gestures without committing their release. Retain the chosen creation/connection tool and unfinished named forms; cancel only captured drag/preview state and stale geometry-based intent. Block the toggle under owning modal dialogs/Help/busy I/O through existing admission rules, or make the toggle visibly disabled. Never bypass these gates using a new early return in `App::update`. Retire Architecture node/group/route/port/attachment drags, allocation drag, behavior pan/spacing/selection gestures, and queued camera events using their actual contexts; a lone boolean is insufficient.
|
||||
8. Keep pane subtrees mounted in stable slots. Hidden panes must occupy no workspace area, draw no content/overlays, accept no keyboard/mouse/touch/IME input, and be excluded from Tab/focus operations. Retain their widget state for caret/selection/scroll restoration. Merely conditionally omitting `sidebar` or `inspector` from an unkeyed Row can move/recreate the canvas and editor trees. Merely setting zero width leaves hidden focus/input hazards. A retained-pane widget is a narrow justified adapter; test it at the mounted-widget level. Preserve caret data independently from active focus; hidden editors cannot remain the keyboard command recipient.
|
||||
9. Keyboard entry/exit must be equivalent to clicking the visible actions, have modal priority and avoid text-editing shortcuts. A concrete candidate is Ctrl+Shift+F (subject to shortcut inventory verification). Tab order excludes hidden panels; opening a dock transfers focus to its first meaningful control or retained editor, closing transfers it to the originating visible toggle/canvas. Restore a prior focused field only if its same context still exists. Escape keeps existing gesture/menu/Help meaning; do not overload it to unexpectedly exit the workspace mode. New controls need visible focus indication and labels. A universal Architecture camera keyboard adapter is additional work if keyboard-only large-model navigation is required; current F6 behavior cannot simply be claimed for it.
|
||||
|
||||
## Large-model working flow and limits
|
||||
|
||||
Engineer opens an existing view, uses Fit as orientation, chooses Focus diagram, then zooms/pans to a readable local area. Explorer opens on demand for search/Locate and existing Show in diagrams navigation, then closes to return space. A node/edge can be selected without a drawer unexpectedly covering it. Properties is opened explicitly for an edit, applied/reverted normally, then closed. F1 still explains the active diagram without losing drafts or restarting gestures; Save/Undo/Redo remain normal engineering operations.
|
||||
|
||||
This supports a large model through movement and navigation, not the claim that every label in the entire model becomes readable simultaneously. The parent’s 826×534 canvas can recover approximately 580 horizontal pixels before other control/layout effects: a width ceiling near 1406 px, or 1.70× the current width. A hypothetical width-limited 52% Fit would rise toward 88%; height limits may prevent that. These are geometric estimates, not a measured result or success criterion. Independent vertical chrome reduction may be needed if the actual scene is height-limited, but reopening accepted Help work or hiding important context is not justified by this estimate.
|
||||
|
||||
No filtered/saved selective view, automatic folding, deleting relationships, or rearrangement should be used to demonstrate this workspace improvement. Those are separate model/view-content choices with separate ownership. Existing peer #43 navigation should be integrated through its public behavior, not duplicated or taken over.
|
||||
|
||||
## Bounded implementation and evaluators
|
||||
|
||||
Production boundary: `views.rs` root composition and shared controls; a small `workspace_layout` state/retained-pane widget module; `app.rs` messages/admission/camera-boundary integration; targeted Architecture/Behavior camera adapters where required; a concise guide entry beside existing diagram controls. No core model, textual grammar, REST, route association, projection filtering or automatic layout changes. This is more than a two-condition view patch because exact caret and pointer lifetimes are acceptance requirements.
|
||||
|
||||
Define success before implementation:
|
||||
|
||||
- Model/source oracle: layout enter/open/close/restore and Help cycles preserve the full Project, all source bytes, selection/occurrence, diagram/projection, accepted revision, dirty draft contents and Undo/Redo availability. Include an invalid mid-string property draft and source draft; neither is silently applied/reverted. Subsequent explicit Apply creates only the intended one edit.
|
||||
- Mounted-widget oracle: exact mid-string caret and selected text survive hide/reopen; hidden pane typing/Delete/IME cannot mutate retained fields or model; Tab cannot enter hidden panes; focus remains visibly recoverable. Preserve Inspector and Explorer nonzero scroll offsets. Cover help-open/close and resize while hidden.
|
||||
- Gesture oracle: hold each representative Architecture drag (node/group, route label/bend/attachment, port and allocation), invoke keyboard layout change, then release in the new layout. No move/route/allocation command is committed; a fresh gesture succeeds. Repeat Process/Scenario camera/spacing and State editing. Explicitly exercise release arriving in the same native batch and stale queued messages after restoration.
|
||||
- Camera oracle: Fit uses new actual dimensions; manual zoom and center are stable across round trips; real pan/zoom in expanded space is respected on return. Test narrow and ordinary window sizes, pending Show in diagrams reveal, and multiple rapid toggle/resize events. Fit must still include the same full geometry.
|
||||
- Native task evaluation at the same 1440×900 window and complete 8-card fixture: locate a named endpoint, read/associate a selected connection, edit a label at its caret, arrange one item, open Connections, inspect another view, return, and Save/Undo/Redo/reopen. Record actual canvas bounds and Fit zoom, error/recovery steps and whether every required control can be found. Repeat a genuinely larger view requiring pan/search and at a smaller window. A before/after static image alone fails this evaluator.
|
||||
- Keyboard native task: discover/toggle/restore workspace, open Inspector, edit at a retained caret, close it, access Help and dismiss, then navigate/camera/edit again without a hidden field stealing commands. Record inherited Architecture keyboard limitations instead of treating Process/Scenario F6 evidence as universal.
|
||||
- Fresh independent review should attempt to falsify retained-tree, hidden-input, camera, draft and stale-event invariants, followed by recheck of actual native workflow. Reuse accepted Help evidence only for unchanged behavior; test changed compositions and focus boundaries anew.
|
||||
|
||||
Decision remains a recommendation awaiting parent synthesis. Main uncertainty to resolve first is actual full-scene geometry: recovered width may not raise Fit because height can be limiting. Prototype and inspect the real workflow before adding resizable splitters, persistence, a navigation rail, or claiming dense-diagram acceptance.
|
||||
@@ -0,0 +1,62 @@
|
||||
# Focus final checker and four-case evidence review
|
||||
|
||||
Reviewed 2026-10-01 PDT by package46_prepare, independently of the Python checker author and its repair author. I previously authored the private Rust optical runner, so this is not a fresh independent review of that runner. Source: `38789512626cb24f78f274998977fc8c6cf960d1`; working tree clean at review. No source, checker, actual native evidence, or shared oracle output was modified. No Cargo, GUI, Gitea, publication, or task closure was performed.
|
||||
|
||||
**Result: no blocker found for the declared temporal conservation and recorded-bounds f32 Fit conclusion.** All four real completed cases pass the repaired checker's `verify_pins` and `verify_case`, with OA/SA complete admitted Project and diagnostics equality checked separately. This does not validate a fresh reading, independent route/projection/migration generation, or GPU display completion.
|
||||
|
||||
## Reproduction and exact snapshot
|
||||
|
||||
Read the complete predeclared plan, original/repaired checker, previous checker review, launcher, gate runner/receipts/logs, and actual case receipts and data. Executed from `C:/ar-focus-01a0d717`:
|
||||
|
||||
```powershell
|
||||
& 'C:/Users/User/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe' .local/focus-final-review-probe.py
|
||||
git status --short
|
||||
```
|
||||
|
||||
The probe imports the repaired checker without executing `main`; bytecode writes are disabled. It verifies the real packet, copies case output/working files and receipts into a new isolated directory, relocates only paths in those copies, confirms every clean copied case still passes, and restores each mutation after testing. No binaries or screenshots were duplicated. The shared `independent-oracle.json` existed when inspected and was not written by this review.
|
||||
|
||||
Probe: `.local/focus-final-review-probe.py`, 6019 bytes, SHA-256 `5c144c3975657d51509805adadb73f47628365a5b664ace1a621549887f8f374`.
|
||||
|
||||
Raw results and complete reviewed non-screenshot case-file byte/hash inventory: `.local/focus-final-review-dwb4lmy7/results.json`, SHA-256 `3d2a66a3262aa17509e6b552bcea0aa08edc5aa4bff2d0810862d003925344a0`. This includes every actual root and capture Project/scene/SVG/measurement, admission and watcher receipt, input and working fixture. Isolated copies remain beside it for audit; they are test material, not native evidence.
|
||||
|
||||
| Reviewed artifact | SHA-256 |
|
||||
| --- | --- |
|
||||
| Predeclared plan | `3564c669b7f33bd6dbee70c78a02442ca168437641c65dba44074ad038d9376f` |
|
||||
| Original checker, 3987 bytes | `505f9657f33eab102a638e9f58a60a607a6b88231705ab5c85ac9662ad35c500` |
|
||||
| Repaired checker, 10686 bytes | `8b88f148e6a4137375d9784494a15c894c45bb8f3c2379ea2bc954e68c61421f` |
|
||||
| Prior checker review | `e23ee11bc0a3d8e4015452d799686d8a23c7ffa5b85711e5e3b6c85004eb8aee` |
|
||||
| Build pins | `3b6e19269916be30293701367e5814d916abcd2a0158c0bb4862a279f50f99d7` |
|
||||
| Native launcher | `eed344ed12e8f9f42733815559a8694dacc1862061cd95b17c6d017aee28de0d` |
|
||||
| Build gate runner | `7a82f3c73f9e13259bc57a7fb2a590b72afdb132a5d2cc7de24bf058ea26ca9f` |
|
||||
| Gate attempt01 result | `31c1aa961942a4a2d42cf32fe703a17e4f9a91598f264167d5494d01699dfab3` |
|
||||
|
||||
## Source/build and case attribution
|
||||
|
||||
Independently checked all 533 gate `source_inputs` SHA-256 values against the current clean checkout and exact HEAD. The four gate commands have exit 0 and recorded stdout/stderr sizes matching actual files: fmt, focused desktop tests, clippy with `-D warnings`, GUI dev build. The focused log reports 92 passed, 0 failed. Compiler progress in stderr is expected, distinct from all four native runs' empty stdout/stderr. This review reused those gates; it did not rerun or independently reproduce the compiler.
|
||||
|
||||
The actual frozen executable is 121832448 bytes, SHA-256 `1be6034951f664b493c5cf7ab806618e216dc840f30ea849dc2354893ab195e4`; libunwind is 190976 bytes, SHA-256 `f45604a12e8bcd839fd86f667c1be1cc7c4f9da2b3c69ff381ac708f0e1ae7d4`. Native launch/final receipts bind the exact source/build pins, case, diagram argument, cwd and fixture path. Actual input/working bytes match each predeclared fixture hash. All four exit 0 and have honest PASS close receipts, unchanged-binary/fixture watcher receipts and zero-byte logs. These records attribute the observed run to the pinned build; they are not a reproducible-build proof or an adversarially authenticated process log.
|
||||
|
||||
## Actual measurements and conservation
|
||||
|
||||
| Case | Captures | Nodes / ports / edges | Warnings | Baseline zoom | Focus zoom | Gain |
|
||||
| --- | ---: | --- | ---: | ---: | ---: | ---: |
|
||||
| eight | 7 | 8 / 6 / 12 | 1 | 0.5152722597122192 | 0.9243028163909912 | 1.7938144329896908 |
|
||||
| oa | 5 | 12 / 0 / 7 | 29 | 0.7218604683876038 | 1.208722710609436 | 1.6744547783719486 |
|
||||
| sa | 5 | 12 / 20 / 12 | 29 | 0.665675699710846 | 1.0486485958099365 | 1.5753145206674137 |
|
||||
| small | 5 | 3 / 0 / 1 | 5 | 1.5 | 1.5 | 1.0 |
|
||||
|
||||
All 22 capture sets have byte-identical complete Project, scene (including full routed debug data), and SVG relative to their session roots. First three captures are Baseline/Focus/Baseline with identical first/return camera, viewport, client, scale and header. Initial client is 1440x900 logical, scale1. Baseline header measures 67.39999389648438; Focus header48. Initial Baseline viewports are 824x535 (eight), 824x540.6000366210938 (oa/sa), and 824x574.6000366210938 (small); Focus is1440x824. This is measured private-runner header behavior, not an independent screenshot measurement of production header equality.
|
||||
|
||||
All cases also include 1100x700 client resize measurements. Eight generations are 1,2,3,3,8,9,10; other cases 1,2,3,7,8. Eight's repeated generation3 retains the same layout/camera; actual changed dimensions/variants advance generation. The checker correctly permits another capture of a settled unchanged layout, while rejecting stale generations on recorded transitions. It cannot infer an unrecorded intermediate resize from sparse capture receipts; runner tests and native observation cover that different claim.
|
||||
|
||||
Reviewed the Rust Fit operation order against the Python f32 calculation: 24px margins, both limiting axes, origin addition/subtraction, 0.0001..1.5 clamp and centering. Every actual camera matches the checker at f32 precision and all recorded routed bounds fit within the stated .01px containment tolerance. The small fixture legitimately remains at the1.5 clamp. Eight exceeds the predeclared provisional0.85 optical threshold, but magnification is not readability acceptance or glyph-containment proof.
|
||||
|
||||
## Falsifiers and limits
|
||||
|
||||
Twelve independent isolated mutations were rejected: wrong launch diagram in both consistent watcher receipts; wrong scene diagram in every snapshot; negative routed width in every snapshot; NaN camera; GPU-completion claim; stale Focus generation; viewport exceeding client; zero scale; wrong Fit camera; incomplete close capture count; Error diagnostic; missing schema3 migration report. Exact reasons are in raw results. No mutation of actual evidence occurred.
|
||||
|
||||
Two deliberate limitation probes were accepted: a fabricated non-null schema3 migration object and erased small-case warnings. The checker enforces migration presence, raw/admitted schema and selected Architecture identity, not migration report structure or regeneration. I additionally inspected the actual reports: all legacy reports state from_schema3/to_schema7; OA and SA full migration reports are identical, with one generated interface allocation,37 semantic defaults, no required resolutions/unresolved message values; small has one generated interface allocation,20 semantic defaults, likewise no resolutions/unresolved values. These are inventory facts, not independent migration correctness proof. Eight's complete admitted Project equals its raw schema7 input; legacy Project equality to raw schema3 is intentionally not asserted.
|
||||
|
||||
Eight warnings are compared to an independently pinned expected diagnostic file. Legacy warnings are actual inventories with Error exclusion and OA/SA equality only: OA/SA codes are empty_exchange_item, exchange_without_behavior_context, unspecified_exchange_mechanism, work_without_behavior_context; small has empty_exchange_item and unspecified_exchange_mechanism. Do not describe them as independently regenerated or an exact predeclared legacy warning oracle.
|
||||
|
||||
The repair addresses the original checker's case/diagram/source/generation/numeric attribution omissions. Whole-scene temporal equality still cannot reject a coordinated wrong initial scene and all its copies, and Fit intentionally trusts recorded routed bounds. Draw acknowledgement and neutral-input fields are application receipts, not proof of GPU completion or an independent input spy. Parent owns actual native screenshots/interaction evidence and ordinary opt-out Home verification; neither was inspected through GUI here. No fresh reader is available, no perception pass is claimed, no named DataAssociation end-label coverage is added, and there is no editable Focus acceptance, broader DPI/platform acceptance, release, promotion or issue closure.
|
||||
@@ -0,0 +1,226 @@
|
||||
# Private Focus optical comparison: implementation seams
|
||||
|
||||
Read-only proposal, 2026-10-02. Reviewed clean branch
|
||||
`codex/focus-workspace-experiment-01a0d717-20261001`, commit
|
||||
`e144e32e9984477a258759a9dcc75f6e499fc224`. No implementation, Cargo, GUI,
|
||||
Gitea or acceptance action performed. Parent owns #38 and implementation choice;
|
||||
#43 navigation ownership is untouched. Read local AGENTS and the supplied
|
||||
`C:/ar-diagram-01a0d717/.local/diagram-next-action-design.md`.
|
||||
|
||||
## Recommendation
|
||||
|
||||
Use a private, explicitly opted-in **separate Iced application runner inside
|
||||
the existing desktop binary**, with Baseline selected initially. It holds a
|
||||
frozen fixture and private comparison/camera state. Do not invoke production
|
||||
`App::update` or `App::subscription` in this runner. Reuse the exact production
|
||||
DiagramCanvas drawing implementation through a draw-only Program adapter;
|
||||
never invoke DiagramCanvas::update. Compare ordinary Baseline chrome against
|
||||
a compact header/footer and full two-axis Focus canvas. This is an optical
|
||||
test rig, not a usable editable Focus workspace or a #38 closure candidate.
|
||||
|
||||
An opt-in flag such as `--focus-optical PROJECT.json DIAGRAM_UUID OUTPUT_DIR`
|
||||
is a proposal, not an existing interface. No flag follows the untouched
|
||||
production boot path. A fresh process per fixture is sufficient: no file
|
||||
dialog, model chooser, navigation, Save or history integration is needed to
|
||||
answer the optical question. Focus/Exit focus, Fit and an explicit capture
|
||||
measurement action are the only initial interactive controls. An optional
|
||||
manual zoom trial must be separately scored after full-scene Fit reading.
|
||||
|
||||
## Why the apparent shortcuts are unsafe
|
||||
|
||||
1. `DiagramCanvas { editable: false, .. }` is not an inert renderer. Its
|
||||
`Program::update` starts at `diagram.rs:609`; it owns private modifier,
|
||||
pointer, pan, selection and gesture state. `State` at line 73 includes node,
|
||||
route, attachment, port and group previews. Painting consumes previews via
|
||||
`preview_diagram` at 473 and `scene` at 516. Its `mouse_interaction` at 1675
|
||||
advertises Grab even without edit permission. Mapping published messages
|
||||
to an ignored enum happens too late to prevent private previews.
|
||||
2. Reusing production messages through `App::update` risks its allocation,
|
||||
navigation/reveal, tool, draft and pending intent handling. A private
|
||||
optical measurement should not call `Message::Page`, `Diagram`, `Select`,
|
||||
`Fit` or `CanvasResized` on the production reducer. In particular #43's
|
||||
reveal ownership and unstamped ordinary resize should not be changed for
|
||||
this experiment.
|
||||
3. An independent hand-built Baseline made of blank 260/320-pixel panels can
|
||||
answer approximate viewport arithmetic but is a weaker visual comparator.
|
||||
It can miss wrapping toolbar height, footer, palette and real typography.
|
||||
Prefer a small presentation seam that reuses the actual Baseline layout.
|
||||
|
||||
## Smallest defensible source boundary
|
||||
|
||||
Preferred new private module: `crates/oa-desktop/src/focus_optical.rs` (or a
|
||||
directory for the test rig and its tests). Minimal wiring in `main.rs:47–70`
|
||||
selects the alternate runner before production `iced::application`. No new
|
||||
Cargo dependency, core change, schema, persisted preference or public command
|
||||
is necessary. Keep the experiment off normal launch and out of releases.
|
||||
|
||||
The rig can construct `App::with_project(project)` at `app.rs:605` as an
|
||||
**immutable presentation fixture** for existing chrome. Unlike `App::new`
|
||||
at 597, this avoids loading home/recovery history. It initializes Document
|
||||
without launching subscriptions or commands. Set the chosen saved non-scenario
|
||||
Architecture diagram/layer during admission and selection to project ID,
|
||||
with `diagram_selection=None`, no navigation focus, no active tool or inline
|
||||
editor. Do not initialize through navigation messages. Require the admitted
|
||||
complete Project to equal the input after Document creation. Do not assume
|
||||
construction or view rendering is a substitute for that check.
|
||||
|
||||
`views.rs:67` builds the actual outer Baseline; sidebar width 260 at 224–233,
|
||||
main body/Inspector at 235–262, footer at 278–300. `views.rs:442` is Architecture
|
||||
view; toolbar starts at 470, canvas program at 527, sensor at 574, and final
|
||||
toolbar+canvas column at 732. The focused seam should accept an optical canvas
|
||||
Element, or a tiny private canvas-mode parameter, while the normal public
|
||||
`view(app)` still selects the existing editable branch unchanged. This avoids
|
||||
duplicating the large view and avoids a boolean inside the general reducer.
|
||||
The chosen canvas must occupy the **same existing Baseline sensor/layout slot**.
|
||||
|
||||
The usual stack at 554 has the interactive focus wrapper, PortLabels,
|
||||
WorkFeedback and optional inline editor. For the optical branch install only
|
||||
the draw-only adapter. Use selection=None, selected=project.id,
|
||||
navigation_focus=None, selected_bend/attachment=None, allocation=None,
|
||||
connection=None, placing=false, editable=false. Fresh isolated State eliminates
|
||||
previews; those neutral fields eliminate existing assisted highlights/tool
|
||||
overlays. PortLabels at `diagram/port_labels.rs:5–90` is assisted hover/selection
|
||||
feedback, not part of unassisted drawing. Keep it absent for both variants;
|
||||
do not selectively add tooltip names to Focus. WorkFeedback has no role with
|
||||
no allocation capability.
|
||||
|
||||
Draw-only adapter outline (types adjusted to the existing aliases):
|
||||
|
||||
```rust
|
||||
struct OpticalCanvas<'a>(DiagramCanvas<'a>);
|
||||
impl canvas::Program<app::Message> for OpticalCanvas<'_> {
|
||||
type State = diagram::State;
|
||||
// Omit update: default returns no action and never touches State.
|
||||
fn draw(&self, state: &Self::State, renderer: &Renderer,
|
||||
theme: &Theme, bounds: Rectangle, _: mouse::Cursor)
|
||||
-> Vec<canvas::Geometry> {
|
||||
<DiagramCanvas<'_> as canvas::Program<app::Message>>::draw(
|
||||
&self.0, state, renderer, theme, bounds, mouse::Cursor::Unavailable)
|
||||
}
|
||||
// Default mouse interaction; do not delegate production Grab/Crosshair.
|
||||
}
|
||||
```
|
||||
|
||||
`diagram::State` is public and Default; no access to its private fields or
|
||||
renderer changes is required. The production draw delegates projection/routing
|
||||
through the existing scene cache. Use one fresh optically owned Tree/state,
|
||||
never a state transplanted from an interactive canvas. Context must identify
|
||||
fixture/diagram; camera-only Baseline/Focus changes need not alter geometry
|
||||
context. No label/route cache algorithm needs modification.
|
||||
|
||||
For the remaining Baseline chrome, a narrow **pre-dispatch inert wrapper**
|
||||
blocks mouse, keyboard, touch, IME and focus operations before reaching children;
|
||||
suppresses overlays and uses unavailable cursor for drawing/interaction.
|
||||
Forward only `Window::RedrawRequested` to permit actual Sensor measurement,
|
||||
collecting child messages in a temporary Shell and forwarding only the
|
||||
expected canvas measurement with a private generation stamp. Copy redraw
|
||||
and invalidation requests deliberately. No production message is dispatched
|
||||
to App. This is not the rejected message-dropping interactive canvas: the
|
||||
canvas cannot process inputs and chrome never receives input in the first place.
|
||||
|
||||
`guide/context_help.rs:95–280` is a Widget delegation example, **not a wrapper
|
||||
to reuse unchanged**: it delegates `operate` and sends synthetic release
|
||||
events on entry. Neither is wanted for an always-inert optical subtree.
|
||||
`iced_widget/src/sensor.rs:198–264` shows on_show/on_resize are emitted on
|
||||
RedrawRequested; forwarding pointer/key events is unnecessary. Layout/draw
|
||||
remain delegated normally. Test this wrapper rather than assuming no messages
|
||||
means no child-state changes.
|
||||
|
||||
Place the rig's visible Baseline/Focus/Fit controls over a reserved part of
|
||||
the existing header, or explicitly replace only that header's action group
|
||||
in optical mode. Avoid adding a new row that silently shrinks Baseline canvas.
|
||||
If overlay placement cannot remain readable at minimum size, use a documented
|
||||
same-height replacement header. It must preserve Baseline header height and
|
||||
record any residual deviation; a mock Baseline must never be labeled exact.
|
||||
Focus may use its own compact 40–48px header, one stable status/footer row and
|
||||
Fill canvas; remove sidebar/Inspector/task/diagram tool rows and palette there.
|
||||
Keep a plainly visible Exit focus and read-only experiment notice.
|
||||
|
||||
## Measurement and Fit, without production navigation
|
||||
|
||||
Private runner state: fixture identity, diagram ID, variant, layout generation,
|
||||
positive measured viewport, fit camera and optional measurement sequence.
|
||||
Map Baseline's allowed sensor message into `Measured(generation, size)`;
|
||||
Focus's own Sensor emits the same private type. Ignore stale generations,
|
||||
nonfinite/zero dimensions and identical repeated measurements. Increment
|
||||
generation on variant/fixture transition; wait for a matching measurement
|
||||
before declaring a screenshot/capture ready. Sensor `.key(generation)` can
|
||||
make an on_show repeat explicit; its documented key seam is at sensor.rs:85.
|
||||
|
||||
Replicate exactly the small pure Fit formula at `app.rs:5403–5451` in the
|
||||
private rig, preferably as one local pure function with direct formula tests:
|
||||
route the complete projected diagram; use its actual `geometry.bounds`, 48px
|
||||
total margin, `.max(1.)` usable dimensions and clamp 0.0001..1.5; center with
|
||||
the same left/top offset. Empty scenes use the existing 1.0, (30,30) rule.
|
||||
Do not use `window_size` fallback, old bounds or integer footer percentages
|
||||
as measured data. `App::canvas_size` is private and the ordinary handler at
|
||||
4443 is unnecessary here. Write only presentation `zoom/pan` into the chrome
|
||||
fixture; never its Document. For this first Fit-only rig no manual-camera
|
||||
preservation, pending reveal or editable-pane lifecycle contract is claimed.
|
||||
|
||||
Measurements should include input SHA256, source/build hash, full Project
|
||||
digest, diagram/layer/projection, exact projected/routed digest, actual bounds,
|
||||
viewport, zoom, pan, logical client size, observed physical size/DPI, renderer,
|
||||
variant/generation, palette/selection state and a screenshot identifier.
|
||||
Record a measurement only after settled size. Use a fresh output directory;
|
||||
never write to fixture/source paths. If no trustworthy DPI API is added,
|
||||
record an external Windows observation and mark it external, not inferred
|
||||
from window dimensions.
|
||||
|
||||
## Existing probes and fixture admission
|
||||
|
||||
`diagram.rs:1946::export_svg` is the unchanged production export path. Compare
|
||||
its exact output for the fixed fixture before/after variant switches; it
|
||||
must not depend on viewport. Complete Project, projections, nodes/ports,
|
||||
edge point sequences, label bounds/text/ownership and authored route metadata
|
||||
must also match. This does not establish Canvas text readability.
|
||||
|
||||
The separate diagram worktree has
|
||||
`crates/oa-core/examples/diagram_readability_probe.rs`, with admission against
|
||||
expected diagnostics, whole-scene geometry, route/label queries and fixtures.
|
||||
It is **not present in the reviewed Focus checkout**. Do not claim to reuse
|
||||
it through a nonexistent local command or import its E/F candidate machinery.
|
||||
Either use its pinned original output as historical context and emit fresh
|
||||
geometry directly with current `projection::project_diagram` and
|
||||
`routing::route_diagram`, or explicitly copy only a reviewed read-only report
|
||||
function into the experiment. Production `release_dense_views.rs:395–433`
|
||||
also illustrates complete-model conservation and diagnostic reporting, but
|
||||
its generator changes fixture view options and is not the native comparator.
|
||||
|
||||
Load an explicitly named JSON fixture read-only via persistence decode, require
|
||||
the exact predeclared file hash and expected warning set, reject missing/scenario
|
||||
diagram, and hold the frozen Project in memory. A new process/CLI selection
|
||||
for another fixture is enough. Preserve the full original eight-card/12-edge
|
||||
case, plus an unrelated nested OA/SA case with long labels/association ends
|
||||
and a small diagram. Do not use the manual-label-drag saved derivative as the
|
||||
original comparison. Historical bounds 1506×814 and assumed 1566×874 are
|
||||
different; report current measured routing rather than picking either.
|
||||
|
||||
## Bounded tests and evaluator
|
||||
|
||||
Before native comparison: unit-test pure Fit across width/height limiting,
|
||||
nonzero left/top, empty scene and clamped zoom; stale generation and repeated
|
||||
measurement handling; unknown messages cannot reach production App reducer.
|
||||
Exercise all mouse buttons/move/wheel, Delete/Insert, modifiers, text/IME,
|
||||
focus traversal and drop-like events against optical adapter/wrapper. Require
|
||||
no action, no child interactive update, no clipboard access and no model,
|
||||
source, selection or preview changes. A spy Widget can prove input never
|
||||
arrives while redraw sizing still works. Compare geometry/SVG/model after
|
||||
Baseline→Focus→Baseline and resize. Test opt-out production launch unchanged.
|
||||
|
||||
Native optical evaluator: same input/build/window/DPI, actual full scene at
|
||||
Fit; Baseline first by default but counterbalance order across fresh readers
|
||||
to avoid attributing learning to Focus. At least one reader not exposed to the
|
||||
semantic key identifies critical exchange endpoints/direction, unoriented
|
||||
conversation participants, allocation versus port allocation, and port owners.
|
||||
Record exact answers, uncertainty, wrong plausible alternatives, elapsed time
|
||||
and illegible names before hover/selection/zoom. No hints or chosen zoom for
|
||||
the unassisted pass. Record magnification gain as a measurement, not success.
|
||||
The provisional 0.85 Fit goal is only feasibility, never a readability threshold.
|
||||
|
||||
Reject Focus as a sufficient #38 remedy if bigger text leaves wrong or unresolved
|
||||
critical ownership. Preserve a possible workspace-space benefit separately.
|
||||
If optical gain succeeds, a later editable workspace needs its own retained
|
||||
draft/focus/tool/gesture/camera/navigation contract and coordinated #43 review;
|
||||
none is established by this inert rig. No production promotion from compilation,
|
||||
matching geometry, a screenshot or this proposal alone.
|
||||
@@ -0,0 +1,63 @@
|
||||
# Focus native-oracle review and authorized repair
|
||||
|
||||
2026-10-01 PDT; source 38789512626cb24f78f274998977fc8c6cf960d1, C:/ar-focus-01a0d717. I inspected the Python evaluator, launcher/build pins, admission and native-generated measurement/model/scene/SVG records. I did not operate GUI, run Cargo or modify Rust, fixtures or native evidence. I know the answer key and supply no fresh perception result.
|
||||
|
||||
This began as independent review of the parent's checker. After concrete adversarial failures, parent explicitly authorized me to repair only .local/verify-focus-native.py and preserve the original. I therefore authored the repaired checker; this report must not be represented as a fresh independent review of my own repair. Parent owns its final review and four-case execution.
|
||||
|
||||
## Material findings
|
||||
|
||||
The original checker correctly rejected a single changed capture Project and an incorrect Fit value. It nevertheless accepted wrong measurement.diagram, stale generation on a variant transition, zero scale, and a synthetic four-case corpus containing the eight-card scene under every case name. The latter used explicitly fabricated completion receipts solely in isolated temporary copies; it was never native evidence. The checker trusted completion booleans without binding the case/source/diagram/fixture or checking raw logs.
|
||||
|
||||
It also accepted a coordinated change to an edge's orientation in the root scene and every captured scene, leaving SVG unchanged. This demonstrates an **oracle scope limit**: byte equality over time does not independently regenerate projection/routing or validate correspondence between semantic records and SVG. The repaired output states that limit explicitly; it does not claim to solve it.
|
||||
|
||||
Legacy admission warnings were only inventoried, not compared to an independently declared baseline. Erasing the synthetic OA/SA warning arrays still passed their equality test. The repair retains the independently declared exact eight-case warning baseline and explicitly limits the legacy claim to inventory, error exclusion and OA/SA consistency. It does not invent expected legacy warnings from the output under evaluation.
|
||||
|
||||
## Repair and exercised evidence
|
||||
|
||||
Original checker preserved as .local/verify-focus-native-original.py, SHA-256 `505f9657f33eab102a638e9f58a60a607a6b88231705ab5c85ac9662ad35c500`.
|
||||
|
||||
Repaired checker SHA-256 `8b88f148e6a4137375d9784494a15c894c45bb8f3c2379ea2bc954e68c61421f` now:
|
||||
|
||||
- Recomputes executable/runtime and exact input hashes against fixed source/build/fixture identities; checks declared binary sizes.
|
||||
- Binds launcher arguments, case, diagram, layer, raw schema, admitted schema/migration and admission input path to the declared fixture. Checks actual start/final receipt agreement, raw log lengths, successful runner close and contiguous capture inventory.
|
||||
- Requires finite positive viewport/client/scale/header/zoom values, finite pan, plausible viewport/header extents, neutral selection/hover/palette, correct diagram/variant and typed nonnegative generations.
|
||||
- Requires nondecreasing generations and a strictly newer generation when variant, viewport, logical client or scale changes. Repeated captures of an unchanged variant may correctly keep their generation.
|
||||
- Retains exact whole-capture Project/scene/SVG byte comparison, the eight-case full input-Project equality and warning baseline, independent f32 Fit and recorded-bounds containment checks. The final report uses exclusive create, preserving any previous oracle result.
|
||||
|
||||
The first repaired smoke failed on the real canonical Windows admission path: pathlib.resolve retained the extended prefix while the ordinary working path did not have it. A read-only samefile check proved both referenced the same file. The path comparison now accepts resolve equality or filesystem object identity. This failure and reason are preserved in the temporary review packet; no fixture hash or expected diagnostic was relaxed.
|
||||
|
||||
I then ran verify_pins and verify_case('eight') read-only against the completed actual eight case, now seven captures. They passed. I did **not** execute main's complete four-case run or write the production independent-oracle.json; parent retains that step.
|
||||
|
||||
In relocated temporary copies, the revised checker accepted the untouched control and rejected fourteen targeted mutations: wrong diagram, backward generation, equal generation on a variant switch, zero scale, negative header, zero client width, hover assistance, wrong source, changed input bytes, stderr inconsistent with its receipt, a changed capture Project, wrong Fit, wrong admitted diagram and erased eight-case warning baseline. The coordinated root/all-capture scene mutation remains accepted, intentionally demonstrating the stated non-regeneration limit.
|
||||
|
||||
The actual recorded routed bounds are (54,18), 1506×814. At logical client 1440×900 and scale 1, the first Baseline is 824×535 at zoom 0.5152722597122192; Focus is 1440×824 at 0.9243028163909912; return Baseline matches exactly. Recorded Fit magnification is about 1.7938144. Captures 5–7 also record the 1100×700 client resize and return with newer generations. These are checked receipt/arithmetic facts, not screenshot or reading judgments. No conclusion about label/port ownership follows from the zoom increase.
|
||||
|
||||
## Arithmetic and conservation limits
|
||||
|
||||
The Python helper rounds each relevant arithmetic operation to f32, including left-plus-width/right-minus-left, the 48-unit margin, ratio/clamp and each pan intermediate. This matches the reviewed Rust operation order rather than a double-precision algebraic simplification. It independently recomputes camera values from **recorded** bounds and viewport, not from independently regenerated routes. Containment checks those bounds with a .01-unit margin tolerance; they do not measure glyph ink or detect an omitted object in the recorded bounds.
|
||||
|
||||
Whole Project/scene/SVG comparison is strong temporal conservation evidence. For schema7 the admitted Project also equals the pinned input structurally. Schema3 examples rely on the identified decoder/Document implementation and recorded migration; this script does not independently reproduce migration. Full source/binary provenance remains tied to the parent's build gates and fixed binary hashes, not a rebuilt binary performed by this reviewer.
|
||||
|
||||
All draw, neutrality and measurement fields are receipts from the application. Their consistency is checkable; actual CPU draw invocation is supported by source/tests, and displayed output still needs the parent's native screenshot association. This checker cannot establish renderer/glyph parity, screenshot freshness, ordinary versus optical header pixel equivalence, absence of visual clipping outside routed bounds, unassisted reading, end-label coverage or general OA/SA usability.
|
||||
|
||||
## Reproduction and retained artifacts
|
||||
|
||||
All adversarial material is under `.local/focus-oracle-review-vwkxuhp0/`, outside native evidence:
|
||||
|
||||
| Artifact | Purpose / SHA-256 |
|
||||
| --- | --- |
|
||||
| checker-original.py | Exact original checker copy; same 505f9657… hash above |
|
||||
| snapshot/ | Original first four eight-case capture records plus admission/input/root outputs |
|
||||
| results.json | Original eight adversarial outcomes and snapshot hashes; `9263f4d81dbbee6c81ef32fb1c2a763f1ca5bfeba7f8841f5098fde49128cda6` |
|
||||
| revised-first-failure.txt | Extended Windows path smoke failure and evidence-based correction |
|
||||
| retest.py | Revised checker test driver; `6ff5a5d70d625ff4ce42e13ced75215b6736c47b75beec38dd965b448a9df3b7` |
|
||||
| revised-results.json | Actual seven-capture eight-case result plus eleven copied-corpus outcomes; `eb5f34ca524a78a69d6adba73f85ea9b04a4b852a2c127178dfb3dad19475567` |
|
||||
| revised-extra-results.json | Five additional copied-corpus rejections; `2131bd680b90cface77e4006632f9466d9aa43afb06acac9283fd76dd067fa28` |
|
||||
|
||||
The initial original-checker test only relocated ROOT in memory; all four test cases were deliberately cloned from the first four eight-case captures, with synthetic completion receipts because the actual process was still active. The revised driver used the subsequently completed real eight run, copied into fresh private roots, relocating only recorded host paths. It imports checker functions without invoking main, so it does not create or replace the parent's final oracle output. The retained copied directories show exact mutations. Retest requires a fresh directory for its script because evidence directories/results are intentionally create-new.
|
||||
|
||||
Python used: `C:/Users/User/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe`. Main reproduction, owned by parent: invoke that Python on `.local/verify-focus-native.py` after all four real watcher/runner closes exist. Do not substitute the synthetic review directories for the native corpus.
|
||||
|
||||
Additional references inspected: launcher SHA-256 `eed344ed12e8f9f42733815559a8694dacc1862061cd95b17c6d017aee28de0d`; expected eight diagnostics SHA-256 `634908836604d501ddec9c0ce0f80b5be6e5cc0d2cbe4d850d3703679898383f`; plan SHA-256 `3564c669b7f33bd6dbee70c78a02442ca168437641c65dba44074ad038d9376f`.
|
||||
|
||||
Recommendation: parent should review the narrow checker repair and run the actual complete corpus. A pass establishes its explicitly bounded mechanical claims. Fresh-reader unavailability remains unresolved; no unassisted ownership or product acceptance follows.
|
||||
+102
@@ -0,0 +1,102 @@
|
||||
# Independent review of the Focus optical proposal
|
||||
|
||||
Review date: 2026-10-01 PDT. This is a design/source review, not implementation or optical acceptance. I know the mixed-diagram answer key and cannot provide a fresh-reader pass. I read the proposal, the earlier next-action note, the newly committed experiment plan and the actual Iced/application seams. I did not run Cargo, native UI, Gitea, or any experiment. Only this report was written.
|
||||
|
||||
The checkout moved from e144e32e9984477a258759a9dcc75f6e499fc224 to bc69c6d449641fc4395feae0d8373f62257c763c during the review. The latter was clean when inspected. A direct diff confirmed no changes to the reviewed main.rs, app.rs, views.rs or diagram.rs between those commits. The later commit also contains the frozen experiment plan and eight-card input, in addition to delivery documentation. Parent owns implementation and #38; this review does not revise #43 ownership.
|
||||
|
||||
## Recommendation
|
||||
|
||||
Proceed with a small, isolated read-only comparison, subject to the measurement and admission corrections below. Prefer the parent's revised header-only controls seam plus inert existing body to controls overlaid on real Save actions. Reusing production DiagramCanvas::draw through an adapter that never calls its update is the right boundary. A private runner must not call App::update or its subscriptions; the experiment needs no new production message, routing behavior, document operation or preference.
|
||||
|
||||
This is proportionate only while it remains a few local presentation seams and an optical harness. Do not build editable Focus, generalized inert/hidden-pane infrastructure, persistence, tool restoration or navigation integration to answer this question. Focus may demonstrate a useful larger reading surface without solving ownership ambiguity. It cannot erase the existing foreign-stroke/label intersection, disentangle shared strokes, or retroactively accept A/B/E/F.
|
||||
|
||||
## Material findings and required changes
|
||||
|
||||
### 1. A measured viewport does not establish that the corresponding fitted frame was drawn
|
||||
|
||||
The proposal's matching generation/positive size condition is necessary but insufficient for capture readiness. Sensor publishes on_show/on_resize while handling RedrawRequested (vendor sensor.rs:198-264). That event reports layout size; it is not an acknowledgment that a newly computed camera has already been drawn or presented. A control click can otherwise save a correct new camera record beside an older screenshot. A resize can cause this within a single variant, without changing the variant generation.
|
||||
|
||||
Define readiness around an exact tuple: fixture/diagram, variant, layout generation, accepted viewport measurement sequence, zoom and pan. Every new size and every transition invalidates readiness, even if the variant name is unchanged. Stamp the sensor callback when constructing that view; do not attach the current generation only after receiving an old unstamped message. A stamp added at receipt can turn an old event into an apparently current one. Sensor.key can request a fresh on_show on a transition; it is not a draw barrier.
|
||||
|
||||
A small adapter-owned last-drawn record, written after delegating the actual production draw with its actual bounds, is a defensible local mechanism. Capture must compare it to the current intended tuple and refuse pending/mismatched states. Do not add this bookkeeping to production DiagramCanvas. A matching draw record still does not prove OS presentation or screenshot freshness: the native observer must wait for the settled visible state, associate the screenshot with that measurement, and retain its ID/hash. Alternatively use an equally explicit externally verified settled-frame protocol; do not label a sensor event itself as rendered. Test capture attempted immediately after switch and during resize, plus Baseline→Focus→Baseline with an old callback queued.
|
||||
|
||||
There is no need to reroute per pointer event or continually hash the Project in draw. The model is fixed. Admission/capture/exit conservation checks and a cached fixed geometry bound are enough, with the exact draw using its ordinary cache. Measure once per genuinely changed viewport, reject zero/nonfinite sizes, and avoid a refit/redraw feedback loop.
|
||||
|
||||
### 2. Admission must require Architecture and coherent presentation state
|
||||
|
||||
Reject every projection for which projection.is_architecture() is false, not just Scenario. The existing classifier in oa-core model.rs:1458 expressly excludes both StateMachine and Scenario. App::with_project chooses a default diagram and calls route_state_diagram_workspace; that helper can move the application to Page::Behavior. A later assignment to active_diagram alone cannot establish the claimed Architecture Baseline.
|
||||
|
||||
The constructor also builds explorer_index and create_kind for its initially chosen layer. In a mixed OA/SA Project, simply overriding layer to SA leaves an OA explorer index; explorer_view consumes the stored index while naming groups with app.layer. This is a concrete likely mismatch for the proposed routing-workshop SA case. Explicitly prepare and assert the fixture's Page::Diagram, layer, selected project ID/project draft, active diagram, correct explorer index and neutral tool/navigation/pending state. The constructor's hardcoded Coastal rescue status is also misleading for unrelated fixtures: use a common neutral experiment status in both variants and disclose this text deviation. Do not implement admission by sending normal navigation messages to the production reducer.
|
||||
|
||||
Keep complete Project equality after Document construction. Exact input bytes and full structured Project are different invariants, both needed. Rendering through Document's view_index and independent projection/routing should agree; retain a full comparison rather than counts alone. Validate the fixed fixture hash and exact expected diagnostics before launch. The output path should be create-new and must not alias the fixture. Retain pre/post input bytes or hashes at normal exit. These requirements do not need a new general admission API.
|
||||
|
||||
### 3. Prefer a header-only seam; name the Baseline deviation precisely
|
||||
|
||||
The existing header (views.rs:69-103) has ordinary New/Open/Save controls; the body includes task navigation, docks, multirow diagram controls, palette and footer. Replacing just the header action group is simpler to understand and verify than placing live rig controls over inert but still visible Save buttons. Let only those replacement controls be interactive; block input before dispatch into the remaining existing chrome. Keep its normal active-looking styling for the optical comparison, with a visible read-only notice. Disabling every child button through on_press removal would change colors and would be a weaker visual comparator.
|
||||
|
||||
A same-height claim must be measured at the tested client size/DPI. The header height is derived from its children and padding, not an explicit constant. Replacement labels can wrap or change the maximum child height. Compare the original and replacement header/canvas rectangles once in native QA; preserve the exact body/task/footer rows and palette state. Name the result "Baseline layout with experiment header actions" unless pixel equivalence has actually been established. Do not label the entire application chrome exact.
|
||||
|
||||
A body-level pre-dispatch wrapper can delegate layout/draw while excluding input, focus operations and overlays. It need only admit RedrawRequested for the embedded sensor, with Cursor::Unavailable. The outer allocation_input wrapper normally forwards operations and mutates pointer state on redraw; the optical seam should either avoid mounting that interactive root or make clear exactly where the inert barrier sits. No production reducer may be reachable even if an unexpected child message occurs. Unknown messages should be observable as a harness fault/rejected event, rather than silently treated as successful input isolation.
|
||||
|
||||
App::view also adds context menus, hosted/reference/usage overlays and focus/escape wrappers around views::view. The neutral fixture should assert these states absent. Calling views::view directly is therefore a deliberately scoped passive comparison, not a claim of identical production event architecture. Do not widen this experiment to test all those production modal behaviors.
|
||||
|
||||
### 4. Keep the optical conclusion narrower than the intervention
|
||||
|
||||
The Focus variant removes both chrome and palette while increasing the canvas. It jointly changes scale, distraction and available semantic hints. Even correct fresh reading would not isolate magnification as the cause. It also measures an upper bound for a stripped read-only workspace; a later editable Focus retaining palette/status/access controls can have a smaller canvas. Report actual removed elements and achieved dimensions. Do not promise that an editable Focus gets the same gain.
|
||||
|
||||
My earlier next-action note calls 1442×932 a client size in an arithmetic upper bound. That was not established by a client measurement and should remain only a hypothetical rectangle. Production main.rs requests 1440×900 logical content; a 1442×932 native capture could include window decorations. Do not derive DPI or client size from that outer rectangle. Record sensor viewport, logical content size and observed physical/window rectangle separately, with how each was measured. Match style::theme, renderer backend, font environment, application scale and build/runtime between variants. Using the same draw function alone does not pin these.
|
||||
|
||||
The old 1506×814 geometry and supplied 1566×874 rectangle must not be interchanged. Recompute the current fixture's full projected/routed bounds, including its labels/end geometry, and independently verify Fit with the actual viewport. The production arithmetic uses f32 left/right subtraction, max(1), 48 total margin, clamp 0.0001..1.5 and the nonzero-origin centering formula. A local copy should mirror that operation order, not only its algebraic intent. Empty-scene behavior is keyed to projected nodes being empty. No window-size fallback is appropriate for a measured experiment.
|
||||
|
||||
## Proportional alternatives and smallest source boundary
|
||||
|
||||
| Alternative | What it can establish | Why choose or reject now |
|
||||
| --- | --- | --- |
|
||||
| Existing viewport/geometry arithmetic only | Whether height limits width-only recovery; required canvas dimensions for a chosen scale | Already sufficient for rejecting width-only as the strong test. Cannot determine native legibility/ownership; no further arithmetic study is needed. |
|
||||
| Existing production zoom/pan | Whether a particular name/port becomes readable when enlarged | Cheap local diagnostic but loses complete-scene containment. Useful only as separately labeled assisted evidence, not the chosen whole-scene question. |
|
||||
| Exported SVG or enlarged old screenshot | Approximate geometry/text positions or scaled old raster | Does not use the same native glyph/raster/compositing path; inappropriate primary comparator. Do not repeat E/F's record-equality-to-perception inference. |
|
||||
| A minimal full-canvas native runner plus separately captured production Baseline | Same native drawing at larger scale with a real external Baseline | A defensible cheaper fallback if reproducing inert real chrome grows large. Requires carefully matched client/DPI/source/input/neutral state and separate baseline viewport measurement. Less convenient switching is acceptable. |
|
||||
| Proposed runner with reused Baseline body and replacement header actions | Direct native same-process viewport/reading comparison with controlled fixed model | Preferred while the seam remains small. Actual body preserves wrapping/toolbar/palette constraints and makes repeat measurements simpler. Do not require a reusable UI framework for it. |
|
||||
| Editable Focus now | Full workspace usability and retention behavior | Premature. Much greater draft/caret/IME, gesture, navigation and camera risk, overlapping #43 dependencies. Optical evidence should precede it. |
|
||||
|
||||
The smallest reasonable implementation consists of the private runner module (including its adapter, input barrier, measurements and local tests), minimal opt-in dispatch in main.rs and private view construction seams for the canvas and header actions. A small fixture-construction helper may be needed at the App boundary only if existing field visibility makes the coherent admission state otherwise inaccessible. Do not export private fields indiscriminately or put Focus decisions into the production reducer. Reuse the unchanged DiagramCanvas::draw and production SVG function; no diagram/core changes are justified by this question. Keep flag-free construction unchanged. The branch is an experiment, not a package candidate.
|
||||
|
||||
Prefer a private RigMessage type. The optical canvas adapter can call the production Program<app::Message>::draw and return its geometries while itself implementing Program<RigMessage>; drawing does not need to emit App messages. Existing body widgets may remain typed with App messages behind a narrow translation barrier which accepts only the known sensor receipt and rejects everything else. Avoid adding a new App::Message variant merely to carry optical controls. This is a source boundary recommendation, not an assertion that an unimplemented signature has compiled.
|
||||
|
||||
No general clipboard, history or recovery machinery is needed. A focused spy-widget test of the real wrapper should establish that mouse/buttons/wheel, keyboard/modifiers, touch/IME and focus operations do not reach children while redraw still produces measurement. The default no-update adapter and immutable fixture substantially reduce the state space; do not recreate the full desktop regression suite inside this disposable harness. Normal launch still deserves its ordinary smoke check.
|
||||
|
||||
## Bounded evaluator and decision gates
|
||||
|
||||
Before native reading, freeze binary/source/input identities, selected diagram IDs, exact diagnostics, question set, answer key and rejection rubric. Admission receipts must record actual projected counts and kinds; authored node counts are not projected nested contents. The four planned cases use three fixed Projects. They contain no named DataAssociation ends. This missing native coverage does not block running or archiving the bounded optical experiment. It blocks claims that association-end readability or general OA/SA layout has been exercised. Do not create another special fixture just to enlarge the initial claim. Add that coverage if a later product decision needs it.
|
||||
|
||||
Run one native QA sequence per saved diagram: Baseline Fit → Focus Fit → Baseline Fit, then a bounded resize/return. Capture only settled matching frames. Check exact model/input conservation, full projections/routes/labels/ownership/authored metadata and exact SVG equality. Check source/output hashes and visible full-scene containment, rather than assuming Fit bounds include every painted pixel. Matching logical output is not glyph/raster parity. Read-only input attempts and expected normal exit logs complete the harness check; neither proves editable-workspace safety.
|
||||
|
||||
The updated plan's Focus-first fresh reader plus separately scoped historical Baseline results is honest and cheaper than pretending one reader can be fresh twice. It permits a case-level fresh Focus result, not a causal Baseline-to-Focus improvement estimate. Do not show that reader the old images, target label, known wrong association or answer key first. Ask neutral identification questions for the declared complete mixed diagram, including unoriented conversation participants, without implying an arrow direction exists. Preserve verbatim wrong/uncertain answers, competing ownership and illegible names; a guess eventually corrected after discussion is not an unassisted pass. One model reader is not a population of system engineers.
|
||||
|
||||
Stop or reject the experiment's validity if input/geometry changes, admission shows the wrong layer/page, the camera receipt does not match the captured frame, content is clipped, hidden interaction occurs, or runtime/font/DPI differs without accounting. Correct the specific harness defect before interpreting reading; do not average it away.
|
||||
|
||||
Reject Focus as a sufficient #38 remedy on any declared critical wrong association or unresolved competing ownership even if names become larger and Fit exceeds 0.85. Preserve a possible ergonomic space benefit separately. A correct Focus reading with conserved geometry justifies considering the next bounded workspace step; it does not accept editable Focus, establish generic usability, or close #38. If ownership remains ambiguous at useful scale, the next materially different question is semantic distinction/shared-route ownership, not more chrome polishing or fixed label offsets.
|
||||
|
||||
## Reviewed identities and limits
|
||||
|
||||
SHA-256 values below were computed from the actual bytes read. Paths are relative to C:/ar-focus-01a0d717 except the earlier note.
|
||||
|
||||
| Input/source | SHA-256 |
|
||||
| --- | --- |
|
||||
| .local/focus-optical-seams.md | 4616c63feb707c973d59483b70c62c26b7a5226e475e9cf29f25298431fe8a92 |
|
||||
| C:/ar-diagram-01a0d717/.local/diagram-next-action-design.md | fb251fe1de186b559559f1874763b1d7027bee9b2dcd13cc4dc653a432571d82 |
|
||||
| harness/experiments/focus-optical-20261001/plan.md | ee463a9f46229bda75596faeddc4c14cf2164da99927a47c90addde6e73f8328 |
|
||||
| harness/experiments/focus-optical-20261001/eight-card.json (hash only) | 9db1015369f450d5810c96a01fddb8a009d57f6aafbda5182703f15ded23d9c8 |
|
||||
| crates/oa-desktop/src/main.rs | df6c70df05dbfd769cddfa42e45b70a6080e1172a721b3656b4b7efdfa3cb203 |
|
||||
| crates/oa-desktop/src/app.rs | 4e470c5ba93d85f122b62b48cf27a6faa4c005abcab0d7180e6db598506e1c83 |
|
||||
| crates/oa-desktop/src/views.rs | 774f68523df85850d95af11f1792057a9eee5234ca98a46c3a6eb5ae7bf50bf0 |
|
||||
| crates/oa-desktop/src/diagram.rs | 3170397b82236d6db2a57a1bb860c3c44fd8ec16172701e6784d4bf1314d140f |
|
||||
| crates/vendor/iced_widget/src/sensor.rs | cb95d1220fa5663b7a148d6b159081da2200debe6fea982a04f48e27dd072973 |
|
||||
| crates/oa-desktop/src/style.rs | 28b9527137d03850b617e3c248828e8111743e3b2d0ca8def31d8f381889ddd2 |
|
||||
| crates/oa-desktop/src/app/state_diagram.rs | 0e55b99a4e2e3558f55df7c013ee14f138d99779a8afa82503dffa026f783110 |
|
||||
| crates/oa-desktop/src/explorer_view.rs | a720d7484bcc3a24729332a00e005d1cc6f5f945a9cc3965134e0024dffb581f |
|
||||
| crates/oa-desktop/src/allocation_input.rs | 7ceb868b158e4384b217b2b2b118c3714fc6d851fa2c89c2a61236cae125ffda |
|
||||
| crates/oa-desktop/src/diagram/port_labels.rs | f66b5ecd2dc64174324b34b4b5ebeb9c303ead25ebbb43304cecff0336cf3d15 |
|
||||
| crates/oa-core/src/model.rs | 05a6bd5eef14c77e7cafd2bc72eb3bb6b19f33c6d06184b4e7d21173a2684078 |
|
||||
|
||||
This review reads selected relevant implementation paths, not every desktop subsystem. It establishes no implementation/test/native result and no exact future Fit gain. Primary Capella research is unnecessary to decide this bounded viewport experiment; any later semantic stroke/port notation decision needs its own semantic review. Prior publication and negative experiment packets remain unchanged.
|
||||
@@ -0,0 +1,106 @@
|
||||
# Independent review of the Focus optical proposal
|
||||
|
||||
Review date: 2026-10-01 PDT. This is a design/source review, not implementation or optical acceptance. I know the mixed-diagram answer key and cannot provide a fresh-reader pass. I read the proposal, the earlier next-action note, the newly committed experiment plan and the actual Iced/application seams. I did not run Cargo, native UI, Gitea, or any experiment. Only this report was written.
|
||||
|
||||
The checkout was observed at e144e32e9984477a258759a9dcc75f6e499fc224 and later at bc69c6d449641fc4395feae0d8373f62257c763c, clean at that inspection. A direct diff confirmed no changes to the reviewed main.rs, app.rs, views.rs or diagram.rs between those commits. The plan and eight-card input were read later during the same review; the report originally misattributed their commit to bc69. A subsequent commit inspection confirms that bc69 contains only #46 publication/handoff documentation, while e7a0b8f1 adds the frozen optical plan and eight-card input. Parent owns implementation and #38; this review does not revise #43 ownership.
|
||||
|
||||
## Recommendation
|
||||
|
||||
Proceed with a small, isolated read-only comparison, subject to the measurement and admission corrections below. Prefer the parent's revised header-only controls seam plus inert existing body to controls overlaid on real Save actions. Reusing production DiagramCanvas::draw through an adapter that never calls its update is the right boundary. A private runner must not call App::update or its subscriptions; the experiment needs no new production message, routing behavior, document operation or preference.
|
||||
|
||||
This is proportionate only while it remains a few local presentation seams and an optical harness. Do not build editable Focus, generalized inert/hidden-pane infrastructure, persistence, tool restoration or navigation integration to answer this question. Focus may demonstrate a useful larger reading surface without solving ownership ambiguity. It cannot erase the existing foreign-stroke/label intersection, disentangle shared strokes, or retroactively accept A/B/E/F.
|
||||
|
||||
## Material findings and required changes
|
||||
|
||||
### 1. A measured viewport does not establish that the corresponding fitted frame was drawn
|
||||
|
||||
The proposal's matching generation/positive size condition is necessary but insufficient for capture readiness. Sensor publishes on_show/on_resize while handling RedrawRequested (vendor sensor.rs:198-264). That event reports layout size; it is not an acknowledgment that a newly computed camera has already been drawn or presented. A control click can otherwise save a correct new camera record beside an older screenshot. A resize can cause this within a single variant, without changing the variant generation.
|
||||
|
||||
Define readiness around an exact tuple: fixture/diagram, variant, layout generation, accepted viewport measurement sequence, zoom and pan. Every new size and every transition invalidates readiness, even if the variant name is unchanged. Stamp the sensor callback when constructing that view; do not attach the current generation only after receiving an old unstamped message. A stamp added at receipt can turn an old event into an apparently current one. Sensor.key can request a fresh on_show on a transition; it is not a draw barrier.
|
||||
|
||||
A small adapter-owned last-drawn record, written after delegating the actual production draw with its actual bounds, is a defensible local mechanism. Capture must compare it to the current intended tuple and refuse pending/mismatched states. Do not add this bookkeeping to production DiagramCanvas. A matching draw record still does not prove OS presentation or screenshot freshness: the native observer must wait for the settled visible state, associate the screenshot with that measurement, and retain its ID/hash. Alternatively use an equally explicit externally verified settled-frame protocol; do not label a sensor event itself as rendered. Test capture attempted immediately after switch and during resize, plus Baseline→Focus→Baseline with an old callback queued.
|
||||
|
||||
There is no need to reroute per pointer event or continually hash the Project in draw. The model is fixed. Admission/capture/exit conservation checks and a cached fixed geometry bound are enough, with the exact draw using its ordinary cache. Measure once per genuinely changed viewport, reject zero/nonfinite sizes, and avoid a refit/redraw feedback loop.
|
||||
|
||||
### 2. Admission must require Architecture and coherent presentation state
|
||||
|
||||
Reject every projection for which projection.is_architecture() is false, not just Scenario. The existing classifier in oa-core model.rs:1458 expressly excludes both StateMachine and Scenario. App::with_project chooses a default diagram and calls route_state_diagram_workspace; that helper can move the application to Page::Behavior. A later assignment to active_diagram alone cannot establish the claimed Architecture Baseline.
|
||||
|
||||
The constructor also builds explorer_index and create_kind for its initially chosen layer. In a mixed OA/SA Project, simply overriding layer to SA leaves an OA explorer index; explorer_view consumes the stored index while naming groups with app.layer. This is a concrete likely mismatch for the proposed routing-workshop SA case. Explicitly prepare and assert the fixture's Page::Diagram, layer, selected project ID/project draft, active diagram, correct explorer index and neutral tool/navigation/pending state. The constructor's hardcoded Coastal rescue status is also misleading for unrelated fixtures: use a common neutral experiment status in both variants and disclose this text deviation. Do not implement admission by sending normal navigation messages to the production reducer.
|
||||
|
||||
Keep complete Project equality after Document construction. Exact input bytes and full structured Project are different invariants, both needed. Rendering through Document's view_index and independent projection/routing should agree; retain a full comparison rather than counts alone. Validate the fixed fixture hash and exact expected diagnostics before launch. The output path should be create-new and must not alias the fixture. Retain pre/post input bytes or hashes at normal exit. These requirements do not need a new general admission API.
|
||||
|
||||
### 3. Prefer a header-only seam; name the Baseline deviation precisely
|
||||
|
||||
The existing header (views.rs:69-103) has ordinary New/Open/Save controls; the body includes task navigation, docks, multirow diagram controls, palette and footer. Replacing just the header action group is simpler to understand and verify than placing live rig controls over inert but still visible Save buttons. Let only those replacement controls be interactive; block input before dispatch into the remaining existing chrome. Keep its normal active-looking styling for the optical comparison, with a visible read-only notice. Disabling every child button through on_press removal would change colors and would be a weaker visual comparator.
|
||||
|
||||
A same-height claim must be measured at the tested client size/DPI. The header height is derived from its children and padding, not an explicit constant. Replacement labels can wrap or change the maximum child height. Compare the original and replacement header/canvas rectangles once in native QA; preserve the exact body/task/footer rows and palette state. Name the result "Baseline layout with experiment header actions" unless pixel equivalence has actually been established. Do not label the entire application chrome exact.
|
||||
|
||||
A body-level pre-dispatch wrapper can delegate layout/draw while excluding input, focus operations and overlays. It need only admit RedrawRequested for the embedded sensor, with Cursor::Unavailable. The outer allocation_input wrapper normally forwards operations and mutates pointer state on redraw; the optical seam should either avoid mounting that interactive root or make clear exactly where the inert barrier sits. No production reducer may be reachable even if an unexpected child message occurs. Unknown messages should be observable as a harness fault/rejected event, rather than silently treated as successful input isolation.
|
||||
|
||||
App::view also adds context menus, hosted/reference/usage overlays and focus/escape wrappers around views::view. The neutral fixture should assert these states absent. Calling views::view directly is therefore a deliberately scoped passive comparison, not a claim of identical production event architecture. Do not widen this experiment to test all those production modal behaviors.
|
||||
|
||||
### 4. Keep the optical conclusion narrower than the intervention
|
||||
|
||||
The Focus variant removes both chrome and palette while increasing the canvas. It jointly changes scale, distraction and available semantic hints. Even correct fresh reading would not isolate magnification as the cause. It also measures an upper bound for a stripped read-only workspace; a later editable Focus retaining palette/status/access controls can have a smaller canvas. Report actual removed elements and achieved dimensions. Do not promise that an editable Focus gets the same gain.
|
||||
|
||||
My earlier next-action note calls 1442×932 a client size in an arithmetic upper bound. That was not established by a client measurement and should remain only a hypothetical rectangle. Production main.rs requests 1440×900 logical content; a 1442×932 native capture could include window decorations. Do not derive DPI or client size from that outer rectangle. Record sensor viewport, logical content size and observed physical/window rectangle separately, with how each was measured. Match style::theme, renderer backend, font environment, application scale and build/runtime between variants. Using the same draw function alone does not pin these.
|
||||
|
||||
The old 1506×814 geometry and supplied 1566×874 rectangle must not be interchanged. Recompute the current fixture's full projected/routed bounds, including its labels/end geometry, and independently verify Fit with the actual viewport. The production arithmetic uses f32 left/right subtraction, max(1), 48 total margin, clamp 0.0001..1.5 and the nonzero-origin centering formula. A local copy should mirror that operation order, not only its algebraic intent. Empty-scene behavior is keyed to projected nodes being empty. No window-size fallback is appropriate for a measured experiment.
|
||||
|
||||
## Proportional alternatives and smallest source boundary
|
||||
|
||||
| Alternative | What it can establish | Why choose or reject now |
|
||||
| --- | --- | --- |
|
||||
| Existing viewport/geometry arithmetic only | Whether height limits width-only recovery; required canvas dimensions for a chosen scale | Already sufficient for rejecting width-only as the strong test. Cannot determine native legibility/ownership; no further arithmetic study is needed. |
|
||||
| Existing production zoom/pan | Whether a particular name/port becomes readable when enlarged | Cheap local diagnostic but loses complete-scene containment. Useful only as separately labeled assisted evidence, not the chosen whole-scene question. |
|
||||
| Exported SVG or enlarged old screenshot | Approximate geometry/text positions or scaled old raster | Does not use the same native glyph/raster/compositing path; inappropriate primary comparator. Do not repeat E/F's record-equality-to-perception inference. |
|
||||
| A minimal full-canvas native runner plus separately captured production Baseline | Same native drawing at larger scale with a real external Baseline | A defensible cheaper fallback if reproducing inert real chrome grows large. Requires carefully matched client/DPI/source/input/neutral state and separate baseline viewport measurement. Less convenient switching is acceptable. |
|
||||
| Proposed runner with reused Baseline body and replacement header actions | Direct native same-process viewport/reading comparison with controlled fixed model | Preferred while the seam remains small. Actual body preserves wrapping/toolbar/palette constraints and makes repeat measurements simpler. Do not require a reusable UI framework for it. |
|
||||
| Editable Focus now | Full workspace usability and retention behavior | Premature. Much greater draft/caret/IME, gesture, navigation and camera risk, overlapping #43 dependencies. Optical evidence should precede it. |
|
||||
|
||||
The smallest reasonable implementation consists of the private runner module (including its adapter, input barrier, measurements and local tests), minimal opt-in dispatch in main.rs and private view construction seams for the canvas and header actions. A small fixture-construction helper may be needed at the App boundary only if existing field visibility makes the coherent admission state otherwise inaccessible. Do not export private fields indiscriminately or put Focus decisions into the production reducer. Reuse the unchanged DiagramCanvas::draw and production SVG function; no diagram/core changes are justified by this question. Keep flag-free construction unchanged. The branch is an experiment, not a package candidate.
|
||||
|
||||
Prefer a private RigMessage type. The optical canvas adapter can call the production Program<app::Message>::draw and return its geometries while itself implementing Program<RigMessage>; drawing does not need to emit App messages. Existing body widgets may remain typed with App messages behind a narrow translation barrier which accepts only the known sensor receipt and rejects everything else. Avoid adding a new App::Message variant merely to carry optical controls. This is a source boundary recommendation, not an assertion that an unimplemented signature has compiled.
|
||||
|
||||
No general clipboard, history or recovery machinery is needed. A focused spy-widget test of the real wrapper should establish that mouse/buttons/wheel, keyboard/modifiers, touch/IME and focus operations do not reach children while redraw still produces measurement. The default no-update adapter and immutable fixture substantially reduce the state space; do not recreate the full desktop regression suite inside this disposable harness. Normal launch still deserves its ordinary smoke check.
|
||||
|
||||
## Bounded evaluator and decision gates
|
||||
|
||||
Before native reading, freeze binary/source/input identities, selected diagram IDs, exact diagnostics, question set, answer key and rejection rubric. Admission receipts must record actual projected counts and kinds; authored node counts are not projected nested contents. The four planned cases use three fixed Projects. They contain no named DataAssociation ends. This missing native coverage does not block running or archiving the bounded optical experiment. It blocks claims that association-end readability or general OA/SA layout has been exercised. Do not create another special fixture just to enlarge the initial claim. Add that coverage if a later product decision needs it.
|
||||
|
||||
Run one native QA sequence per saved diagram: Baseline Fit → Focus Fit → Baseline Fit, then a bounded resize/return. Capture only settled matching frames. Check exact model/input conservation, full projections/routes/labels/ownership/authored metadata and exact SVG equality. Check source/output hashes and visible full-scene containment, rather than assuming Fit bounds include every painted pixel. Matching logical output is not glyph/raster parity. Read-only input attempts and expected normal exit logs complete the harness check; neither proves editable-workspace safety.
|
||||
|
||||
The updated plan's Focus-first fresh reader plus separately scoped historical Baseline results is honest and cheaper than pretending one reader can be fresh twice. It permits a case-level fresh Focus result, not a causal Baseline-to-Focus improvement estimate. Do not show that reader the old images, target label, known wrong association or answer key first. Ask neutral identification questions for the declared complete mixed diagram, including unoriented conversation participants, without implying an arrow direction exists. Preserve verbatim wrong/uncertain answers, competing ownership and illegible names; a guess eventually corrected after discussion is not an unassisted pass. One model reader is not a population of system engineers.
|
||||
|
||||
Stop or reject the experiment's validity if input/geometry changes, admission shows the wrong layer/page, the camera receipt does not match the captured frame, content is clipped, hidden interaction occurs, or runtime/font/DPI differs without accounting. Correct the specific harness defect before interpreting reading; do not average it away.
|
||||
|
||||
Reject Focus as a sufficient #38 remedy on any declared critical wrong association or unresolved competing ownership even if names become larger and Fit exceeds 0.85. Preserve a possible ergonomic space benefit separately. A correct Focus reading with conserved geometry justifies considering the next bounded workspace step; it does not accept editable Focus, establish generic usability, or close #38. If ownership remains ambiguous at useful scale, the next materially different question is semantic distinction/shared-route ownership, not more chrome polishing or fixed label offsets.
|
||||
|
||||
## Reviewed identities and limits
|
||||
|
||||
SHA-256 values below were computed from the actual bytes read. Paths are relative to C:/ar-focus-01a0d717 except the earlier note.
|
||||
|
||||
| Input/source | SHA-256 |
|
||||
| --- | --- |
|
||||
| .local/focus-optical-seams.md | 4616c63feb707c973d59483b70c62c26b7a5226e475e9cf29f25298431fe8a92 |
|
||||
| C:/ar-diagram-01a0d717/.local/diagram-next-action-design.md | fb251fe1de186b559559f1874763b1d7027bee9b2dcd13cc4dc653a432571d82 |
|
||||
| harness/experiments/focus-optical-20261001/plan.md | ee463a9f46229bda75596faeddc4c14cf2164da99927a47c90addde6e73f8328 |
|
||||
| harness/experiments/focus-optical-20261001/eight-card.json (hash only) | 9db1015369f450d5810c96a01fddb8a009d57f6aafbda5182703f15ded23d9c8 |
|
||||
| crates/oa-desktop/src/main.rs | df6c70df05dbfd769cddfa42e45b70a6080e1172a721b3656b4b7efdfa3cb203 |
|
||||
| crates/oa-desktop/src/app.rs | 4e470c5ba93d85f122b62b48cf27a6faa4c005abcab0d7180e6db598506e1c83 |
|
||||
| crates/oa-desktop/src/views.rs | 774f68523df85850d95af11f1792057a9eee5234ca98a46c3a6eb5ae7bf50bf0 |
|
||||
| crates/oa-desktop/src/diagram.rs | 3170397b82236d6db2a57a1bb860c3c44fd8ec16172701e6784d4bf1314d140f |
|
||||
| crates/vendor/iced_widget/src/sensor.rs | cb95d1220fa5663b7a148d6b159081da2200debe6fea982a04f48e27dd072973 |
|
||||
| crates/oa-desktop/src/style.rs | 28b9527137d03850b617e3c248828e8111743e3b2d0ca8def31d8f381889ddd2 |
|
||||
| crates/oa-desktop/src/app/state_diagram.rs | 0e55b99a4e2e3558f55df7c013ee14f138d99779a8afa82503dffa026f783110 |
|
||||
| crates/oa-desktop/src/explorer_view.rs | a720d7484bcc3a24729332a00e005d1cc6f5f945a9cc3965134e0024dffb581f |
|
||||
| crates/oa-desktop/src/allocation_input.rs | 7ceb868b158e4384b217b2b2b118c3714fc6d851fa2c89c2a61236cae125ffda |
|
||||
| crates/oa-desktop/src/diagram/port_labels.rs | f66b5ecd2dc64174324b34b4b5ebeb9c303ead25ebbb43304cecff0336cf3d15 |
|
||||
| crates/oa-core/src/model.rs | 05a6bd5eef14c77e7cafd2bc72eb3bb6b19f33c6d06184b4e7d21173a2684078 |
|
||||
|
||||
This review reads selected relevant implementation paths, not every desktop subsystem. It establishes no implementation/test/native result and no exact future Fit gain. Primary Capella research is unnecessary to decide this bounded viewport experiment; any later semantic stroke/port notation decision needs its own semantic review. Prior publication and negative experiment packets remain unchanged.
|
||||
|
||||
## Source-identity corrigendum
|
||||
|
||||
The original report is preserved byte-for-byte as .local/focus-proposal-review-original.md (SHA-256 685d89bf3138734d2d4ec3d85ed3b7e8d744ccbd9918ada99ba0fa09ae2f3b2f). The corrected introduction distinguishes the observed checkout checkpoint from the later plan commit. git show --stat confirmed bc69 is the publication-documents commit and e7a0b8f1 adds the two Focus artifacts. The reviewed plan hash in the table remains the original reviewed bytes; subsequent parent plan changes have not been re-reviewed here. No findings or implementation/native claims were expanded by this correction.
|
||||
@@ -0,0 +1,82 @@
|
||||
# Independent Focus optical source review
|
||||
|
||||
2026-10-01 PDT. Read-only review of the second implementation handoff in C:/ar-focus-01a0d717. HEAD was 9ded0ff215494ea0836167f4ac6d0c5d69134146; the implementation was uncommitted. Exact reviewed file hashes are below. Parent owns freeze, formatting, compilation, native evaluation and integration. I edited no source and ran no Cargo, GUI or Gitea operation. This report is the only file written for this review. I know the semantic key and cannot supply a fresh-reader result.
|
||||
|
||||
## Conclusion
|
||||
|
||||
The reviewed source is suitable to proceed to the parent's focused build/tests and bounded native experiment. Two material fault-path findings were sent to parent and the implementation owner before freeze and repaired in the second handoff. I found no remaining source blocker in the inspected read-only paths. This is not a compilation/test pass, native acceptance, proof of exact Baseline pixels or a readability result.
|
||||
|
||||
The architecture remains proportionate to the experiment: a private runner, private draw-only adapter/input wrapper, small main dispatch, and view seams. It does not add core/routing/schema changes or production reducer behavior. It deliberately remounts passive widget state across generations and is unsuitable as evidence for editable Focus state preservation.
|
||||
|
||||
## Material findings and repair verification
|
||||
|
||||
1. **Terminal error was not terminal.** Initially fail() only stored an error and cleared acknowledgment. A matching queued Drawn could restore readiness and a later Capture could write while the UI claimed no more capture was accepted. The repaired update begins with an error guard allowing only Close; capture also independently refuses an existing error. The ninth regression creates ready state, injects a fault, queues Drawn/Capture, and checks readiness remains false and no capture directory appears. This fixes the responsible state-machine boundary, not just the visible button.
|
||||
|
||||
2. **Failure could trap normal Close.** Initially Close issued its close task only after successful conservation and finished.json creation. Changed input or an occupied/unwritable receipt could therefore prevent every normal close. The repair performs conservation, records truthful PASS/FAIL when it can create a fresh receipt, logs any failure, and always returns window::close. Existing receipts are never overwritten. The new regression changes input, checks the FAIL receipt/conservation flag, checks an exit task exists, then repeats close with an occupied receipt and verifies its original bytes. The source explicitly calls window::close; the test's nonempty Task assertion alone is not a native exit demonstration.
|
||||
|
||||
Both repairs are verified by reading the second-handoff code/test, not by executing the test. An output failure can still leave partial evidence, by design. Parent must inspect receipt status and stderr, not treat process exit or the presence of an old finished.json as a pass. Earlier fault text is logged even if a later close/conservation error becomes the stored final error.
|
||||
|
||||
## Admission and frozen-state boundary
|
||||
|
||||
- The exact --focus-optical first argument chooses the private runner. Flag-free main continues through the existing App boot/update/view/subscription chain; --write-example remains separate. The flag unit test checks dispatch recognition, not complete normal native boot.
|
||||
- Input is read through a canonical path and the existing persistence decoder with migration report. Missing diagrams and all !projection.is_architecture() views are rejected before the presentation fixture is built. Scenario/StateMachine tests explicitly cover rejection. Source3 example migration is recorded separately; the invariant is unchanged original input bytes plus equality of the admitted modern Project, not equality of modern serialized JSON to legacy source syntax.
|
||||
- Document conversion is preflighted and compared to the complete admitted Project before App::with_project. The fixture then explicitly sets the requested diagram, layer, Page::Diagram, explorer index, create kind, neutral tool/selection state and collapsed palette. This addresses the concrete mixed OA/SA stale-index problem from proposal review. The four-fixture test compares the rebuilt explorer rows and checks create kind. A state-machine default selected by the constructor cannot leave the rendered page in Behavior because fixture preparation resets it.
|
||||
- No production App::update or App::subscription is called by Runner. The fixture holds a full Document, but the reachable runner mutations are presentation/camera/status fields. Inert widgets do not dispatch model edits. This is a read-only harness construction, not a general safe-mode API.
|
||||
- Frozen::check compares the whole Project, projection through Document's view index, complete RoutedView equality and exact production SVG. It also checks selected diagram/layer/page/project selection and neutral connection/architecture state. Captures and close read the original file bytes again. Source report JSON includes projected geometry, all edge paths, label bounds/text/anchors, association-end geometry and a complete routed debug representation; structured equality is the principal oracle, not selected JSON fields.
|
||||
|
||||
The runner does **not** enforce a whitelist of the predeclared input hashes or an exact expected warning set internally. It records original bytes, migration and actual diagnostics, with an explicit statement that the parent pins hashes externally. This is acceptable for the bounded experiment if the launch ledger independently verifies the prescribed hashes/diagnostic inventory. Do not describe the CLI as rejecting every unexpected-but-valid fixture or warning set. The durable plan now inventories migration/warnings; the stronger internal predeclared-hash suggestion in the original local proposal was not implemented.
|
||||
|
||||
## Input and draw boundary
|
||||
|
||||
OpticalCanvas invokes the exact production Program<app::Message>::draw with neutral selection/allocation/connection/placement and unavailable cursor. It does not override update or mouse_interaction, so it never invokes the production interactive canvas reducer or advertises its Grab behavior. Render-cache mutation inside production draw is expected; there is no interactive preview state originating from a previous canvas because the rig owns fresh state.
|
||||
|
||||
The optical view substitutes this canvas in the existing Baseline sensor/palette slot. The ordinary production canvas widgets are constructed locally then discarded in this branch; they are not mounted or fed events. PortLabels/WorkFeedback/inline-editor stacking is absent from the optical canvas. Neutral overlays therefore cannot leak selection/hover answers into one variant.
|
||||
|
||||
The Inert wrapper blocks every event except Window::RedrawRequested before child dispatch, and its default operation/overlay/mouse behavior does not forward into the passive body. It supplies Cursor::Unavailable to both redraw update and painting. Redraw-generated CanvasResized is translated using the wrapper's view-time generation; every other published App message becomes an explicit harness fault. It forwards redraw/layout/widget invalidation requests deliberately. Baseline returns before the allocation_input and Help/modal root wrappers, avoiding their production input machinery. Only the separately composed experiment header remains interactive.
|
||||
|
||||
The spy test exercises actual wrapper dispatch with mouse buttons/movement/wheel, keys/modifiers, touch, IME, resize/rescale, focus loss and file drop; it also checks focus-operation/overlay nondelegation and unavailable draw cursor. A clipboard implementation panics on access. This establishes the intended test boundary but has not run here. The draw-only adapter test checks its default update/mouse behavior. Neither is a complete end-to-end desktop input test; native body interaction remains required.
|
||||
|
||||
## Generation, resize and capture readiness
|
||||
|
||||
LayoutState requires finite positive size, rejects stale generations/repeated size, and invalidates an existing expected tuple on an actual changed canvas size even within the same variant. Variant, Fit, changed window size and scale also invalidate. A generation transition remounts the inert subtree, so the ordinary Baseline sensor emits again even if its dimensions repeat. This intentionally trades editable widget retention for a simple read-only measurement lifecycle.
|
||||
|
||||
The draw receipt includes Project/diagram IDs, variant, generation, actual expected viewport and camera. The adapter writes it only after delegating draw and only when actual canvas bounds and the program camera match. A later redraw through Inert emits Drawn once; it requests the extra redraw until acknowledged. Resize/rescale and changed sensor sizes clear the mailbox. Runner accepts a drawn stamp only when exactly equal to its expected tuple. Capture additionally requires that mailbox equality, a current-generation header measurement and known scale factor. Pending Capture is refused without turning an ordinary unsettled transition into a terminal error.
|
||||
|
||||
The repaired boot requests the oldest window's actual size/scale through private tasks as well as handling native Opened events. These private subscriptions do not invoke App subscriptions. Window/task responses are not a general cross-window authority system; this experiment has one window and tests the declared DPI/runtime. Do not claim arbitrary asynchronous multi-window/DPI transitions from this source review.
|
||||
|
||||
Fit duplicates the production f32 operation order, including origin addition/subtraction, max(1), 48 total margin, clamp .0001..1.5 and empty-node camera. It uses frozen full routed bounds and measured viewport, not window-size estimates. The test distinguishes both limiting axes and a large-origin rounding case. The lower clamp and real frame settlement still need the parent's executed checks/native observation; no favorable arithmetic alone establishes readable labels.
|
||||
|
||||
The receipt is a **CPU draw acknowledgment**. It is not a GPU fence, OS presentation acknowledgment or screenshot. The emitted record says so. The capture tests manually seed the draw mailbox; they test state/receipt conservation but do not exercise a renderer or prove the native frame is settled. Parent must pair a settled visible screenshot with the exact measurement ID/variant and capture its file identity.
|
||||
|
||||
## Default path and presentation parity
|
||||
|
||||
main.rs adds the exact opt-in branch and module declaration; normal application builder/settings remain. views::view delegates to workspace(app,None), which retains the ordinary App wrappers and production canvas stack. Header construction is shared; the ordinary five actions now sit in a nested row with the same ordering/spacing/alignment. This is a small real production-view refactor. It appears equivalent at ordinary dimensions, but source inspection cannot certify identical minimum-width layout or focus traversal. Normal boot and actual header layout deserve the planned native check.
|
||||
|
||||
Optical Baseline retains the real task rows, sidebar, diagram controls, Inspector, palette and footer; only the ordinary header actions are replaced. Its status is deliberately experiment-specific. The record's Baseline-deviation description must not be read as pixel identity to a loaded production session: no hosted/path/history state is opened and the status differs. The shared header's intrinsic height depends on its child content. The rig measures the replacement header, but has no automatic measurement of the old ordinary header for comparison. Same-height remains a native comparison obligation.
|
||||
|
||||
Focus uses a fixed 48-unit header and 28-unit status row and removes docks/tool rows/palette. This is a stripped read-only optical bound, not the available space of an eventual editable Focus. The visible Baseline control provides return; the UI is not a discoverability/engineering-workflow study. Check full scene containment, header/control clipping and the correct footer/camera after return/resize at the declared client size. Keep logical client size, actual viewport and physical capture/DPI measurements distinct.
|
||||
|
||||
No active modal/help/navigation behavior is reproduced in the passive rig. No draft/caret/IME selection, gesture/tool or manual-camera retention claim follows. Peer #43 and paused routing ownership remain unaffected by these private seams.
|
||||
|
||||
## Tests/evidence still required from the parent
|
||||
|
||||
The second handoff contains nine targeted tests. They cover Fit arithmetic, stale/repeated measurements and wrong-camera acknowledgment, admission rejection, fixed schema7/schema3 OA/SA fixtures, full capture conservation, exact opt-in dispatch, actual inert wrapper behavior, unexpected passive messages/default canvas input and the terminal-fault/close regression. I inspected their intent and assertions; I did not compile or run them.
|
||||
|
||||
Before interpreting optical results, parent must establish the identified source build, the executed targeted tests, normal opt-out boot, same-height Baseline comparison, measured native Baseline→Focus→Baseline/resize capture readiness, inert body behavior, normal close, actual full containment, unchanged inputs and complete capture oracles. Include logs and partial failures; do not accept a directory merely because its filenames exist. Match the externally pinned fixtures, admission warnings/migrations, executable/runtime and screenshots.
|
||||
|
||||
Fresh-reader unavailability remains a separate gate. Matching geometry/SVG, larger zoom, source approval and an exposed parent's reading cannot establish unassisted ownership success. This review author knows the key. No #38 closure, production promotion, broad OA/SA/font/DPI coverage or editable-workspace claim is authorized by this source review.
|
||||
|
||||
## Exact second-handoff identities
|
||||
|
||||
These hashes describe bytes inspected after the implementation owner's second handoff, before any later parent formatting/compiler repair. They must not be silently attributed to a later commit.
|
||||
|
||||
| File relative to C:/ar-focus-01a0d717 | SHA-256 |
|
||||
| --- | --- |
|
||||
| crates/oa-desktop/src/focus_optical.rs | 9021cde0b8848e5ec0b83fb7edf258f1e61613cf887056fe10b2f40406c092ca |
|
||||
| crates/oa-desktop/src/focus_optical/inert.rs | 4cd0839ea9a85991c3cada55eafc02140932770f860041e942b93c1b631ab5b0 |
|
||||
| crates/oa-desktop/src/focus_optical/tests.rs | a00a5d5f93d4b5461325c3931ad6902eb4d879dda1697aef6adc981cdb098239 |
|
||||
| crates/oa-desktop/src/main.rs | 71acaa887d272362ee1bd89322038cc481fa8217ce3075716ca24c2d28f1aa8c |
|
||||
| crates/oa-desktop/src/views.rs | 89fb8553c563bddc288a1ea62b6bc9a2e77a124f3d01750e0eb1112c80961fd0 |
|
||||
| harness/experiments/focus-optical-20261001/plan.md | 3564c669b7f33bd6dbee70c78a02442ca168437641c65dba44074ad038d9376f |
|
||||
|
||||
The prior production DiagramCanvas source remained 3170397b82236d6db2a57a1bb860c3c44fd8ec16172701e6784d4bf1314d140f when inspected. The original proposal and corrected independent proposal review remain historical; this review does not rewrite their hashes or imply they included the later implementation.
|
||||
+100
@@ -0,0 +1,100 @@
|
||||
# Conditional next experiment: categories and shared-stroke identity
|
||||
|
||||
Independent bounded design note, 2026-10-01 PDT. This is a proposal if Focus still leaves ownership uncertain, not a claim that Focus has failed. I know the answer key; my reading is assisted. No code, Cargo, native UI or Gitea actions were performed. Parent owns #38 and the current implementation. Only this note was written for this task, after the separately requested review corrigendum.
|
||||
|
||||
## Recommendation
|
||||
|
||||
Test a small categorical, noncolor stroke vocabulary for ordinary Allocation and PortAllocation against unchanged exchange strokes at the useful scale established by Focus. The narrow question is whether confusing relationship categories causes the wrong association. Do not call this a shared-route solution: require a same-kind coincident pair as a negative control, and explicitly distinguish type recognition from individual identity.
|
||||
|
||||
Do not start a lane/bundle renderer or another label search. A separated visible lane is a new presentation path even when authored points remain byte-identical; it needs an explicit draw/pick/edit contract. Existing lookup and selected highlighting remain separate workflow controls, not substitutes for unselected reading. No fixed offset or pale leader is proposed.
|
||||
|
||||
With fresh readers currently unavailable, freeze the hypothesis and perform only authorized mechanical feasibility work. Do not turn an exposed agent into a fresh reader by changing its prompt. A fresh-perception gate remains pending.
|
||||
|
||||
## Source and geometry that constrain the choice
|
||||
|
||||
The earlier candidate note/critique and published later A/B/E/F falsifiers remain unchanged. The old automatic candidate set could not remove the offending foreign allocation intersection under its old priorities. More of that search is not a new experiment.
|
||||
|
||||
Production diagram.rs:1303-1354 paints most inactive relation kinds with the same 1.4-world-unit stroke. Color distinguishes warnings, selection and traces; include/extend use [6,4] dashes. Edge strokes and label backing are interleaved by edge. SVG around line 2013 separately reproduces parts of the policy with different baseline color/width constants. Common route records do not prove native/SVG raster parity.
|
||||
|
||||
Classify using the actual semantic record and trace flag. Projection orientation is separate: BoundaryExchange/CommunicationMean can be unoriented, while DataAssociation navigation is per end. Traces need not exist in Project.relations. Never infer type from a label name, arrow, UUID or nearest port. Preserve all original endpoint markers and port glyphs.
|
||||
|
||||
Two distinct failures exist in the original geometry-before.json:
|
||||
|
||||
- Category confusion: BoundaryExchange 63009b5f-539e-5914-b630-ec6b7fefb4d5 has its label crossed by ordinary Allocation 725f2e1b-aa2c-5615-9b1f-28da178168fa. A distinct allocation pattern could weaken that incorrect association, but does not itself identify the correct owning path.
|
||||
- Individual identity: PortAllocations 09eaa992-4cdf-5ea3-b748-f10fd74b8cba and e53b7a40-e8a3-5b3f-826d-c2b5c164a84a share source port e6d69cbd-99d7-596b-bbe3-dada6118a600. Both paths begin (1180,89.5)→(1162,89.5)→(1065,89.5), then share x=1065, y=89.5..361. The first turns to its input port at y=361; the second continues to its output port at y=468. Both routed labels are empty. The same per-kind pattern, phased from the same source, is identical on their shared prefix. It cannot disclose two distinct relations there. Semantic names exist but the current label policy does not draw them.
|
||||
|
||||
These are historical frozen geometry facts, not new Focus observations. Reconfirm against the current scene before native use. Access at an exit or via Inspector does not make the common run individually distinguishable.
|
||||
|
||||
## Materially different candidates
|
||||
|
||||
| Candidate | Potential benefit | Defeating case / cost | Decision |
|
||||
| --- | --- | --- | --- |
|
||||
| Categorical noncolor strokes | Allocation versus port allocation versus exchange can be recognized before selection without moving geometry | Same-kind overlap is identical; one pattern can overpaint another; short routes/Fit erase distinctions; many types require memorization | Smallest new falsifier; initially change only two categories |
|
||||
| Categorical label vocabulary | Type word or swatch identifies the kind of a labeled relation | Kind is not identity; prefixes expand boxes; unnamed relations add ink; detached swatches do not establish continuity | Separate later variant only if stroke evidence identifies a need; preserve original text and authored placement |
|
||||
| Explicit bundle | Discloses that a corridor has multiple real members | Trunk can imply a new junction/merged relation; count does not map exits to members; needs lookup | Defer until a precise nonsemantic membership contract is justified |
|
||||
| Individual lanes | Separate visible tracks may improve tracing/selection | Changes drawn paths and transitions; affects bounds, labels, hits, handles, nesting and Fit | Not a paint-only change; defer under fixed drawn-path constraints |
|
||||
| Explicit lookup/selection aid | Names actual relations and semantic endpoint/port owners reliably | Gives answers after interaction; unconditional chooser disrupts direct editing; can duplicate existing Connections | Score existing workflow separately; extend only for an observed targeting gap with #43 coordination |
|
||||
|
||||
All candidates must preserve every semantic relationship, endpoint ID, port owner, authored pin/attachment/label and unrelated view. Do not obtain a pass by filtering difficult relations. In nested/folded projections, a visible ancestor anchor is not the underlying semantic endpoint. Preserve that distinction in any identity display rather than drawing extra containment arrows.
|
||||
|
||||
## Smallest concrete categorical falsifier
|
||||
|
||||
Trial values, not a claimed notation standard or optimized design:
|
||||
|
||||
1. Keep routes, original label text/bounds, color, width, arrowheads, port glyphs, nesting and paint order exact.
|
||||
2. Ordinary Allocation uses repeating [12,4] world-unit long dashes. PortAllocation uses [12,4,3,4] long/short dashes. All other types keep baseline, including include/extend [6,4]. Do not label every remaining solid type “exchange” in a universal legend.
|
||||
3. Phase continuously along the source-to-target polyline, beginning at zero. Do not restart at bends or use UUID-derived phase. Verify Iced's actual dash behavior and SVG equivalence before claiming it. Pattern never changes semantic orientation.
|
||||
4. Apply the rule to every visible instance of those two kinds, including unnamed allocations, not just the offending line. Add no label hitbox or stored name prefix.
|
||||
5. Use a neutral two-category legend without endpoints/names/answer-key information. First encounter without a legend and trained category recognition are different results; record which was tested.
|
||||
|
||||
At zoom .515, those 12/4/3-unit marks become about 6.18/2.06/1.55 screen units; at .85, 10.2/3.4/2.55. This is arithmetic, not legibility. Failure to distinguish the classes at actual Fit, or confusion with include/extend, rejects this instance. Any alternate pattern or heavier width is a separately recorded revision; do not tune indefinitely until the known answer becomes recognizable.
|
||||
|
||||
This can remain a private immutable semantic-kind-to-dash policy shared by experimental Canvas and SVG consumers. No routing/core/schema/input change is needed. Do not combine it into the production Focus comparison before that evidence is frozen: scale and notation effects need distinct source/variant identities. A later label-category annotation requires its own measured bounds, occlusion, hit/export and noise analysis; no automatic extra label on every edge now.
|
||||
|
||||
Pre-native checks must compare the complete Project, projected nodes/ports/edges, all route points, labels, authored metadata and endpoint markers, not only selected fields. Check class stability under consistent UUID remapping. Keep every edge-tagged path when analyzing overlap; routing-cost exact-segment deduplication is not an ownership inventory, and partial overlaps matter. Classification is constant-time per painted edge; overlap diagnostics belong in an admission/cached report, not per pointer move.
|
||||
|
||||
The existing hit_edge uses a continuous polyline corridor of 7 screen units and selected-ID tie preference. Dashed gaps should deliberately keep that existing corridor, rather than making only visible dash pixels clickable. Preserve label/endpoint priority and selected-route editing. This is visual/interaction consistency for a dashed line, not a claim that coincident picking becomes unambiguous. Native/SVG parity means matching type pattern, path and endpoint semantics; neither shared descriptors nor matching SVG attributes prove glyph/raster parity.
|
||||
|
||||
## Required negative controls and stopping rules
|
||||
|
||||
- Identify the conversation participants, actual ports/owners and orientation without selection; preserve exact wrong alternatives and uncertainty. Category recognition alone is not ownership success.
|
||||
- Keep Request/Report directions and correct existing readings. Check that allocation marks do not make exchanges look broken or reassigned.
|
||||
- Ask multiplicity/endpoints for the same-kind port-allocation witness without telling the reader there are two. Correct tracing through exits is legitimate whole-scene evidence; it does not prove separate targetability on the common segment.
|
||||
- Include a mixed-kind exact overlap and a short edge. A later solid stroke can cover all dashed ink. Reverse paint order on frozen geometry as an adversarial check; simultaneously rerouting after UUID changes would confound it. Do not solve overpainting by favoring an arbitrary UUID.
|
||||
- Include nesting/folded endpoints, warnings, selected styles, include/extend, and per-end association labels/navigation before broader notation promotion. Missing controls are explicit coverage gaps, not presumed passes.
|
||||
- At fixed full-scene Fit and a separately recorded working scale, record misclassification, wrong ownership, unresolved alternatives, pattern visibility, lookup actions, illegible text and time. Preserve raw answers. One fresh reading is not a system-engineer population study; absent a fresh reader, only mechanical feasibility can pass.
|
||||
|
||||
Reject categorical strokes as a sufficient #38 remedy if critical ownership remains ambiguous even when type recognition improves. That usefully narrows the missing information to individual continuity/identity. Do not respond by adding many dash styles, per-UUID colors, moving marks or tiny numbers to every line. These add learning burden/noise without proving continuity.
|
||||
|
||||
## What would justify a lane/bundle follow-up
|
||||
|
||||
First decide explicitly whether drawn centerlines may depart from authored routes. Strict exact drawn-path preservation excludes lanes; transparent overprinting cannot make identical paths unique. Preserving stored bytes while offsetting the visible line is a different invariant and must not be described as unchanged paths.
|
||||
|
||||
If later authorized, a lane experiment needs one immutable display-geometry record consumed by Canvas, SVG, bounds and hit testing, mapping each lane to a real edge and original segment. Keep model routes exact and endpoints fixed; fan-in/out is graphical separation, not a semantic junction. Resolve label ownership, pin/attachment handles, route-preview/commit settlement, folded nesting and ordering under unrelated insertion before editable promotion. Offset paint with original centerline hits fails. UUID-only ordering is reproducible but not meaningful or invariant under identity remapping. These dependencies explain deferral; they are not a request to build a generic bundler.
|
||||
|
||||
For a bundle, membership is a set of real edge IDs; distinguish a legitimate common endpoint lead from an accidental shared corridor. Never create a model junction or replace N relations with one. A count discloses multiplicity but still needs member access. A bundle click must not silently choose the first UUID and begin a drag. Read-only recognition can be tested first, but input work belongs with contextual-selection ownership (#43), performance with #44. Do not resume paused #32 or absorb #40/#41.
|
||||
|
||||
## Primary comparison sources
|
||||
|
||||
Sirius documents optional attachment links when an edge or label is selected and jump links for crossings. Those are distinct mechanisms; its guide does not establish individual continuity along a long coincident run or universal availability across configured modelers. This supports keeping assisted attachment and crossing treatment separate from this unselected identity question. [Official Sirius diagram guide](https://eclipse.dev/sirius/doc/user/diagrams/Diagrams.html), sections “Display attachment link between edge and its labels” and “Properties”.
|
||||
|
||||
Capella's primary layout guide documents label alignment/distribution and edge/connected-port layout facilities. These are intentional local operations, not evidence that this proposed dash vocabulary is standard Capella notation or fixes ownership. [Official Capella layout guide source](https://raw.githubusercontent.com/eclipse-capella/capella/master/doc/plugins/org.polarsys.capella.tipsandtricks.doc/html/Tips%20and%20tricks/8_Other%20layout%20facilities/8_Other%20layout%20facilities.mediawiki).
|
||||
|
||||
Both pages were opened during this review. Further product research is unnecessary to falsify the two-class trial; a production notation decision needs broader semantic review.
|
||||
|
||||
## Evidence identities and limits
|
||||
|
||||
Read from C:/ar-diagram-01a0d717:
|
||||
|
||||
- .local/issue38-design-candidates.md SHA-256 9b2f69e2ccab90940bd293d707562745f77f34c2158d9d4c93811f86fc477e37.
|
||||
- .local/issue38-design-critic.md SHA-256 83af5f48985b95f9e573896164e1a01621e2cf21fcfb865f3a53f4b6454e8271.
|
||||
- harness/diagram-readability-20260925.md SHA-256 631a969c5bfec78355eeaf0e13425486dc2d3b55f5e0358e8d10a51e2cabd17e.
|
||||
- .local/native-reading/manual/geometry-before.json: selected complete semantic inventory and two exact paths inspected; no regeneration/current runtime result claimed.
|
||||
|
||||
Source read from C:/ar-focus-01a0d717 while parent independently implements the optical harness:
|
||||
|
||||
- crates/oa-desktop/src/diagram.rs SHA-256 3170397b82236d6db2a57a1bb860c3c44fd8ec16172701e6784d4bf1314d140f.
|
||||
- crates/oa-core/src/model.rs SHA-256 05a6bd5eef14c77e7cafd2bc72eb3bb6b19f33c6d06184b4e7d21173a2684078.
|
||||
- crates/oa-core/src/projection.rs SHA-256 3521bf3041502f3a3a970d7799894a5ae16c1e8da754deeea5290ac1f8ba11e8.
|
||||
|
||||
Identical same-kind ink is a structural limit of this proposed encoding, not a fresh perception result or proof of globally inaccessible relations. Prior failed experiments, production policy and acceptance gates remain unchanged.
|
||||
+835
@@ -0,0 +1,835 @@
|
||||
{
|
||||
"archive": "supplemental-final-review.zip",
|
||||
"member_count": 138,
|
||||
"uncompressed_bytes": 4633773,
|
||||
"members": [
|
||||
{
|
||||
"path": "focus-final-oracle-review.md",
|
||||
"bytes": 9069,
|
||||
"sha256": "c76acf5eaf46db5110c92fbf2f6c8accb9987c919d6897ad9720f65e729a5bc1",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-oracle-review.md"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-expected-eight-diagnostics.json",
|
||||
"bytes": 740,
|
||||
"sha256": "634908836604d501ddec9c0ce0f80b5be6e5cc0d2cbe4d850d3703679898383f",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-expected-eight-diagnostics.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/finished.json",
|
||||
"bytes": 1276,
|
||||
"sha256": "d0af8f949dd7dbb0e4f3d8293afde408c8e0f6a4ead51cdceb708be9f90839be",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\finished.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/admission.json",
|
||||
"bytes": 940,
|
||||
"sha256": "a01cde2fce3481ef0b038d9f7aba92a4570461c23aa1690f9df5a44924c75c7a",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\admission.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-001/diagram.svg",
|
||||
"bytes": 7209,
|
||||
"sha256": "645ee69cc97d11acc812539b62528d7fdceec32aa2516d4ade8508016164119d",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-001\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-001/measurement.json",
|
||||
"bytes": 1002,
|
||||
"sha256": "0ba9b9f9bc0d5fad9e4dfa3f6d5210609fcdef58c764f77c58c30861d5567c7c",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-001\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-001/project.json",
|
||||
"bytes": 138662,
|
||||
"sha256": "77f69b6fee2d2efd841a0a5f9518bf41704271838a47d2803ae3005a413a27d8",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-001\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-001/scene.json",
|
||||
"bytes": 42616,
|
||||
"sha256": "c595f5c2a49975e466809447a51f920598120b4630935dcd48f6ec7b5de0cb9a",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-001\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-002/diagram.svg",
|
||||
"bytes": 7209,
|
||||
"sha256": "645ee69cc97d11acc812539b62528d7fdceec32aa2516d4ade8508016164119d",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-002\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-002/measurement.json",
|
||||
"bytes": 985,
|
||||
"sha256": "3dcf5ee7ed63a4d7e17c8fc28d176a4bd2c339f98629b7beafd239f307d99d2b",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-002\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-002/project.json",
|
||||
"bytes": 138662,
|
||||
"sha256": "77f69b6fee2d2efd841a0a5f9518bf41704271838a47d2803ae3005a413a27d8",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-002\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-002/scene.json",
|
||||
"bytes": 42616,
|
||||
"sha256": "c595f5c2a49975e466809447a51f920598120b4630935dcd48f6ec7b5de0cb9a",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-002\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-003/diagram.svg",
|
||||
"bytes": 7209,
|
||||
"sha256": "645ee69cc97d11acc812539b62528d7fdceec32aa2516d4ade8508016164119d",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-003\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-003/measurement.json",
|
||||
"bytes": 1002,
|
||||
"sha256": "a9c203d7c9d5cbde5c98907223b0a81352dc6e5a450b0025a4abf0796db726e8",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-003\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-003/project.json",
|
||||
"bytes": 138662,
|
||||
"sha256": "77f69b6fee2d2efd841a0a5f9518bf41704271838a47d2803ae3005a413a27d8",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-003\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-003/scene.json",
|
||||
"bytes": 42616,
|
||||
"sha256": "c595f5c2a49975e466809447a51f920598120b4630935dcd48f6ec7b5de0cb9a",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-003\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-004/diagram.svg",
|
||||
"bytes": 7209,
|
||||
"sha256": "645ee69cc97d11acc812539b62528d7fdceec32aa2516d4ade8508016164119d",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-004\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-004/measurement.json",
|
||||
"bytes": 1002,
|
||||
"sha256": "a9c203d7c9d5cbde5c98907223b0a81352dc6e5a450b0025a4abf0796db726e8",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-004\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-004/project.json",
|
||||
"bytes": 138662,
|
||||
"sha256": "77f69b6fee2d2efd841a0a5f9518bf41704271838a47d2803ae3005a413a27d8",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-004\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-004/scene.json",
|
||||
"bytes": 42616,
|
||||
"sha256": "c595f5c2a49975e466809447a51f920598120b4630935dcd48f6ec7b5de0cb9a",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-004\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-005/diagram.svg",
|
||||
"bytes": 7209,
|
||||
"sha256": "645ee69cc97d11acc812539b62528d7fdceec32aa2516d4ade8508016164119d",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-005\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-005/measurement.json",
|
||||
"bytes": 1012,
|
||||
"sha256": "c143bff61e1adf787fd30de969e1dac4e5e5f51ca6003c1c96f0dec053f37ba9",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-005\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-005/project.json",
|
||||
"bytes": 138662,
|
||||
"sha256": "77f69b6fee2d2efd841a0a5f9518bf41704271838a47d2803ae3005a413a27d8",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-005\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-005/scene.json",
|
||||
"bytes": 42616,
|
||||
"sha256": "c595f5c2a49975e466809447a51f920598120b4630935dcd48f6ec7b5de0cb9a",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-005\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-006/diagram.svg",
|
||||
"bytes": 7209,
|
||||
"sha256": "645ee69cc97d11acc812539b62528d7fdceec32aa2516d4ade8508016164119d",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-006\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-006/measurement.json",
|
||||
"bytes": 988,
|
||||
"sha256": "67c14768620e5f69617ffa6c97c273dad8ba0c13bc60fb32134d4b87b3ef9e12",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-006\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-006/project.json",
|
||||
"bytes": 138662,
|
||||
"sha256": "77f69b6fee2d2efd841a0a5f9518bf41704271838a47d2803ae3005a413a27d8",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-006\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-006/scene.json",
|
||||
"bytes": 42616,
|
||||
"sha256": "c595f5c2a49975e466809447a51f920598120b4630935dcd48f6ec7b5de0cb9a",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-006\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-007/diagram.svg",
|
||||
"bytes": 7209,
|
||||
"sha256": "645ee69cc97d11acc812539b62528d7fdceec32aa2516d4ade8508016164119d",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-007\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-007/measurement.json",
|
||||
"bytes": 1013,
|
||||
"sha256": "9a2824b5ec340131ac68f5ec08b3442fd742f87717954f5d757961ab36f9834f",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-007\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-007/project.json",
|
||||
"bytes": 138662,
|
||||
"sha256": "77f69b6fee2d2efd841a0a5f9518bf41704271838a47d2803ae3005a413a27d8",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-007\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/capture-007/scene.json",
|
||||
"bytes": 42616,
|
||||
"sha256": "c595f5c2a49975e466809447a51f920598120b4630935dcd48f6ec7b5de0cb9a",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\capture-007\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/diagram.svg",
|
||||
"bytes": 7209,
|
||||
"sha256": "645ee69cc97d11acc812539b62528d7fdceec32aa2516d4ade8508016164119d",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/finished.json",
|
||||
"bytes": 239,
|
||||
"sha256": "aadeb9798c9fb30ebbb086947f4ddb3f3845034376b4e6924a3027e2e0f5d840",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\finished.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/input.json",
|
||||
"bytes": 138661,
|
||||
"sha256": "9db1015369f450d5810c96a01fddb8a009d57f6aafbda5182703f15ded23d9c8",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\input.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/project.json",
|
||||
"bytes": 138662,
|
||||
"sha256": "77f69b6fee2d2efd841a0a5f9518bf41704271838a47d2803ae3005a413a27d8",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/output/scene.json",
|
||||
"bytes": 42616,
|
||||
"sha256": "c595f5c2a49975e466809447a51f920598120b4630935dcd48f6ec7b5de0cb9a",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\output\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/started.json",
|
||||
"bytes": 1098,
|
||||
"sha256": "f61c713d2338f7590a3fa212645f906aad85469d9d7c2500d0889154f633e399",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\started.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\stderr.log"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/stdout.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\stdout.log"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/eight/working/fixture.json",
|
||||
"bytes": 138661,
|
||||
"sha256": "9db1015369f450d5810c96a01fddb8a009d57f6aafbda5182703f15ded23d9c8",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\eight\\working\\fixture.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/finished.json",
|
||||
"bytes": 1264,
|
||||
"sha256": "b8820f64c7b1c2d76db57e8d57d79adf23c29e2a47b285a382139000ad374f78",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\finished.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/admission.json",
|
||||
"bytes": 17029,
|
||||
"sha256": "63fe29bdb2b0b262d9f872daec87f5934d9522d758a14e2f139238dc46d3eb7a",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\admission.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-001/diagram.svg",
|
||||
"bytes": 8690,
|
||||
"sha256": "a11f26a5e02fe2e46fa6cdd49e4e954a19a281d3fb4dbe9998c7871541ad91c5",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-001\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-001/measurement.json",
|
||||
"bytes": 1013,
|
||||
"sha256": "d3aee905d0790d04eb327c0ce91d4d2d43306d493b2770ab4ef1d3a849e30ecb",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-001\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-001/project.json",
|
||||
"bytes": 102924,
|
||||
"sha256": "b3620e29e7f4ceac8b33b075539ffb19a8676a651321d9e96d055eb9c7b5bc39",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-001\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-001/scene.json",
|
||||
"bytes": 26663,
|
||||
"sha256": "a03ded190f706663e47d9f75f0ddf8442ed9abdbac4438c671bc49f99c9fb7f6",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-001\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-002/diagram.svg",
|
||||
"bytes": 8690,
|
||||
"sha256": "a11f26a5e02fe2e46fa6cdd49e4e954a19a281d3fb4dbe9998c7871541ad91c5",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-002\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-002/measurement.json",
|
||||
"bytes": 987,
|
||||
"sha256": "598f2290815c617fd5469eab24ccb40a4fba68febe3aadccb4fa9cb3c21ade31",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-002\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-002/project.json",
|
||||
"bytes": 102924,
|
||||
"sha256": "b3620e29e7f4ceac8b33b075539ffb19a8676a651321d9e96d055eb9c7b5bc39",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-002\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-002/scene.json",
|
||||
"bytes": 26663,
|
||||
"sha256": "a03ded190f706663e47d9f75f0ddf8442ed9abdbac4438c671bc49f99c9fb7f6",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-002\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-003/diagram.svg",
|
||||
"bytes": 8690,
|
||||
"sha256": "a11f26a5e02fe2e46fa6cdd49e4e954a19a281d3fb4dbe9998c7871541ad91c5",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-003\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-003/measurement.json",
|
||||
"bytes": 1013,
|
||||
"sha256": "e4401d397f80e3ec4976becf571076fbcca7fa52d0fdd87c3456257627d04f18",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-003\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-003/project.json",
|
||||
"bytes": 102924,
|
||||
"sha256": "b3620e29e7f4ceac8b33b075539ffb19a8676a651321d9e96d055eb9c7b5bc39",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-003\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-003/scene.json",
|
||||
"bytes": 26663,
|
||||
"sha256": "a03ded190f706663e47d9f75f0ddf8442ed9abdbac4438c671bc49f99c9fb7f6",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-003\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-004/diagram.svg",
|
||||
"bytes": 8690,
|
||||
"sha256": "a11f26a5e02fe2e46fa6cdd49e4e954a19a281d3fb4dbe9998c7871541ad91c5",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-004\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-004/measurement.json",
|
||||
"bytes": 1015,
|
||||
"sha256": "e3af4b55c349f7c2ddedeb5e6d82a936374c324ec516c5b87861d605f3104ca5",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-004\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-004/project.json",
|
||||
"bytes": 102924,
|
||||
"sha256": "b3620e29e7f4ceac8b33b075539ffb19a8676a651321d9e96d055eb9c7b5bc39",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-004\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-004/scene.json",
|
||||
"bytes": 26663,
|
||||
"sha256": "a03ded190f706663e47d9f75f0ddf8442ed9abdbac4438c671bc49f99c9fb7f6",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-004\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-005/diagram.svg",
|
||||
"bytes": 8690,
|
||||
"sha256": "a11f26a5e02fe2e46fa6cdd49e4e954a19a281d3fb4dbe9998c7871541ad91c5",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-005\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-005/measurement.json",
|
||||
"bytes": 988,
|
||||
"sha256": "ffc9dbda36a67b9e885f4750b478eaae5b8b74dc430fa137fb85dbf6ccf26f10",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-005\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-005/project.json",
|
||||
"bytes": 102924,
|
||||
"sha256": "b3620e29e7f4ceac8b33b075539ffb19a8676a651321d9e96d055eb9c7b5bc39",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-005\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/capture-005/scene.json",
|
||||
"bytes": 26663,
|
||||
"sha256": "a03ded190f706663e47d9f75f0ddf8442ed9abdbac4438c671bc49f99c9fb7f6",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\capture-005\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/diagram.svg",
|
||||
"bytes": 8690,
|
||||
"sha256": "a11f26a5e02fe2e46fa6cdd49e4e954a19a281d3fb4dbe9998c7871541ad91c5",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/finished.json",
|
||||
"bytes": 239,
|
||||
"sha256": "b8087166234c0937c5e448c4cdeb57b4bc0ba4807e0319caa002741565fff358",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\finished.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/input.json",
|
||||
"bytes": 100281,
|
||||
"sha256": "8592714f75b271133f21ce017d87896b6cf91ea0e4837f1c2ed453e21be26b14",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\input.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/project.json",
|
||||
"bytes": 102924,
|
||||
"sha256": "b3620e29e7f4ceac8b33b075539ffb19a8676a651321d9e96d055eb9c7b5bc39",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/output/scene.json",
|
||||
"bytes": 26663,
|
||||
"sha256": "a03ded190f706663e47d9f75f0ddf8442ed9abdbac4438c671bc49f99c9fb7f6",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\output\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/started.json",
|
||||
"bytes": 1086,
|
||||
"sha256": "d3e798ab785d9aa554657e791eb8a080a8ba84bb687c88e47f961d79728ec0bb",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\started.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\stderr.log"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/stdout.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\stdout.log"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/oa/working/fixture.json",
|
||||
"bytes": 100281,
|
||||
"sha256": "8592714f75b271133f21ce017d87896b6cf91ea0e4837f1c2ed453e21be26b14",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\oa\\working\\fixture.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/finished.json",
|
||||
"bytes": 1264,
|
||||
"sha256": "513d383f92c05937df5abed1009ed3f85073d21f824cb921f12aae10873f6632",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\finished.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/admission.json",
|
||||
"bytes": 17029,
|
||||
"sha256": "5b70784787e0c7e48b5d2dae454d1e5f17708a7a7bb68d4433d777dfd64eda06",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\admission.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-001/diagram.svg",
|
||||
"bytes": 14710,
|
||||
"sha256": "90b08eb2cdf6d06538ca988044456ed97be26af3bf5bc283fc4fc3d734986927",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-001\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-001/measurement.json",
|
||||
"bytes": 1011,
|
||||
"sha256": "942b6c681133e01c8e6eb7fc554d9446b17dab6df6a349f48a001921e9871bcf",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-001\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-001/project.json",
|
||||
"bytes": 102924,
|
||||
"sha256": "b3620e29e7f4ceac8b33b075539ffb19a8676a651321d9e96d055eb9c7b5bc39",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-001\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-001/scene.json",
|
||||
"bytes": 48088,
|
||||
"sha256": "7380edfe7f33d9ebe368101e3288838d9643a9434223e4ed271b489b211312a1",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-001\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-002/diagram.svg",
|
||||
"bytes": 14710,
|
||||
"sha256": "90b08eb2cdf6d06538ca988044456ed97be26af3bf5bc283fc4fc3d734986927",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-002\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-002/measurement.json",
|
||||
"bytes": 986,
|
||||
"sha256": "a83fe22366517bc9b1f513aa29d3d51ff2c3f7e9ecb3c428e82e4bc1eaabf78f",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-002\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-002/project.json",
|
||||
"bytes": 102924,
|
||||
"sha256": "b3620e29e7f4ceac8b33b075539ffb19a8676a651321d9e96d055eb9c7b5bc39",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-002\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-002/scene.json",
|
||||
"bytes": 48088,
|
||||
"sha256": "7380edfe7f33d9ebe368101e3288838d9643a9434223e4ed271b489b211312a1",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-002\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-003/diagram.svg",
|
||||
"bytes": 14710,
|
||||
"sha256": "90b08eb2cdf6d06538ca988044456ed97be26af3bf5bc283fc4fc3d734986927",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-003\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-003/measurement.json",
|
||||
"bytes": 1011,
|
||||
"sha256": "6eb4974da115427dd858ce0d30c8c390a30bf9beb6a6c1f67e15d46a40191b18",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-003\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-003/project.json",
|
||||
"bytes": 102924,
|
||||
"sha256": "b3620e29e7f4ceac8b33b075539ffb19a8676a651321d9e96d055eb9c7b5bc39",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-003\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-003/scene.json",
|
||||
"bytes": 48088,
|
||||
"sha256": "7380edfe7f33d9ebe368101e3288838d9643a9434223e4ed271b489b211312a1",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-003\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-004/diagram.svg",
|
||||
"bytes": 14710,
|
||||
"sha256": "90b08eb2cdf6d06538ca988044456ed97be26af3bf5bc283fc4fc3d734986927",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-004\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-004/measurement.json",
|
||||
"bytes": 1015,
|
||||
"sha256": "37da0619b9d90e5e0be8a3efbf9e66057d9dd9095aeb297581a92ed4a866a256",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-004\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-004/project.json",
|
||||
"bytes": 102924,
|
||||
"sha256": "b3620e29e7f4ceac8b33b075539ffb19a8676a651321d9e96d055eb9c7b5bc39",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-004\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-004/scene.json",
|
||||
"bytes": 48088,
|
||||
"sha256": "7380edfe7f33d9ebe368101e3288838d9643a9434223e4ed271b489b211312a1",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-004\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-005/diagram.svg",
|
||||
"bytes": 14710,
|
||||
"sha256": "90b08eb2cdf6d06538ca988044456ed97be26af3bf5bc283fc4fc3d734986927",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-005\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-005/measurement.json",
|
||||
"bytes": 987,
|
||||
"sha256": "f0559e863cdd868ecbee3f3d13446d3a40c892ed99ee77b69e82ae56e1af60a7",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-005\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-005/project.json",
|
||||
"bytes": 102924,
|
||||
"sha256": "b3620e29e7f4ceac8b33b075539ffb19a8676a651321d9e96d055eb9c7b5bc39",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-005\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/capture-005/scene.json",
|
||||
"bytes": 48088,
|
||||
"sha256": "7380edfe7f33d9ebe368101e3288838d9643a9434223e4ed271b489b211312a1",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\capture-005\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/diagram.svg",
|
||||
"bytes": 14710,
|
||||
"sha256": "90b08eb2cdf6d06538ca988044456ed97be26af3bf5bc283fc4fc3d734986927",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/finished.json",
|
||||
"bytes": 239,
|
||||
"sha256": "b8087166234c0937c5e448c4cdeb57b4bc0ba4807e0319caa002741565fff358",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\finished.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/input.json",
|
||||
"bytes": 100281,
|
||||
"sha256": "8592714f75b271133f21ce017d87896b6cf91ea0e4837f1c2ed453e21be26b14",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\input.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/project.json",
|
||||
"bytes": 102924,
|
||||
"sha256": "b3620e29e7f4ceac8b33b075539ffb19a8676a651321d9e96d055eb9c7b5bc39",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/output/scene.json",
|
||||
"bytes": 48088,
|
||||
"sha256": "7380edfe7f33d9ebe368101e3288838d9643a9434223e4ed271b489b211312a1",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\output\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/started.json",
|
||||
"bytes": 1086,
|
||||
"sha256": "381bca5b275b4530a9ee3e4ae146e36b4e6f4a8350c4dfd80494d8dc7816387e",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\started.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\stderr.log"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/stdout.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\stdout.log"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/sa/working/fixture.json",
|
||||
"bytes": 100281,
|
||||
"sha256": "8592714f75b271133f21ce017d87896b6cf91ea0e4837f1c2ed453e21be26b14",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\sa\\working\\fixture.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/finished.json",
|
||||
"bytes": 1276,
|
||||
"sha256": "3ae1bdfef555df212e97e3a9d951b4d25900ee19cdb4cab3eebf3f3558b77e94",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\finished.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/admission.json",
|
||||
"bytes": 6946,
|
||||
"sha256": "db28bdba56ee22cb9cfef99ae3cfeb55eae9bfa66c52cacdfec85c1c896702aa",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\admission.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-001/diagram.svg",
|
||||
"bytes": 1925,
|
||||
"sha256": "48c8e07f0c367e61e31cba04722624e0fe306f1e88bac3da650a85d2295a0bd8",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-001\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-001/measurement.json",
|
||||
"bytes": 999,
|
||||
"sha256": "05615ac13fefd7b69a305fecd980173d3138adb2f3017a04278f5b63c7c064e4",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-001\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-001/project.json",
|
||||
"bytes": 52328,
|
||||
"sha256": "b23460cf202adedcb57608b8d5ddb8a44c608383e42130f305245402a8ac17ae",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-001\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-001/scene.json",
|
||||
"bytes": 4952,
|
||||
"sha256": "0708887f24425c8047ed59dffbb5c7a7e22c0d9bc32bde72d0c1a7e12454c5c0",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-001\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-002/diagram.svg",
|
||||
"bytes": 1925,
|
||||
"sha256": "48c8e07f0c367e61e31cba04722624e0fe306f1e88bac3da650a85d2295a0bd8",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-002\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-002/measurement.json",
|
||||
"bytes": 959,
|
||||
"sha256": "2d553ce4ec6ba33fd0ce25d7fb5585ca8f9857d51be56915ba08fabae6d89a73",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-002\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-002/project.json",
|
||||
"bytes": 52328,
|
||||
"sha256": "b23460cf202adedcb57608b8d5ddb8a44c608383e42130f305245402a8ac17ae",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-002\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-002/scene.json",
|
||||
"bytes": 4952,
|
||||
"sha256": "0708887f24425c8047ed59dffbb5c7a7e22c0d9bc32bde72d0c1a7e12454c5c0",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-002\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-003/diagram.svg",
|
||||
"bytes": 1925,
|
||||
"sha256": "48c8e07f0c367e61e31cba04722624e0fe306f1e88bac3da650a85d2295a0bd8",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-003\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-003/measurement.json",
|
||||
"bytes": 999,
|
||||
"sha256": "7c620cc9b3e51795939889b494bbf594b2044604b1dc30b0e549e456ee8cbc9c",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-003\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-003/project.json",
|
||||
"bytes": 52328,
|
||||
"sha256": "b23460cf202adedcb57608b8d5ddb8a44c608383e42130f305245402a8ac17ae",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-003\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-003/scene.json",
|
||||
"bytes": 4952,
|
||||
"sha256": "0708887f24425c8047ed59dffbb5c7a7e22c0d9bc32bde72d0c1a7e12454c5c0",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-003\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-004/diagram.svg",
|
||||
"bytes": 1925,
|
||||
"sha256": "48c8e07f0c367e61e31cba04722624e0fe306f1e88bac3da650a85d2295a0bd8",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-004\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-004/measurement.json",
|
||||
"bytes": 1014,
|
||||
"sha256": "db8f3d566acdacb9fd45b701a8af86eccdc6a9dec27f8cfdaea8151eed7e7d9b",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-004\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-004/project.json",
|
||||
"bytes": 52328,
|
||||
"sha256": "b23460cf202adedcb57608b8d5ddb8a44c608383e42130f305245402a8ac17ae",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-004\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-004/scene.json",
|
||||
"bytes": 4952,
|
||||
"sha256": "0708887f24425c8047ed59dffbb5c7a7e22c0d9bc32bde72d0c1a7e12454c5c0",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-004\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-005/diagram.svg",
|
||||
"bytes": 1925,
|
||||
"sha256": "48c8e07f0c367e61e31cba04722624e0fe306f1e88bac3da650a85d2295a0bd8",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-005\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-005/measurement.json",
|
||||
"bytes": 959,
|
||||
"sha256": "373080bf3a327212d2c2569c14c5a8df1cf0a9b6bd95c9dec31e01ece21b50b1",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-005\\measurement.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-005/project.json",
|
||||
"bytes": 52328,
|
||||
"sha256": "b23460cf202adedcb57608b8d5ddb8a44c608383e42130f305245402a8ac17ae",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-005\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/capture-005/scene.json",
|
||||
"bytes": 4952,
|
||||
"sha256": "0708887f24425c8047ed59dffbb5c7a7e22c0d9bc32bde72d0c1a7e12454c5c0",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\capture-005\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/diagram.svg",
|
||||
"bytes": 1925,
|
||||
"sha256": "48c8e07f0c367e61e31cba04722624e0fe306f1e88bac3da650a85d2295a0bd8",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\diagram.svg"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/finished.json",
|
||||
"bytes": 239,
|
||||
"sha256": "b8087166234c0937c5e448c4cdeb57b4bc0ba4807e0319caa002741565fff358",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\finished.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/input.json",
|
||||
"bytes": 49715,
|
||||
"sha256": "242f0b031229a87af5c4ebe5d651defe59c191a6b7a69dc0a77f7e203411f195",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\input.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/project.json",
|
||||
"bytes": 52328,
|
||||
"sha256": "b23460cf202adedcb57608b8d5ddb8a44c608383e42130f305245402a8ac17ae",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\project.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/output/scene.json",
|
||||
"bytes": 4952,
|
||||
"sha256": "0708887f24425c8047ed59dffbb5c7a7e22c0d9bc32bde72d0c1a7e12454c5c0",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\output\\scene.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/started.json",
|
||||
"bytes": 1098,
|
||||
"sha256": "d9d3668ef80abb07b2d3e54078ed4a702dc6dc3db481eb72accdf5cbf1afa35b",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\started.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\stderr.log"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/stdout.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\stdout.log"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/.local/focus-native/small/working/fixture.json",
|
||||
"bytes": 49715,
|
||||
"sha256": "242f0b031229a87af5c4ebe5d651defe59c191a6b7a69dc0a77f7e203411f195",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\.local\\focus-native\\small\\working\\fixture.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-dwb4lmy7/results.json",
|
||||
"bytes": 64511,
|
||||
"sha256": "3d2a66a3262aa17509e6b552bcea0aa08edc5aa4bff2d0810862d003925344a0",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-dwb4lmy7\\results.json"
|
||||
},
|
||||
{
|
||||
"path": "focus-final-review-probe.py",
|
||||
"bytes": 6019,
|
||||
"sha256": "5c144c3975657d51509805adadb73f47628365a5b664ace1a621549887f8f374",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-final-review-probe.py"
|
||||
},
|
||||
{
|
||||
"path": "focus-native/parent-observations.json",
|
||||
"bytes": 10560,
|
||||
"sha256": "73189f8a597d52e893ccc23ba0ed11cc4bec99d2ec07b45f7d5c52772d44de72",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\focus-native\\parent-observations.json"
|
||||
},
|
||||
{
|
||||
"path": "write-focus-observations.py",
|
||||
"bytes": 3570,
|
||||
"sha256": "2e7b9a792ff3f841385616d4291c358fbc4d0a443ae892b39e2e59561d5f21a0",
|
||||
"original_source_path": "C:\\ar-focus-01a0d717\\.local\\write-focus-observations.py"
|
||||
}
|
||||
]
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,22 @@
|
||||
# Final narrative handoff review
|
||||
|
||||
No blocker found in the staged narrative reviewed on 2026-10-01 PDT. This was a bounded document/evidence-scope review; no source/evidence edits, Cargo, GUI, publication, or broad gate rerun. I authored the Rust runner earlier and independently reviewed the repaired Python checker, not my own runner. The narrative states that distinction correctly.
|
||||
|
||||
Exact working and staged document SHA-256 values agree:
|
||||
|
||||
| Document | SHA-256 |
|
||||
| --- | --- |
|
||||
| harness/focus-optical-validation-20261001.md | `44ee35b5a81117724224a3d3ff4e92d8c71d4e79b94d601dc02b84e80618e1d2` |
|
||||
| harness/experiments/focus-optical-20261001/README.md | `e4f7c140cb933091436ff6aac876e34ce347e16df3967dbe8f64fb2295ebd68c` |
|
||||
| harness/STATE.md | `d7447d516df1923a3b9bfe9be76b1a80d0fe1c4e5c74a7f422c04f56d708c871` |
|
||||
| harness/DECISIONS.md | `118a9b873e6ca29da9041a8e72f717bda43578c7550b849c89a29df8d78bf8c1` |
|
||||
|
||||
Checked the staged STATE/DECISIONS additions and complete result/entrypoint against the prior four-case review. Table counts, initial dimensions/zooms/gains, 22 captures, 533 input hashes, 92-test scope and warning/migration counts agree. Mixed resized zooms independently reread as 0.2895086407661438 / 0.6985391974449158 / 0.2895086407661438, consistent with the rounded narrative. The 79%,67%,58% summaries are appropriate rounding. Small-view clamp, measured Baseline header versus visual ordinary-header comparison, CPU draw acknowledgment versus native display, and temporal conservation versus independent regeneration are distinguished correctly.
|
||||
|
||||
The original checker defects and preserved synthetic corpus are not presented as native observations. Fabricated migration/erased legacy-warning acceptance is disclosed; no output-derived baseline is invented. Fresh-reading unavailability and no promotion/closure/editable acceptance remain explicit.
|
||||
|
||||
Ordinary early screenshots01/02 are correctly described as still showing the dialog,03 as completed load. Failed ordinary height drag and misleading07/08 names are expressly corrected: only width1100 at retained height900 is claimed, not ordinary1100x700. Optical1100x700 evidence remains distinct. Root owns these native observations; I did not inspect GUI or re-establish screenshot claims in this review.
|
||||
|
||||
All local Markdown links from the two new narrative documents resolve. Fresh output CLI usage and portable verifier invocation agree with their interfaces. Original-host `--originals` and staged `--git-index` scope is explicit; host-specific checker relocation is not confused with a portable historical replay or new build acceptance. Independently read index totals agree:29 files including index,17465556 stored bytes,1805 members,86189726 uncompressed bytes,1823 original-file comparisons. Index SHA-256 agrees with README: `7bf2380b49c307fd24ff0289586668359e24947f40630f9f05442bc74a6205a1`. Content verification pass is attributed to parent and separated from acceptance; it was not rerun here.
|
||||
|
||||
Category-critique statements are scoped as deductions about the stated patterns/phase and frozen witnesses, not a native rendering or perception result. No broader source implementation or external-source verification is claimed by this final narrative review. This note is outside the frozen packet.
|
||||
@@ -0,0 +1,77 @@
|
||||
# Category stroke decision: independent bounded critique
|
||||
|
||||
2026-10-01. Evaluator: candidate_blind_reading. This is an informed source/geometry critique, not another first-exposure reading. I know the earlier images and now the semantic answer data. Root owns issue #38 and the frozen optical experiment. No implementation, Cargo, GUI interaction, Gitea activity, or other file edit was performed. Earlier reading evidence remains unchanged.
|
||||
|
||||
## Recommendation
|
||||
|
||||
Keep the two-pattern proposal as a bounded category-encoding feasibility experiment, not a candidate sufficient to close individual ownership/continuity. With no fresh reader, only mechanical hypotheses can pass; perception and editing remain pending. There is already a deductive negative result for same-kind shared-prefix identity, and a short-route counterexample to universal category distinguishability. Do not tune phases around the known label crossing. Freeze this exact proposal once, inspect mechanical failures, and require a materially new hypothesis before another variation.
|
||||
|
||||
Exact drawn-centerline preservation and paint-order preservation must be stated separately from preservation of ink support. Dashing necessarily changes ink support. The proposal preserves centerlines, not every painted pixel. If “exact drawn path” forbids gaps as well, the dash trial itself is outside that invariant.
|
||||
|
||||
## Frozen input identities
|
||||
|
||||
SHA-256, read directly from the exact requested files:
|
||||
|
||||
| File relative to C:/ar-focus-01a0d717 | SHA-256 |
|
||||
| --- | --- |
|
||||
| `.local/focus-native/eight/output/scene.json` | `c595f5c2a49975e466809447a51f920598120b4630935dcd48f6ec7b5de0cb9a` |
|
||||
| `.local/focus-native/eight/output/project.json` | `77f69b6fee2d2efd841a0a5f9518bf41704271838a47d2803ae3005a413a27d8` |
|
||||
| `.local/semantic-connection-next.md` | `11f2c516b8762fd5e524c2f1f84acf6a87421549abe2fffce054814ddefba05b` |
|
||||
|
||||
The scene contains 12 projected/routed relations: four Allocation, four PortAllocation, two FunctionalExchange, one BoundaryExchange, and one ChainInvolvement. All projected trace flags are false. A universal “solid means exchange” legend would therefore be wrong even in this scene.
|
||||
|
||||
## Reconfirmed witnesses
|
||||
|
||||
The Project relation bodies identify `09eaa992-4cdf-5ea3-b748-f10fd74b8cba` and `e53b7a40-e8a3-5b3f-826d-c2b5c164a84a` as PortAllocation. Both start at port `e6d69cbd-99d7-596b-bbe3-dada6118a600`, Repair service provider, owned by Field technician. Their different target ports, both owned by Repair valve in the field, are respectively `d2113fb0-a531-54ef-9484-13951b00ab8f` (Request field repair input) and `994faed7-dbc8-5b96-9d62-7604ac0fbc3a` (Report repair result output). Both are projected oriented=true; their routed labels are empty despite different semantic names.
|
||||
|
||||
Their route points are:
|
||||
|
||||
- First: (1180,89.5), (1162,89.5), (1065,89.5), (1065,361), (1083,361).
|
||||
- Second: (1180,89.5), (1162,89.5), (1065,89.5), (1065,468), (1083,468).
|
||||
|
||||
The common prefix length is 115 + 271.5 = 386.5 world units, including x=1065, y=89.5..361. This is not merely an exact-segment match: the second route's longer vertical segment partially overlaps the first.
|
||||
|
||||
BoundaryExchange `63009b5f-539e-5914-b630-ec6b7fefb4d5`, Technician service conversation, connects Repair service client on Pressure coordination service to Repair service provider on Field technician. Its Project and projection both say unoriented. The label bounds are x=1180..1413, y=262.5..286.5; its actual route anchor is (1162,274.5), outside those bounds to the left.
|
||||
|
||||
Ordinary Allocation `725f2e1b-aa2c-5615-9b1f-28da178168fa` connects Field technician to Repair valve in the field. Its path is (1312.5,161), (1312.5,179), (1312.5,325), (1216,325), (1216,343). Thus its vertical stroke crosses the entire 24-unit height of the unrelated conversation label bounds. This confirms a geometric label-bounds conflict; exact glyph occlusion is a separate raster question.
|
||||
|
||||
## What the proposed trial can and cannot establish
|
||||
|
||||
The proposed zero-phase Allocation [12,4] and PortAllocation [12,4,3,4] patterns start identically: ink at s=0..12, gap at 12..16, ink at 16..19. Any source-aligned edge of length at most 19 units has the same dash mask under either category, assuming the same cap/join/width. This refutes universal category recognition from the stroke alone, before perception enters. A cropped shared prefix of that length has the same limitation. It does not refute possible recognition on sufficiently long unobscured routes.
|
||||
|
||||
For the offending Allocation, distance from its source is s=y-161 along the crossing segment. With [12,4], the intersection with the conversation label bounds still has ink at y=262.5..269 and 273..285, totaling 18.5 of 24 world units. The label center y=274.5 is in an ink interval. The proposal therefore cannot eliminate this crossing; it can only change how its category is interpreted or reduce some interference. This calculation assumes the specified continuous phase and ignores cap extension, which can only complicate the raster footprint. Deliberately phase-shifting this one route to evade the known text would become an answer-specific label intervention, not a clean category trial.
|
||||
|
||||
For the two PortAllocations, the same kind, source, ordered path prefix and phase imply the same dash mask along the full common prefix. An observer of that local ink has no code carrying which of the two identities is present. Repainting equal opaque interior ink is idempotent. Antialias or opacity accumulation may darken edge pixels in a real renderer; that is not a stable identity channel and does not map members to exits. Whole-scene exit tracing may still disclose two relations. Local non-identifiability is not proof that the whole scene is unreadable or the relations are globally inaccessible.
|
||||
|
||||
A later opaque same-width solid stroke can cover a coincident earlier dashed stroke under the preserved paint order. This is a conditional compositing fact, not a claim that every route here is completely hidden. Mixed-kind same-position witnesses should retain edge identities rather than deduplicating geometric segments. Reversing frozen paint order is an adversarial diagnostic only: it violates the baseline-order condition and must not count as the candidate's ordinary pass.
|
||||
|
||||
The stronger statement “exact centerlines plus exact paint order make all individual identity mathematically impossible” is too broad. Additional per-edge annotations, codes, width/color/phase, interaction, or endpoints can convey identity while centerlines stay fixed. The impossibility proven here depends on the narrower proposal: kind-only equal paint, equal phase on coincident prefixes, no added identity channel. Exact centerline preservation does categorically exclude separated lanes and crossing bridges that move those centerlines. Same-distance pointer input alone also cannot select both coincident members uniquely without extra state, cycling, a chooser, or a distinct target; dash styling does not add that input information.
|
||||
|
||||
With fresh reading unavailable, feasible checks can falsify wrong category mapping, missing visible instances, phase resets at bends, label/marker damage, scale collapse, order dependence, and native/export mismatch. At scale .515 the short mark is 1.545 screen units and the gap 2.06; at .85 they are 2.55 and 3.4. These are arithmetic, not readability results. An informed agent can report obvious defects but cannot produce a new first-reading success. No raster check, style implementation, or editing verification was performed by this critique.
|
||||
|
||||
## Materially distinct choices
|
||||
|
||||
| Candidate | Cognitive load and type recognition | Individual identity | Direct editing and export consequence | Bounded judgment |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| Proposed categorical dashes | Two learned patterns; monochrome-compatible in principle; short prefixes identical and small marks scale down | No member distinction on identical same-kind prefix | Keep continuous hit corridor despite gaps; share phase policy with export and verify native caps/joins/scale | Small reversible feasibility trial only |
|
||||
| Categorical color with continuous strokes | May make long-route following easier; depends on color perception, print and existing warning/selection meanings | Same-category overlaps remain identical | Existing geometry/hits can remain; color management/export needs checking | Distinct hypothesis, not an automatic rescue or current implementation request |
|
||||
| Type words or swatches beside labels | Explicit vocabulary lowers legend recall but increases text and clutter; unnamed edges need a policy | Category is still not relation identity; detached labels can remain misassociated | New bounds/occlusion/label-hit rules and export parity needed | Cannot repair this witness merely by prefixing a known name |
|
||||
| Explicit member disclosure plus selection | Interaction reveals actual names/endpoints with little persistent ink | Can expose coincident members when carefully designed | Must avoid arbitrary first-member drag; coordinate with contextual-selection ownership; static export loses interactive disclosure | Separate workflow remedy, not unselected-reading evidence |
|
||||
| Individual lanes | More ink and tracking burden but potentially continuous, separately targetable paths | Can distinguish members if lane-to-edge mapping and transitions remain stable | Requires shared draw/pick/label/bounds/export geometry; preserve actual endpoints and editing settlement | Incompatible with exact drawn-centerline preservation; requires a new decision |
|
||||
| Explicit bundle count/membership | Reduces repeated tracks, but a trunk may imply a semantic junction | Count reveals multiplicity, not exit-to-member correspondence | Needs member-access/editing contract and export explanation | Do not silently merge relations or call count alone continuity |
|
||||
|
||||
A kind-only endpoint marker would have the same identity limitation and would alter the proposal's marker-preservation condition. Filtering difficult relations would change the task rather than solve it.
|
||||
|
||||
## Primary-source comparison and limits
|
||||
|
||||
At official Capella commit `16e0e21c36ac933172e4dd50a58b3e6a287ef502`, System Architecture Blank's `CA PortRealization FunctionPort to ComponentPort` mapping has domainClass PortAllocation, dash style, no target decoration, width expression 2, and conditional orange/green colors. The adjacent ComponentPortAllocation mapping uses a different semantic class and blue style without an explicit dash attribute. This supports type-dependent notation as an existing design choice; it does not establish the proposed numeric dash arrays, two-category taxonomy, or Arcadia Studio's arrow semantics. [Pinned Capella context.odesign, lines 3537–3630](https://github.com/eclipse-capella/capella/blob/16e0e21c36ac933172e4dd50a58b3e6a287ef502/core/plugins/org.polarsys.capella.core.sirius.analysis/description/context.odesign#L3537).
|
||||
|
||||
Official Sirius documentation describes optional label-to-edge attachment links shown on selection and jump links for crossings. It cautions that configured modelers expose different features. These mechanisms distinguish assisted label ownership and crossings; neither demonstrates independent identity along a long same-kind coincident run. [Sirius diagram guide, attachment links](https://eclipse.dev/sirius/doc/user/diagrams/Diagrams.html#Displayattachmentlinkbetweenedgeanditslabels) and [diagram guide](https://eclipse.dev/sirius/doc/user/diagrams/Diagrams.html).
|
||||
|
||||
Sources were retrieved read-only; the Capella repository commit was resolved through its official GitHub API tree. Research stopped after these notation facts: additional product comparisons cannot reverse the prefix non-identifiability proof. No production notation standard or fresh-reader improvement is claimed.
|
||||
|
||||
## Admission and stopping decision
|
||||
|
||||
Before a future experiment, freeze full semantic/projected/routed values, pattern phase and composition order, and distinguish unchanged centerlines from changed ink. Preserve all 12 relations. First check short-edge equality, same-kind prefix equality and foreign-label ink coverage as explicit negative controls. Export and native consumers must agree on the policy, then actual raster evidence must check the result; matching attributes alone are insufficient.
|
||||
|
||||
A successful mechanical implementation would establish only a new available category cue. A sufficient issue #38 remedy still requires separate evidence of correct relation ownership/orientation with unresolved alternatives recorded, and applicable direct-editing checks. If category recognition improves while critical ownership remains uncertain, the next decision concerns which identity channel or geometry invariant may change. Repeating dash variations cannot create absent same-kind identity information.
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"tested_source": "38789512626cb24f78f274998977fc8c6cf960d1",
|
||||
"source_inputs_unchanged": 533,
|
||||
"diff_check_exit_code": 0,
|
||||
"stdout_bytes": 0,
|
||||
"stderr_bytes": 0
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
"""Verify the optical packet without extracting archives or rewriting evidence."""
|
||||
from pathlib import Path, PurePosixPath
|
||||
import argparse
|
||||
import hashlib
|
||||
import json
|
||||
import subprocess
|
||||
import zipfile
|
||||
|
||||
|
||||
def require(condition, message):
|
||||
if not condition:
|
||||
raise AssertionError(message)
|
||||
|
||||
|
||||
def digest(data):
|
||||
return hashlib.sha256(data).hexdigest()
|
||||
|
||||
|
||||
def safe_name(name):
|
||||
path = PurePosixPath(name)
|
||||
require(not path.is_absolute() and '..' not in path.parts and '\\' not in name,
|
||||
f'Unsafe packet path: {name}')
|
||||
return path
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('--originals', action='store_true', help='Also compare retained original host files')
|
||||
parser.add_argument('--git-index', action='store_true', help='Also compare staged Git bytes')
|
||||
args = parser.parse_args()
|
||||
packet = Path(__file__).resolve().parent / 'evidence'
|
||||
index_bytes = (packet / 'index-final.json').read_bytes()
|
||||
index = json.loads(index_bytes)
|
||||
require(index['source'] == '38789512626cb24f78f274998977fc8c6cf960d1', 'Unexpected tested source')
|
||||
rows = index['files']
|
||||
names = [row['path'] for row in rows]
|
||||
require(len(names) == len(set(names)) == index['standalone_file_count'], 'Duplicate or missing file inventory')
|
||||
actual = {path.relative_to(packet).as_posix() for path in packet.rglob('*') if path.is_file()}
|
||||
require(actual == set(names) | {'index-final.json'}, 'Uninventoried or missing packet files')
|
||||
total = 0
|
||||
for row in rows:
|
||||
safe_name(row['path'])
|
||||
data = (packet / row['path']).read_bytes()
|
||||
require(len(data) == row['bytes'] and digest(data) == row['sha256'], f'Changed packet file: {row["path"]}')
|
||||
total += len(data)
|
||||
require(total == index['standalone_bytes'], 'Wrong standalone byte total')
|
||||
archive_count = archive_bytes = originals = 0
|
||||
for archive in index['archives']:
|
||||
inventory = json.loads((packet / archive['member_inventory']['path']).read_bytes())
|
||||
members = inventory['members']
|
||||
expected = {row['path']: row for row in members}
|
||||
require(len(expected) == len(members) == archive['member_count'] == inventory['member_count'], 'Duplicate member inventory')
|
||||
size = 0
|
||||
with zipfile.ZipFile(packet / archive['archive']['path']) as zipped:
|
||||
listed = zipped.namelist()
|
||||
require(len(listed) == len(set(listed)) and set(listed) == set(expected), 'Wrong or duplicated ZIP members')
|
||||
for name in listed:
|
||||
safe_name(name)
|
||||
row = expected[name]
|
||||
data = zipped.read(name)
|
||||
require(len(data) == row['bytes'] and digest(data) == row['sha256'], f'Changed archived member: {name}')
|
||||
size += len(data)
|
||||
if args.originals:
|
||||
require(Path(row['original_source_path']).read_bytes() == data, f'Archived bytes differ from original: {name}')
|
||||
originals += 1
|
||||
require(size == archive['uncompressed_bytes'] == inventory['uncompressed_bytes'], 'Wrong archive byte total')
|
||||
archive_count += len(members)
|
||||
archive_bytes += size
|
||||
require(archive_count == index['archived_member_count'] and archive_bytes == index['archived_uncompressed_bytes'], 'Wrong archive total')
|
||||
if args.originals:
|
||||
for row in index['copied_sources']:
|
||||
require((packet / row['path']).read_bytes() == Path(row['original_source_path']).read_bytes(), f'Copied original differs: {row["path"]}')
|
||||
originals += 1
|
||||
if args.git_index:
|
||||
root = Path(subprocess.check_output(['git', 'rev-parse', '--show-toplevel'], cwd=packet, text=True).strip())
|
||||
for path in sorted(actual):
|
||||
relative = (packet / path).relative_to(root).as_posix()
|
||||
staged = subprocess.check_output(['git', 'show', ':' + relative], cwd=root)
|
||||
require(staged == (packet / path).read_bytes(), f'Staged bytes differ: {relative}')
|
||||
print(json.dumps({'status': 'PASS', 'tested_source': index['source'],
|
||||
'index_sha256': digest(index_bytes), 'packet_files': len(actual),
|
||||
'packet_bytes': total + len(index_bytes), 'archive_members': archive_count,
|
||||
'uncompressed_archive_bytes': archive_bytes, 'original_files_compared': originals,
|
||||
'staged_bytes_checked': args.git_index}, indent=2))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -0,0 +1,215 @@
|
||||
# Two-axis Focus optical result — 2026-10-01 PDT
|
||||
|
||||
This is a bounded experiment for [issue 38](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/38),
|
||||
tested at source **38789512626cb24f78f274998977fc8c6cf960d1** on
|
||||
`codex/focus-workspace-experiment-01a0d717-20261001`. The
|
||||
[predeclared plan](experiments/focus-optical-20261001/plan.md) defines the question,
|
||||
fixed inputs, alternatives and acceptance limits. [PROJECT_GOAL.md](../PROJECT_GOAL.md)
|
||||
remains authoritative. This result does not complete dense-diagram usability,
|
||||
accept an editable Focus workspace, or alter a published release.
|
||||
|
||||
## Result and decision
|
||||
|
||||
Recovering both canvas axes gives a substantial full-scene magnification gain on
|
||||
the mixed and nested examples. The ordinary small view correctly remains at the
|
||||
existing 150% Fit clamp at full window size. Retain Focus as a useful workspace
|
||||
hypothesis; **do not promote it as a sufficient readability remedy**. Parent
|
||||
inspection still sees foreign-line label crossings and shared allocation runs.
|
||||
No new unassisted reading was obtained: a fresh-reader spawn failed with `agent
|
||||
thread limit reached`, and existing readers know the semantic answer key.
|
||||
Assisted inspection and magnification do not substitute for that gate.
|
||||
|
||||
All entries below use logical client **1440 × 900**, observed Iced window scale
|
||||
**1.0**, the same pinned executable/runtime and the complete admitted Project.
|
||||
Native screenshots include decorations and are 1442 × 932; those dimensions are
|
||||
not the client size. Zoom values are rounded here; raw measurements retain their
|
||||
full f32 values.
|
||||
|
||||
| Complete saved view | Nodes / ports / edges | Baseline canvas / Fit | Focus canvas / Fit | Magnification ratio |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| Mixed eight-card traceability | 8 / 6 / 12 | 824 × 535 / 0.5152723 | 1440 × 824 / 0.9243028 | 1.7938144 |
|
||||
| Nested OA allocation | 12 / 0 / 7 | 824 × 540.6 / 0.72186 | 1440 × 824 / 1.20872 | 1.6744548 |
|
||||
| Nested SA allocation | 12 / 20 / 12 | 824 × 540.6 / 0.66568 | 1440 × 824 / 1.04865 | 1.5753145 |
|
||||
| Small OA functional dataflow | 3 / 0 / 1 | 824 × 574.6 / 1.5 | 1440 × 824 / 1.5 | 1.0 |
|
||||
|
||||
Each case starts Baseline → Focus → Baseline at the same window/DPI. Returned
|
||||
Baseline viewport, camera, header height, client and scale match exactly. Actual
|
||||
width and height resizes then produce client **1100 × 700** and newer measurement
|
||||
generations. In the mixed view, Baseline becomes 484 × 335 at 0.2895086 and Focus
|
||||
1100 × 624 at 0.6985392; its resized Baseline return also matches. Resized OA/SA
|
||||
and small cases retain their complete content. All 22 measurement captures pass
|
||||
whole-value/byte conservation and independently recomputed Fit checks.
|
||||
|
||||
The original eight-card source is unchanged: 138661 bytes, SHA-256
|
||||
`9db1015369f450d5810c96a01fddb8a009d57f6aafbda5182703f15ded23d9c8`.
|
||||
It contains one preexisting `work_without_behavior_context` warning; the exact
|
||||
independently retained baseline agrees. The unrelated routing-workshop and
|
||||
coastal-rescue sources are schema3 and are admitted through the identified
|
||||
production decoder into schema7. Their complete migration reports and 29 / 5
|
||||
warnings are inventoried, with no admission errors. OA and SA runs of the same
|
||||
legacy file yield equal complete admitted Projects and diagnostics. The Python
|
||||
checker does not independently regenerate those migrations or establish a
|
||||
predeclared legacy-warning baseline.
|
||||
|
||||
## Architecture and mechanical verification
|
||||
|
||||
The opted-in runner freezes a validated Project and uses `App::with_project`
|
||||
only to present Baseline chrome. It admits Architecture diagrams only, synchronizes
|
||||
layer/Explorer/create-kind state, and verifies complete Document admission. A
|
||||
pre-dispatch inert wrapper excludes child input, focus operations, overlays and
|
||||
clipboard access. The canvas adapter calls the production `DiagramCanvas::draw`
|
||||
with fresh optical state and an unavailable cursor; it cannot dispatch the
|
||||
production App reducer or subscription. No route, core, model, schema, label,
|
||||
port or endpoint-marker implementation is changed.
|
||||
|
||||
Private generation-stamped layout owns viewport and Fit. Header/client/scale
|
||||
measurement and a later matching draw acknowledgment gate capture; every actual
|
||||
resize invalidates readiness. The acknowledgment proves CPU draw invocation,
|
||||
**not GPU completion**. Visible native captures supply separate display evidence.
|
||||
Terminal faults refuse queued captures; Close always attempts a truthful,
|
||||
create-new PASS/FAIL receipt and exits rather than trapping the window.
|
||||
|
||||
Baseline uses the real body, navigation, docks, palette, tool rows and footer.
|
||||
Its header replaces only the action area, using the shared production header.
|
||||
Measured Baseline header height is 67.39999389648438; Focus uses a 48-unit header
|
||||
and 28-unit status row. Ordinary opt-out launch shows Home and the original
|
||||
New/Hosted models/Open/Save as/Save all controls. A native Open of the exact copied
|
||||
eight-card input, OA → SA navigation and selection of the saved mixed diagram
|
||||
work normally. At 1440 × 900 and at width1100, header and canvas boundaries align
|
||||
visually with optical Baseline; this is visual comparison, not an instrumented
|
||||
normal-header measurement or pixel-equality claim.
|
||||
|
||||
Windows verification uses Rust1.98.1, `x86_64-pc-windows-gnullvm`, LLVM-MinGW
|
||||
20260826 UCRT, jobs1 and incremental compilation disabled. Tests and executable
|
||||
are dev/unoptimized with debug assertions. The serialized gate records 533
|
||||
unchanged source-input hashes:
|
||||
|
||||
```powershell
|
||||
cargo fmt --all -- --check
|
||||
cargo test --locked -p oa-desktop -- focus_optical diagram:: --test-threads=1
|
||||
cargo clippy --locked -p oa-desktop --all-targets -- -D warnings
|
||||
cargo build --locked -p oa-desktop --bin arcadia-studio
|
||||
```
|
||||
|
||||
All pass: **92 tests, zero failed/ignored, 1466 filtered**. These include nine
|
||||
optical tests for actual spy-widget input/focus/overlay exclusion, draw-only
|
||||
behavior, exact Fit, stale/repeated sizing, invalid admission, schema3/SA
|
||||
coherence, opt-in dispatch and terminal-fault/Close recovery. This is not a new
|
||||
full-suite or workspace gate. Initial formatting failed; its 79955-byte stdout
|
||||
and exit1 are retained, followed by successful formatting and the final check.
|
||||
|
||||
Pinned executable: 121832448 bytes, SHA-256
|
||||
`1be6034951f664b493c5cf7ab806618e216dc840f30ea849dc2354893ab195e4`.
|
||||
Pinned `libunwind.dll`: 190976 bytes, SHA-256
|
||||
`f45604a12e8bcd839fd86f667c1be1cc7c4f9da2b3c69ff381ac708f0e1ae7d4`.
|
||||
Five actual native processes exit normally with code0 and empty stdout/stderr:
|
||||
mixed3356, OA9180, SA5324, small8268 and ordinary4568. All binary and optical
|
||||
input hashes remain unchanged. Ordinary's separately copied input is checked
|
||||
by the parent outside its fixture-null launcher receipt.
|
||||
|
||||
## Review, falsifiers and remaining limits
|
||||
|
||||
Independent proposal/source review preceded compilation. It found stale capture
|
||||
after terminal fault and a Close path that could trap the window; both were
|
||||
fixed before the tested build. The original source review pins its preformat
|
||||
handoff and does not retrospectively claim compilation/native coverage.
|
||||
|
||||
Independent evaluator review showed that the first checker accepted wrong case
|
||||
attribution, a wrong diagram, stale generation and zero scale. It also accepted a
|
||||
synthetic four-case corpus made by copying the mixed case. Those artificial data
|
||||
are confined to the inventoried review corpus. The authorized repair recomputes
|
||||
fixed binary/input hashes, checks launcher/admission/capture identity and raw
|
||||
logs, requires finite positive measurements and neutral state, and verifies
|
||||
generation transitions. The original checker and failed probes are preserved.
|
||||
|
||||
Parent reviewed the repair and executed it once against all four actual cases:
|
||||
exit0, stderr0; final report SHA-256
|
||||
`0ba442b4eff4138821baa1a2687d8af2f38aa8c3a5016a8abc4985722926a402`.
|
||||
Checker SHA-256 is
|
||||
`8b88f148e6a4137375d9784494a15c894c45bb8f3c2379ea2bc954e68c61421f`.
|
||||
It compares complete Project/scene/SVG bytes over time and rounds each independent
|
||||
Fit arithmetic intermediate to f32 using recorded bounds and viewport. It does
|
||||
not independently regenerate projection/routing, validate semantic correspondence
|
||||
to SVG, measure glyph ink, prove screenshot freshness or supply first-reading
|
||||
acceptance. A coordinated root-and-all-capture scene mutation remains accepted
|
||||
and explicitly demonstrates that scope limit. Fabricated non-null migration
|
||||
metadata and erased legacy warnings likewise expose the declared migration/
|
||||
legacy-baseline limits rather than a passed semantic evaluator.
|
||||
|
||||
A different reviewer independently checked the repaired evaluator and all four
|
||||
actual cases, verified the 533 gate source hashes and raw log sizes, and rejected
|
||||
twelve further isolated mutations. No blocker was found within temporal
|
||||
conservation and recorded-bounds f32 Fit scope. That reviewer authored the Rust
|
||||
runner, so this is an independent review of the checker/evidence, not a fresh
|
||||
review of their own runner. They also compared the complete actual OA/SA migration
|
||||
objects (equal, from3/to7, one generated interface allocation,37 semantic
|
||||
defaults) and inventoried the small report (20 defaults); no required resolutions
|
||||
or unresolved message values occur. Their original report, probe and full
|
||||
reviewed-file inventory are preserved alongside the prior source/evaluator reviews.
|
||||
|
||||
Native failure probes remain visible in the evidence. An initial body-border
|
||||
drag did not resize. A later attempt to grow the window beyond screenshot bounds
|
||||
was rejected by Computer Use before input; no post-resize restoration to the
|
||||
original window size is claimed. The initial same-size return remains exact.
|
||||
Indexed Open-dialog actions did not activate Open; a refreshed coordinate click
|
||||
did, followed by settled native verification. Ordinary screenshots named
|
||||
`01-normal-loaded-model` and `02-normal-load-settled` still show the dialog;
|
||||
`03-normal-load-visible` is the actual completed load. The ordinary height drag
|
||||
also left the screenshot at 1102 × 932: filenames `07-normal-small-exact-eight`
|
||||
and `08-normal-resize-settled` do **not** establish a 1100 × 700 ordinary run.
|
||||
No literal text was injected into inert Inspector controls without verified
|
||||
focus. Canvas drag and Delete attempts had no effect; capture004 preserved the
|
||||
complete mixed model/scene/SVG afterward.
|
||||
|
||||
Named DataAssociation ends, broad projection coverage, other fonts/DPI,
|
||||
accessibility, manual camera, editable lifecycle, save/history, held gestures and
|
||||
pending navigation remain outside this experiment. Linux/WSL is user-deferred.
|
||||
Peer #43 and other owned/paused work are untouched. A later editable promotion
|
||||
requires the lifecycle gates in the plan; a notation follow-up must distinguish
|
||||
relationship category from individual identity on shared paths.
|
||||
|
||||
The [independent next-candidate critique](experiments/focus-optical-20261001/next-category-critique.md)
|
||||
reconfirms those witnesses in the frozen current scene. The proposed two dash
|
||||
patterns are identical for their first19 units; the specified Allocation pattern
|
||||
still paints18.5 of the24 units through the conversation-label bounds, including
|
||||
its center. Identical kind/phase cannot encode member identity on a shared prefix.
|
||||
These are deductive limits under the proposed phase/centerline policy, not a
|
||||
native dash-rendering trial or proof that whole-scene tracing is impossible.
|
||||
The critique pins primary Capella notation precedent and compares interaction,
|
||||
labels, lanes and bundles; no numeric dash vocabulary or next renderer is adopted.
|
||||
|
||||
## Reproduction and evidence
|
||||
|
||||
Build the identified source with the environment above; general platform setup
|
||||
is in [README](../README.md) and [Windows packaging](../docs/windows-packaging.md).
|
||||
No private executable or package is published for this experiment. The existing
|
||||
[save-diagnostics release](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/releases/tag/v0.2.0-preview.save-diagnostics.20261001)
|
||||
remains the latest delivered production scope.
|
||||
|
||||
Launch the experimental binary with an unchanged JSON, its saved Architecture
|
||||
diagram UUID and a **fresh** evidence destination, for example:
|
||||
|
||||
```powershell
|
||||
& '<binary-directory>\arcadia-studio.exe' --focus-optical `
|
||||
'<checkout>\harness\experiments\focus-optical-20261001\eight-card.json' `
|
||||
'00000000-0038-4000-8000-000000000001' '<fresh-output-directory>'
|
||||
```
|
||||
|
||||
Wait for readiness, capture Baseline, switch/capture Focus, return/capture
|
||||
Baseline, exercise actual resizing and close normally. The remaining UUIDs and
|
||||
exact fixture hashes are in the plan. Launch without the flag to exercise the
|
||||
normal application. Matching DLL/toolchain provenance is required for the
|
||||
recorded Windows environment.
|
||||
|
||||
The raw packet preserves watcher/runner receipts, complete inputs/models/scenes/
|
||||
SVGs, screenshots, logs, failed probes, gates, helpers and original review
|
||||
challenges. Host-specific QA helpers deliberately pin this source/build and
|
||||
create new outputs; on another host adapt paths only, preserve hashes and
|
||||
identities, and retain those adaptations separately. They must not point at
|
||||
synthetic challenge data as though it were native output. The packet inventory
|
||||
and [independent final checker review](experiments/focus-optical-20261001/evidence/reviews/final-review.md)
|
||||
are linked from the [experiment entrypoint](experiments/focus-optical-20261001/README.md).
|
||||
The [final index](experiments/focus-optical-20261001/evidence/index-final.json)
|
||||
covers 29 files / 17465556 stored bytes and 1805 archived members. Parent's
|
||||
portable content verifier passes with all 1823 retained originals compared;
|
||||
this is byte-integrity evidence, separate from the experiment's acceptance.
|
||||
Reference in New Issue
Block a user