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,21 @@
# Inventory injury display compatibility correction
The observed installed client reported seven `UpdateHitZoneState` argument errors after opening inventory. The retained excerpt contains only the inventory and error records. The SDK damage-state invoker supplies one argument, while the stock widget subscribes a callback whose second boolean default is not supplied by ScriptInvoker.
The successor now substitutes a one-argument callback in its mission only, forwarding explicitly to the existing native update with attachment refresh enabled. Native initialization and its batching flag stay unchanged. Owned subscriptions are removed on reinitialization, detach and destruction; callbacks from an old mode are inert. No health, damage or treatment behavior is changed. The independent review binds the exact source/test/patch hashes and confirms blood cannot also enter the character-hitzone registration branch.
## Validation and limits
The actual-method focused regression passes; its unadapted baseline compiles and fails at the missing-boolean boundary. The initializer and invoker are test doubles, not native UI proof. The source bundle preview passes. The new test is registered as the 308th program.
The full suite passed 134 programs before the 135th, offline external packaging, failed with `Disk quota exceeded` in shared `/tmp`. Inputs remained unchanged. An outside-sandbox retry also failed; moving temporary files to a disk-backed scratch directory allowed most cases to run but correctly violated the existing requirement that synthetic compat prefixes reside under `/tmp` (three errors and one assertion failure). No guards were relaxed and no other task's temporary files were deleted. A complete 308-program pass is **not** claimed. The actual new adapter regression separately passes using disk-backed disposable compiler files.
[Native compilation and BMP check](../native-2026-10-03-bmp-ui-callback/report.json) loaded the unchanged current addon and completed 48 assertions before two explicit BMP fixture failures. It compiled this compatibility class but did not open or exercise the inventory injury widgets. Runtime callback delivery, rendered medical UI and multiplayer remain unverified. A bounded next-check plan is retained, not implemented or executed.
## Separate native BMP finding
The original slot-4 BMP is now actually reached. Its snapshot is numerically valid but incomplete: 288 rounds, capacity 290, two chambered rounds; `Armament_Empty.et` fails `mount-item-slot-mismatch`. The log cannot distinguish a missing inventory item from a missing or different parent slot. Completeness and custody guards remain unchanged. Radio proof is not reached. The failed run retains all 15 error entries: two fixture failures and 13 previously known resource/engine entries. It confirms unchanged source/dependency inputs and hidden, muted cleanup.
## Preservation
All 533 tracked original reference files, the five sealed development candidates, the staged diff and the installed successor runtime are unchanged. Only the new adapter, regression and test registration change executable inputs. The observed installed PAK differed from the pre-fix source in two Workbench diagnostics; it now also lacks this new adapter. The current installed package has **not** been patched or republished. No manual escape, multiplayer, physical BMP support, performance or clean-release qualification is added by this checkpoint.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,45 @@
{
"source_log": "/home/jakub/.local/share/Steam/steamapps/compatdata/1874880/pfx/drive_c/users/steamuser/Documents/My Games/ArmaReforger/logs/logs_2026-10-03_20-58-12/console.log",
"captured_utc": "2026-10-03T20:24:07.305228+00:00",
"observed_prefix_bytes": 572991,
"observed_prefix_sha256": "4f2471d3b1c4dea6e2cc9493e3b3b8e38acd12c5a3835b13763eee13ced4e279",
"records": [
{
"line": 3901,
"text": "22:07:56.859 GUI : Creating menu 'Inventory20Menu'"
},
{
"line": 3902,
"text": "22:07:56.859 GUI : WidgetManager: CrateWidgets @\"{981ACF4F45EAECAE}UI/layouts/Menus/Inventory/InventoryMain.layout\""
},
{
"line": 3907,
"text": "22:08:02.028 SCRIPT (E): ScriptInvoker::Invoke: Incompatible parameter '1', expected 'bool', got 'void' (method 'UpdateHitZoneState')"
},
{
"line": 3908,
"text": "22:08:02.028 SCRIPT (E): ScriptInvoker::Invoke: Incompatible parameter '1', expected 'bool', got 'void' (method 'UpdateHitZoneState')"
},
{
"line": 3909,
"text": "22:08:02.028 SCRIPT (E): ScriptInvoker::Invoke: Incompatible parameter '1', expected 'bool', got 'void' (method 'UpdateHitZoneState')"
},
{
"line": 3910,
"text": "22:08:02.028 SCRIPT (E): ScriptInvoker::Invoke: Incompatible parameter '1', expected 'bool', got 'void' (method 'UpdateHitZoneState')"
},
{
"line": 3911,
"text": "22:08:02.028 SCRIPT (E): ScriptInvoker::Invoke: Incompatible parameter '1', expected 'bool', got 'void' (method 'UpdateHitZoneState')"
},
{
"line": 3912,
"text": "22:08:02.028 SCRIPT (E): ScriptInvoker::Invoke: Incompatible parameter '1', expected 'bool', got 'void' (method 'UpdateHitZoneState')"
},
{
"line": 3913,
"text": "22:08:02.028 SCRIPT (E): ScriptInvoker::Invoke: Incompatible parameter '1', expected 'bool', got 'void' (method 'UpdateHitZoneState')"
}
],
"scope": "Read-only live client log excerpt; no input/process/session changes. Seven matching invoker errors after inventory open; no claim that the installed runtime equals current development source."
}
@@ -0,0 +1,26 @@
{
"baseline.json": "0b6e21b54717263e233f42303ae4bde82585036e4755a54d4f249c7b7c075315",
"client-error-excerpt.json": "b73e26c0188e8a5a80acae7c83ef8e4e2b5de8dbb8e99ecbdeb25c00d28ea582",
"installed-source-observation.json": "c1b439f618722e321fc3a905d16a100bc4ba4f39b17a0c8734a453c8bbbf749b",
"installed-preservation.json": "00d43b09720af162cb42ca2cfea569a878314e3ae31e808694568742862c798d",
"sdk-contract.json": "bc77a7b4482f3e0ca0ce445d2afa7759bc9d2e90e75930e07ac54f0affa8a35f",
"source-bundle-preview.json": "d99554c9d08195e3dccdff7882529499f5867080eed382a94c405c28a5139bf8",
"suite.log": "2558306359168f634cbf9cca163bec82defa7f75f8718826685f81451e47d92d",
"suite-result.json": "c654dfbb6ba6724b6eca94d6bd6de728f80e39b4ce0a922020d19df2479511a9",
"suite-inputs.json": "dec9fa4e558b5b328696bc661be1f8eab5efbda70ab7d5eecf668619bd32e127",
"quota-recheck.log": "41e264979f0f94aac3f3b3fa48f55e991600e75733e9376fc90aee0e74f400bc",
"proposal-fix.patch": "fff4e6cdf72b13dcd82cfb819ae3edf9abdb709c7b9b1bfd7b6b43a8b93c53c2",
"proposal-source-manifest.json": "ad0824a453f10d2856fa6afc3e86ec27ec455b55028ed33fc72297cd0986c124",
"proposal-review.json": "9ed09dfef1f6dcf1dafdab1d543c8595720eb074b9fb68e1546949f8b3c6f1e0",
"proposal-green.log": "2d1e9eee33bf9f7b837eabba67b5b4928882f00de9007188c08349653339ed4e",
"proposal-red.log": "e9a0eedbc9d6a52ffc49a66a378194d949744b2c1a225b8b8d16b084475b83d5",
"focused-live.log": "2d1e9eee33bf9f7b837eabba67b5b4928882f00de9007188c08349653339ed4e",
"independent-review.json": "7b4daa2d7fbdf7765830cce542347b704be5aadf308cc324e1497fdd5aa2c0f3",
"next-native-ui-check.json": "50f3a345abec210441d5939910d1857ea91dcc13c13ff105683d61905e7c0f18",
"registered-check.py": "9306f03fc01f2d6f5a13762739c8cf4a0301d2da19f562ae297e6f67f4448c57",
"preservation.json": "3ebf5e70ede199542c91489a77351157e619f53006113eb42e4eb417abdff62a",
"README.md": "cae34364a36057740d067189a1397243d2e38961e03e5077095b2418b3a56653",
"post-suite-doc-delta.json": "9223eb5fcb05c7629abcf6c5b84c11049cc8026a87e2a8924b98bddd267075bc",
"source/tests/test_inventory_hitzone_compat.py": "bffa64c645a4282a1ed1ce244a9a2de37f20a70c60e8ff5b1544b7289c12c877",
"source/addons/core/Scripts/Game/ERR/00_Core/ERR_InventoryHitZoneCompat.c": "23c34f901311dce63a79aafe83c11e2fc25bd3fddb0cde38bd313eb90878ca90"
}
@@ -0,0 +1 @@
PASS: actual one-argument adapter, explicit refresh, native initialization flag, duplicate/blood ownership, rebind/detach/destruction and foreign-mode transparency
@@ -0,0 +1,32 @@
{
"complete": true,
"approved": true,
"concrete_blockers": [],
"read_only_review": true,
"manifest_sha256": "ad0824a453f10d2856fa6afc3e86ec27ec455b55028ed33fc72297cd0986c124",
"patch_sha256": "fff4e6cdf72b13dcd82cfb819ae3edf9abdb709c7b9b1bfd7b6b43a8b93c53c2",
"files": {
"addons/core/Scripts/Game/ERR/00_Core/ERR_InventoryHitZoneCompat.c": "23c34f901311dce63a79aafe83c11e2fc25bd3fddb0cde38bd313eb90878ca90",
"tests/test_inventory_hitzone_compat.py": "bffa64c645a4282a1ed1ce244a9a2de37f20a70c60e8ff5b1544b7289c12c877"
},
"logs": {
"red.log": "e9a0eedbc9d6a52ffc49a66a378194d949744b2c1a225b8b8d16b084475b83d5",
"green.log": "2d1e9eee33bf9f7b837eabba67b5b4928882f00de9007188c08349653339ed4e"
},
"sdk_sources": {
"/tmp/erri-vanilla-stock/scripts/Game/HitZone/SCR_HitZone.c": "d622f0e7ee5727a2430aa10e78bf37c623a12b229bfcef098e0c385451adb612",
"/tmp/erri-vanilla-stock/scripts/Game/HitZone/SCR_CharacterHitZone.c": "b2be31418129fa536c55bebef21ccc9b8ac409d1ce8b3ecb11df0787b33ba47e",
"/tmp/erri-vanilla-stock/scripts/Game/UI/Inventory/SCR_InventoryHitZonePointUI.c": "0ffc7359e76a6de03669dc2e631682ec9b107048d829794ab61512dbdb209b02",
"/tmp/erri-vanilla-stock/scripts/Game/UI/Inventory/SCR_InventoryMenuUI.c": "717649eaa9a0f39c093e2526c56a17b08d7e63d913d12f41a889497d0d514099"
},
"previous_review_source_matches": true,
"callback_contract": "SDK SCR_HitZone invokes damage-state listeners with this only. Adapter accepts one SCR_HitZone and calls native UpdateHitZoneState(hz,true), preserving original direct initializer arguments and native superclass initialization.",
"duplicate_blood_assessment": "No blood/group duplicate registration path: SCR_CharacterBloodHitZone extends SCR_RegeneratingHitZone directly (line429), whereas SCR_CharacterHitZone separately extends SCR_RegeneratingHitZone (line170). The native group registration loop casts to SCR_CharacterHitZone, excluding blood. Separate blood binding and same cast therefore match actual native registration sources. No concrete leftover native subscription demonstrated.",
"lifecycle": "Replacement removes the original two-argument callback for each retained source; adapter bindings are deduplicated and removed before reinitialization, on detach, and on destruction. Captured mode identity and retained-source membership reject callbacks after clear or mission replacement. Nonmission initialization keeps native behavior.",
"test_review": "Read exact full actual-method adapter harness and retained compiled baseline runtime-failure/proposal pass logs; no tests rerun. Covers explicit bool forwarding, original false initialization flag, source replacement, shared widget ownership, blood/group casting, reinit, detach/destructor and captured late callbacks.",
"limits": [
"The native initializer, ScriptInvoker registration/removal/dispatch and UI are doubled; no engine execution or rendered inventory proof.",
"The test double deduplicates Insert and removes all matching callbacks. Arbitrary duplicate native registrations/removal semantics are not independently proven by this harness; actual blood inheritance resolves the specific suspected duplicate path.",
"No claim to fix separate tourniquet, damage-effect or other native inventory listener cleanup."
]
}
@@ -0,0 +1,8 @@
{
"unchanged": true,
"files": {
"addon.gproj": "73e973a1f1c5910393e16f86a3a40d792031bb2fa3fc7f4dd87a06a16c3e34a4",
"data.pak": "43fdaada75a7e4cc5916040b07e8385f5532513fbaf349efba26d70dbd587b27",
"resourceDatabase.rdb": "06cb9d25394b496281748b609bef1cab81eebb1025c5a8db61e4a90bc9518c74"
}
}
@@ -0,0 +1,19 @@
{
"runtime_files": {
"addon.gproj": "73e973a1f1c5910393e16f86a3a40d792031bb2fa3fc7f4dd87a06a16c3e34a4",
"data.pak": "43fdaada75a7e4cc5916040b07e8385f5532513fbaf349efba26d70dbd587b27",
"resourceDatabase.rdb": "06cb9d25394b496281748b609bef1cab81eebb1025c5a8db61e4a90bc9518c74"
},
"installed_payloads": 376,
"source_deltas": {
"Scripts/Game/ERR/40_Chat/ERR_NativeMountedAmmoProbe.c": {
"installed": "8d197f7a1398625e5a19db3284b0bf72c6ee6e032843a3e4d9a4e58de42b6825",
"current": "7ddb634444c79ad9291d53a754dc0ed383342e36720ddaa4b7aa4bd4e7ee656d"
},
"Scripts/Game/ERR/40_Chat/ERR_NativeSmoke.c": {
"installed": "e2a32dbe372edc2f5cd03a55dcb3dd11689ad8b60940a7a318b0c829d464d3e2",
"current": "b7e1857b0678b3a2c71880c0f35b09da9e978f19bacf5b4e7449c893fdbe2b95"
}
},
"identity_caveat": "Observed installed source is not the current tested candidate; this is diagnostic evidence, not multiplayer or exact-source acceptance."
}
@@ -0,0 +1,31 @@
{
"verdict": "Feasible bounded native callback/UI integration without desktop input or health mutation; not implemented or launched.",
"suggested_fixture": "One explicit WORKBENCH-only inventory-hitzone selector in the existing Core base-smoke lifecycle, after canonical local conscious admission, with a fixed 30-second deadline and ordinary terminal cleanup.",
"steps": [
"Pin current ERR_GameMode, local controller and original roster actor; require its conscious native character, damage manager and inventory manager. Refuse an already-open menu so no user/foreign menu is adopted.",
"Call the actor's SCR_InventoryStorageManagerComponent.OpenInventory() once. Find and retain the exact SCR_InventoryMenuUI from Inventory20Menu, current actor and root identity. This uses native inventory access/life guards and ordinary opening behavior.",
"After native inventory/storage preview readiness, call existing public menu.InspectItem(null) once. This requests ordinary character inspection and invokes native InitializeAllHitZonesUI/InitHitZones; wait for all seven points because native initialization spans frames. Do not copy or invoke individual initializer bodies manually.",
"Expose bounded WORKBENCH-only read access to the native menu's m_aHitZonePoints and owning player; retain its exact seven original containers and the real blood hitzone. Require each adapter's captured mode and sources include that same blood hitzone. No replacement points or synthetic hitzones.",
"Add narrow WORKBENCH counters on the exact containers: override protected UpdateHitZoneState(SCR_HitZone hz, bool updateAttachmentStorage=true), call super exactly once and count only the watched real blood hitzone and refresh value after returning. Arm observation only after initialization, so initial direct calls are excluded.",
"Emit the real blood.GetOnDamageStateChanged(false).Invoke(blood) with exactly one argument. Require every pinned original container's native update counter increases exactly once and receives true; preserve a before/after blood health snapshot. This directly exercises installed ScriptInvoker argument dispatch and the successor wrapper into existing native UI behavior, without injury/treatment simulation.",
"Request CloseMenu(exactOwnedMenu) once; await native menu disappearance/root detachment instead of assuming synchronous close. Retain original point references only for the bounded check. Invoke the same original blood event after close and require old update counters unchanged, demonstrating automatic detach cleanup rather than calling adapter cleanup directly.",
"Optionally one reopen within the same fixed deadline proves seven fresh containers and one update each, while retained old containers stay unchanged. Close only the exact newly owned menu. Complete through existing smoke lifecycle; stop removes probe counters/references and closes only its own still-current menu. No retries or world manipulation."
],
"source_basis": [
"SDK SCR_InventoryStorageManagerComponent.OpenInventory: access and ALIVE guards, native Inventory20Menu open, inventory-open invoker and weapon state handling.",
"SDK SCR_InventoryMenuUI.InspectItem(null): existing public character inspection path, InitializeAllHitZonesUI spreads InitHitZones(true) across frames until CHARACTER_HITZONES_COUNT.",
"SDK SCR_InventoryMenuUI.InitHitZones: actual stock layout and InitializeHitZoneUI with batch refresh flag; no stock implementation copy needed.",
"SDK SCR_HitZone.OnDamageStateChanged: invokes m_OnDamageStateChanged.Invoke(this), exactly matching proposed synthetic notification argument count.",
"Existing ERR_NativeItemStationTeardownProbe.EmitNativeCallbacks already directly invokes real hitzone invokers as a labelled native lifecycle test.",
"Existing ERR_NativeObjectiveMapProbe retains exact owned menu and awaits asynchronous native closure; reuse that ownership pattern."
],
"limits": [
"This proves native one-argument event delivery to actual native inventory widgets and cleanup. It does not prove natural injury creation, treatment efficacy, health policy, manual navigation, visual readability, remote multiplayer or FPS.",
"The deliberate invoker notification is not a naturally occurring damage-state transition; document it explicitly.",
"A hidden native window can instantiate UI but does not by itself prove rendered appearance. No screenshot claim without owned-window UI-inclusive capture.",
"Existing vanilla menu tourniquet/DOT subscriptions and unrelated UI lifecycle errors remain visible; never suppress script errors to pass the probe.",
"Native GUI/storage readiness is asynchronous. If native inspection cannot initialize within the fixed deadline, retain failure rather than constructing substitute widgets or changing UI implementation."
],
"production_changes_required": false,
"live_writes_or_native_execution": false
}
@@ -0,0 +1,6 @@
{
"docs/current-status.md": {
"before": "570ead864b4f36e620493fe206880863e5a810a23c3d6c36f0f802709660ca2c",
"after": "ef6ffdfb7c888772e9ea2502cf95c21276f2e101e7641d5184f0de36630d4f82"
}
}
@@ -0,0 +1,48 @@
{
"complete": true,
"original": {
"missing": [],
"changed": [],
"count": 533,
"unexpected": [],
"manifest_sha256": "661c5ddf080c4ba8d4463aa4907f739d4d96acaa8694ac8d6f3d85bb94231226"
},
"candidates": {
"crash-start": {
"missing": [],
"changed": [],
"count": 446,
"unexpected": [],
"manifest_sha256": "8a594a8e340694efaf9874834c05713a40a6d223bbc08491fb42ae84bcce625f"
},
"depot-mines": {
"missing": [],
"changed": [],
"count": 432,
"unexpected": [],
"manifest_sha256": "c91acda173e2914fea59fd3e264a451158ee21d85918fe1ec5c8312dd46f7074"
},
"ground-supply": {
"missing": [],
"changed": [],
"count": 432,
"unexpected": [],
"manifest_sha256": "0b58fde4127486894917db58ce92b684f984233b341317418e336b1740cac107"
},
"mine-safety": {
"missing": [],
"changed": [],
"count": 431,
"unexpected": [],
"manifest_sha256": "202fa0854cf60a6c08ace1f22b276d826abcb538c79b6e052b48e5e51f458a87"
},
"mounted-pair": {
"missing": [],
"changed": [],
"count": 429,
"unexpected": [],
"manifest_sha256": "9fee715f8c9c324c465387ba1f88744c9c3748cb49668ce65e9c9500a38b14d7"
}
},
"staged_diff_sha256": "670073db5d7531aca4466cc9d2827d10a46bfcfbd35f27ac97724de9d2fd3725"
}
@@ -0,0 +1,137 @@
--- /dev/null
+++ b/addons/core/Scripts/Game/ERR/00_Core/ERR_InventoryHitZoneCompat.c
@@ -0,0 +1,49 @@
+// Vanilla damage-state invokers supply one argument. Preserve the native UI
+// update while supplying its optional attachment-refresh argument explicitly.
+modded class SCR_InventoryHitZonePointContainerUI
+{
+ protected ERR_GameMode m_ERRHitZoneMode;
+ protected ref array<SCR_HitZone> m_ERRHitZoneSources = {};
+
+ override void InitializeHitZoneUI(BaseInventoryStorageComponent storage, SCR_InventoryMenuUI menuManager, int hitZoneId, IEntity player, bool updateAttachmentStorage = true)
+ {
+ ERR_ClearHitZoneCallbacks();
+ super.InitializeHitZoneUI(storage, menuManager, hitZoneId, player, updateAttachmentStorage);
+ m_ERRHitZoneMode = ERR_GameMode.Get();
+ if (!m_ERRHitZoneMode) return;
+ ERR_BindHitZoneCallback(m_pBloodHitZone);
+ foreach (HitZone hz : m_aGroupHitZones)
+ ERR_BindHitZoneCallback(SCR_CharacterHitZone.Cast(hz));
+ }
+ protected void ERR_BindHitZoneCallback(SCR_HitZone hz)
+ {
+ if (!hz || m_ERRHitZoneSources.Contains(hz)) return;
+ ScriptInvoker changed = hz.GetOnDamageStateChanged(false);
+ if (!changed) return;
+ changed.Remove(UpdateHitZoneState);
+ changed.Insert(ERR_HitZoneStateChanged);
+ m_ERRHitZoneSources.Insert(hz);
+ }
+ protected void ERR_HitZoneStateChanged(SCR_HitZone hz)
+ {
+ if (!m_ERRHitZoneMode || m_ERRHitZoneMode != ERR_GameMode.Get() || !m_ERRHitZoneSources.Contains(hz)) return;
+ UpdateHitZoneState(hz, true);
+ }
+ protected void ERR_ClearHitZoneCallbacks()
+ {
+ m_ERRHitZoneMode = null;
+ foreach (SCR_HitZone hz : m_ERRHitZoneSources)
+ {
+ if (!hz) continue;
+ ScriptInvoker changed = hz.GetOnDamageStateChanged(false);
+ if (changed) changed.Remove(ERR_HitZoneStateChanged);
+ }
+ m_ERRHitZoneSources.Clear();
+ }
+ override void HandlerDeattached(Widget w)
+ {
+ ERR_ClearHitZoneCallbacks();
+ super.HandlerDeattached(w);
+ }
+ void ~SCR_InventoryHitZonePointContainerUI() { ERR_ClearHitZoneCallbacks(); }
+}
--- /dev/null
+++ b/tests/test_inventory_hitzone_compat.py
@@ -0,0 +1,82 @@
+"""Actual successor adapter methods; native UI/invoker boundaries are doubled.
+
+The invoker models the SDK's one supplied argument and rejects a two-argument
+subscription. It does not claim rendered medical UI or Enforce execution.
+"""
+import os
+from pathlib import Path
+from policy_harness import ROOT, body, run
+source=Path(os.environ.get('ERR_HITZONE_COMPAT_SOURCE',ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_InventoryHitZoneCompat.c'))
+signatures=['override void InitializeHitZoneUI(', 'protected void ERR_BindHitZoneCallback(', 'protected void ERR_HitZoneStateChanged(', 'protected void ERR_ClearHitZoneCallbacks(', 'override void HandlerDeattached(', 'void ~SCR_InventoryHitZonePointContainerUI(']
+def cpp(s):
+ for a,b in [('override ',''),('protected ',''),('super.','Native::'),('ERR_GameMode.Get()','Mode::Get()'),('SCR_CharacterHitZone.Cast(hz)','Character::Cast(hz)'),('BaseInventoryStorageComponent storage','int storage'),('SCR_InventoryMenuUI menuManager','int menuManager'),('IEntity player','Player* player'),('Widget w','int w'),('SCR_HitZone hz','Zone* hz'),('HitZone hz','Zone* hz'),('ScriptInvoker changed','Invoker* changed'),('hz.','hz->'),('changed.','changed->'),('foreach (','for ('),('null','nullptr'),('void ~SCR_InventoryHitZonePointContainerUI()','void Destroy()')]:s=s.replace(a,b)
+ s=s.replace('changed->Remove(UpdateHitZoneState)','changed->Remove(this, 1)').replace('changed->Remove(ERR_HitZoneStateChanged)','changed->Remove(this, 2)')
+ s=s.replace('changed->Insert(ERR_HitZoneStateChanged)','changed->Insert(this, 2, [this](Zone* z){ ERR_HitZoneStateChanged(z); })')
+ return s
+methods='\n'.join(cpp(body(source,sig)) for sig in signatures)
+if os.environ.get('ERR_HITZONE_COMPAT_BASELINE')=='1':
+ methods='void Destroy(){}' # Installed native initializer/subscription without the new adapter.
+run(r'''
+#include <cassert>
+#include <algorithm>
+#include <functional>
+#include <vector>
+struct Zone;
+struct Invoker {
+ struct Entry{void* owner;int kind;std::function<void(Zone*)> callback;};
+ std::vector<Entry> entries;int errors=0;
+ void Remove(void* o,int k){entries.erase(std::remove_if(entries.begin(),entries.end(),[&](Entry e){return e.owner==o&&e.kind==k;}),entries.end());}
+ void Insert(void* o,int k,std::function<void(Zone*)> cb={}){Remove(o,k);entries.push_back({o,k,cb});}
+ void Invoke(Zone*z){auto snapshot=entries;for(auto&e:snapshot){if(e.kind==1)errors++;else e.callback(z);}}
+ int Count(void*o){return std::count_if(entries.begin(),entries.end(),[&](Entry e){return e.owner==o;});}
+};
+struct Zone{Invoker inv;bool character=true,hasInvoker=true;Invoker*GetOnDamageStateChanged(bool create=true){assert(!create);return hasInvoker?&inv:nullptr;}};
+struct Character{static Zone*Cast(Zone*z){return z&&z->character?z:nullptr;}};
+template<class T>struct Array:std::vector<T>{using std::vector<T>::vector;bool Contains(T t){return std::find(this->begin(),this->end(),t)!=this->end();}void Insert(T t){this->push_back(t);}void Clear(){this->clear();}};
+struct Mode{static inline Mode*current=nullptr;static Mode*Get(){return current;}};
+struct Player{Zone*blood;Array<Zone*>zones;};
+struct Native {
+ Zone*m_pBloodHitZone=nullptr;Array<Zone*>m_aGroupHitZones;
+ int init=0,detach=0,updates=0;bool lastRefresh=false;Zone*last=nullptr;Player*lastPlayer=nullptr;
+ void UpdateHitZoneState(Zone*z,bool refresh=true){updates++;lastRefresh=refresh;last=z;}
+ void InitializeHitZoneUI(int storage,int menuManager,int hitZoneId,Player*player,bool refresh=true){
+ assert(storage==11&&menuManager==22&&hitZoneId==3);init++;lastPlayer=player;
+ m_pBloodHitZone=player->blood;m_aGroupHitZones=player->zones;
+ if(m_pBloodHitZone){m_pBloodHitZone->inv.Insert(this,1);UpdateHitZoneState(m_pBloodHitZone,refresh);}
+ for(auto*z:m_aGroupHitZones)if(Character::Cast(z)){z->inv.Insert(this,1);UpdateHitZoneState(z,refresh);}
+ }
+ void HandlerDeattached(int w){assert(w==7);detach++;}
+};
+struct Adapter:Native {
+ Mode*m_ERRHitZoneMode=nullptr;Array<Zone*>m_ERRHitZoneSources;
+METHODS
+};
+int main(){
+ Mode mode,next;Mode::current=&mode;Zone blood,limb,ignored;blood.character=false;ignored.character=false;
+ Player player{&blood,{&blood,&limb,&limb,&ignored,nullptr}};
+ Adapter a;a.InitializeHitZoneUI(11,22,3,&player,false);
+ assert(a.init==1&&a.lastPlayer==&player&&!a.lastRefresh); // Direct native initialization keeps false.
+ int before=a.updates;blood.inv.Invoke(&blood);limb.inv.Invoke(&limb);
+ assert(blood.inv.errors==0&&limb.inv.errors==0); // Baseline fails here after compiling.
+ assert(a.updates==before+2&&a.lastRefresh&&a.last==&limb);
+ assert(blood.inv.Count(&a)==1&&limb.inv.Count(&a)==1&&ignored.inv.Count(&a)==0);
+ a.InitializeHitZoneUI(11,22,3,&player,true);before=a.updates;blood.inv.Invoke(&blood);assert(a.updates==before+1&&blood.inv.Count(&a)==1);
+ // Each widget owns only its callbacks, even on the shared blood invoker.
+ Adapter other;other.InitializeHitZoneUI(11,22,3,&player,false);a.HandlerDeattached(7);before=other.updates;
+ blood.inv.Invoke(&blood);assert(a.detach==1&&blood.inv.Count(&a)==0&&other.updates==before+1);
+ // Current mode loss/replacement makes retained callbacks inert; cleanup still works.
+ before=other.updates;Mode::current=nullptr;blood.inv.Invoke(&blood);Mode::current=&next;limb.inv.Invoke(&limb);assert(other.updates==before);
+ auto late=limb.inv.entries.back().callback;other.Destroy();assert(blood.inv.Count(&other)==0&&limb.inv.Count(&other)==0);
+ Mode::current=&mode;late(&limb);assert(other.updates==before);
+ // Reinitialize in a non-successor mode: remove old wrappers, preserve native setup.
+ Mode::current=&mode;Adapter reuse;reuse.InitializeHitZoneUI(11,22,3,&player,false);
+ Zone b2,l2;b2.character=false;Player p2{&b2,{&l2}};Mode::current=nullptr;
+ reuse.InitializeHitZoneUI(11,22,3,&p2,false);assert(reuse.init==2&&!reuse.lastRefresh);
+ assert(blood.inv.Count(&reuse)==0&&limb.inv.Count(&reuse)==0);
+ b2.inv.Invoke(&b2);assert(b2.inv.errors==1); // Foreign native behavior untouched.
+ // Empty/invalid group entries are not adopted; repeated cleanup is harmless.
+ Mode::current=&mode;Adapter empty;Player missing{nullptr,{nullptr,&ignored}};empty.InitializeHitZoneUI(11,22,3,&missing,false);
+ empty.Destroy();empty.Destroy();assert(ignored.inv.Count(&empty)==0);
+}
+'''.replace('METHODS',methods))
+print('PASS: actual one-argument adapter, explicit refresh, native initialization flag, duplicate/blood ownership, rebind/detach/destruction and foreign-mode transparency')
@@ -0,0 +1 @@
PASS: actual one-argument adapter, explicit refresh, native initialization flag, duplicate/blood ownership, rebind/detach/destruction and foreign-mode transparency
@@ -0,0 +1,19 @@
check: /tmp/err-policy-sfqma4zs/check.cpp:42: int main(): Assertion `blood.inv.errors==0&&limb.inv.errors==0' failed.
Traceback (most recent call last):
File "/tmp/erri-inventory-hitzone-compat/tests/test_inventory_hitzone_compat.py", line 19, in <module>
run(r'''
~~~^^^^^
#include <cassert>
^^^^^^^^^^^^^^^^^^
...<59 lines>...
}
^
'''.replace('METHODS',methods))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
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-sfqma4zs/check']' died with <Signals.SIGABRT: 6>.
@@ -0,0 +1,20 @@
{
"finding": "Installed SCR_HitZone invokes one argument; native InventoryHitZonePointContainerUI subscribes a two-argument UpdateHitZoneState method with optional bool, matching reported bool/void runtime errors.",
"implementation": "Mission-only one-argument wrapper replaces only the known blood and character damage-state subscriptions after native initialization. Direct updates remain native and preserve updateAttachmentStorage.",
"validation": {
"proposal": "Focused actual successor methods green.",
"baseline": "Compiled native-boundary double without adapter runtime fails missing bool error assertion. This is not executing copied vanilla UI implementation or the engine invoker.",
"native": "Not run; rendered UI restoration remains unverified.",
"test_registration_needed": "tests/test_inventory_hitzone_compat.py"
},
"sdk_inputs": {
"/tmp/erri-vanilla-stock/scripts/Game/UI/Inventory/SCR_InventoryHitZonePointUI.c": "0ffc7359e76a6de03669dc2e631682ec9b107048d829794ab61512dbdb209b02",
"/tmp/erri-vanilla-stock/scripts/Game/HitZone/SCR_HitZone.c": "d622f0e7ee5727a2430aa10e78bf37c623a12b229bfcef098e0c385451adb612"
},
"limits": [
"Existing native tourniquet/DOT listener lifecycle not changed or qualified.",
"Does not mutate hitzone health, damage or treatment.",
"No active game inspection, identifiers or chat collected."
],
"live_writes": false
}
@@ -0,0 +1,17 @@
{
"files": {
"addons/core/Scripts/Game/ERR/00_Core/ERR_InventoryHitZoneCompat.c": {
"baseline_sha256": null,
"proposal_sha256": "23c34f901311dce63a79aafe83c11e2fc25bd3fddb0cde38bd313eb90878ca90"
},
"tests/test_inventory_hitzone_compat.py": {
"baseline_sha256": null,
"proposal_sha256": "bffa64c645a4282a1ed1ce244a9a2de37f20a70c60e8ff5b1544b7289c12c877"
}
},
"patch_sha256": "fff4e6cdf72b13dcd82cfb819ae3edf9abdb709c7b9b1bfd7b6b43a8b93c53c2",
"logs": {
"red.log": "e9a0eedbc9d6a52ffc49a66a378194d949744b2c1a225b8b8d16b084475b83d5",
"green.log": "2d1e9eee33bf9f7b837eabba67b5b4928882f00de9007188c08349653339ed4e"
}
}
@@ -0,0 +1,2 @@
ETraceback (most recent call last):
Traceback (most recent call last):
File diff suppressed because one or more lines are too long
@@ -0,0 +1,4 @@
{
"/tmp/erri-vanilla-stock/scripts/Game/UI/Inventory/SCR_InventoryHitZonePointUI.c": "0ffc7359e76a6de03669dc2e631682ec9b107048d829794ab61512dbdb209b02",
"/tmp/erri-vanilla-stock/scripts/Game/HitZone/SCR_HitZone.c": "d622f0e7ee5727a2430aa10e78bf37c623a12b229bfcef098e0c385451adb612"
}
@@ -0,0 +1,20 @@
{
"archive_bytes": 3151615,
"archive_sha256": "0c953a091a93966c93ea22fa2105077e5a1de4fe4c84c02524f5a53aa983f345",
"kind": "DEVELOPMENT SOURCE BUNDLE",
"payload_files": 440,
"preview": true,
"projects": {
"core": {
"dependencies": [
"58D0FB3206B6F859",
"595F2BF2F44836FB",
"5E524E4FEECCA92B",
"629B2BA37EFFD577",
"65930CB4CD0237B2"
],
"guid": "2528466DE220D91C",
"id": "ERR_Core"
}
}
}
@@ -0,0 +1,49 @@
// Vanilla damage-state invokers supply one argument. Preserve the native UI
// update while supplying its optional attachment-refresh argument explicitly.
modded class SCR_InventoryHitZonePointContainerUI
{
protected ERR_GameMode m_ERRHitZoneMode;
protected ref array<SCR_HitZone> m_ERRHitZoneSources = {};
override void InitializeHitZoneUI(BaseInventoryStorageComponent storage, SCR_InventoryMenuUI menuManager, int hitZoneId, IEntity player, bool updateAttachmentStorage = true)
{
ERR_ClearHitZoneCallbacks();
super.InitializeHitZoneUI(storage, menuManager, hitZoneId, player, updateAttachmentStorage);
m_ERRHitZoneMode = ERR_GameMode.Get();
if (!m_ERRHitZoneMode) return;
ERR_BindHitZoneCallback(m_pBloodHitZone);
foreach (HitZone hz : m_aGroupHitZones)
ERR_BindHitZoneCallback(SCR_CharacterHitZone.Cast(hz));
}
protected void ERR_BindHitZoneCallback(SCR_HitZone hz)
{
if (!hz || m_ERRHitZoneSources.Contains(hz)) return;
ScriptInvoker changed = hz.GetOnDamageStateChanged(false);
if (!changed) return;
changed.Remove(UpdateHitZoneState);
changed.Insert(ERR_HitZoneStateChanged);
m_ERRHitZoneSources.Insert(hz);
}
protected void ERR_HitZoneStateChanged(SCR_HitZone hz)
{
if (!m_ERRHitZoneMode || m_ERRHitZoneMode != ERR_GameMode.Get() || !m_ERRHitZoneSources.Contains(hz)) return;
UpdateHitZoneState(hz, true);
}
protected void ERR_ClearHitZoneCallbacks()
{
m_ERRHitZoneMode = null;
foreach (SCR_HitZone hz : m_ERRHitZoneSources)
{
if (!hz) continue;
ScriptInvoker changed = hz.GetOnDamageStateChanged(false);
if (changed) changed.Remove(ERR_HitZoneStateChanged);
}
m_ERRHitZoneSources.Clear();
}
override void HandlerDeattached(Widget w)
{
ERR_ClearHitZoneCallbacks();
super.HandlerDeattached(w);
}
void ~SCR_InventoryHitZonePointContainerUI() { ERR_ClearHitZoneCallbacks(); }
}
@@ -0,0 +1,82 @@
"""Actual successor adapter methods; native UI/invoker boundaries are doubled.
The invoker models the SDK's one supplied argument and rejects a two-argument
subscription. It does not claim rendered medical UI or Enforce execution.
"""
import os
from pathlib import Path
from policy_harness import ROOT, body, run
source=Path(os.environ.get('ERR_HITZONE_COMPAT_SOURCE',ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_InventoryHitZoneCompat.c'))
signatures=['override void InitializeHitZoneUI(', 'protected void ERR_BindHitZoneCallback(', 'protected void ERR_HitZoneStateChanged(', 'protected void ERR_ClearHitZoneCallbacks(', 'override void HandlerDeattached(', 'void ~SCR_InventoryHitZonePointContainerUI(']
def cpp(s):
for a,b in [('override ',''),('protected ',''),('super.','Native::'),('ERR_GameMode.Get()','Mode::Get()'),('SCR_CharacterHitZone.Cast(hz)','Character::Cast(hz)'),('BaseInventoryStorageComponent storage','int storage'),('SCR_InventoryMenuUI menuManager','int menuManager'),('IEntity player','Player* player'),('Widget w','int w'),('SCR_HitZone hz','Zone* hz'),('HitZone hz','Zone* hz'),('ScriptInvoker changed','Invoker* changed'),('hz.','hz->'),('changed.','changed->'),('foreach (','for ('),('null','nullptr'),('void ~SCR_InventoryHitZonePointContainerUI()','void Destroy()')]:s=s.replace(a,b)
s=s.replace('changed->Remove(UpdateHitZoneState)','changed->Remove(this, 1)').replace('changed->Remove(ERR_HitZoneStateChanged)','changed->Remove(this, 2)')
s=s.replace('changed->Insert(ERR_HitZoneStateChanged)','changed->Insert(this, 2, [this](Zone* z){ ERR_HitZoneStateChanged(z); })')
return s
methods='\n'.join(cpp(body(source,sig)) for sig in signatures)
if os.environ.get('ERR_HITZONE_COMPAT_BASELINE')=='1':
methods='void Destroy(){}' # Installed native initializer/subscription without the new adapter.
run(r'''
#include <cassert>
#include <algorithm>
#include <functional>
#include <vector>
struct Zone;
struct Invoker {
struct Entry{void* owner;int kind;std::function<void(Zone*)> callback;};
std::vector<Entry> entries;int errors=0;
void Remove(void* o,int k){entries.erase(std::remove_if(entries.begin(),entries.end(),[&](Entry e){return e.owner==o&&e.kind==k;}),entries.end());}
void Insert(void* o,int k,std::function<void(Zone*)> cb={}){Remove(o,k);entries.push_back({o,k,cb});}
void Invoke(Zone*z){auto snapshot=entries;for(auto&e:snapshot){if(e.kind==1)errors++;else e.callback(z);}}
int Count(void*o){return std::count_if(entries.begin(),entries.end(),[&](Entry e){return e.owner==o;});}
};
struct Zone{Invoker inv;bool character=true,hasInvoker=true;Invoker*GetOnDamageStateChanged(bool create=true){assert(!create);return hasInvoker?&inv:nullptr;}};
struct Character{static Zone*Cast(Zone*z){return z&&z->character?z:nullptr;}};
template<class T>struct Array:std::vector<T>{using std::vector<T>::vector;bool Contains(T t){return std::find(this->begin(),this->end(),t)!=this->end();}void Insert(T t){this->push_back(t);}void Clear(){this->clear();}};
struct Mode{static inline Mode*current=nullptr;static Mode*Get(){return current;}};
struct Player{Zone*blood;Array<Zone*>zones;};
struct Native {
Zone*m_pBloodHitZone=nullptr;Array<Zone*>m_aGroupHitZones;
int init=0,detach=0,updates=0;bool lastRefresh=false;Zone*last=nullptr;Player*lastPlayer=nullptr;
void UpdateHitZoneState(Zone*z,bool refresh=true){updates++;lastRefresh=refresh;last=z;}
void InitializeHitZoneUI(int storage,int menuManager,int hitZoneId,Player*player,bool refresh=true){
assert(storage==11&&menuManager==22&&hitZoneId==3);init++;lastPlayer=player;
m_pBloodHitZone=player->blood;m_aGroupHitZones=player->zones;
if(m_pBloodHitZone){m_pBloodHitZone->inv.Insert(this,1);UpdateHitZoneState(m_pBloodHitZone,refresh);}
for(auto*z:m_aGroupHitZones)if(Character::Cast(z)){z->inv.Insert(this,1);UpdateHitZoneState(z,refresh);}
}
void HandlerDeattached(int w){assert(w==7);detach++;}
};
struct Adapter:Native {
Mode*m_ERRHitZoneMode=nullptr;Array<Zone*>m_ERRHitZoneSources;
METHODS
};
int main(){
Mode mode,next;Mode::current=&mode;Zone blood,limb,ignored;blood.character=false;ignored.character=false;
Player player{&blood,{&blood,&limb,&limb,&ignored,nullptr}};
Adapter a;a.InitializeHitZoneUI(11,22,3,&player,false);
assert(a.init==1&&a.lastPlayer==&player&&!a.lastRefresh); // Direct native initialization keeps false.
int before=a.updates;blood.inv.Invoke(&blood);limb.inv.Invoke(&limb);
assert(blood.inv.errors==0&&limb.inv.errors==0); // Baseline fails here after compiling.
assert(a.updates==before+2&&a.lastRefresh&&a.last==&limb);
assert(blood.inv.Count(&a)==1&&limb.inv.Count(&a)==1&&ignored.inv.Count(&a)==0);
a.InitializeHitZoneUI(11,22,3,&player,true);before=a.updates;blood.inv.Invoke(&blood);assert(a.updates==before+1&&blood.inv.Count(&a)==1);
// Each widget owns only its callbacks, even on the shared blood invoker.
Adapter other;other.InitializeHitZoneUI(11,22,3,&player,false);a.HandlerDeattached(7);before=other.updates;
blood.inv.Invoke(&blood);assert(a.detach==1&&blood.inv.Count(&a)==0&&other.updates==before+1);
// Current mode loss/replacement makes retained callbacks inert; cleanup still works.
before=other.updates;Mode::current=nullptr;blood.inv.Invoke(&blood);Mode::current=&next;limb.inv.Invoke(&limb);assert(other.updates==before);
auto late=limb.inv.entries.back().callback;other.Destroy();assert(blood.inv.Count(&other)==0&&limb.inv.Count(&other)==0);
Mode::current=&mode;late(&limb);assert(other.updates==before);
// Reinitialize in a non-successor mode: remove old wrappers, preserve native setup.
Mode::current=&mode;Adapter reuse;reuse.InitializeHitZoneUI(11,22,3,&player,false);
Zone b2,l2;b2.character=false;Player p2{&b2,{&l2}};Mode::current=nullptr;
reuse.InitializeHitZoneUI(11,22,3,&p2,false);assert(reuse.init==2&&!reuse.lastRefresh);
assert(blood.inv.Count(&reuse)==0&&limb.inv.Count(&reuse)==0);
b2.inv.Invoke(&b2);assert(b2.inv.errors==1); // Foreign native behavior untouched.
// Empty/invalid group entries are not adopted; repeated cleanup is harmless.
Mode::current=&mode;Adapter empty;Player missing{nullptr,{nullptr,&ignored}};empty.InitializeHitZoneUI(11,22,3,&missing,false);
empty.Destroy();empty.Destroy();assert(ignored.inv.Count(&empty)==0);
}
'''.replace('METHODS',methods))
print('PASS: actual one-argument adapter, explicit refresh, native initialization flag, duplicate/blood ownership, rebind/detach/destruction and foreign-mode transparency')
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,549 @@
{
"exit": 1,
"seconds": 95.57,
"inputs_unchanged": true,
"removed_override_names": [],
"regression_programs": 135,
"programs": [
{
"path": "tests/test_profile_config.py",
"exit": 0
},
{
"path": "tests/test_welcome_voice.py",
"exit": 0
},
{
"path": "tests/test_objective_map_presentation.py",
"exit": 0
},
{
"path": "tests/test_objective_map_element.py",
"exit": 0
},
{
"path": "tests/test_native_objective_map_probe.py",
"exit": 0
},
{
"path": "tests/test_prefab_identity.py",
"exit": 0
},
{
"path": "tests/test_spawn_scene.py",
"exit": 0
},
{
"path": "tests/test_spawn_scene_inventory.py",
"exit": 0
},
{
"path": "tests/test_spawn_scene_lease.py",
"exit": 0
},
{
"path": "tests/test_prison_ai.py",
"exit": 0
},
{
"path": "tests/test_native_player_death_fixture.py",
"exit": 0
},
{
"path": "tests/test_hq_planner_budget.py",
"exit": 0
},
{
"path": "tests/test_observer_ownership.py",
"exit": 0
},
{
"path": "tests/test_chat_client_ownership.py",
"exit": 0
},
{
"path": "tests/test_native_observer_selector.py",
"exit": 0
},
{
"path": "tests/test_ground_depot_loading.py",
"exit": 0
},
{
"path": "tests/test_ground_depot_lifecycle.py",
"exit": 0
},
{
"path": "tests/test_ground_depot_mine_claim.py",
"exit": 0
},
{
"path": "tests/test_ground_depot_transfer.py",
"exit": 0
},
{
"path": "tests/test_ground_depot_provenance.py",
"exit": 0
},
{
"path": "tests/test_crash_start.py",
"exit": 0
},
{
"path": "tests/test_start_settings.py",
"exit": 0
},
{
"path": "tests/test_intercept_vehicle_footprint.py",
"exit": 0
},
{
"path": "tests/test_bmp_intercept_geometry.py",
"exit": 0
},
{
"path": "tests/test_native_random_radius_trace.py",
"exit": 0
},
{
"path": "tests/test_native_random_radius_runner.py",
"exit": 0
},
{
"path": "tests/test_native_supply_travel.py",
"exit": 0
},
{
"path": "tests/test_native_supply_travel_hook.py",
"exit": 0
},
{
"path": "tests/test_native_supply_travel_runner.py",
"exit": 0
},
{
"path": "tests/test_native_mounted_intercept.py",
"exit": 0
},
{
"path": "tests/test_hq_mounted_dispatch.py",
"exit": 0
},
{
"path": "tests/test_hq_mounted_intercept.py",
"exit": 0
},
{
"path": "tests/test_hq_mounted_intercept_pair.py",
"exit": 0
},
{
"path": "tests/test_convoy_intercept_pair.py",
"exit": 0
},
{
"path": "tests/test_native_maintenance_refuel.py",
"exit": 0
},
{
"path": "tests/test_mine_intel.py",
"exit": 0
},
{
"path": "tests/test_mine_intel_discovery_integration.py",
"exit": 0
},
{
"path": "tests/test_infantry_combat.py",
"exit": 0
},
{
"path": "tests/test_enemy_medicine.py",
"exit": 0
},
{
"path": "tests/test_hunter_combat.py",
"exit": 0
},
{
"path": "tests/test_hq_local_awareness.py",
"exit": 0
},
{
"path": "tests/test_unconscious_controls.py",
"exit": 0
},
{
"path": "tests/test_town_garrisons.py",
"exit": 0
},
{
"path": "tests/test_field_sites.py",
"exit": 0
},
{
"path": "tests/test_gameplay_session_regressions.py",
"exit": 0
},
{
"path": "tests/test_gameplay_review_fixes.py",
"exit": 0
},
{
"path": "tests/test_server_log_regressions.py",
"exit": 0
},
{
"path": "tests/test_mortar_load_ack.py",
"exit": 0
},
{
"path": "tests/test_hunter_profiles.py",
"exit": 0
},
{
"path": "tests/test_hunter_lifecycle.py",
"exit": 0
},
{
"path": "tests/test_hunter_capture.py",
"exit": 0
},
{
"path": "tests/test_hunter_opening.py",
"exit": 0
},
{
"path": "tests/test_enemy_awareness.py",
"exit": 0
},
{
"path": "tests/test_intel_body_inspection.py",
"exit": 0
},
{
"path": "tests/test_body_recovery_lifecycle.py",
"exit": 0
},
{
"path": "tests/test_air_support_policy.py",
"exit": 0
},
{
"path": "tests/test_air_logistics_orders.py",
"exit": 0
},
{
"path": "tests/test_air_recon.py",
"exit": 0
},
{
"path": "tests/test_scouts.py",
"exit": 0
},
{
"path": "tests/test_mortar_station.py",
"exit": 0
},
{
"path": "tests/test_random_settings.py",
"exit": 0
},
{
"path": "tests/test_debug_ai.py",
"exit": 0
},
{
"path": "tests/test_generated_sites.py",
"exit": 0
},
{
"path": "tests/test_terrain_sites.py",
"exit": 0
},
{
"path": "tests/test_terrain_adapter.py",
"exit": 0
},
{
"path": "tests/test_terrain_airfields.py",
"exit": 0
},
{
"path": "tests/test_terrain_takeover.py",
"exit": 0
},
{
"path": "tests/test_terrain_presentation.py",
"exit": 0
},
{
"path": "tests/test_terrain_selection.py",
"exit": 0
},
{
"path": "tests/test_faction_selection.py",
"exit": 0
},
{
"path": "tests/test_faction_menu.py",
"exit": 0
},
{
"path": "tests/test_content_policy.py",
"exit": 0
},
{
"path": "tests/test_hq_road_intercept.py",
"exit": 0
},
{
"path": "tests/test_hq_delivered_task.py",
"exit": 0
},
{
"path": "tests/test_hq_local_handoff.py",
"exit": 0
},
{
"path": "tests/test_hq_local_handoff_intake.py",
"exit": 0
},
{
"path": "tests/test_native_local_handoff_probe.py",
"exit": 0
},
{
"path": "tests/test_infantry_resupply_waypoints.py",
"exit": 0
},
{
"path": "tests/test_infantry_placement_settle.py",
"exit": 0
},
{
"path": "tests/test_native_infantry_fixture_lifecycle.py",
"exit": 0
},
{
"path": "tests/test_native_infantry_cargo.py",
"exit": 0
},
{
"path": "tests/test_native_infantry_setup.py",
"exit": 0
},
{
"path": "tests/test_infantry_ammo_access.py",
"exit": 0
},
{
"path": "tests/test_infantry_resupply_planning.py",
"exit": 0
},
{
"path": "tests/test_infantry_supply_pool.py",
"exit": 0
},
{
"path": "tests/test_hq_multiconvoy_supply.py",
"exit": 0
},
{
"path": "tests/test_enemy_gunner_skill.py",
"exit": 0
},
{
"path": "tests/test_native_memory_deadlines.py",
"exit": 0
},
{
"path": "tests/test_convoy_auto_settings.py",
"exit": 0
},
{
"path": "tests/test_convoy_startup.py",
"exit": 0
},
{
"path": "tests/test_failure_result_refresh.py",
"exit": 0
},
{
"path": "tests/test_infantry_resupply_coordinator.py",
"exit": 0
},
{
"path": "tests/test_infantry_mine_coordinator.py",
"exit": 0
},
{
"path": "tests/test_infantry_mine_transfer.py",
"exit": 0
},
{
"path": "tests/test_infantry_ammo_transfer.py",
"exit": 0
},
{
"path": "tests/test_finite_magazine_reservation.py",
"exit": 0
},
{
"path": "tests/test_mounted_ammo_transfer.py",
"exit": 0
},
{
"path": "tests/test_mounted_ammo_pickup.py",
"exit": 0
},
{
"path": "tests/test_mounted_resupply.py",
"exit": 0
},
{
"path": "tests/test_mounted_supply_integration.py",
"exit": 0
},
{
"path": "tests/test_hq_ammo_reporting.py",
"exit": 0
},
{
"path": "tests/test_enemy_radio.py",
"exit": 0
},
{
"path": "tests/test_native_maintenance_stock.py",
"exit": 0
},
{
"path": "tests/test_packed_external_game.py",
"exit": 0
},
{
"path": "tests/test_hq_radio_node.py",
"exit": 0
},
{
"path": "tests/test_vehicle_maintenance_stock.py",
"exit": 0
},
{
"path": "tests/test_optional_transport.py",
"exit": 0
},
{
"path": "tests/test_vehicle_entry_diagnostics.py",
"exit": 0
},
{
"path": "tests/test_vehicle_security_native_probe.py",
"exit": 0
},
{
"path": "tests/test_vehicle_security.py",
"exit": 0
},
{
"path": "tests/test_vehicle_alarm.py",
"exit": 0
},
{
"path": "tests/test_vehicle_alarm_perception.py",
"exit": 0
},
{
"path": "tests/test_native_convoy_mine_stock.py",
"exit": 0
},
{
"path": "tests/test_native_mine_stock_runner.py",
"exit": 0
},
{
"path": "tests/test_native_mounted_ammo_probe.py",
"exit": 0
},
{
"path": "tests/test_native_mounted_swap_probe.py",
"exit": 0
},
{
"path": "tests/test_native_mounted_courier_probe.py",
"exit": 0
},
{
"path": "tests/test_native_alarm_hearing.py",
"exit": 0
},
{
"path": "tests/test_native_convoy_cover_probe.py",
"exit": 0
},
{
"path": "tests/test_enemy_optics.py",
"exit": 0
},
{
"path": "tests/test_convoy_combat.py",
"exit": 0
},
{
"path": "tests/test_ai_stinger_admin.py",
"exit": 0
},
{
"path": "tests/test_hq_ammo_dispatch.py",
"exit": 0
},
{
"path": "tests/test_hq_convoy_combat.py",
"exit": 0
},
{
"path": "tests/test_hq_ammo_sampler.py",
"exit": 0
},
{
"path": "tests/test_hq_mine_sampler.py",
"exit": 0
},
{
"path": "tests/test_hq_mounted_ammo_sampler.py",
"exit": 0
},
{
"path": "tests/test_hq_mounted_binding.py",
"exit": 0
},
{
"path": "tests/test_hq_vehicle_seats.py",
"exit": 0
},
{
"path": "tests/test_native_hq_body_probe.py",
"exit": 0
},
{
"path": "tests/test_hq_delivered_casualties.py",
"exit": 0
},
{
"path": "tests/test_external_profile_review.py",
"exit": 0
},
{
"path": "tests/test_hq_uplink_fairness.py",
"exit": 0
},
{
"path": "tests/test_actor_group.py",
"exit": 0
},
{
"path": "tests/test_native_package_external.py",
"exit": 1
}
]
}
@@ -0,0 +1,537 @@
PASS: shared config transaction rejects client writes, preserves first-save/prior/fallback state across open, write, backup, partial-copy, readback and mismatch failures
PASS: actual Save/Commit preserves semantically valid backup across unrelated menu edits and repairs; unknown fields/default sections retained; actual terrain parser; other parsers, catalog and disk doubled
....
----------------------------------------------------------------------
Ran 4 tests in 0.001s
OK
PASS: actual objective overlay lifecycle preserves separate ownership, late readiness/reopen, data refresh, pan/zoom/culling, supported sibling/shared-frame parents, coordinate offsets, native task-clear isolation and terminal cleanup; native rendering remains unverified
PASS: actual map element initializes each widget, retries missing widgets, updates position and changes only stale text/icon data; no native image-load claim
PASS: actual native fixture root/config ownership and idempotent cleanup preserve foreign map, selector excludes ordinary route, fixed budgets/screenshots/UGC boundaries retained; native operations not executed
PASS: actual full Inspect rejects canvas parenting, wrong active container/canvas, omitted origin offset, wrong rendered box and stale coordinates; differing origins and DPI accepted
PASS: actual long-warning phases retain visible label through1500ms checkpoint then restore radio before close; synthetic marker separated from unmoved player
PASS: actual Center places marker100screenpx left of pan center at both fixture zooms without altering disclosed coordinates
PASS: missing, child-only, malformed, zero and duplicate prefab root IDs rejected
PASS: delayed scene/inventory arrival, deferred preload, identity checks, stale replies, timeout and observer cleanup
PASS: actual inventory manifest, delayed/missing/wrong-owner item links, finite cap, consumed-stock refresh and preload ordering
PASS: spawn scene remains held through final acknowledgement and nearby use; leaving, reassignment, disconnect and teardown release it
PASS: production prison AI hold/release, repeat activation, authority/faction/player exclusion, dead actor and stop cleanup
PASS: actual protected/capped damage plus exact-actor terminal fixture bypass through delayed native damage, fail-closed ownership and untouched ordinary actor; no native claim
PASS: actual full planner selection/commit body, 360 equivalence scenarios, orders/reservations/cooldowns identical; one128-unit scan vs >10000 repeated unit visits; no FPS claim
PASS: actual observer monitor/recovery/cleanup rejects retained old controller, preserves new camera/editor/hints/timer, restarts once and retains normal recovery; native effects modeled from SDK, no runtime claim
PASS: former chat controller releases only its own callbacks and preserves replacement menu; current-owner stop/scope and repeated teardown remain intact
PASS: wrong observer fixture selector rejected before runtime/profile setup; no engine launched
PASS: actual depot mixed-roster worker/item selection, ownership/refusal and radio/planning/two-leg state transitions, fixed deadline, late proof quarantine, finite import and no adoption after Stop
PASS: actual depot HQ lifecycle, existing planner priority, server/mode/owner gates, idempotent polling and owner replacement
PASS: actual HQ mine/magazine claim separation, real demand methods, exact token cleanup and original authority gates; native availability doubled
PASS: actual full magazine/inert-PMN4 depot leaf, exact custody, isolated callbacks, finite reservation, false/unknown and Stop quarantine, once-only delivery and caps; native movement unqualified
PASS: actual mine/magazine provenance and separated finite mine imports; actual authored identity capture, READY-only detached provenance, same shared stock admission, completed exact two-leg proof, lifetime caps and Stop no late adoption
PASS: actual crash geometry, detached definition setup, frozen server choice and guarded phase policy; integration/source ordering checked
PASS: actual GameMode readiness admission and common full-footprint survey require crash authorization and both surveyed areas
PASS: actual start defaults/parse/save, failure retention and authorized command wiring; current/next feedback, aliases and no random choice; native UI and core mode freezing are separate
PASS: actual immutable measured footprint/root/attachment matching, bounds/transforms, moving geometry, seated-body and cargo reciprocity, finite hierarchy caps; native geometry doubled
PASS: actual BMP singleton geometry and typed current order; one survey, full straight segment, width, known history, reservations, settlement/clearance and work caps; placement/footprint tested separately
PASS: actual five random-radius diagnostic wrappers, disabled transparency, cached opt-in, exact zero and exclusion branch, native arguments/returns/outarg preservation, single superclass call and shared16-log cap
PASS: zero-radius trace disabled by default, scoped before setup, exact opt-in emission; no native launch
PASS: complete actual supply-travel probe, immutable 6+2 formations and 25 actors, admission/travel deadlines, six observed native-boundary moves, stop/ownership/partial-substitution refusals
PASS: actual distinct supply-travel hook, fixed420s selector, original observer protection/restoration, failure/terminal cleanup and no legacy convoy setup
PASS: actual supply-travel selector requires Chat, one round and480s; existing outcomes unaffected; no native launch
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
[--external-addons EXTERNAL_ADDONS]
--compat COMPAT --profile PROFILE
[--smoke {crash-start,crash-geometry,normal-escape-route,escape-route,optional-site-skip,infantry-combat,medical-combat,hunter-faction,unconscious-camera,objective-map,town-garrisons,site-garrisons,radio-interaction,enemy-loadout,aggression,air-logistics,air-assault,air-recon,airfield-markers,opening-tools,mortar-station,generated-sites,hq-local-handoff,infantry-transfer,hq-body,convoy,supply-convoys,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,prison-breach,powered-flight,powered-translate,local-admission,mortar-expiry,mortar-transfer,mortar-fire,patrol-hq,victory,lost-helicopter,player-death,radio-network,hq-response,mortar-inventory,startup-failure,site-survey,cache-loss,extraction-capacity,early-helicopter-loss,extraction-startup-failure,extraction-boundary-failure,transport-loss,transport-survey,lifecycle,objective-ui,recovery,prisoner-kit,medical,casualty-load,casualty-direct,casualty-bench,casualty-remove,environment,environment-restart,patrols,radio-document-loss,radio-document-loss-partial,guard-cancel,casualty-service}]
[--trace-random-radius]
[--maintenance-refuel]
[--mounted-swap-eligibility]
[--mounted-bmp] [--mine-stock]
[--mounted-courier]
[--mounted-intercept] [--convoy-cover]
[--field-terrain-audit]
[--field-service-cancel]
[--route-service-cancel]
[--station-teardown-diagnostics]
[--flight-autohover]
[--flight-action-inputs]
[--flight-input-diagnostics]
[--recon-takeover-only]
[--body-recovery-only]
[--rounds ROUNDS] [--timeout TIMEOUT]
[--project {core,chat}]
test_native_mounted_intercept.py: error: --mounted-intercept requires Chat --smoke convoy, one round and timeout at least900 seconds
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
[--external-addons EXTERNAL_ADDONS]
--compat COMPAT --profile PROFILE
[--smoke {crash-start,crash-geometry,normal-escape-route,escape-route,optional-site-skip,infantry-combat,medical-combat,hunter-faction,unconscious-camera,objective-map,town-garrisons,site-garrisons,radio-interaction,enemy-loadout,aggression,air-logistics,air-assault,air-recon,airfield-markers,opening-tools,mortar-station,generated-sites,hq-local-handoff,infantry-transfer,hq-body,convoy,supply-convoys,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,prison-breach,powered-flight,powered-translate,local-admission,mortar-expiry,mortar-transfer,mortar-fire,patrol-hq,victory,lost-helicopter,player-death,radio-network,hq-response,mortar-inventory,startup-failure,site-survey,cache-loss,extraction-capacity,early-helicopter-loss,extraction-startup-failure,extraction-boundary-failure,transport-loss,transport-survey,lifecycle,objective-ui,recovery,prisoner-kit,medical,casualty-load,casualty-direct,casualty-bench,casualty-remove,environment,environment-restart,patrols,radio-document-loss,radio-document-loss-partial,guard-cancel,casualty-service}]
[--trace-random-radius]
[--maintenance-refuel]
[--mounted-swap-eligibility]
[--mounted-bmp] [--mine-stock]
[--mounted-courier]
[--mounted-intercept] [--convoy-cover]
[--field-terrain-audit]
[--field-service-cancel]
[--route-service-cancel]
[--station-teardown-diagnostics]
[--flight-autohover]
[--flight-action-inputs]
[--flight-input-diagnostics]
[--recon-takeover-only]
[--body-recovery-only]
[--rounds ROUNDS] [--timeout TIMEOUT]
[--project {core,chat}]
test_native_mounted_intercept.py: error: --mounted-intercept requires Chat --smoke convoy, one round and timeout at least900 seconds
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
[--external-addons EXTERNAL_ADDONS]
--compat COMPAT --profile PROFILE
[--smoke {crash-start,crash-geometry,normal-escape-route,escape-route,optional-site-skip,infantry-combat,medical-combat,hunter-faction,unconscious-camera,objective-map,town-garrisons,site-garrisons,radio-interaction,enemy-loadout,aggression,air-logistics,air-assault,air-recon,airfield-markers,opening-tools,mortar-station,generated-sites,hq-local-handoff,infantry-transfer,hq-body,convoy,supply-convoys,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,prison-breach,powered-flight,powered-translate,local-admission,mortar-expiry,mortar-transfer,mortar-fire,patrol-hq,victory,lost-helicopter,player-death,radio-network,hq-response,mortar-inventory,startup-failure,site-survey,cache-loss,extraction-capacity,early-helicopter-loss,extraction-startup-failure,extraction-boundary-failure,transport-loss,transport-survey,lifecycle,objective-ui,recovery,prisoner-kit,medical,casualty-load,casualty-direct,casualty-bench,casualty-remove,environment,environment-restart,patrols,radio-document-loss,radio-document-loss-partial,guard-cancel,casualty-service}]
[--trace-random-radius]
[--maintenance-refuel]
[--mounted-swap-eligibility]
[--mounted-bmp] [--mine-stock]
[--mounted-courier]
[--mounted-intercept] [--convoy-cover]
[--field-terrain-audit]
[--field-service-cancel]
[--route-service-cancel]
[--station-teardown-diagnostics]
[--flight-autohover]
[--flight-action-inputs]
[--flight-input-diagnostics]
[--recon-takeover-only]
[--body-recovery-only]
[--rounds ROUNDS] [--timeout TIMEOUT]
[--project {core,chat}]
test_native_mounted_intercept.py: error: --mounted-intercept requires Chat --smoke convoy, one round and timeout at least900 seconds
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
[--external-addons EXTERNAL_ADDONS]
--compat COMPAT --profile PROFILE
[--smoke {crash-start,crash-geometry,normal-escape-route,escape-route,optional-site-skip,infantry-combat,medical-combat,hunter-faction,unconscious-camera,objective-map,town-garrisons,site-garrisons,radio-interaction,enemy-loadout,aggression,air-logistics,air-assault,air-recon,airfield-markers,opening-tools,mortar-station,generated-sites,hq-local-handoff,infantry-transfer,hq-body,convoy,supply-convoys,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,prison-breach,powered-flight,powered-translate,local-admission,mortar-expiry,mortar-transfer,mortar-fire,patrol-hq,victory,lost-helicopter,player-death,radio-network,hq-response,mortar-inventory,startup-failure,site-survey,cache-loss,extraction-capacity,early-helicopter-loss,extraction-startup-failure,extraction-boundary-failure,transport-loss,transport-survey,lifecycle,objective-ui,recovery,prisoner-kit,medical,casualty-load,casualty-direct,casualty-bench,casualty-remove,environment,environment-restart,patrols,radio-document-loss,radio-document-loss-partial,guard-cancel,casualty-service}]
[--trace-random-radius]
[--maintenance-refuel]
[--mounted-swap-eligibility]
[--mounted-bmp] [--mine-stock]
[--mounted-courier]
[--mounted-intercept] [--convoy-cover]
[--field-terrain-audit]
[--field-service-cancel]
[--route-service-cancel]
[--station-teardown-diagnostics]
[--flight-autohover]
[--flight-action-inputs]
[--flight-input-diagnostics]
[--recon-takeover-only]
[--body-recovery-only]
[--rounds ROUNDS] [--timeout TIMEOUT]
[--project {core,chat}]
test_native_mounted_intercept.py: error: --mounted-intercept requires Chat --smoke convoy, one round and timeout at least900 seconds
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
[--external-addons EXTERNAL_ADDONS]
--compat COMPAT --profile PROFILE
[--smoke {crash-start,crash-geometry,normal-escape-route,escape-route,optional-site-skip,infantry-combat,medical-combat,hunter-faction,unconscious-camera,objective-map,town-garrisons,site-garrisons,radio-interaction,enemy-loadout,aggression,air-logistics,air-assault,air-recon,airfield-markers,opening-tools,mortar-station,generated-sites,hq-local-handoff,infantry-transfer,hq-body,convoy,supply-convoys,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,prison-breach,powered-flight,powered-translate,local-admission,mortar-expiry,mortar-transfer,mortar-fire,patrol-hq,victory,lost-helicopter,player-death,radio-network,hq-response,mortar-inventory,startup-failure,site-survey,cache-loss,extraction-capacity,early-helicopter-loss,extraction-startup-failure,extraction-boundary-failure,transport-loss,transport-survey,lifecycle,objective-ui,recovery,prisoner-kit,medical,casualty-load,casualty-direct,casualty-bench,casualty-remove,environment,environment-restart,patrols,radio-document-loss,radio-document-loss-partial,guard-cancel,casualty-service}]
[--trace-random-radius]
[--maintenance-refuel]
[--mounted-swap-eligibility]
[--mounted-bmp] [--mine-stock]
[--mounted-courier]
[--mounted-intercept] [--convoy-cover]
[--field-terrain-audit]
[--field-service-cancel]
[--route-service-cancel]
[--station-teardown-diagnostics]
[--flight-autohover]
[--flight-action-inputs]
[--flight-input-diagnostics]
[--recon-takeover-only]
[--body-recovery-only]
[--rounds ROUNDS] [--timeout TIMEOUT]
[--project {core,chat}]
test_native_mounted_intercept.py: error: --mounted-intercept and --convoy-cover are mutually exclusive
PASS: actual native interception witness requires real radio cursor/lineage, original actor identities, fixed movement/hold/expiry/resume and immutable deadline; no movement/delivery injection
PASS: actual CLI rejects wrong mode/project/rounds/899s/conflict before runtime; valid flag and terminal branch identify synthetic-observation qualification
PASS: visible base hook and actual fixture override delegate once; delivery proof uses retained pre-super route only on successful production transition
actual mounted HQ dispatch planning, radio, ownership and lifecycle checks passed
PASS: actual mounted intercept eligibility/order chronology, fixed destinations, native road selection bounds, width, segment heading, clearance and settlement delegation; no native driving claim
PASS: actual paired arc geometry,40m/80m spacing, separate original polylines, both-position validation and128road/4096segment budget; no native driving proof
PASS: actual typed original BMP singleton, loss/footprint/custody guards and native cancellation, UAZ-only pair admission, rollback, native allocation/revocation boundaries, per-member ownership, hold and expiry
PASS: actual Tick clock initialization admits fractional first ticks and expires without extending the original start
PASS: actual finite conservation/deadline/callback policies; read-only selection, bounded once-only inventory submission and no can refill; native transfer not executed
PASS: actual exact-context membership, bounded identity/reach gates, native start/cache/eligibility ordering and no duplicate/foreign action start; fuel manager identity and empty-can headroom guards checked
PASS: actual detached node/value snapshot and conservation refuse mismatched lengths before indexed reads, retain original identities under native out-array aliasing and log bounded counts once; native cause remains unknown
PASS: actual mine evidence sealing/recovery, historical coarse publication, caps, canonical ownership, marker join retry/owner-change/stop; native arming and replicated vector-array transport untested
PASS: actual full document recovery retains authored/sealed targets, one shared spent ledger, retry/exhaustion semantics and canonical multi-player ownership alongside supplemental mine intel
PASS: actual infantry search suspension, quiet grace, finite resume, expiry/replacement and defensive/ownership boundaries
PASS: infantry combat gate precedes radio delivery and preserves non-task transports
PASS: actual HQ contact transition wakes only fit squad members, cancels only task orders and logs changes once
PASS: actual finite medicine grants, authored stock deduction, full-backpack refusal/pouch fallback, no loot replenishment, unresolved-operation quarantine and ownership/stop guards
PASS: only recent native detected/identified threats suspend hunter travel; stale/disarmed/destroyed contacts cannot strand patrols
PASS: actual hunter combat transition cancels only its travel once, holds through renewed contact and resumes after quiet; unregistered startup preserved
PASS: captured sighting retention, immutable details, expiry, replay rejection, bounded sound uncertainty/cooldown, radio loss, priority and overdue-status fairness
PASS: arrow press/release, held keys, opposing keys, disabled/menu input and firearm-only retention
PASS: town trigger and hard 700m exclusion for all observers, empty/invalid positions and final-check crossings
PASS: exact finite site squads, invalid roster/count rejection, committed-site spacing and safe fallback boundary
PASS: mortar couriers use the mobile site team and refuse permanent-only garrisons
PASS: omitted preferred mortar depot selects a surviving owned camp/mobile team; no camp, foreign cache and permanent-only sites are unavailable; historical priority retained
PASS: real-session mortar deadline, failed-support convoy admission and hunter survivor/recovery gates
PASS: native-route retry preserves delivered target, limits attempts and suspends during combat
PASS: stale/deleted AI utility cannot receive Complete; mortar HQ preflight withholds unsafe orders; mounted convoy cover never creates infantry Defend
PASS: flight crew affiliation and group precede native boarding; preparation remains bounded even while passengers wait
PASS: factionless/deleted map targets do not abort perception; faction lookup tolerates teardown; deleting helicopter releases without capture/engine access
PASS: shoot adapter waits for a physical round; bounded same-shell retries, interrupted/never-started loads, committed no-retry, order/owner changes and normal native delegation
PASS: missing/invalid faction crew defers before any native spawn or allowance insertion; all registered RHS factions have explicit soldier and medic profiles
PASS: vehicle radio issued once; pending, refusal and looting cannot duplicate or fabricate a physical radio link
PASS: actual vehicle-radio link requires the original seated crew, physical manpack and live uncaptured mission vehicle; looting, dismount, release and teardown remove it
PASS: actual hunter release preserves survivors/HQ, releases driving ownership once, delegates capture/teardown, and excludes prison/patrol/mortar from generic objective defence
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
PASS: real opening road geometry enforces wide azimuths; fresh delivered contact preempts patrol cooldown, respects radio failures and does not starve in-flight interception
PASS: actual scoped 10% tighter REGULAR aim error and alert perception; preserves equipment multiplier and restores vanilla behavior when unbound
PASS: physical inspection and parent-wreck retention; server-only searched/report delivery unlocks native cleanup once with a 300-second delay
PASS: bounded same-group empty-spawn retries, no casualty refill, queue retirement, delivery-gated intel, prepared-team reuse, throttled diagnostics and LOD release
PASS: production airborne memory confidence, persistence, ground coverage, confirmed losses, artillery veto, cooldown and invalid-input rules
PASS: production cover retains the carried HQ target until its deadline; airport reload waits until the drop pass and cover have finished
PASS: air logistics reservation preserves delivered search until radio handoff, excludes guards/combat/in-flight orders, and quarantines unresolved native loads/moves
PASS: actual ammunition cargo selector handles empty rifle/machinegun/sniper magazines, preserves loaded variants, excludes auxiliary launchers and tolerates missing native metadata
PASS: original 15-minute launch/loss cadence, active/captured timer disarm, saved delay reset, stop, 300m orbit and bounded close-contact standoff at 30/60/120 Hz
PASS: actual aircraft-removal notification guards owner/server/active/stop and schedules one full delay without replay extension
PASS: actual helicopter delay applies resolved Random values, preserves countdown on save failure, and leaves active flights running
PASS: hill prominence/elevation, actual road edges/heights/bends and server-only finite scout admission, pending stock, timeout and no replacements/refills
PASS: mortar duty scope excludes players, other crews, stopped/client/inactive states; only destruction releases an active assignment, while the gunner may approach the gun
PASS: random mode restrictions, full numeric ranges, independent calendar dates and strict daylight boundaries
PASS: actual killais eligibility includes the 1000m boundary, excludes players/retained bodies/dead/non-character entities and checks full 3D distance
PASS: actual generation scheduler bounds each tick, enforces deadline/candidate ceiling, validates fallback, commits only accepted positions, skips only dispensable sites, preserves required objectives/intel, and resets the next search budget
PASS: terrain placement samples world bounds, retains streaming candidates, bounds waits/work, rejects foreign fallbacks, preserves objectives/intel and validates completion
PASS: actual navigation readiness supports static meshes, yields only for loadable streaming tiles and refuses unreachable positions
PASS: real sampling handles absent airports and extraction clearance preserves geometry/navigation/flatness while selecting the correct aircraft survey
PASS: universal connector, embedded/standalone exports, multiple terrains, stable IDs, native nav configs, missing-nav visibility, path validation and overwrite protection
PASS: airfield detection accepts physical runways/towers and bounded authored markers, rejects unrelated props, water and out-of-world markers, and samples terrain height
PASS: configured airport parsing, bounded readiness, stale admission rejection and cleanup wiring
PASS: automatic default, explicit header/CLI opt-out, editor/authored-mode guards, optional airport override precedence and fresh-round saving guard
PASS: singleton identity guards, paired faction deserialization and client world-cleanup wiring
PASS: task/map/respawn getters survive delayed old destruction and preserve ordinary-mode behavior
PASS: replication hierarchy refuses absent/aliased nodes and establishes delivery dependencies idempotently
PASS: standalone old faction delegates collected once, with null/deleted owners ignored
PASS: actual terrain takeover startup skips mode-less/menu worlds, always forwards super, retains eligible/unsupported/authored/client/editor semantics
PASS: native name callback preserves authored modes, opt-outs and failures; terrain suffix follows world changes, cached resolution and confirmed takeover metadata restores on cleanup without changing scenario resource or overwriting later titles
PASS: actual terrain parent traversal, Armenhof/Nogova names, Everon alias, missing-resource fallback, empty names and bounded cycles/depth
PASS: saved terrain GUIDs, defaults, restart persistence, clearing, backup recovery, corrupt-file preservation, write failures, and client write denial
PASS: startup terrain capture protects client/editor/menu worlds, default behavior, same-map loads and reload-loop recovery
PASS: actual transition waits for native startup, disconnects without bans, requires an empty session, retains every loaded mod, bounds waiting and consumes requests once
PASS: actual faction resolution reserves explicit roles, samples without replacement, substitutes disabled selections, and rejects duplicate/unknown/missing choices and insufficient pools
PASS: Random all submits persistent random roles immediately; manual mixed choices, stale/unauthorized UI guards and debounce preserved
PASS: actual content policy gates parent packs, individual factions, faction identity and finite group rotation with vanilla fallback
PASS: actual delivered road eligibility, ahead projection without chords, reservations, stock road query bounds, terrain/water/obstruction refusal and clean outputs
PASS: actual delivered-task lineage, expiry, old-order retention, native commit, release, road precision expiry and duplicate delivery
PASS: actual original-roster local handoff,100m3D bound,busy carrier/budget exclusion,origin interruption including deletedsource,normal radio delivery and per-source replay history
PASS: actual visual intake retains source/time/position/id, rejects replay, prefers usable own route, excludes simultaneous callers and conservatively resets negative-sweep dwell
PASS: actual fixture local/radio gating, immutable source/time/position, interrupted-report exclusion and exact-owner cleanup
PASS: local-handoff runner refuses wrong project/round count/insufficient deadline before runtime work
PASS: actual fixture allocator terminal/unsubmitted guard, original-group lookup and both candidate gates
PASS: actual report-derived waypoint insertion/order and tighter positive radii; no formation navigation claim
PASS: actual Place/Stop waits native pose update, bounds four attempts, preserves original position, restores pending/settled placement and respects ownership/accepted-move quarantine
PASS: actual fixture current/original recipient ownership, unresolved transfer cleanup, exact-token release and idempotent Stop
PASS: actual fixture phased-cargo readiness, bounded callbacks, captured-stock mixed-caliber selection/continuation, reservation cleanup and component magazine counts
PASS: actual inventory-fixture setup uses ordinary prison unlock before constructing its convoy-waiting probe; failed unlock cannot run fixture
PASS: actual authored storage anchors, native trace flags, own-hierarchy exclusion, external wall/vehicle obstruction, range, unknown geometry and bounded context refusal
PASS: actual Compatible and bounded stock preflight before report/claim consumption, later compatible truck, launcher controls, convoy binding, finite identities, disjoint tokens, shared report replay/cooldown, original recipients and HQ cleanup
PASS: actual finite convoy supply pool; immutable slots, shared demand state, sparse/capped discovery and permanent shutdown
PASS: actual HQ rotates finite donors, skips unavailable/contacted trucks, uses delivered reports and dispatches at most one trip per planning cadence
PASS: actual original turret identity, native/canonical guards, scoped maximum-skill profile, reset, dismount/reboard, requested-skill preservation and restoration
PASS: bounded HQ startup/memory windows and outcome-specific full-route deadlines
PASS: explicit escape-route skips only administrator stress, preserving original full-fixture wait/failure paths
PASS: normal escape route keeps ordinary catalog and generated placement; historical selectors remain unchanged
PASS: actual patrol fixture leaves prison before responder HQ proof, followed by separate permanent-patrol observation
PASS: exact patrol-hq finite responder preparation and native search-radius receipt verification
PASS: actual read migrates old valid settings, preserves explicit disabled state, rejects invalid data; next-round feedback and fixed menu remain honest
PASS: actual automatic convoy timing/authority/admission/one-attempt/manual-task/stop policy; native deployment unproved
PASS: late authoritative failure reason refreshes open result; detach, mode change and success subscriptions preserved
infantry resupply actual rules, radio transitions, owned cleanup and unresolved-operation tests passed
PASS: actual resupply Roster preserves permanent release, original slot mapping and bounded ownership
PASS: actual designated zero/one original carrier selection, settled startup, shared finite claims, no refund after submission
PASS: actual HQ startup grant readiness forwarding is authoritative and fail-closed
PASS: actual finite PMN4 designated-zero/one entitlement, pinned original ownership, shared commit, physical custody, callback quarantine/deletion and no retry
PASS: actual bounded empty-return and finite delivery; phase-isolated callbacks, exact ownership proof, stop quarantine and original actor/vehicle boundaries
PASS: actual shared finite identity reservation; competing consumers, submission permanence, stale cleanup and96-item bound
PASS: actual carried-mounted swap, shared committed claim, physical slot reach, exact two-way proof, uncertainty and terminal cleanup
PASS: actual mounted pickup, exact finite ownership, pre-submission commit, physical custody, bounded callback and quarantine lifecycle; no native coverage claim
PASS: actual mounted courier admission, radio, individual orders, two-stage transfer, reboarding, token cleanup and quarantine lifecycle
PASS: actual scoped crew permit and native board completion/failure preserves foreign seats without teleport fallback
PASS: actual shared mounted stock/history ownership, atomic exact HQ pair claim, and bounded stopped-owner proof polling
PASS: actual carried/mounted early ammunition policy and status-first shared uplink; complete threshold, phases, cooldown, failures requested check-ins and non-urgent detached carried-mine status
PASS: actual group radio startup preservation, finite native grants, callback quarantine, frozen selection/actor ownership and bounded observation
PASS: actual maintenance native-stock check rejects missing/duplicate/wrong-identity/unowned/depleted/malformed stock and is read-only; native runtime not executed
..................
----------------------------------------------------------------------
Ran 18 tests in 0.266s
OK
PASS: actual radio node rejects current incapacitation, death, ownership and faction changes despite cached inventory; one-second capability refresh remains explicit
PASS: Southern finite maintenance stock preserves weapons/clues and optional transport, historical Western fixture stays separate; native capacity/consumption untested
PASS: optional transport deferred behind required readiness, bounded once-only spawn/omission, isolated cleanup, occupied-candidate retention and required-default preservation
PASS: actual diagnostic fallback runs only on failed missing-context call, derives unique native pilot door, preserves stock eligibility and restores prior index on success/failure; diagnostics mutate no game state.
PASS: actual native-prelude cleanup restores only original changed damage, refuses stale/incapacitated/aboard teleport; bounded five-seat/four-door fixture wiring checked. Native execution remains pending.
PASS: actual CreateTransport requires successful scoped Configure after handbrake, preserves ordinary vehicles, tracks spawned entity before failures and never treats failed lock registration as ready.
PASS: actual preparation Configure guards/idempotence/breach preservation, security eligibility/final current-body server mutation and all scoped action guards; all five seat/four door resource overrides. Native hold, prefab merge, replication and boarding remain unverified.
PASS: production vehicle alarm single trigger/replica completion/no replay, fixed deadline/readiness wait, failed audio, dedicated server, moving exact handle, destruction/native end/deletion/clock and mission teardown. Native sound and multiplayer delivery require engine qualification.
PASS: production alarm emitter/receiver original time/location, explicit native queue only, 32-entry cap, 50m local witness eligibility, bound perception, native-super preservation; actual engine broadcast/hearing remains unverified.
PASS: actual optional candidate barrier, exact callback/custody proof and unchanged mine/primary snapshots; no native transfer claim
Native finite mine-stock runner: parser, scope, exclusions and command pass
PASS: actual bounded native mounted proof/detached payload/deadline/cleanup methods, production-only setup and isolated runner selector
PASS: actual one-existing-convoy candidate readiness, sender-root identity, incomplete cargo refusal and fixed three-candidate bound
PASS: actual BMP capture requires complete armed exact original resource; pinned delivery/slot checks and isolated CLI flag
PASS: actual opt-in pre-unlock isolation refuses wrong mode/phase/flag and existing hunters; no baseline service changes
PASS: actual once-only native dry query, exact before/after slots, native refusal, shutdown; shared bounded discovery and distinct opt-in verdict
PASS: actual completion selector and pre-cleanup variant capture preserve separate radio and eligibility verdicts
PASS: actual cargo diagnostic stages separate absent/foreign magazines, used/empty/invalid rounds, well mismatch and exact truck storage/attachment without mutation
PASS: actual native courier witness rejects missing radio/custody/swap/reboard evidence; CLI opt-in bounded; native success remains unqualified
PASS: actual courier constructor/Tick waits for preparation, returns before physical checks, preserves fixed deadline and sticky stop/failure; Enfusion startup awaits native verification
PASS: actual arranged native alarm fixture deadline, single emit, natural-route observation, original timestamp/area/detail assertions, natural observer proximity/activation wait, failure cleanup and independent canonical-body restoration; native delivery itself remains unqualified.
PASS: actual convoy cover observation/snapshot/uplink/HOLD/RESUME/cleanup transitions; native boundaries mocked, non-convoy runner opt-in refused
Enemy optics actual-service ownership, preservation, callback, deadline and bounded-inspection policies passed
PASS: actual delivered cover freshness/lineage/replay and canonical executor; owned waypoint-only hold, one resume at preserved route index, invalid ownership/crew/ledger refusal and fail-closed native recreation
PASS: actual Stinger show/set/help state precise actor-roll effects; read-only help, bounded values, malformed syntax and failed-save preservation; no rerolls/gameplay edits and no native persistence claim
PASS: new/retasked search and radio delivery ammo gates; active tasks and delivered release preserved
HQ convoy delivered-report planning and downlink regressions passed
PASS: actual own-inventory ammo inspection deduplicates loaded/carried/shared wells, separates chambers/launchers, freezes scalar snapshots and treats unsupported/capped/foreign inventory as unknown
PASS: actual carried PMN4 inventory, original-owner guards, bounded deduplication, independent unknown state and detached counts
PASS: actual mounted hierarchy sampling, ownership exclusion, deduplication, completeness/caps, quarter threshold and detached validation; no runtime policy or ammunition mutation
PASS: WORKBENCH opt-in diagnostics distinguish cycles/cap/storage/manager/mount failures without repeated native traversal
PASS: actual HQ original convoy-root admission rejects wrong force/server/group and never supplies replacement lookup
PASS: production mounted structural seat scan ignores >128 carried/cargo descendants, shares exact native mount/magazine ownership, preserves attachment seats and exact occupants, rejects unknown/cyclic/oversize structures; native binding still requires qualification.
PASS: native body fixture uses existing immutable actors, real production LOS/queued uplink, pre-delivery isolation, actual status overlap, bounded cleanup and no fabricated reports/spawns
PASS: actual native fixture lookup selects exact BODY kind/identity/message from bounded evaluations, never sighting-only Get
PASS: actual ammo snapshot comparison checks every scalar/category flag; native probe requires real roster rescan, loaded-round lower bound and separate immutable pending/Watch objects
PASS: actual delivered slot-union bodies preserve overlap/disjoint evidence, replay idempotence, status subset integrity, full-wipe closure and formation-local bounds
test_review_added_allowed_media_invalidates_snapshot (__main__.ReviewTests.test_review_added_allowed_media_invalidates_snapshot) ... ok
test_review_added_source_directory_rejected (__main__.ReviewTests.test_review_added_source_directory_rejected) ... ok
test_review_loose_root_resource_and_symlink_rejected (__main__.ReviewTests.test_review_loose_root_resource_and_symlink_rejected) ... ok
test_review_metadata_media_and_sidecars_remain_allowed_and_bound (__main__.ReviewTests.test_review_metadata_media_and_sidecars_remain_allowed_and_bound) ... ok
test_review_missing_link_rejected (__main__.ReviewTests.test_review_missing_link_rejected) ... ok
test_review_package_guard_sees_new_scripts (__main__.ReviewTests.test_review_package_guard_sees_new_scripts) ... ok
test_review_retargeted_private_link_rejected (__main__.ReviewTests.test_review_retargeted_private_link_rejected) ... ok
----------------------------------------------------------------------
Ran 7 tests in 0.076s
OK
PASS: actual report methods reproduce old starvation; status-first scheduler delivers check-ins and requires 30s without combat or actual visible contacts before negative reports
PASS: actual actor group lookup retains controlled character membership when seated/inherited vehicle agents differ; missing control or parent refuses
E.EEEEE..EEE.EEEE
======================================================================
ERROR: test_cache_tampering_cannot_relabel_changed_payload_as_unchanged (__main__.ExternalPackageTests.test_cache_tampering_cannot_relabel_changed_payload_as_unchanged)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 137, in test_cache_tampering_cannot_relabel_changed_payload_as_unchanged
self.prepare()
~~~~~~~~~~~~^^
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
self.authored=n.copy_payload(self.root,self.session)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
with destination.open('xb') as output:
~~~~~~~~~~~~~~~~^^^^^^
OSError: [Errno 122] Disk quota exceeded
======================================================================
ERROR: test_context_only_passed_to_ai_and_chat_in_full_build (__main__.ExternalPackageTests.test_context_only_passed_to_ai_and_chat_in_full_build)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 165, in test_context_only_passed_to_ai_and_chat_in_full_build
code,summary,calls=self.run_double(args,result)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 59, in run_double
code=n.run(args,self.root)
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 500, in run
authored = copy_payload(root, session)
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
with destination.open('xb') as output:
~~~~~~~~~~~~~~~~^^^^^^
OSError: [Errno 122] Disk quota exceeded
======================================================================
ERROR: test_diagnostic_continuation_cannot_ignore_unverified_external_report (__main__.ExternalPackageTests.test_diagnostic_continuation_cannot_ignore_unverified_external_report)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 182, in test_diagnostic_continuation_cannot_ignore_unverified_external_report
code,summary,calls=self.run_double(args,lambda *a,**k:reports.pop(0))
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 59, in run_double
code=n.run(args,self.root)
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 500, in run
authored = copy_payload(root, session)
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
with destination.open('xb') as output:
~~~~~~~~~~~~~~~~^^^^^^
OSError: [Errno 122] Disk quota exceeded
======================================================================
ERROR: test_diagnostic_continuation_stops_on_mid_batch_external_mutation (__main__.ExternalPackageTests.test_diagnostic_continuation_stops_on_mid_batch_external_mutation)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 175, in test_diagnostic_continuation_stops_on_mid_batch_external_mutation
code,summary,calls=self.run_double(args,result)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 59, in run_double
code=n.run(args,self.root)
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 500, in run
authored = copy_payload(root, session)
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
with destination.open('xb') as output:
~~~~~~~~~~~~~~~~^^^^^^
OSError: [Errno 122] Disk quota exceeded
======================================================================
ERROR: test_exact_profiles_expose_only_reviewed_six_not_workshop_parent (__main__.ExternalPackageTests.test_exact_profiles_expose_only_reviewed_six_not_workshop_parent)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 76, in test_exact_profiles_expose_only_reviewed_six_not_workshop_parent
self.prepare()
~~~~~~~~~~~~^^
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
self.authored=n.copy_payload(self.root,self.session)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
with destination.open('xb') as output:
~~~~~~~~~~~~~~~~^^^^^^
OSError: [Errno 122] Disk quota exceeded
======================================================================
ERROR: test_external_payload_change_cannot_qualify_after_clean_native_exit (__main__.ExternalPackageTests.test_external_payload_change_cannot_qualify_after_clean_native_exit)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 129, in test_external_payload_change_cannot_qualify_after_clean_native_exit
self.prepare();pak=self.source/ext.DIRECT[0]/'data.pak'
~~~~~~~~~~~~^^
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
self.authored=n.copy_payload(self.root,self.session)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
with destination.open('xb') as output:
~~~~~~~~~~~~~~~~^^^^^^
OSError: [Errno 122] Disk quota exceeded
======================================================================
ERROR: test_missing_native_exit_or_failed_cleanup_remain_disqualifying (__main__.ExternalPackageTests.test_missing_native_exit_or_failed_cleanup_remain_disqualifying)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 157, in test_missing_native_exit_or_failed_cleanup_remain_disqualifying
self.prepare();report=self.native_double(write_status=False,cleanup=False)
~~~~~~~~~~~~^^
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
self.authored=n.copy_payload(self.root,self.session)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
with destination.open('xb') as output:
~~~~~~~~~~~~~~~~^^^^^^
OSError: [Errno 122] Disk quota exceeded
======================================================================
ERROR: test_native_clean_exit_binds_before_after_external_fingerprints (__main__.ExternalPackageTests.test_native_clean_exit_binds_before_after_external_fingerprints)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 118, in test_native_clean_exit_binds_before_after_external_fingerprints
self.prepare();report=self.native_double()
~~~~~~~~~~~~^^
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
self.authored=n.copy_payload(self.root,self.session)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
with destination.open('xb') as output:
~~~~~~~~~~~~~~~~^^^^^^
OSError: [Errno 122] Disk quota exceeded
======================================================================
ERROR: test_native_helper_rejects_missing_or_wrong_context_before_creating_profile (__main__.ExternalPackageTests.test_native_helper_rejects_missing_or_wrong_context_before_creating_profile)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 92, in test_native_helper_rejects_missing_or_wrong_context_before_creating_profile
self.prepare()
~~~~~~~~~~~~^^
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
self.authored=n.copy_payload(self.root,self.session)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
with destination.open('xb') as output:
~~~~~~~~~~~~~~~~^^^^^^
OSError: [Errno 122] Disk quota exceeded
======================================================================
ERROR: test_policy_mutation_or_deleted_input_cannot_qualify (__main__.ExternalPackageTests.test_policy_mutation_or_deleted_input_cannot_qualify)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 141, in test_policy_mutation_or_deleted_input_cannot_qualify
self.prepare();path=self.context['policy_path']
~~~~~~~~~~~~^^
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
self.authored=n.copy_payload(self.root,self.session)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
with destination.open('xb') as output:
~~~~~~~~~~~~~~~~^^^^^^
OSError: [Errno 122] Disk quota exceeded
======================================================================
ERROR: test_relinked_private_dependency_fails_without_altering_installed_inputs (__main__.ExternalPackageTests.test_relinked_private_dependency_fails_without_altering_installed_inputs)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 146, in test_relinked_private_dependency_fails_without_altering_installed_inputs
self.prepare()
~~~~~~~~~~~~^^
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
self.authored=n.copy_payload(self.root,self.session)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
with destination.open('xb') as output:
~~~~~~~~~~~~~~~~^^^^^^
OSError: [Errno 122] Disk quota exceeded
======================================================================
ERROR: test_unchanged_external_inputs_do_not_suppress_native_errors (__main__.ExternalPackageTests.test_unchanged_external_inputs_do_not_suppress_native_errors)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 153, in test_unchanged_external_inputs_do_not_suppress_native_errors
self.prepare();report=self.native_double(error='RESOURCES (E): retained upstream localization error')
~~~~~~~~~~~~^^
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
self.authored=n.copy_payload(self.root,self.session)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
with destination.open('xb') as output:
~~~~~~~~~~~~~~~~^^^^^^
OSError: [Errno 122] Disk quota exceeded
======================================================================
ERROR: test_unrelated_addon_wrong_link_and_whole_tree_link_are_refused (__main__.ExternalPackageTests.test_unrelated_addon_wrong_link_and_whole_tree_link_are_refused)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 110, in test_unrelated_addon_wrong_link_and_whole_tree_link_are_refused
self.prepare();profile=self.profile('core');records=n.expose_external('core',profile,self.steam,self.context)
~~~~~~~~~~~~^^
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
self.authored=n.copy_payload(self.root,self.session)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
with destination.open('xb') as output:
~~~~~~~~~~~~~~~~^^^^^^
OSError: [Errno 122] Disk quota exceeded
----------------------------------------------------------------------
Ran 17 tests in 3.118s
FAILED (errors=13)
Traceback (most recent call last):
File "/tmp/erri-medical-ui-2223/run-suite.py", line 33, in <module>
try:module.check()
~~~~~~~~~~~~^^
File "/home/jakub/devel/escapistsrereintroduced/tools/check.py", line 92, in check
subprocess.run([sys.executable,str(ROOT/'tests'/name)],check=True)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/tmp/erri-medical-ui-2223/run-suite.py", line 24, in track
try:result=original(args,*a,**kw)
~~~~~~~~^^^^^^^^^^^^^^
File "/usr/lib/python3.14/subprocess.py", line 578, in run
raise CalledProcessError(retcode, process.args,
output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['/usr/bin/python3', '/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py']' returned non-zero exit status 1.
PASS: 37 prefabs have unique saved root entity IDs
PASS: 299 original script entries tracked across 18 unfinished responsibilities
PASS: 1 isolated addons, acyclic dependencies, 60 unique resources, exact vanilla/authorized external references
Suite exit 1 programs 135 unchanged True