Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
57 lines
7.7 KiB
Python
57 lines
7.7 KiB
Python
from pathlib import Path
|
|
import sys,json,hashlib,shutil,subprocess,difflib
|
|
R=Path('/home/jakub/devel/escapistsrereintroduced');B=Path('/tmp/erri-mounted-intercept-root-1247')
|
|
F=R/'.build/mounted-intercept-native-final-1247';E=R/'docs/evidence/mounted-interception-2026-10-02'
|
|
sys.path.insert(0,str(R/'tools'))
|
|
from source_manifest import addon_manifest
|
|
sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest()
|
|
def write(p,v):p.write_text(json.dumps(v,indent=2)+'\n')
|
|
before=json.loads((B/'baseline.json').read_text());current=addon_manifest(R)
|
|
assert current==json.loads((F/'frozen-source.json').read_text())
|
|
suite=json.loads((B/'suite-result.json').read_text());assert suite['exit']==0 and suite['inputs_unchanged'] and suite['regression_programs']==285
|
|
bindings=json.loads((B/'suite-inputs.json').read_text());assert all(sha(R/n)==h for n,h in bindings.items())
|
|
assert hashlib.sha256(subprocess.check_output(['git','diff','--cached','--binary'],cwd=R)).hexdigest()==before['index_sha256']
|
|
inputs=json.loads((B/'integration-inputs.json').read_text());assert all(sha(R/n)==v['after'] for n,v in inputs.items())
|
|
allowed=set(inputs);changed=[n for n in set(before['authored'])|set(current) if before['authored'].get(n)!=current.get(n)]
|
|
assert len(current)==409 and len(changed)==7 and set(changed)<=allowed
|
|
assert all((sha(R/n) if (R/n).is_file() else None)==h for n,h in before['unstaged'].items() if n not in allowed)
|
|
original=json.loads(Path('/tmp/erri-heartbeat-20260930-1542-reference.json').read_text());assert all(sha(Path('/home/jakub/devel/escapists')/n)==h for n,h in original.items())
|
|
package=R/'.build/playtest-2026-10-02-objective-map';pm=json.loads((R/'docs/evidence/playtest-refresh-2026-10-02-objective-map/candidate-sha256.json').read_text());assert {str(p.relative_to(package)):sha(p) for p in package.rglob('*') if p.is_file()}==pm
|
|
name='native-2026-10-02-mounted-intercept-normal';native=F/'docs/evidence'/name
|
|
report=json.loads((native/'report.json').read_text());runner=json.loads((native/'runner.json.txt').read_text())
|
|
assert report['smoke_completions']==1 and report['assertions_passed']==63 and not report['script_or_runtime_failures'] and len(report['engine_errors'])==13
|
|
assert runner['cleanup_confirmed'] and runner['source_unchanged_after_run'] and runner['external_addons_unchanged_after_run']
|
|
E.mkdir();shutil.copytree(native,R/'docs/evidence'/name)
|
|
failed=R/'.build/mounted-intercept-native-1247/docs/evidence/native-2026-10-02-mounted-intercept-hook-failure'
|
|
shutil.copytree(failed,R/'docs/evidence'/failed.name)
|
|
for p in B.iterdir():
|
|
if p.is_file() and p.suffix in {'.json','.log','.py','.patch','.c'}:shutil.copyfile(p,E/p.name)
|
|
shutil.copytree(B/'initial-failures',E/'initial-failures')
|
|
for folder,label in [(Path('/tmp/erri-mounted-intercept-convoy-1247'),'convoy'),(Path('/tmp/erri-mounted-intercept-rules-1247'),'rules'),(Path('/tmp/erri-motorized-intercept-review'),'independent-dispatch')]:
|
|
out=E/label;out.mkdir()
|
|
for p in folder.iterdir():
|
|
if p.is_file() and p.suffix in {'.json','.log','.patch','.txt','.c','.py'}:shutil.copyfile(p,out/p.name)
|
|
patch=''
|
|
for n in sorted(inputs):
|
|
old=B/'before'/n;prior=old.read_text().splitlines(True) if old.exists() else []
|
|
patch+=''.join(difflib.unified_diff(prior,(R/n).read_text().splitlines(True),fromfile='a/'+n if old.exists() else '/dev/null',tofile='b/'+n))
|
|
(E/'final-implementation.patch').write_text(patch)
|
|
write(E/'source-after.json',current)
|
|
summary={'implemented':'One finite original armed UAZ escort can receive an HQ radio order to intercept a road ahead of delivered travel history, then rejoin its original convoy.','authored_files':len(current),'changed_authored_files':sorted(changed),'registered_regression_programs_passed':285,'normal_native':{'assertions':63,'completions':1,'script_failures':0,'engine_errors':13,'source_scope':'Exact final409 authored files, including explicit base extension hooks.'},'initial_failures_preserved':['Missing base declarations for two modded HQ hooks caused native compilation failure; corrected with explicit hooks/overrides.','New selector test defaulted to the infantry source unless environment override was set; default corrected and full suite rerun.'],'native_qualification':'failed; thirteen retained installed-resource errors','physical_interception_proven':False,'multiplayer_proven':False,'fps_improvement_proven':False,'package_refreshed':False,'existing_candidate_files_unchanged':len(pm),'original_reference_files_unchanged':len(original),'inherited_unstaged_paths':len(before['unstaged']),'inherited_overlap_paths':sorted(set(before['unstaged'])&allowed),'other_inherited_edits_unchanged':True,'cached_diff_unchanged':True,'committed':False,'published':False}
|
|
write(E/'review.json',summary)
|
|
shutil.copyfile(B/'mounted-interception.md',R/'docs/mounted-interception.md')
|
|
status=R/'docs/current-status.md';s=status.read_text();assert s.startswith('# Current development status\n')
|
|
checkpoint='''
|
|
**2 October 2026 — HQ motorized interception implemented in source:** one original armed UAZ convoy escort can receive a radio command to hold a road ahead of remembered player travel, then rejoin its convoy. Orders use delivered history and complete original-formation status, share force limits, expire on a fixed deadline and cannot spawn replacements or compete with logistics. [Behavior and limits](mounted-interception.md).
|
|
|
|
All **285 registered regression programs pass**. The [hidden/muted final-source normal escape](evidence/native-2026-10-02-mounted-intercept-normal/report.json) passes **63 assertions and one round**, with zero script/runtime failures and thirteen retained engine errors. The initial missing-hook compilation failure and test default-path failure are preserved with their fixes. [Implementation, review and preservation](evidence/mounted-interception-2026-10-02/review.json).
|
|
|
|
Native driving to the intercept, physical holding/rejoining and interception effectiveness remain unverified; the normal escape run proves compilation and base-loop integration only. Human play, real multiplayer, comparative FPS and clean release remain pending. The existing 416-file playtest package is unchanged and predates this increment. Original missions and inherited work are preserved; nothing was committed or published.
|
|
|
|
'''
|
|
status.write_text('# Current development status\n'+checkpoint+s[len('# Current development status\n'):])
|
|
for file,title,text in [('docs/ai-feature-migration.md','2 October: finite motorized interception','The earlier design-only motorized gap now has an independent source implementation for original UAZ escorts. Delivered track prediction, finite radio orders, exact physical ownership and column rejoining are integrated. BMP interception, roadblock props and native driving effectiveness are not qualified; this is not complete original roadblock parity. See [behavior and validation](mounted-interception.md).'),('docs/next-gameplay-increments.md','2 October: source implementation complete, native interception pending','The motorized-interception proposal is implemented for one existing armed UAZ escort, with 285 passing regressions and a 63-assertion final-source normal escape check. The next bounded check is actual radio delivery, movement, hold and rejoin with unchanged original vehicles and crew in the authorized hidden/muted environment. It needs no new permission request. The old playtest package still predates recovery/launcher and motorized-interception changes. Human play, multiplayer, launcher delivery and comparative performance remain open.')]:
|
|
p=R/file;p.write_text(p.read_text()+'\n## '+title+'\n\n'+text+'\n')
|
|
write(E/'documentation-after.json',{n:sha(R/n) for n in ['docs/current-status.md','docs/mounted-interception.md','docs/ai-feature-migration.md','docs/next-gameplay-increments.md']})
|
|
print(json.dumps(summary,indent=2))
|