Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
32 lines
4.4 KiB
Python
32 lines
4.4 KiB
Python
from pathlib import Path
|
|
import hashlib,json,shutil,subprocess,sys
|
|
R=Path('/home/jakub/devel/escapistsrereintroduced');B=Path('/tmp/erri-gameplay-root-0914');E=R/'docs/evidence/playtest-refresh-2026-10-03-ground-supply';C=R/'.build/playtest-2026-10-03-ground-supply';D=Path('/tmp/erri-playtest-review-0914')
|
|
sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest();load=lambda p:json.loads(p.read_text())
|
|
def write(p,v):p.write_text(json.dumps(v,indent=2)+'\n')
|
|
base=load(B/'baseline.json');changed=[p for p,h in base['files'].items() if not (R/p).is_file() or sha(R/p)!=h];assert set(changed)=={'README.md','docs/current-status.md','docs/playtest-build.md'},changed
|
|
assert hashlib.sha256(subprocess.check_output(['git','diff','--cached','--binary'],cwd=R)).hexdigest()==base['index_diff_sha256']
|
|
original=load(Path('/tmp/erri-heartbeat-20260930-1542-reference.json'));assert all(sha(Path('/home/jakub/devel/escapists')/p)==h for p,h in original.items())
|
|
prior=[]
|
|
for name in ['mine-safety','mounted-pair']:
|
|
old=R/('.build/playtest-2026-10-03-'+name);seal=load(R/('docs/evidence/playtest-refresh-2026-10-03-'+name+'/candidate-sha256.json'));assert {str(p.relative_to(old)):sha(p) for p in old.rglob('*') if p.is_file()}==seal;prior.append({'name':name,'files_unchanged':len(seal)})
|
|
review=load(D/'final-review.json');assert review['complete'] is True
|
|
review_hash=sha(D/'final-review.json');assert review_hash==(B/'approved-review-sha256.txt').read_text().strip()
|
|
assert load(Path('/tmp/erri-package-prep-0914/docs-proposal.json'))['target_writes'] is True
|
|
sys.path.insert(0,str(R/'tools'));from source_manifest import addon_manifest
|
|
assert addon_manifest(R)==load(B/'frozen-source.json')
|
|
h=load(C/'handoff.json');assert h['normal_mission_ready'] and h['local_participant_verified'] and h['repository_regression_programs']==300 and not h['release_qualified']
|
|
E.mkdir(exist_ok=False)
|
|
for n in ['baseline.json','frozen-source.json','freeze.py','source-bundle.log','finish-evidence.py']:shutil.copyfile(B/n,E/n)
|
|
for n in ['full-suite.log','suite-inputs.json','suite-result.json']:shutil.copyfile(Path('/tmp/erri-gameplay-root-0826')/n,E/n)
|
|
shutil.copyfile(D/'final-review.json',E/'independent-review.json');shutil.copyfile(D/'preflight.json',E/'suite-reuse-review.json')
|
|
shutil.copytree('/tmp/erri-package-prep-0914',E/'preparation',ignore=shutil.ignore_patterns('__pycache__','*.pyc'))
|
|
proposal=Path('/tmp/erri-maintenance-review-0914')
|
|
if proposal.is_dir():
|
|
d=E/'next-base-proposal';d.mkdir()
|
|
for p in proposal.iterdir():
|
|
if p.is_file() and p.suffix in {'.json','.md'}:shutil.copyfile(p,d/p.name)
|
|
seal={str(p.relative_to(C)):sha(p) for p in sorted(C.rglob('*')) if p.is_file()};write(E/'candidate-sha256.json',seal)
|
|
write(E/'review.json',{'kind':'UNQUALIFIED DEVELOPMENT CANDIDATE','candidate':str(C),'authored_files':423,'pak_payload_files':364,'runtime_files':3,'candidate_files':len(seal),'source_zip_sha256':sha(C/'source.zip'),'regression_programs':300,'fresh_full_suite_run':False,'suite_reused_for_unchanged_source_tests_tools':True,'two_post_suite_prose_changes_independently_reviewed':True,'normal_route_reused_for_exact_source':True,'normal_assertions':63,'normal_completions':1,'normal_script_failures':0,'normal_engine_errors':13,'normal_random_radius_trace_enabled':True,'normal_random_radius_reproduction_or_trace':False,'packed_normal_mission_and_local_prisoner':True,'packed_script_failures':0,'packed_engine_errors':17,'strict_failures_retained':True,'release_qualified':False,'published':False,'current_authored_source_matches':True,'original_reference_files_unchanged':len(original),'existing_paths_preserved_except_documentation':len(base['files'])-len(changed),'documentation_updates':changed,'index_diff_sha256':base['index_diff_sha256'],'previous_candidates':prior,'independent_review_sha256':sha(E/'independent-review.json'),'scope':'Includes finite engineer attempts at genuinely newer separated delivered posts and compatible-stock ordinary resupply admission. Native repeated mining, path avoidance, physical resupply/interception, human escape, multiplayer, manual UI, FPS and clean release remain unqualified. Intermittent zero-radius script error remains unresolved.'})
|
|
write(E/'evidence-sha256.json',{str(p.relative_to(E)):sha(p) for p in sorted(E.rglob('*')) if p.is_file() and p.name!='evidence-sha256.json'})
|
|
print(json.dumps({'candidate':str(C),'files':len(seal),'source_zip_sha256':sha(C/'source.zip'),'original_preserved':len(original),'previous_candidates_preserved':prior},indent=2))
|