Files
EscapistsReintroduced/docs/evidence/source-refresh-2026-10-02-gameplay-fixes/package-helpers/preflight.py
T
jakub 6a667d8deb Capture current mission, AI, map and administration development
Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
2026-10-13 22:52:53 +02:00

33 lines
2.5 KiB
Python

#!/usr/bin/env python3
"""Read-only qualification/input check; never launches native or changes a package."""
from pathlib import Path
import json,hashlib,sys,zipfile
HERE=Path(__file__).resolve().parent
load=lambda p:json.loads(p.read_text())
sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest()
c=load(HERE/'config.json');f=Path(c['frozen_root']);suite=Path(c['suite_directory']);normal=Path(c['normal_evidence'])
sys.path.insert(0,str(f/'tools'));from source_bundle import inventory
source=inventory(f);result=load(suite/'suite-result.json');inputs=load(suite/'suite-inputs.json')
assert result['exit']==0 and result['inputs_unchanged'] and not result.get('resumed'),'Requires completed fresh full frozen suite'
assert len(result['programs'])==result['regression_programs']==len({p['path'] for p in result['programs']})
assert all(p['exit']==0 for p in result['programs'])
assert all(inputs.get(n)==h for n,h in source.items()) and all((f/n).is_file() and sha(f/n)==h for n,h in inputs.items())
report=load(normal/'report.json');runner=load(normal/'runner.json.txt')
assert report['smoke_completions']==1 and not report['script_or_runtime_failures']
assert runner['cleanup_confirmed'] and runner['source_unchanged_after_run'] and runner['external_addons_unchanged_after_run']
assert sha(normal/'console.log.txt')==runner['console_sha256']
assert source==load(normal/'source-sha256.json')==load(normal/'launch-source-sha256.json')
for n in ['build','package_session','package_evidence','packed_session','packed_evidence']:
p=Path(c[n]);assert not p.exists() and not p.is_symlink(),f'Never reuse/overwrite {p}'
zip_path=Path(c['source_zip'])
if zip_path.exists():
with zipfile.ZipFile(zip_path) as z:
bm=load_manifest=json.loads(z.read('BUNDLE-MANIFEST.json'));names=z.namelist()
assert len(names)==len(set(names))==len({n.casefold() for n in names})
assert set(names)==set(bm['files'])|{'BUNDLE-MANIFEST.json'}
assert {n:h for n,h in bm['files'].items() if n.startswith('addons/')}==source
assert all(hashlib.sha256(z.read(n)).hexdigest()==h for n,h in bm['files'].items())
for n in ['package_session','packed_session']:
p=Path(c[n]);assert p.parent==Path('/tmp') and p==p.resolve(),'Native sessions must be direct canonical /tmp children'
print(json.dumps({'read_only':True,'authored_files':len(source),'regression_programs':result['regression_programs'],'normal_assertions':report['assertions_passed'],'retained_normal_engine_errors':len(report['engine_errors']),'qualified_for_next_diagnostic_step':True,'release_qualified':False},indent=2))