Integrate reviewed indentation Windows evidence
This commit is contained in:
@@ -0,0 +1 @@
|
||||
* -text
|
||||
@@ -0,0 +1,37 @@
|
||||
# Text indentation: Windows evidence at 4ffff0d
|
||||
|
||||
This package preserves closed desktop gates and two native trials for source-editor Tab / Shift+Tab, bound to `4ffff0d9d94bd1875e6b316b84ac11e5c5c9657c`. It supports the bounded issue #34 behavior; it does not establish project completion, another platform, a packaged release or general keyboard accessibility.
|
||||
|
||||
| Recorded check | Outcome |
|
||||
| --- | --- |
|
||||
| Initial listing at `836f9e14e7fae726e8dc16f3e1fb22b352e8e366` | Cargo exit 101: two test compilation errors; no tests listed or executed |
|
||||
| Listing at final source | 1,194 unique names: retained 1,185 plus nine source-derived indentation cases |
|
||||
| Focused indentation execution | 9 passed; 0 failed/ignored; 1,185 filtered |
|
||||
| Full desktop execution | 1,188 passed; 0 failed; 6 existing probes ignored |
|
||||
| Strict desktop all-targets Clippy | Exit 0, `-D warnings`; this is not a workspace all-targets claim |
|
||||
| Windows GUI build | Exit 0; Cargo artifact receipt preserved, binary omitted |
|
||||
| September 22 native trial | 29 observation records / 33 JPEGs; closed exit 0, empty logs, restored 525-byte baseline. Comparison with the indented expectation is **false**; this trial is not a save/reopen success |
|
||||
| September 23 native trial | 30 observation records / 41 JPEGs; closed exit 0, empty logs, saved 577-byte exact indentation oracle; visible Apply/Save/reopen reviewed independently |
|
||||
|
||||
The two intervening source changes repair only test setup: borrowing the SourceBundle fixture and importing the focus trait. The archive retains the failed gate as recorded. Final successful gates and GUI build have the same 711 input records. Both source snapshots were assembled from Git blobs and compared byte-for-byte to the captured manifests; the portable verifier independently checks their contents and recorded Git blob IDs. It cannot authenticate the named commits or reproduce a compiler build from these snapshots.
|
||||
|
||||
Native saved bytes equal four ASCII spaces prepended to each of the baseline's 13 physical lines. The exact oracle preserves two CRLF and eleven lone-LF endings, the combining `e\u0301` and woman-ZWJ-rocket sequences. Saved SHA-256: `66b0778b032e77f8ed359c267ae3d93b84056bf68c0fd7cd3d5c3b3a63a3782d`. The GUI receipt is 117,289,984 bytes / SHA-256 `975cb2a1f4426f0f9a3059e1e68c8393ffd35bb75e57516d5baf2f076d8286e4`; this package binds recorded receipts and contains no GUI executable to rehash. The independent native reviewer separately inspected the original staged executable and frames.
|
||||
|
||||
The original reviews in `reviews/` inside the ZIP distinguish source reasoning, recorded execution and native observations. The final native review accepts the focused indentation evidence with these limits:
|
||||
|
||||
- Tab in Find leaves the same visible focus and source unchanged. Successful focus traversal is **not** demonstrated; this is an inherited general-focus limitation.
|
||||
- Continued typing was exercised after explicit selection collapse, followed by undo of that typing while retaining indentation. Typing directly over the transformed selection and exact caret restoration are not claimed.
|
||||
- September 22 frame 007 is mislabeled as loaded while showing the Open dialog. September 23's initial file-picker attempt includes a 16×16 auxiliary image; the operator-reported coordinate rejection is not reconstructed from pixels. Initial typing has no visible effect, followed by a visibly verified successful path retry. This is recovered setup, not an indentation or accessibility acceptance result.
|
||||
- Selection direction partly depends on gesture history and tests, not selection color alone. Metadata captures images/window identity, not a complete accessibility tree or input-action log. No performance bound, IME result or exhaustive layout/keyboard claim is made.
|
||||
|
||||
Run from an ordinary checkout or extracted copy with Python 3.10 or newer:
|
||||
|
||||
```text
|
||||
python -B path/to/text-indentation-4ffff0d-20260923/verify.py
|
||||
```
|
||||
|
||||
The verifier is standard-library-only and read-only. It uses explicit checks rather than Python assertions; it neither invokes Git/network/Cargo nor extracts or executes archived helpers/binaries. It validates exact outer/ZIP membership and hashes, both 711-input snapshots, source-derived new test names, retained listing and outcome membership, ignored reasons, raw/admission/helper relationships, the failed compilation, strict/build receipts, both native closure scopes, capture/image membership and byte oracles. Visual claims remain review judgments, not facts proved by that verifier.
|
||||
|
||||
`manifest.json` records each ZIP member and original or generated provenance. `files.json` pins all other outer files, including the archive, manifest and verifier. Outer files are UTF-8 LF; archived raw files remain byte-identical. The prior ordinary/Text listing/outcomes and original native input are extracted from their committed evidence ZIPs; the original ZIP hashes/commit paths are recorded. Source and review snapshots are included, but dependency caches, profiles, temporary directories, staged EXEs/DLLs and runtime binaries are excluded. This is not a hermetic toolchain or authenticated historical execution record. The capture-helper source was saved from the persistent Node session after the trial; it is not a complete replay script.
|
||||
|
||||
Parent owns publication, integration and issue disposition. No compiler, tests, GUI actions or Gitea mutation were performed while assembling this package.
|
||||
Binary file not shown.
@@ -0,0 +1,22 @@
|
||||
{
|
||||
".gitattributes": {
|
||||
"bytes": 8,
|
||||
"sha256": "705fd4d6451a31d36b3df7de96f83f30ac976c9b4a6d1e51671d8e2f33e2d0da"
|
||||
},
|
||||
"README.md": {
|
||||
"bytes": 5446,
|
||||
"sha256": "24c975c48242ecc918ae237330710a976b476323b9bc1994170d147b9f86c1be"
|
||||
},
|
||||
"evidence.zip": {
|
||||
"bytes": 9285161,
|
||||
"sha256": "495c8d31401a4a5e2d88cafb5708f951915e1a216c9dba9e03c74e93375026e3"
|
||||
},
|
||||
"manifest.json": {
|
||||
"bytes": 54912,
|
||||
"sha256": "501bc8e453bcc8bffeb913f5fce1677c814576a5f12072a05c10621e10e1563b"
|
||||
},
|
||||
"verify.py": {
|
||||
"bytes": 18121,
|
||||
"sha256": "59b8c5c854708cd6c08197c261029597320cb4d59a72bac1d6629a766f5fe8a4"
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,261 @@
|
||||
"""Verify portable captured evidence, without Git, extraction or executing captured code."""
|
||||
from datetime import datetime
|
||||
import hashlib
|
||||
import io
|
||||
import json
|
||||
from pathlib import Path, PurePosixPath, PureWindowsPath
|
||||
import re
|
||||
import zipfile
|
||||
|
||||
SOURCE = '4ffff0d9d94bd1875e6b316b84ac11e5c5c9657c'
|
||||
FAILED = '836f9e14e7fae726e8dc16f3e1fb22b352e8e366'
|
||||
PREFIX = ['cargo', 'test', '--locked', '--offline', '-p', 'oa-desktop', '--bin', 'arcadia-studio']
|
||||
|
||||
|
||||
def require(condition, message):
|
||||
if not condition:
|
||||
raise RuntimeError(message)
|
||||
|
||||
|
||||
def pin(data):
|
||||
return {'bytes': len(data), 'sha256': hashlib.sha256(data).hexdigest()}
|
||||
|
||||
|
||||
def safe_name(name):
|
||||
path = PurePosixPath(name)
|
||||
require(name and not path.is_absolute() and '..' not in path.parts and '\\' not in name,
|
||||
'Unsafe member name: ' + name)
|
||||
|
||||
|
||||
def archive(raw):
|
||||
z = zipfile.ZipFile(io.BytesIO(raw))
|
||||
names = z.namelist()
|
||||
require(len(names) == len(set(names)), 'Duplicate ZIP entries')
|
||||
for entry in z.infolist():
|
||||
safe_name(entry.filename)
|
||||
require(not entry.is_dir(), 'Unexpected directory entry')
|
||||
require((entry.external_attr >> 16) & 0o170000 != 0o120000, 'Linked ZIP entry')
|
||||
return z
|
||||
|
||||
|
||||
def timestamp(value):
|
||||
result = datetime.fromisoformat(value.replace('Z', '+00:00'))
|
||||
require(result.tzinfo is not None, 'Timestamp requires timezone')
|
||||
return result
|
||||
|
||||
|
||||
def names(log):
|
||||
found = re.findall(r'^([^\r\n]+): test\r?$', log, re.M)
|
||||
require(len(found) == len(set(found)), 'Duplicate listed test')
|
||||
return found
|
||||
|
||||
|
||||
def outcomes(log):
|
||||
rows = re.findall(r'^test ([^\r\n]+) \.\.\. (ok|FAILED|ignored)(?:, ([^\r\n]*))?\r?$', log, re.M)
|
||||
require(len(rows) == len({n for n, _, _ in rows}), 'Duplicate test outcome')
|
||||
return {n: (status, reason) for n, status, reason in rows}
|
||||
|
||||
|
||||
def summary(log, passed, ignored, filtered):
|
||||
rows = re.findall(r'^test result: ok\. (\d+) passed; (\d+) failed; (\d+) ignored; (\d+) measured; (\d+) filtered out;', log, re.M)
|
||||
require(rows == [(str(passed), '0', str(ignored), '0', str(filtered))], 'Unexpected test summary')
|
||||
|
||||
|
||||
def main():
|
||||
root = Path(__file__).resolve().parent
|
||||
expected_outer = {'.gitattributes', 'README.md', 'verify.py', 'manifest.json', 'files.json', 'evidence.zip'}
|
||||
require({p.name for p in root.iterdir()} == expected_outer, 'Exact outer package membership')
|
||||
require(all(p.is_file() and not p.is_symlink() for p in root.iterdir()), 'Ordinary outer files required')
|
||||
pins = json.loads((root / 'files.json').read_bytes())
|
||||
require(set(pins) == expected_outer - {'files.json'}, 'Outer hash inventory')
|
||||
for name, wanted in pins.items():
|
||||
require(pin((root / name).read_bytes()) == wanted, 'Outer hash: ' + name)
|
||||
manifest = json.loads((root / 'manifest.json').read_bytes())
|
||||
require(manifest['source'] == SOURCE and manifest['failedSource'] == FAILED, 'Source identifiers')
|
||||
z = archive((root / 'evidence.zip').read_bytes())
|
||||
require(set(z.namelist()) == set(manifest['members']), 'Exact ZIP membership')
|
||||
for name, wanted in manifest['members'].items():
|
||||
require(pin(z.read(name)) == {k: wanted[k] for k in ('bytes', 'sha256')}, 'Member hash: ' + name)
|
||||
read = z.read
|
||||
doc = lambda name: json.loads(read(name))
|
||||
text = lambda name: read(name).decode('utf-8')
|
||||
|
||||
# Source snapshots were compared with Git blobs at assembly time. Portable
|
||||
# verification recomputes their bytes and recorded Git blob IDs, not Git ancestry.
|
||||
inputs, source_zips = {}, {}
|
||||
for commit in (FAILED, SOURCE):
|
||||
setting = manifest['sourceSets'][commit]
|
||||
inventory = doc(setting['manifest'])
|
||||
require(inventory['source'] == commit, 'Inventory source')
|
||||
rows = inventory['inputs']
|
||||
require(len(rows) == len({r['path'] for r in rows}) == 711, 'Exact 711 input identities')
|
||||
inputs[commit] = {r['path']: {k: r[k] for k in ('bytes', 'sha256')} for r in rows}
|
||||
source_zip = archive(read(setting['archive']))
|
||||
source_zips[commit] = source_zip
|
||||
require(set(source_zip.namelist()) == set(inputs[commit]), 'Source ZIP scope')
|
||||
blobs = doc(setting['gitBlobs'])
|
||||
require(set(blobs) == set(inputs[commit]), 'Git blob inventory scope')
|
||||
for path, wanted in inputs[commit].items():
|
||||
content = source_zip.read(path)
|
||||
require(pin(content) == wanted, 'Source bytes: ' + path)
|
||||
git_hash = hashlib.sha1(b'blob ' + str(len(content)).encode() + b'\0' + content).hexdigest()
|
||||
require(git_hash == blobs[path], 'Recorded Git blob: ' + path)
|
||||
changed = sorted(p for p in inputs[SOURCE] if inputs[SOURCE][p] != inputs[FAILED].get(p))
|
||||
require(set(inputs[SOURCE]) == set(inputs[FAILED]) and changed == [
|
||||
'crates/oa-desktop/src/app/source_indentation_tests.rs',
|
||||
'crates/oa-desktop/src/source_indentation/keyboard_tests.rs'], 'Two test-only compilation fixes')
|
||||
|
||||
old_names = names(text('prior/desktop-list-1.stdout.log'))
|
||||
old_outcomes = outcomes(text('prior/desktop-1.stdout.log'))
|
||||
require(len(old_names) == len(old_outcomes) == 1185 and set(old_names) == set(old_outcomes), 'Prior actual membership')
|
||||
require(all(s in ('ok', 'ignored') for s, _ in old_outcomes.values()), 'Prior outcomes')
|
||||
ignored = {n: reason for n, (status, reason) in old_outcomes.items() if status == 'ignored'}
|
||||
require(len(ignored) == 6, 'Six prior ignored probes')
|
||||
new_names = []
|
||||
for path, prefix in [
|
||||
('crates/oa-desktop/src/source_indentation/tests.rs', 'source_indentation::tests::'),
|
||||
('crates/oa-desktop/src/source_indentation/keyboard_tests.rs', 'source_indentation::keyboard_tests::'),
|
||||
('crates/oa-desktop/src/app/source_indentation_tests.rs', 'app::source_indentation_tests::'),
|
||||
]:
|
||||
code = source_zips[SOURCE].read(path).decode('utf-8')
|
||||
new_names.extend(prefix + name for name in re.findall(r'#\[test\]\s*fn (\w+)\(', code))
|
||||
require(len(new_names) == len(set(new_names)) == 9 and not set(new_names) & set(old_names), 'Nine source-derived additions')
|
||||
listing = names(text('gates/list-4ffff0d.log'))
|
||||
require(len(listing) == 1194 and set(listing) == set(old_names) | set(new_names), 'Retained suite plus nine additions')
|
||||
require(re.findall(r'^(\d+) tests, (\d+) benchmarks\s*$', text('gates/list-4ffff0d.log'), re.M) == [('1194', '0')], 'Actual listing summary')
|
||||
runner = pin(read('helpers/run-text-indentation-gate-20260922.py'))['sha256']
|
||||
admitter = pin(read('helpers/admit-text-indentation-20260922.py'))['sha256']
|
||||
artifact = None
|
||||
environment = None
|
||||
last_end = None
|
||||
for stem, mode in [('list-836f9e14', 'failed'), ('list-4ffff0d', 'list'),
|
||||
('indent-4ffff0d', 'focused'), ('full-4ffff0d', 'full'), ('strict-4ffff0d', 'strict')]:
|
||||
result = doc('gates/' + stem + '.result.json')
|
||||
log = text('gates/' + stem + '.log')
|
||||
commit = FAILED if mode == 'failed' else SOURCE
|
||||
require(result['source'] == result['head_after'] == commit and result['changed_inputs'] == [], 'Unchanged gate inputs: ' + stem)
|
||||
require(result['launcher_sha256'] == runner, 'Gate launcher binding')
|
||||
require(result['inputs'] == stem + '.inputs.json', 'Gate manifest name')
|
||||
require(doc('gates/' + result['inputs']) == doc(manifest['sourceSets'][commit]['manifest']), 'Exact gate input inventory')
|
||||
start, end = timestamp(result['start']), timestamp(result['end'])
|
||||
require(start <= end and (last_end is None or last_end <= start), 'Closed ordered gate interval')
|
||||
last_end = end
|
||||
if environment is None:
|
||||
environment = result['environment']
|
||||
require(result['environment'] == environment, 'Same recorded gate environment')
|
||||
command = (['cargo', 'clippy', '--locked', '--offline', '-p', 'oa-desktop', '--all-targets', '--', '-D', 'warnings'] if mode == 'strict'
|
||||
else PREFIX + (['--', '--list'] if mode in ('failed', 'list') else
|
||||
(['source_indentation'] if mode == 'focused' else []) + ['--', '--test-threads=1']))
|
||||
require(result['command'] == command and result['exit'] == (101 if mode == 'failed' else 0), 'Gate command/outcome')
|
||||
if mode in ('failed', 'strict'):
|
||||
require(result['artifacts'] == [] and result['listing_members'] == [] and result['listing_count'] == 0, 'No executed/listed tests for this gate')
|
||||
if mode == 'failed':
|
||||
require(re.findall(r'^error\[(E\d+)\]:', log, re.M) == ['E0308', 'E0599'] and 'due to 2 previous errors' in log, 'Retained initial compilation failure')
|
||||
require(not names(log) and not outcomes(log), 'Failed listing is not execution')
|
||||
continue
|
||||
if mode == 'strict':
|
||||
require('Finished `dev` profile [unoptimized]' in log and not re.search(r'^\s*(warning|error)(\[|:)', log, re.M), 'Closed strict desktop all-targets gate')
|
||||
continue
|
||||
require(len(result['artifacts']) == 1, 'One recorded test binary')
|
||||
artifact = result['artifacts'] if artifact is None else artifact
|
||||
require(result['artifacts'] == artifact, 'Same recorded test binary')
|
||||
emitted = re.findall(r'Running unittests [^\r\n]+ \(([^\r\n]+\.exe)\)', log)
|
||||
require(len(emitted) == 1, 'One raw test executable')
|
||||
observed = PureWindowsPath(emitted[0])
|
||||
if not observed.is_absolute():
|
||||
target = PureWindowsPath(environment['CARGO_TARGET_DIR'])
|
||||
require(observed.parts[0] == target.name and '..' not in observed.parts, 'Relative Cargo target path')
|
||||
observed = target.parent / observed
|
||||
require(observed == PureWindowsPath(artifact[0]['path']), 'Raw test executable binding')
|
||||
selected, rows = listing, None
|
||||
if mode == 'list':
|
||||
require(result['listing_members'] == listing and result['listing_count'] == 1194, 'Listing receipt membership')
|
||||
else:
|
||||
require(result['listing_members'] == [] and result['listing_count'] == 0, 'Runtime receipt is not a listing')
|
||||
selected = [n for n in listing if 'source_indentation' in n] if mode == 'focused' else listing
|
||||
actual = outcomes(log)
|
||||
require(list(actual) == selected, 'Actual ordered executed membership')
|
||||
for name, (status, reason) in actual.items():
|
||||
require(status == ('ignored' if name in ignored else 'ok'), 'Actual result: ' + name)
|
||||
require(reason == ignored.get(name, ''), 'Preserved ignored reason: ' + name)
|
||||
nignored = len(set(selected) & set(ignored))
|
||||
summary(log, len(selected) - nignored, nignored, 1194 - len(selected))
|
||||
rows = [[n, actual[n][0]] for n in selected]
|
||||
admission = doc('gates/' + stem + '.admission.json')
|
||||
require(admission['source'] == SOURCE and admission['listed'] == 1194 and admission['new_names'] == new_names, 'Admission source-derived membership')
|
||||
require(admission['selected'] == len(selected) and admission['outcomes'] == rows and admission['unchanged_inputs'] == 711, 'Admission actual outcomes')
|
||||
require(admission['helper_sha256'] == admitter, 'Admission helper identity')
|
||||
require(admission['records'] == {suffix: pin(read('gates/' + stem + suffix))['sha256'] for suffix in ('.result.json', '.inputs.json', '.log')}, 'Admission raw bindings')
|
||||
|
||||
build = doc('build/result.json')
|
||||
require(build['source'] == build['head_after'] == SOURCE and build['exit'] == 0 and build['outcome'] == 'passed' and build['failure'] is None, 'Successful identified GUI build')
|
||||
require(build['changed_inputs'] == [] and build['status_after'] == '' and len(build['artifacts']) == 1, 'Unchanged GUI build inputs')
|
||||
require(timestamp(build['start']) <= timestamp(build['end']), 'Closed GUI build')
|
||||
require(build['command'][1:] == ['build', '--locked', '--offline', '-p', 'oa-desktop', '--bin', 'arcadia-studio', '--message-format=json-render-diagnostics'], 'GUI build command')
|
||||
for field, member in [('launcher', 'helpers/build-text-gui-20260922.py'), ('inputs', 'build/inputs.json'), ('environment', 'build/environment.json'), ('stdout', 'build/cargo.jsonl'), ('stderr', 'build/cargo.stderr.log')]:
|
||||
require(build[field] == pin(read(member)), 'GUI build binding: ' + field)
|
||||
require(doc('build/inputs.json') == doc(manifest['sourceSets'][SOURCE]['manifest']), 'GUI build same 711 inputs')
|
||||
env = doc('build/environment.json')
|
||||
require(env['launcher'] == build['launcher'], 'Build environment launcher')
|
||||
cargo = [json.loads(line) for line in text('build/cargo.jsonl').splitlines() if line.strip()]
|
||||
require([r['success'] for r in cargo if r.get('reason') == 'build-finished'] == [True], 'Cargo success record')
|
||||
gui = build['artifacts'][0]
|
||||
require(gui['cargo_artifact'] in cargo and gui['name'] == 'arcadia-studio', 'Actual Cargo GUI artifact')
|
||||
require(PureWindowsPath(gui['origin']) == PureWindowsPath(gui['cargo_artifact']['executable']), 'GUI executable path binding')
|
||||
require(not re.search(r'^\s*(warning|error)(\[|:)', text('build/cargo.stderr.log'), re.M), 'GUI build diagnostics')
|
||||
|
||||
baseline = None
|
||||
native_summary = {}
|
||||
for date, count, success in [('20260922', 29, False), ('20260923', 30, True)]:
|
||||
prefix = 'native/' + date + '/'
|
||||
prep, request, launch, close = [doc(prefix + name + '.json') for name in ('preparation', 'launch-request', 'launch', 'closure')]
|
||||
require(all(r['source'] == SOURCE for r in (prep, request, launch, close)), 'Native source chain')
|
||||
require(prep['build'] == request['build'] == pin(read('build/result.json')) and prep['build_name'] == 'gui-4ffff0d', 'Native build binding')
|
||||
require(prep['gui'] == {k: gui[k] for k in ('bytes', 'sha256')}, 'Recorded GUI receipt identity')
|
||||
require(request['preparation'] == pin(read(prefix + 'preparation.json')) and request['helper'] == pin(read('helpers/text-indentation-native-' + date + '.py')), 'Native launch helper/preparation')
|
||||
require(len(request['command']) == 1 and PureWindowsPath(request['command'][0]).name == 'arcadia-studio.exe', 'Native launch target')
|
||||
require(launch['pid'] == close['pid'] and close['exit'] == 0 and close['gui_unchanged'] is True and close['baseline_unchanged'] is True, 'Native closed receipt')
|
||||
times = [timestamp(r['utc']) for r in (prep, request, launch, close)]
|
||||
require(times == sorted(times) and timestamp(build['end']) <= times[0], 'Native chronological chain')
|
||||
for stream in ('stdout', 'stderr'):
|
||||
require(read(prefix + stream + '.log') == b'' and close[stream] == pin(b''), 'Empty native process logs')
|
||||
original = read(prefix + 'baseline.arcadia')
|
||||
require(prep['fixture'] == pin(original), 'Original fixture pin')
|
||||
baseline = original if baseline is None else baseline
|
||||
require(original == baseline, 'Both trials use identical original fixture')
|
||||
expected = b''.join(b' ' + line for line in original.splitlines(keepends=True))
|
||||
actual = read(prefix + 'source-work/project.arcadia')
|
||||
require(close['saved'] == pin(actual) and close['expected'] == pin(expected), 'Saved and expected byte receipts')
|
||||
require(close['saved_bytes_equal_expected'] is success and (actual == expected) is success, 'Distinct native outcome scopes')
|
||||
require(actual == (expected if success else original), 'Exact restored/saved byte oracle')
|
||||
require(len(original) == 525 and len(expected) == 577 and len(original.splitlines()) == 13, 'Native fixture physical lines')
|
||||
require(original.count(b'\r\n') == 2 and original.count(b'\n') - original.count(b'\r\n') == 11, 'Mixed CRLF/LF baseline')
|
||||
require('e\u0301'.encode() in actual and '\U0001f469\u200d\U0001f680'.encode() in actual, 'Combining and ZWJ bytes')
|
||||
captures = manifest['native'][date]['captureMetadata']
|
||||
require(len(captures) == count and captures == sorted(captures), 'Native observation membership')
|
||||
require(set(captures) == {n for n in z.namelist() if n.startswith(prefix + 'evidence/') and n.endswith('.json')}, 'Exact capture metadata set')
|
||||
images, capture_times = [], []
|
||||
for path in captures:
|
||||
frame = doc(path)
|
||||
require(frame['source'] == SOURCE, 'Capture source')
|
||||
capture_times.append(timestamp(frame['time']))
|
||||
for image in frame['images']:
|
||||
safe_name(image['file'])
|
||||
require('/' not in image['file'] and image['width'] > 0 and image['height'] > 0, 'Capture image metadata')
|
||||
name = prefix + 'evidence/' + image['file']
|
||||
require(read(name).startswith(b'\xff\xd8'), 'Original JPEG bytes')
|
||||
images.append(name)
|
||||
require(capture_times == sorted(capture_times) and times[2] <= capture_times[0] <= capture_times[-1] <= times[3], 'Capture interval/order')
|
||||
require(len(images) == len(set(images)) == (33 if not success else 41), 'Distinct original image membership')
|
||||
require(set(images) == {n for n in z.namelist() if n.startswith(prefix + 'evidence/') and n.endswith('.jpg')}, 'No orphan original frames')
|
||||
native_summary[date] = {'observations': count, 'images': len(images), 'exit': 0, 'saved_bytes': len(actual), 'equals_indented_expectation': success}
|
||||
original = read('prior/native-input.arcadia').replace(b'Compact source workflow', b'Tab indentation workflow')
|
||||
require(baseline == '// Tab check: e\u0301 / \U0001f469\u200d\U0001f680\r\n// first selection\n// second selection\r\n'.encode() + original, 'Fixture preparation oracle')
|
||||
print(json.dumps({'source': SOURCE, 'source_inputs': 711, 'initial_listing_compile_errors': 2,
|
||||
'listed': 1194, 'focused_passed': 9, 'full_passed': 1188, 'full_ignored': 6,
|
||||
'strict_exit': 0, 'gui_build_exit': 0, 'native': native_summary,
|
||||
'scope': 'Recorded evidence integrity/relationships, not runtime reproduction or release acceptance.'}))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user