Archive verified Details and Preview restoration evidence

This commit is contained in:
2026-09-22 11:49:23 -07:00
154 changed files with 61507 additions and 0 deletions
@@ -0,0 +1 @@
* -text whitespace=-blank-at-eol,-blank-at-eof,cr-at-eol
@@ -0,0 +1,13 @@
# Closed feab Details/Preview evidence
Tested source **feab2020d8e5b6bfdb59c86ab4aee161617b8b6f**. This archive supports the narrow native Details/Preview restoration, explicit reset and Cancel/Save unchanged-byte workflow. It is not full rename, Text-union, package or optimized-release acceptance.
- [Independent review](raw/rename-scroll-feab202-native-independent-review-20260913.md) and [read-only audit](raw/rename-scroll-feab202-native-independent-audit-20260913.json).
- [Twenty original JPEGs and notes](raw/native-qa/rename-scroll-feab202-20260913-01/evidence), [closure](raw/native-qa/rename-scroll-feab202-20260913-01/closure.json), and [six-file checkpoint](raw/native-qa/rename-scroll-feab202-20260913-01/checkpoints/cancel-save/result.json).
- [Closed gates and GUI metadata](raw/rename-scroll-gates-20260913), including original bebf4/1 failure; [test correction review](raw/navigation-preview-scroll-test-correction-independent-review-20260913.md).
- [Pinned preparation](raw/rename-scroll-gate-preparation-r3-20260913) and [source seams](source/crates/oa-desktop/src).
- Original440 failure043-045 remains in [the immutable existing archive](../navigation-native-440-20260913/raw/trial/evidence) at commit3c22fe2629fc242714d32805790262fa2c4e33b9. The manifest references its exact original bytes.
From a checkout containing feab and3c22, run `python -B harness/experiments/rename-scroll-feab202-20260913/verify.py --git-ref HEAD`. Before commit, omit `--git-ref`; `--index` verifies staged archive blobs. The standard-library verifier checks membership/hashes, original references, source615/gate581 scope, actual closed outcomes and native checkpoint bindings. It executes only Git reads; no saved launcher, compiler or application runs. `archive-builder.py` is historical original-host provenance, not a portable launch instruction.
Original receipts retain absolute local paths and earlier UNRUN statements as history. Portable links are this README and the manifest original-path map. Executables/runtime/cache/profile/temp are omitted; their exact recorded identities remain in receipts and the independent audit. The final source-work tree was independently checked identical to the included baseline/checkpoint; it is omitted as redundant. The private Desktop picker warning, operator input/capture retries and frame003 stale title metadata remain disclosed in the review. No original failures or image bytes were rewritten.
@@ -0,0 +1,118 @@
"""Original-host evidence copy recipe. Does not launch saved helpers or applications."""
from pathlib import Path
import hashlib, json, subprocess, sys
if sys.flags.optimize:
raise SystemExit('Optimized Python forbidden')
ROOT = Path(__file__).resolve().parent.parent
WORK = ROOT / '.local/rse'
REL = Path('harness/experiments/rename-scroll-feab202-20260913')
OUT = WORK / REL
SOURCE = 'feab2020d8e5b6bfdb59c86ab4aee161617b8b6f'
BASE = '9e51cd72ba05d37482c5bc258e284804058a1475'
OLD = '3c22fe2629fc242714d32805790262fa2c4e33b9'
TRIAL = '.local/native-qa/rename-scroll-feab202-20260913-01'
GATES = '.local/rename-scroll-gates-20260913'
PREP = '.local/rename-scroll-gate-preparation-r3-20260913'
def require(value, message):
if not value:
raise ValueError(message)
def identity(data):
return {'bytes': len(data), 'sha256': hashlib.sha256(data).hexdigest()}
def read(path):
return json.loads(path.read_bytes())
def git(*args):
return subprocess.check_output(['git', '-c', 'core.longpaths=true', *args], cwd=WORK)
require(git('rev-parse', 'HEAD').decode().strip() == BASE, 'Wrong documentation base')
require(not git('status', '--porcelain'), 'Documentation worktree not clean')
require(not OUT.exists(), 'Refusing overwrite archive')
require(read(ROOT / TRIAL / 'closure.json')['exit'] == 0, 'Native process not closed')
selected = set()
for folder in [TRIAL, GATES, PREP, '.local/rename-scroll-gate-preparation-20260913']:
for p in (ROOT / folder).rglob('*'):
relative = p.relative_to(ROOT).as_posix()
if p.is_file() and not p.is_symlink():
if folder == TRIAL and any(part in ('profile', 'temp', 'working-directory', 'source-work') for part in p.relative_to(ROOT / TRIAL).parts):
continue
if p.suffix.lower() not in ('.exe', '.dll', '.pdb', '.rlib', '.rmeta'):
selected.add(relative)
for pattern in ['rename-scroll-native-*', 'navigation-preview*scroll*', 'rename-scroll-checkpoint-proof-feab202.json']:
selected.update(p.relative_to(ROOT).as_posix() for p in (ROOT / '.local').glob(pattern) if p.is_file())
selected.update([
'.local/rename-scroll-feab202-native-independent-review-20260913.md',
'.local/rename-scroll-feab202-native-independent-audit-20260913.json',
'.local/native-qa/rename-scroll-stage-feab202-20260913-01/manifest.json',
])
expected = read(ROOT / PREP / 'expected.json')
selected.update(expected['baseline_and_original_helper_pins'])
preparation = read(ROOT / TRIAL / 'preparation.json')
old_manifest = read(ROOT / 'harness/experiments/navigation-native-440-20260913/manifest.json')
old_by_original = {r['original']: r for r in old_manifest['files'] if 'original' in r}
references = []
omitted = []
for original, bound in preparation['records'].items():
original = original.replace('\\', '/')
require(identity((ROOT / original).read_bytes()) == bound, 'Original preparation mismatch: ' + original)
if Path(original).suffix.lower() in ('.exe', '.dll'):
omitted.append({'original': original, **bound, 'reason': 'Binary identity retained; executable/runtime omitted'})
elif original in old_by_original:
row = old_by_original[original]
data = git('show', OLD + ':' + row['path'])
require(identity(data) == bound and (WORK / row['path']).read_bytes() == data, 'Historical archive mismatch')
references.append({'path': row['path'], 'commit': OLD, 'original': original, **bound})
else:
selected.add(original)
selected.difference_update(r['original'] for r in references)
OUT.mkdir(parents=True)
rows = []
for original in sorted(selected):
source = ROOT / original
require(source.is_file() and not source.is_symlink(), 'Missing original ' + original)
data = source.read_bytes()
destination = REL / 'raw' / original.removeprefix('.local/')
target = WORK / destination
target.parent.mkdir(parents=True, exist_ok=True)
with target.open('xb') as stream:
stream.write(data)
require(source.read_bytes() == data == target.read_bytes(), 'Copy mismatch ' + original)
rows.append({'path': destination.as_posix(), 'original': original, **identity(data)})
# Record the three source seams without copying an unrelated production tree.
changes = git('diff', '--name-only', '44095f78c28b79d6d085863dc928adba8e24d955', SOURCE, '--', 'crates').decode().splitlines()
require(len(changes) == 3, 'Unexpected source delta')
for path in changes:
data = git('show', SOURCE + ':' + path)
target = OUT / 'source' / path
target.parent.mkdir(parents=True, exist_ok=True)
target.write_bytes(data)
rows.append({'path': target.relative_to(WORK).as_posix(), 'source_commit': SOURCE, 'source_path': path, **identity(data)})
for name, source in [('archive-builder.py', Path(__file__)), ('verify.py', ROOT / '.local/verify-rename-scroll-feab202.py')]:
data = source.read_bytes()
(OUT / name).write_bytes(data)
rows.append({'path': (REL / name).as_posix(), **identity(data)})
readme = '''# Closed feab Details/Preview evidence
Tested source **feab2020d8e5b6bfdb59c86ab4aee161617b8b6f**. This archive supports the narrow native Details/Preview restoration, explicit reset and Cancel/Save unchanged-byte workflow. It is not full rename, Text-union, package or optimized-release acceptance.
- [Independent review](raw/rename-scroll-feab202-native-independent-review-20260913.md) and [read-only audit](raw/rename-scroll-feab202-native-independent-audit-20260913.json).
- [Twenty original JPEGs and notes](raw/native-qa/rename-scroll-feab202-20260913-01/evidence), [closure](raw/native-qa/rename-scroll-feab202-20260913-01/closure.json), and [six-file checkpoint](raw/native-qa/rename-scroll-feab202-20260913-01/checkpoints/cancel-save/result.json).
- [Closed gates and GUI metadata](raw/rename-scroll-gates-20260913), including original bebf4/1 failure; [test correction review](raw/navigation-preview-scroll-test-correction-independent-review-20260913.md).
- [Pinned preparation](raw/rename-scroll-gate-preparation-r3-20260913) and [source seams](source/crates/oa-desktop/src).
- Original440 failure043-045 remains in [the immutable existing archive](../navigation-native-440-20260913/raw/trial/evidence) at commit3c22fe2629fc242714d32805790262fa2c4e33b9. The manifest references its exact original bytes.
From a checkout containing feab and3c22, run `python -B harness/experiments/rename-scroll-feab202-20260913/verify.py --git-ref HEAD`. Before commit, omit `--git-ref`; `--index` verifies staged archive blobs. The standard-library verifier checks membership/hashes, original references, source615/gate581 scope, actual closed outcomes and native checkpoint bindings. It executes only Git reads; no saved launcher, compiler or application runs. `archive-builder.py` is historical original-host provenance, not a portable launch instruction.
Original receipts retain absolute local paths and earlier UNRUN statements as history. Portable links are this README and the manifest original-path map. Executables/runtime/cache/profile/temp are omitted; their exact recorded identities remain in receipts and the independent audit. The final source-work tree was independently checked identical to the included baseline/checkpoint; it is omitted as redundant. The private Desktop picker warning, operator input/capture retries and frame003 stale title metadata remain disclosed in the review. No original failures or image bytes were rewritten.
'''
for name, data in [('README.md', readme.encode()), ('.gitattributes', b'* -text\n')]:
(OUT / name).write_bytes(data)
rows.append({'path': (REL / name).as_posix(), **identity(data)})
manifest = {'schema': 'rename-scroll-feab-evidence-v1', 'source': SOURCE, 'publication_base': BASE, 'files': rows, 'references': references, 'omitted': omitted + [{'original': TRIAL + '/source-work', 'reason': 'Six exact files duplicate included baseline and checkpoint; read-only audit records equality'}, {'original': 'GUI and test executables, private profile/temp/cwd', 'reason': 'No runnable package or personal runtime state included'}]}
(OUT / 'manifest.json').write_text(json.dumps(manifest, indent=2) + '\n', encoding='utf-8', newline='\n')
print(json.dumps({'archive': str(OUT), 'files': len(rows), 'references': len(references), 'manifest': identity((OUT / 'manifest.json').read_bytes())}))
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,142 @@
"""Build identified Windows binaries and preserve Cargo-reported artifacts."""
from pathlib import Path
from datetime import datetime, timezone
import hashlib
import json
import os
import re
import shutil
import subprocess
import sys
root = Path(__file__).resolve().parent.parent
source, name = sys.argv[1:3]
assert re.fullmatch(r'[a-zA-Z0-9-]+', name)
assert subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip() == source
folder = root / '.local/navigation-palette-gates-20260913' / name
folder.mkdir(exist_ok=False)
def digest(path):
raw = path.read_bytes()
return {'bytes': len(raw), 'sha256': hashlib.sha256(raw).hexdigest()}
def write(name, value):
with (folder / name).open('x', encoding='utf-8', newline='\n') as stream:
stream.write(json.dumps(value, indent=2) + '\n')
# A failed spawn, malformed output or artifact admission must also close a receipt.
inputs, artifacts, changed = [], [], []
command, head_after, result = [], None, None
started = datetime.now(timezone.utc).isoformat()
phase, failure, status_after = 'input/tool admission', None, None
try:
scopes = ['Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml', '.cargo', 'build',
'crates', 'assets', 'docs', 'examples', 'harness/fixtures', 'scripts']
paths = subprocess.check_output(['git', 'ls-tree', '-r', '--name-only', source, *scopes], cwd=root).decode().splitlines()
assert not subprocess.check_output(['git', 'status', '--porcelain', '--untracked-files=all', '--', *scopes], cwd=root)
blobs = subprocess.check_output(['git', 'cat-file', '--batch'], cwd=root,
input=''.join(f'{source}:{p}\n' for p in paths).encode())
offset, inputs = 0, []
for path in paths:
end = blobs.index(b'\n', offset)
_, kind, size = blobs[offset:end].split()
assert kind == b'blob'
size = int(size)
raw = blobs[end + 1:end + 1 + size]
assert (root / path).read_bytes() == raw, path
inputs.append({'path': path, 'bytes': size, 'sha256': hashlib.sha256(raw).hexdigest()})
offset = end + size + 2
assert offset == len(blobs)
write('inputs.json', {'source': source, 'inputs': inputs})
environment = {k: v for k, v in os.environ.items() if k in (
'CARGO_HOME', 'RUSTUP_HOME', 'CARGO_TARGET_DIR', 'CARGO_BUILD_JOBS',
'RUSTFLAGS', 'CARGO_ENCODED_RUSTFLAGS', 'RUSTC', 'RUSTC_WRAPPER', 'RUSTC_WORKSPACE_WRAPPER',
'CARGO_BUILD_TARGET', 'CARGO_TARGET_X86_64_PC_WINDOWS_GNULLVM_LINKER')}
tools = {}
for tool, args in [('rustc', ['-Vv']), ('cargo', ['--version']), ('clang', ['--version'])]:
requested = os.environ.get('RUSTC', 'rustc') if tool == 'rustc' else tool
resolved = shutil.which(requested)
assert resolved, f'Required tool unavailable: {requested}'
path = Path(resolved)
tools[tool] = {'path': str(path), **digest(path),
'version': subprocess.check_output([str(path), *args], cwd=root).decode()}
assert 'host: x86_64-pc-windows-gnullvm' in tools['rustc']['version']
write('environment.json', {'environment': environment, 'tools': tools,
'launcher': digest(Path(__file__)), 'profile': 'unoptimized development',
'target_mode': 'Cargo default/configured target; no explicit --target; artifacts require Windows x64 PE'})
command = [tools['cargo']['path'], 'build', '--locked', '--offline', '-p', 'oa-desktop', '-p', 'oa-server',
'--bins', '--message-format=json-render-diagnostics']
started = datetime.now(timezone.utc).isoformat()
print(json.dumps({'start': started, 'source': source, 'command': command}), flush=True)
phase = 'cargo invocation'
with (folder / 'cargo.jsonl').open('xb') as stdout, (folder / 'cargo.stderr.log').open('xb') as stderr:
result = subprocess.run(command, cwd=root, stdout=stdout, stderr=stderr)
ended = datetime.now(timezone.utc).isoformat()
changed = [p['path'] for p in inputs if digest(root / p['path']) != {k:p[k] for k in ('bytes', 'sha256')}]
head_after = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip()
phase = 'Cargo JSON/artifact admission'
messages = [json.loads(line) for line in (folder / 'cargo.jsonl').read_bytes().splitlines()]
finished = [m for m in messages if m.get('reason') == 'build-finished']
artifacts = []
if result.returncode == 0 and not changed and head_after == source:
assert len(finished) == 1 and finished[0]['success'] is True
selected = [m for m in messages if m.get('reason') == 'compiler-artifact'
and m['target']['name'] in ('arcadia-studio', 'arcadia-server')
and m.get('executable') and m['target']['kind'] == ['bin']]
assert len(selected) == 2 and {m['target']['name'] for m in selected} == {'arcadia-studio', 'arcadia-server'}
manifests = {'arcadia-studio': root / 'crates/oa-desktop/Cargo.toml',
'arcadia-server': root / 'crates/oa-server/Cargo.toml'}
for item in selected:
manifest = Path(item['manifest_path'])
if not manifest.is_absolute():
manifest = root / manifest
assert manifest.resolve() == manifests[item['target']['name']].resolve()
assert not item['profile']['test'] and item['profile']['opt_level'] == '0'
assert item['profile']['debug_assertions'], 'Expected a development-profile binary'
origin = Path(item['executable'])
if not origin.is_absolute():
origin = root / origin
origin = origin.resolve()
raw = origin.read_bytes()
assert raw[:2] == b'MZ' and len(raw) >= 64
pe = int.from_bytes(raw[60:64], 'little')
assert raw[pe:pe+4] == b'PE\0\0', 'Expected a PE executable'
assert int.from_bytes(raw[pe+4:pe+6], 'little') == 0x8664, 'Expected Windows x64 PE'
destination = folder / origin.name
with destination.open('xb') as stream:
stream.write(raw)
assert digest(destination) == digest(origin)
artifacts.append({'name': item['target']['name'], 'origin': str(origin),
'preserved': str(destination), **digest(destination), 'cargo_artifact': item})
except Exception as error:
failure = {'phase': phase, 'type': type(error).__name__, 'message': str(error)}
# Recheck after artifact preservation as well, including added/untracked inputs.
try:
changed = [item['path'] for item in inputs
if not (root / item['path']).is_file()
or digest(root / item['path']) != {key: item[key] for key in ('bytes', 'sha256')}]
head_after = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip()
status_after = subprocess.check_output(
['git', 'status', '--porcelain', '--untracked-files=all', '--', *scopes], cwd=root).decode()
except Exception as error:
postflight = {'phase': 'final input admission', 'type': type(error).__name__, 'message': str(error)}
if failure is None:
failure = postflight
else:
failure['postflight'] = postflight
code = result.returncode if result is not None else None
passed = code == 0 and failure is None and not changed and head_after == source and status_after == ''
record = {'source': source, 'head_after': head_after, 'start': started,
'end': datetime.now(timezone.utc).isoformat(),
'exit': code, 'outcome': 'passed' if passed else 'failed', 'failure': failure,
'command': command, 'changed_inputs': changed, 'status_after': status_after, 'artifacts': artifacts,
'launcher': digest(Path(__file__))}
for key, filename in [('inputs', 'inputs.json'), ('environment', 'environment.json'),
('stdout', 'cargo.jsonl'), ('stderr', 'cargo.stderr.log')]:
path = folder / filename
record[key] = digest(path) if path.is_file() else None
write('result.json', record)
print(json.dumps(record))
sys.exit(0 if passed else (code or 1))
@@ -0,0 +1,119 @@
{
"utc": "2026-09-13T12:21:16.179997+00:00",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"label": "cancel-save",
"before": {
"oa.arcadia": {
"bytes": 2364,
"sha256": "c04efaa1ae5a2053e63aac70f79ea7bb845ef1db1ff8e68f23abfe24f1bc180f"
},
"project.arcadia": {
"bytes": 606,
"sha256": "260505b7f54a0d256bce2af8499bb46cc78ffe564628bd5f976ce358d1796f3a"
},
"sa/assurance.arcadia": {
"bytes": 682,
"sha256": "ab76044836e4dcd42a82d316846ec87da2108939aa2037640c5bca1d2ecdee0f"
},
"sa/participants.arcadia": {
"bytes": 1231,
"sha256": "1abad579812e77877b45a3d8e3c3e9da734be2d04a0254cc730a5257ebd2dc88"
},
"sa/reporting.arcadia": {
"bytes": 3061,
"sha256": "893050516ce47f07039f04879474c7a019b8b2f7b6002a8d950b005334e34692"
},
"views.arcadia": {
"bytes": 3508,
"sha256": "e29ad3f406a6a50d2f0ae2ca2a53ee3b0c18222cd4098704a46d4f48b64ea17f"
}
},
"snapshot": {
"oa.arcadia": {
"bytes": 2364,
"sha256": "c04efaa1ae5a2053e63aac70f79ea7bb845ef1db1ff8e68f23abfe24f1bc180f"
},
"project.arcadia": {
"bytes": 606,
"sha256": "260505b7f54a0d256bce2af8499bb46cc78ffe564628bd5f976ce358d1796f3a"
},
"sa/assurance.arcadia": {
"bytes": 682,
"sha256": "ab76044836e4dcd42a82d316846ec87da2108939aa2037640c5bca1d2ecdee0f"
},
"sa/participants.arcadia": {
"bytes": 1231,
"sha256": "1abad579812e77877b45a3d8e3c3e9da734be2d04a0254cc730a5257ebd2dc88"
},
"sa/reporting.arcadia": {
"bytes": 3061,
"sha256": "893050516ce47f07039f04879474c7a019b8b2f7b6002a8d950b005334e34692"
},
"views.arcadia": {
"bytes": 3508,
"sha256": "e29ad3f406a6a50d2f0ae2ca2a53ee3b0c18222cd4098704a46d4f48b64ea17f"
}
},
"after": {
"oa.arcadia": {
"bytes": 2364,
"sha256": "c04efaa1ae5a2053e63aac70f79ea7bb845ef1db1ff8e68f23abfe24f1bc180f"
},
"project.arcadia": {
"bytes": 606,
"sha256": "260505b7f54a0d256bce2af8499bb46cc78ffe564628bd5f976ce358d1796f3a"
},
"sa/assurance.arcadia": {
"bytes": 682,
"sha256": "ab76044836e4dcd42a82d316846ec87da2108939aa2037640c5bca1d2ecdee0f"
},
"sa/participants.arcadia": {
"bytes": 1231,
"sha256": "1abad579812e77877b45a3d8e3c3e9da734be2d04a0254cc730a5257ebd2dc88"
},
"sa/reporting.arcadia": {
"bytes": 3061,
"sha256": "893050516ce47f07039f04879474c7a019b8b2f7b6002a8d950b005334e34692"
},
"views.arcadia": {
"bytes": 3508,
"sha256": "e29ad3f406a6a50d2f0ae2ca2a53ee3b0c18222cd4098704a46d4f48b64ea17f"
}
},
"before_error": null,
"copy_error": null,
"snapshot_error": null,
"after_error": null,
"copy_consistent": true,
"expected": {
"oa.arcadia": {
"bytes": 2364,
"sha256": "c04efaa1ae5a2053e63aac70f79ea7bb845ef1db1ff8e68f23abfe24f1bc180f"
},
"project.arcadia": {
"bytes": 606,
"sha256": "260505b7f54a0d256bce2af8499bb46cc78ffe564628bd5f976ce358d1796f3a"
},
"sa/assurance.arcadia": {
"bytes": 682,
"sha256": "ab76044836e4dcd42a82d316846ec87da2108939aa2037640c5bca1d2ecdee0f"
},
"sa/participants.arcadia": {
"bytes": 1231,
"sha256": "1abad579812e77877b45a3d8e3c3e9da734be2d04a0254cc730a5257ebd2dc88"
},
"sa/reporting.arcadia": {
"bytes": 3061,
"sha256": "893050516ce47f07039f04879474c7a019b8b2f7b6002a8d950b005334e34692"
},
"views.arcadia": {
"bytes": 3508,
"sha256": "e29ad3f406a6a50d2f0ae2ca2a53ee3b0c18222cd4098704a46d4f48b64ea17f"
}
},
"baseline_unchanged": true,
"verification_error": null,
"exact_disk_bytes_equal": true,
"stage_unchanged": true,
"scope": "Disk membership and complete-byte equality only; does not assert transient model/history or UI acceptance."
}
@@ -0,0 +1,51 @@
// Operational Analysis describes the need without choosing a technical solution.
oa_actor vessel "Vessel in distress" id "00000000-0000-4000-8000-000000000101" {
description "The vessel's crew needs to communicate its position and obtain assistance.";
}
oa_entity rescue_team "Rescue coordination" id "00000000-0000-4000-8000-000000000102" {
description "The coordination team assesses the report and decides on a response.";
}
// This is work decomposition. It does not assign either activity to a participant.
oa_activity respond "Respond to distress" id "00000000-0000-4000-8000-000000000103" {
// Keep the crew's reporting responsibility visible when decomposing the need.
oa_activity report_distress "Report distress" id "00000000-0000-4000-8000-000000000104" {
description "Provide the vessel's situation and last known position.";
}
oa_activity assess_incident "Assess incident" id "00000000-0000-4000-8000-000000000105" {
description "Decide which assistance is needed using the received report.";
}
}
oa_capability protect_life "Protect life at sea" id "00000000-0000-4000-8000-000000000106" {}
oa_exchange_item oa_report_data "Distress report" id "00000000-0000-4000-8000-000000000107" {
kind Information;
oa_data_field reported_latitude "Reported latitude" id "00000000-0000-4000-8000-000000000108" {
type_ref Real;
unit "degrees north";
default none;
description "";
direction Unspecified;
maximum 1;
minimum 1;
storage Value;
}
description "";
mechanism Unspecified;
parent none;
supertype none;
}
// Allocation remains explicit even though the saved architecture view nests work.
allocation crew_reports "Crew reports distress" id "00000000-0000-4000-8000-000000000201" {
source @vessel; target @report_distress;
}
allocation team_assesses "Team assesses incident" id "00000000-0000-4000-8000-000000000202" {
source @rescue_team; target @assess_incident;
}
interaction distress_signal "Distress signal" id "00000000-0000-4000-8000-000000000203" {
source @report_distress; target @assess_incident; items [@oa_report_data];
}
capability_involvement operational_contribution "Assessment supports rescue" id "00000000-0000-4000-8000-000000000204" {
source @assess_incident; target @protect_life;
}
@@ -0,0 +1,11 @@
arcadia 7;
project distress_response "Distress response — nested source project" id "00000000-0000-4000-8000-000000000001" {
description "A small OA/SA model for learning source ownership, typed ports and reviewed graphical edits. Open this file. Start with the saved allocation views, then browse Handle distress reports and use Source for selection.";
// Includes organize documents; aliases are shared by the whole project.
include "oa.arcadia";
include "sa/participants.arcadia";
include "sa/reporting.arcadia";
include "sa/assurance.arcadia";
include "views.arcadia";
}
@@ -0,0 +1,11 @@
// A separate functional aggregate provides a cross-file reparenting example.
// Move Assess report here through Properties, then inspect both source files.
sa_function assure_response "Assure response quality" id "00000000-0000-4000-8000-000000000411" {
description "Review the service response independently of report transport.";
sa_function review_response "Review response" id "00000000-0000-4000-8000-000000000412" {
description "Check that a coordinator can review the received information.";
}
}
allocation system_reviews "System supports response review" id "00000000-0000-4000-8000-000000000504" {
source @rescue_system; target @review_response;
}
@@ -0,0 +1,22 @@
// System Analysis identifies one system of interest and its external participant.
sa_system rescue_system "Rescue coordination system" id "00000000-0000-4000-8000-000000000301" {
description "The selected system receives reports and supports the coordinator.";
// A component port belongs to its participant, not to an allocated function.
sa_port reporting_input "Reporting input" id "00000000-0000-4000-8000-000000000303" {
contract { Component { kind Flow; orientation In; }; };
}
}
sa_actor vessel_service "Vessel communication service" id "00000000-0000-4000-8000-000000000302" {
description "An external service sends distress information across the system boundary.";
sa_port reporting_output "Reporting output" id "00000000-0000-4000-8000-000000000304" {
contract { Component { kind Flow; orientation Out; }; };
}
}
// The boundary exchange connects actual participant ports. Function realization
// is declared separately in reporting.arcadia using port/exchange allocations.
boundary_exchange radio_reporting "Radio reporting" id "00000000-0000-4000-8000-000000000501" {
source @reporting_output; target @reporting_input;
oriented true;
items [@sa_report_data];
}
@@ -0,0 +1,62 @@
// Functional containment is independent of the participant allocations below.
sa_function handle_reports "Handle distress reports" id "00000000-0000-4000-8000-000000000401" {
description "A functional decomposition of reporting and assessment.";
sa_function transmit_report "Transmit report" id "00000000-0000-4000-8000-000000000402" {
description "Encode and send the vessel's distress report.";
sa_port report_out "Report output" id "00000000-0000-4000-8000-000000000404" {
contract { FunctionOutput { outgoing_items [@sa_report_data]; }; };
}
}
// Assessment rationale travels with this declaration when it is reparented.
sa_function assess_report "Assess report" id "00000000-0000-4000-8000-000000000403" {
description "Validate the received report and present it to the coordinator.";
sa_port report_in "Report input" id "00000000-0000-4000-8000-000000000405" {
contract { FunctionInput { incoming_items [@sa_report_data]; }; };
}
} // Assessment remains performed by rescue_system after a hierarchy edit.
}
// This group comment stays in this file; it is not attached to the function above.
sa_exchange_item sa_report_data "Digital distress report" id "00000000-0000-4000-8000-000000000406" {
kind Information;
sa_data_field encoded_latitude "Encoded latitude" id "00000000-0000-4000-8000-000000000407" {
type_ref Real;
unit "degrees north";
default none;
description "";
direction Unspecified;
maximum 1;
minimum 1;
storage Value;
}
description "";
mechanism Unspecified;
parent none;
supertype none;
}
sa_capability coordinate_response "Coordinate distress response" id "00000000-0000-4000-8000-000000000408" {}
allocation vessel_transmits "Vessel service transmits" id "00000000-0000-4000-8000-000000000502" {
source @vessel_service; target @transmit_report;
}
allocation system_assesses "System assesses report" id "00000000-0000-4000-8000-000000000503" {
source @rescue_system; target @assess_report;
}
functional_exchange validated_report "Validated report" id "00000000-0000-4000-8000-000000000505" {
source @transmit_report; source_port @report_out;
target @assess_report; target_port @report_in;
items [@sa_report_data];
}
port_allocation output_realization "Reporting output realizes function output" id "00000000-0000-4000-8000-000000000506" {
source @reporting_output; target @report_out;
}
port_allocation input_realization "Reporting input realizes function input" id "00000000-0000-4000-8000-000000000507" {
source @reporting_input; target @report_in;
}
exchange_allocation report_transport "Radio reporting carries the function exchange" id "00000000-0000-4000-8000-000000000508" {
source @radio_reporting; target @validated_report;
}
capability_involvement system_contribution "Assessment supports coordination" id "00000000-0000-4000-8000-000000000509" {
source @assess_report; target @coordinate_response;
}
@@ -0,0 +1,71 @@
// Views are projections. Their visual allocation containers do not set parent.
diagram oa_architecture "OA — participants and activities" id "00000000-0000-4000-8000-000000000601" {
description "The crew reports; the coordination team assesses. Containment of work is shown separately in the Model explorer.";
layer Oa; projection Allocation;
}
node oa_vessel_view id "00000000-0000-4000-8000-000000000701" {
diagram @oa_architecture; element @vessel;
position { x 60; y 60; }; size { width 272; height 210; };
}
node oa_team_view id "00000000-0000-4000-8000-000000000702" {
diagram @oa_architecture; element @rescue_team;
position { x 540; y 60; }; size { width 300; height 210; };
}
node oa_report_view id "00000000-0000-4000-8000-000000000703" {
diagram @oa_architecture; element @report_distress;
position { x 84; y 128; }; size { width 224; height 104; };
}
node oa_assessment_view id "00000000-0000-4000-8000-000000000704" {
diagram @oa_architecture; element @assess_incident;
position { x 564; y 128; }; size { width 252; height 104; };
}
diagram sa_architecture "SA — system boundary and functions" id "00000000-0000-4000-8000-000000000602" {
description "Flow component ports define the boundary; separate function ports carry the functional exchange.";
layer Sa; projection Allocation;
}
node sa_vessel_view id "00000000-0000-4000-8000-000000000711" {
diagram @sa_architecture; element @vessel_service;
position { x 60; y 60; }; size { width 272; height 220; };
}
node sa_system_view id "00000000-0000-4000-8000-000000000712" {
diagram @sa_architecture; element @rescue_system;
position { x 540; y 60; }; size { width 300; height 340; };
}
node sa_transmission_view id "00000000-0000-4000-8000-000000000713" {
diagram @sa_architecture; element @transmit_report;
position { x 84; y 128; }; size { width 224; height 104; };
}
node sa_assessment_view id "00000000-0000-4000-8000-000000000714" {
diagram @sa_architecture; element @assess_report;
position { x 564; y 128; }; size { width 252; height 104; };
}
node sa_review_view id "00000000-0000-4000-8000-000000000715" {
diagram @sa_architecture; element @review_response;
position { x 564; y 272; }; size { width 252; height 104; };
}
diagram sa_decomposition "SA — functional containment" id "00000000-0000-4000-8000-000000000603" {
description "These containers represent real function parents. Compare them with the explicit allocations in the architecture view.";
layer Sa; projection FunctionalDataflow;
}
node handling_view id "00000000-0000-4000-8000-000000000721" {
diagram @sa_decomposition; element @handle_reports;
position { x 40; y 60; }; size { width 500; height 230; };
}
node transmission_view id "00000000-0000-4000-8000-000000000722" {
diagram @sa_decomposition; element @transmit_report;
position { x 64; y 136; }; size { width 204; height 104; };
}
node assessment_view id "00000000-0000-4000-8000-000000000723" {
diagram @sa_decomposition; element @assess_report;
position { x 310; y 136; }; size { width 204; height 104; };
}
node assurance_view id "00000000-0000-4000-8000-000000000724" {
diagram @sa_decomposition; element @assure_response;
position { x 590; y 60; }; size { width 300; height 230; };
}
node review_view id "00000000-0000-4000-8000-000000000725" {
diagram @sa_decomposition; element @review_response;
position { x 614; y 136; }; size { width 252; height 104; };
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:21:44.165074+00:00",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"pid": 10456,
"exit": 0,
"stage_unchanged": true,
"stdout": {
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"stderr": {
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"exact_disk_bytes_equal": true,
"scope": "Observed owned process exit and disk-byte preservation only; native acceptance requires separate evidence review."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:04:09.332Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Untitled mission — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "Fresh isolated feab GUI: empty recent models and untitled project."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:04:56.559Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Untitled mission — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "Native picker reports absent private-profile Desktop directory. Acknowledge informational error, then explicitly select fixture path. No application source error."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:11:08.511Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Untitled mission — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "Explicit fresh trial source-work/project.arcadia opened; title Distress response nested source project,22 objects/13 links/11 checks, all saved. Picker input needed keyboard focus recovery; no model edits."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:13:46.419Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Distress response — nested source project — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "Find first match then Escape selected original assess_report declaration, UUID00000000-0000-4000-8000-000000000403; model in sync."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:14:35.537Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Distress response — nested source project — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "Preview proposed only:2 changed files/6 lines/3863bytes, file1/2 sa/reporting.arcadia hunk1/3 rows1-7/7. Initial visible top line8."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:15:07.886Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Distress response — nested source project — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "Scrolled file1/hunk1/rows1-7: line10 at y485, changed line11 at y631, before alias y675 and proposed after y737; scrollbar thumb y518-633. Next action Full details; no paging/filter changes."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:15:24.431Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Distress response — nested source project — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "Full details shows same target/origin/replacement and Details1/2. No preview paging/filter or rescroll action."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:15:43.424Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Distress response — nested source project — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "First returned Preview frame before any scroll/input: file1/hunk1/rows1-7 unchanged; line10 y485,line11 y631,before y675,after y737,thumb y518-633 match006. Native restoration passes this seam."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:16:18.590Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Distress response — nested source project — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "Explicit next hunk now file1/hunk2/3/rows1-8/11 at line41 top and scrollbar top. Prior nonzero offset not inherited."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:16:46.492Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Distress response — nested source project — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "Hunk2 rows1-8 has nonzero offset before explicit row-page Next; line42 y485,line43 y631."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:17:17.539Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Distress response — nested source project — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "Explicit row Next selects rows9-11/11 and starts line49 at top; scrollbar top."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:17:42.642Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Distress response — nested source project — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "Rows9-11/11 scrolled nonzero, line50 y488,line51y634 before explicit file Next."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:18:09.709Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Distress response — nested source project — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "File Next now file2/2 views.arcadia,hunk1/2,rows1-7/7,line37 top and scrollbar top."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:18:29.031Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Distress response — nested source project — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "views.arcadia preview at nonzero offset, line39 y535,line40 y680 before file filter edit."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:19:31.348Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Distress response — nested source project — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "Filter reporting selected file1/hunk1/rows1-7; line8 top,scrollbar top, both file buttons disabled."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:19:49.308Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Distress response — nested source project — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "Filtered reporting preview at same nonzero visible declaration geometry as006; next repeated Details toggle."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:20:10.427Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Distress response — nested source project — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "Repeated Details pane, no paging/replacement changes."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:20:27.739Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Distress response — nested source project — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "First returned filtered Preview before any rescroll: exact same line10/11/before/after and scrollbar geometry as016. Second restoration passes."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:20:48.803Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Distress response — nested source project — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "Cancel dismisses proposal; editor still shows selected original assess_report declaration, Model in sync and All changes saved. No rename commit was requested."
}
@@ -0,0 +1,17 @@
{
"utc": "2026-09-13T12:21:09.250Z",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"window": {
"app": "process:C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe",
"id": 6750956,
"title": "Distress response — nested source project — Arcadia Studio"
},
"screenshot": {
"id": "screenshot-0",
"mime": "image/jpeg",
"width": 1442,
"height": 932,
"index": 0
},
"note": "Save all completed: All source files saved. Original assess_report remains selected;22objects/13links/11checks unchanged. Next exact six-file disk checkpoint and normal close."
}
@@ -0,0 +1,41 @@
{
"utc": "2026-09-13T12:03:30.891058+00:00",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"command": [
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe"
],
"cwd": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-feab202-20260913-01\\working-directory",
"environment": {
"SystemRoot": "C:\\Windows",
"WINDIR": "C:\\Windows",
"SystemDrive": "C:",
"ProgramData": "C:\\ProgramData",
"ALLUSERSPROFILE": "C:\\ProgramData",
"PUBLIC": "C:\\Users\\Public",
"COMSPEC": "C:\\Windows\\system32\\cmd.exe",
"PATHEXT": ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL",
"NUMBER_OF_PROCESSORS": "4",
"PROCESSOR_ARCHITECTURE": "AMD64",
"OS": "Windows_NT",
"PATH": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01;C:\\Windows\\System32;C:\\Windows",
"USERPROFILE": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-feab202-20260913-01\\profile",
"HOMEDRIVE": "C:",
"HOMEPATH": "\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-feab202-20260913-01\\profile",
"LOCALAPPDATA": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-feab202-20260913-01\\profile\\AppData\\Local",
"APPDATA": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-feab202-20260913-01\\profile\\AppData\\Roaming",
"TEMP": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-feab202-20260913-01\\temp",
"TMP": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-feab202-20260913-01\\temp"
},
"manifest": {
"bytes": 12940,
"sha256": "83cdaa41c191c57bcae36419b9bdd4beeee8512e95329259e97811f13f98d3b0"
},
"config": {
"bytes": 5688,
"sha256": "305256a64d6f1e13aeb6e324a5ae9e664605698e2a9a0f0e875d6694958fbfe7"
},
"helper": {
"bytes": 21092,
"sha256": "27e03247a1d60e06b4c169bcae406ef5d26d483f89fc5895b64023207b2a9d14"
}
}
@@ -0,0 +1,43 @@
{
"utc": "2026-09-13T12:03:30.891058+00:00",
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"command": [
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01\\arcadia-studio.exe"
],
"cwd": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-feab202-20260913-01\\working-directory",
"environment": {
"SystemRoot": "C:\\Windows",
"WINDIR": "C:\\Windows",
"SystemDrive": "C:",
"ProgramData": "C:\\ProgramData",
"ALLUSERSPROFILE": "C:\\ProgramData",
"PUBLIC": "C:\\Users\\Public",
"COMSPEC": "C:\\Windows\\system32\\cmd.exe",
"PATHEXT": ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL",
"NUMBER_OF_PROCESSORS": "4",
"PROCESSOR_ARCHITECTURE": "AMD64",
"OS": "Windows_NT",
"PATH": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-stage-feab202-20260913-01;C:\\Windows\\System32;C:\\Windows",
"USERPROFILE": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-feab202-20260913-01\\profile",
"HOMEDRIVE": "C:",
"HOMEPATH": "\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-feab202-20260913-01\\profile",
"LOCALAPPDATA": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-feab202-20260913-01\\profile\\AppData\\Local",
"APPDATA": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-feab202-20260913-01\\profile\\AppData\\Roaming",
"TEMP": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-feab202-20260913-01\\temp",
"TMP": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\rename-scroll-feab202-20260913-01\\temp"
},
"manifest": {
"bytes": 12940,
"sha256": "83cdaa41c191c57bcae36419b9bdd4beeee8512e95329259e97811f13f98d3b0"
},
"config": {
"bytes": 5688,
"sha256": "305256a64d6f1e13aeb6e324a5ae9e664605698e2a9a0f0e875d6694958fbfe7"
},
"helper": {
"bytes": 21092,
"sha256": "27e03247a1d60e06b4c169bcae406ef5d26d483f89fc5895b64023207b2a9d14"
},
"pid": 10456,
"spawned_utc": "2026-09-13T12:03:30.961321+00:00"
}
@@ -0,0 +1,291 @@
{
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"config": {
"bytes": 5688,
"sha256": "305256a64d6f1e13aeb6e324a5ae9e664605698e2a9a0f0e875d6694958fbfe7"
},
"helper": {
"bytes": 21092,
"sha256": "27e03247a1d60e06b4c169bcae406ef5d26d483f89fc5895b64023207b2a9d14"
},
"records": {
".local\\rename-scroll-native-feab202.config.json": {
"bytes": 5688,
"sha256": "305256a64d6f1e13aeb6e324a5ae9e664605698e2a9a0f0e875d6694958fbfe7"
},
".local\\rename-scroll-gate-preparation-r3-20260913\\expected.json": {
"bytes": 135890,
"sha256": "963de41fc05471713627cf3571b3b071c68ff731a3f620753f6eb61411a319c8"
},
".local\\rename-scroll-gate-preparation-r3-20260913\\admit-fixed.py": {
"bytes": 7609,
"sha256": "81c43b5db49e19fbe36995455b0e0690392159d815d96343f232674502c73210"
},
".local\\rename-scroll-gate-preparation-r3-20260913\\run-fixed.py": {
"bytes": 4756,
"sha256": "8229e1d760aad223aab30e79396cf050c01a1875bfd593fe7550e1f2dcc76899"
},
".local\\rename-scroll-gate-preparation-r3-20260913\\build-gui.py": {
"bytes": 8137,
"sha256": "f8a2dd82d4fb635cb544c6396d36eb5d1ce878c36f3215945c2150152509ff77"
},
".local\\native-qa\\navigation-palette-20260913-01\\source-example-preparation.json": {
"bytes": 2458,
"sha256": "d57250523090b40b81c07409fef99028d25903903d88a08d79842c6361d32c69"
},
".local\\native-qa\\navigation-palette-20260913-01\\closure.json": {
"bytes": 469,
"sha256": "b7760d98b02418e9cf64a687642e439452b8e03cd90f2fee17eb83836babe699"
},
".local\\navigation-palette-gates-20260913\\artifacts-44095f7\\environment.json": {
"bytes": 2051,
"sha256": "8dfed55e08d2cbedd72c0115c676d3816128e1eb99145845067070d3c453e728"
},
".local\\rename-scroll-gates-20260913\\preview-bebf9f5.inputs.json": {
"bytes": 108345,
"sha256": "76c68f986c22a8e36687c573170a05f6e77a034a2c8784f2a0648a37cbecda8e"
},
".local\\rename-scroll-gates-20260913\\preview-bebf9f5.log": {
"bytes": 1679,
"sha256": "430f6497303978be894e231312e0c70d2762cf0afeef1d9a08e6318073c2e701"
},
".local\\rename-scroll-gates-20260913\\preview-bebf9f5.result.json": {
"bytes": 1332,
"sha256": "8694d1dc46edc942abf0a5d8d8b86423c1f60e1d3ac6c2e1c91424196535817e"
},
".local\\native-qa\\navigation-palette-20260913-01\\evidence\\043-preview-scrolled.jpg": {
"bytes": 125351,
"sha256": "6913a8d2868e6cd3ed34b11abc4c8da6679dac77dbd3b94ba7af6bb70055101a"
},
".local\\native-qa\\navigation-palette-20260913-01\\evidence\\043-preview-scrolled.json": {
"bytes": 535,
"sha256": "7f8c002f6b43b514e52ece18681bfb5a6df2387d6cb9ffd20b63c0509e90f2a8"
},
".local\\native-qa\\navigation-palette-20260913-01\\evidence\\044-preview-details.jpg": {
"bytes": 115383,
"sha256": "90a13274497de7eff3851374f59264e16a5fe66a8ea19d8e1d22895176c5b4df"
},
".local\\native-qa\\navigation-palette-20260913-01\\evidence\\044-preview-details.json": {
"bytes": 554,
"sha256": "dbc9fce5f7c68ee927a8f274fad8f84cf4bc63265ce789eb5d115c473b73b128"
},
".local\\native-qa\\navigation-palette-20260913-01\\evidence\\045-preview-return-scroll-reset.jpg": {
"bytes": 112885,
"sha256": "3b07848e5d9ce60734024618f6b9ab32f86463cec368ec8c81b416ae56630fff"
},
".local\\native-qa\\navigation-palette-20260913-01\\evidence\\045-preview-return-scroll-reset.json": {
"bytes": 600,
"sha256": "e1a0526cd13541c89b646fc396325534e0a85a67f9d7725279bcc0a5671ba4d6"
},
".local\\native-qa\\navigation-palette-20260913-01\\source-baseline\\oa.arcadia": {
"bytes": 2364,
"sha256": "c04efaa1ae5a2053e63aac70f79ea7bb845ef1db1ff8e68f23abfe24f1bc180f"
},
".local\\native-qa\\navigation-palette-20260913-01\\source-baseline\\project.arcadia": {
"bytes": 606,
"sha256": "260505b7f54a0d256bce2af8499bb46cc78ffe564628bd5f976ce358d1796f3a"
},
".local\\native-qa\\navigation-palette-20260913-01\\source-baseline\\sa\\assurance.arcadia": {
"bytes": 682,
"sha256": "ab76044836e4dcd42a82d316846ec87da2108939aa2037640c5bca1d2ecdee0f"
},
".local\\native-qa\\navigation-palette-20260913-01\\source-baseline\\sa\\participants.arcadia": {
"bytes": 1231,
"sha256": "1abad579812e77877b45a3d8e3c3e9da734be2d04a0254cc730a5257ebd2dc88"
},
".local\\native-qa\\navigation-palette-20260913-01\\source-baseline\\sa\\reporting.arcadia": {
"bytes": 3061,
"sha256": "893050516ce47f07039f04879474c7a019b8b2f7b6002a8d950b005334e34692"
},
".local\\native-qa\\navigation-palette-20260913-01\\source-baseline\\views.arcadia": {
"bytes": 3508,
"sha256": "e29ad3f406a6a50d2f0ae2ca2a53ee3b0c18222cd4098704a46d4f48b64ea17f"
},
".local\\native-qa\\navigation-selection-stage-44095f7\\libunwind.dll": {
"bytes": 190464,
"sha256": "aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a"
},
".local\\rename-scroll-gates-20260913\\list-feab202.result.json": {
"bytes": 121495,
"sha256": "66c770d7e0d42ea09038022c2e5542e1eb3355ee414bdf582e5cef402455c99f"
},
".local\\rename-scroll-gates-20260913\\list-feab202.admission.json": {
"bytes": 121127,
"sha256": "db0f1c87155ef6e19c50a4adb2cc1d9d78da5b61c07e59e4fef4f6f67ada2629"
},
".local\\rename-scroll-gates-20260913\\list-feab202.inputs.json": {
"bytes": 108345,
"sha256": "da82cac980f6e10d14363279b1795e3df95adfca4bf5fb786f268b1979ec8664"
},
".local\\rename-scroll-gates-20260913\\list-feab202.log": {
"bytes": 119428,
"sha256": "76f68f9d938182e97ae0bb82ae9642657da3039b850445083319d33a6a239de0"
},
".local\\rename-scroll-gates-20260913\\preview-feab202.result.json": {
"bytes": 1330,
"sha256": "733afba2af1e28c904e98f75db5c7af7437cbfddb4ba9de27a9e8e2911031668"
},
".local\\rename-scroll-gates-20260913\\preview-feab202.admission.json": {
"bytes": 1581,
"sha256": "ac8a025c82f9b4bdd0843dba6de73c9139ff64a2052b510c275400ede9a3515b"
},
".local\\rename-scroll-gates-20260913\\preview-feab202.inputs.json": {
"bytes": 108345,
"sha256": "da82cac980f6e10d14363279b1795e3df95adfca4bf5fb786f268b1979ec8664"
},
".local\\rename-scroll-gates-20260913\\preview-feab202.log": {
"bytes": 989,
"sha256": "6c00dcd5845e3af0e27670556b15854dbc4b9a7429b6db4c043201ef8bab3c24"
},
".local\\rename-scroll-gates-20260913\\rename-feab202.result.json": {
"bytes": 1336,
"sha256": "c9b2f688679baaf4cab9445650895dafa5b7d10186b4c97c90e840546f5566ce"
},
".local\\rename-scroll-gates-20260913\\rename-feab202.admission.json": {
"bytes": 5467,
"sha256": "6e2979d8f5e02bc28ab07abb666b91e0ce116602eb8a17f2260c50f90955d15a"
},
".local\\rename-scroll-gates-20260913\\rename-feab202.inputs.json": {
"bytes": 108345,
"sha256": "da82cac980f6e10d14363279b1795e3df95adfca4bf5fb786f268b1979ec8664"
},
".local\\rename-scroll-gates-20260913\\rename-feab202.log": {
"bytes": 5038,
"sha256": "7b80bef1e5816e4e306d64dc9118b87e507606ea709a57c2a3ba346e383c4dd2"
},
".local\\rename-scroll-gates-20260913\\navigation-feab202.result.json": {
"bytes": 1329,
"sha256": "8abba418fbb681c24908dd675d9de3075668b309990e90d40870b89e90681d0c"
},
".local\\rename-scroll-gates-20260913\\navigation-feab202.admission.json": {
"bytes": 3279,
"sha256": "c33ff3602fff3d3af8481d17133a28856fa9a291a3a20e15c7067a5c6a6b10d8"
},
".local\\rename-scroll-gates-20260913\\navigation-feab202.inputs.json": {
"bytes": 108345,
"sha256": "da82cac980f6e10d14363279b1795e3df95adfca4bf5fb786f268b1979ec8664"
},
".local\\rename-scroll-gates-20260913\\navigation-feab202.log": {
"bytes": 2749,
"sha256": "7f157a302b1a993ec42e4818d7bbcecd4fe797626bb9998505052f543847ea6c"
},
".local\\rename-scroll-gates-20260913\\source-navigation-feab202.result.json": {
"bytes": 1339,
"sha256": "6d70787817eb128ecf4ae6fb5f2fe7ee1a75c118789fb2e0800f75044001b3c4"
},
".local\\rename-scroll-gates-20260913\\source-navigation-feab202.admission.json": {
"bytes": 6466,
"sha256": "b76ec6fc633b4166b83ba15c5028cb62fadafcc1bafbdd403da82dffc39d042e"
},
".local\\rename-scroll-gates-20260913\\source-navigation-feab202.inputs.json": {
"bytes": 108345,
"sha256": "da82cac980f6e10d14363279b1795e3df95adfca4bf5fb786f268b1979ec8664"
},
".local\\rename-scroll-gates-20260913\\source-navigation-feab202.log": {
"bytes": 6107,
"sha256": "add29a3188eb1ee26fee4a58cd2725f4caf518127adedae377d79ec741d34ddb"
},
".local\\rename-scroll-gates-20260913\\full-feab202.result.json": {
"bytes": 1299,
"sha256": "21a157f6a49fc93adc6f348e8601c895f128ec6d56e47f702927554670768d37"
},
".local\\rename-scroll-gates-20260913\\full-feab202.admission.json": {
"bytes": 121127,
"sha256": "12ba8d77a7a1c024192ccb5d9b365bbb5d9385323b48ebf0cc31c60a580a3701"
},
".local\\rename-scroll-gates-20260913\\full-feab202.inputs.json": {
"bytes": 108345,
"sha256": "da82cac980f6e10d14363279b1795e3df95adfca4bf5fb786f268b1979ec8664"
},
".local\\rename-scroll-gates-20260913\\full-feab202.log": {
"bytes": 126359,
"sha256": "a18937ad4298abd5c7882a8f9a5cbd2df48e5cc7916a7e55c4bfb08d7e77d582"
},
".local\\rename-scroll-gates-20260913\\strict-feab202.result.json": {
"bytes": 1044,
"sha256": "a3857d8deb19c6dde49fa1e6484d5d31ffb80de1803e8cb0ab7ecd1f5e1f36ce"
},
".local\\rename-scroll-gates-20260913\\strict-feab202.admission.json": {
"bytes": 699,
"sha256": "39fbbd18af04e30dd538f15ab9f5d2834f378674f214cdc24f594cd954fa2c92"
},
".local\\rename-scroll-gates-20260913\\strict-feab202.inputs.json": {
"bytes": 108345,
"sha256": "da82cac980f6e10d14363279b1795e3df95adfca4bf5fb786f268b1979ec8664"
},
".local\\rename-scroll-gates-20260913\\strict-feab202.log": {
"bytes": 365,
"sha256": "ee9c351b03a05fb18b22f89025476b2e51fea559c4aa7bbe1164aba74a68ab88"
},
".local\\rename-scroll-gates-20260913\\gui-feab202\\result.json": {
"bytes": 2768,
"sha256": "123f67ce1ca618129683499f7a4806b402dcab7efc1d7e7763f96d3f56348af9"
},
".local\\rename-scroll-gates-20260913\\gui-feab202\\environment.json": {
"bytes": 2112,
"sha256": "1f5d06d7f871fd97a60e80d1b421883e1342e79903bfb4d907e23d8cf21b99d8"
},
".local\\rename-scroll-gates-20260913\\gui-feab202\\inputs.json": {
"bytes": 114660,
"sha256": "83091bfc42eef198442b03cd714262d3bf87cd35aa965134eaff210933e18c00"
},
".local\\rename-scroll-gates-20260913\\gui-feab202\\cargo.jsonl": {
"bytes": 268460,
"sha256": "68313640f4a221723ac57b7ecf71b14034544b624e6ea7185bfe20ec7afff6ae"
},
".local\\rename-scroll-gates-20260913\\gui-feab202\\cargo.stderr.log": {
"bytes": 263,
"sha256": "10abc4f9e9bcfeeb47664fc39f177b12c0b0d88da805bc9b25621c37d5c7c9e9"
},
".local\\toolchain\\llvm-mingw-20260908-ucrt-x86_64\\bin\\libunwind.dll": {
"bytes": 190464,
"sha256": "aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a"
}
},
"gui": {
"bytes": 116591104,
"sha256": "521ca576337a4b5add70c8fb7f101e459274f9b4462a5c0bdd3290cc1ca72b58"
},
"runtime": {
"bytes": 190464,
"sha256": "aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a"
},
"baseline": {
"oa.arcadia": {
"bytes": 2364,
"sha256": "c04efaa1ae5a2053e63aac70f79ea7bb845ef1db1ff8e68f23abfe24f1bc180f"
},
"project.arcadia": {
"bytes": 606,
"sha256": "260505b7f54a0d256bce2af8499bb46cc78ffe564628bd5f976ce358d1796f3a"
},
"sa/assurance.arcadia": {
"bytes": 682,
"sha256": "ab76044836e4dcd42a82d316846ec87da2108939aa2037640c5bca1d2ecdee0f"
},
"sa/participants.arcadia": {
"bytes": 1231,
"sha256": "1abad579812e77877b45a3d8e3c3e9da734be2d04a0254cc730a5257ebd2dc88"
},
"sa/reporting.arcadia": {
"bytes": 3061,
"sha256": "893050516ce47f07039f04879474c7a019b8b2f7b6002a8d950b005334e34692"
},
"views.arcadia": {
"bytes": 3508,
"sha256": "e29ad3f406a6a50d2f0ae2ca2a53ee3b0c18222cd4098704a46d4f48b64ea17f"
}
},
"scope": "Closed source/build admission only; native outcome remains manual. No semantic oracle reuse.",
"created_utc": "2026-09-13T12:03:02.776591+00:00",
"payloads": {
"arcadia-studio.exe": {
"bytes": 116591104,
"sha256": "521ca576337a4b5add70c8fb7f101e459274f9b4462a5c0bdd3290cc1ca72b58"
},
"libunwind.dll": {
"bytes": 190464,
"sha256": "aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a"
}
}
}
@@ -0,0 +1,51 @@
// Operational Analysis describes the need without choosing a technical solution.
oa_actor vessel "Vessel in distress" id "00000000-0000-4000-8000-000000000101" {
description "The vessel's crew needs to communicate its position and obtain assistance.";
}
oa_entity rescue_team "Rescue coordination" id "00000000-0000-4000-8000-000000000102" {
description "The coordination team assesses the report and decides on a response.";
}
// This is work decomposition. It does not assign either activity to a participant.
oa_activity respond "Respond to distress" id "00000000-0000-4000-8000-000000000103" {
// Keep the crew's reporting responsibility visible when decomposing the need.
oa_activity report_distress "Report distress" id "00000000-0000-4000-8000-000000000104" {
description "Provide the vessel's situation and last known position.";
}
oa_activity assess_incident "Assess incident" id "00000000-0000-4000-8000-000000000105" {
description "Decide which assistance is needed using the received report.";
}
}
oa_capability protect_life "Protect life at sea" id "00000000-0000-4000-8000-000000000106" {}
oa_exchange_item oa_report_data "Distress report" id "00000000-0000-4000-8000-000000000107" {
kind Information;
oa_data_field reported_latitude "Reported latitude" id "00000000-0000-4000-8000-000000000108" {
type_ref Real;
unit "degrees north";
default none;
description "";
direction Unspecified;
maximum 1;
minimum 1;
storage Value;
}
description "";
mechanism Unspecified;
parent none;
supertype none;
}
// Allocation remains explicit even though the saved architecture view nests work.
allocation crew_reports "Crew reports distress" id "00000000-0000-4000-8000-000000000201" {
source @vessel; target @report_distress;
}
allocation team_assesses "Team assesses incident" id "00000000-0000-4000-8000-000000000202" {
source @rescue_team; target @assess_incident;
}
interaction distress_signal "Distress signal" id "00000000-0000-4000-8000-000000000203" {
source @report_distress; target @assess_incident; items [@oa_report_data];
}
capability_involvement operational_contribution "Assessment supports rescue" id "00000000-0000-4000-8000-000000000204" {
source @assess_incident; target @protect_life;
}
@@ -0,0 +1,11 @@
arcadia 7;
project distress_response "Distress response — nested source project" id "00000000-0000-4000-8000-000000000001" {
description "A small OA/SA model for learning source ownership, typed ports and reviewed graphical edits. Open this file. Start with the saved allocation views, then browse Handle distress reports and use Source for selection.";
// Includes organize documents; aliases are shared by the whole project.
include "oa.arcadia";
include "sa/participants.arcadia";
include "sa/reporting.arcadia";
include "sa/assurance.arcadia";
include "views.arcadia";
}
@@ -0,0 +1,11 @@
// A separate functional aggregate provides a cross-file reparenting example.
// Move Assess report here through Properties, then inspect both source files.
sa_function assure_response "Assure response quality" id "00000000-0000-4000-8000-000000000411" {
description "Review the service response independently of report transport.";
sa_function review_response "Review response" id "00000000-0000-4000-8000-000000000412" {
description "Check that a coordinator can review the received information.";
}
}
allocation system_reviews "System supports response review" id "00000000-0000-4000-8000-000000000504" {
source @rescue_system; target @review_response;
}
@@ -0,0 +1,22 @@
// System Analysis identifies one system of interest and its external participant.
sa_system rescue_system "Rescue coordination system" id "00000000-0000-4000-8000-000000000301" {
description "The selected system receives reports and supports the coordinator.";
// A component port belongs to its participant, not to an allocated function.
sa_port reporting_input "Reporting input" id "00000000-0000-4000-8000-000000000303" {
contract { Component { kind Flow; orientation In; }; };
}
}
sa_actor vessel_service "Vessel communication service" id "00000000-0000-4000-8000-000000000302" {
description "An external service sends distress information across the system boundary.";
sa_port reporting_output "Reporting output" id "00000000-0000-4000-8000-000000000304" {
contract { Component { kind Flow; orientation Out; }; };
}
}
// The boundary exchange connects actual participant ports. Function realization
// is declared separately in reporting.arcadia using port/exchange allocations.
boundary_exchange radio_reporting "Radio reporting" id "00000000-0000-4000-8000-000000000501" {
source @reporting_output; target @reporting_input;
oriented true;
items [@sa_report_data];
}
@@ -0,0 +1,62 @@
// Functional containment is independent of the participant allocations below.
sa_function handle_reports "Handle distress reports" id "00000000-0000-4000-8000-000000000401" {
description "A functional decomposition of reporting and assessment.";
sa_function transmit_report "Transmit report" id "00000000-0000-4000-8000-000000000402" {
description "Encode and send the vessel's distress report.";
sa_port report_out "Report output" id "00000000-0000-4000-8000-000000000404" {
contract { FunctionOutput { outgoing_items [@sa_report_data]; }; };
}
}
// Assessment rationale travels with this declaration when it is reparented.
sa_function assess_report "Assess report" id "00000000-0000-4000-8000-000000000403" {
description "Validate the received report and present it to the coordinator.";
sa_port report_in "Report input" id "00000000-0000-4000-8000-000000000405" {
contract { FunctionInput { incoming_items [@sa_report_data]; }; };
}
} // Assessment remains performed by rescue_system after a hierarchy edit.
}
// This group comment stays in this file; it is not attached to the function above.
sa_exchange_item sa_report_data "Digital distress report" id "00000000-0000-4000-8000-000000000406" {
kind Information;
sa_data_field encoded_latitude "Encoded latitude" id "00000000-0000-4000-8000-000000000407" {
type_ref Real;
unit "degrees north";
default none;
description "";
direction Unspecified;
maximum 1;
minimum 1;
storage Value;
}
description "";
mechanism Unspecified;
parent none;
supertype none;
}
sa_capability coordinate_response "Coordinate distress response" id "00000000-0000-4000-8000-000000000408" {}
allocation vessel_transmits "Vessel service transmits" id "00000000-0000-4000-8000-000000000502" {
source @vessel_service; target @transmit_report;
}
allocation system_assesses "System assesses report" id "00000000-0000-4000-8000-000000000503" {
source @rescue_system; target @assess_report;
}
functional_exchange validated_report "Validated report" id "00000000-0000-4000-8000-000000000505" {
source @transmit_report; source_port @report_out;
target @assess_report; target_port @report_in;
items [@sa_report_data];
}
port_allocation output_realization "Reporting output realizes function output" id "00000000-0000-4000-8000-000000000506" {
source @reporting_output; target @report_out;
}
port_allocation input_realization "Reporting input realizes function input" id "00000000-0000-4000-8000-000000000507" {
source @reporting_input; target @report_in;
}
exchange_allocation report_transport "Radio reporting carries the function exchange" id "00000000-0000-4000-8000-000000000508" {
source @radio_reporting; target @validated_report;
}
capability_involvement system_contribution "Assessment supports coordination" id "00000000-0000-4000-8000-000000000509" {
source @assess_report; target @coordinate_response;
}
@@ -0,0 +1,71 @@
// Views are projections. Their visual allocation containers do not set parent.
diagram oa_architecture "OA — participants and activities" id "00000000-0000-4000-8000-000000000601" {
description "The crew reports; the coordination team assesses. Containment of work is shown separately in the Model explorer.";
layer Oa; projection Allocation;
}
node oa_vessel_view id "00000000-0000-4000-8000-000000000701" {
diagram @oa_architecture; element @vessel;
position { x 60; y 60; }; size { width 272; height 210; };
}
node oa_team_view id "00000000-0000-4000-8000-000000000702" {
diagram @oa_architecture; element @rescue_team;
position { x 540; y 60; }; size { width 300; height 210; };
}
node oa_report_view id "00000000-0000-4000-8000-000000000703" {
diagram @oa_architecture; element @report_distress;
position { x 84; y 128; }; size { width 224; height 104; };
}
node oa_assessment_view id "00000000-0000-4000-8000-000000000704" {
diagram @oa_architecture; element @assess_incident;
position { x 564; y 128; }; size { width 252; height 104; };
}
diagram sa_architecture "SA — system boundary and functions" id "00000000-0000-4000-8000-000000000602" {
description "Flow component ports define the boundary; separate function ports carry the functional exchange.";
layer Sa; projection Allocation;
}
node sa_vessel_view id "00000000-0000-4000-8000-000000000711" {
diagram @sa_architecture; element @vessel_service;
position { x 60; y 60; }; size { width 272; height 220; };
}
node sa_system_view id "00000000-0000-4000-8000-000000000712" {
diagram @sa_architecture; element @rescue_system;
position { x 540; y 60; }; size { width 300; height 340; };
}
node sa_transmission_view id "00000000-0000-4000-8000-000000000713" {
diagram @sa_architecture; element @transmit_report;
position { x 84; y 128; }; size { width 224; height 104; };
}
node sa_assessment_view id "00000000-0000-4000-8000-000000000714" {
diagram @sa_architecture; element @assess_report;
position { x 564; y 128; }; size { width 252; height 104; };
}
node sa_review_view id "00000000-0000-4000-8000-000000000715" {
diagram @sa_architecture; element @review_response;
position { x 564; y 272; }; size { width 252; height 104; };
}
diagram sa_decomposition "SA — functional containment" id "00000000-0000-4000-8000-000000000603" {
description "These containers represent real function parents. Compare them with the explicit allocations in the architecture view.";
layer Sa; projection FunctionalDataflow;
}
node handling_view id "00000000-0000-4000-8000-000000000721" {
diagram @sa_decomposition; element @handle_reports;
position { x 40; y 60; }; size { width 500; height 230; };
}
node transmission_view id "00000000-0000-4000-8000-000000000722" {
diagram @sa_decomposition; element @transmit_report;
position { x 64; y 136; }; size { width 204; height 104; };
}
node assessment_view id "00000000-0000-4000-8000-000000000723" {
diagram @sa_decomposition; element @assess_report;
position { x 310; y 136; }; size { width 204; height 104; };
}
node assurance_view id "00000000-0000-4000-8000-000000000724" {
diagram @sa_decomposition; element @assure_response;
position { x 590; y 60; }; size { width 300; height 230; };
}
node review_view id "00000000-0000-4000-8000-000000000725" {
diagram @sa_decomposition; element @review_response;
position { x 614; y 136; }; size { width 252; height 104; };
}
@@ -0,0 +1,291 @@
{
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"config": {
"bytes": 5688,
"sha256": "305256a64d6f1e13aeb6e324a5ae9e664605698e2a9a0f0e875d6694958fbfe7"
},
"helper": {
"bytes": 21092,
"sha256": "27e03247a1d60e06b4c169bcae406ef5d26d483f89fc5895b64023207b2a9d14"
},
"records": {
".local\\rename-scroll-native-feab202.config.json": {
"bytes": 5688,
"sha256": "305256a64d6f1e13aeb6e324a5ae9e664605698e2a9a0f0e875d6694958fbfe7"
},
".local\\rename-scroll-gate-preparation-r3-20260913\\expected.json": {
"bytes": 135890,
"sha256": "963de41fc05471713627cf3571b3b071c68ff731a3f620753f6eb61411a319c8"
},
".local\\rename-scroll-gate-preparation-r3-20260913\\admit-fixed.py": {
"bytes": 7609,
"sha256": "81c43b5db49e19fbe36995455b0e0690392159d815d96343f232674502c73210"
},
".local\\rename-scroll-gate-preparation-r3-20260913\\run-fixed.py": {
"bytes": 4756,
"sha256": "8229e1d760aad223aab30e79396cf050c01a1875bfd593fe7550e1f2dcc76899"
},
".local\\rename-scroll-gate-preparation-r3-20260913\\build-gui.py": {
"bytes": 8137,
"sha256": "f8a2dd82d4fb635cb544c6396d36eb5d1ce878c36f3215945c2150152509ff77"
},
".local\\native-qa\\navigation-palette-20260913-01\\source-example-preparation.json": {
"bytes": 2458,
"sha256": "d57250523090b40b81c07409fef99028d25903903d88a08d79842c6361d32c69"
},
".local\\native-qa\\navigation-palette-20260913-01\\closure.json": {
"bytes": 469,
"sha256": "b7760d98b02418e9cf64a687642e439452b8e03cd90f2fee17eb83836babe699"
},
".local\\navigation-palette-gates-20260913\\artifacts-44095f7\\environment.json": {
"bytes": 2051,
"sha256": "8dfed55e08d2cbedd72c0115c676d3816128e1eb99145845067070d3c453e728"
},
".local\\rename-scroll-gates-20260913\\preview-bebf9f5.inputs.json": {
"bytes": 108345,
"sha256": "76c68f986c22a8e36687c573170a05f6e77a034a2c8784f2a0648a37cbecda8e"
},
".local\\rename-scroll-gates-20260913\\preview-bebf9f5.log": {
"bytes": 1679,
"sha256": "430f6497303978be894e231312e0c70d2762cf0afeef1d9a08e6318073c2e701"
},
".local\\rename-scroll-gates-20260913\\preview-bebf9f5.result.json": {
"bytes": 1332,
"sha256": "8694d1dc46edc942abf0a5d8d8b86423c1f60e1d3ac6c2e1c91424196535817e"
},
".local\\native-qa\\navigation-palette-20260913-01\\evidence\\043-preview-scrolled.jpg": {
"bytes": 125351,
"sha256": "6913a8d2868e6cd3ed34b11abc4c8da6679dac77dbd3b94ba7af6bb70055101a"
},
".local\\native-qa\\navigation-palette-20260913-01\\evidence\\043-preview-scrolled.json": {
"bytes": 535,
"sha256": "7f8c002f6b43b514e52ece18681bfb5a6df2387d6cb9ffd20b63c0509e90f2a8"
},
".local\\native-qa\\navigation-palette-20260913-01\\evidence\\044-preview-details.jpg": {
"bytes": 115383,
"sha256": "90a13274497de7eff3851374f59264e16a5fe66a8ea19d8e1d22895176c5b4df"
},
".local\\native-qa\\navigation-palette-20260913-01\\evidence\\044-preview-details.json": {
"bytes": 554,
"sha256": "dbc9fce5f7c68ee927a8f274fad8f84cf4bc63265ce789eb5d115c473b73b128"
},
".local\\native-qa\\navigation-palette-20260913-01\\evidence\\045-preview-return-scroll-reset.jpg": {
"bytes": 112885,
"sha256": "3b07848e5d9ce60734024618f6b9ab32f86463cec368ec8c81b416ae56630fff"
},
".local\\native-qa\\navigation-palette-20260913-01\\evidence\\045-preview-return-scroll-reset.json": {
"bytes": 600,
"sha256": "e1a0526cd13541c89b646fc396325534e0a85a67f9d7725279bcc0a5671ba4d6"
},
".local\\native-qa\\navigation-palette-20260913-01\\source-baseline\\oa.arcadia": {
"bytes": 2364,
"sha256": "c04efaa1ae5a2053e63aac70f79ea7bb845ef1db1ff8e68f23abfe24f1bc180f"
},
".local\\native-qa\\navigation-palette-20260913-01\\source-baseline\\project.arcadia": {
"bytes": 606,
"sha256": "260505b7f54a0d256bce2af8499bb46cc78ffe564628bd5f976ce358d1796f3a"
},
".local\\native-qa\\navigation-palette-20260913-01\\source-baseline\\sa\\assurance.arcadia": {
"bytes": 682,
"sha256": "ab76044836e4dcd42a82d316846ec87da2108939aa2037640c5bca1d2ecdee0f"
},
".local\\native-qa\\navigation-palette-20260913-01\\source-baseline\\sa\\participants.arcadia": {
"bytes": 1231,
"sha256": "1abad579812e77877b45a3d8e3c3e9da734be2d04a0254cc730a5257ebd2dc88"
},
".local\\native-qa\\navigation-palette-20260913-01\\source-baseline\\sa\\reporting.arcadia": {
"bytes": 3061,
"sha256": "893050516ce47f07039f04879474c7a019b8b2f7b6002a8d950b005334e34692"
},
".local\\native-qa\\navigation-palette-20260913-01\\source-baseline\\views.arcadia": {
"bytes": 3508,
"sha256": "e29ad3f406a6a50d2f0ae2ca2a53ee3b0c18222cd4098704a46d4f48b64ea17f"
},
".local\\native-qa\\navigation-selection-stage-44095f7\\libunwind.dll": {
"bytes": 190464,
"sha256": "aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a"
},
".local\\rename-scroll-gates-20260913\\list-feab202.result.json": {
"bytes": 121495,
"sha256": "66c770d7e0d42ea09038022c2e5542e1eb3355ee414bdf582e5cef402455c99f"
},
".local\\rename-scroll-gates-20260913\\list-feab202.admission.json": {
"bytes": 121127,
"sha256": "db0f1c87155ef6e19c50a4adb2cc1d9d78da5b61c07e59e4fef4f6f67ada2629"
},
".local\\rename-scroll-gates-20260913\\list-feab202.inputs.json": {
"bytes": 108345,
"sha256": "da82cac980f6e10d14363279b1795e3df95adfca4bf5fb786f268b1979ec8664"
},
".local\\rename-scroll-gates-20260913\\list-feab202.log": {
"bytes": 119428,
"sha256": "76f68f9d938182e97ae0bb82ae9642657da3039b850445083319d33a6a239de0"
},
".local\\rename-scroll-gates-20260913\\preview-feab202.result.json": {
"bytes": 1330,
"sha256": "733afba2af1e28c904e98f75db5c7af7437cbfddb4ba9de27a9e8e2911031668"
},
".local\\rename-scroll-gates-20260913\\preview-feab202.admission.json": {
"bytes": 1581,
"sha256": "ac8a025c82f9b4bdd0843dba6de73c9139ff64a2052b510c275400ede9a3515b"
},
".local\\rename-scroll-gates-20260913\\preview-feab202.inputs.json": {
"bytes": 108345,
"sha256": "da82cac980f6e10d14363279b1795e3df95adfca4bf5fb786f268b1979ec8664"
},
".local\\rename-scroll-gates-20260913\\preview-feab202.log": {
"bytes": 989,
"sha256": "6c00dcd5845e3af0e27670556b15854dbc4b9a7429b6db4c043201ef8bab3c24"
},
".local\\rename-scroll-gates-20260913\\rename-feab202.result.json": {
"bytes": 1336,
"sha256": "c9b2f688679baaf4cab9445650895dafa5b7d10186b4c97c90e840546f5566ce"
},
".local\\rename-scroll-gates-20260913\\rename-feab202.admission.json": {
"bytes": 5467,
"sha256": "6e2979d8f5e02bc28ab07abb666b91e0ce116602eb8a17f2260c50f90955d15a"
},
".local\\rename-scroll-gates-20260913\\rename-feab202.inputs.json": {
"bytes": 108345,
"sha256": "da82cac980f6e10d14363279b1795e3df95adfca4bf5fb786f268b1979ec8664"
},
".local\\rename-scroll-gates-20260913\\rename-feab202.log": {
"bytes": 5038,
"sha256": "7b80bef1e5816e4e306d64dc9118b87e507606ea709a57c2a3ba346e383c4dd2"
},
".local\\rename-scroll-gates-20260913\\navigation-feab202.result.json": {
"bytes": 1329,
"sha256": "8abba418fbb681c24908dd675d9de3075668b309990e90d40870b89e90681d0c"
},
".local\\rename-scroll-gates-20260913\\navigation-feab202.admission.json": {
"bytes": 3279,
"sha256": "c33ff3602fff3d3af8481d17133a28856fa9a291a3a20e15c7067a5c6a6b10d8"
},
".local\\rename-scroll-gates-20260913\\navigation-feab202.inputs.json": {
"bytes": 108345,
"sha256": "da82cac980f6e10d14363279b1795e3df95adfca4bf5fb786f268b1979ec8664"
},
".local\\rename-scroll-gates-20260913\\navigation-feab202.log": {
"bytes": 2749,
"sha256": "7f157a302b1a993ec42e4818d7bbcecd4fe797626bb9998505052f543847ea6c"
},
".local\\rename-scroll-gates-20260913\\source-navigation-feab202.result.json": {
"bytes": 1339,
"sha256": "6d70787817eb128ecf4ae6fb5f2fe7ee1a75c118789fb2e0800f75044001b3c4"
},
".local\\rename-scroll-gates-20260913\\source-navigation-feab202.admission.json": {
"bytes": 6466,
"sha256": "b76ec6fc633b4166b83ba15c5028cb62fadafcc1bafbdd403da82dffc39d042e"
},
".local\\rename-scroll-gates-20260913\\source-navigation-feab202.inputs.json": {
"bytes": 108345,
"sha256": "da82cac980f6e10d14363279b1795e3df95adfca4bf5fb786f268b1979ec8664"
},
".local\\rename-scroll-gates-20260913\\source-navigation-feab202.log": {
"bytes": 6107,
"sha256": "add29a3188eb1ee26fee4a58cd2725f4caf518127adedae377d79ec741d34ddb"
},
".local\\rename-scroll-gates-20260913\\full-feab202.result.json": {
"bytes": 1299,
"sha256": "21a157f6a49fc93adc6f348e8601c895f128ec6d56e47f702927554670768d37"
},
".local\\rename-scroll-gates-20260913\\full-feab202.admission.json": {
"bytes": 121127,
"sha256": "12ba8d77a7a1c024192ccb5d9b365bbb5d9385323b48ebf0cc31c60a580a3701"
},
".local\\rename-scroll-gates-20260913\\full-feab202.inputs.json": {
"bytes": 108345,
"sha256": "da82cac980f6e10d14363279b1795e3df95adfca4bf5fb786f268b1979ec8664"
},
".local\\rename-scroll-gates-20260913\\full-feab202.log": {
"bytes": 126359,
"sha256": "a18937ad4298abd5c7882a8f9a5cbd2df48e5cc7916a7e55c4bfb08d7e77d582"
},
".local\\rename-scroll-gates-20260913\\strict-feab202.result.json": {
"bytes": 1044,
"sha256": "a3857d8deb19c6dde49fa1e6484d5d31ffb80de1803e8cb0ab7ecd1f5e1f36ce"
},
".local\\rename-scroll-gates-20260913\\strict-feab202.admission.json": {
"bytes": 699,
"sha256": "39fbbd18af04e30dd538f15ab9f5d2834f378674f214cdc24f594cd954fa2c92"
},
".local\\rename-scroll-gates-20260913\\strict-feab202.inputs.json": {
"bytes": 108345,
"sha256": "da82cac980f6e10d14363279b1795e3df95adfca4bf5fb786f268b1979ec8664"
},
".local\\rename-scroll-gates-20260913\\strict-feab202.log": {
"bytes": 365,
"sha256": "ee9c351b03a05fb18b22f89025476b2e51fea559c4aa7bbe1164aba74a68ab88"
},
".local\\rename-scroll-gates-20260913\\gui-feab202\\result.json": {
"bytes": 2768,
"sha256": "123f67ce1ca618129683499f7a4806b402dcab7efc1d7e7763f96d3f56348af9"
},
".local\\rename-scroll-gates-20260913\\gui-feab202\\environment.json": {
"bytes": 2112,
"sha256": "1f5d06d7f871fd97a60e80d1b421883e1342e79903bfb4d907e23d8cf21b99d8"
},
".local\\rename-scroll-gates-20260913\\gui-feab202\\inputs.json": {
"bytes": 114660,
"sha256": "83091bfc42eef198442b03cd714262d3bf87cd35aa965134eaff210933e18c00"
},
".local\\rename-scroll-gates-20260913\\gui-feab202\\cargo.jsonl": {
"bytes": 268460,
"sha256": "68313640f4a221723ac57b7ecf71b14034544b624e6ea7185bfe20ec7afff6ae"
},
".local\\rename-scroll-gates-20260913\\gui-feab202\\cargo.stderr.log": {
"bytes": 263,
"sha256": "10abc4f9e9bcfeeb47664fc39f177b12c0b0d88da805bc9b25621c37d5c7c9e9"
},
".local\\toolchain\\llvm-mingw-20260908-ucrt-x86_64\\bin\\libunwind.dll": {
"bytes": 190464,
"sha256": "aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a"
}
},
"gui": {
"bytes": 116591104,
"sha256": "521ca576337a4b5add70c8fb7f101e459274f9b4462a5c0bdd3290cc1ca72b58"
},
"runtime": {
"bytes": 190464,
"sha256": "aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a"
},
"baseline": {
"oa.arcadia": {
"bytes": 2364,
"sha256": "c04efaa1ae5a2053e63aac70f79ea7bb845ef1db1ff8e68f23abfe24f1bc180f"
},
"project.arcadia": {
"bytes": 606,
"sha256": "260505b7f54a0d256bce2af8499bb46cc78ffe564628bd5f976ce358d1796f3a"
},
"sa/assurance.arcadia": {
"bytes": 682,
"sha256": "ab76044836e4dcd42a82d316846ec87da2108939aa2037640c5bca1d2ecdee0f"
},
"sa/participants.arcadia": {
"bytes": 1231,
"sha256": "1abad579812e77877b45a3d8e3c3e9da734be2d04a0254cc730a5257ebd2dc88"
},
"sa/reporting.arcadia": {
"bytes": 3061,
"sha256": "893050516ce47f07039f04879474c7a019b8b2f7b6002a8d950b005334e34692"
},
"views.arcadia": {
"bytes": 3508,
"sha256": "e29ad3f406a6a50d2f0ae2ca2a53ee3b0c18222cd4098704a46d4f48b64ea17f"
}
},
"scope": "Closed source/build admission only; native outcome remains manual. No semantic oracle reuse.",
"created_utc": "2026-09-13T12:03:02.776591+00:00",
"payloads": {
"arcadia-studio.exe": {
"bytes": 116591104,
"sha256": "521ca576337a4b5add70c8fb7f101e459274f9b4462a5c0bdd3290cc1ca72b58"
},
"libunwind.dll": {
"bytes": 190464,
"sha256": "aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a"
}
}
}
@@ -0,0 +1,34 @@
{
"environment": {
"CARGO_BUILD_JOBS": "1",
"CARGO_HOME": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo",
"CARGO_TARGET_X86_64_PC_WINDOWS_GNULLVM_LINKER": "clang.exe",
"RUSTUP_HOME": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\rustup"
},
"tools": {
"rustc": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\bin\\rustc.EXE",
"bytes": 12721664,
"sha256": "6f4bef66261261fcb43131be8720bab817d403a09edec7455c371974b90bdb7e",
"version": "rustc 1.98.1 (48a229cea 2026-09-01)\nbinary: rustc\ncommit-hash: 48a229ceaefd4985c50990b14116b6d856af0985\ncommit-date: 2026-09-01\nhost: x86_64-pc-windows-gnullvm\nrelease: 1.98.1\nLLVM version: 22.1.8\n"
},
"cargo": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\bin\\cargo.EXE",
"bytes": 12721664,
"sha256": "6f4bef66261261fcb43131be8720bab817d403a09edec7455c371974b90bdb7e",
"version": "cargo 1.98.1 (797e8a9bc 2026-08-05)\n"
},
"clang": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\llvm-mingw-20260908-ucrt-x86_64\\bin\\clang.EXE",
"bytes": 14336,
"sha256": "93303edd5791e4b60682f819267a34c349e5f52d052d067e006e76d21cc82ea4",
"version": "clang version 23.1.1 (https://github.com/llvm/llvm-project.git 6dfe1677ab8dffbc6ec13d53a1e0215d75147689)\nTarget: x86_64-w64-windows-gnu\nThread model: posix\nInstalledDir: C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/llvm-mingw-20260908-ucrt-x86_64/bin\nConfiguration file: C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/llvm-mingw-20260908-ucrt-x86_64/bin/x86_64-w64-windows-gnu.cfg\n"
}
},
"launcher": {
"bytes": 8043,
"sha256": "c6ad3ac61b30d960fcdcaa20f14ea15335dc2dbcc55e2dbed2e48d7e9a7b5bb4"
},
"profile": "unoptimized development",
"target_mode": "Cargo default/configured target; no explicit --target; artifacts require Windows x64 PE"
}
@@ -0,0 +1,226 @@
{
"utc": "2026-09-13T06:52:53.862557+00:00",
"source": "44095f78c28b79d6d085863dc928adba8e24d955",
"mode": "list",
"result_sha256": "d9b48f7f2812d52306fda0826a03f8bd58e9fb5cb8f7e988f7a283793c1be3a8",
"log_sha256": "adf525a82336fd35b10d86e54eb6e5672841de77fc418ce552641ee10a809369",
"inputs_sha256": "ee98d6d33485dd2233770ea8f7e9f08f95efbd6098f3d1846d33e568ac3564fe",
"required_names_sha256": "e426be35c31925d91b5ce6df15abe30f814ba6134a8013ce47208c365df7127a",
"verified_inputs": 581,
"artifact": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\target\\debug\\deps\\arcadia_studio-ac73ce8f77f371eb.exe",
"bytes": 150299136,
"sha256": "55fdef506646e65fbb965ceba3cc1b8e5911a8dd018c6ca71cdfb50feb017be6"
},
"groups": {
"navigation_union": [
"app::allocation_drag::tests::navigation_union::old_chooser_envelopes_preserve_a_current_canvas_gesture",
"app::allocation_drag::tests::navigation_union::stale_gesture_packets_preserve_navigation_and_a_new_live_cancel_still_works",
"app::diagram_removal_tests::navigation_union::port_navigation_then_canvas_delete_preserves_owner_and_restores_exact_history",
"app::diagram_removal_tests::navigation_union::state_row_navigation_then_canvas_delete_preserves_work_and_restores_exact_history",
"app::source_rename::tests::navigation_union_tests::document_reset_retains_all_three_worker_slots_until_their_exact_results_arrive",
"app::source_rename::tests::navigation_union_tests::late_target_and_preview_results_release_only_their_slot_and_preserve_first_camera_measurement",
"app::source_rename::tests::navigation_union_tests::loading_and_ready_diagram_choosers_reject_a_previously_captured_rename_begin",
"app::source_rename::tests::navigation_union_tests::palette_union::allocation_keyboard_notification_preserves_navigation_and_first_measurement",
"app::source_rename::tests::navigation_union_tests::palette_union::captured_behavior_toolbar_cannot_retire_a_new_documents_navigation",
"app::source_rename::tests::navigation_union_tests::palette_union::captured_old_chooser_context_and_every_token_variant_are_inert",
"app::source_rename::tests::navigation_union_tests::palette_union::captured_old_source_query_and_find_close_preserve_the_new_destination",
"app::source_rename::tests::navigation_union_tests::palette_union::current_chooser_open_and_close_keep_their_boundary_and_worker_semantics",
"app::source_rename::tests::navigation_union_tests::palette_union::current_source_query_and_checked_find_close_remain_live",
"app::source_rename::tests::navigation_union_tests::palette_union::stale_rename_begin_cannot_retire_allocation_epoch_or_new_navigation",
"app::source_rename::tests::navigation_union_tests::rename_modal_rejects_queued_diagram_and_source_navigation_without_losing_approval",
"app::source_rename::tests::navigation_union_tests::rename_then_exact_caret_diagram_navigation_preserves_complete_model_undo_redo_history",
"app::source_rename::tests::navigation_union_tests::stale_begin_close_and_actual_confirm_leave_new_diagram_focus_and_pending_measurement_unchanged"
],
"preview_scroll_tests": [
"app::source_rename::tests::preview_scroll_tests::delayed_page_and_approval_operations_cannot_reset_a_new_destination",
"app::source_rename::tests::preview_scroll_tests::details_round_trip_retires_held_reset_without_changing_page_or_repeated_visibility_scroll",
"app::source_rename::tests::preview_scroll_tests::explicit_navigation_resets_retained_scroll_but_id_change_alone_does_not",
"app::source_rename::tests::preview_scroll_tests::repeated_page_visits_filters_and_fast_preview_completion_have_distinct_destinations"
],
"behavior::scenario_activation::": [
"behavior::scenario_activation::tests::a_fragment_cannot_make_crossed_calls_an_unambiguous_caller_execution",
"behavior::scenario_activation::tests::activation_shoulders_under_label_backplates_select_their_call",
"behavior::scenario_activation::tests::actual_canvas_pointer_selects_each_exposed_shoulder_under_zoom_and_pan",
"behavior::scenario_activation::tests::alternative_and_parallel_operand_local_calls_do_not_nest_from_screen_order",
"behavior::scenario_activation::tests::an_inactive_self_call_has_no_fabricated_parent_and_three_nested_calls_expose_three_columns",
"behavior::scenario_activation::tests::call_uuid_order_does_not_choose_activation_columns_or_message_anchors",
"behavior::scenario_activation::tests::inherited_execution_anchors_a_self_call_inside_an_operand_before_returning_after_the_fragment",
"behavior::scenario_activation::tests::long_message_backplates_do_not_erase_selected_activation_border_pixels",
"behavior::scenario_activation::tests::missing_reply_is_a_short_explicit_open_span_and_an_uncorrelated_reply_closes_nothing",
"behavior::scenario_activation::tests::nested_calls_expose_both_bars_and_end_at_their_exact_replies_in_both_directions",
"behavior::scenario_activation::tests::nested_correlations_returning_in_alternative_operands_remain_nested_before_the_fragment",
"behavior::scenario_activation::tests::reentrant_call_uses_the_other_receiver_without_inventing_a_caller_execution",
"behavior::scenario_activation::tests::self_call_receives_at_lower_loop_end_and_self_reply_returns_to_the_parent",
"behavior::scenario_activation::tests::sequential_calls_reuse_column_and_crossed_replies_keep_their_correlations"
],
"behavior::scenario_lifecycle::": [
"behavior::scenario_lifecycle::render::tests::birth_label_clip_keeps_padded_world_bounds_at_each_scene_scale",
"behavior::scenario_lifecycle::render::tests::birth_label_clip_preserves_parent_viewport_bounds",
"behavior::scenario_lifecycle::render::tests::box_text_clip_intersects_parent_viewport_and_rejects_empty_interiors",
"behavior::scenario_lifecycle::render::tests::panned_header_and_create_clips_use_screen_translation_and_actual_viewport",
"behavior::scenario_lifecycle::render::tests::real_scene_birth_death_markers_align_endpoints_and_win_selection_without_mutating_source",
"behavior::scenario_lifecycle::render::tests::real_scene_branch_delete_clips_only_its_activation_and_keeps_unanswered_call_visible",
"behavior::scenario_lifecycle::render::tests::real_scene_conditional_repeated_and_parallel_scopes_do_not_claim_definite_continuation",
"behavior::scenario_lifecycle::render::tests::real_scene_empty_and_create_only_use_visible_root_extents_not_insertion_bounds",
"behavior::scenario_lifecycle::render::tests::real_scene_lifecycle_edit_undo_redo_restores_exact_source_and_changed_geometry",
"behavior::scenario_lifecycle::render::tests::real_scene_long_header_title_and_detail_keep_names_and_have_bounded_clips",
"behavior::scenario_lifecycle::render::tests::real_scene_minimum_zoom_marker_halos_do_not_steal_adjacent_capsule_or_header_hits",
"behavior::scenario_lifecycle::render::tests::real_scene_minimum_zoom_near_ordinary_message_wins_over_lifecycle_halos",
"behavior::scenario_lifecycle::render::tests::real_scene_panned_zoomed_program_keeps_header_birth_and_death_hit_identity",
"behavior::scenario_lifecycle::render::tests::real_scene_self_delete_caption_clears_the_preceding_action_box",
"behavior::scenario_lifecycle::render::tests::real_scene_self_lifecycle_elbows_end_on_recorded_marker_rows",
"behavior::scenario_lifecycle::render::tests::real_scene_unassigned_lanes_and_explicit_incomplete_receiver_keep_real_marker_identity",
"behavior::scenario_lifecycle::render::tests::real_scene_wide_latin_header_exceeds_old_character_budget",
"behavior::scenario_lifecycle::render::tests::union_tests::admitted_calls_without_sender_polylines_still_have_logical_correlation_metadata",
"behavior::scenario_lifecycle::render::tests::union_tests::admitted_death_and_incomplete_later_reply_do_not_fabricate_an_answered_execution",
"behavior::scenario_lifecycle::render::tests::union_tests::admitted_delayed_create_nested_calls_replies_delete_share_one_geometry_pipeline",
"behavior::scenario_lifecycle::render::tests::union_tests::admitted_self_lifecycle_and_self_call_keep_distinct_send_receive_rows",
"behavior::scenario_lifecycle::render::tests::union_tests::admitted_unresolved_operand_keeps_unanswered_cue_without_any_visible_segment",
"behavior::scenario_lifecycle::render::tests::union_tests::clipped_operand_preserves_original_nested_or_crossed_correlation_distinction",
"behavior::scenario_lifecycle::render::tests::union_tests::conditional_death_then_recreate_never_revives_call_but_keeps_open_sibling",
"behavior::scenario_lifecycle::render::tests::union_tests::invalid_prebirth_call_and_postdeath_reply_remain_rejected_with_defensive_scene_clipping",
"behavior::scenario_lifecycle::render::tests::union_tests::test_only_upstream_row_offsets_update_lifetime_segments_and_endpoints_without_authoring",
"behavior::scenario_lifecycle::tests::alternative_death_does_not_kill_its_displayed_sibling",
"behavior::scenario_lifecycle::tests::conditional_birth_does_not_infer_absence_in_siblings_or_ancestors",
"behavior::scenario_lifecycle::tests::explicit_receiver_is_authoritative_even_with_missing_exchange",
"behavior::scenario_lifecycle::tests::lifecycle_free_fragments_do_not_poison_other_lanes",
"behavior::scenario_lifecycle::tests::loop_lifetime_is_local_and_warning_bearing_loops_remain_drawable",
"behavior::scenario_lifecycle::tests::missing_geometry_is_reported_without_nonfinite_or_guessed_markers",
"behavior::scenario_lifecycle::tests::optional_cleanup_inside_loop_does_not_claim_balanced_or_definite_exit",
"behavior::scenario_lifecycle::tests::projection_retains_exact_authored_source_and_does_not_enter_history",
"behavior::scenario_lifecycle::tests::root_lifetime_has_exact_birth_death_boundaries_without_source_mutation",
"behavior::scenario_lifecycle::tests::scenario_use_is_opaque_and_never_imports_callee_lifecycle_events"
],
"context_menu::": [
"context_menu::tests::a_new_context_token_cannot_reuse_the_previous_mouse_press_or_scroll",
"context_menu::tests::actions_area_does_not_swallow_first_independent_click_after_overlay_consumed_its_release",
"context_menu::tests::anchors_outside_the_window_and_nonfinite_input_stay_bounded",
"context_menu::tests::clicking_disabled_or_dragging_off_an_action_never_executes_it",
"context_menu::tests::coalesced_dismissal_release_does_not_swallow_the_next_independent_click",
"context_menu::tests::empty_and_disabled_only_menus_still_capture_keys_and_escape_closes",
"context_menu::tests::keyboard_skips_headers_separators_and_disabled_actions_and_invokes_once",
"context_menu::tests::mounted_keyboard_menu_paints_target_and_scroll_thumb_then_invokes_that_action",
"context_menu::tests::outside_dismissal_consumes_press_and_release_across_controlled_close",
"context_menu::tests::reconstructed_overlay_uses_retained_layout_for_rows_and_hit_testing",
"context_menu::tests::retained_overlay_layout_keeps_measured_width_and_scrollbar_after_reconstruction",
"context_menu::tests::tall_menu_clamps_to_viewport_and_keyboard_wheel_and_scrollbar_reach_the_end"
],
"forms::reference_chooser::": [
"forms::reference_chooser::tests::captured_choice_cannot_cross_document_revision_draft_record_or_array_path",
"forms::reference_chooser::tests::catalog_search_disambiguates_repeated_names_containment_alias_and_exact_placement_identity",
"forms::reference_chooser::tests::dismissal_swallows_matching_release_across_closed_rebuild_but_next_click_reaches_parent",
"forms::reference_chooser::tests::empty_search_escape_tab_and_optional_clear_do_not_silently_choose_nil",
"forms::reference_chooser::tests::historical_paths_never_open_and_only_explicit_choice_or_clear_is_a_write",
"forms::reference_chooser::tests::mounted_clipboard_paste_and_ime_commit_preserve_whole_strings_without_selecting",
"forms::reference_chooser::tests::mounted_filtered_row_click_uses_the_displayed_identity_and_scoped_write_intent",
"forms::reference_chooser::tests::mounted_input_preserves_rapid_same_batch_typing_and_cursor_across_controlled_rebuilds",
"forms::reference_chooser::tests::mounted_keyboard_pages_and_selects_only_the_highlighted_visible_candidate_once",
"forms::reference_chooser::tests::mounted_overlay_clamps_at_three_field_positions_and_keeps_results_and_query_bounded",
"forms::reference_chooser::tests::mounted_query_change_rejects_old_release_and_old_result_events_without_locking_popup",
"forms::reference_chooser::tests::mounted_query_then_escape_in_one_batch_closes_and_relative_keys_keep_input_order",
"forms::reference_chooser::tests::out_of_order_query_serials_cannot_restore_obsolete_results",
"forms::reference_chooser::widget::paint_tests::mounted_chooser_keyboard_target_is_visible_and_enter_keeps_exact_identity"
],
"style::tests::": [
"style::tests::button_pair_couplings_cover_hover_and_disabled_states",
"style::tests::conditional_input_styles_preserve_readonly_selected_value_contrast",
"style::tests::default_checkbox_styles_keep_checks_and_outlines_distinct",
"style::tests::default_input_styles_keep_ordinary_values_and_visible_selection",
"style::tests::default_pick_list_and_menu_styles_cover_open_and_selected_states",
"style::tests::ordinary_editable_editor_styles_keep_their_own_selected_value_readable",
"style::tests::readonly::mounted_readonly_input_keeps_selection_copy_and_readable_paint",
"style::tests::selected_navigation_adds_a_visible_outline_and_preserves_disabled_ink",
"style::tests::semantic_text_and_essential_boundaries_have_contrast_on_canvas_surfaces",
"style::tests::source_editor_syntax_and_fallback_remain_readable_during_selection"
],
"allocation_drag::tests::": [
"allocation_drag::tests::allocation_artifact_and_manual_trace_cascades_are_named_and_refused",
"allocation_drag::tests::cache_plan_uses_candidate_index_and_same_pixel_different_target_changes_preview",
"allocation_drag::tests::collapsed_target_unfold_is_explicit_and_no_other_fold_changes",
"allocation_drag::tests::direct_exit_revealing_another_role_performer_has_truthful_refusal",
"allocation_drag::tests::explicit_different_performer_retains_advisory_role_warning",
"allocation_drag::tests::folded_subtree_cannot_hide_new_collision",
"allocation_drag::tests::geometry_refuses_new_overlap_bounds_and_invisible_headers_and_preserves_existing_overlap",
"allocation_drag::tests::malformed_scope_wrong_projection_duplicate_placement_and_stable_id_collision_refuse",
"allocation_drag::tests::mixed_p_x_y_refuses_semantic_and_arrange_instead_of_stretching_destination",
"allocation_drag::tests::oa_communication_incompleteness_remains_advisory_without_collateral_loss",
"allocation_drag::tests::oa_sa_incoming_between_outgoing_preserve_identity_source_history_and_other_views",
"allocation_drag::tests::oa_sa_one_leaf_move_refuses_when_ancestor_regrouping_introduces_unrelated_overlap",
"allocation_drag::tests::oa_sa_one_leaf_reassignment_and_outward_move_regroup_ancestors_without_moving_sibling",
"allocation_drag::tests::oa_sa_populated_collapsed_target_accepts_room_and_refuses_collision_without_relocating_contents",
"allocation_drag::tests::oa_sa_state_owned_action_and_availability_reject_reassignment_atomically",
"allocation_drag::tests::oa_sa_unfolding_prior_hidden_overlap_refuses_even_when_insertion_does_not_collide",
"allocation_drag::tests::own_deleted_allocation_routes_may_disappear_in_every_diagram_only",
"allocation_drag::tests::role_only_same_effective_performer_is_semantic_noop_and_outgoing_refuses",
"allocation_drag::tests::sa_port_and_deferred_exchange_allocation_cascade_refuses_and_retarget_is_invalid",
"allocation_drag::tests::same_performer_readability_preserves_snapped_noop_and_allocation_identity",
"allocation_drag::tests::scope_detects_first_child_allocation_and_role_transfer_and_finish_rejects_live_edits",
"allocation_drag::tests::selected_header_visibility_allows_viewport_edge_but_refuses_clipping",
"allocation_drag::tests::snapped_noop_returns_no_command_and_keeps_source_revision_and_redo",
"allocation_drag::tests::source_budget_refusal_keeps_project_bundle_history_and_retry_identity_exact",
"allocation_drag::tests::surviving_constraint_mutation_is_refused_even_when_core_candidate_is_valid",
"allocation_drag::tests::target_presentation_requires_accepted_identity_and_selected_header_visibility",
"allocation_drag::tests::toolbar_identity_allows_exact_incoming_placement_at_old_label_overlap",
"allocation_drag::tests::uniform_folded_grandchild_and_unplaced_scope_moves_exactly_q_and_all_l_oa_sa",
"allocation_drag::tests::uniform_role_only_and_mixed_direct_role_composites_same_target_do_not_allocate",
"allocation_drag::tests::uniformly_unassigned_composite_creates_only_stable_leaf_allocations_including_unplaced",
"allocation_drag::tests::unrequested_view_option_cleanup_is_not_whitelisted",
"allocation_drag::tests::unresolved_role_leaf_can_arrange_or_accept_explicit_target_without_guessing"
],
"app::allocation_drag::tests::": [
"app::allocation_drag::tests::actual_canvas_origin_change_cancels_held_work_before_any_legacy_release",
"app::allocation_drag::tests::arrange_is_one_gesture_and_snapped_noop_preserves_redo_and_source",
"app::allocation_drag::tests::candidate_semantics_are_cached_per_destination_with_stable_ids_and_own_index",
"app::allocation_drag::tests::destination_identity_does_not_describe_blocked_or_outside_viewport_as_unallocation",
"app::allocation_drag::tests::frozen_collapsed_target_uses_only_visible_header_and_port_edge_controls_occlude",
"app::allocation_drag::tests::frozen_targets_use_half_open_semantic_priority_and_refuse_incomparable_overlap",
"app::allocation_drag::tests::full_tree::actual_app_tree_dirty_description_retains_focus_and_middle_caret_for_next_key",
"app::allocation_drag::tests::full_tree::actual_app_tree_dirty_name_retains_focus_and_middle_caret_for_next_key",
"app::allocation_drag::tests::full_tree::actual_app_tree_exact_incoming_drag_keeps_destination_visible_and_canvas_stable",
"app::allocation_drag::tests::full_tree::actual_keyboard_arrange_shortcut_consumes_once_escape_cancels_and_dirty_owner_refuses",
"app::allocation_drag::tests::full_tree::actual_rendered_canvas_pixels_do_not_change_when_toolbar_feedback_text_changes",
"app::allocation_drag::tests::full_tree::actual_toolbar_hover_inspects_last_full_name_without_authorizing_an_outside_drop",
"app::allocation_drag::tests::modal_roundtrip_equal_fit_undo_resize_and_focus_retire_press_before_replay",
"app::allocation_drag::tests::mounted_clean_stationary_selects_exact_work_without_revision_or_legacy_apply",
"app::allocation_drag::tests::mounted_dirty_port_press_cannot_fall_through_to_applying_port_selection",
"app::allocation_drag::tests::mounted_dirty_property_press_does_not_select_apply_or_destroy_draft",
"app::allocation_drag::tests::mounted_oa_sa_ordered_incoming_between_outgoing_are_exact_single_history_steps",
"app::allocation_drag::tests::mounted_role_only_outgoing_refusal_retains_placement_and_same_performer_creates_no_allocation",
"app::allocation_drag::tests::mounted_uniform_parent_moves_hidden_placements_and_assigns_only_leaves",
"app::allocation_drag::tests::navigation_union::old_chooser_envelopes_preserve_a_current_canvas_gesture",
"app::allocation_drag::tests::navigation_union::stale_gesture_packets_preserve_navigation_and_a_new_live_cancel_still_works",
"app::allocation_drag::tests::oa_sa_clipped_selected_header_refuses_preview_release_and_retries_without_partial_source_or_history",
"app::allocation_drag::tests::oa_sa_toolbar_identity_accepts_exact_receiver_and_collapsed_header_drag",
"app::allocation_drag::tests::outside_release_is_cancel_and_does_not_remove_an_assignment",
"app::allocation_drag::tests::pending_behavior_draft_refuses_actual_work_press_and_equal_document_replacement_retires_packet",
"app::allocation_drag::tests::release_uses_ordered_native_position_before_later_motion_in_same_batch",
"app::allocation_drag::tests::same_snapped_position_on_opposite_shared_border_rebuilds_semantics_even_if_layout_refuses",
"app::allocation_drag::tests::source_and_modal_admission_reject_prebuilt_clean_press_without_selecting",
"app::allocation_drag::tests::source_refusal_is_atomic_and_a_new_gesture_can_retry_against_live_revision",
"app::allocation_drag::tests::stale_packets_do_not_cancel_a_newer_token_and_each_release_is_consumed_once",
"app::allocation_drag::tests::toolbar_destination_names_transformed_target_whose_header_is_clipped",
"app::allocation_drag::tests::toolbar_status_leaves_transformed_top_edge_work_header_readable"
],
"app::diagram_removal_tests::": [
"app::diagram_removal_tests::captured_confirmation_rejects_selection_document_revision_and_placement_changes",
"app::diagram_removal_tests::mounted_allocation_work_click_then_delete_without_redraw_removes_placement_once",
"app::diagram_removal_tests::mounted_bend_delete_has_priority_and_semantic_edge_delete_is_confirmed",
"app::diagram_removal_tests::mounted_clean_text_programmatic_focus_and_tab_remove_canvas_keyboard_ownership",
"app::diagram_removal_tests::mounted_inspector_can_take_focus_during_passive_save",
"app::diagram_removal_tests::mounted_oa_sa_delete_hides_exact_placement_and_round_trips_source_and_model",
"app::diagram_removal_tests::mounted_passive_save_never_grants_canvas_focus_or_restores_window_lost_focus",
"app::diagram_removal_tests::mounted_passive_save_retires_held_canvas_drag_but_allows_a_fresh_drag",
"app::diagram_removal_tests::mounted_placement_properties_selection_supports_hide_and_model_delete",
"app::diagram_removal_tests::mounted_programmatic_canvas_entry_needs_no_mouse_focus_boolean",
"app::diagram_removal_tests::mounted_removal_intents_reject_stale_selection_revision_owner_and_document",
"app::diagram_removal_tests::mounted_revision_and_history_preserve_the_actual_canvas_or_inspector_focus_owner",
"app::diagram_removal_tests::mounted_shift_delete_captures_target_cancel_escape_and_confirmation_replay",
"app::diagram_removal_tests::mounted_state_action_and_internal_rows_delete_relations_and_preserve_reused_work",
"app::diagram_removal_tests::mounted_state_delete_uses_state_placement_and_preserves_architecture_placement",
"app::diagram_removal_tests::mounted_window_modal_dirty_and_modifier_boundaries_retire_delete_focus",
"app::diagram_removal_tests::navigation_union::port_navigation_then_canvas_delete_preserves_owner_and_restores_exact_history",
"app::diagram_removal_tests::navigation_union::state_row_navigation_then_canvas_delete_preserves_work_and_restores_exact_history"
]
}
}
@@ -0,0 +1,19 @@
# Details-to-Preview native offset loss
2026-09-13, `/root/source8_lowering_plan`. Read-only source/evidence review at frozen native `44095f78c28b79d6d085863dc928adba8e24d955`; no compiler, GUI control or implementation change.
**Finding: offset loss contradicts the existing controller's stated intent; it is not an intentional page reset.**
`crates/oa-desktop/src/app/source_rename.rs:437–439` explicitly says leaving/returning to Preview keeps its selected page and retained scroll, while retiring delayed operations without scheduling return-to-top. Details toggles only visibility, destination visit ID, detail segment and detail content. Actual file/hunk/row/segment changes and changed filters separately request reset; repeated visibility requests are no-ops. The language RST at2142–2149 requires complete preview access and reachable controls outside the independently scrolling source preview, but does not itself explicitly specify the Details round-trip offset. Thus this is a demonstrated implementation-intent regression, not a newly inferred normative language requirement.
I viewed existing frames043 and045 and read their sidecars. Both show proposal `assess_report_union_trial`, file1/2 `sa/reporting.arcadia`, hunk1/3 and rows1–7/7. Frame043 is scrolled with line10 and changed declaration line11 visible; frame045 returns to context line8/top. The parent observed the intervening Full details view044. The proposal remains unaccepted. The image evidence supports viewport-offset loss while the logical page remains unchanged.
The apparent implementation mechanism is widget-subtree replacement: `dialog_content` mounts a Details column/text editor instead of the Preview column/Scrollable (`source_rename.rs:1030ff`). No preview offset is saved/restored by the Details handler. A new visit ID protects against late operations; it cannot preserve state after the actual Scrollable subtree is discarded. Source review identifies this mechanism; no instrumented widget execution occurred here.
The existing `details_round_trip_retires_held_reset_without_changing_page_or_repeated_visibility_scroll` regression at `preview_scroll_tests.rs:311ff` does mount Details in one branch. It verifies zero scheduled reset operations and retained logical page/approval, **then scrolls down again after returning** before asserting offset retention. Those assertions protect repeated visibility and rejection of a held prior reset, but cannot detect loss of the pre-Details offset. Its passing gate is valid for those narrower assertions and does not falsify this native finding.
Minimal regression before correction: settle a specific preview page, record a nonzero measured offset, toggle Details and actually diff/layout the Details subtree, return/diff/layout Preview, and assert the measured offset equals the recorded value **before calling any scroll operation**. Preserve same page/approval and complete source/model/history assertions. Retain a fast round-trip branch without an intervening Details mount and the delayed previous-visit reset control. Existing explicit file/hunk/row/segment/filter/new-approval reset tests must keep their reset semantics. An arbitrary return-to-top policy would require an explicit design change rather than relabeling this behavior.
Gitea issue20 was read live through MCP: title `Scenario diagrams are very rigid and its controls are bad`, owner contribution Codex-ytr83r, latest retrieved comment906 at2026-09-13T08:35:42Z. Its published Saved Scenario spacing/layout candidate is `07e611fb9432b5164e43c326f3e3c7e75e1e6567`, then pending compilation/runtime/strict/build/native. That work concerns saved views, spacing and geometry; it supplies no alternate Rename Details scroll policy and is on another machine. Do not import or modify it for this local preview defect. Parent owns integration/publication under the current navigation work.
The earlier local checklist phrase “Details return does not resurrect an old offset” referred to stale delayed-operation isolation, not resetting deliberate current scroll. More precisely: **return to the same preview page preserves its user's offset while assigning a fresh operation destination so an old queued reset cannot affect that return visit.** Current native evidence has found the first half incomplete.
@@ -0,0 +1,48 @@
# Rename Details scroll-retention correction
2026-09-13, `/root/source8_lowering_plan`. **Source-only implementation; no compiler, Rust tests, GUI or Gitea mutation.** Parent owns independent review, gates, native recheck and publication. Updated AGENTS was read: this ignored local handoff is for the local parent, not an artifact accessible to remote Gitea peers.
Frozen commit **`022d8cda2ad218ef85a98cce2e2f80a0af71e073`**, branch `codex/rename-details-scroll-956atf-20260913`, worktree `.local/rs`, parent **`357da24542eaa519c2a01c465be6c7d1acbc8126`** (440 production plus updated AGENTS). Worktree is clean. The initial longer worktree path failed during checkout on a Windows path-length error; Git removed that failed checkout. The short path was created successfully with per-command `core.longpaths=true`; no global configuration change or borrowed worktree edit occurred.
## Cause and behavior
Native440 evidence043–045 showed the same unaccepted proposal/file/hunk/row page returning from Full details at line8/top after deliberate scrolling to line11. The existing controller comment explicitly intended to preserve the current page and scroll while retiring old widget-operation visits. Details actually replaces the Preview Scrollable subtree with a text editor, so relying on retained widget state loses the offset.
The correction stores only the current preview's vertical offset in the existing form. Its Scrollable reports actual offsets with invocation, approval and destination-visit IDs. The existing outer rename envelope rejects reports for old forms/approvals/visits, hidden Details, and non-finite/negative offsets before shared App boundaries. Returning from Details rotates the existing destination ID and emits an absolute scroll restoration operation targeting that fresh Preview subtree. Explicit file/hunk/line/segment/filter/new-approval reset paths clear the stored offset and retain their existing return-to-top behavior. Repeated visibility requests remain no-ops. No persistence/model/Undo structure or modal admission policy changes.
The restoration uses existing Iced0.14.2 Scrollable on_scroll and existing runtime scroll_to APIs. The vertical offset clamps normally if the viewport/content extent changes; no physical offset outside the current scrollbar range is promised. Previous-visit reset/restore operations remain isolated by destination IDs.
## Exact changes and authored regression
Only two files differ from357:
- `crates/oa-desktop/src/app/source_rename.rs`: +38/-3. New PreviewScrolled event, one f32 form field, envelope checks, callback, restore operation and reset-field clearing.
- `crates/oa-desktop/src/app/source_rename/preview_scroll_tests.rs`: +121/-3. Measured visible Scrollable bounds and real wheel-event helper; one new mounted regression. The existing Details test now expects one restore operation instead of no operation; its same-page/approval, repeated-visibility and held-old-reset assertions remain.
New exact name, **UNRUN**:
`app::source_rename::tests::preview_scroll_tests::details_remount_restores_wheel_offset_before_any_rescroll`
It sends an actual WheelScrolled event into the real dialog widget, requires consumption and exactly one actual scroll report, measures nonzero offset and delivers the report through App.update. It exercises both an actually mounted Details subtree and a fast round trip without that intermediate mount. After return it measures equality **before any new scroll**, verifies page/approval/whole Project/SourceBundle/drafts/revision/cursor/Undo/Redo/dirty invariants, rejects a captured old report while hidden and after return, then requires an explicit file change to clear both visible and stored offsets.
The four preexisting mounted preview-scroll tests remain. They protect explicit paging/filter resets, repeated visits/new approvals and stale queued reset operations. Existing test `details_round_trip_retires_held_reset_without_changing_page_or_repeated_visibility_scroll` previously scrolled again after returning, masking initial offset loss; the new independent assertion closes that gap.
## Checks and integration implications
Standalone rustfmt completed, then `rustfmt --check --edition 2024 --config skip_children=true` and `git diff --check` passed. No lint suppression. No Cargo, compiler or test binary was invoked. **All correction tests and actual native restoration remain UNRUN.**
File membership is unchanged: **581** scoped gate inputs and **615** scoped build inputs including scripts. Exactly the two file bytes above change. Relative to the actual440 desktop listing, expected membership grows by one (**1099 expected**, not an actual listing); `preview_scroll_tests` grows from four to **five expected**. Other groups, including final16 selection and navigation_union17, retain their names. Existing exact-four scroll admission/config must be deliberately revised for the new source; do not relabel440 receipts or weaken exact membership. Actual frozen440 and analysis checkouts remain untouched.
Suggested parent gate sequence: fresh source review; compile/list; exact five mounted preview-scroll cases plus affected rename/modal/selection groups; applicable full/strict/build checks under the serialized lease; then reproduce the actual six-token native Details round trip at a nonzero offset and confirm unchanged file/hunk/page, with Cancel and saved-source preservation. Parent decides final combined gate scope. The isolated correction does not require importing peer issue20 Saved Scenario spacing/layout work.
Original diagnosis and source/native evidence mapping: `.local/navigation-preview-details-scroll-finding-20260913.md`, SHA256 `dd0edb3c0ae563c16d51ad4d2f96deb9e6bdbe92430b97b746d08d240771bb00`. Original frames and sidecars remain unchanged under `.local/native-qa/navigation-palette-20260913-01/evidence/043*`, `044*`, `045*`.
## Reviewed display-report correction and prepared gates
The preceding022 checkpoint is preserved in history and superseded for execution by **bebf9f594c6722200e95e92be2734acbea0dd700**. Source review found that an accepted `PreviewScrolled` report entered App's shared camera/allocation boundaries, `source_interaction()` and context validation: each wheel report rotated the source interaction token, cleared pending navigation data and compared/materialized source text. This is a source finding; no latency measurement is claimed.
The follow-up adds five lines to `app.rs`: immediately after the existing source-rename envelope check, an accepted PreviewScrolled returns through the existing single offset-mutation handler. It bypasses shared boundaries and `update_inner`, with no duplicate mutation or relaxed ownership check. Seven assertions/setup lines in the existing real-wheel test preserve the interaction token, camera/allocation boundaries and complete Evidence across report dispatch. The interaction assertion directly distinguishes022's unconditional `source_interaction` path. Existing stale-report and explicit page-reset tests remain.
Relative to357, **three** desktop files now differ (+171/-6), with581 gate inputs and615 build inputs unchanged in membership. Expected names remain1099 desktop / preview5; no additional test name was introduced by this correction. Worktree `.local/rs` is frozen clean at bebf. Independent source review `.local/navigation-preview-scroll-fix-independent-review-20260913.md` SHA256 `df288e7bd2f0a27918a74f439f78b009cced071f089de78a52a69b943c57dc69` found no remaining actionable issue and approves proceeding to gates only.
Fresh preparation is `.local/rename-scroll-gate-preparation-20260913/README.md`: exact portable357 test-only overlay commands, fixed listing/focused/full/strict admissions, and matching GUI-only build. All old440 helpers, receipts and package/native configurations are preserved. The portable red overlay avoids every new production event/field, so the intended failure measures actual old visible-offset behavior; the test-only commit/worktree and runtime receipts are not yet created. No compiler, test or native invocation occurred during this follow-up. **All corrected executable/native gates remain UNRUN.**
@@ -0,0 +1,17 @@
# Frozen bebf first executable gate
Source `bebf9f594c6722200e95e92be2734acbea0dd700`, worktree `.local/rs`;581 source inputs unchanged. Authorized existing root target cache was used after root compiler gates closed. Preparation revision2 SHA256 `244c6d45b47d1c2c3b69703a31616a0557d31bec3684f688c0e9a25268acb2aa` records this before execution; portable357 red overlay remains unrun by parent decision based on independently confirmed native440 failure.
Actual listing `list-bebf9f5` ran09:55:16–10:25:48UTC, exit0,1099 names. Exact admission passed10:26:16UTC; `.local/rename-scroll-gates-20260913/list-bebf9f5.admission.json` SHA256 `008e7685a16ffd59abde18b29df0796ec1f969f9fe2dbdaa4b2dce63d4639abf`. Test executable150323712 bytes, SHA256 `0fef7eac4ec6ee3effa7c09bc88739965afe06220facee00a71ad31e96b95ce3`.
Actual preview5 `preview-bebf9f5` ran10:26:40–10:27:06UTC, exit101: **4 passed,1 failed,0 ignored,1094 filtered**. All581 inputs and the admitted executable stayed unchanged. Unified sessions37124 (listing),29832 (admission) and62203 (preview) have closed. No preview admission was written, and rename37/navigation17/source-navigation51/full1099/strict/GUI build were not started.
Failure is `app::source_rename::tests::preview_scroll_tests::details_remount_restores_wheel_offset_before_any_rescroll` at test line458: stored `preview_offset`114.09999 differs from widget-operation measured offset114.0. This assertion precedes the Details transition, so the run does not yet exercise the new before/after return assertion. The preceding interaction/camera/allocation/complete-Evidence assertions passed in this first iteration. The four preexisting preview tests passed.
Raw result SHA256 `8694d1dc46edc942abf0a5d8d8b86423c1f60e1d3ac6c2e1c91424196535817e`; raw log SHA256 `430f6497303978be894e231312e0c70d2762cf0afeef1d9a08e6318073c2e701`, under `.local/rename-scroll-gates-20260913/preview-bebf9f5.*`. Preserve these failures, do not overwrite or recast them as accepted runtime evidence.
Source diagnosis: locked Iced0.14.2 `src/scrollable.rs:1739` `Viewport::absolute_offset` returns the fractional absolute state. `Scrollable::operate` lines551–558 sends `State::translation` to the operation; that translation explicitly rounds its vertical component at1901. Thus114.09999 versus114 is a distinction between raw report and visible translation, not evidence of lost scroll. Proposed correction is test-only: capture the actual report value, assert its rounded value equals the measured translation, assert the form retains the exact report, and retain exact before/after visible-position equality with no epsilon. Production restore behavior is still unverified by the new test and native candidate run. Source correction authorization/review and fresh frozen-source admissions are prerequisites to continuing.
Parent authorized that bounded correction, now committed as **feab2020d8e5b6bfdb59c86ab4aee161617b8b6f** atop bebf. Exactly one test file changes (+10/-6), with no production mutation. The report must be finite and positive; its rounded mapping and both stored-state comparisons are exact. The original visible before/after equality, no-rescroll ordering, stale reports, boundary invariants and explicit reset assertions remain. Rustfmt and diff checks completed; no new compiler/test invocation occurred.
Fresh `.local/rename-scroll-gate-preparation-r3-20260913` pins feab and fresh `*-feab202` stems. Manifest SHA256 `6a4a832a1da55d0f02bef0e7c682bd51a0d9ae370429136638ecbc28e8401545`; expected config SHA256 `963de41fc05471713627cf3571b3b071c68ff731a3f620753f6eb61411a319c8`. It preserves the original preparation and failed bebf receipts. All feab gates remain **UNRUN**, awaiting parent source/preparation review before a new listing.
@@ -0,0 +1,34 @@
# feab desktop gates closed
Source **feab2020d8e5b6bfdb59c86ab4aee161617b8b6f**, isolated clean `.local/rs`. All authorized desktop gates are now actually closed. The desktop compiler lease was released after GUI closure11:55:59UTC. No native candidate interaction or package/release acceptance is claimed here; parent owns that next evaluation.
| Actual gate | Outcome | Receipt under `.local/rename-scroll-gates-20260913` |
|---|---|---|
| Listing |1099 exact names, admitted|`list-feab202.admission.json`|
| Preview |5 passed, admitted|`preview-feab202.admission.json`|
| Rename |37 passed, admitted|`rename-feab202.admission.json`|
| Cross-module navigation |17 passed, admitted|`navigation-feab202.admission.json`|
| Source navigation |51 passed, admitted|`source-navigation-feab202.admission.json`|
| Full desktop |1096 passed,0 failed,3 exact existing ignores;1099 names admitted|`full-feab202.admission.json`|
| Strict desktop |All targets, `-D warnings`, exit0; admitted|`strict-feab202.admission.json`|
| Matching GUI |Locked/offline desktop binary build, Windows x64 PE preserved|`gui-feab202/result.json`|
Every test/strict run retained581 exact committed inputs. GUI build retained615 including scripts. The actual test executable remains150325248 bytes, SHA256 `a0bc95a60c7daf3400788a8821257bc964a34f7442d015f3745663d6646ad279`, at `target/debug/deps/arcadia_studio-ac73ce8f77f371eb.exe`; it was reread after GUI build and remained identical. Do not mutate it while parent native admission depends on it.
The preserved GUI is `.local/rename-scroll-gates-20260913/gui-feab202/arcadia-studio.exe`,116591104 bytes, SHA256 **521ca576337a4b5add70c8fb7f101e459274f9b4462a5c0bdd3290cc1ca72b58**. Its actual Cargo artifact is a non-test unoptimized build with debug assertions and overflow checks. GUI result SHA256 **123f67ce1ca618129683499f7a4806b402dcab7efc1d7e7763f96d3f56348af9**; input manifest SHA256 `83091bfc42eef198442b03cd714262d3bf87cd35aa965134eaff210933e18c00`. The builder preserved the reported artifact, verified PE identity and rechecked source/HEAD/status after preservation.
Admission hashes, in table order excluding GUI:
```text
list db0f1c87155ef6e19c50a4adb2cc1d9d78da5b61c07e59e4fef4f6f67ada2629
preview ac8a025c82f9b4bdd0843dba6de73c9139ff64a2052b510c275400ede9a3515b
rename 6e2979d8f5e02bc28ab07abb666b91e0ce116602eb8a17f2260c50f90955d15a
navigation c33ff3602fff3d3af8481d17133a28856fa9a291a3a20e15c7067a5c6a6b10d8
source-navigation b76ec6fc633b4166b83ba15c5028cb62fadafcc1bafbdd403da82dffc39d042e
full 12ba8d77a7a1c024192ccb5d9b365bbb5d9385323b48ebf0cc31c60a580a3701
strict 39fbbd18af04e30dd538f15ab9f5d2834f378674f214cdc24f594cd954fa2c92
```
Frozen preparation is `.local/rename-scroll-gate-preparation-r3-20260913`; its final preparation manifest SHA256 is `dd4c74f70fdae3e4644b7db1380454efd819f44e8d8db1b15fea7e878b9f2aa4`. Its original r3 admission helper was used unchanged for every admission. A provisional streamed-tail display seemed to split a test outcome, but a direct byte snapshot disproved that observation; there was no raw-output format defect and no admission-parser change or rerun.
The initial bebf listing success and preview4/1 failure are retained unchanged and explained in `.local/navigation-preview-scroll-bebf-runtime-20260913.md`. The feab correction distinguishes exact fractional Iced reports from exact rounded visible translation, without weakening the before/after restoration check. The portable357 test-only overlay remains unrun by parent decision because independently confirmed actual440 native failure supplies the before-fix evidence. Original440 receipts/helpers and preserved GUI/server artifacts were not overwritten.
@@ -0,0 +1,49 @@
# Independent source review: rename Preview / Full details scroll
2026-09-13. Reviewer `/root/source8_s2a_review`, GPT-6 Astra. Source-only review; no compiler, Rust test execution, GUI, candidate edits, Git staging, publication, or Gitea changes. Root controls integration and acceptance. This ignored local report is not yet available to remote peers.
## Reviewed sources and disposition
Initial candidate `022d8cda2ad218ef85a98cce2e2f80a0af71e073` atop `357da24542eaa519c2a01c465be6c7d1acbc8126`: reviewed its complete two-file diff, surrounding rename controller/admission/reset code, shared App update path, actual mounted test harness, and installed Iced implementation. One P2 finding below required correction. Follow-up `bebf9f594c6722200e95e92be2734acbea0dd700` was reviewed as an exact twelve-line addition atop022; clean worktree observed. **That finding is resolved at source level in bebf. No remaining actionable source defect identified within this scope; suitable to proceed to compilation and runtime gates, not native acceptance.**
Read author handoff `.local/navigation-preview-details-scroll-handoff-20260913.md` and prior native finding, and used previously independently inspected native440 frames043–045: returning from Full details moved the same preview from its deliberate nonzero offset back to the top. Those failed frames remain evidence of440; source correction does not change their result.
## F1 — P2: accepted viewport reports cross shared source boundaries (022; corrected in bebf)
Proof: `App::update` in `crates/oa-desktop/src/app.rs:1276` rejects stale rename envelopes, but022 then passes accepted `PreviewScrolled` through reveal/allocation/camera reconciliation and `update_inner`. The latter's source-interaction exclusions do not contain this new event; `source_interaction()` (`source_symbols.rs:143`) rotates the interaction ID and clears request/reveal/source_jump. After the event's single f32 assignment, `update_inner` calls `refresh_source_rename_context` (app.rs:1697 at022), which calls `rename_context_matches` and `rename_admission` (source_rename.rs:225–300). Healthy admission compares accepted and workspace source files and materializes active editor text. Thus every changed viewport report incurs document-dependent checks and changes unrelated source-interaction state. Before adding this callback, ordinary preview wheel motion was widget-local. No measured latency or observed data loss is claimed.
The risk also includes reports due to changed viewport geometry: Iced0.14.2 `scrollable.rs:1084,1586–1634` notifies on redraw when bounds/content/relative/absolute offsets change; redundant identical viewports are suppressed. This is not limited to one report per explicit wheel gesture.
Repair: retain the envelope rejection, then consume only an accepted `PreviewScrolled` before shared boundaries. Keep one existing offset handler and return its empty task. Add an invariant to the actual-wheel regression that fails if a valid display report becomes a new source interaction.
Falsifier: if022 routed accepted reports before `update_inner`, or the interaction exclusions included them and refresh did not run, this finding would not hold. Direct source traversal disproves those alternatives. The new interaction equality assertion would fail on022 because a fresh UUID is unconditionally assigned by `source_interaction`; tests remain UNRUN, so this is source reasoning rather than an executed failure.
Follow-up disposition: bebf adds the narrow five-line early return immediately after the rename envelope and before diagram reveal/allocation/camera work. It calls the existing `source_rename_event` arm, whose only action is assigning the validated offset and returning `Task::none`. No second mutation implementation or broad bypass is introduced. Seven added regression lines compare source interaction, camera/allocation boundaries, and full existing evidence around actual wheel-report delivery. Other rename events retain their existing update/admission route. F1 is resolved in the reviewed source.
## Other reviewed properties
- The event envelope requires a live form, current invocation and approval, Preview visible, current destination visit, and finite nonnegative offset. Reports from hidden Details, prior approval, closed/reopened form, or prior visit fail before shared App boundaries. The callback captures those exact IDs rather than consulting a later form. At bebf valid measurements update display state only.
- Details entry and return rotate the destination. Return captures the stored vertical offset in an absolute `scroll_to` aimed at the fresh preview ID, preserving file/hunk/line/segment and approval. Repeated visibility requests remain no-ops. A held operation from another visit cannot target the current widget; old reports are likewise rejected. This is the same explicit operation mechanism already used for paging resets, rather than relying on IDs to reset retained widget state.
- Explicit changed file/hunk/line/segment/filter navigation and new approvals call `reset_preview_position`, now clearing the stored offset as well as issuing the existing START operation when visible. A new approval also clears the offset when Details is mounted. Input clears approval; any later valid replacement resets before use. Search with no match still resets the visit. No new path changes model, save, acceptance, or Undo representation.
- Iced0.14.2 stores an absolute offset and resolves it against current content/viewport extent; preserving the same pixel position after a resize is bounded by the available range. The patch promises vertical retention only. Real wheel, scrollbar/touch, and geometry updates use the same Iced viewport notification path. No claim of unchanged horizontal state or impossible beyond-end offset is needed.
- The mounted regression sends a real wheel event to the actual dialog Scrollable, requires event consumption and exactly one report, then records measured nonzero geometry and feeds that message through App.update. It exercises both a genuinely replaced Details subtree and a rapid round trip without the intermediate mount. The offset is measured immediately after the restore operation, **before another scroll**; that matters because the older round-trip test scrolled again and masked the native failure. It also rejects an old report while hidden/after return and checks an explicit file navigation returns to zero. Existing four mounted reset/held-operation tests remain.
- The harness diffs and lays out the current widget tree before operating. Installed `iced_runtime-0.14.0/src/user_interface.rs:539` operates against the built interface layout, and `iced_winit-0.14.0/src/lib.rs:1742` dispatches widget tasks through that interface. These support the operation choice but do not establish real-window task/redraw ordering or final pixel appearance. Native rechecking remains necessary.
## Limits and required next evidence
All five preview-scroll tests and the combined candidate remain UNRUN by this reviewer. Author-reported rustfmt/diff checks are not compiler evidence. Require an actual source-bound listing and five-test execution, appropriate related rename/modal/selection and full/strict checks under the parent's serialized gates, then native reproduction at a nonzero preview offset: Details -> Preview with unchanged proposal/file/hunk/page and visible offset, repeated visibility, explicit navigation reset, and Cancel/save preservation. Include a resize or changed viewport if making a claim beyond the original fixed-size workflow. The source review does not prove rendered scroll accuracy, event timing under real input, or performance latency.
The new tests are proportionate and expose the observed restoration bug plus F1; absence of exhaustive forged numeric-event cases is not treated as a blocker given the direct finite/nonnegative and identity checks. No settled paging, modal, rename grammar, acceptance, or focus behavior was redesigned. Relative to357, bebf affects three existing Rust files; one new test, expected scroll membership five, remains an expectation until the actual listing. Original440 receipts must not be relabeled as bebf.
## Exact source bytes
SHA256 below is over `git show COMMIT:PATH` bytes, not working-tree newline conversion. The original controller file is unchanged by the twelve-line follow-up.
| Pin | Path | Bytes | SHA256 |
| --- | --- | ---: | --- |
| `022d8cd` | `crates/oa-desktop/src/app.rs` | 235017 | `61a82339a4dffe60145141722d797338d02dd57ae43e41f0bc0777fbb650a3e3` |
| `022d8cd` | `crates/oa-desktop/src/app/source_rename.rs` | 47140 | `ae6cda4befaa6eaebbcb176f50a2da5f4ccd94940257c178d70dd3614bd79fbe` |
| `022d8cd` | `crates/oa-desktop/src/app/source_rename/preview_scroll_tests.rs` | 18853 | `161f2e156b3cc24b645eeb29879c6b2a5c030db9564c2194ae3fed19ec412fb9` |
| `bebf9f5` | `crates/oa-desktop/src/app.rs` | 235342 | `814747ebc9b9ffe7286a8efc8669eb8a9c578e2988de43326c02446f8fb94748` |
| `bebf9f5` | `crates/oa-desktop/src/app/source_rename.rs` | 47140 | `ae6cda4befaa6eaebbcb176f50a2da5f4ccd94940257c178d70dd3614bd79fbe` |
| `bebf9f5` | `crates/oa-desktop/src/app/source_rename/preview_scroll_tests.rs` | 19224 | `642d2f3f98e3ed88ac3d9285532867f7ab2d35327b5285935067ef4aefa6e2e9` |
@@ -0,0 +1,13 @@
# Independent review: fractional viewport test correction
2026-09-13, `/root/source8_s2a_review`. Reviewed frozen `feab2020d8e5b6bfdb59c86ab4aee161617b8b6f` atop `bebf9f594c6722200e95e92be2734acbea0dd700`, clean `.local/rs`. No compiler, GUI, source edits or new runtime outcome.
**Source correction approved for rerun.** The actual bebf preview gate exits101, four passed/one failed. The failing new test stops at its pre-Details assertion at line458: actual stored viewport report114.09999 versus measured widget-operation translation114.0. It has not yet exercised the restore assertions, so this failure is not evidence of a restoration defect.
Installed Iced0.14.2 `src/scrollable.rs:1739–1748` returns fractional absolute viewport state. Its `operate` at538–558 supplies `State::translation`, whose vertical component rounds at1872–1901. The test's Geometry operation directly records that translated Vector. For this top-anchored vertical Scrollable and unchanged layout, comparing the raw report with its rounded display translation was the wrong test oracle. `scroll_to` at1843–1851 stores the absolute offset without rounding it.
The complete correction changes only this test file (+10/-6). It extracts the actual emitted report, requires finite positive input, checks report.round() exactly equals measured translation, and compares both stored-offset observations with the exact original report. It preserves exact rendered before/after equality before any rescrolling, both real Details remount and fast round trip, same page/approval, stale-report rejection, interaction/camera/allocation and complete evidence invariants, and explicit navigation reset to0. There is no epsilon, weakened restoration expectation, synthetic report replacement or production change.
Falsifier: a report that is rounded prematurely by the controller fails exact stored-report equality; an incorrect restore fails exact translated before/after equality; no real scroll fails the positive/nonzero measurements. The new correction itself remains UNRUN in this source review. The original4/1 failure must remain preserved, separately from any later result.
Source file SHA256 `856d73b370747f86e078b6e23f4eee58bf45038cb08e0d70929b6486355fbc00` (19622 Git-blob bytes). Original failed log SHA256 `430f6497303978be894e231312e0c70d2762cf0afeef1d9a08e6318073c2e701`; receipt SHA256 `8694d1dc46edc942abf0a5d8d8b86423c1f60e1d3ac6c2e1c91424196535817e`. This note supplements the original scroll-fix source review without revising its historical UNRUN statements.
@@ -0,0 +1,51 @@
{
"scope": "Isolated AST-selected checkpoint and terminator functions only; no admission, compiler, stage or GUI operation. Synthetic records are not native receipts.",
"helper_sha256": "27e03247a1d60e06b4c169bcae406ef5d26d483f89fc5895b64023207b2a9d14",
"checkpoint_cases": [
{
"case": "stable",
"raised": null,
"receipt": ".local/rename-scroll-checkpoint-simulation-feab202/stable/synthetic-trial/checkpoints/check/result.json",
"receipt_sha256": "1098a1be83f6c48db5dc4681baeca00db4a2e154772ea9316896b49f6b3e7b29",
"copy_consistent": true,
"actual_maps_retained": true
},
{
"case": "work-changes-before-copy",
"raised": "Checkpoint byte mismatch retained",
"receipt": ".local/rename-scroll-checkpoint-simulation-feab202/work-changes-before-copy/synthetic-trial/checkpoints/check/result.json",
"receipt_sha256": "a625b59cf96813ca5a5f434ddc4939170ff0bf9e263c7ffd128f8a215a1ec283",
"copy_consistent": false,
"actual_maps_retained": true
},
{
"case": "work-changes-after-copy",
"raised": "Checkpoint byte mismatch retained",
"receipt": ".local/rename-scroll-checkpoint-simulation-feab202/work-changes-after-copy/synthetic-trial/checkpoints/check/result.json",
"receipt_sha256": "8d60a85b026eec589777ca063e824be0a5246deb7f16902d1649c79b2d01e7f4",
"copy_consistent": false,
"actual_maps_retained": true
},
{
"case": "snapshot-corrupted",
"raised": "Checkpoint byte mismatch retained",
"receipt": ".local/rename-scroll-checkpoint-simulation-feab202/snapshot-corrupted/synthetic-trial/checkpoints/check/result.json",
"receipt_sha256": "a42cb6aed509df89b37569aa973b544e50e7f0c460f31e98f831ea6039c7ef78",
"copy_consistent": false,
"actual_maps_retained": true
},
{
"case": "copy-source-disappears",
"raised": "Checkpoint byte mismatch retained",
"receipt": ".local/rename-scroll-checkpoint-simulation-feab202/copy-source-disappears/synthetic-trial/checkpoints/check/result.json",
"receipt_sha256": "ba8ce78ca5e3af92beecf3e028047c704392f99861ae0e6fa82bcb27198d91cf",
"copy_consistent": false,
"actual_maps_retained": true
}
],
"terminator_controls": {
"valid_lf": true,
"wrong_byte_rejected": true,
"missing_byte_rejected": true
}
}
@@ -0,0 +1,247 @@
{
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"checked_preparation_records": 58,
"input_counts": {
"gates": 581,
"gui": 615
},
"gui_extra_inputs": [
"scripts/package-artifacts.py",
"scripts/package-common.ps1",
"scripts/package-linux.ps1",
"scripts/package-readme.md",
"scripts/package-windows.ps1",
"scripts/test-package-artifacts.py",
"scripts/test-windows-notices.ps1",
"scripts/windows-notices.ps1",
"scripts/windows-notices/CC0-1.0.txt",
"scripts/windows-notices/Cantarell-Regular-NOTICE.txt",
"scripts/windows-notices/DoumanAsh-clipboard-win-3b27cf2bfd1a-LICENSE",
"scripts/windows-notices/Fira-OFL.txt",
"scripts/windows-notices/FiraSans-Regular-NOTICE.txt",
"scripts/windows-notices/GNOME-Cantarell-61362600e104-COPYING",
"scripts/windows-notices/Iced-Icons-NOTICE.txt",
"scripts/windows-notices/aclysma-profiling-8271551172eb-LICENSE-APACHE",
"scripts/windows-notices/aclysma-profiling-8271551172eb-LICENSE-MIT",
"scripts/windows-notices/brendanzab-gl-rs-ea503e8d5fb6-LICENSE",
"scripts/windows-notices/brendanzab-gl-rs-f150967b1c44-LICENSE",
"scripts/windows-notices/gfx-rs-rspirv-e91a5debc10c-LICENSE",
"scripts/windows-notices/hexf-parse-0.2.1-Cargo.toml",
"scripts/windows-notices/iced-rs-iced-3997291f318a-LICENSE",
"scripts/windows-notices/iced-rs-iced-54abf81d13fe-LICENSE",
"scripts/windows-notices/llvm-ea7d852a70e8-libunwind-LICENSE.TXT",
"scripts/windows-notices/manifest.json",
"scripts/windows-notices/nical-lyon-56219c95c658-LICENSE-APACHE",
"scripts/windows-notices/nical-lyon-56219c95c658-LICENSE-MIT",
"scripts/windows-notices/nical-lyon-994526f2766c-LICENSE-APACHE",
"scripts/windows-notices/nical-lyon-994526f2766c-LICENSE-MIT",
"scripts/windows-notices/nical-rust_debug-93f414cd572b-LICENSE",
"scripts/windows-notices/zakarumych-gpu-alloc-61020bdcb4eb-COPYING",
"scripts/windows-notices/zakarumych-gpu-alloc-7ddd1fe576fc-COPYING",
"scripts/windows-notices/zakarumych-gpu-descriptor-9f2fb9546591-COPYING",
"scripts/windows-notices/zakarumych-gpu-descriptor-bb28b4e55b74-COPYING"
],
"all615_equal_committed_source": true,
"stage_payloads": {
"arcadia-studio.exe": {
"bytes": 116591104,
"sha256": "521ca576337a4b5add70c8fb7f101e459274f9b4462a5c0bdd3290cc1ca72b58"
},
"libunwind.dll": {
"bytes": 190464,
"sha256": "aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a"
}
},
"checkpoint": {
"bytes": 3869,
"sha256": "5e07469b73d1594985ac53535759f39ff19850541bca7a4a84e5dfaaa1283c7a"
},
"closure": {
"bytes": 554,
"sha256": "3daf82bdcc3f04ca62f06e9e8f41f19c6c3b3544b6e9a6138d811b56bb8aaa9e"
},
"six_file_before_snapshot_after_baseline_work_equal": true,
"frames": [
{
"path": "001-fresh-launch.jpg",
"bytes": 100373,
"sha256": "c500ca46542e7e15a96f554d17395c2a768974bc553f1d0ef006faee3cad39af",
"note": {
"bytes": 543,
"sha256": "9a9ad47c3f99ed8a9302cbda7d54cfc64d8d358443a2e9eed7460191d7336976"
}
},
{
"path": "002-private-picker-location-warning.jpg",
"bytes": 88810,
"sha256": "ee92ea1285f5a03beae40ea0263d0f74d97582b40ca2e6d317810675c67f96ca",
"note": {
"bytes": 639,
"sha256": "e750b8cb5d955d244404ba92e86d1a76ce33a7200b458542de97c55204f09045"
}
},
{
"path": "003-fixture-open.jpg",
"bytes": 132294,
"sha256": "4f6732a53b6970d7ecc49ad85dd24d81eb5bd3bb5b48d32d81f43d1ca9d87a86",
"note": {
"bytes": 682,
"sha256": "c3d642494b2d7d4c916130adfed94a2405ca8a8580f0c5cb93ed4fe3ce08fccb"
}
},
{
"path": "004-target-selection.jpg",
"bytes": 168385,
"sha256": "41caeba435e07c9f49392e152e0cb74887b02f65bbac6c6d0989816ab68cda74",
"note": {
"bytes": 634,
"sha256": "2f733e46247fb5bcdb2c03528d468781aff4c14d8c3092b19d9d551100c08b33"
}
},
{
"path": "005-preview-initial-top.jpg",
"bytes": 114153,
"sha256": "8a1745ff6bc3f8b2c73bd99f884555d6de598ac553e76b53a38df3b3cec2ee4a",
"note": {
"bytes": 635,
"sha256": "fb52cde147dc5be4c364beed27cafa825135013a4f68bacb41efbcf43513785d"
}
},
{
"path": "006-preview-nonzero-before-details.jpg",
"bytes": 129197,
"sha256": "7906c66d0873d380bab83ae35b84f3acae603e2e81f01c71213f3c504f4fc1f6",
"note": {
"bytes": 694,
"sha256": "013e332ef1d3177db0682ba07509aa0c52c0e7cb47dc8cb0fba588a117f93096"
}
},
{
"path": "007-details.jpg",
"bytes": 116687,
"sha256": "5b5460ec1a429cf8354c10b970ff46777e0bc51e1a9a71dba4c6e769a4e4e0de",
"note": {
"bytes": 614,
"sha256": "cf1cb1cc0c674a4aea961598747662ecf2611a28d049f66ee63e8d79bf4636ae"
}
},
{
"path": "008-preview-return-preserved.jpg",
"bytes": 129075,
"sha256": "fedd93eaaaff6d2dfa2b66ffe3078d9e9931e4f079638cb975f7d0e7d11cc503",
"note": {
"bytes": 697,
"sha256": "df111620062ea9bee2e42405978cbc7ae5902407137b698bc4bcba4e63352473"
}
},
{
"path": "009-hunk-change-resets.jpg",
"bytes": 119458,
"sha256": "0b94688b6d02342a36aba48c711517b07d98139bfd9e87a7fa08c24c1615b864",
"note": {
"bytes": 620,
"sha256": "b9c6783429025f0f6a2366d5de8d591858bb55f416b02b34efe6dabeb0194544"
}
},
{
"path": "010-hunk2-scrolled.jpg",
"bytes": 122981,
"sha256": "74ae6e3ae84e8b2c65542566174598e7d1ae32b22771530524162b17d81179f8",
"note": {
"bytes": 592,
"sha256": "03ed63a394ca57546101c3c6a56f39ad1966f8ce23dec30ab00a8d4a008fed74"
}
},
{
"path": "011-row-page-reset.jpg",
"bytes": 117726,
"sha256": "0c1c2530133052ab8799abb1762c8b8f38fbb2afabe4713aedc20d111cdd1c38",
"note": {
"bytes": 582,
"sha256": "97b13fe7fe189f34d2f434bb9673d3028ead763d3ec82d29459a781ff90c739a"
}
},
{
"path": "012-row-page-scrolled.jpg",
"bytes": 125907,
"sha256": "192f6f96b25340c817580ab718534cde3f88773ff7262a25da153f02ec8a6064",
"note": {
"bytes": 583,
"sha256": "22bba7ab903c83e73cd87edfac0a72f31ff17a4fd03cbd841ce36ff22b922b29"
}
},
{
"path": "013-file-change-reset.jpg",
"bytes": 119253,
"sha256": "6ca4e0c2c8ada8921c8bc50f8bb9d3832661727c8d4b8324f27b68780b74176b",
"note": {
"bytes": 587,
"sha256": "943fb0373cc0fa9f238d7dab1bd9be7ba335825424dcd3fe0f3f349c2186332f"
}
},
{
"path": "014-other-file-scrolled.jpg",
"bytes": 122267,
"sha256": "ed7b89d25749bcc62bfccbfac941882df2cf06ab288b5236788da620ab810f33",
"note": {
"bytes": 593,
"sha256": "0b2296df31e0c096b0fd35852d0f013f923af40bada264dd9bdec7c0f6b55335"
}
},
{
"path": "015-filter-reset.jpg",
"bytes": 113737,
"sha256": "e66e1d8801c5b37270691767fc7ae981d82e03d6b6816f762a4c61600b638e78",
"note": {
"bytes": 603,
"sha256": "d5fe6b5db1aa07b5256adfdd75ebcaf7465602fc307d8b881d2f26fae8941c44"
}
},
{
"path": "016-filtered-nonzero-before-details.jpg",
"bytes": 128613,
"sha256": "a6de6b276d897b1315acb292b2557f6482e944a475e398e2086ac0796596af4d",
"note": {
"bytes": 612,
"sha256": "5173bac4f205732d8fab951e43575c4403908b70bd91e9f955fe664b4c24db14"
}
},
{
"path": "017-filtered-details.jpg",
"bytes": 116756,
"sha256": "f977f560f80916060be6d353f1b3a4bdcc7e828f4774f670fd201d781817c407",
"note": {
"bytes": 557,
"sha256": "3fd47e6a8fb15b192541397aad62f02c8426b7d861e2af6f28243e49b0d1fc96"
}
},
{
"path": "018-filtered-return-preserved.jpg",
"bytes": 128181,
"sha256": "bde06d0b66ee3b3f16f742c197004fe795842b3e0ed51ba7bc6511214ab18d0b",
"note": {
"bytes": 647,
"sha256": "5b92874394629d1318aea47ff38fd162ef68f813445df63f7dbeaa03ce1263f4"
}
},
{
"path": "019-cancelled.jpg",
"bytes": 168262,
"sha256": "ccfd4dc66dc6da0e9fcceca828f0994cabe709cdfaebaaeab824b67c6968ab78",
"note": {
"bytes": 663,
"sha256": "015947689e0b1147de0bde625f565f33087abcaf448d169a9af25236e5929ad0"
}
},
{
"path": "020-save-all-complete.jpg",
"bytes": 165849,
"sha256": "93df50510e44895ddbfd3451359f89b32b116f6f9b6ebec5841c85a785580544",
"note": {
"bytes": 679,
"sha256": "0ce07c3cfcefc91fe40c8e58c912839d7166bb01269a8ad7bee63a9fbc0d2267"
}
}
],
"scope": "Independent read-only evidence checks; no application or compiler execution."
}
@@ -0,0 +1,25 @@
# Independent feab Details/Preview native evidence review
Reviewed all 20 original JPEG frames and JSON notes in `.local/native-qa/rename-scroll-feab202-20260913-01`, launch/request/preparation, cancel-save checkpoint, original 440 frames043-045, and the now-closed receipt. No application input, compiler or source modification was performed by this reviewer.
Bounded verdict: no actionable mismatch found in the observed Details-to-Preview correction. This supports the specific native restoration and explicit-reset workflow at source `feab2020d8e5b6bfdb59c86ab4aee161617b8b6f`; it is not full rename, transient model/history, Text-union or package acceptance.
## Observed workflow
- 001 shows the fresh isolated app. 002 records a Windows picker warning for an absent private-profile Desktop directory. 003 shows the correct fixture open. Picker focus/input and capture retries are operator/tool limitations; the notes do not establish an application defect. The raw003 note retains the earlier Untitled window title although the actual image title shows the loaded project; process/window ID and visible content still bind this frame. Preserve that metadata discrepancy rather than rewriting it.
- 004 selects original `assess_report`, declaration UUID `00000000-0000-4000-8000-000000000403`. 005 proposes `assess_report_trial_preview`, two changed files/six lines, and starts file1 sa/reporting.arcadia, hunk1, rows1-7 at line8.
- Decisive006 ->007 ->008: nonzero preview line10 at y485, changed line11 at y631, before/after declaration baselines about y675/y737 and thumb y518-633 remain visibly at those positions after Details return. 007 retains the same target/origin/replacement; 008 is documented as the first return before any rescroll. The reviewer independently inspected the images; timestamps and notes establish the input sequence, not a video or internal offset trace. JPEGs need not have identical compressed/pixel bytes because cursor/hover changes are present.
- 009 next hunk resets to line41 at top; 010 establishes nonzero offset before011 row-page reset to line49. 012 establishes nonzero before013 file change to views.arcadia at line37/top. 014 scrolls that file;015 filter `reporting` resets to sa/reporting.arcadia line8/top and disables unmatched file navigation. These controls demonstrate intentional context resets rather than unconditional retention.
- Filtered repeat016 ->017 ->018 again preserves the nonzero declaration/line and thumb geometry before rescroll. 019 Cancel returns to original selected alias;020 reports all source files saved. No Rename alias approval was requested in this trial.
Original440 frames043 ->044 ->045 visibly show the earlier scrolled preview returning to line8/top. They use an already renamed baseline and a different proposed spelling, so this is a behavioral before/fix comparison, not identical fixture/viewport pixel comparison. The original failure remains independently preserved in immutable `3c22fe2629fc242714d32805790262fa2c4e33b9:harness/experiments/navigation-native-440-20260913/raw/trial/evidence/`.
## Actual bindings and limits
Closure records PID10456, exit0 at `2026-09-13T12:21:44.165074+00:00`, unchanged stage and exact disk-byte equality. Parent records normal Alt+F4; closure itself establishes process exit, not the keypress. Both native streams are empty. GUI SHA256 `521ca576337a4b5add70c8fb7f101e459274f9b4462a5c0bdd3290cc1ca72b58`, 116591104 bytes, is the recorded non-test dev artifact (opt0, debug assertions/overflow checks enabled); it is not an optimized release claim. Its preserved stage payload and runtime were independently reread and hashed.
Independent audit [JSON](rename-scroll-feab202-native-independent-audit-20260913.json), SHA256 `d4340078155aaac5dc511de1a262da4f9fe986445fadda548b4653d0fb50e143`, verifies every preparation-bound original, all20 image/note pairs, actual baseline/work/snapshot six-file bytes, checkpoint before/snapshot/after/expected maps and all615 GUI input blobs against committed feab source. The 581 gate-input records are an exact subset; the other34 are scripts/notices. This is a scope comparison, not permission to omit GUI inputs in future builds.
Closed feab records report listing1099; preview5, rename37, cross-module navigation17 and source-navigation51 passing; full1096 passed/0failed/3existing ignores; strict all-targets exit0 and matching GUI build exit0. All tests/strict record581 unchanged source inputs; GUI615 unchanged. The initial bebf preview result remains exit101,4passed/1failed at a pre-Details fractional-report-vs-rounded-translation assertion. The separately reviewed feab test-only correction preserves exact report and exact visible before/after checks. Do not relabel that original failure as a restoration failure or erase it.
Cancel-save proves complete six-file disk membership/byte equality, rechecked after normal closure. It does not inspect transient in-memory Project/history or apply/revert a rename, and no semantic oracle was reused. Existing 440 semantic evidence retains its own source/fixture scope. Native restoration should be rechecked when the new compact Text union is later built because that changes the surrounding widget topology.
@@ -0,0 +1,88 @@
# Rename Details scroll: prepared gates, no execution
Candidate **bebf9f594c6722200e95e92be2734acbea0dd700**, worktree `.local/rs`, branch `codex/rename-details-scroll-956atf-20260913`. This includes the source-reviewed022 fix and the reviewed follow-up that handles validated display reports before shared source/camera/allocation boundaries. Parent357 is `357da24542eaa519c2a01c465be6c7d1acbc8126` (440 production plus AGENTS). Parent owns the compiler lease, integration and native acceptance. All commands below are **prepared, UNRUN**. AST parsing and source/hash inspection are not executable gate evidence.
There are still581 gate inputs and615 build inputs, with three desktop files changed from357: `app.rs`, `app/source_rename.rs`, and `app/source_rename/preview_scroll_tests.rs`. Expected listing1099 is the actual440 listing1098 plus exactly one named mounted regression. Preview5, rename-test37, navigation-union17 and source-navigation51 are exact retained names in `expected.json`. Full expectation is1096 passed, zero failed, three preexisting named timing/scale ignores. No ignore may be added to make this pass.
All originals under `.local/navigation-palette-gates-20260913` and their original helpers/configs remain unchanged. Fresh output is `.local/rename-scroll-gates-20260913`, absent at preparation. Runner/admitter/build scripts reject optimized Python before any evidence writes. Use fresh run names after any failed attempt; exclusive receipt writes prevent overwriting history.
## Environment and lease
Run from the repository root only after the parent grants the serialized compiler lease and accepts this source/preparation review. The following names are task-local PowerShell variables. No toolchain version override or Cargo dependency update is requested.
```powershell
$scrollRepo = 'C:/Users/User/Documents/Git/ARCADIA-Studio'
$scrollPython = 'C:/Users/User/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe'
$scrollPrep = "$scrollRepo/.local/rename-scroll-gate-preparation-20260913"
$scrollSource = 'bebf9f594c6722200e95e92be2734acbea0dd700'
$env:CARGO_HOME = "$scrollRepo/.local/toolchain/cargo"
$env:RUSTUP_HOME = "$scrollRepo/.local/toolchain/rustup"
$env:CARGO_BUILD_JOBS = '1'
$env:CARGO_TARGET_X86_64_PC_WINDOWS_GNULLVM_LINKER = 'clang.exe'
$env:PATH = "$env:CARGO_HOME/bin;$scrollRepo/.local/toolchain/llvm-mingw-20260908-ucrt-x86_64/bin;$env:PATH"
$env:CARGO_TARGET_DIR = "$scrollRepo/.local/rename-scroll-target-20260913"
if ($env:PYTHONOPTIMIZE) { throw 'Use unoptimized Python for this gate.' }
Set-Location -LiteralPath $scrollRepo
function Invoke-ScrollPython {
& $scrollPython -B @args
if ($LASTEXITCODE -ne 0) { throw "Scroll gate stopped with exit $LASTEXITCODE" }
}
```
Use the dedicated target for fixed and red only under one lease; every run checks its committed inputs and hashes the actual emitted executable. Complete/admit each result immediately before another compile can replace that test executable. Do not use the root live GUI/server target. No global environment/config mutation is needed. The GUI builder checks the actual Rust host and tools against the existing Windows gnullvm setup and preserves its own Cargo-reported PE artifact.
## Before-fix proof on real357 production
The portable overlay adds only measured bounds, a real WheelScrolled helper and one mounted test to357's existing test file. It contains no `PreviewScrolled` event or `preview_offset` field reference; it accepts whichever messages/tasks the original controller returns. It asserts that wheel input moves the preview, actually mounts Details so the preview subtree disappears, returns, then measures the visible offset **before any second scroll**. Thus the predicted failure is behavioral, not a missing API or a source mutation that disables only the fix. This portable test is distinct from the stronger committed fixed test (which additionally checks callback ownership and stale-report boundaries).
The following worktree and test-only local commit do not exist yet. If `.local/rr` or the branch already exists, stop and inspect ownership rather than reuse or delete it.
```powershell
if (Test-Path -LiteralPath "$scrollRepo/.local/rr") { throw 'Red worktree already exists; inspect before reuse.' }
git -c core.longpaths=true worktree add -b codex/rename-scroll-red-proof-956atf-20260913 .local/rr 357da24542eaa519c2a01c465be6c7d1acbc8126
if ($LASTEXITCODE -ne 0) { throw 'Red worktree creation failed' }
Copy-Item -LiteralPath "$scrollPrep/red-preview_scroll_tests.rs" -Destination "$scrollRepo/.local/rr/crates/oa-desktop/src/app/source_rename/preview_scroll_tests.rs"
git -C .local/rr diff --check
if ($LASTEXITCODE -ne 0) { throw 'Overlay whitespace check failed' }
git -C .local/rr add crates/oa-desktop/src/app/source_rename/preview_scroll_tests.rs
if ($LASTEXITCODE -ne 0) { throw 'Overlay staging failed' }
git -C .local/rr commit -m 'Test-only proof of rename Details scroll loss on357'
if ($LASTEXITCODE -ne 0) { throw 'Overlay commit failed' }
$scrollRedSource = (git -C .local/rr rev-parse HEAD).Trim()
if ($LASTEXITCODE -ne 0) { throw 'Cannot freeze red source' }
& $scrollPython -B "$scrollPrep/run-red.py" $scrollRedSource red357-details focused app::source_rename::tests::preview_scroll_tests::details_remount_preserves_visible_offset_without_controller_assumptions
$scrollRedExit = $LASTEXITCODE
if ($scrollRedExit -ne 101) { throw "Expected test failure101; inspect actual result ($scrollRedExit) before proceeding" }
```
Exit101 alone **does not establish reproduction**. Inspect the closed `.result.json` and `.log`: unchanged581 committed inputs, exact test-only child of357 and pinned overlay, one actual executable, exact requested `--exact` command, one test actually run/FAILED (zero passed/ignored;1098 filtered), and the panic must be **`Details remount must preserve visible offset`** with returned zero versus previously measured nonzero. Compile errors, no tests, wheel fixture failure, unrelated panics, timeout or missing result are failed evaluations. Record the actual overlay commit, all receipt hashes and this diagnostic; do not publish an expected failure as a passing product test. Keep the red checkout/evidence for review. No red failure has been observed yet.
## Fixed executable gates
Run only after red evidence is reviewed (or parent records why existing native440 evidence suffices) and bebf source review is accepted. The fixed runner refuses another source. The admission helper verifies committed source bytes, no additional scoped inputs,581 exact membership, launcher/config/baseline pins, actual executable hash, exact command and individual outcome names. Focused/full execution must match the admitted listing executable and input manifest. It does not infer passing tests from listing counts.
```powershell
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource list-bebf9f5 list
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" list-bebf9f5 list
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource preview-bebf9f5 focused preview_scroll_tests
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" preview-bebf9f5 focused list-bebf9f5 preview_scroll_tests
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource rename-bebf9f5 focused app::source_rename::tests::
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" rename-bebf9f5 focused list-bebf9f5 app::source_rename::tests::
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource navigation-bebf9f5 focused navigation_union
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" navigation-bebf9f5 focused list-bebf9f5 navigation_union
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource source-navigation-bebf9f5 focused source_navigation::
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" source-navigation-bebf9f5 focused list-bebf9f5 source_navigation::
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource full-bebf9f5 full
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" full-bebf9f5 full list-bebf9f5
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource strict-bebf9f5 clippy
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" strict-bebf9f5 clippy
Invoke-ScrollPython "$scrollPrep/build-gui.py" $scrollSource gui-bebf9f5
```
Rename37 includes preview5 and the source-rename envelope/navigation cases. Navigation17 adds the allocation/removal cross-module stale-envelope cases. Source-navigation51 includes departure-selection helpers. Overlap is intentional: preview5 gives the first decisive check; broader gates cover the new App dispatch path. Full1099 is warranted once because this change adds an App-level event/early return; it also executes the preserved final16 Find/departure-selection cases and other modal owners. Do not rerun full repeatedly after these receipts pass unless a new change/failure/risk requires it. Strict covers desktop all targets with `-D warnings`. The GUI build is only `oa-desktop --bin arcadia-studio`, preserving one Windows x64 artifact under its fresh receipt directory. Its result is not an unchanged dual-artifact440 build receipt.
## Evidence reuse and remaining native/package work
The candidate changes only the three named desktop inputs, with all other581-scope and615-scope membership retained. Core/server production, Cargo manifests/lock/config/toolchain, assets and scripts must be compared as exact committed blob sets with440 before reusing those scoped results; record that equality with the original440 receipt hashes. Existing broad581/615 manifests themselves differ, so **do not claim their whole input sets are equal or relabel a440 core/server build as built at bebf**. An unchanged core/server test/build artifact remains evidence at its original source and scope. Parent owns any composite package manifest with a new GUI and unchanged verified server and must separately bind artifact bytes and packaging configuration; no existing native/package config has been edited here.
Native acceptance remains necessary on the preserved matching GUI: reproduce the same six-token `assess_report_union_trial` preview, measure/observe nonzero scrolling, Full details then Preview pane, require the same visible offset before new input and unchanged file/hunk/page and replacement. Check explicit page/filter/new-approval reset, stale queued report/reset behavior where practical, Cancel and unchanged completeProject/exactSourceBundle. Reuse prior valid saved rename/Undo/Redo/reopen and Find/selection/navigation evidence only within its documented scope; the new actual native return behavior is not established by that440 evidence. No GUI was launched and no evaluator/server/broker was invoked by this preparation.
@@ -0,0 +1,88 @@
# Rename Details scroll: prepared gates, no execution
Candidate **bebf9f594c6722200e95e92be2734acbea0dd700**, worktree `.local/rs`, branch `codex/rename-details-scroll-956atf-20260913`. This includes the source-reviewed022 fix and the reviewed follow-up that handles validated display reports before shared source/camera/allocation boundaries. Parent357 is `357da24542eaa519c2a01c465be6c7d1acbc8126` (440 production plus AGENTS). Parent owns the compiler lease, integration and native acceptance. All commands below are **prepared, UNRUN**. AST parsing and source/hash inspection are not executable gate evidence.
There are still581 gate inputs and615 build inputs, with three desktop files changed from357: `app.rs`, `app/source_rename.rs`, and `app/source_rename/preview_scroll_tests.rs`. Expected listing1099 is the actual440 listing1098 plus exactly one named mounted regression. Preview5, rename-test37, navigation-union17 and source-navigation51 are exact retained names in `expected.json`. Full expectation is1096 passed, zero failed, three preexisting named timing/scale ignores. No ignore may be added to make this pass.
All originals under `.local/navigation-palette-gates-20260913` and their original helpers/configs remain unchanged. Fresh output is `.local/rename-scroll-gates-20260913`, absent at preparation. Runner/admitter/build scripts reject optimized Python before any evidence writes. Use fresh run names after any failed attempt; exclusive receipt writes prevent overwriting history.
## Environment and lease
Run from the repository root only after the parent grants the serialized compiler lease and accepts this source/preparation review. The following names are task-local PowerShell variables. No toolchain version override or Cargo dependency update is requested.
```powershell
$scrollRepo = 'C:/Users/User/Documents/Git/ARCADIA-Studio'
$scrollPython = 'C:/Users/User/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe'
$scrollPrep = "$scrollRepo/.local/rename-scroll-gate-preparation-20260913"
$scrollSource = 'bebf9f594c6722200e95e92be2734acbea0dd700'
$env:CARGO_HOME = "$scrollRepo/.local/toolchain/cargo"
$env:RUSTUP_HOME = "$scrollRepo/.local/toolchain/rustup"
$env:CARGO_BUILD_JOBS = '1'
$env:CARGO_TARGET_X86_64_PC_WINDOWS_GNULLVM_LINKER = 'clang.exe'
$env:PATH = "$env:CARGO_HOME/bin;$scrollRepo/.local/toolchain/llvm-mingw-20260908-ucrt-x86_64/bin;$env:PATH"
$env:CARGO_TARGET_DIR = "$scrollRepo/target"
if ($env:PYTHONOPTIMIZE) { throw 'Use unoptimized Python for this gate.' }
Set-Location -LiteralPath $scrollRepo
function Invoke-ScrollPython {
& $scrollPython -B @args
if ($LASTEXITCODE -ne 0) { throw "Scroll gate stopped with exit $LASTEXITCODE" }
}
```
Revision2: parent explicitly authorized reuse of the existing root target cache for fixed gates after all root compiler gates closed; its native GUI runs from an immutable separate stage. Do not create a second target on this disk. Use the existing root target only under this serialized lease; every run checks its committed inputs and hashes the actual emitted executable. Complete/admit each result immediately before another compile can replace that test executable. Root target outputs are mutable under this authorization; preserve original440 receipts and already preserved GUI/server artifacts. No global environment/config mutation is needed. The GUI builder checks the actual Rust host and tools against the existing Windows gnullvm setup and preserves its own Cargo-reported PE artifact.
## Before-fix proof on real357 production
The portable overlay adds only measured bounds, a real WheelScrolled helper and one mounted test to357's existing test file. It contains no `PreviewScrolled` event or `preview_offset` field reference; it accepts whichever messages/tasks the original controller returns. It asserts that wheel input moves the preview, actually mounts Details so the preview subtree disappears, returns, then measures the visible offset **before any second scroll**. Thus the predicted failure is behavioral, not a missing API or a source mutation that disables only the fix. This portable test is distinct from the stronger committed fixed test (which additionally checks callback ownership and stale-report boundaries).
The following worktree and test-only local commit do not exist yet. If `.local/rr` or the branch already exists, stop and inspect ownership rather than reuse or delete it.
```powershell
if (Test-Path -LiteralPath "$scrollRepo/.local/rr") { throw 'Red worktree already exists; inspect before reuse.' }
git -c core.longpaths=true worktree add -b codex/rename-scroll-red-proof-956atf-20260913 .local/rr 357da24542eaa519c2a01c465be6c7d1acbc8126
if ($LASTEXITCODE -ne 0) { throw 'Red worktree creation failed' }
Copy-Item -LiteralPath "$scrollPrep/red-preview_scroll_tests.rs" -Destination "$scrollRepo/.local/rr/crates/oa-desktop/src/app/source_rename/preview_scroll_tests.rs"
git -C .local/rr diff --check
if ($LASTEXITCODE -ne 0) { throw 'Overlay whitespace check failed' }
git -C .local/rr add crates/oa-desktop/src/app/source_rename/preview_scroll_tests.rs
if ($LASTEXITCODE -ne 0) { throw 'Overlay staging failed' }
git -C .local/rr commit -m 'Test-only proof of rename Details scroll loss on357'
if ($LASTEXITCODE -ne 0) { throw 'Overlay commit failed' }
$scrollRedSource = (git -C .local/rr rev-parse HEAD).Trim()
if ($LASTEXITCODE -ne 0) { throw 'Cannot freeze red source' }
& $scrollPython -B "$scrollPrep/run-red.py" $scrollRedSource red357-details focused app::source_rename::tests::preview_scroll_tests::details_remount_preserves_visible_offset_without_controller_assumptions
$scrollRedExit = $LASTEXITCODE
if ($scrollRedExit -ne 101) { throw "Expected test failure101; inspect actual result ($scrollRedExit) before proceeding" }
```
Exit101 alone **does not establish reproduction**. Inspect the closed `.result.json` and `.log`: unchanged581 committed inputs, exact test-only child of357 and pinned overlay, one actual executable, exact requested `--exact` command, one test actually run/FAILED (zero passed/ignored;1098 filtered), and the panic must be **`Details remount must preserve visible offset`** with returned zero versus previously measured nonzero. Compile errors, no tests, wheel fixture failure, unrelated panics, timeout or missing result are failed evaluations. Record the actual overlay commit, all receipt hashes and this diagnostic; do not publish an expected failure as a passing product test. Keep the red checkout/evidence for review. No red failure has been observed yet.
## Fixed executable gates
Parent accepted bebf source review and independently confirmed actual440 native failure as sufficient before-fix evidence. Skip the portable red build in this run to avoid rebuilding357 on the space-constrained disk; its overlay and commands remain prepared and UNRUN. Start the fixed gates directly. The fixed runner refuses another source. The admission helper verifies committed source bytes, no additional scoped inputs,581 exact membership, launcher/config/baseline pins, actual executable hash, exact command and individual outcome names. Focused/full execution must match the admitted listing executable and input manifest. It does not infer passing tests from listing counts.
```powershell
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource list-bebf9f5 list
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" list-bebf9f5 list
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource preview-bebf9f5 focused preview_scroll_tests
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" preview-bebf9f5 focused list-bebf9f5 preview_scroll_tests
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource rename-bebf9f5 focused app::source_rename::tests::
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" rename-bebf9f5 focused list-bebf9f5 app::source_rename::tests::
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource navigation-bebf9f5 focused navigation_union
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" navigation-bebf9f5 focused list-bebf9f5 navigation_union
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource source-navigation-bebf9f5 focused source_navigation::
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" source-navigation-bebf9f5 focused list-bebf9f5 source_navigation::
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource full-bebf9f5 full
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" full-bebf9f5 full list-bebf9f5
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource strict-bebf9f5 clippy
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" strict-bebf9f5 clippy
Invoke-ScrollPython "$scrollPrep/build-gui.py" $scrollSource gui-bebf9f5
```
Rename37 includes preview5 and the source-rename envelope/navigation cases. Navigation17 adds the allocation/removal cross-module stale-envelope cases. Source-navigation51 includes departure-selection helpers. Overlap is intentional: preview5 gives the first decisive check; broader gates cover the new App dispatch path. Full1099 is warranted once because this change adds an App-level event/early return; it also executes the preserved final16 Find/departure-selection cases and other modal owners. Do not rerun full repeatedly after these receipts pass unless a new change/failure/risk requires it. Strict covers desktop all targets with `-D warnings`. The GUI build is only `oa-desktop --bin arcadia-studio`, preserving one Windows x64 artifact under its fresh receipt directory. Its result is not an unchanged dual-artifact440 build receipt.
## Evidence reuse and remaining native/package work
The candidate changes only the three named desktop inputs, with all other581-scope and615-scope membership retained. Core/server production, Cargo manifests/lock/config/toolchain, assets and scripts must be compared as exact committed blob sets with440 before reusing those scoped results; record that equality with the original440 receipt hashes. Existing broad581/615 manifests themselves differ, so **do not claim their whole input sets are equal or relabel a440 core/server build as built at bebf**. An unchanged core/server test/build artifact remains evidence at its original source and scope. Parent owns any composite package manifest with a new GUI and unchanged verified server and must separately bind artifact bytes and packaging configuration; no existing native/package config has been edited here.
Native acceptance remains necessary on the preserved matching GUI: reproduce the same six-token `assess_report_union_trial` preview, measure/observe nonzero scrolling, Full details then Preview pane, require the same visible offset before new input and unchanged file/hunk/page and replacement. Check explicit page/filter/new-approval reset, stale queued report/reset behavior where practical, Cancel and unchanged completeProject/exactSourceBundle. Reuse prior valid saved rename/Undo/Redo/reopen and Find/selection/navigation evidence only within its documented scope; the new actual native return behavior is not established by that440 evidence. No GUI was launched and no evaluator/server/broker was invoked by this preparation.
@@ -0,0 +1,137 @@
"""Admit only the prepared desktop listing, focused suites, full suite or clippy."""
from pathlib import Path
from datetime import datetime, timezone
import hashlib
import json
import re
import subprocess
import sys
if not __debug__:
raise SystemExit('Refusing optimized Python: admission assertions are required')
here = Path(__file__).resolve().parent
base = here.parents[1]
root = base / '.local/rs'
folder = base / '.local/rename-scroll-gates-20260913'
watched = {}
def read(path):
raw = path.read_bytes()
if path in watched:
assert watched[path] == raw, path
watched[path] = raw
return raw
def digest(path):
return hashlib.sha256(read(path)).hexdigest()
def value(path):
return json.loads(read(path))
assert digest(here / 'expected.json') == '7c104d5b9409b70dd4c0a38ddac45d8d9f910f49342084cdabe2b780b085f9f3'
config = value(here / 'expected.json')
source = config['source']
assert subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip() == source
for path, sha in config['baseline_and_original_helper_pins'].items():
assert digest(base / path) == sha, path
baseline = value(base / '.local/navigation-palette-gates-20260913/list-44095f7.result.json')
baseline_admission = value(base / '.local/navigation-palette-gates-20260913/list-44095f7.admission.json')
assert baseline['exit'] == 0 and baseline_admission['verified_inputs'] == 581
assert baseline['source'] == baseline_admission['source'] == '44095f78c28b79d6d085863dc928adba8e24d955'
expected = config['listing_members']
assert len(expected) == len(set(expected)) == 1099
new = 'app::source_rename::tests::preview_scroll_tests::details_remount_restores_wheel_offset_before_any_rescroll'
assert len(baseline['listing_members']) == 1098
assert set(expected) == set(baseline['listing_members']) | {new}
name, mode = sys.argv[1:3]
assert re.fullmatch(r'[a-zA-Z0-9-]+', name)
record_path = folder / (name + '.result.json')
record = value(record_path)
assert record['source'] == record['head_after'] == source
assert type(record['exit']) is int and record['exit'] == 0
assert record['changed_inputs'] == [] and record['status_after'] == ''
assert datetime.fromisoformat(record['end']) >= datetime.fromisoformat(record['start'])
assert record['launcher_sha256'] == digest(here / 'run-fixed.py')
assert record['inputs'] == name + '.inputs.json'
inputs_path = folder / record['inputs']
manifest = value(inputs_path)
assert manifest['source'] == source
scopes = ['Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml', '.cargo', 'build', 'crates', 'assets', 'docs', 'examples', 'harness/fixtures']
paths = subprocess.check_output(['git', 'ls-tree', '-r', '--name-only', source, *scopes], cwd=root).decode().splitlines()
assert len(paths) == 581 == config['gate_inputs']
assert [item['path'] for item in manifest['inputs']] == paths
blobs = subprocess.check_output(['git', 'cat-file', '--batch'], cwd=root,
input=''.join(f'{source}:{p}\n' for p in paths).encode())
offset = 0
for item in manifest['inputs']:
end = blobs.index(b'\n', offset)
_, kind, size = blobs[offset:end].split()
assert kind == b'blob'
size = int(size)
raw = blobs[end + 1:end + 1 + size]
assert read(root / item['path']) == raw
assert item == {'path': item['path'], 'bytes': size, 'sha256': hashlib.sha256(raw).hexdigest()}
offset = end + size + 2
assert offset == len(blobs)
log_path = folder / (name + '.log')
log = read(log_path).decode('utf-8', errors='strict')
prefix = ['cargo', 'test', '--locked', '-p', 'oa-desktop', '--bin', 'arcadia-studio']
names, artifact = [], None
if mode != 'clippy':
assert len(record['artifacts']) == 1
artifact = record['artifacts'][0]
raw = Path(artifact['path']).read_bytes()
assert len(raw) == artifact['bytes'] and hashlib.sha256(raw).hexdigest() == artifact['sha256']
launches = re.findall(r'Running unittests [^\r\n]+ \(([^\r\n]+\.exe)\)', log)
assert len(launches) == 1
launched = Path(launches[0])
assert (launched if launched.is_absolute() else root / launched).resolve() == Path(artifact['path']).resolve()
if mode == 'list':
assert record['command'] == prefix + ['--', '--list']
names = re.findall(r'^([^\r\n]+): test\r?$', log, re.M)
assert names == record['listing_members']
assert record['listing_count'] == len(names) == len(set(names)) == 1099
assert set(names) == set(expected)
assert re.findall(r'^(\d+) tests, (\d+) benchmarks\s*$', log, re.M) == [('1099', '0')]
elif mode in ('focused', 'full'):
listing_name = sys.argv[3]
assert re.fullmatch(r'[a-zA-Z0-9-]+', listing_name)
listed = value(folder / (listing_name + '.result.json'))
admitted = value(folder / (listing_name + '.admission.json'))
assert admitted['source'] == source and admitted['mode'] == 'list'
assert admitted['helper_sha256'] == digest(Path(__file__))
for suffix, field in [('result.json', 'result_sha256'), ('inputs.json', 'inputs_sha256'), ('log', 'log_sha256')]:
assert admitted[field] == digest(folder / (listing_name + '.' + suffix))
assert admitted['config_sha256'] == digest(here / 'expected.json')
assert admitted['artifact'] == artifact == listed['artifacts'][0]
assert admitted['inputs_sha256'] == digest(inputs_path)
assert set(listed['listing_members']) == set(expected)
if mode == 'focused':
selector = sys.argv[4]
names = config['focused_groups'][selector]
assert record['command'] == prefix + [selector, '--', '--test-threads=1']
ignored = []
else:
names, ignored = expected, config['ignored']
assert record['command'] == prefix + ['--', '--test-threads=1']
outcomes = re.findall(r'^test ([^\r\n]+) \.\.\. (ok|FAILED|ignored)(?:, [^\r\n]*)?\r?$', log, re.M)
actual = [n for n, _ in outcomes]
assert len(actual) == len(set(actual)) == len(names) and set(actual) == set(names)
assert {n for n, outcome in outcomes if outcome == 'ignored'} == set(ignored)
assert all(outcome == ('ignored' if n in ignored else 'ok') for n, outcome in outcomes)
totals = re.findall(r'^test result: ok\. (\d+) passed; (\d+) failed; (\d+) ignored; (\d+) measured; (\d+) filtered out;', log, re.M)
assert totals == [(str(len(names)-len(ignored)), '0', str(len(ignored)), '0', str(1099-len(names)))], totals
elif mode == 'clippy':
assert record['command'] == ['cargo', 'clippy', '--locked', '-p', 'oa-desktop', '--all-targets', '--', '-D', 'warnings']
assert record['artifacts'] == []
assert re.search(r'Finished `dev` profile', log)
else:
raise AssertionError('Unsupported admission mode')
assert subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip() == source
assert not subprocess.check_output(['git', 'status', '--porcelain', '--untracked-files=all', '--', *scopes], cwd=root)
receipt = {'source': source, 'mode': mode, 'names': names, 'artifact': artifact,
'utc': datetime.now(timezone.utc).isoformat(), 'verified_inputs': 581,
'result_sha256': digest(record_path), 'inputs_sha256': digest(inputs_path),
'log_sha256': digest(log_path), 'config_sha256': digest(here / 'expected.json'),
'helper_sha256': digest(Path(__file__)), 'boundary': 'Desktop source gate only; native/package acceptance is separate.'}
for path, raw in watched.items():
assert path.read_bytes() == raw, path
with (folder / (name + '.admission.json')).open('x', encoding='utf-8', newline='\n') as stream:
stream.write(json.dumps(receipt, indent=2) + '\n')
print(json.dumps({'admitted': name, 'mode': mode, 'names': len(names), 'source': source}))
@@ -0,0 +1,146 @@
"""Build identified Windows binaries and preserve Cargo-reported artifacts."""
from pathlib import Path
from datetime import datetime, timezone
import hashlib
import json
import os
import re
import shutil
import subprocess
import sys
if not __debug__:
raise SystemExit('Refusing optimized Python: admission assertions are required')
base = Path(__file__).resolve().parents[2]
root = base / '.local/rs'
source, name = sys.argv[1:3]
assert source == 'bebf9f594c6722200e95e92be2734acbea0dd700'
assert re.fullmatch(r'[a-zA-Z0-9-]+', name)
assert subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip() == source
folder = base / '.local/rename-scroll-gates-20260913' / name
folder.mkdir(exist_ok=False)
def digest(path):
raw = path.read_bytes()
return {'bytes': len(raw), 'sha256': hashlib.sha256(raw).hexdigest()}
def write(name, value):
with (folder / name).open('x', encoding='utf-8', newline='\n') as stream:
stream.write(json.dumps(value, indent=2) + '\n')
# A failed spawn, malformed output or artifact admission must also close a receipt.
inputs, artifacts, changed = [], [], []
command, head_after, result = [], None, None
started = datetime.now(timezone.utc).isoformat()
phase, failure, status_after = 'input/tool admission', None, None
try:
scopes = ['Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml', '.cargo', 'build',
'crates', 'assets', 'docs', 'examples', 'harness/fixtures', 'scripts']
paths = subprocess.check_output(['git', 'ls-tree', '-r', '--name-only', source, *scopes], cwd=root).decode().splitlines()
assert not subprocess.check_output(['git', 'status', '--porcelain', '--untracked-files=all', '--', *scopes], cwd=root)
blobs = subprocess.check_output(['git', 'cat-file', '--batch'], cwd=root,
input=''.join(f'{source}:{p}\n' for p in paths).encode())
offset, inputs = 0, []
for path in paths:
end = blobs.index(b'\n', offset)
_, kind, size = blobs[offset:end].split()
assert kind == b'blob'
size = int(size)
raw = blobs[end + 1:end + 1 + size]
assert (root / path).read_bytes() == raw, path
inputs.append({'path': path, 'bytes': size, 'sha256': hashlib.sha256(raw).hexdigest()})
offset = end + size + 2
assert offset == len(blobs)
assert len(inputs) == 615
write('inputs.json', {'source': source, 'inputs': inputs})
environment = {k: v for k, v in os.environ.items() if k in (
'CARGO_HOME', 'RUSTUP_HOME', 'CARGO_TARGET_DIR', 'CARGO_BUILD_JOBS',
'RUSTFLAGS', 'CARGO_ENCODED_RUSTFLAGS', 'RUSTC', 'RUSTC_WRAPPER', 'RUSTC_WORKSPACE_WRAPPER',
'CARGO_BUILD_TARGET', 'CARGO_TARGET_X86_64_PC_WINDOWS_GNULLVM_LINKER')}
tools = {}
for tool, args in [('rustc', ['-Vv']), ('cargo', ['--version']), ('clang', ['--version'])]:
requested = os.environ.get('RUSTC', 'rustc') if tool == 'rustc' else tool
resolved = shutil.which(requested)
assert resolved, f'Required tool unavailable: {requested}'
path = Path(resolved)
tools[tool] = {'path': str(path), **digest(path),
'version': subprocess.check_output([str(path), *args], cwd=root).decode()}
assert 'host: x86_64-pc-windows-gnullvm' in tools['rustc']['version']
write('environment.json', {'environment': environment, 'tools': tools,
'launcher': digest(Path(__file__)), 'profile': 'unoptimized development',
'target_mode': 'Cargo default/configured target; no explicit --target; artifacts require Windows x64 PE'})
command = [tools['cargo']['path'], 'build', '--locked', '--offline', '-p', 'oa-desktop',
'--bin', 'arcadia-studio', '--message-format=json-render-diagnostics']
started = datetime.now(timezone.utc).isoformat()
print(json.dumps({'start': started, 'source': source, 'command': command}), flush=True)
phase = 'cargo invocation'
with (folder / 'cargo.jsonl').open('xb') as stdout, (folder / 'cargo.stderr.log').open('xb') as stderr:
result = subprocess.run(command, cwd=root, stdout=stdout, stderr=stderr)
ended = datetime.now(timezone.utc).isoformat()
changed = [p['path'] for p in inputs if digest(root / p['path']) != {k:p[k] for k in ('bytes', 'sha256')}]
head_after = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip()
phase = 'Cargo JSON/artifact admission'
messages = [json.loads(line) for line in (folder / 'cargo.jsonl').read_bytes().splitlines()]
finished = [m for m in messages if m.get('reason') == 'build-finished']
artifacts = []
if result.returncode == 0 and not changed and head_after == source:
assert len(finished) == 1 and finished[0]['success'] is True
selected = [m for m in messages if m.get('reason') == 'compiler-artifact'
and m['target']['name'] == 'arcadia-studio'
and m.get('executable') and m['target']['kind'] == ['bin']]
assert len(selected) == 1 and {m['target']['name'] for m in selected} == {'arcadia-studio'}
manifests = {'arcadia-studio': root / 'crates/oa-desktop/Cargo.toml'}
for item in selected:
manifest = Path(item['manifest_path'])
if not manifest.is_absolute():
manifest = root / manifest
assert manifest.resolve() == manifests[item['target']['name']].resolve()
assert not item['profile']['test'] and item['profile']['opt_level'] == '0'
assert item['profile']['debug_assertions'], 'Expected a development-profile binary'
origin = Path(item['executable'])
if not origin.is_absolute():
origin = root / origin
origin = origin.resolve()
raw = origin.read_bytes()
assert raw[:2] == b'MZ' and len(raw) >= 64
pe = int.from_bytes(raw[60:64], 'little')
assert raw[pe:pe+4] == b'PE\0\0', 'Expected a PE executable'
assert int.from_bytes(raw[pe+4:pe+6], 'little') == 0x8664, 'Expected Windows x64 PE'
destination = folder / origin.name
with destination.open('xb') as stream:
stream.write(raw)
assert digest(destination) == digest(origin)
artifacts.append({'name': item['target']['name'], 'origin': str(origin),
'preserved': str(destination), **digest(destination), 'cargo_artifact': item})
except Exception as error:
failure = {'phase': phase, 'type': type(error).__name__, 'message': str(error)}
# Recheck after artifact preservation as well, including added/untracked inputs.
try:
changed = [item['path'] for item in inputs
if not (root / item['path']).is_file()
or digest(root / item['path']) != {key: item[key] for key in ('bytes', 'sha256')}]
head_after = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip()
status_after = subprocess.check_output(
['git', 'status', '--porcelain', '--untracked-files=all', '--', *scopes], cwd=root).decode()
except Exception as error:
postflight = {'phase': 'final input admission', 'type': type(error).__name__, 'message': str(error)}
if failure is None:
failure = postflight
else:
failure['postflight'] = postflight
code = result.returncode if result is not None else None
passed = code == 0 and failure is None and not changed and head_after == source and status_after == ''
record = {'source': source, 'head_after': head_after, 'start': started,
'end': datetime.now(timezone.utc).isoformat(),
'exit': code, 'outcome': 'passed' if passed else 'failed', 'failure': failure,
'command': command, 'changed_inputs': changed, 'status_after': status_after, 'artifacts': artifacts,
'launcher': digest(Path(__file__))}
for key, filename in [('inputs', 'inputs.json'), ('environment', 'environment.json'),
('stdout', 'cargo.jsonl'), ('stderr', 'cargo.stderr.log')]:
path = folder / filename
record[key] = digest(path) if path.is_file() else None
write('result.json', record)
print(json.dumps(record))
sys.exit(0 if passed else (code or 1))
@@ -0,0 +1,41 @@
{
"source": "bebf9f594c6722200e95e92be2734acbea0dd700",
"preparation_checks": [
"Python AST parse only",
"original helper and baseline receipt hashes unchanged",
"clean frozen rs",
"581/615 committed input membership unchanged; exactly three desktop blobs differ from440",
"fresh gate output directory absent"
],
"runtime": "All Rust tests, compiler, GUI and native acceptance UNRUN",
"files": {
"admit-fixed.py": {
"bytes": 7609,
"sha256": "ae5dcdfaa62c3b935c95ddafe7d5f7456a259bf2e3a09a1a962e93d9713d18d1"
},
"build-gui.py": {
"bytes": 8137,
"sha256": "2d50158c35c58f0b6a68175924ff372a8a6592466529869f89a9f00802e32b25"
},
"expected.json": {
"bytes": 135526,
"sha256": "7c104d5b9409b70dd4c0a38ddac45d8d9f910f49342084cdabe2b780b085f9f3"
},
"README.md": {
"bytes": 10728,
"sha256": "8e076d9f21c7585d1447714eea30f26d3fc0fc8b423d02e6456b9a9ed8294537"
},
"red-preview_scroll_tests.rs": {
"bytes": 17226,
"sha256": "79c99e281c2e29b7cd96aaf9e150d9bae9e9014ec32fb33ba238211d885f369e"
},
"run-fixed.py": {
"bytes": 4756,
"sha256": "7a59f7532d147cbe2dd7183b89ad05d096f60e0fe2f629dba523dc50fef2136c"
},
"run-red.py": {
"bytes": 5554,
"sha256": "5bd3c3af7b610f5e3ed2b1ef8317d33b994feb34883fc0963c80671ae7d2a168"
}
}
}
@@ -0,0 +1,470 @@
//! Execute the controller's scroll operations on a retained, scrolled dialog.
use super::*;
use crate::views::source_tests::FontLayout;
use iced::advanced::{Layout, layout, widget};
use iced::futures::StreamExt;
use iced::{Rectangle, Size, Vector};
const HOST: Size = Size::new(720., 660.);
fn paged_fixture() -> App {
let mut source = bundle();
let name = "Long engineering name 雨 ".repeat(18);
source.files.get_mut("defs.arcadia").unwrap().replace_range(
..,
&format!(
"oa_activity pump \"{name}\" id \"00000000-0000-0000-0000-000000000002\" {{}}\r\n\
oa_activity backup \"Backup\" id \"00000000-0000-0000-0000-000000000004\" {{}}\r\n"
),
);
let mut uses = String::new();
for index in 0..16 {
if index == 12 {
uses.push_str(&"// unchanged gap\r\n".repeat(10));
}
uses.push_str(&format!(
"interaction use_{index} \"{name}\" id \"00000000-0000-0000-0001-{index:012}\" {{ source @pump; target @backup; }}\r\n"
));
}
source.files.insert("uses.arcadia".into(), uses);
let mut app = fixture();
app.window_size = HOST;
app.document = Document::from_bundle(source, LIMITS).unwrap();
app.source_workspace = Workspace::new(app.document.bundle(), true);
app.source_workspace.active = "uses.arcadia".into();
app.show_source_file(false);
let start = app.source_workspace.text().find("source @pump").unwrap() + "source @".len();
app.source_editor
.move_to(cursor(app.source_workspace.text(), start, start + 4));
begin(&mut app);
input(&mut app, "pump_long");
let _ = preview(&mut app);
app
}
fn scroll_id(app: &App) -> widget::Id {
let form = app.source_rename.form.as_ref().unwrap();
preview_scroll_id(form, form.approval.as_ref().unwrap().id)
}
struct Geometry {
id: widget::Id,
offset: Option<Vector>,
bounds: Option<Rectangle>,
}
impl widget::Operation for Geometry {
fn traverse(&mut self, visit: &mut dyn FnMut(&mut dyn widget::Operation)) {
visit(self);
}
fn scrollable(
&mut self,
id: Option<&widget::Id>,
bounds: Rectangle,
_: Rectangle,
offset: Vector,
_: &mut dyn widget::operation::Scrollable,
) {
if id == Some(&self.id) {
self.offset = Some(offset);
self.bounds = Some(bounds);
}
}
}
struct Mounted {
editor: text_editor::Content<FontLayout>,
tree: widget::Tree,
}
impl Mounted {
fn new(app: &App) -> Self {
let editor = text_editor::Content::<FontLayout>::new();
let tree = widget::Tree::new(dialog_content(app, &editor).as_widget());
Self { editor, tree }
}
fn operate(&mut self, app: &App, operation: &mut dyn widget::Operation) {
let mut view = dialog_content(app, &self.editor);
// Preserve the actual scroll state across the new page's view diff.
self.tree.diff(view.as_widget());
let node = view.as_widget_mut().layout(
&mut self.tree,
&FontLayout,
&layout::Limits::new(Size::ZERO, HOST),
);
view.as_widget_mut()
.operate(&mut self.tree, Layout::new(&node), &FontLayout, operation);
}
fn offset(&mut self, app: &App) -> f32 {
let mut geometry = Geometry {
id: scroll_id(app),
offset: None,
bounds: None,
};
self.operate(app, &mut geometry);
geometry.offset.expect("mounted preview scrollable").y
}
fn scroll_down(&mut self, app: &App) -> f32 {
self.operate(
app,
&mut widget::operation::scrollable::scroll_to(
scroll_id(app),
widget::operation::scrollable::AbsoluteOffset {
x: None,
y: Some(10_000.),
},
),
);
let offset = self.offset(app);
assert!(offset > 10., "fixture must really be scrolled");
offset
}
fn wheel(&mut self, app: &App) -> Vec<Message> {
let mut geometry = Geometry {
id: scroll_id(app),
offset: None,
bounds: None,
};
self.operate(app, &mut geometry);
let position = geometry.bounds.expect("visible preview bounds").center();
let mut view = dialog_content(app, &self.editor);
self.tree.diff(view.as_widget());
let node = view.as_widget_mut().layout(
&mut self.tree,
&FontLayout,
&layout::Limits::new(Size::ZERO, HOST),
);
let mut messages = Vec::new();
let mut shell = iced::advanced::Shell::new(&mut messages);
view.as_widget_mut().update(
&mut self.tree,
&iced::Event::Mouse(iced::mouse::Event::WheelScrolled {
delta: iced::mouse::ScrollDelta::Pixels { x: 0., y: -120. },
}),
Layout::new(&node),
iced::mouse::Cursor::Available(position),
&FontLayout,
&mut iced::advanced::clipboard::Null,
&mut shell,
&Rectangle::with_size(HOST),
);
assert!(
shell.is_event_captured(),
"preview must consume wheel input"
);
messages
}
async fn execute(&mut self, app: &App, task: Task<Message>) -> usize {
let mut count = 0;
if let Some(mut actions) = iced_runtime::task::into_stream(task) {
while let Some(action) = actions.next().await {
let iced_runtime::Action::Widget(mut operation) = action else {
panic!("preview paging must only schedule a widget operation");
};
self.operate(app, operation.as_mut());
count += 1;
}
}
count
}
}
#[tokio::test]
async fn explicit_navigation_resets_retained_scroll_but_id_change_alone_does_not() {
let mut app = paged_fixture();
let before = evidence(&app);
let form = app.source_rename.form.as_ref().unwrap();
let invocation = form.invocation;
let approval = form.approval.as_ref().unwrap().id;
let mut mounted = Mounted::new(&app);
mounted.scroll_down(&app);
let old_id = scroll_id(&app);
let task = app.update(Message::SourceRename(Event::File(
invocation, approval, true,
)));
assert_ne!(old_id, scroll_id(&app));
// Negative control: even after diff/layout with the new id and new file,
// Iced retains the previous offset until the returned operation executes.
assert!(mounted.offset(&app) > 10.);
assert_eq!(mounted.execute(&app, task).await, 1);
assert_eq!(mounted.offset(&app), 0.);
for navigation in [
Event::Line(invocation, approval, true),
Event::Segment(invocation, approval, true),
Event::Hunk(invocation, approval, true),
Event::File(invocation, approval, false),
Event::Search(invocation, "uses".into()),
Event::Search(invocation, "no-path-match".into()),
Event::Search(invocation, String::new()),
] {
mounted.scroll_down(&app);
let task = app.update(Message::SourceRename(navigation));
assert_eq!(mounted.execute(&app, task).await, 1);
assert_eq!(mounted.offset(&app), 0.);
assert_eq!(evidence(&app), before);
}
// Passive redraw and unchanged filter input preserve deliberate scrolling.
let offset = mounted.scroll_down(&app);
assert_eq!(mounted.offset(&app), offset);
let task = app.update(Message::SourceRename(Event::Search(
invocation,
String::new(),
)));
assert_eq!(mounted.execute(&app, task).await, 0);
assert_eq!(mounted.offset(&app), offset);
let task = app.update(Message::SourceRename(Event::Input(
invocation,
"pump_long".into(),
)));
assert_eq!(mounted.execute(&app, task).await, 0);
assert_eq!(mounted.offset(&app), offset);
let task = app.update(Message::SourceRename(Event::File(
invocation, approval, false,
)));
assert_eq!(
mounted.execute(&app, task).await,
0,
"clamped first-page request is a no-op"
);
assert_eq!(mounted.offset(&app), offset);
assert_eq!(evidence(&app), before);
}
#[tokio::test]
async fn delayed_page_and_approval_operations_cannot_reset_a_new_destination() {
let mut app = paged_fixture();
let before = evidence(&app);
let form = app.source_rename.form.as_ref().unwrap();
let invocation = form.invocation;
let old_approval = form.approval.as_ref().unwrap().id;
let mut mounted = Mounted::new(&app);
let old_page_task = app.update(Message::SourceRename(Event::File(
invocation,
old_approval,
true,
)));
let next_page_task = app.update(Message::SourceRename(Event::Line(
invocation,
old_approval,
true,
)));
assert_eq!(mounted.execute(&app, next_page_task).await, 1);
let offset = mounted.scroll_down(&app);
assert_eq!(mounted.execute(&app, old_page_task).await, 1);
assert_eq!(mounted.offset(&app), offset, "old page target is absent");
let old_approval_task = app.update(Message::SourceRename(Event::Search(
invocation,
"defs".into(),
)));
input(&mut app, "pump_new");
let _ = preview(&mut app); // Real new approval in the same invocation/page.
assert_ne!(
app.source_rename
.form
.as_ref()
.unwrap()
.approval
.as_ref()
.unwrap()
.id,
old_approval
);
let offset = mounted.scroll_down(&app);
assert_eq!(mounted.execute(&app, old_approval_task).await, 1);
assert_eq!(
mounted.offset(&app),
offset,
"old approval target is absent"
);
let task = app.update(Message::SourceRename(Event::File(
invocation,
old_approval,
true,
)));
assert_eq!(
mounted.execute(&app, task).await,
0,
"stale envelope is rejected before scheduling"
);
assert_eq!(mounted.offset(&app), offset);
assert_eq!(evidence(&app), before);
}
#[tokio::test]
async fn repeated_page_visits_filters_and_fast_preview_completion_have_distinct_destinations() {
let mut app = paged_fixture();
let before = evidence(&app);
let form = app.source_rename.form.as_ref().unwrap();
let invocation = form.invocation;
let approval = form.approval.as_ref().unwrap().id;
let mut mounted = Mounted::new(&app);
let first_visit = app.update(Message::SourceRename(Event::File(
invocation, approval, true,
)));
let next_page = app.update(Message::SourceRename(Event::Line(
invocation, approval, true,
)));
assert_eq!(mounted.execute(&app, next_page).await, 1);
let return_visit = app.update(Message::SourceRename(Event::Line(
invocation, approval, false,
)));
assert_eq!(mounted.execute(&app, return_visit).await, 1);
let offset = mounted.scroll_down(&app);
assert_eq!(mounted.execute(&app, first_visit).await, 1);
assert_eq!(
mounted.offset(&app),
offset,
"old visit to the identical page is stale"
);
let old_filter = app.update(Message::SourceRename(Event::Search(
invocation,
"uses".into(),
)));
let new_filter = app.update(Message::SourceRename(Event::Search(
invocation,
"us".into(),
)));
assert_eq!(mounted.execute(&app, new_filter).await, 1);
let offset = mounted.scroll_down(&app);
assert_eq!(mounted.execute(&app, old_filter).await, 1);
assert_eq!(
mounted.offset(&app),
offset,
"old filter on the same page is stale"
);
input(&mut app, "pump_new");
let job = start_preview(&mut app);
let completion = preview_completion(&app, job);
// No intermediate frame mounts the temporary no-approval view. The old
// Scrollable survives even though the new approval has a different id.
let ready = app.update(Message::SourceRenameReady(completion));
assert!(mounted.offset(&app) > 10.);
assert_eq!(mounted.execute(&app, ready).await, 1);
assert_eq!(mounted.offset(&app), 0.);
assert_eq!(evidence(&app), before);
}
#[tokio::test]
async fn details_round_trip_retires_held_reset_without_changing_page_or_repeated_visibility_scroll()
{
// Exercise both an actually mounted Details view and a fast round trip
// between frames, where Iced retains the same preview Scrollable state.
for mount_details in [true, false] {
let mut app = paged_fixture();
let before = evidence(&app);
let form = app.source_rename.form.as_ref().unwrap();
let invocation = form.invocation;
let approval = form.approval.as_ref().unwrap().id;
let mut mounted = Mounted::new(&app);
mounted.scroll_down(&app);
let held_reset = app.update(Message::SourceRename(Event::File(
invocation, approval, true,
)));
let old_preview = scroll_id(&app);
let form = app.source_rename.form.as_ref().unwrap();
let page = (form.file, form.hunk, form.line, form.segment);
let show_details = app.update(Message::SourceRename(Event::Details(invocation, true)));
assert_eq!(mounted.execute(&app, show_details).await, 0);
let details_visit = scroll_id(&app);
assert_ne!(details_visit, old_preview);
if mount_details {
let mut hidden = Geometry {
id: old_preview.clone(),
offset: None,
bounds: None,
};
mounted.operate(&app, &mut hidden);
assert!(
hidden.offset.is_none(),
"Details actually replaced the preview"
);
}
let repeat_details = app.update(Message::SourceRename(Event::Details(invocation, true)));
assert_eq!(mounted.execute(&app, repeat_details).await, 0);
assert_eq!(
scroll_id(&app),
details_visit,
"unchanged visibility keeps its visit"
);
let show_preview = app.update(Message::SourceRename(Event::Details(invocation, false)));
assert_eq!(
mounted.execute(&app, show_preview).await,
0,
"returning does not force a scroll reset"
);
let returned_visit = scroll_id(&app);
assert_ne!(returned_visit, old_preview);
assert_ne!(returned_visit, details_visit);
let form = app.source_rename.form.as_ref().unwrap();
assert_eq!((form.file, form.hunk, form.line, form.segment), page);
assert_eq!(form.approval.as_ref().unwrap().id, approval);
let offset = mounted.scroll_down(&app);
let repeat_preview = app.update(Message::SourceRename(Event::Details(invocation, false)));
assert_eq!(mounted.execute(&app, repeat_preview).await, 0);
assert_eq!(scroll_id(&app), returned_visit);
assert_eq!(
mounted.offset(&app),
offset,
"repeated Preview preserves deliberate scroll"
);
assert_eq!(mounted.execute(&app, held_reset).await, 1);
assert_eq!(
mounted.offset(&app),
offset,
"the previous visit cannot reset the returned preview"
);
assert_eq!(evidence(&app), before);
}
}
// Portable before-fix proof: no new controller field/event assumption.
#[tokio::test]
async fn details_remount_preserves_visible_offset_without_controller_assumptions() {
let mut app = paged_fixture();
let before = evidence(&app);
let form = app.source_rename.form.as_ref().unwrap();
let invocation = form.invocation;
let approval = form.approval.as_ref().unwrap().id;
let page = (form.file, form.hunk, form.line, form.segment);
let mut mounted = Mounted::new(&app);
let reports = mounted.wheel(&app);
let offset = mounted.offset(&app);
assert!(
offset > 10.,
"real wheel input must move the overflowing fixture"
);
for message in reports {
let task = app.update(message);
let _ = mounted.execute(&app, task).await;
}
let task = app.update(Message::SourceRename(Event::Details(invocation, true)));
let _ = mounted.execute(&app, task).await;
let mut hidden = Geometry {
id: scroll_id(&app),
offset: None,
bounds: None,
};
mounted.operate(&app, &mut hidden);
assert!(
hidden.offset.is_none(),
"Details actually removed the preview subtree"
);
let task = app.update(Message::SourceRename(Event::Details(invocation, false)));
let _ = mounted.execute(&app, task).await;
// This assertion must execute before any second wheel or scroll operation.
assert_eq!(
mounted.offset(&app),
offset,
"Details remount must preserve visible offset"
);
let form = app.source_rename.form.as_ref().unwrap();
assert_eq!((form.file, form.hunk, form.line, form.segment), page);
assert_eq!(form.approval.as_ref().unwrap().id, approval);
assert_eq!(evidence(&app), before);
}
@@ -0,0 +1,14 @@
{
"revision": 2,
"source": "bebf9f594c6722200e95e92be2734acbea0dd700",
"original_manifest_sha256": "7999d2375b36a4c8724a1c39805deb91a4590994d73fef9a687c420244fb4a21",
"original_readme_sha256": "8e076d9f21c7585d1447714eea30f26d3fc0fc8b423d02e6456b9a9ed8294537",
"readme_sha256": "3b9b8131d83cc2568f6b4fe1a1ee24974066963f554a2380a18eea5497303d96",
"changed_helper_files": [],
"authorized_target": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\target",
"target_exists": true,
"target_resolved": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\target",
"free_bytes_before": 5971886080,
"red_proof": "Prepared only; skipped by parent because actual440 native failure is independently confirmed",
"execution": "No Rust gate started at revision recording"
}
@@ -0,0 +1,76 @@
"""Bind one serialized Windows union gate to committed inputs and actual output."""
from pathlib import Path
from datetime import datetime, timezone
import hashlib
import json
import os
import re
import subprocess
import sys
if not __debug__:
raise SystemExit('Refusing optimized Python: admission assertions are required')
base = Path(__file__).resolve().parents[2]
root = base / '.local/rs'
source, name, mode = sys.argv[1:4]
assert source == 'bebf9f594c6722200e95e92be2734acbea0dd700'
assert re.fullmatch(r'[a-zA-Z0-9-]+', name)
assert subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip() == source
out = base / '.local/rename-scroll-gates-20260913'
out.mkdir(exist_ok=True)
assert not any((out / (name + s)).exists() for s in ('.inputs.json', '.log', '.result.json'))
prefix = ['cargo', 'test', '--locked', '-p', 'oa-desktop', '--bin', 'arcadia-studio']
commands = {
'list': prefix + ['--', '--list'],
'focused': prefix + [sys.argv[4] if len(sys.argv) > 4 else 'navigation_union', '--', '--test-threads=1'],
'full': prefix + ['--', '--test-threads=1'],
'clippy': ['cargo', 'clippy', '--locked', '-p', 'oa-desktop', '--all-targets', '--', '-D', 'warnings'],
'gui': ['cargo', 'build', '--locked', '-p', 'oa-desktop', '--bin', 'arcadia-studio'],
}
command = commands[mode]
paths = subprocess.check_output(['git', 'ls-tree', '-r', '--name-only', source, 'Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml', '.cargo', 'build', 'crates', 'assets', 'docs', 'examples', 'harness/fixtures'], cwd=root).decode().splitlines()
blobs = subprocess.check_output(['git', 'cat-file', '--batch'], cwd=root,
input=''.join(f'{source}:{p}\n' for p in paths).encode())
offset, inputs = 0, []
for path in paths:
end = blobs.index(b'\n', offset)
_, kind, size = blobs[offset:end].split()
assert kind == b'blob'
size = int(size)
raw = blobs[end + 1:end + 1 + size]
assert (root / path).read_bytes() == raw, path
inputs.append({'path': path, 'bytes': size, 'sha256': hashlib.sha256(raw).hexdigest()})
offset = end + size + 2
assert offset == len(blobs)
assert len(inputs) == 581
assert not subprocess.check_output(['git', 'status', '--porcelain', '--untracked-files=all', '--', 'Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml', '.cargo', 'build', 'crates', 'assets', 'docs', 'examples', 'harness/fixtures'], cwd=root)
manifest = out / (name + '.inputs.json')
manifest.write_text(json.dumps({'source': source, 'inputs': inputs}, indent=2) + '\n', encoding='utf-8', newline='\n')
started = datetime.now(timezone.utc).isoformat()
print(json.dumps({'start': started, 'command': command, 'source': source, 'inputs': len(inputs)}), flush=True)
log_path = out / (name + '.log')
with log_path.open('xb') as stream:
run = subprocess.run(command, cwd=root, stdout=stream, stderr=subprocess.STDOUT)
ended = datetime.now(timezone.utc).isoformat()
changed = [i['path'] for i in inputs if hashlib.sha256((root / i['path']).read_bytes()).hexdigest() != i['sha256']]
head_after = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip()
log = log_path.read_text(encoding='utf-8', errors='replace')
members = re.findall(r'^([^\r\n]+): test\r?$', log, re.M) if mode == 'list' else []
artifacts = []
for match in re.findall(r'Running unittests [^\r\n]+ \(([^\r\n]+\.exe)\)', log):
path = Path(match)
if not path.is_absolute():
path = root / path
raw = path.read_bytes()
artifacts.append({'path': str(path), 'bytes': len(raw), 'sha256': hashlib.sha256(raw).hexdigest()})
status_after = subprocess.check_output(['git', 'status', '--porcelain', '--untracked-files=all', '--', 'Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml', '.cargo', 'build', 'crates', 'assets', 'docs', 'examples', 'harness/fixtures'], cwd=root).decode()
record = {'launcher_sha256': hashlib.sha256(Path(__file__).read_bytes()).hexdigest(), 'status_after': status_after, 'source': source, 'head_after': head_after, 'start': started, 'end': ended,
'exit': run.returncode, 'command': command, 'inputs': manifest.name,
'changed_inputs': changed, 'artifacts': artifacts,
'environment': {k: os.environ.get(k) for k in ['CARGO_TARGET_DIR', 'CARGO_BUILD_JOBS', 'CARGO_HOME', 'RUSTUP_HOME']},
'listing_members': members, 'listing_count': len(members),
'listing_scope': 'Names emitted by this actual Cargo test listing; focused/full runtime results have their own receipts.'}
(out / (name + '.result.json')).write_text(json.dumps(record, indent=2) + '\n', encoding='utf-8', newline='\n')
print(log[-14000:])
print(json.dumps({k:v for k,v in record.items() if k != 'listing_members'}))
sys.exit(run.returncode or int(bool(changed) or head_after != source or bool(status_after)))
@@ -0,0 +1,80 @@
"""Bind one serialized Windows union gate to committed inputs and actual output."""
from pathlib import Path
from datetime import datetime, timezone
import hashlib
import json
import os
import re
import subprocess
import sys
if not __debug__:
raise SystemExit('Refusing optimized Python: admission assertions are required')
base = Path(__file__).resolve().parents[2]
root = base / '.local/rr'
source, name, mode = sys.argv[1:4]
assert subprocess.check_output(['git', 'rev-parse', source + '^'], cwd=root).decode().strip() == '357da24542eaa519c2a01c465be6c7d1acbc8126'
assert subprocess.check_output(['git', 'diff', '--name-only', source + '^', source], cwd=root).decode().splitlines() == ['crates/oa-desktop/src/app/source_rename/preview_scroll_tests.rs']
assert (root / 'crates/oa-desktop/src/app/source_rename/preview_scroll_tests.rs').read_bytes() == (Path(__file__).parent / 'red-preview_scroll_tests.rs').read_bytes()
assert hashlib.sha256((Path(__file__).parent / 'red-preview_scroll_tests.rs').read_bytes()).hexdigest() == '79c99e281c2e29b7cd96aaf9e150d9bae9e9014ec32fb33ba238211d885f369e'
assert mode == 'focused' and sys.argv[4] == 'app::source_rename::tests::preview_scroll_tests::details_remount_preserves_visible_offset_without_controller_assumptions'
assert re.fullmatch(r'[a-zA-Z0-9-]+', name)
assert subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip() == source
out = base / '.local/rename-scroll-gates-20260913'
out.mkdir(exist_ok=True)
assert not any((out / (name + s)).exists() for s in ('.inputs.json', '.log', '.result.json'))
prefix = ['cargo', 'test', '--locked', '-p', 'oa-desktop', '--bin', 'arcadia-studio']
commands = {
'list': prefix + ['--', '--list'],
'focused': prefix + [sys.argv[4] if len(sys.argv) > 4 else 'navigation_union', '--', '--exact', '--test-threads=1'],
'full': prefix + ['--', '--exact', '--test-threads=1'],
'clippy': ['cargo', 'clippy', '--locked', '-p', 'oa-desktop', '--all-targets', '--', '-D', 'warnings'],
'gui': ['cargo', 'build', '--locked', '-p', 'oa-desktop', '--bin', 'arcadia-studio'],
}
command = commands[mode]
paths = subprocess.check_output(['git', 'ls-tree', '-r', '--name-only', source, 'Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml', '.cargo', 'build', 'crates', 'assets', 'docs', 'examples', 'harness/fixtures'], cwd=root).decode().splitlines()
blobs = subprocess.check_output(['git', 'cat-file', '--batch'], cwd=root,
input=''.join(f'{source}:{p}\n' for p in paths).encode())
offset, inputs = 0, []
for path in paths:
end = blobs.index(b'\n', offset)
_, kind, size = blobs[offset:end].split()
assert kind == b'blob'
size = int(size)
raw = blobs[end + 1:end + 1 + size]
assert (root / path).read_bytes() == raw, path
inputs.append({'path': path, 'bytes': size, 'sha256': hashlib.sha256(raw).hexdigest()})
offset = end + size + 2
assert offset == len(blobs)
assert len(inputs) == 581
assert not subprocess.check_output(['git', 'status', '--porcelain', '--untracked-files=all', '--', 'Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml', '.cargo', 'build', 'crates', 'assets', 'docs', 'examples', 'harness/fixtures'], cwd=root)
manifest = out / (name + '.inputs.json')
manifest.write_text(json.dumps({'source': source, 'inputs': inputs}, indent=2) + '\n', encoding='utf-8', newline='\n')
started = datetime.now(timezone.utc).isoformat()
print(json.dumps({'start': started, 'command': command, 'source': source, 'inputs': len(inputs)}), flush=True)
log_path = out / (name + '.log')
with log_path.open('xb') as stream:
run = subprocess.run(command, cwd=root, stdout=stream, stderr=subprocess.STDOUT)
ended = datetime.now(timezone.utc).isoformat()
changed = [i['path'] for i in inputs if hashlib.sha256((root / i['path']).read_bytes()).hexdigest() != i['sha256']]
head_after = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip()
log = log_path.read_text(encoding='utf-8', errors='replace')
members = re.findall(r'^([^\r\n]+): test\r?$', log, re.M) if mode == 'list' else []
artifacts = []
for match in re.findall(r'Running unittests [^\r\n]+ \(([^\r\n]+\.exe)\)', log):
path = Path(match)
if not path.is_absolute():
path = root / path
raw = path.read_bytes()
artifacts.append({'path': str(path), 'bytes': len(raw), 'sha256': hashlib.sha256(raw).hexdigest()})
status_after = subprocess.check_output(['git', 'status', '--porcelain', '--untracked-files=all', '--', 'Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml', '.cargo', 'build', 'crates', 'assets', 'docs', 'examples', 'harness/fixtures'], cwd=root).decode()
record = {'launcher_sha256': hashlib.sha256(Path(__file__).read_bytes()).hexdigest(), 'status_after': status_after, 'source': source, 'head_after': head_after, 'start': started, 'end': ended,
'exit': run.returncode, 'command': command, 'inputs': manifest.name,
'changed_inputs': changed, 'artifacts': artifacts,
'environment': {k: os.environ.get(k) for k in ['CARGO_TARGET_DIR', 'CARGO_BUILD_JOBS', 'CARGO_HOME', 'RUSTUP_HOME']},
'listing_members': members, 'listing_count': len(members),
'listing_scope': 'Names emitted by this actual Cargo test listing; focused/full runtime results have their own receipts.'}
(out / (name + '.result.json')).write_text(json.dumps(record, indent=2) + '\n', encoding='utf-8', newline='\n')
print(log[-14000:])
print(json.dumps({k:v for k,v in record.items() if k != 'listing_members'}))
sys.exit(run.returncode or int(bool(changed) or head_after != source or bool(status_after)))
@@ -0,0 +1,95 @@
# Rename Details scroll: prepared gates, no execution
Candidate **feab2020d8e5b6bfdb59c86ab4aee161617b8b6f**, worktree `.local/rs`, branch `codex/rename-details-scroll-956atf-20260913`. This includes the source-reviewed022 fix and the reviewed follow-up that handles validated display reports before shared source/camera/allocation boundaries. Parent357 is `357da24542eaa519c2a01c465be6c7d1acbc8126` (440 production plus AGENTS). Parent owns the compiler lease, integration and native acceptance. All r3 commands below are **prepared, UNRUN**; do not start them until parent reviews this test-only correction and fresh preparation. AST parsing and source/hash inspection are not executable gate evidence.
There are still581 gate inputs and615 build inputs, with three desktop files changed from357: `app.rs`, `app/source_rename.rs`, and `app/source_rename/preview_scroll_tests.rs`. Expected listing1099 is the actual440 listing1098 plus exactly one named mounted regression. Preview5, rename-test37, navigation-union17 and source-navigation51 are exact retained names in `expected.json`. Full expectation is1096 passed, zero failed, three preexisting named timing/scale ignores. No ignore may be added to make this pass.
All originals under `.local/navigation-palette-gates-20260913` and their original helpers/configs remain unchanged. Fresh output is `.local/rename-scroll-gates-20260913`, absent at preparation. Runner/admitter/build scripts reject optimized Python before any evidence writes. Use fresh run names after any failed attempt; exclusive receipt writes prevent overwriting history.
## Environment and lease
Run from the repository root only after the parent grants the serialized compiler lease and accepts this source/preparation review. The following names are task-local PowerShell variables. No toolchain version override or Cargo dependency update is requested.
```powershell
$scrollRepo = 'C:/Users/User/Documents/Git/ARCADIA-Studio'
$scrollPython = 'C:/Users/User/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe'
$scrollPrep = "$scrollRepo/.local/rename-scroll-gate-preparation-r3-20260913"
$scrollSource = 'feab2020d8e5b6bfdb59c86ab4aee161617b8b6f'
$env:CARGO_HOME = "$scrollRepo/.local/toolchain/cargo"
$env:RUSTUP_HOME = "$scrollRepo/.local/toolchain/rustup"
$env:CARGO_BUILD_JOBS = '1'
$env:CARGO_TARGET_X86_64_PC_WINDOWS_GNULLVM_LINKER = 'clang.exe'
$env:PATH = "$env:CARGO_HOME/bin;$scrollRepo/.local/toolchain/llvm-mingw-20260908-ucrt-x86_64/bin;$env:PATH"
$env:CARGO_TARGET_DIR = "$scrollRepo/target"
if ($env:PYTHONOPTIMIZE) { throw 'Use unoptimized Python for this gate.' }
Set-Location -LiteralPath $scrollRepo
function Invoke-ScrollPython {
& $scrollPython -B @args
if ($LASTEXITCODE -ne 0) { throw "Scroll gate stopped with exit $LASTEXITCODE" }
}
```
Revision2: parent explicitly authorized reuse of the existing root target cache for fixed gates after all root compiler gates closed; its native GUI runs from an immutable separate stage. Do not create a second target on this disk. Use the existing root target only under this serialized lease; every run checks its committed inputs and hashes the actual emitted executable. Complete/admit each result immediately before another compile can replace that test executable. Root target outputs are mutable under this authorization; preserve original440 receipts and already preserved GUI/server artifacts. No global environment/config mutation is needed. The GUI builder checks the actual Rust host and tools against the existing Windows gnullvm setup and preserves its own Cargo-reported PE artifact.
## Before-fix proof on real357 production
The portable overlay adds only measured bounds, a real WheelScrolled helper and one mounted test to357's existing test file. It contains no `PreviewScrolled` event or `preview_offset` field reference; it accepts whichever messages/tasks the original controller returns. It asserts that wheel input moves the preview, actually mounts Details so the preview subtree disappears, returns, then measures the visible offset **before any second scroll**. Thus the predicted failure is behavioral, not a missing API or a source mutation that disables only the fix. This portable test is distinct from the stronger committed fixed test (which additionally checks callback ownership and stale-report boundaries).
The following worktree and test-only local commit do not exist yet. If `.local/rr` or the branch already exists, stop and inspect ownership rather than reuse or delete it.
```powershell
if (Test-Path -LiteralPath "$scrollRepo/.local/rr") { throw 'Red worktree already exists; inspect before reuse.' }
git -c core.longpaths=true worktree add -b codex/rename-scroll-red-proof-956atf-20260913 .local/rr 357da24542eaa519c2a01c465be6c7d1acbc8126
if ($LASTEXITCODE -ne 0) { throw 'Red worktree creation failed' }
Copy-Item -LiteralPath "$scrollPrep/red-preview_scroll_tests.rs" -Destination "$scrollRepo/.local/rr/crates/oa-desktop/src/app/source_rename/preview_scroll_tests.rs"
git -C .local/rr diff --check
if ($LASTEXITCODE -ne 0) { throw 'Overlay whitespace check failed' }
git -C .local/rr add crates/oa-desktop/src/app/source_rename/preview_scroll_tests.rs
if ($LASTEXITCODE -ne 0) { throw 'Overlay staging failed' }
git -C .local/rr commit -m 'Test-only proof of rename Details scroll loss on357'
if ($LASTEXITCODE -ne 0) { throw 'Overlay commit failed' }
$scrollRedSource = (git -C .local/rr rev-parse HEAD).Trim()
if ($LASTEXITCODE -ne 0) { throw 'Cannot freeze red source' }
& $scrollPython -B "$scrollPrep/run-red.py" $scrollRedSource red357-details focused app::source_rename::tests::preview_scroll_tests::details_remount_preserves_visible_offset_without_controller_assumptions
$scrollRedExit = $LASTEXITCODE
if ($scrollRedExit -ne 101) { throw "Expected test failure101; inspect actual result ($scrollRedExit) before proceeding" }
```
Exit101 alone **does not establish reproduction**. Inspect the closed `.result.json` and `.log`: unchanged581 committed inputs, exact test-only child of357 and pinned overlay, one actual executable, exact requested `--exact` command, one test actually run/FAILED (zero passed/ignored;1098 filtered), and the panic must be **`Details remount must preserve visible offset`** with returned zero versus previously measured nonzero. Compile errors, no tests, wheel fixture failure, unrelated panics, timeout or missing result are failed evaluations. Record the actual overlay commit, all receipt hashes and this diagnostic; do not publish an expected failure as a passing product test. Keep the red checkout/evidence for review. No red failure has been observed yet.
## Fixed executable gates
Parent accepted bebf source review and independently confirmed actual440 native failure as sufficient before-fix evidence. Skip the portable red build in this run to avoid rebuilding357 on the space-constrained disk; its overlay and commands remain prepared and UNRUN. Start the fixed gates directly. The fixed runner refuses another source. The admission helper verifies committed source bytes, no additional scoped inputs,581 exact membership, launcher/config/baseline pins, actual executable hash, exact command and individual outcome names. Focused/full execution must match the admitted listing executable and input manifest. It does not infer passing tests from listing counts.
```powershell
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource list-feab202 list
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" list-feab202 list
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource preview-feab202 focused preview_scroll_tests
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" preview-feab202 focused list-feab202 preview_scroll_tests
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource rename-feab202 focused app::source_rename::tests::
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" rename-feab202 focused list-feab202 app::source_rename::tests::
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource navigation-feab202 focused navigation_union
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" navigation-feab202 focused list-feab202 navigation_union
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource source-navigation-feab202 focused source_navigation::
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" source-navigation-feab202 focused list-feab202 source_navigation::
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource full-feab202 full
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" full-feab202 full list-feab202
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource strict-feab202 clippy
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" strict-feab202 clippy
Invoke-ScrollPython "$scrollPrep/build-gui.py" $scrollSource gui-feab202
```
Rename37 includes preview5 and the source-rename envelope/navigation cases. Navigation17 adds the allocation/removal cross-module stale-envelope cases. Source-navigation51 includes departure-selection helpers. Overlap is intentional: preview5 gives the first decisive check; broader gates cover the new App dispatch path. Full1099 is warranted once because this change adds an App-level event/early return; it also executes the preserved final16 Find/departure-selection cases and other modal owners. Do not rerun full repeatedly after these receipts pass unless a new change/failure/risk requires it. Strict covers desktop all targets with `-D warnings`. The GUI build is only `oa-desktop --bin arcadia-studio`, preserving one Windows x64 artifact under its fresh receipt directory. Its result is not an unchanged dual-artifact440 build receipt.
## Evidence reuse and remaining native/package work
The candidate changes only the three named desktop inputs, with all other581-scope and615-scope membership retained. Core/server production, Cargo manifests/lock/config/toolchain, assets and scripts must be compared as exact committed blob sets with440 before reusing those scoped results; record that equality with the original440 receipt hashes. Existing broad581/615 manifests themselves differ, so **do not claim their whole input sets are equal or relabel a440 core/server build as built at bebf**. An unchanged core/server test/build artifact remains evidence at its original source and scope. Parent owns any composite package manifest with a new GUI and unchanged verified server and must separately bind artifact bytes and packaging configuration; no existing native/package config has been edited here.
Native acceptance remains necessary on the preserved matching GUI: reproduce the same six-token `assess_report_union_trial` preview, measure/observe nonzero scrolling, Full details then Preview pane, require the same visible offset before new input and unchanged file/hunk/page and replacement. Check explicit page/filter/new-approval reset, stale queued report/reset behavior where practical, Cancel and unchanged completeProject/exactSourceBundle. Reuse prior valid saved rename/Undo/Redo/reopen and Find/selection/navigation evidence only within its documented scope; the new actual native return behavior is not established by that440 evidence. No GUI was launched and no evaluator/server/broker was invoked by this preparation.
## Revision3: retained failed run and test-only oracle correction
This directory is a fresh copy with new source/config/helper pins and `feab202` stems. The original preparation directory and every `bebf9f5` raw/admission file remain unchanged. Original bebf listing actually passed and was admitted (1099); preview5 actually failed4/1 at its initial raw-report-versus-rendered-offset equality, before Details. Those results are not relabeled for this candidate. Failure details are in `.local/navigation-preview-scroll-bebf-runtime-20260913.md`.
The only source change from bebf is the test oracle: extract the actual finite positive report, require its exact rounded value equals the visible translation, and require the form to retain the exact report before/after Details. Visible before/after offset equality remains exact, with no second scroll or tolerance. The production implementation is unchanged. Iced0.14.2 Scrollable::operate forwards State::translation, whose vertical value is rounded; Viewport::absolute_offset retains the fractional absolute value. The initial failure114.09999 versus114 therefore did not reach the restoration assertion. Fresh listing, preview and remaining gates are required at this source after review. All r3 outputs are absent at preparation.
@@ -0,0 +1,95 @@
# Rename Details scroll: prepared gates, no execution
Candidate **feab2020d8e5b6bfdb59c86ab4aee161617b8b6f**, worktree `.local/rs`, branch `codex/rename-details-scroll-956atf-20260913`. This includes the source-reviewed022 fix and the reviewed follow-up that handles validated display reports before shared source/camera/allocation boundaries. Parent357 is `357da24542eaa519c2a01c465be6c7d1acbc8126` (440 production plus AGENTS). Parent owns the compiler lease, integration and native acceptance. All r3 commands below are **prepared, UNRUN**; do not start them until parent reviews this test-only correction and fresh preparation. AST parsing and source/hash inspection are not executable gate evidence.
There are still581 gate inputs and615 build inputs, with three desktop files changed from357: `app.rs`, `app/source_rename.rs`, and `app/source_rename/preview_scroll_tests.rs`. Expected listing1099 is the actual440 listing1098 plus exactly one named mounted regression. Preview5, rename-test37, navigation-union17 and source-navigation51 are exact retained names in `expected.json`. Full expectation is1096 passed, zero failed, three preexisting named timing/scale ignores. No ignore may be added to make this pass.
All originals under `.local/navigation-palette-gates-20260913` and their original helpers/configs remain unchanged. Output remains `.local/rename-scroll-gates-20260913`, which already contains preserved bebf evidence. Only the fresh `*-feab202` output stems are absent before this run. Runner/admitter/build scripts reject optimized Python before any evidence writes. Use fresh run names after any failed attempt; exclusive receipt writes prevent overwriting history.
## Environment and lease
Run from the repository root only after the parent grants the serialized compiler lease and accepts this source/preparation review. The following names are task-local PowerShell variables. No toolchain version override or Cargo dependency update is requested.
```powershell
$scrollRepo = 'C:/Users/User/Documents/Git/ARCADIA-Studio'
$scrollPython = 'C:/Users/User/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe'
$scrollPrep = "$scrollRepo/.local/rename-scroll-gate-preparation-r3-20260913"
$scrollSource = 'feab2020d8e5b6bfdb59c86ab4aee161617b8b6f'
$env:CARGO_HOME = "$scrollRepo/.local/toolchain/cargo"
$env:RUSTUP_HOME = "$scrollRepo/.local/toolchain/rustup"
$env:CARGO_BUILD_JOBS = '1'
$env:CARGO_TARGET_X86_64_PC_WINDOWS_GNULLVM_LINKER = 'clang.exe'
$env:PATH = "$env:CARGO_HOME/bin;$scrollRepo/.local/toolchain/llvm-mingw-20260908-ucrt-x86_64/bin;$env:PATH"
$env:CARGO_TARGET_DIR = "$scrollRepo/target"
if ($env:PYTHONOPTIMIZE) { throw 'Use unoptimized Python for this gate.' }
Set-Location -LiteralPath $scrollRepo
function Invoke-ScrollPython {
& $scrollPython -B @args
if ($LASTEXITCODE -ne 0) { throw "Scroll gate stopped with exit $LASTEXITCODE" }
}
```
Revision2: parent explicitly authorized reuse of the existing root target cache for fixed gates after all root compiler gates closed; its native GUI runs from an immutable separate stage. Do not create a second target on this disk. Use the existing root target only under this serialized lease; every run checks its committed inputs and hashes the actual emitted executable. Complete/admit each result immediately before another compile can replace that test executable. Root target outputs are mutable under this authorization; preserve original440 receipts and already preserved GUI/server artifacts. No global environment/config mutation is needed. The GUI builder checks the actual Rust host and tools against the existing Windows gnullvm setup and preserves its own Cargo-reported PE artifact.
## Before-fix proof on real357 production
The portable overlay adds only measured bounds, a real WheelScrolled helper and one mounted test to357's existing test file. It contains no `PreviewScrolled` event or `preview_offset` field reference; it accepts whichever messages/tasks the original controller returns. It asserts that wheel input moves the preview, actually mounts Details so the preview subtree disappears, returns, then measures the visible offset **before any second scroll**. Thus the predicted failure is behavioral, not a missing API or a source mutation that disables only the fix. This portable test is distinct from the stronger committed fixed test (which additionally checks callback ownership and stale-report boundaries).
The following worktree and test-only local commit do not exist yet. If `.local/rr` or the branch already exists, stop and inspect ownership rather than reuse or delete it.
```powershell
if (Test-Path -LiteralPath "$scrollRepo/.local/rr") { throw 'Red worktree already exists; inspect before reuse.' }
git -c core.longpaths=true worktree add -b codex/rename-scroll-red-proof-956atf-20260913 .local/rr 357da24542eaa519c2a01c465be6c7d1acbc8126
if ($LASTEXITCODE -ne 0) { throw 'Red worktree creation failed' }
Copy-Item -LiteralPath "$scrollPrep/red-preview_scroll_tests.rs" -Destination "$scrollRepo/.local/rr/crates/oa-desktop/src/app/source_rename/preview_scroll_tests.rs"
git -C .local/rr diff --check
if ($LASTEXITCODE -ne 0) { throw 'Overlay whitespace check failed' }
git -C .local/rr add crates/oa-desktop/src/app/source_rename/preview_scroll_tests.rs
if ($LASTEXITCODE -ne 0) { throw 'Overlay staging failed' }
git -C .local/rr commit -m 'Test-only proof of rename Details scroll loss on357'
if ($LASTEXITCODE -ne 0) { throw 'Overlay commit failed' }
$scrollRedSource = (git -C .local/rr rev-parse HEAD).Trim()
if ($LASTEXITCODE -ne 0) { throw 'Cannot freeze red source' }
& $scrollPython -B "$scrollPrep/run-red.py" $scrollRedSource red357-details focused app::source_rename::tests::preview_scroll_tests::details_remount_preserves_visible_offset_without_controller_assumptions
$scrollRedExit = $LASTEXITCODE
if ($scrollRedExit -ne 101) { throw "Expected test failure101; inspect actual result ($scrollRedExit) before proceeding" }
```
Exit101 alone **does not establish reproduction**. Inspect the closed `.result.json` and `.log`: unchanged581 committed inputs, exact test-only child of357 and pinned overlay, one actual executable, exact requested `--exact` command, one test actually run/FAILED (zero passed/ignored;1098 filtered), and the panic must be **`Details remount must preserve visible offset`** with returned zero versus previously measured nonzero. Compile errors, no tests, wheel fixture failure, unrelated panics, timeout or missing result are failed evaluations. Record the actual overlay commit, all receipt hashes and this diagnostic; do not publish an expected failure as a passing product test. Keep the red checkout/evidence for review. No red failure has been observed yet.
## Fixed executable gates
Parent accepted bebf source review and independently confirmed actual440 native failure as sufficient before-fix evidence. Skip the portable red build in this run to avoid rebuilding357 on the space-constrained disk; its overlay and commands remain prepared and UNRUN. Start the fixed gates directly. The fixed runner refuses another source. The admission helper verifies committed source bytes, no additional scoped inputs,581 exact membership, launcher/config/baseline pins, actual executable hash, exact command and individual outcome names. Focused/full execution must match the admitted listing executable and input manifest. It does not infer passing tests from listing counts.
```powershell
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource list-feab202 list
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" list-feab202 list
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource preview-feab202 focused preview_scroll_tests
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" preview-feab202 focused list-feab202 preview_scroll_tests
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource rename-feab202 focused app::source_rename::tests::
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" rename-feab202 focused list-feab202 app::source_rename::tests::
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource navigation-feab202 focused navigation_union
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" navigation-feab202 focused list-feab202 navigation_union
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource source-navigation-feab202 focused source_navigation::
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" source-navigation-feab202 focused list-feab202 source_navigation::
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource full-feab202 full
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" full-feab202 full list-feab202
Invoke-ScrollPython "$scrollPrep/run-fixed.py" $scrollSource strict-feab202 clippy
Invoke-ScrollPython "$scrollPrep/admit-fixed.py" strict-feab202 clippy
Invoke-ScrollPython "$scrollPrep/build-gui.py" $scrollSource gui-feab202
```
Rename37 includes preview5 and the source-rename envelope/navigation cases. Navigation17 adds the allocation/removal cross-module stale-envelope cases. Source-navigation51 includes departure-selection helpers. Overlap is intentional: preview5 gives the first decisive check; broader gates cover the new App dispatch path. Full1099 is warranted once because this change adds an App-level event/early return; it also executes the preserved final16 Find/departure-selection cases and other modal owners. Do not rerun full repeatedly after these receipts pass unless a new change/failure/risk requires it. Strict covers desktop all targets with `-D warnings`. The GUI build is only `oa-desktop --bin arcadia-studio`, preserving one Windows x64 artifact under its fresh receipt directory. Its result is not an unchanged dual-artifact440 build receipt.
## Evidence reuse and remaining native/package work
The candidate changes only the three named desktop inputs, with all other581-scope and615-scope membership retained. Core/server production, Cargo manifests/lock/config/toolchain, assets and scripts must be compared as exact committed blob sets with440 before reusing those scoped results; record that equality with the original440 receipt hashes. Existing broad581/615 manifests themselves differ, so **do not claim their whole input sets are equal or relabel a440 core/server build as built at bebf**. An unchanged core/server test/build artifact remains evidence at its original source and scope. Parent owns any composite package manifest with a new GUI and unchanged verified server and must separately bind artifact bytes and packaging configuration; no existing native/package config has been edited here.
Native acceptance remains necessary on the preserved matching GUI: reproduce the same six-token `assess_report_union_trial` preview, measure/observe nonzero scrolling, Full details then Preview pane, require the same visible offset before new input and unchanged file/hunk/page and replacement. Check explicit page/filter/new-approval reset, stale queued report/reset behavior where practical, Cancel and unchanged completeProject/exactSourceBundle. Reuse prior valid saved rename/Undo/Redo/reopen and Find/selection/navigation evidence only within its documented scope; the new actual native return behavior is not established by that440 evidence. No GUI was launched and no evaluator/server/broker was invoked by this preparation.
## Revision3: retained failed run and test-only oracle correction
This directory is a fresh copy with new source/config/helper pins and `feab202` stems. The original preparation directory and every `bebf9f5` raw/admission file remain unchanged. Original bebf listing actually passed and was admitted (1099); preview5 actually failed4/1 at its initial raw-report-versus-rendered-offset equality, before Details. Those results are not relabeled for this candidate. Failure details are in `.local/navigation-preview-scroll-bebf-runtime-20260913.md`.
The only source change from bebf is the test oracle: extract the actual finite positive report, require its exact rounded value equals the visible translation, and require the form to retain the exact report before/after Details. Visible before/after offset equality remains exact, with no second scroll or tolerance. The production implementation is unchanged. Iced0.14.2 Scrollable::operate forwards State::translation, whose vertical value is rounded; Viewport::absolute_offset retains the fractional absolute value. The initial failure114.09999 versus114 therefore did not reach the restoration assertion. Fresh listing, preview and remaining gates are required at this source after review. All r3 outputs are absent at preparation.
@@ -0,0 +1,137 @@
"""Admit only the prepared desktop listing, focused suites, full suite or clippy."""
from pathlib import Path
from datetime import datetime, timezone
import hashlib
import json
import re
import subprocess
import sys
if not __debug__:
raise SystemExit('Refusing optimized Python: admission assertions are required')
here = Path(__file__).resolve().parent
base = here.parents[1]
root = base / '.local/rs'
folder = base / '.local/rename-scroll-gates-20260913'
watched = {}
def read(path):
raw = path.read_bytes()
if path in watched:
assert watched[path] == raw, path
watched[path] = raw
return raw
def digest(path):
return hashlib.sha256(read(path)).hexdigest()
def value(path):
return json.loads(read(path))
assert digest(here / 'expected.json') == '963de41fc05471713627cf3571b3b071c68ff731a3f620753f6eb61411a319c8'
config = value(here / 'expected.json')
source = config['source']
assert subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip() == source
for path, sha in config['baseline_and_original_helper_pins'].items():
assert digest(base / path) == sha, path
baseline = value(base / '.local/navigation-palette-gates-20260913/list-44095f7.result.json')
baseline_admission = value(base / '.local/navigation-palette-gates-20260913/list-44095f7.admission.json')
assert baseline['exit'] == 0 and baseline_admission['verified_inputs'] == 581
assert baseline['source'] == baseline_admission['source'] == '44095f78c28b79d6d085863dc928adba8e24d955'
expected = config['listing_members']
assert len(expected) == len(set(expected)) == 1099
new = 'app::source_rename::tests::preview_scroll_tests::details_remount_restores_wheel_offset_before_any_rescroll'
assert len(baseline['listing_members']) == 1098
assert set(expected) == set(baseline['listing_members']) | {new}
name, mode = sys.argv[1:3]
assert re.fullmatch(r'[a-zA-Z0-9-]+', name)
record_path = folder / (name + '.result.json')
record = value(record_path)
assert record['source'] == record['head_after'] == source
assert type(record['exit']) is int and record['exit'] == 0
assert record['changed_inputs'] == [] and record['status_after'] == ''
assert datetime.fromisoformat(record['end']) >= datetime.fromisoformat(record['start'])
assert record['launcher_sha256'] == digest(here / 'run-fixed.py')
assert record['inputs'] == name + '.inputs.json'
inputs_path = folder / record['inputs']
manifest = value(inputs_path)
assert manifest['source'] == source
scopes = ['Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml', '.cargo', 'build', 'crates', 'assets', 'docs', 'examples', 'harness/fixtures']
paths = subprocess.check_output(['git', 'ls-tree', '-r', '--name-only', source, *scopes], cwd=root).decode().splitlines()
assert len(paths) == 581 == config['gate_inputs']
assert [item['path'] for item in manifest['inputs']] == paths
blobs = subprocess.check_output(['git', 'cat-file', '--batch'], cwd=root,
input=''.join(f'{source}:{p}\n' for p in paths).encode())
offset = 0
for item in manifest['inputs']:
end = blobs.index(b'\n', offset)
_, kind, size = blobs[offset:end].split()
assert kind == b'blob'
size = int(size)
raw = blobs[end + 1:end + 1 + size]
assert read(root / item['path']) == raw
assert item == {'path': item['path'], 'bytes': size, 'sha256': hashlib.sha256(raw).hexdigest()}
offset = end + size + 2
assert offset == len(blobs)
log_path = folder / (name + '.log')
log = read(log_path).decode('utf-8', errors='strict')
prefix = ['cargo', 'test', '--locked', '-p', 'oa-desktop', '--bin', 'arcadia-studio']
names, artifact = [], None
if mode != 'clippy':
assert len(record['artifacts']) == 1
artifact = record['artifacts'][0]
raw = Path(artifact['path']).read_bytes()
assert len(raw) == artifact['bytes'] and hashlib.sha256(raw).hexdigest() == artifact['sha256']
launches = re.findall(r'Running unittests [^\r\n]+ \(([^\r\n]+\.exe)\)', log)
assert len(launches) == 1
launched = Path(launches[0])
assert (launched if launched.is_absolute() else root / launched).resolve() == Path(artifact['path']).resolve()
if mode == 'list':
assert record['command'] == prefix + ['--', '--list']
names = re.findall(r'^([^\r\n]+): test\r?$', log, re.M)
assert names == record['listing_members']
assert record['listing_count'] == len(names) == len(set(names)) == 1099
assert set(names) == set(expected)
assert re.findall(r'^(\d+) tests, (\d+) benchmarks\s*$', log, re.M) == [('1099', '0')]
elif mode in ('focused', 'full'):
listing_name = sys.argv[3]
assert re.fullmatch(r'[a-zA-Z0-9-]+', listing_name)
listed = value(folder / (listing_name + '.result.json'))
admitted = value(folder / (listing_name + '.admission.json'))
assert admitted['source'] == source and admitted['mode'] == 'list'
assert admitted['helper_sha256'] == digest(Path(__file__))
for suffix, field in [('result.json', 'result_sha256'), ('inputs.json', 'inputs_sha256'), ('log', 'log_sha256')]:
assert admitted[field] == digest(folder / (listing_name + '.' + suffix))
assert admitted['config_sha256'] == digest(here / 'expected.json')
assert admitted['artifact'] == artifact == listed['artifacts'][0]
assert admitted['inputs_sha256'] == digest(inputs_path)
assert set(listed['listing_members']) == set(expected)
if mode == 'focused':
selector = sys.argv[4]
names = config['focused_groups'][selector]
assert record['command'] == prefix + [selector, '--', '--test-threads=1']
ignored = []
else:
names, ignored = expected, config['ignored']
assert record['command'] == prefix + ['--', '--test-threads=1']
outcomes = re.findall(r'^test ([^\r\n]+) \.\.\. (ok|FAILED|ignored)(?:, [^\r\n]*)?\r?$', log, re.M)
actual = [n for n, _ in outcomes]
assert len(actual) == len(set(actual)) == len(names) and set(actual) == set(names)
assert {n for n, outcome in outcomes if outcome == 'ignored'} == set(ignored)
assert all(outcome == ('ignored' if n in ignored else 'ok') for n, outcome in outcomes)
totals = re.findall(r'^test result: ok\. (\d+) passed; (\d+) failed; (\d+) ignored; (\d+) measured; (\d+) filtered out;', log, re.M)
assert totals == [(str(len(names)-len(ignored)), '0', str(len(ignored)), '0', str(1099-len(names)))], totals
elif mode == 'clippy':
assert record['command'] == ['cargo', 'clippy', '--locked', '-p', 'oa-desktop', '--all-targets', '--', '-D', 'warnings']
assert record['artifacts'] == []
assert re.search(r'Finished `dev` profile', log)
else:
raise AssertionError('Unsupported admission mode')
assert subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip() == source
assert not subprocess.check_output(['git', 'status', '--porcelain', '--untracked-files=all', '--', *scopes], cwd=root)
receipt = {'source': source, 'mode': mode, 'names': names, 'artifact': artifact,
'utc': datetime.now(timezone.utc).isoformat(), 'verified_inputs': 581,
'result_sha256': digest(record_path), 'inputs_sha256': digest(inputs_path),
'log_sha256': digest(log_path), 'config_sha256': digest(here / 'expected.json'),
'helper_sha256': digest(Path(__file__)), 'boundary': 'Desktop source gate only; native/package acceptance is separate.'}
for path, raw in watched.items():
assert path.read_bytes() == raw, path
with (folder / (name + '.admission.json')).open('x', encoding='utf-8', newline='\n') as stream:
stream.write(json.dumps(receipt, indent=2) + '\n')
print(json.dumps({'admitted': name, 'mode': mode, 'names': len(names), 'source': source}))
@@ -0,0 +1,146 @@
"""Build identified Windows binaries and preserve Cargo-reported artifacts."""
from pathlib import Path
from datetime import datetime, timezone
import hashlib
import json
import os
import re
import shutil
import subprocess
import sys
if not __debug__:
raise SystemExit('Refusing optimized Python: admission assertions are required')
base = Path(__file__).resolve().parents[2]
root = base / '.local/rs'
source, name = sys.argv[1:3]
assert source == 'feab2020d8e5b6bfdb59c86ab4aee161617b8b6f'
assert re.fullmatch(r'[a-zA-Z0-9-]+', name)
assert subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip() == source
folder = base / '.local/rename-scroll-gates-20260913' / name
folder.mkdir(exist_ok=False)
def digest(path):
raw = path.read_bytes()
return {'bytes': len(raw), 'sha256': hashlib.sha256(raw).hexdigest()}
def write(name, value):
with (folder / name).open('x', encoding='utf-8', newline='\n') as stream:
stream.write(json.dumps(value, indent=2) + '\n')
# A failed spawn, malformed output or artifact admission must also close a receipt.
inputs, artifacts, changed = [], [], []
command, head_after, result = [], None, None
started = datetime.now(timezone.utc).isoformat()
phase, failure, status_after = 'input/tool admission', None, None
try:
scopes = ['Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml', '.cargo', 'build',
'crates', 'assets', 'docs', 'examples', 'harness/fixtures', 'scripts']
paths = subprocess.check_output(['git', 'ls-tree', '-r', '--name-only', source, *scopes], cwd=root).decode().splitlines()
assert not subprocess.check_output(['git', 'status', '--porcelain', '--untracked-files=all', '--', *scopes], cwd=root)
blobs = subprocess.check_output(['git', 'cat-file', '--batch'], cwd=root,
input=''.join(f'{source}:{p}\n' for p in paths).encode())
offset, inputs = 0, []
for path in paths:
end = blobs.index(b'\n', offset)
_, kind, size = blobs[offset:end].split()
assert kind == b'blob'
size = int(size)
raw = blobs[end + 1:end + 1 + size]
assert (root / path).read_bytes() == raw, path
inputs.append({'path': path, 'bytes': size, 'sha256': hashlib.sha256(raw).hexdigest()})
offset = end + size + 2
assert offset == len(blobs)
assert len(inputs) == 615
write('inputs.json', {'source': source, 'inputs': inputs})
environment = {k: v for k, v in os.environ.items() if k in (
'CARGO_HOME', 'RUSTUP_HOME', 'CARGO_TARGET_DIR', 'CARGO_BUILD_JOBS',
'RUSTFLAGS', 'CARGO_ENCODED_RUSTFLAGS', 'RUSTC', 'RUSTC_WRAPPER', 'RUSTC_WORKSPACE_WRAPPER',
'CARGO_BUILD_TARGET', 'CARGO_TARGET_X86_64_PC_WINDOWS_GNULLVM_LINKER')}
tools = {}
for tool, args in [('rustc', ['-Vv']), ('cargo', ['--version']), ('clang', ['--version'])]:
requested = os.environ.get('RUSTC', 'rustc') if tool == 'rustc' else tool
resolved = shutil.which(requested)
assert resolved, f'Required tool unavailable: {requested}'
path = Path(resolved)
tools[tool] = {'path': str(path), **digest(path),
'version': subprocess.check_output([str(path), *args], cwd=root).decode()}
assert 'host: x86_64-pc-windows-gnullvm' in tools['rustc']['version']
write('environment.json', {'environment': environment, 'tools': tools,
'launcher': digest(Path(__file__)), 'profile': 'unoptimized development',
'target_mode': 'Cargo default/configured target; no explicit --target; artifacts require Windows x64 PE'})
command = [tools['cargo']['path'], 'build', '--locked', '--offline', '-p', 'oa-desktop',
'--bin', 'arcadia-studio', '--message-format=json-render-diagnostics']
started = datetime.now(timezone.utc).isoformat()
print(json.dumps({'start': started, 'source': source, 'command': command}), flush=True)
phase = 'cargo invocation'
with (folder / 'cargo.jsonl').open('xb') as stdout, (folder / 'cargo.stderr.log').open('xb') as stderr:
result = subprocess.run(command, cwd=root, stdout=stdout, stderr=stderr)
ended = datetime.now(timezone.utc).isoformat()
changed = [p['path'] for p in inputs if digest(root / p['path']) != {k:p[k] for k in ('bytes', 'sha256')}]
head_after = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip()
phase = 'Cargo JSON/artifact admission'
messages = [json.loads(line) for line in (folder / 'cargo.jsonl').read_bytes().splitlines()]
finished = [m for m in messages if m.get('reason') == 'build-finished']
artifacts = []
if result.returncode == 0 and not changed and head_after == source:
assert len(finished) == 1 and finished[0]['success'] is True
selected = [m for m in messages if m.get('reason') == 'compiler-artifact'
and m['target']['name'] == 'arcadia-studio'
and m.get('executable') and m['target']['kind'] == ['bin']]
assert len(selected) == 1 and {m['target']['name'] for m in selected} == {'arcadia-studio'}
manifests = {'arcadia-studio': root / 'crates/oa-desktop/Cargo.toml'}
for item in selected:
manifest = Path(item['manifest_path'])
if not manifest.is_absolute():
manifest = root / manifest
assert manifest.resolve() == manifests[item['target']['name']].resolve()
assert not item['profile']['test'] and item['profile']['opt_level'] == '0'
assert item['profile']['debug_assertions'], 'Expected a development-profile binary'
origin = Path(item['executable'])
if not origin.is_absolute():
origin = root / origin
origin = origin.resolve()
raw = origin.read_bytes()
assert raw[:2] == b'MZ' and len(raw) >= 64
pe = int.from_bytes(raw[60:64], 'little')
assert raw[pe:pe+4] == b'PE\0\0', 'Expected a PE executable'
assert int.from_bytes(raw[pe+4:pe+6], 'little') == 0x8664, 'Expected Windows x64 PE'
destination = folder / origin.name
with destination.open('xb') as stream:
stream.write(raw)
assert digest(destination) == digest(origin)
artifacts.append({'name': item['target']['name'], 'origin': str(origin),
'preserved': str(destination), **digest(destination), 'cargo_artifact': item})
except Exception as error:
failure = {'phase': phase, 'type': type(error).__name__, 'message': str(error)}
# Recheck after artifact preservation as well, including added/untracked inputs.
try:
changed = [item['path'] for item in inputs
if not (root / item['path']).is_file()
or digest(root / item['path']) != {key: item[key] for key in ('bytes', 'sha256')}]
head_after = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip()
status_after = subprocess.check_output(
['git', 'status', '--porcelain', '--untracked-files=all', '--', *scopes], cwd=root).decode()
except Exception as error:
postflight = {'phase': 'final input admission', 'type': type(error).__name__, 'message': str(error)}
if failure is None:
failure = postflight
else:
failure['postflight'] = postflight
code = result.returncode if result is not None else None
passed = code == 0 and failure is None and not changed and head_after == source and status_after == ''
record = {'source': source, 'head_after': head_after, 'start': started,
'end': datetime.now(timezone.utc).isoformat(),
'exit': code, 'outcome': 'passed' if passed else 'failed', 'failure': failure,
'command': command, 'changed_inputs': changed, 'status_after': status_after, 'artifacts': artifacts,
'launcher': digest(Path(__file__))}
for key, filename in [('inputs', 'inputs.json'), ('environment', 'environment.json'),
('stdout', 'cargo.jsonl'), ('stderr', 'cargo.stderr.log')]:
path = folder / filename
record[key] = digest(path) if path.is_file() else None
write('result.json', record)
print(json.dumps(record))
sys.exit(0 if passed else (code or 1))
@@ -0,0 +1,45 @@
{
"revision": 3,
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"parent": "bebf9f594c6722200e95e92be2734acbea0dd700",
"original_preparation_manifest_sha256": "7999d2375b36a4c8724a1c39805deb91a4590994d73fef9a687c420244fb4a21",
"original_revision2_manifest_sha256": "244c6d45b47d1c2c3b69703a31616a0557d31bec3684f688c0e9a25268acb2aa",
"checks": [
"Python AST only",
"clean frozen source",
"one test-only file differs from bebf",
"original failed result hash retained",
"new run outputs absent"
],
"runtime": "All feab202 gates UNRUN; requires parent source/preparation review",
"files": {
"admit-fixed.py": {
"bytes": 7609,
"sha256": "81c43b5db49e19fbe36995455b0e0690392159d815d96343f232674502c73210"
},
"build-gui.py": {
"bytes": 8137,
"sha256": "f8a2dd82d4fb635cb544c6396d36eb5d1ce878c36f3215945c2150152509ff77"
},
"expected.json": {
"bytes": 135890,
"sha256": "963de41fc05471713627cf3571b3b071c68ff731a3f620753f6eb61411a319c8"
},
"README.md": {
"bytes": 12562,
"sha256": "e110f20d551c0b6ddf70a3de51aad2f4f572f1bae04e251c9f40e4eb64803dec"
},
"red-preview_scroll_tests.rs": {
"bytes": 17230,
"sha256": "905d80b295171b1239ad44b294035019a0950b622048ebd329ae06db6e93f5fe"
},
"run-fixed.py": {
"bytes": 4756,
"sha256": "8229e1d760aad223aab30e79396cf050c01a1875bfd593fe7550e1f2dcc76899"
},
"run-red.py": {
"bytes": 5554,
"sha256": "5bd3c3af7b610f5e3ed2b1ef8317d33b994feb34883fc0963c80671ae7d2a168"
}
}
}
@@ -0,0 +1,55 @@
{
"revision": 3,
"source": "feab2020d8e5b6bfdb59c86ab4aee161617b8b6f",
"parent": "bebf9f594c6722200e95e92be2734acbea0dd700",
"original_preparation_manifest_sha256": "7999d2375b36a4c8724a1c39805deb91a4590994d73fef9a687c420244fb4a21",
"original_revision2_manifest_sha256": "244c6d45b47d1c2c3b69703a31616a0557d31bec3684f688c0e9a25268acb2aa",
"checks": [
"Python AST only",
"clean frozen source",
"one test-only file differs from bebf",
"original failed result hash retained",
"new run outputs absent"
],
"runtime": "All feab202 gates UNRUN; requires parent source/preparation review",
"files": {
"admit-fixed.py": {
"bytes": 7609,
"sha256": "81c43b5db49e19fbe36995455b0e0690392159d815d96343f232674502c73210"
},
"build-gui.py": {
"bytes": 8137,
"sha256": "f8a2dd82d4fb635cb544c6396d36eb5d1ce878c36f3215945c2150152509ff77"
},
"expected.json": {
"bytes": 135890,
"sha256": "963de41fc05471713627cf3571b3b071c68ff731a3f620753f6eb61411a319c8"
},
"preparation-manifest-r3-initial.json": {
"bytes": 1584,
"sha256": "6a4a832a1da55d0f02bef0e7c682bd51a0d9ae370429136638ecbc28e8401545"
},
"README-r3-initial.md": {
"bytes": 12562,
"sha256": "e110f20d551c0b6ddf70a3de51aad2f4f572f1bae04e251c9f40e4eb64803dec"
},
"README.md": {
"bytes": 12654,
"sha256": "5a710c962992a55082fb9cdd0fd5bfeeeed47a569d5b45435bb0ccdba62a7a67"
},
"red-preview_scroll_tests.rs": {
"bytes": 17230,
"sha256": "905d80b295171b1239ad44b294035019a0950b622048ebd329ae06db6e93f5fe"
},
"run-fixed.py": {
"bytes": 4756,
"sha256": "8229e1d760aad223aab30e79396cf050c01a1875bfd593fe7550e1f2dcc76899"
},
"run-red.py": {
"bytes": 5554,
"sha256": "5bd3c3af7b610f5e3ed2b1ef8317d33b994feb34883fc0963c80671ae7d2a168"
}
},
"revision_note": "Parent accepted source and r3 helpers; factual README correction before launch: existing folder, fresh feab stems only.",
"initial_r3_manifest_sha256": "6a4a832a1da55d0f02bef0e7c682bd51a0d9ae370429136638ecbc28e8401545"
}
@@ -0,0 +1,470 @@
//! Execute the controller's scroll operations on a retained, scrolled dialog.
use super::*;
use crate::views::source_tests::FontLayout;
use iced::advanced::{Layout, layout, widget};
use iced::futures::StreamExt;
use iced::{Rectangle, Size, Vector};
const HOST: Size = Size::new(720., 660.);
fn paged_fixture() -> App {
let mut source = bundle();
let name = "Long engineering name 雨 ".repeat(18);
source.files.get_mut("defs.arcadia").unwrap().replace_range(
..,
&format!(
"oa_activity pump \"{name}\" id \"00000000-0000-0000-0000-000000000002\" {{}}\r\n\
oa_activity backup \"Backup\" id \"00000000-0000-0000-0000-000000000004\" {{}}\r\n"
),
);
let mut uses = String::new();
for index in 0..16 {
if index == 12 {
uses.push_str(&"// unchanged gap\r\n".repeat(10));
}
uses.push_str(&format!(
"interaction use_{index} \"{name}\" id \"00000000-0000-0000-0001-{index:012}\" {{ source @pump; target @backup; }}\r\n"
));
}
source.files.insert("uses.arcadia".into(), uses);
let mut app = fixture();
app.window_size = HOST;
app.document = Document::from_bundle(source, LIMITS).unwrap();
app.source_workspace = Workspace::new(app.document.bundle(), true);
app.source_workspace.active = "uses.arcadia".into();
app.show_source_file(false);
let start = app.source_workspace.text().find("source @pump").unwrap() + "source @".len();
app.source_editor
.move_to(cursor(app.source_workspace.text(), start, start + 4));
begin(&mut app);
input(&mut app, "pump_long");
let _ = preview(&mut app);
app
}
fn scroll_id(app: &App) -> widget::Id {
let form = app.source_rename.form.as_ref().unwrap();
preview_scroll_id(form, form.approval.as_ref().unwrap().id)
}
struct Geometry {
id: widget::Id,
offset: Option<Vector>,
bounds: Option<Rectangle>,
}
impl widget::Operation for Geometry {
fn traverse(&mut self, visit: &mut dyn FnMut(&mut dyn widget::Operation)) {
visit(self);
}
fn scrollable(
&mut self,
id: Option<&widget::Id>,
bounds: Rectangle,
_: Rectangle,
offset: Vector,
_: &mut dyn widget::operation::Scrollable,
) {
if id == Some(&self.id) {
self.offset = Some(offset);
self.bounds = Some(bounds);
}
}
}
struct Mounted {
editor: text_editor::Content<FontLayout>,
tree: widget::Tree,
}
impl Mounted {
fn new(app: &App) -> Self {
let editor = text_editor::Content::<FontLayout>::new();
let tree = widget::Tree::new(dialog_content(app, &editor).as_widget());
Self { editor, tree }
}
fn operate(&mut self, app: &App, operation: &mut dyn widget::Operation) {
let mut view = dialog_content(app, &self.editor);
// Preserve the actual scroll state across the new page's view diff.
self.tree.diff(view.as_widget());
let node = view.as_widget_mut().layout(
&mut self.tree,
&FontLayout,
&layout::Limits::new(Size::ZERO, HOST),
);
view.as_widget_mut()
.operate(&mut self.tree, Layout::new(&node), &FontLayout, operation);
}
fn offset(&mut self, app: &App) -> f32 {
let mut geometry = Geometry {
id: scroll_id(app),
offset: None,
bounds: None,
};
self.operate(app, &mut geometry);
geometry.offset.expect("mounted preview scrollable").y
}
fn scroll_down(&mut self, app: &App) -> f32 {
self.operate(
app,
&mut widget::operation::scrollable::scroll_to(
scroll_id(app),
widget::operation::scrollable::AbsoluteOffset {
x: None,
y: Some(10_000.),
},
),
);
let offset = self.offset(app);
assert!(offset > 10., "fixture must really be scrolled");
offset
}
fn wheel(&mut self, app: &App) -> Vec<Message> {
let mut geometry = Geometry {
id: scroll_id(app),
offset: None,
bounds: None,
};
self.operate(app, &mut geometry);
let position = geometry.bounds.expect("visible preview bounds").center();
let mut view = dialog_content(app, &self.editor);
self.tree.diff(view.as_widget());
let node = view.as_widget_mut().layout(
&mut self.tree,
&FontLayout,
&layout::Limits::new(Size::ZERO, HOST),
);
let mut messages = Vec::new();
let mut shell = iced::advanced::Shell::new(&mut messages);
view.as_widget_mut().update(
&mut self.tree,
&iced::Event::Mouse(iced::mouse::Event::WheelScrolled {
delta: iced::mouse::ScrollDelta::Pixels { x: 0., y: -120. },
}),
Layout::new(&node),
iced::mouse::Cursor::Available(position),
&FontLayout,
&mut iced::advanced::clipboard::Null,
&mut shell,
&Rectangle::with_size(HOST),
);
assert!(
shell.is_event_captured(),
"preview must consume wheel input"
);
messages
}
async fn execute(&mut self, app: &App, task: Task<Message>) -> usize {
let mut count = 0;
if let Some(mut actions) = iced_runtime::task::into_stream(task) {
while let Some(action) = actions.next().await {
let iced_runtime::Action::Widget(mut operation) = action else {
panic!("preview paging must only schedule a widget operation");
};
self.operate(app, operation.as_mut());
count += 1;
}
}
count
}
}
#[tokio::test]
async fn explicit_navigation_resets_retained_scroll_but_id_change_alone_does_not() {
let mut app = paged_fixture();
let before = evidence(&app);
let form = app.source_rename.form.as_ref().unwrap();
let invocation = form.invocation;
let approval = form.approval.as_ref().unwrap().id;
let mut mounted = Mounted::new(&app);
mounted.scroll_down(&app);
let old_id = scroll_id(&app);
let task = app.update(Message::SourceRename(Event::File(
invocation, approval, true,
)));
assert_ne!(old_id, scroll_id(&app));
// Negative control: even after diff/layout with the new id and new file,
// Iced retains the previous offset until the returned operation executes.
assert!(mounted.offset(&app) > 10.);
assert_eq!(mounted.execute(&app, task).await, 1);
assert_eq!(mounted.offset(&app), 0.);
for navigation in [
Event::Line(invocation, approval, true),
Event::Segment(invocation, approval, true),
Event::Hunk(invocation, approval, true),
Event::File(invocation, approval, false),
Event::Search(invocation, "uses".into()),
Event::Search(invocation, "no-path-match".into()),
Event::Search(invocation, String::new()),
] {
mounted.scroll_down(&app);
let task = app.update(Message::SourceRename(navigation));
assert_eq!(mounted.execute(&app, task).await, 1);
assert_eq!(mounted.offset(&app), 0.);
assert_eq!(evidence(&app), before);
}
// Passive redraw and unchanged filter input preserve deliberate scrolling.
let offset = mounted.scroll_down(&app);
assert_eq!(mounted.offset(&app), offset);
let task = app.update(Message::SourceRename(Event::Search(
invocation,
String::new(),
)));
assert_eq!(mounted.execute(&app, task).await, 0);
assert_eq!(mounted.offset(&app), offset);
let task = app.update(Message::SourceRename(Event::Input(
invocation,
"pump_long".into(),
)));
assert_eq!(mounted.execute(&app, task).await, 0);
assert_eq!(mounted.offset(&app), offset);
let task = app.update(Message::SourceRename(Event::File(
invocation, approval, false,
)));
assert_eq!(
mounted.execute(&app, task).await,
0,
"clamped first-page request is a no-op"
);
assert_eq!(mounted.offset(&app), offset);
assert_eq!(evidence(&app), before);
}
#[tokio::test]
async fn delayed_page_and_approval_operations_cannot_reset_a_new_destination() {
let mut app = paged_fixture();
let before = evidence(&app);
let form = app.source_rename.form.as_ref().unwrap();
let invocation = form.invocation;
let old_approval = form.approval.as_ref().unwrap().id;
let mut mounted = Mounted::new(&app);
let old_page_task = app.update(Message::SourceRename(Event::File(
invocation,
old_approval,
true,
)));
let next_page_task = app.update(Message::SourceRename(Event::Line(
invocation,
old_approval,
true,
)));
assert_eq!(mounted.execute(&app, next_page_task).await, 1);
let offset = mounted.scroll_down(&app);
assert_eq!(mounted.execute(&app, old_page_task).await, 1);
assert_eq!(mounted.offset(&app), offset, "old page target is absent");
let old_approval_task = app.update(Message::SourceRename(Event::Search(
invocation,
"defs".into(),
)));
input(&mut app, "pump_new");
let _ = preview(&mut app); // Real new approval in the same invocation/page.
assert_ne!(
app.source_rename
.form
.as_ref()
.unwrap()
.approval
.as_ref()
.unwrap()
.id,
old_approval
);
let offset = mounted.scroll_down(&app);
assert_eq!(mounted.execute(&app, old_approval_task).await, 1);
assert_eq!(
mounted.offset(&app),
offset,
"old approval target is absent"
);
let task = app.update(Message::SourceRename(Event::File(
invocation,
old_approval,
true,
)));
assert_eq!(
mounted.execute(&app, task).await,
0,
"stale envelope is rejected before scheduling"
);
assert_eq!(mounted.offset(&app), offset);
assert_eq!(evidence(&app), before);
}
#[tokio::test]
async fn repeated_page_visits_filters_and_fast_preview_completion_have_distinct_destinations() {
let mut app = paged_fixture();
let before = evidence(&app);
let form = app.source_rename.form.as_ref().unwrap();
let invocation = form.invocation;
let approval = form.approval.as_ref().unwrap().id;
let mut mounted = Mounted::new(&app);
let first_visit = app.update(Message::SourceRename(Event::File(
invocation, approval, true,
)));
let next_page = app.update(Message::SourceRename(Event::Line(
invocation, approval, true,
)));
assert_eq!(mounted.execute(&app, next_page).await, 1);
let return_visit = app.update(Message::SourceRename(Event::Line(
invocation, approval, false,
)));
assert_eq!(mounted.execute(&app, return_visit).await, 1);
let offset = mounted.scroll_down(&app);
assert_eq!(mounted.execute(&app, first_visit).await, 1);
assert_eq!(
mounted.offset(&app),
offset,
"old visit to the identical page is stale"
);
let old_filter = app.update(Message::SourceRename(Event::Search(
invocation,
"uses".into(),
)));
let new_filter = app.update(Message::SourceRename(Event::Search(
invocation,
"us".into(),
)));
assert_eq!(mounted.execute(&app, new_filter).await, 1);
let offset = mounted.scroll_down(&app);
assert_eq!(mounted.execute(&app, old_filter).await, 1);
assert_eq!(
mounted.offset(&app),
offset,
"old filter on the same page is stale"
);
input(&mut app, "pump_new");
let job = start_preview(&mut app);
let completion = preview_completion(&app, job);
// No intermediate frame mounts the temporary no-approval view. The old
// Scrollable survives even though the new approval has a different id.
let ready = app.update(Message::SourceRenameReady(completion));
assert!(mounted.offset(&app) > 10.);
assert_eq!(mounted.execute(&app, ready).await, 1);
assert_eq!(mounted.offset(&app), 0.);
assert_eq!(evidence(&app), before);
}
#[tokio::test]
async fn details_round_trip_retires_held_reset_without_changing_page_or_repeated_visibility_scroll()
{
// Exercise both an actually mounted Details view and a fast round trip
// between frames, where Iced retains the same preview Scrollable state.
for mount_details in [true, false] {
let mut app = paged_fixture();
let before = evidence(&app);
let form = app.source_rename.form.as_ref().unwrap();
let invocation = form.invocation;
let approval = form.approval.as_ref().unwrap().id;
let mut mounted = Mounted::new(&app);
mounted.scroll_down(&app);
let held_reset = app.update(Message::SourceRename(Event::File(
invocation, approval, true,
)));
let old_preview = scroll_id(&app);
let form = app.source_rename.form.as_ref().unwrap();
let page = (form.file, form.hunk, form.line, form.segment);
let show_details = app.update(Message::SourceRename(Event::Details(invocation, true)));
assert_eq!(mounted.execute(&app, show_details).await, 0);
let details_visit = scroll_id(&app);
assert_ne!(details_visit, old_preview);
if mount_details {
let mut hidden = Geometry {
id: old_preview.clone(),
offset: None,
bounds: None,
};
mounted.operate(&app, &mut hidden);
assert!(
hidden.offset.is_none(),
"Details actually replaced the preview"
);
}
let repeat_details = app.update(Message::SourceRename(Event::Details(invocation, true)));
assert_eq!(mounted.execute(&app, repeat_details).await, 0);
assert_eq!(
scroll_id(&app),
details_visit,
"unchanged visibility keeps its visit"
);
let show_preview = app.update(Message::SourceRename(Event::Details(invocation, false)));
assert_eq!(
mounted.execute(&app, show_preview).await,
0,
"returning does not force a scroll reset"
);
let returned_visit = scroll_id(&app);
assert_ne!(returned_visit, old_preview);
assert_ne!(returned_visit, details_visit);
let form = app.source_rename.form.as_ref().unwrap();
assert_eq!((form.file, form.hunk, form.line, form.segment), page);
assert_eq!(form.approval.as_ref().unwrap().id, approval);
let offset = mounted.scroll_down(&app);
let repeat_preview = app.update(Message::SourceRename(Event::Details(invocation, false)));
assert_eq!(mounted.execute(&app, repeat_preview).await, 0);
assert_eq!(scroll_id(&app), returned_visit);
assert_eq!(
mounted.offset(&app),
offset,
"repeated Preview preserves deliberate scroll"
);
assert_eq!(mounted.execute(&app, held_reset).await, 1);
assert_eq!(
mounted.offset(&app),
offset,
"the previous visit cannot reset the returned preview"
);
assert_eq!(evidence(&app), before);
}
}
// Portable before-fix proof: no new controller field/event assumption.
#[tokio::test]
async fn details_remount_preserves_visible_offset_without_controller_assumptions() {
let mut app = paged_fixture();
let before = evidence(&app);
let form = app.source_rename.form.as_ref().unwrap();
let invocation = form.invocation;
let approval = form.approval.as_ref().unwrap().id;
let page = (form.file, form.hunk, form.line, form.segment);
let mut mounted = Mounted::new(&app);
let reports = mounted.wheel(&app);
let offset = mounted.offset(&app);
assert!(
offset > 10.,
"real wheel input must move the overflowing fixture"
);
for message in reports {
let task = app.update(message);
let _ = mounted.execute(&app, task).await;
}
let task = app.update(Message::SourceRename(Event::Details(invocation, true)));
let _ = mounted.execute(&app, task).await;
let mut hidden = Geometry {
id: scroll_id(&app),
offset: None,
bounds: None,
};
mounted.operate(&app, &mut hidden);
assert!(
hidden.offset.is_none(),
"Details actually removed the preview subtree"
);
let task = app.update(Message::SourceRename(Event::Details(invocation, false)));
let _ = mounted.execute(&app, task).await;
// This assertion must execute before any second wheel or scroll operation.
assert_eq!(
mounted.offset(&app),
offset,
"Details remount must preserve visible offset"
);
let form = app.source_rename.form.as_ref().unwrap();
assert_eq!((form.file, form.hunk, form.line, form.segment), page);
assert_eq!(form.approval.as_ref().unwrap().id, approval);
assert_eq!(evidence(&app), before);
}
@@ -0,0 +1,76 @@
"""Bind one serialized Windows union gate to committed inputs and actual output."""
from pathlib import Path
from datetime import datetime, timezone
import hashlib
import json
import os
import re
import subprocess
import sys
if not __debug__:
raise SystemExit('Refusing optimized Python: admission assertions are required')
base = Path(__file__).resolve().parents[2]
root = base / '.local/rs'
source, name, mode = sys.argv[1:4]
assert source == 'feab2020d8e5b6bfdb59c86ab4aee161617b8b6f'
assert re.fullmatch(r'[a-zA-Z0-9-]+', name)
assert subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip() == source
out = base / '.local/rename-scroll-gates-20260913'
out.mkdir(exist_ok=True)
assert not any((out / (name + s)).exists() for s in ('.inputs.json', '.log', '.result.json'))
prefix = ['cargo', 'test', '--locked', '-p', 'oa-desktop', '--bin', 'arcadia-studio']
commands = {
'list': prefix + ['--', '--list'],
'focused': prefix + [sys.argv[4] if len(sys.argv) > 4 else 'navigation_union', '--', '--test-threads=1'],
'full': prefix + ['--', '--test-threads=1'],
'clippy': ['cargo', 'clippy', '--locked', '-p', 'oa-desktop', '--all-targets', '--', '-D', 'warnings'],
'gui': ['cargo', 'build', '--locked', '-p', 'oa-desktop', '--bin', 'arcadia-studio'],
}
command = commands[mode]
paths = subprocess.check_output(['git', 'ls-tree', '-r', '--name-only', source, 'Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml', '.cargo', 'build', 'crates', 'assets', 'docs', 'examples', 'harness/fixtures'], cwd=root).decode().splitlines()
blobs = subprocess.check_output(['git', 'cat-file', '--batch'], cwd=root,
input=''.join(f'{source}:{p}\n' for p in paths).encode())
offset, inputs = 0, []
for path in paths:
end = blobs.index(b'\n', offset)
_, kind, size = blobs[offset:end].split()
assert kind == b'blob'
size = int(size)
raw = blobs[end + 1:end + 1 + size]
assert (root / path).read_bytes() == raw, path
inputs.append({'path': path, 'bytes': size, 'sha256': hashlib.sha256(raw).hexdigest()})
offset = end + size + 2
assert offset == len(blobs)
assert len(inputs) == 581
assert not subprocess.check_output(['git', 'status', '--porcelain', '--untracked-files=all', '--', 'Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml', '.cargo', 'build', 'crates', 'assets', 'docs', 'examples', 'harness/fixtures'], cwd=root)
manifest = out / (name + '.inputs.json')
manifest.write_text(json.dumps({'source': source, 'inputs': inputs}, indent=2) + '\n', encoding='utf-8', newline='\n')
started = datetime.now(timezone.utc).isoformat()
print(json.dumps({'start': started, 'command': command, 'source': source, 'inputs': len(inputs)}), flush=True)
log_path = out / (name + '.log')
with log_path.open('xb') as stream:
run = subprocess.run(command, cwd=root, stdout=stream, stderr=subprocess.STDOUT)
ended = datetime.now(timezone.utc).isoformat()
changed = [i['path'] for i in inputs if hashlib.sha256((root / i['path']).read_bytes()).hexdigest() != i['sha256']]
head_after = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip()
log = log_path.read_text(encoding='utf-8', errors='replace')
members = re.findall(r'^([^\r\n]+): test\r?$', log, re.M) if mode == 'list' else []
artifacts = []
for match in re.findall(r'Running unittests [^\r\n]+ \(([^\r\n]+\.exe)\)', log):
path = Path(match)
if not path.is_absolute():
path = root / path
raw = path.read_bytes()
artifacts.append({'path': str(path), 'bytes': len(raw), 'sha256': hashlib.sha256(raw).hexdigest()})
status_after = subprocess.check_output(['git', 'status', '--porcelain', '--untracked-files=all', '--', 'Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml', '.cargo', 'build', 'crates', 'assets', 'docs', 'examples', 'harness/fixtures'], cwd=root).decode()
record = {'launcher_sha256': hashlib.sha256(Path(__file__).read_bytes()).hexdigest(), 'status_after': status_after, 'source': source, 'head_after': head_after, 'start': started, 'end': ended,
'exit': run.returncode, 'command': command, 'inputs': manifest.name,
'changed_inputs': changed, 'artifacts': artifacts,
'environment': {k: os.environ.get(k) for k in ['CARGO_TARGET_DIR', 'CARGO_BUILD_JOBS', 'CARGO_HOME', 'RUSTUP_HOME']},
'listing_members': members, 'listing_count': len(members),
'listing_scope': 'Names emitted by this actual Cargo test listing; focused/full runtime results have their own receipts.'}
(out / (name + '.result.json')).write_text(json.dumps(record, indent=2) + '\n', encoding='utf-8', newline='\n')
print(log[-14000:])
print(json.dumps({k:v for k,v in record.items() if k != 'listing_members'}))
sys.exit(run.returncode or int(bool(changed) or head_after != source or bool(status_after)))
@@ -0,0 +1,80 @@
"""Bind one serialized Windows union gate to committed inputs and actual output."""
from pathlib import Path
from datetime import datetime, timezone
import hashlib
import json
import os
import re
import subprocess
import sys
if not __debug__:
raise SystemExit('Refusing optimized Python: admission assertions are required')
base = Path(__file__).resolve().parents[2]
root = base / '.local/rr'
source, name, mode = sys.argv[1:4]
assert subprocess.check_output(['git', 'rev-parse', source + '^'], cwd=root).decode().strip() == '357da24542eaa519c2a01c465be6c7d1acbc8126'
assert subprocess.check_output(['git', 'diff', '--name-only', source + '^', source], cwd=root).decode().splitlines() == ['crates/oa-desktop/src/app/source_rename/preview_scroll_tests.rs']
assert (root / 'crates/oa-desktop/src/app/source_rename/preview_scroll_tests.rs').read_bytes() == (Path(__file__).parent / 'red-preview_scroll_tests.rs').read_bytes()
assert hashlib.sha256((Path(__file__).parent / 'red-preview_scroll_tests.rs').read_bytes()).hexdigest() == '79c99e281c2e29b7cd96aaf9e150d9bae9e9014ec32fb33ba238211d885f369e'
assert mode == 'focused' and sys.argv[4] == 'app::source_rename::tests::preview_scroll_tests::details_remount_preserves_visible_offset_without_controller_assumptions'
assert re.fullmatch(r'[a-zA-Z0-9-]+', name)
assert subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip() == source
out = base / '.local/rename-scroll-gates-20260913'
out.mkdir(exist_ok=True)
assert not any((out / (name + s)).exists() for s in ('.inputs.json', '.log', '.result.json'))
prefix = ['cargo', 'test', '--locked', '-p', 'oa-desktop', '--bin', 'arcadia-studio']
commands = {
'list': prefix + ['--', '--list'],
'focused': prefix + [sys.argv[4] if len(sys.argv) > 4 else 'navigation_union', '--', '--exact', '--test-threads=1'],
'full': prefix + ['--', '--exact', '--test-threads=1'],
'clippy': ['cargo', 'clippy', '--locked', '-p', 'oa-desktop', '--all-targets', '--', '-D', 'warnings'],
'gui': ['cargo', 'build', '--locked', '-p', 'oa-desktop', '--bin', 'arcadia-studio'],
}
command = commands[mode]
paths = subprocess.check_output(['git', 'ls-tree', '-r', '--name-only', source, 'Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml', '.cargo', 'build', 'crates', 'assets', 'docs', 'examples', 'harness/fixtures'], cwd=root).decode().splitlines()
blobs = subprocess.check_output(['git', 'cat-file', '--batch'], cwd=root,
input=''.join(f'{source}:{p}\n' for p in paths).encode())
offset, inputs = 0, []
for path in paths:
end = blobs.index(b'\n', offset)
_, kind, size = blobs[offset:end].split()
assert kind == b'blob'
size = int(size)
raw = blobs[end + 1:end + 1 + size]
assert (root / path).read_bytes() == raw, path
inputs.append({'path': path, 'bytes': size, 'sha256': hashlib.sha256(raw).hexdigest()})
offset = end + size + 2
assert offset == len(blobs)
assert len(inputs) == 581
assert not subprocess.check_output(['git', 'status', '--porcelain', '--untracked-files=all', '--', 'Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml', '.cargo', 'build', 'crates', 'assets', 'docs', 'examples', 'harness/fixtures'], cwd=root)
manifest = out / (name + '.inputs.json')
manifest.write_text(json.dumps({'source': source, 'inputs': inputs}, indent=2) + '\n', encoding='utf-8', newline='\n')
started = datetime.now(timezone.utc).isoformat()
print(json.dumps({'start': started, 'command': command, 'source': source, 'inputs': len(inputs)}), flush=True)
log_path = out / (name + '.log')
with log_path.open('xb') as stream:
run = subprocess.run(command, cwd=root, stdout=stream, stderr=subprocess.STDOUT)
ended = datetime.now(timezone.utc).isoformat()
changed = [i['path'] for i in inputs if hashlib.sha256((root / i['path']).read_bytes()).hexdigest() != i['sha256']]
head_after = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip()
log = log_path.read_text(encoding='utf-8', errors='replace')
members = re.findall(r'^([^\r\n]+): test\r?$', log, re.M) if mode == 'list' else []
artifacts = []
for match in re.findall(r'Running unittests [^\r\n]+ \(([^\r\n]+\.exe)\)', log):
path = Path(match)
if not path.is_absolute():
path = root / path
raw = path.read_bytes()
artifacts.append({'path': str(path), 'bytes': len(raw), 'sha256': hashlib.sha256(raw).hexdigest()})
status_after = subprocess.check_output(['git', 'status', '--porcelain', '--untracked-files=all', '--', 'Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml', '.cargo', 'build', 'crates', 'assets', 'docs', 'examples', 'harness/fixtures'], cwd=root).decode()
record = {'launcher_sha256': hashlib.sha256(Path(__file__).read_bytes()).hexdigest(), 'status_after': status_after, 'source': source, 'head_after': head_after, 'start': started, 'end': ended,
'exit': run.returncode, 'command': command, 'inputs': manifest.name,
'changed_inputs': changed, 'artifacts': artifacts,
'environment': {k: os.environ.get(k) for k in ['CARGO_TARGET_DIR', 'CARGO_BUILD_JOBS', 'CARGO_HOME', 'RUSTUP_HOME']},
'listing_members': members, 'listing_count': len(members),
'listing_scope': 'Names emitted by this actual Cargo test listing; focused/full runtime results have their own receipts.'}
(out / (name + '.result.json')).write_text(json.dumps(record, indent=2) + '\n', encoding='utf-8', newline='\n')
print(log[-14000:])
print(json.dumps({k:v for k,v in record.items() if k != 'listing_members'}))
sys.exit(run.returncode or int(bool(changed) or head_after != source or bool(status_after)))

Some files were not shown because too many files have changed in this diff Show More