{ "complete": true, "finding": "Confirmed owned behavior omission: EngineerMine.Begin and active Owned checks do not consult current group autonomous-position permission before forcing individual mine movement.", "owned_source": "EAI_HQRoadblocks.UpdateUnit checks utility.IsPositionAllowed(point) before mine task admission.", "native_semantics": { "method": "SCR_AIGroupUtilityComponent.IsPositionAllowed(vector pos):917", "defend": "Strict3D distance from current SCR_DefendWaypoint origin < completion radius", "other": "Strict3D distance from group center of mass < configured max autonomous distance", "not_proven": "This is neither path reachability, navmesh validity nor a general forbidden-zone database." }, "compatibility": "HQ.DeliverOrder selects native AIWaypoint_Defend.et for RoadIntercept and does not override its30m completionradius. Mine selector25\u201360m therefore has a viable25..<30m3D subset. Do not widen the native radius or infer all mines would be disabled.", "minimal_policy": "In Owned(), require current m_Group.GetGroupUtilityComponent() and IsPositionAllowed(m_Position). Begin already invokes Owned before shared item tombstone and movement; Tick invokes it before removal/placement and again before activation. Dynamic restriction/missing utility stops work, preserving original unarmed item/quarantine rules. No need to change force quotas, spawn, routes or radii.", "bounded_trigger": "Otherwise valid assigned road-intercept group on native30m defend waypoint; clear mine candidate50m away. Current Begin passes its25\u201360m check and issues individual move despite IsPositionAllowed=false. Source sequence established; no runtime compiler test performed by this reviewer.", "test_boundaries": [ "25m allowed, exactly30m refused with defaultdefend30", "XZ25m/Y20m refused because native check is3D", "nondefend current autonomous-distance boundary", "activeallowed\u2192forbidden or missingutility stops before next sideeffect", "late removal completion afterStop cannot arm or restart" ], "sdk_bindings": [ { "pak": "/home/jakub/.local/share/Steam/steamapps/common/Arma Reforger/addons/data/data007.pak", "path": "Prefabs/AI/Waypoints/AIWaypoint_Defend.et", "sha256": "af7fc17d89c30845acf0ef0fa5fedb47120072221c6157cd4ee691c121ae5d03", "local_same": true }, { "pak": "/home/jakub/.local/share/Steam/steamapps/common/Arma Reforger/addons/data/data007.pak", "path": "scripts/Game/AI/Components/SCR_AIGroupUtilityComponent.c", "sha256": "d808ed61832e55001f49a5be87b6117341ebfa12a972a839de8c5a8ecd6590eb", "local_same": true } ], "source_hashes": { "/home/jakub/devel/escapistsrereintroduced/addons/core/Scripts/Game/ERR/10_AI/ERR_EngineerMine.c": "e0098577626e719283cf4b40936e7ec038076c4bab9269fbad0b5ad3292e01e3", "/home/jakub/devel/escapistsrereintroduced/addons/core/Scripts/Game/ERR/10_AI/ERR_HQ.c": "5d66c53baf8762e76ae59e28721edaa348014af6d988d42891d9a84a6cf44969", "/home/jakub/devel/escapists/escapists-ai/Scripts/Game/EscapistsAI/EAI_HQRoadblocks.c": "128776f0b448162ee36cfc71b2a38d2cd06d6d6e4679253f215896aa3fcabb98" }, "scope": "Read-only owned/native/source inspection. No successor/original edits, compiler or native run. Author/tests coordinated separately.", "proposal_review": { "approved_source": true, "source": "/tmp/erri-base-review-0558/addons/core/Scripts/Game/ERR/10_AI/ERR_EngineerMine.c", "sha256": "fe05cb6e813155d76fd497788aa92c9dd8c7cf4ec43e017172a8a70e16c00b80", "patch": "/tmp/erri-base-review-0558/fix.patch", "patch_sha256": "692af3fbb9e3ea121cb53e7d9739be1a278215e8c89bfa501730d183bc9ff2d9", "delta": "Exactly current groupUtility lookup plus missing/disallowed refusal in Owned after player/logistics guards. Existing Begin/Tick/arming call paths apply it without additional changes.", "remaining_blockers": [], "testing": "Separate testauthor owns actual-method red/green. No compiler/native test by reviewer." } }