Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
12 KiB
Body recovery preparation and diagnostics — 29 September 2026
The three reviewed RKS2 rounds delivered 1, 5 and 7 distinct body sightings to HQ. All 13 created recovery requests and logged a team spawn, but none logged recovery-team HQ registration, a body-search order, search progress, inspection completion or returned document intelligence. In the latest round the third team appeared roughly 62 seconds after the first, consistent with the existing 60-second preparation deadline freeing a slot. The old logs do not identify the failed preparation gate; this timing is supporting evidence, not proof of a particular spawn or radio failure.
Source logs are retained in .local/analysis/rks2-latest-2026-09-29/. The relevant journal sessions are 1790684624-1, 1790685066-2 and 1790688156-1. Counts use the numbered event records only, not their human-readable duplicates.
Changes
- Successful spawn requests no longer inherit the 30-second retry delay intended for unsuccessful placement. The group is activated and pinned immediately, each arriving native member is pinned through an agent-added callback, and preparation is polled on the next service tick.
- If no soldier has ever spawned, the original empty group can retry its original native spawn request after ten seconds, at most twice. Pending requests are purged before retrying. An agent-added callback remembers even a soldier who dies or disappears between service ticks, preventing retries from replenishing casualties. Partially spawned teams are not refilled by this retry.
- Preparation success, failure and mission stop retire queued spawn intent. They disable automatic spawning, clear the remaining prefab slots and purge the native queue, retaining existing physical soldiers. Completed/released teams also release their LOD pins.
- Reuse requires a team that completed preparation and HQ registration. Previously a failed preparation with surviving soldiers could be reused directly in the order stage, despite never being registered with HQ. Missing teams now end explicitly instead of silently triggering replacement creation. Navigation reassignment resets the radio-preparation owner and releases the previous team's pins.
- Every recovery request has a job ID and originating casualty/message identity. Events distinguish a requested team from a prepared team, a delivered search order, a completed local inspection and an inspection report received by HQ.
- Waiting logs include the current stage, reason, roster counts, expansion state, faction, positions, elapsed time and spawn attempts. They cover placement/capacity, roster expansion, physical radio fitting, unavailable downlinks/uplinks, combat pauses and refused inspections. Unchanged reasons repeat at most every 30 seconds; changed reasons appear immediately. Movement diagnostics use a separate timer.
- All terminal paths now log a reason. Successful returned document intelligence also logs the affected site IDs before defensive-security selection, which separately logs whether a suitable force/radio route exists.
The physical search requirements remain: a living eligible searcher within three metres, ten uninterrupted seconds without a perceived combat target, native visibility/inventory checks, then a delivered radio report before HQ learns about missing documents or the corpse becomes eligible for cleanup. At that revision, the eight-team lifetime allowance and two-active-team limit remained in force. The 13 October update below increases both limits.
Validation and limits
The baseline native run successfully completed one ordinary recovery. This demonstrates that the original path was not universally broken and does not reproduce the unknown live-server cause. Evidence: baseline.
An intermediate fault-injection run selected the only manpack carrier as its victim, breaking the body report before recovery was reached. It was stopped and preserved as a fixture diagnostic, not counted as a recovery regression. The fixture now preserves a living native manpack witness and places a non-radio victim nearby. Evidence: fixture diagnostic.
The focused air-logistics --body-recovery-only fixture deliberately refuses the initial recovery spawn request. Production must retry the same group, spawn three to five actual soldiers, inspect a native corpse with an actually removed issued document, and deliver the missing-site report through the real radio path. It also verifies that spawn intent was retired and only one team wave was used. The fixture is Workbench-only.
tests/test_body_recovery_lifecycle.py executes the actual production retry, retirement, completion, reuse and logging-throttle method bodies with engine-boundary doubles. It checks bounded retries, no casualty refills, cancelled pending spawn intent, delivery-gated intelligence, ownership/reuse boundaries, separate diagnostic throttles and LOD release. Existing inspection, body-observation and readable-journal tests cover the unchanged physical and knowledge boundaries.
python3 tools/check.py passed in full, including the new lifecycle and updated journal regressions. git diff --check passed. The full repository-check output is retained locally at /tmp/erri-body-recovery-check.log.
Final native run: /tmp/erri-body-recovery-fixed2/logs/logs_2026-09-29_18-07-58, archived in native evidence. All five assertions and the completion marker passed, with no script/runtime failures. The runner confirmed cleanup and unchanged addon/external sources. The same 13 pre-existing asset/localization/property errors remain, so the strict report exits nonzero; this is not a clean release-validation claim.
The journal demonstrates the full chain on one original team:
| World time | Observed event |
|---|---|
| 97.4 s | Delivered body sighting creates job 1; fixture refuses its initial queue request. |
| 98.4 s | New diagnostics show zero agents, incomplete expansion, and the original request pending. |
| 107.5 s | Production retries the same empty group, attempt 2/3. |
| 109.5 s | Three native soldiers and a physical manpack are ready and registered, about 12 seconds after the request. |
| 114.5 s | Radio-delivered order starts the search; nearest soldier is 29.344 metres from the corpse. |
| 137.5 s | Native local inspection completes and identifies one missing document/site. |
| 142.6 s | Return report reaches HQ; everon-mortar-2 becomes potentially compromised and HQ queues a security order for a group 738 metres away. |
The test demonstrates physical movement/search and a security order being queued, not arrival of that security force. These are local tests; no Workshop publication or AMP deployment is included in this change. The exact cause of the historical server preparation failures remains unproven until the new diagnostics run there.
More search teams and radio-site defence — 13 October 2026
The reviewed 12 October mission completed four of eleven body-inspection jobs. Two jobs reached their 30-minute deadline, two were still active at victory, and three were still queued. Only two teams could work simultaneously; some were walking several kilometres. This update increases capacity and makes returned intelligence about a missing radio-site document cause a larger local defence response.
| Behaviour | Before | Updated rule |
|---|---|---|
| Concurrent body searches | 2 | 4, including teams being prepared or waiting for radio delivery |
| New recovery-team waves per round | 8 | 12; completed eligible teams can still be reused |
| Recovery spawn-request ceiling | 32 | 48, with the existing 254-force-record gate |
| Missing radio-site document | One nearby idle squad | Two-thirds of eligible nearby infantry squads, rounded up |
| Other missing site documents | One nearby idle squad | Still one squad |
Radio defence starts only after a team physically inspects a body, detects a missing issued document identifying that radio site, and delivers its inspection report to HQ. A body sighting alone, a queued inspection, or a player reading a document cannot trigger it. The site remains potentially compromised for 30 minutes after the latest delivered report.
HQ selects the nearest available infantry squads whose delivered status positions are within 2.5 km of the radio and whose status reports are at most two minutes old. For example, six eligible squads produce four defence orders. Squads already assigned or awaiting orders, permanent home guards, units fighting, support/logistics crews, occupied vehicle crews and squads reported out of small-arms ammunition are excluded. Existing radio guards continue their own defence. Selection does not use players' discoveries or positions.
Each reinforcement receives an ordinary physical radio downlink and a native Defend waypoint. Squads spread around the radio at standable points 120–220 m from its center, separated by at least 60 m from other reserved defence points. Each position selection has at most 24 terrain candidates. If terrain or communications prevent a dispatch, HQ tries another available squad and rechecks the site after 30 seconds. Orders last up to ten minutes and cannot outlive the known compromise window; continued concern can lead to another defence assignment after expiry.
Both queued and delivered defence assignments count toward the two-thirds target. Repeated checks therefore do not progressively recruit the remaining third, and a pending squad cannot be assigned to two sites. Existing defence assignments are retained until their normal expiry or loss of eligibility. Fixed site defence is accounted separately from the pursuit/investigation limit, so HQ does not immediately release the new defenders merely because its mobile-response budget is full. Existing mounted responses still count toward that mobile budget.
SITE SECURITY QUEUED logs each squad, reported distance, defence point and quota progress. SITE SECURITY STATUS logs the site's target, committed squads and new orders every security pass. Recovery status and capacity-wait messages show the new four-active/twelve-wave limits.
This increases the possible active recovery force by two teams, normally around six to ten additional soldiers for three-to-five-person rosters. The higher lifetime allowance can leave additional surviving teams on the island. Radio defence reallocates existing infantry; it does not spawn extra defenders. Long walking routes and difficult final approaches can still delay body searches; this capacity change does not introduce transport or teleportation.
Validation uses production-method tests with native boundaries substituted. The new radio-defence regression exercises quotas, repeated passes, nearest selection, unavailable radio routes, terrain refusal, separated positions, task expiry, protected duties, simultaneous site requests and independent response accounting. Existing delivered-task tests verify that site defenders survive pursuit-capacity trimming but still release when their force becomes ineligible. Native playtesting remains blocked by the previously observed installed-addon manifest mismatch; this update has not been deployed to the server.
Validation result for this update: all 41 focused regression programs passed, covering body recovery, HQ selection/ownership/delivery, mounted response budgets, intel inspection and the preceding hunter changes. Local results are in .local/body-security-tests.json. git diff --check passed for the edited files. The full python3 tools/check.py run still stops at the pre-existing civilian-traffic assertion expecting m_CivilianTraffic.Tick(now) directly in ServerTick; existing code moved it into ServerTickMeasured. The full suite is not claimed to pass.