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:
@@ -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))
|
||||
Reference in New Issue
Block a user