{ "problem": "Active original hunter entry capture was only sampled once per second. Current control/occupancy can disappear before next Tick; predecessor records entry event immediately.", "fix": "Server canonical current-player entry matches only active original tracked hunter roots with existing bounded32 ancestry and15 record cap. Latch precedes Release/native callbacks. Hunter clears Downlink/stops Recovery; base rejects survivor retention even if live occupancy absent. Physical entities, finite allowance and registered original identifiers preserved.", "scope": "Already Released hunter ignored: abandoned asset entry does not revoke independently retained former infantry. No helicopter, supply-convoy event dispatch, spawn/refill/deletion/refund, or replay of registration. Polling fallback unchanged.", "tests": { "test_hunter_capture.py": 0, "test_hunter_lifecycle.py": 0, "test_convoy_survivors.py": 0, "test_convoy_lifecycle.py": 0 }, "baseline": "red.log: actual baseline compiles then fails capture latch/released assertion; baseline-adapter-unused.log retained separate rejected compiler-only control.", "mutation": "mutation.log: removing base !PlayerCaptureObserved guard compiles then fails unregister-vs-retain assertion with live occupancy unavailable.", "limits": "Offline actual-method boundary doubles, not native multiplayer callback timing or ordinary input qualification. SDK callback is supported; root owns native validation.", "registration_needed": "tests/test_hunter_capture.py only; parent owns tools/check.py", "changed_files": [ "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", "tests/test_convoy_survivors.py", "tests/test_hunter_capture.py" ], "source_unchanged": true }