#!/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))