Capture current mission, AI, map and administration development

Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
This commit is contained in:
2026-10-13 22:52:53 +02:00
parent a951a96edc
commit 6a667d8deb
8104 changed files with 2124945 additions and 2061 deletions
@@ -0,0 +1,19 @@
check: /tmp/err-policy-6v79i6hp/check.cpp:92: int main(): Assertion `c.unit.PlayerCaptureObserved&&c.unit.Released' failed.
Traceback (most recent call last):
File "/tmp/erri-hunter-capture-2237/tests/test_hunter_capture.py", line 26, in <module>
run(r'''
~~~^^^^^
#include <cassert>
^^^^^^^^^^^^^^^^^^
...<63 lines>...
}
^
''')
^^^^
File "/home/jakub/devel/escapistsrereintroduced/tests/policy_harness.py", line 14, in run
subprocess.run([str(p/'check')],check=True)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.14/subprocess.py", line 578, in run
raise CalledProcessError(retcode, process.args,
output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['/tmp/err-policy-6v79i6hp/check']' died with <Signals.SIGABRT: 6>.
@@ -0,0 +1 @@
PASS: actual native seated-group arrival outside35m, native waypoint removal, idempotent advance, and convoy waypoint idempotence/arrival/deadline, missing/dead/captured/reparented crew refusal, failed native waypoint release, original vehicle/member preservation and no replacement
@@ -0,0 +1 @@
PASS: actual convoy/team Release retains original active survivors and HQ identity, rejects takeover/terminal/unknown roster, preserves exact logistics quarantine and normal eligibility
@@ -0,0 +1 @@
PASS: actual player-entry hook latches original hunter capture before native callbacks; both release layers cancel ownership without new entities/refund; bounded current-owner guards and prior-release policy
@@ -0,0 +1 @@
PASS: actual hunter release preserves survivors/HQ, releases driving ownership once, delegates capture/teardown, and excludes prison/patrol/mortar from generic objective defence
@@ -0,0 +1,86 @@
{
"complete": true,
"decision": "Exact integrated source and fresh complete suite/normal native evidence approved for bounded documentation/evidence finalization.",
"reviewed_source_test_hashes": {
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyService.c": "e503e3a2eeaff638dee7fac6830cfbac6b8d87402e1191ff65aaa9961d9e0b86",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HunterService.c": "79369d5cc30cf628f02df0023157ab423e40497325dfd6a73b218757f2b689d4",
"tests/test_hunter_lifecycle.py": "4d228ec10c3d5f02ecf0eb755ca2773e3496a2c25a1e1c355e6ec79ee2ef53b6",
"tests/test_convoy_survivors.py": "415cf9f5d23cce363e483d4bfd0292b58ab1fb3d9e727f9581271aa65c1c3109",
"tests/test_hunter_capture.py": "d88b3a830c350e27a08fe5977cf85247dff140b3dc9135062eb5e7774b400790"
},
"tools_check_sha256": "bf0b1bbb03ef309a959d760c9d0e454bb8d89fe78ded5177a2f029e0a888f884",
"registration_only_change": true,
"authored_files": 420,
"suite": {
"programs": 292,
"fresh": true,
"exit": 0,
"exact_registered_order": true,
"full_current_input_inventory_equal": true,
"seconds": 202.57,
"result_sha256": "b1c21e57f9de62cc45a4d512235e13c14ee6314a8c1544e381134f7d4cd8e125",
"inputs_sha256": "bad91666b83507a0855e4ac016faf2527c3a644c53115b522f4485d8e0eaae4a",
"log_sha256": "fa079f2058cccf32abb46a3add9f0caa60fe45f5d1dd945c13cb3f77b632a21a"
},
"normal": {
"assertions": 63,
"completions": 1,
"script_failures": 0,
"engine_errors": 13,
"raw_console_archive_exact": true,
"report_recomputed": true,
"source_current_launch_end_exact": true,
"cleanup_source_external_unchanged": true,
"console_sha256": "0c7fc98ebb0c107f7b40181cfa06bf7e7e9bff781f891550156491321a57f07f",
"launch_manifest_sha256": "a873c5ba9cd60fec00663260ec2c45a720e1d5bb5d7237172c86bccbaf0158e7"
},
"preservation": {
"baseline_paths": 10250,
"changed_existing_paths": [
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyService.c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HunterService.c",
"tests/test_convoy_survivors.py",
"tests/test_hunter_lifecycle.py",
"tools/check.py"
],
"only_added_test": "tests/test_hunter_capture.py",
"index_unchanged": true,
"index_diff_sha256": "670073db5d7531aca4466cc9d2827d10a46bfcfbd35f27ac97724de9d2fd3725",
"original533_unchanged": true,
"latest_candidate_files": 429,
"candidate_seal_sha256": "cadaec6b53fa5e01ec02025cabb5535d5b8bbed301bc13ed99b847881d0303da",
"latest_candidate_exact": true
},
"aborted_preintegration": {
"excluded_from_qualification": true,
"parent_reason": {
"integration_refused_before_write": "Root baseline adapter compared nested record with hash string; source unchanged. Correct comparison uses working field.",
"suite_aborted": true,
"exit": 130,
"reason": "Started inadvertently after refused integration; interrupted own tool session before applying source. No passing verification claimed."
},
"no_complete_suite_result": true,
"input_manifest_differs_from_final": true,
"sha256": {
"reason.json": "10e1eb07d7b6b4b0f33b18527125cd80a5bb45d87b5d26de93dbe6d13c01f8b9",
"suite-inputs.json": "82ddb56aa41dc1f1603f93818591e226943486b91e8d4d5692f1c864f7ac3230",
"regressions.log": "7bfeef72904cb4c895703bea42f5e9941f2c296c6accdd598e998030f97da73b"
}
},
"finalizer": {
"sha256": "565c5e254d45971d399fc06bae71828bc08b8d3353e8d597131a3b21319656c8",
"source_review_no_blocker": true,
"gates_current_suite_and_normal_hashes": true,
"preserves_aborted_attempt_and_latest_package": true,
"writes_current_status_only_plus_new_evidence_directory": true,
"no_native_capture_or_new_package_claim": true,
"executed_by_reviewer": false
},
"limits": [
"Fresh full suite and normal native prove modeled policy, compilation and ordinary-loop integration only. No native capture timing, multiplayer or FPS claim.",
"Existing convoy-survivors package intentionally predates this source fix; no package refresh performed.",
"Strict thirteen installed engine errors remain retained."
],
"reviewer_target_edits": false,
"reviewer_native_or_compiler_runs_for_integration": false
}
@@ -0,0 +1,19 @@
check: /tmp/err-policy-bbmnuzww/check.cpp:118: int main(): Assertion `c.hq.unregistered==1&&c.hq.retained==0&&c.hq.recoveries==0' failed.
Traceback (most recent call last):
File "/tmp/erri-hunter-capture-2237/tests/test_hunter_capture.py", line 26, in <module>
run(r'''
~~~^^^^^
#include <cassert>
^^^^^^^^^^^^^^^^^^
...<63 lines>...
}
^
''')
^^^^
File "/home/jakub/devel/escapistsrereintroduced/tests/policy_harness.py", line 14, in run
subprocess.run([str(p/'check')],check=True)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.14/subprocess.py", line 578, in run
raise CalledProcessError(retcode, process.args,
output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['/tmp/err-policy-bbmnuzww/check']' died with <Signals.SIGABRT: 6>.
@@ -0,0 +1,22 @@
{
"state": "Preliminary source review; final actual-method red/green pending author harness",
"no_blocker_found": true,
"reviewed_sha256": {
"/tmp/erri-hunter-capture-2237/addons/core/Scripts/Game/ERR/10_AI/ERR_HunterService.c": "79369d5cc30cf628f02df0023157ab423e40497325dfd6a73b218757f2b689d4",
"/tmp/erri-hunter-capture-2237/addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyService.c": "e503e3a2eeaff638dee7fac6830cfbac6b8d87402e1191ff65aaa9961d9e0b86",
"/tmp/erri-vanilla-stock/scripts/Game/Vehicle/SCR_CompartmentAccessComponent.c": "55fc213f5136080dac12e916bb20b3a11913d3e2830b05f9669ba2447965d837"
},
"findings": [
"SDK override argument names match exactly; GetOwner usage is native in same method. Native method invokes subscribed entry handlers before querying current character/player identity; calling bounded ownership latch before super protects event-time facts against reentrant exit/disconnect.",
"PlayerEntered requires authoritative server, active current mode, exact current HQ-owned service, canonical current actor, and exact original hunter root or bounded child ancestry. New or unrelated entities are not adopted.",
"PlayerCaptureObserved precedes Release; hunter clears downlink/stops recovery; base bypasses survivor retention despite later absent occupancy, releases own order/holds and unregisters HQ.",
"Already released original hunter is intentionally skipped: entry into its abandoned vehicle cannot revoke the former surviving crew independent infantry role.",
"No re-registration, initial stock/cargo modifications or replacement deployment introduced. Existing HQ unregister cancels tasks/detection; previously transmitted uplinks retain existing semantics."
],
"pending": [
"Actual method baseline red/proposal green including fast exit and base-retention mutation",
"Existing hunter and convoy survivor/lifecycle harness adapters"
],
"target_edits": false,
"native_runs": false
}
@@ -0,0 +1,38 @@
[
{
"case": "green",
"exit": 0,
"expected": 0,
"compiled_runtime_assertion": false
},
{
"case": "baseline",
"exit": 1,
"expected": 1,
"compiled_runtime_assertion": true
},
{
"case": "mutation",
"exit": 1,
"expected": 1,
"compiled_runtime_assertion": true
},
{
"case": "hunter-lifecycle",
"exit": 0,
"expected": 0,
"compiled_runtime_assertion": false
},
{
"case": "convoy-survivors",
"exit": 0,
"expected": 0,
"compiled_runtime_assertion": false
},
{
"case": "convoy-lifecycle",
"exit": 0,
"expected": 0,
"compiled_runtime_assertion": false
}
]
@@ -0,0 +1,69 @@
{
"complete": true,
"decision": "Approved bounded source proposal; no remaining source/test blocker found. Native event integration remains unqualified.",
"patch_sha256": "60e3a89f09f3db61e6e6f89756031015523dee824a5f17f46f8538c51c0689c7",
"reviewed_files": {
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyService.c": "e503e3a2eeaff638dee7fac6830cfbac6b8d87402e1191ff65aaa9961d9e0b86",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HunterService.c": "79369d5cc30cf628f02df0023157ab423e40497325dfd6a73b218757f2b689d4",
"tests/test_hunter_lifecycle.py": "4d228ec10c3d5f02ecf0eb755ca2773e3496a2c25a1e1c355e6ec79ee2ef53b6",
"tests/test_convoy_survivors.py": "415cf9f5d23cce363e483d4bfd0292b58ab1fb3d9e727f9581271aa65c1c3109",
"tests/test_hunter_capture.py": "d88b3a830c350e27a08fe5977cf85247dff140b3dc9135062eb5e7774b400790"
},
"sdk": {
"path": "/tmp/erri-vanilla-stock/scripts/Game/Vehicle/SCR_CompartmentAccessComponent.c",
"sha256": "55fc213f5136080dac12e916bb20b3a11913d3e2830b05f9669ba2447965d837",
"signature_line": 64,
"ordering": "native general subscribers invoked first at66-67; GetOwner accessed at70; hook signature matches production override"
},
"tests": [
{
"case": "green",
"exit": 0,
"expected": 0,
"compiled_runtime_assertion": false
},
{
"case": "baseline",
"exit": 1,
"expected": 1,
"compiled_runtime_assertion": true
},
{
"case": "mutation",
"exit": 1,
"expected": 1,
"compiled_runtime_assertion": true
},
{
"case": "hunter-lifecycle",
"exit": 0,
"expected": 0,
"compiled_runtime_assertion": false
},
{
"case": "convoy-survivors",
"exit": 0,
"expected": 0,
"compiled_runtime_assertion": false
},
{
"case": "convoy-lifecycle",
"exit": 0,
"expected": 0,
"compiled_runtime_assertion": false
}
],
"source_findings": [
"Exact current authoritative mode/HQ/service/canonical actor guards and bounded original hunter matching prevent unrelated adoption.",
"Entry latch is set before Recovery.Stop/Release and before native base callbacks; initial occupancy need not remain observable. Both hunter and base release honor latch, preventing inadvertent survivor retention.",
"Own downlink/waypoint/crew recovery stop, base interception/holds release, ledger unpin and HQ unregister remain idempotent. No re-registration/grant/replenishment or finite allowance reset occurs.",
"Normal noncapture survivor release is unchanged. Entering an already released abandoned vehicle intentionally cannot revoke its former crew independent infantry HQ role.",
"Native base event is always forwarded exactly once, including client/unrelated/refused paths. SDK signature and GetOwner match existing implementation."
],
"limits": [
"Actual methods run under native-boundary doubles. No live entry/exit replication or native capture success claimed.",
"Already transmitted HQ radio evidence may settle under existing network semantics; unregistering travel ownership is not evidence revocation."
],
"target_edits": false,
"native_runs": false
}
@@ -0,0 +1,25 @@
from pathlib import Path
import json,hashlib,ast,subprocess,sys
r=Path('/home/jakub/devel/escapistsrereintroduced');b=Path('/tmp/erri-gameplay-root-2237');p=Path('/tmp/erri-hunter-capture-2237');o=Path('/tmp/erri-hunter-capture-review-2237');e=r/'docs/evidence/native-2026-10-02-hunter-capture-normal'
sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest();load=lambda p:json.loads(p.read_text())
sys.dont_write_bytecode=True;sys.path.insert(0,str(r/'tools'));from source_manifest import addon_manifest;from native_report import analyze
proposal=load(p/'source-manifest.json');assert all(sha(r/n)==h for n,h in proposal['files'].items())
old=r/'.build/playtest-source-2026-10-02-convoy-survivors/tools/check.py';new=(r/'tools/check.py').read_text();assert new.replace("'test_hunter_capture.py', ",'')==old.read_text()
source=addon_manifest(r);assert source==load(e/'source-sha256.json')==load(e/'launch-source-sha256.json');suite=load(b/'suite-result.json');assert suite['exit']==0 and suite['inputs_unchanged'] and not suite.get('resumed')
constants=sorted((n for n in ast.walk(ast.parse(new)) if isinstance(n,ast.Constant) and isinstance(n.value,str) and n.value.endswith('.py') and (Path(n.value).name.startswith('test_') or n.value.endswith('_regression.py'))),key=lambda n:(n.lineno,n.col_offset));expected=['tests/'+Path(n.value).name for n in constants]
assert len(expected)==len(set(expected))==suite['regression_programs']==292;assert [x['path'] for x in suite['programs']]==expected;assert all(x['exit']==0 for x in suite['programs']);assert 'All repository checks passed.' in (b/'regressions.log').read_text()
inputs=dict(source)
for folder in ['tests','tools','terrain-profiles','terrain-adapters','terrain-integrations']:
inputs.update({str(q.relative_to(r)):sha(q) for q in (r/folder).rglob('*') if q.is_file() and '__pycache__' not in q.parts and q.suffix!='.pyc'})
inputs.update({str(q.relative_to(r)):sha(q) for q in (r/'docs').iterdir() if q.is_file()})
for n in ['README.md','.gitignore']:inputs[n]=sha(r/n)
assert inputs==load(b/'suite-inputs.json')
nr=load(e/'runner.json.txt');report=load(e/'report.json');assert report==analyze((e/'console.log.txt').read_text(),report['log']);assert sha(e/'console.log.txt')==nr['console_sha256'];assert sha(e/'launch-source-sha256.json')==nr['launch_source_sha256']==nr['end_source_sha256'];assert all(nr[k] for k in ['cleanup_confirmed','source_unchanged_after_run','external_addons_unchanged_after_run']);meta=load(e/'launch-source.json');assert nr['launch_id']==meta['launch_id'];raw=Path(nr['session']);assert (raw/'console.log').read_bytes()==(e/'console.log.txt').read_bytes()
baseline=load(b/'baseline.json');allowed={'tests/test_convoy_survivors.py','addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyService.c','addons/core/Scripts/Game/ERR/10_AI/ERR_HunterService.c','tests/test_hunter_lifecycle.py','tools/check.py'};changed={n for n,h in baseline['files'].items() if not (r/n).is_file() or sha(r/n)!=h};assert changed==allowed
index=hashlib.sha256(subprocess.check_output(['git','diff','--cached','--binary'],cwd=r)).hexdigest();assert index==baseline['index_diff_sha256']
original=load(Path('/tmp/erri-heartbeat-20260930-1542-reference.json'));assert len(original)==533;assert all(sha(Path('/home/jakub/devel/escapists')/n)==h for n,h in original.items())
root=r/'.build/playtest-2026-10-02-convoy-survivors';seal=r/'docs/evidence/playtest-refresh-2026-10-02-convoy-survivors/candidate-sha256.json';actual={str(q.relative_to(root)):sha(q) for q in root.rglob('*') if q.is_file()};assert actual==load(seal)
aborted=b/'aborted-preintegration-check';reason=load(aborted/'reason.json');assert reason['exit']==130 and reason['suite_aborted'];assert not (aborted/'suite-result.json').exists();before=load(aborted/'suite-inputs.json');assert before!=inputs;assert 'All repository checks passed.' not in (aborted/'regressions.log').read_text()
finalizer=b/'finish.py';ast.parse(finalizer.read_text())
d={'complete':True,'decision':'Exact integrated source and fresh complete suite/normal native evidence approved for bounded documentation/evidence finalization.','reviewed_source_test_hashes':proposal['files'],'tools_check_sha256':sha(r/'tools/check.py'),'registration_only_change':True,'authored_files':len(source),'suite':{'programs':292,'fresh':True,'exit':0,'exact_registered_order':True,'full_current_input_inventory_equal':True,'seconds':suite['seconds'],'result_sha256':sha(b/'suite-result.json'),'inputs_sha256':sha(b/'suite-inputs.json'),'log_sha256':sha(b/'regressions.log')},'normal':{'assertions':report['assertions_passed'],'completions':report['smoke_completions'],'script_failures':len(report['script_or_runtime_failures']),'engine_errors':len(report['engine_errors']),'raw_console_archive_exact':True,'report_recomputed':True,'source_current_launch_end_exact':True,'cleanup_source_external_unchanged':True,'console_sha256':nr['console_sha256'],'launch_manifest_sha256':nr['launch_source_sha256']},'preservation':{'baseline_paths':len(baseline['files']),'changed_existing_paths':sorted(changed),'only_added_test':'tests/test_hunter_capture.py','index_unchanged':True,'index_diff_sha256':index,'original533_unchanged':True,'latest_candidate_files':len(actual),'candidate_seal_sha256':sha(seal),'latest_candidate_exact':True},'aborted_preintegration':{'excluded_from_qualification':True,'parent_reason':reason,'no_complete_suite_result':True,'input_manifest_differs_from_final':True,'sha256':{q.name:sha(q) for q in aborted.iterdir() if q.is_file()}},'finalizer':{'sha256':sha(finalizer),'source_review_no_blocker':True,'gates_current_suite_and_normal_hashes':True,'preserves_aborted_attempt_and_latest_package':True,'writes_current_status_only_plus_new_evidence_directory':True,'no_native_capture_or_new_package_claim':True,'executed_by_reviewer':False},'limits':['Fresh full suite and normal native prove modeled policy, compilation and ordinary-loop integration only. No native capture timing, multiplayer or FPS claim.','Existing convoy-survivors package intentionally predates this source fix; no package refresh performed.','Strict thirteen installed engine errors remain retained.'],'reviewer_target_edits':False,'reviewer_native_or_compiler_runs_for_integration':False}
(o/'integration-review.json').write_text(json.dumps(d,indent=2)+'\n');print(json.dumps({'path':str(o/'integration-review.json'),'sha256':sha(o/'integration-review.json'),'normal':d['normal'],'preservation':d['preservation']},indent=2))