Skip to content

AI Commander B69 Improvement Roadmap

Claude edited this page Jun 23, 2026 · 11 revisions

AI Commander (AICOM) Improvement Roadmap — B69

Produced 2026-06-22 by a multi-agent fleet audit of the live B68 AI commander on the Chernarus mission. Source-of-truth tree: Missions/[55-2hc]warfarev2_073v48co.chernarus/. All findings verified against live B68 source; every recommended change respects the A2-OA-1.64 / no-sim-gating / never-freeze / antistack-untouched / total-AI-flat-or-down constraints.

Current Branch Status

2026-06-22 current-head refresh: origin/claude/b69@8d465fce is now the B69 branch head after merged PR #51, with first parent b8530477 and second parent 70a1c808. The isolated diff from B68 head b8a1505f..8d465fce is 44 files / +3203 / -239 across B69-IMPLEMENTATION-PLAN.md, current Chernarus and maintained Vanilla/Takistan. The PR #51 delta b8530477..8d465fce is one current Chernarus AI commander file / +5 / -1, with no maintained Vanilla/Takistan diff. gh pr list --head claude/b69 --state all still returned [] on 2026-06-22, so current B69 remains branch-integration evidence, not a direct master-target PR or stable/release proof.

2026-06-22 PR #47 merged-head addendum: origin/claude/b69-finalpieces@80d3267c1b2b is now an ancestor of origin/claude/b69@0094647d7b64. The merge delta 0a1ccb4d05c5..0094647d7b64 is the same finalpieces set, 8 Chernarus AI commander/client files / +242 / -13 with no maintained Vanilla diff. This is now B69-head evidence, not an open stacked PR and not a master/stable route.

2026-06-22 PR #48 B71-harvest addendum: origin/claude/b69@4dcc10b143a0 now also carries claude/b71-pr-harvest@9cad74c4b6d3. The merge delta 0094647d7b64..4dcc10b143a0 is 6 Chernarus files / +40 / -13 with no maintained Vanilla diff. This is now B69-head evidence for harvested PR #40 marker/FPS residuals, faction vehicle-tint side resolution and a bounded random-position water loop; it is not master/stable or maintained Vanilla proof.

2026-06-22 PR #49 B72-tints-on addendum: origin/claude/b69@39eed5c0 now also carries claude/b72-tints-on@7e1026ea. The merge delta 4dcc10b143a0..39eed5c0 is one current Chernarus constants file / +1 / -1 with no maintained Vanilla diff. This flips WFBE_C_VEHICLE_TINTS from nil-guard default 0 to 1 at Common/Init/Init_CommonConstants.sqf:795; the comment still carries the older default-off / in-engine cosmetic-check caveat, so this remains smoke-pending branch evidence.

2026-06-22 PR #50 Takistan AICOM port addendum: PR #50 merged claude/tk-aicom-port@3b1106a1 into claude/b69 at b8530477ce4f8cc66c60a5d310a85d25c9cbc27c on 2026-06-22T13:33:48Z. The merge delta 39eed5c0..b8530477 is 22 maintained Vanilla/Takistan files / +2499 / -147. It ports the B69/B59-B72 AICOM route into Missions_Vanilla/[61-2hc]warfarev2_073v48co.takistan, including AICOM constants at Common/Init/Init_CommonConstants.sqf:630-652,691-700, the supervisor compile/spawn/watchdog at Server/Init/Init_Server.sqf:58-67,1015-1057, GUER air-defense launch and worker at Init_Server.sqf:789-795 plus Server/Server_GuerAirDef.sqf:37-58,72-76,243-252, client marker/PV support at Client/Init/Init_Client.sqf:494-496 and Client/PVFunctions/HandleSpecial.sqf:52-67, and the same nil-guarded HC top-up caveat in AI_Commander.sqf:228-238. This corrects the old "no maintained Vanilla propagation" status for current B69, but it still needs generated-diff review and Arma smoke before release wording.

2026-06-22 PR #51 B73 troop-truck addendum: PR #51 merged claude/ch-truck-fix@70a1c808 into claude/b69 at 8d465fcede7fc20a7fcb97bd7d02e5211de8d1bf on 2026-06-22T14:03:51Z. The merge delta b8530477..8d465fce is one Chernarus AI commander file / +5 / -1. Chernarus AI_Commander_Teams.sqf:414-418 now gates the B66 pure-infantry troop-truck prepend on WFBE_C_AICOM_ARMED_TRANSPORT_ONLY <= 0, preventing unarmed empty trucks when Common_RunCommanderTeam refuses them under armed-transport-only mode. No maintained Vanilla/Takistan file changed in PR #51, so this guard still needs propagation review and Arma smoke.

Item Branch evidence Status
HQ-strike order/gate/picker core Chernarus anchors remain Init_CommonConstants.sqf:229-231 plus AI_Commander_Strategy.sqf:530-539,547,561-565,576; current B69 also ports the maintained Vanilla/Takistan constants at Common/Init/Init_CommonConstants.sqf:649-652 and the AICOM strategy worker in PR #50. Source-present on current B69 8d465fce in Chernarus and maintained Vanilla/Takistan. Still not master/stable proof; needs review, generated-diff inspection and HQ-strike Arma smoke before release wording.
Capture-phase interrupt Chernarus anchors remain Init_CommonConstants.sqf:232 and Common_RunCommanderTeam.sqf:709-712,810,867,895,916; PR #50 ports the Takistan interrupt constant at Init_CommonConstants.sqf:652 and Common_RunCommanderTeam.sqf. Source-present on current B69 in both maintained roots. Needs capture/HQ-strike smoke and a master-target route before release wording.
Supervisor resilience and cadence Chernarus anchors remain Init_CommonConstants.sqf:375-380, AI_Commander.sqf:28,36,119 and Init_Server.sqf:1017-1044; PR #50 ports the Takistan supervisor compile/spawn/watchdog at Server/Init/Init_Server.sqf:58-67,1015-1057. Source-present on current B69 in both maintained roots. Smoke no false restarts, no duplicate supervisor loops, induced stale-heartbeat restart and worker de-correlation before release wording.
Posture / relief / MP hardening Chernarus anchors remain Init_CommonConstants.sqf:364,367,371-383, AI_Commander_Strategy.sqf:424-436,603-640, AI_Commander_MHQReloc.sqf:228-257 and AI_Commander_Teams.sqf:124-128; PR #50 ports the corresponding Takistan AI commander workers and constants. Source-present on current B69 in both maintained roots. Needs Arma smoke, tuning review and master/stable routing before release wording.
Bootstrap stipend and HC-team metadata AI_Commander.sqf:184-216 runs the 0-town bootstrap stipend on the active gate rather than the _canBuild gate. AI_Commander_Teams.sqf:498-507 appends template index and pad class to the delegate-aicom-team payload; PR #50 ports the Takistan workers. Stipend hoist and metadata scaffolding are source-present on current B69 in both maintained roots. HC merge/top-up remains caveated because the draft worker is still only nil-guarded and not proven compiled/live.
B69 finalpieces / PR #47 route PR #47 merged claude/b69-finalpieces -> claude/b69 at 0094647d7b641bb79202e77e7f480d6d39aadcdb; PR #50 later ports the relevant current B69 AI commander/client pieces to maintained Vanilla/Takistan at b8530477; PR #51 advances current Chernarus troop-truck guard evidence at 8d465fce. B69 branch evidence only. Use it to review finalpieces inside current B69; do not treat it as master/stable or smoke proof.
Town-punch and armed transport Chernarus anchors remain Init_CommonConstants.sqf:389-390,404, AI_Commander_AssignTypes.sqf:166-167, AI_Commander_Teams.sqf:330,335-336,414-418 and Common_RunCommanderTeam.sqf:416; PR #50 ports the Takistan constants at Init_CommonConstants.sqf:691-698 plus the worker/function files, while PR #51 adds a Chernarus-only guard so the B66 pure-infantry troop-truck prepend does not run when WFBE_C_AICOM_ARMED_TRANSPORT_ONLY > 0. Core tuning/filter evidence is source-present in both maintained roots, but the B73 lingering-truck guard is Chernarus-only until propagated. Smoke team composition, troop-transport behavior, armed-transport-only fallback cases and no lingering empty trucks before release wording.
Stranded survivor merge and HC merge scaffolding Chernarus anchors remain Init_CommonConstants.sqf:394-400, AI_Commander_Produce.sqf:122,127-128,156, HandleSpecial.sqf:57,59 and AI_Commander.sqf:232-238; Takistan carries the same default-off merge gate at Client/PVFunctions/HandleSpecial.sqf:52-67 and nil-guarded top-up call at AI_Commander.sqf:228-238. AI_Commander_HCTopUp.DRAFT.sqf is present, but Init_Server.sqf:58-67 still does not compile WFBE_SE_FNC_AI_Com_HCTopUp. Stranded merge scaffolding is source-present on current B69 in both maintained roots. HC merge/top-up remains default-off draft scaffolding and is not proven compiled/live.
Client/HQ fall QoL and spectacle Server_OnHQKilled.sqf:57,103 adds base-fall smoke and a BaseFallSting broadcast; LocalizeMessage.sqf:11 consumes the sound-only message. Client_EndGame.sqf:71, client_title_capture.sqf:42 and GUI_Menu_Tactical.sqf:468 add victory outro FX, capture-bar town name and fast-travel arrival confirmation; PR #50 ports the same Takistan file families. Current B69 branch UX/FX additions now exist in both maintained roots, but still need default-policy review and in-engine smoke before release wording.
B71 harvest / PR #48 route PR #48 merged claude/b71-pr-harvest into claude/b69 at 4dcc10b143a0. The original merge delta was 6 Chernarus files / +40 / -13. Source anchors include map-gated town markers, terrain-grid fallback, faction tint side resolution and bounded water-reject loops; PR #50 ports the matching Takistan file families including updatetownmarkers.sqf, Init_Client.sqf, Common_CreateVehicle.sqf, Common_AddVehicleTexture.sqf and Common_GetRandomPosition.sqf. Current B69 branch evidence now includes maintained Vanilla/Takistan propagation for these file families. Smoke map-open/SpecOps supply cue behavior, profile terrain-grid persistence/default and water-heavy random-position callers before release wording.
B72 tints-on / PR #49 route PR #49 merged claude/b72-tints-on into claude/b69 at 39eed5c0. The PR #49 merge delta was one Chernarus file / +1 / -1; current B69 also has maintained Vanilla/Takistan WFBE_C_VEHICLE_TINTS = 1 at Common/Init/Init_CommonConstants.sqf:629, preserved through PR #50. Branch-only cosmetic default flip across current B69 maintained roots. Smoke vehicle spawn appearance across WEST/EAST/GUER/civilian hulls before release wording.

How this was produced

  • 701 agents total across a broad 9-lens pass (41 candidates kept after a 3-vote adversarial panel) and a deep 12-lens blind-spot pass (37 candidates kept after a 5-vote panel), then a full finisher (consolidated synthesis + completeness critic + an A2-OA-safe SQF implementation sketch for all 78 verified items).
  • 96 open AICOM items harvested from other agents' wiki work were folded into the deep pass (see Provenance below) and de-duplicated against what already shipped in B66–B68.
  • Loop-until-dry discovery, then adversarial verification (code-reality / A2-OA-safety / constraints / novelty / implementability).

TL;DR

B69's spine is FINISHING AI-vs-AI rounds. The only round-ender, the HQ strike, is verified dead on live B68 for three independent reasons that must ship as ONE package: (1) ORDER CONTRACT - HC strikers (100% of live teams) get a 'towns-target' order so they capture the town nearest the enemy HQ instead of assaulting it; the relief path already proves a 'defense'-mode SAD-at-pos is the fix. (2) GATE - the strike required a hard literal > 8 owned towns instead of scaling against count towns, so it was dead or badly tuned whenever the live town count/mode did not match that literal. (3) PICKER - the force is chosen by raw alive body count, so it always sends infantry and never the MBT/attack-heli punch. Shipping any one without the others mis-fires (wrong objective, or an infantry-only rush at a fortified base). All three are small, FPS-neutral (re-task existing teams, zero unit-count change), and form the de-duplicated HQ-STRIKE FINISHER theme. The completeness-critic correctly flags that ~90% of the verified slate is town-target selection while the map's own HIGHEST-severity items had no kept candidate; the deep pass (deepKept) now supplies them, so B69 balances the finisher against four structural gaps: HC-team units-bleed (live teams dribble to ~4-5 vs the 8-12 policy because HC-founded teams are never refilled), supervisor has no watchdog/heartbeat (one uncaught error silently kills a side's brain for the whole round - the top unattended-soak risk), the garrison-vs-maneuver strength split (the real root of the 'dominant-but-passive' stall, since garrison bodies deflate maneuver strength and are never released to offense), and lockstep worker scheduling (both sides' economy workers fire in one frame on an FPS-bound box). A second tier hardens the maneuver/MP layer (relief reliever-strength gate, MHQ re-drive/unstuck, pending-slot timeout reaper, bootstrap-stipend hoist) and a third is pure unattended-soak insurance (HQSite lock timeout, arty-scan throttle, orphaned-constant centralization). Every recommended key is a real verified key; all respect A2-OA 1.64 constraints, publicVariable-is-not-JIP-durable timeouts, no sim-gating/no-freeze, antistack untouched, and AI count flat-or-down (the HC merge and stranded-survivor merge are net FPS-DOWN). The HC units-bleed fix should ship as a same-HC depleted-team MERGE (fewer+bigger groups) rather than a refill, to keep total AI flat-or-down.

B69 recommended slate (15)

# Item Theme tier Provenance
1 Fix HQ-strike order so HC strikers actually assault the enemy HQ instead of capturing the nearest town broad/3-vote
2 Make the HQ-strike town gate a fraction of total towns, not the old hard literal 8 broad/3-vote
3 HQ-strike force is selected by raw alive body count, so it always picks infantry and never commits MBT/attack-heli teams (the actual punch) broad/3-vote
4 Make the blocking capture phase honor a fresh order seq + disband flag (break out of the camp/depot while-loops on re-task) broad/3-vote
5 Stamp wfbe_teamtype (and a refill pad-class) on every HC team at founding so any refill/merge pass can resolve it deep/5-vote
6 Add a same-HC depleted-team MERGE pass (fewer+bigger, group-count DOWN) as the FPS-preferred alternative to refill deep/5-vote
7 Per-tick heartbeat stamp at the top of the supervisor loop (the signal a watchdog needs) deep/5-vote
8 Standalone server watchdog that re-Spawns a dead/wedged per-side supervisor deep/5-vote
9 Credit held territory in the PRESS/DEFEND posture gate so the dominant side keeps attacking deep/5-vote
10 Phase-jitter the two per-side supervisors at spawn so both sides' economy workers never share a frame deep/5-vote
11 Relief picks the nearest team with no strength check — a 1-2-man remnant gets sent to relieve a town under full assault broad/3-vote
12 Re-issue doMove every monitor tick + add a sub-window unstuck nudge so the MHQ stops stranding mid-route broad/3-vote
13 Add a pending-founding-slot timeout reaper so a lost HC dispatch ack can't pin founding below target forever broad/3-vote
14 Move the 0-town bootstrap stipend off the build-grace gate so a brief human blip can't starve a broke AI for 300s broad/3-vote
15 Instrument the STALL/POSTURE telemetry with held-town garrison body count to size the split correctly deep/5-vote

Themes

[medium] HQ-strike finisher (the only round-ender, dead on live) - ship order + gate + picker as ONE tight package

Subsystem: strategic-targeting / Strategy.sqf + RunCommanderTeam.sqf

Five broad candidates and two deep candidates all describe the SAME three changes (order-contract swap to 'defense'-mode SAD-on-HQ, town gate as a fraction not the literal 8, picker weighted to MBT/attack-heli with a per-team size floor). De-duplicated into one theme because the critic flagged the HQ-strike appearing in five near-duplicate forms. The three core fixes are interdependent: gate-without-order launches a strike that captures the wrong objective; order-without-picker sends an infantry-only rush at a fortified base. Effort is small per fix but the package is medium. The deep additions (staging-rally to stop the piecemeal trickle, time-to-enemy-away window) are optional polish layered on the same code path and should ship only after the core three are validated. FPS-neutral: re-tasks existing teams, zero unit-count change. A2-OA-safe: a one-token order-mode swap plus count/select-based picker ranking, no A3 commands.

Item What it changes Impact Effort Prov Rec
Fix HQ-strike order so HC strikers actually assault the enemy HQ instead of capturing the nearest town Change the HC strike order at AI_Commander_Strategy.sqf:544 from mode "towns-target" to mode "defense" at getPos _enemyHQ. The "defense" branch in Common_RunCommanderTeam.sqf (the if (_mode == "defense") path at :668) runs a HOLD-SAD at the… high small broad/3-vote
HQ-strike sends HC teams a 'towns-target' order so they capture the town nearest the enemy HQ instead of assau… Change the HC strike order at AI_Commander_Strategy.sqf:544 from mode "towns-target" to "defense" (keeping getPos _enemyHQ as the pos), so the strikers run the SAD-at-pos seek-and-destroy at the enemy HQ — engaging base defenders and able t… high small broad/3-vote
HQ-strike HC teams attack the nearest TOWN, not the enemy HQ — switch the strike order to 'defense'-mode SAD o… In AI_Commander_Strategy.sqf:544 change the HC strike order mode from 'towns-target' to 'defense' (keeping pos = getPos _enemyHQ). The HC driver's 'defense' branch (Common_RunCommanderTeam.sqf:668-669) lays a real SAD,100m,COMBAT/RED/WEDGE … high small broad/3-vote
Make the HQ-strike town gate a fraction of total towns, not the hard literal 8 (it never fires on the live 7-t… Add a constant WFBE_C_AICOM_HQSTRIKE_TOWN_FRAC (default 0.45) in the AICOM block of Init_CommonConstants.sqf, nil-guarded like its siblings. In AI_Commander_Strategy.sqf just before line 513 compute _strikeMinTowns = ceil((count towns) * (m… high small broad/3-vote
HQ-strike town gate is a hardcoded >8 owned towns, so the round-ending strike never fires on reduced-town lobb… Add a nil-guarded constant in the AICOM block of Init_CommonConstants.sqf: WFBE_C_AICOM_HQSTRIKE_TOWN_FRAC = 0.5. In AI_Commander_Strategy.sqf just before line 511 compute _strikeMin = round((count towns) * (missionNamespace getVariable ["W… medium small broad/3-vote
HQ-strike force is selected by raw alive body count, so it always picks infantry and never commits MBT/attack-… In the strike picker (AI_Commander_Strategy.sqf:528-538) compute a punch score instead of raw alive count: _score = _alive; then if the team owns a crewed combat vehicle (scan units _team: any unit u with vehicle u != u AND (vehicle u) isKi… high small broad/3-vote
HQ-strike picks teams by raw body count — it never sends armour/attack-heli and can commit 2-man scraps; rank … In the strike picker (AI_Commander_Strategy.sqf:528-538): (1) compute a punch score per candidate = alive-count + a vehicle bonus when the team owns a non-transport Tank or non-transport attack Helicopter (reuse the exact A2-OA classname te… high medium broad/3-vote
Weight the HQ-strike picker toward armour/attack-heli teams and raise the per-team alive floor In the strike picker loop (AI_Commander_Strategy.sqf:530-538): compute a punch score per candidate instead of raw _alive. Detect a vehicle team A2-safely: _isVehTeam = false; { if (!_isVehTeam && {alive _x} && {(vehicle _x) != _x} && {((veh… medium small broad/3-vote
HQ-strike accepts 2-man remnants (floor of 1) onto a cross-map base rush, wasting the strike and bleeding the … Add WFBE_C_AICOM_HQSTRIKE_MIN_ALIVE = 6 to Init_CommonConstants.sqf (AICOM block). In the picker, require a candidate INFANTRY team to have _alive >= that floor before it is eligible (initialise _bestN = WFBE_C_AICOM_HQSTRIKE_MIN_ALIVE - 1,… medium small broad/3-vote
HQ-strike: stage strikers at a forward rally and release the final assault only once a body-count threshold is… In the HQ-hunt block (Strategy.sqf ~518-548), compute a RALLY pos once: a point on the segment from the side HQ toward _enemyHQ at a standoff distance behind the HQ (new const WFBE_C_AICOM_HQSTRIKE_RALLY_STANDOFF, default 800m short of _ene… high medium deep/5-vote
HQ-strike timing: only commit the strike while the enemy's maneuver force is AWAY from its own HQ (exploit kno… Compute a cheap _enemyHomeDefenders count once per tick: iterate _enemyLogik getVariable ["wfbe_teams",[]], and for each alive enemy team whose (leader _x) distance _enemyHQ is within a new constant WFBE_C_AICOM_HQSTRIKE_AWAY_RADIUS (… medium small deep/5-vote

[larger] HC-team units-bleed - stamp teamtype at founding, then MERGE depleted pairs (fewer+bigger, FPS-down)

Subsystem: hc-refill-merge / Strategy.sqf founding + new HC consumer

The #1 documented gap-to-policy across three clusters: 100% of live teams are HC-founded and NEVER refilled, so team size dribbles to ~4-5 vs the 8-12 policy. The merge path (same-HC depleted-team MERGE + stranded-survivor merge-before-cull) is the FPS-PREFERRED form because it is net group-count DOWN and keeps total AI flat-or-down, unlike refill which can inflate count. Prerequisite is stamping wfbe_teamtype at founding so any merge pass can resolve the team. The SendToClient consumer (route to the OWNING HC, not a broadcast RequestSpecial) and central tunables are the wiring. Larger because it spans founding, a new HC-side consumer, and the publicVariable-is-not-JIP-durable handshake (the consumer route needs a timeout). A2-OA-safe via typeName/count/select; respects no-freeze (merged units keep their orders).

Item What it changes Impact Effort Prov Rec
Stamp wfbe_teamtype (and a refill pad-class) on every HC team at founding so any refill/merge pass can resolve… Two small additive changes that ship safely on their own (default behaviour unchanged): (1) In AI_Commander_Teams.sqf, after the team is registered (in the aicom-team-created case, Server_HandleSpecial.sqf:215-237, where the team OBJECT exi… high small deep/5-vote
Add a same-HC depleted-team MERGE pass (fewer+bigger, group-count DOWN) as the FPS-preferred alternative to re… Add a server-picked, HC-executed merge pass (a second consumer case "aicom-team-merge" in Client/PVFunctions/HandleSpecial.sqf, OR fold into the topup worker as an alternative action). Server side (in the topup worker or a sibling, gated WF… high medium deep/5-vote
Stranded lone-survivor: merge into the nearest healthy same-side server-local team before culling it (preserve… Before the cull at Produce.sqf:121-127, gate on a new const WFBE_C_AICOM_STRANDED_MERGE (default 1): scan _teams for the nearest OTHER same-side team that is (a) non-null, (b) server-local (leader local && !wfbe_aicom_hc via the existing WF… medium small deep/5-vote
Write the missing HC-side aicom-team-topup consumer and route the worker to the OWNING HC via SendToClient (no… Add a case "aicom-team-topup" to Client/PVFunctions/HandleSpecial.sqf (the HC-resident dispatcher): _team = _args select 0; _classes = _args select 1; if (isNull _team // {!local (leader _team)}) exitWith {}; _ldr = leader _team; _sp = _ldr… high medium deep/5-vote
Define the HCTopUp/merge tunables centrally in Init_CommonConstants so the refill knobs are param-tunable and … In the AICOM block of Init_CommonConstants.sqf (next to the TEAM_SIZE_MIN/MAX/FOUND_SIZE trio at 306-315) add isNil-guarded constants matching the surrounding pattern: WFBE_C_AICOM_HC_TOPUP_ENABLE=0 (default OFF), WFBE_C_AICOM_HC_TOPUP_FRAC… low small deep/5-vote

[medium] Supervisor resilience - heartbeat + watchdog restart so a side's brain can't silently die for the round

Subsystem: supervisor-watchdog / AICOM supervisor loop

HIGH-severity and the single highest-value robustness item for unattended overnight soaks: one uncaught worker error kills a side's entire brain for the round with no heartbeat or restart. Three keys form a defense-in-depth chain: per-tick heartbeat stamp at the top of the loop (the signal), a standalone server watchdog that re-Spawns a dead/wedged supervisor (the recovery), and inline worker Call isolation so one worker error can't take down the loop (the prevention). The kept lock-timeout fix only protected the Construction_HQSite wait, not the loop itself - this fills that gap. Server-only, no client surface. publicVariable not involved; the heartbeat is a server-local stamp so JIP durability is moot.

Item What it changes Impact Effort Prov Rec
Per-tick heartbeat stamp at the top of the supervisor loop (the signal a watchdog needs) At the very TOP of the while{!gameOver} loop body (immediately after line AI_Commander.sqf:93 opens the loop, before the _active gate), add one cheap stamp keyed by side ID so the watchdog can read it without resolving the logic each time: … high small deep/5-vote
Standalone server watchdog that re-Spawns a dead/wedged per-side supervisor Add a single server-side watchdog loop, spawned ONCE right after the supervisor spawn at Init_Server.sqf:1015 (e.g. [] Spawn { ... } or a compiled WFBE_SE_FNC_AI_Commander_Watchdog). It does: waitUntil{!isNil 'serverInitFull'}; then while… high medium deep/5-vote
Isolate the inline worker Calls so one worker error cannot kill the supervisor loop (defence-in-depth) Wrap ONLY the two heaviest, construction-touching workers that actually call createVehicle/ExecVM (Base at AI_Commander.sqf:183 and the MHQReloc dispatch at 179) in a child Spawn instead of Call, since they already fork their own Spawn life… medium small deep/5-vote

[medium] Garrison-vs-maneuver strength split - the real root of the dominant-but-passive stall

Subsystem: garrison-maneuver-split / posture gate + STALL telemetry

The critic names this the actual root of the 'dominant-but-passive, telemetry-only' stall: garrison bodies are counted into maneuver strength and never released to offense, so a winning side's _myStr looks low and it stops attacking. Three keys: credit held territory in the PRESS/DEFEND posture gate so the dominant side keeps attacking (the fix), instrument STALL telemetry with held-town garrison body count to size the split correctly (the measurement), and apply symmetric refit/remnant exclusions to enemy strength to remove the anti-self DEFEND bias (the partial mitigation already verified). Instrument-first then act, since the split size is unknown. FPS-neutral. A2-OA-safe count-based reads. Note: town-garrison SIZING itself stays out of scope per the no-touch-antistack/garrison-cap constraints - this only fixes how garrison bodies are ACCOUNTED in the maneuver decision.

Item What it changes Impact Effort Prov Rec
Credit held territory in the PRESS/DEFEND posture gate so the dominant side keeps attacking Add a territory-weighted effective-strength term used ONLY in the posture gate (not in last-stand or HQ-strike). New nil-guarded constant in Init_CommonConstants AICOM block: WFBE_C_AICOM_TOWN_STRENGTH (default 2). In Strategy.sqf just be… high small deep/5-vote
Instrument the STALL/POSTURE telemetry with held-town garrison body count to size the split correctly In the POSTURE/STALL telemetry build, compute a cheap per-side garrison-body count and append it. Sum across owned towns of the live members of each town's wfbe_town_teams: `_garBodies = 0; { if ((_x getVariable "sideID") == _sideID) then… medium small deep/5-vote
Apply the same refit/remnant exclusions to enemy strength as to own strength (remove the anti-self DEFEND bias… Replace the raw _enStr scan at AI_Commander_Strategy.sqf:62-63 with the same exclusion logic used for _myStr, applied to the enemy team list and the enemy HQ. Resolve _enHQ = (_enemySide) Call WFBE_CO_FNC_GetSideHQ; then loop the enemy team… high medium broad/3-vote

[quick_win] Worker phase-stagger - end the lockstep economy-worker frame spike on the FPS-bound box

Subsystem: worker-stagger / per-side supervisor scheduling

A named pure-scheduling, FPS-POSITIVE lead with no kept broad candidate: both sides' supervisors and all heavy economy/telemetry workers fire in lockstep in one frame, an avoidable periodic stall. Phase-jitter the two per-side supervisors at spawn so their workers never share a frame, and offset the heavy CMDRSTAT/COMBATSTAT telemetry block off the very first tick. Pure scheduling change, zero behavior change, zero unit-count change - lowest-risk FPS win in the slate. A2-OA-safe (a spawn-time random offset and a tick-skip). No sim-gating: this staggers WHEN work runs, never gates AI on distance or freezes anything.

Item What it changes Impact Effort Prov Rec
Phase-jitter the two per-side supervisors at spawn so both sides' economy workers never share a frame In AI_Commander.sqf, immediately AFTER the waitUntil {sleep 1; !(isNil "serverInitFull")} at line 23 (i.e. once both sides have been released together), add a one-time per-side phase offset before the main loop: `private "_phaseJitter"; _phaseJitter = ra… medium small deep/5-vote
Stop the heavy per-side CMDRSTAT/COMBATSTAT telemetry block from firing on the very first tick for both sides Give each side a DIFFERENT telemetry first-fire and avoid the boot co-fire by seeding _ltStat per-side instead of the shared -301. Two safe options: (a) seed _ltStat = -301 + (random 120) so the first CMDRSTAT lands 0..120s apart betwee… low small deep/5-vote

[medium] Maneuver-layer hardening - relief triage, capture-phase interrupt, retreat safety

Subsystem: maneuver-retreat / defense-garrison / RunCommanderTeam.sqf

Relief appears in five near-duplicate forms and consolidates to one fix: triage by reliever STRENGTH + ETA/mobility + town value, and let it scale beyond the hard RELIEF_MAX=1 under a coordinated multi-town attack (a 1-2-man foot remnant currently gets the side's only relief slot and answers only one town). Bundled with two correctness/safety fixes that share the capture path: make the blocking capture phase honor a fresh order seq + disband flag so a re-tasked team breaks out of the camp/depot while-loops, and reset the AssignTowns stuck-strike ladder when the wedge-watchdog releases a team. Plus two no-freeze-guardrail items: a behaviour!=COMBAT guard on the retreat-cull deleteVehicle (never delete a survivor mid-firefight) and replacing the doStop camp-plant with a tight doMove / proximity re-wake. capture-phase-seq-interrupt is a prerequisite for any re-task (including the HQ-strike re-task) to actually take effect. A2-OA-safe; no-freeze-compliant by construction.

Item What it changes Impact Effort Prov Rec
Relief picks the nearest team with no strength check — a 1-2-man remnant gets sent to relieve a town under ful… In the reliever-selection forEach (Strategy.sqf:417-429) raise the eligibility gate from alive>0 to a real floor: require ({alive _x} count (units _team)) >= a new tunable WFBE_C_AICOM_RELIEF_MIN_ALIVE (define =4 in Init_CommonConstants.sqf… high small broad/3-vote
Reliever chosen by raw straight-line leader distance ignores mobility — a far MBT/mounted team loses to a near… When ranking relievers (Strategy.sqf:424) replace raw distance with an ETA-weighted effective distance: if the team has a drivable, non-transport land vehicle or is an air team (detect via the same isKindOf 'LandVehicle'/'Air' + alive-drive… medium small broad/3-vote
Triage relief by reliever strength + town value and let it scale when multiple own towns are attacked at once Three changes in the relief block (AI_Commander_Strategy.sqf:405-452): (1) Skip remnant reliever candidates - in the eligible-team test at :419-423 add && {({alive _x} count (units _team)) >= (missionNamespace getVariable ["WFBE_C_AICOM_REL… medium medium broad/3-vote
Allow relief to scale to >1 town under a coordinated multi-town attack via a bounded fraction, instead of hard… Replace the flat cap read with a bounded scale: _reliefMax = (1 max (round (_nAttacked * WFBE_C_AICOM_RELIEF_FRAC))) min WFBE_C_AICOM_RELIEF_MAX_HARD, where _nAttacked = count of own towns currently flagged under attack this tick, WFBE_C_AI… medium medium broad/3-vote
Multi-town defense is unprioritized and capped at one: relief iterates towns in raw order and abandons every c… Before the relief assignment loop, sort _attacked descending by a cheap value key already on the town object — (_x getVariable ['supplyValue',0]) + (_x getVariable ['wfbe_town_value',0]) + hardTier (reuse the 0..4 _hardTier switch already i… high medium broad/3-vote
Relief sends the nearest team by straight-line leader distance regardless of strength or mobility, and answers… In the reliever pick (AI_Commander_Strategy.sqf:417-426): (1) ETA-weight the distance — when a team owns a drivable land vehicle (the existing mounted test used elsewhere), divide its effective distance by a reach factor (e.g. _eff = _d / 2… medium medium broad/3-vote
Make the blocking capture phase honor a fresh order seq + disband flag (break out of the camp/depot while-loop… Add a lightweight order-change abort to each capture-phase loop header. Capture the seq at phase entry (e.g. _capSeq = _seq) and add to each while condition: && {((_team getVariable ["wfbe_aicom_order",[_capSeq]]) select 0) == _capSeq} && {… high medium broad/3-vote
Reset the AssignTowns stuck-strike ladder when the wedge-watchdog releases a team back to towns mode In the wedge-watchdog release block at Strategy.sqf:486-487, add _wTeam setVariable ["wfbe_aicom_stuckstrikes", 0]; (and, for symmetry with how AssignTowns stores it, leave it server-local non-broadcast exactly like AssignTowns.sqf:224 whic… medium small broad/3-vote
Add a behaviour!=COMBAT guard to the retreat-cull deleteVehicle so a far survivor actively fighting is never d… Before the cull branch at 121, compute _inContact = if (isNull _ldr) then {false} else {behaviour _ldr == "COMBAT"}; and gate the cull: change the condition to (_rTries >= _rBudget // {_rIssues >= _rMaxIssues} // {_curDist > _rMaxDist}) && … medium small broad/3-vote
Replace the doStop camp-plant with a tight doMove (or add a player-proximity re-wake) to honor the never-froze… Mirror the depot-hold idiom in the camp-first loop: drop the doStop branch at 845 and instead keep planted units pressing the camp centre with a tight doMove _campTgtPos (the camp hold radius _campHoldR is already ~8m, well inside the 10m s… medium small broad/3-vote

[medium] MHQ relocation reliability - stop stranding, re-validate the final deploy, replace dead defenses

Subsystem: mhq-base / MHQ monitor + Construction_HQSite

The MHQ single-doMove strands mid-route. Consolidated: re-issue doMove every monitor tick plus a sub-window unstuck nudge, sample the route for enemies each tick and de-escalate the driver near contact (don't drive blind into the front), and require a minimum NET forward advance before paying the full mobilize/drive/deploy cost. On arrival, re-validate the FINAL deploy position against the hostile-ring buffer AND friendly-structure spacing. base-defense-replace-destroyed fixes a monotonic placed-counter so destroyed base defenses are actually replaced (count LIVE statics). Two duplicate keys (construction-hqsite-lock-timeout / hqsite-lock-timeout) are the SAME bound on the unbounded wfbe_hqinuse waitUntil - a publicVariable-not-JIP-durable wait that needs a timeout. A2-OA-safe.

Item What it changes Impact Effort Prov Rec
Re-issue doMove every monitor tick + add a sub-window unstuck nudge so the MHQ stops stranding mid-route Inside the existing 5s monitor while-loop (lines 229-262): (a) when not arrived, re-issue (driver _mhq) doMove _destPos every iteration (guard !isNull (driver _mhq)); (b) add a short non-progress sub-window using the already-present _lastCl… high small broad/3-vote
Sample the route for enemies each tick and de-escalate the MHQ driver near contact instead of driving blind to… Add a cheap per-tick contact check inside the 5s monitor loop (lines 229-262), reusing _enemyClear (already in Spawn scope, line 161): _eHit=false; { if (side _x == _enemySide && {alive _x}) then {_eHit=true} } forEach (_mhq nearEntities [[… medium small broad/3-vote
Require a minimum NET forward advance before paying the full mobilize/drive/deploy cost on a relocation After computing each candidate _cand (line 118), accept it only if it advances the base meaningfully toward the front versus the current HQ: require (_hqPos distance _frontPos) - (_cand distance _frontPos) >= WFBE_C_AICOM_MHQ_MIN_ADVANCE (n… medium small broad/3-vote
Re-validate the FINAL deploy position against the hostile-ring buffer AND friendly-structure spacing before re… Before the final Construction_HQSite ExecVM (line 293), add a clearance pass on _finPos reusing idioms already in this file/Base.sqf: (1) hostile-ring check -- forEach towns, if sideID==_enemyID//sideID==_guerID and 2D distance < _ringClear… high medium broad/3-vote
Replace destroyed base defenses: count LIVE statics, not a monotonic placed-counter In the defense block (AI_Commander_Base.sqf:458-488), replace the monotonic _defCount read with a LIVE count of the AI's existing base statics near HQ: scan ((_side) Call WFBE_CO_FNC_GetSideStructures) (or nearestObjects [_hqPos,['StaticWea… high medium broad/3-vote
Bound the unbounded wfbe_hqinuse waitUntil in Construction_HQSite so a stuck lock can't deadlock MHQ toggling Replace the bare waitUntil at Construction_HQSite.sqf:14 with a bounded form that force-claims the lock after a deadline. Before line 14: _hqLockDeadline = time + (missionNamespace getVariable ["WFBE_C_HQSITE_LOCK_TIMEOUT", 20]); then `wa… medium small broad/3-vote
Bound the wfbe_hqinuse lock wait in Construction_HQSite so a stuck lock can't deadlock the mobilize/deploy cha… Replace the bare waitUntil at Construction_HQSite.sqf:14 with a bounded form: private "_lockDeadline"; _lockDeadline = time + (missionNamespace getVariable ['WFBE_C_HQSITE_LOCK_TIMEOUT', 20]); waitUntil {!(_logik getVariable ['wfbe_hqinuse', false]) // time… medium small broad/3-vote

[medium] MP / economy robustness for unattended soaks

Subsystem: mp-robustness / economy-production

Robustness insurance for overnight rotation. The pending-founding-slot timeout reaper is the headline (a lost HC dispatch ack pins founding below target FOREVER - a documented wait-chain-needs-a-timeout violation, and a direct enabler of the units-bleed). The two near-duplicate stipend keys are the same hoist: move the 0-town bootstrap stipend off the _canBuild build-grace gate so a 1-tick human-commander blip can't starve a broke AI for 300s. Plus: refund the AICOM treasury when Server_BuyUnit cancels a queued refill, gate Wildcard free air-platoon cards on live team count vs TOTAL_AI_MAX (keeps AI count flat-or-down), gate the wealth-conversion rich flag on team HEALTH so surplus cash refills thin teams instead of doubling into more dribble (this complements the HC-merge theme), and centralize the orphaned inline economy constants for tunability/rollback-consistency. All small, server-side. A2-OA-safe.

Item What it changes Impact Effort Prov Rec
Add a pending-founding-slot timeout reaper so a lost HC dispatch ack can't pin founding below target forever Reuse the existing wfbe_aicom_pending_since stamp already maintained at Teams.sqf:120-124. At the top of the founding worker (right after _pending is read at :55), if _pending > 0 AND the stamp age exceeds a timeout (e.g. WFBE_C_AICOM_PENDI… high small broad/3-vote
Move the 0-town bootstrap stipend off the build-grace gate so a brief human blip can't starve a broke AI for 3… Hoist the bootstrap-stipend block (the _stipendMaxTime/_stipendTowns/_stipendActive computation through the grant at :249-267, plus the prev-active transition logging at :235-248) OUT of the if(_canBuild){...} body and place it directly und… medium small broad/3-vote
Move the 0-town bootstrap stipend out from under the _canBuild build-grace so a brief human-commander blip can… Lift the bootstrap-stipend block (AI_Commander.sqf:227-267) out of the if (_canBuild) body and place it under the _active gate (HQ alive + enabled) so it runs in both full and assist states, mirroring how updateresources.sqf already kee… medium small broad/3-vote
Refund the AI-commander treasury when Server_BuyUnit cancels a queued AICOM refill In each of the three Server_BuyUnit early-exit blocks (the pre-loop guard at :12, the in-loop guard at :76, the post-wait guard at :107), add an AI-only refund before the exitWith body: guard !isPlayer (leader _team) AND (typeName _side == … medium small broad/3-vote
Gate Wildcard free air-platoon cards (W6 Air Cavalry / W19 QRF) on the side's live team count vs TOTAL_AI_MAX In the W6 (and the analogous W19) eligibility block, before setting _w6Eligible=true, count the side's current live AICOM teams (reuse the wfbe_aicom_hc OR wfbe_aicom_founded count idiom already at AI_Commander.sqf:300-306 over _logik getVa… medium small broad/3-vote
Gate the wealth-conversion rich flag on team HEALTH so surplus cash refills existing thin teams instead of dou… In the _fTeams accumulation loop (AI_Commander.sqf:208-214), only count a team toward _fTeams when it is at/above the size floor — reuse the same alive-count + WFBE_C_AICOM_TEAM_SIZE_MIN logic Produce uses (`({alive _x} count units _x) >= f… medium small broad/3-vote
Define the orphaned inline-default economy constants (RETREAT_HOME_RANGE, RETREAT_MAX_TRIES/MIN_CLOSE, FUNDS_P… Add isNil-guarded definitions in the AICOM block of Init_CommonConstants.sqf matching the surrounding pattern, at the current inline values (zero behaviour change): WFBE_C_AICOM_RETREAT_HOME_RANGE=800, WFBE_C_AICOM_RETREAT_MAX_TRIES=4, WFBE… low small broad/3-vote

[medium] Last-stand & forward-defense dispersion - stop the single massed target

Subsystem: defense-garrison / last-stand recall

Last-stand recalls every team onto a single HQ point and re-moves them every 60s, so teams bunch, block, and present one massed target (the A2-PFM 'teams bunch and block' problem). Disperse via a per-team perimeter/approach arc (laststand-perimeter-dispersion + concentration-arrival-arc-by-lanejit share the same arc-by-team-index mechanic). Allow more emplaced defenders when genuinely in last-stand and funded (DEFENSES_MAX bump), give captured/front towns AI-placed static emplacements, make the capture-hold budget mass-aware (a 6-team concentration currently parks ~12 min on one town), and make Produce fill-to-floor pad a role mix (AT/AR/medic) instead of N rifleman copies. Medium and lower-priority than the finisher; ships after the core. A2-OA-safe; dispersion respects no-freeze (tight doMove arcs).

Item What it changes Impact Effort Prov Rec
Last-stand recalls every team onto a single HQ point and re-issues the move every 60s — teams bunch, block, an… Assign each recalled team a staggered perimeter slot instead of the HQ centroid: compute _ang = (_teamIndex * 360 / max(1,count recalledTeams)) and place the defense pos at _hqPos offset by [ _rsin _ang, _rcos _ang ] with r = a new WFBE medium medium broad/3-vote
Manned base defenses only ring the HQ; captured/front towns get zero AI-placed static emplacements Add a small bounded forward-defense pass in the Base worker (after the HQ defense block, gated identically on a built Barracks + AI funds): once per Base cadence, if the side holds its primary spearhead-adjacent FRONT town (nearest own town… medium medium broad/3-vote
DEFENSES_MAX=4 is fixed regardless of threat — a side genuinely in last-stand cannot field more emplaced defen… Make the effective defense ceiling threat-aware in Base.sqf:458: read defMax as the base WFBE_C_AI_COMMANDER_DEFENSES_MAX, but if the side logic flag wfbe_aicom_laststand (set in Strategy.sqf:74) is true, raise the ceiling to a new WFBE_C low small broad/3-vote
Capture-hold uses a flat 360s budget for BOTH camp-first and depot phases, so a 6-team concentration parks ~12… Make the depot-hold budget mass-aware. In AssignTowns where the per-town quota is computed (AI_Commander_AssignTowns.sqf:296-320), also broadcast the count of teams assigned to this town into the order (extend wfbe_aicom_order with a 4th el… medium medium broad/3-vote
Disperse the depot-hold by a per-team approach arc so 6 massed teams don't bunch on one 40m point Reuse the existing persistent per-team _laneJit ({-1,0,1}, AssignTowns.sqf:385) as a stable approach-bearing seed and give each team a small, distinct FINAL hold offset around the town center instead of stacking on the exact center. (1) In … high medium deep/5-vote
Make Produce FILL-TO-FLOOR pad with a role mix (AT/AR/medic) instead of N copies of the last rifleman, so floo… Replace the single last-Man pick at :227-229 with a small rotating role list resolved once per team: keep the existing last-Man as the default, but if the side's BARRACKSUNITS pool contains an AT/auto-rifleman/medic class (resolved by the s… medium medium broad/3-vote

[medium] Air doctrine - heli CAS loiter / intercept / cannon-nudge targeting

Subsystem: air-doctrine / heli team behavior

A behavioral subsystem the broad panel nearly missed: attack-heli teams march like slow ground teams and park on the depot flag. Make them loiter at a CAS standoff over the spearhead instead, and let idle/over-strength heli teams intercept the enemy's published spearhead. Three cannon-nudge keys (two are exact duplicates - heli-cannon-nudge-target-aware-nearest-threat / heli-cannon-nudge-prefer-nearest-threat-not-first) fix the force-fire that targets nearEntities[0] even a tank, denying the gunner's ATGM: pick the nearest/most-dangerous threat, and on a populated server do NOT force the cannon at a human-crewed Tank/APC (leave the gunner's guided ATGM). Directly feeds the HQ-strike picker (heli teams become real punch). A2-OA-safe (isKindOf for vehicle class, no A3 typed reads). No-freeze: loiter is active flight, not a park.

Item What it changes Impact Effort Prov Rec
Attack-heli teams loiter at a CAS standoff over the spearhead instead of parking on the depot flag In Common_RunCommanderTeam.sqf, at the TOP of the dismount-capture phase (after _townObj/_townCenter resolve, ~line 727), detect a no-infantry team whose ONLY combat vehicle(s) are attack helis: _footInf empty AND every alive vehicle is `… high medium deep/5-vote
Attack-heli cannon-nudge force-fires the cannon at the FIRST entity returned (even a tank), denying the gunner… In the nudge loop (RunCommanderTeam.sqf:148-165): (1) replace the first-match exitWith with a nearest-in-band scan: iterate the nearEntities[["Man","Car","Tank","Air"],_band] result and keep the candidate with the smallest (_h distance _x) … medium small broad/3-vote
Cannon-nudge target picker prefers the nearest/most-dangerous enemy, not nearEntities[0] Replace the exitWith-on-first loop (line 149) with a nearest-pick: iterate the same nearEntities result, track _best=objNull;_bestD=1e9 and keep the alive enemy-side in-band unit with the smallest _h distance _x, then doTarget/doFire on… medium small deep/5-vote
Idle/over-strength attack-heli teams intercept the enemy's published spearhead instead of marching to a town In AI_Commander_AssignTowns.sqf, before the normal town-target assign for a team, add an AIR-INTERCEPT pre-pass gated WFBE_C_AICOM_AIR_INTERCEPT (new const, default 1): if the team is heli-only (every alive vehicle isKindOf "Helicopter", tr… medium medium deep/5-vote
Heli cannon-nudge: do NOT force the cannon at a human-crewed Tank/APC (leave the gunner's guided ATGM); prefer… In the cannon-nudge target resolve (line 149), when the chosen _tgt isKindOf "Tank" OR isKindOf "APC", check whether it is human-crewed: _humCrew = {isPlayer _x} count crew _tgt. If _humCrew > 0 (a player in the armor), SKIP the cannon fo… medium small deep/5-vote

[larger] Realism / smarter-feel behaviors - intel-lite, human-awareness, doctrine, logistics, withdrawal

Subsystem: intel-recon-fog / human-combatant-awareness / doctrine-selection / forward-logistics / graceful-withdrawal

The deep pass fills the qualitative gaps the critic said would make the AI feel smarter rather than incrementally better at town-capture. Grouped as one larger exploratory theme (NOT all for B69): intel-lite (weight enemy strength by HQ-proximity as a cheap fog-of-engagement model, deprioritize towns shielded by a known enemy concentration to flank, last-seen relief fallback); human-combatant awareness (bias spearhead/relief toward fronts where friendly HUMANS fight, keep the MHQ out of human-contested fronts); doctrine selection (replace the 50/50 coin flip with a map+faction-biased pick, bias the second side to counter the first); forward logistics (target self-service at the FORWARD town and cache it, make the detour a graded resupply with ammo cost instead of a free instant snap-repair, optionally dispatch a crewed ammo/repair truck reusing the proven W17 convoy lifecycle); graceful withdrawal (a 'rally' bounding-fall-back order mode + a Strategy-side per-HC-team withdrawal evaluator, since the cull only sees server-local teams); and a closed-loop difficulty governor (cap the low-pop team-flood and de-escalate Wildcard combat cards when the AI is stomping a weak human lobby). High design value but several need in-engine smoke and owner sign-off; ship 1-2 marquee picks in B69, park the rest. All keep AI count flat-or-down (the cap items are net-down); A2-OA-safe; no-freeze.

Item What it changes Impact Effort Prov Rec
Posture strength read: weight enemy maneuver strength by HQ-proximity so a forward enemy reads as the real thr… Replace the flat _enStr sum at 62-63 with a proximity-weighted sum gated behind a new default-OFF constant WFBE_C_AICOM_ENSTR_ENGAGE_WEIGHT (default 0 = exact current behaviour, so it ships inert and A/B-safe). When >0: for each alive enemy… medium small deep/5-vote
Spearhead scorer: deprioritise towns shielded by a known enemy team concentration (exploit omniscience to flan… Once per Strategy tick, BEFORE the scorer loop, build a cheap list of enemy maneuver-team leader positions: iterate the already-fetched _enemyLogik getVariable ["wfbe_teams",[]], and for each non-null group with alive units push `getPos (… high small deep/5-vote
Relief trigger: react to a town bleeding ownership-risk even when wfbe_active misses the raid (close the fog g… Add a per-town supplyValue trend as a SECOND relief trigger. On the side logic, keep a small parallel-array memory wfbe_aicom_town_supply_prev (town + last-seen supplyValue, A2-safe parallel arrays keyed by find, mirroring the spearhead… medium medium deep/5-vote
Spearhead scorer: bias toward enemy/neutral towns where friendly HUMAN players are already fighting (concentra… Inside the spearhead scorer loop (both copies, 184-189 and 312-316), after computing _dNear, add a friendly-human-contest bonus: count friendly (side==_side AND isPlayer) live units within a ring of the candidate town center via (_t nearEnt… high medium deep/5-vote
Relief triage: prioritize relieving own towns that friendly HUMAN players are defending/standing in over empty… Before the relief assignment loop (after _attacked is built at 405-406), sort _attacked so towns with friendly human players present come first. Build _attacked as pairs [town, humanScore] where humanScore = count of (isPlayer _x && side _x… medium small deep/5-vote
MHQ relocation: treat nearby friendly HUMAN players' contact as a route-danger signal (don't creep the base in… In the destination-clearance gate (lines 139-144, where _enemyClear is already checked at _destPos), ALSO defer relocation when a friendly human player is in active contact near the destination: scan `_destPos nearEntities [["Man","Car","Ta… low small deep/5-vote
Replace blind 50/50 doctrine flip with a map+faction-biased weighted pick In AI_Commander.sqf:27, replace the symmetric random 1 > 0.5 with a tunable map-bias weighted roll: add nil-guarded constant WFBE_C_AICOM_DOCTRINE_HF_BIAS (default 0.62 for Chernarus armour terrain) in Init_CommonConstants.sqf alongside t… medium small deep/5-vote
Bias the second side's doctrine to COUNTER the opponent's already-chosen doctrine In AI_Commander.sqf inside the if (isNil {... "wfbe_aicom_doctrine"}) block, BEFORE the random pick: resolve `_enemySide = if (_side == west) then {east} else {west}; _enemyLogic = (_enemySide) Call WFBE_CO_FNC_GetSideLogic; _enemyDoc = "… medium small deep/5-vote
Target the self-service detour at the FORWARD owned town nearest the front and cache the pick, so resupply pul… Two coupled changes in the IDLE branch (Common_AICOMServiceTick.sqf:122-135): (1) Among safe owned towns in reach, prefer the one MOST FORWARD - i.e. the safe owned town with the smallest min-distance to any enemy town (the same front-line … medium small deep/5-vote
Make the self-service detour a graded forward-RESUPPLY (partial repair + ammo cost from supply) instead of a f… Keep the existing detour/abort/timeout machinery untouched (lines 55-145) but change ONLY the arrival-restore block (73-79) into a graded, supply-charged resupply: (1) charge a one-time supply cost via the existing ChangeSideSupply primitiv… high small deep/5-vote
Dispatch a single crewed ammo/repair truck from HQ to the spearhead concentration (real forward resupply) reus… Add a small server-side forward-resupply dispatcher, gated default-OFF behind a new nil-guarded WFBE_C_AICOM_FWD_RESUPPLY_ENABLE (Init_CommonConstants.sqf, default 0). Fire it from the supervisor on a slow throttle (reuse an existing _lt* c… high medium deep/5-vote
Break-off-and-rally trigger inside the depot-hold capture loop (fighting withdrawal instead of grind-to-extinc… 1) At founding (Common_RunCommanderTeam.sqf, right after the team is created ~:66), stamp a self-baselined peak strength: _team setVariable ['wfbe_aicom_peakalive', count _units, true] (and bump it whenever a Produce/topup raises live count… high medium deep/5-vote
New 'rally' order mode in the HC executor: bounding fall-back that fights while withdrawing, never a hold-and-… Add a third mode branch in the fresh-order block (Common_RunCommanderTeam.sqf, mode dispatch around the arrival/road-march at :484-620 and the arrival posture at :668). When _mode == 'rally': (a) lay a MOVE (NOT SAD) waypoint on the rally p… high medium deep/5-vote
Strategy-side per-HC-team graceful-withdrawal evaluator (the cull only ever sees server-local teams; HC teams … In AI_Commander_Strategy.sqf, in the existing per-team forEach that already runs the wedge-watchdog (:460-505), add a graceful-withdrawal pass for HC teams NOT already in relief/strike/rally: read the team's wfbe_aicom_peakalive (stamped at… high medium deep/5-vote
Let the governor cap the low-pop team-flood (PC_LOW=15) when humans are present and the AI is already winning In AI_Commander_Teams.sqf where the PC-bucket target is resolved (around :78-86), after picking the bucket value _target, apply an OPTIONAL governor down-clamp: read _dg = _logik getVariable ['wfbe_aicom_diff_mult', 1.0] (the scalar from ca… medium small deep/5-vote
Make Wildcard losing-side escalation bidirectional: de-escalate combat cards when the AI is dominating humans Extend the escalation block at AI_Commander_Wildcard.sqf:216-218. Keep the existing _losing -> _eMult=2.0 branch. Add a _winning branch gated on a human being present on the enemy side (so pure-AI soaks are unchanged): _winning = (count hum… medium small deep/5-vote

Sequencing risks (ship-order / atomic packages)

  • HQ-STRIKE PACKAGE IS ATOMIC — must ship all three together or regress: (1) the order-contract fix (hqstrike-hc-order-contract / hqstrike-order-mode-defense-not-townstarget — swap 'towns-target' to 'defense'-mode SAD-on-HQ at Strategy.sqf:544 so HC strikers assault the HQ instead of GetClosestEntity-capturing the nearest town), (2) the gate fix (hqstrike-town-gate-fraction / hqstrike-town-threshold-fraction-not-literal8 — make the >8-owned-towns literal a fraction of WFBE_C_TOWNS_AMOUNT=7 so the finisher can fire at all), and (3) the picker fix (hqstrike-picker-weight-vehicle-punch + hqstrike-team-size-floor-exempt-vehicles — rank by MBT/attack-heli punch and floor team size). Shipping the GATE without the ORDER fix launches a strike that captures the wrong objective (worse: now it fires); shipping the ORDER fix without the PICKER hurls an infantry-only 2-man scrap at a fortified base. The five near-duplicate hqstrike-* keys must be DEDUPED into exactly one change per facet before coding or you get conflicting edits to the same Strategy.sqf lines.
  • HC-REFILL CHAIN HAS A STRICT INTERNAL ORDER: hctopup-stamp-teamtype-at-founding MUST land first (it writes wfbe_teamtype at founding) — both hctopup-wire-consumer-on-owning-hc (the refill consumer routed via SendToClient to the OWNING HC, not a broadcast RequestSpecial) and hctopup-same-hc-merge-depleted-pairs depend on that stamp existing to resolve a team's refill pad-class. Shipping the consumer or the merge before the stamp gives every team an unresolved type and the refill/merge silently no-ops. Decide refill-VS-merge before wiring: merge is FPS-DOWN (fewer+bigger groups) and is the preferred lever per the count-discipline mandate; if merge is chosen, the consumer wiring is partly redundant.
  • SUPERVISOR WATCHDOG ORDER: aicom-supervisor-heartbeat-stamp must precede aicom-supervisor-watchdog-restart-loop — the restart loop keys on the heartbeat stamp to detect a dead/wedged supervisor; ship the watchdog without the heartbeat and it has no signal and will either never fire or false-restart a healthy brain. aicom-worker-call-guard-noheartbeat-on-error is defence-in-depth and can ship independently, but ideally with the heartbeat so a guarded worker error still updates the stamp.
  • GARRISON SPLIT BEFORE PRESS-GATE TUNING: territory-credited-press-gate (keep the dominant side attacking) changes posture math that the same strength model feeds; it should be validated AFTER stall-telemetry-add-garrison-bodies is in and read, otherwise you tune the press gate against a strength number that still double-counts garrison bodies as maneuver strength — you will over- or under-press. Land the telemetry, observe one soak, then tune the gate.
  • MHQ RE-DRIVE vs RELOCATION-FLOOR interaction: mhq-redrive-unstuck-nudge (re-issue doMove every tick + unstuck nudge), mhq-min-advance-floor (require net forward gain before paying mobilize/deploy), mhq-final-deploy-clearance-revalidate (re-check hostile-ring + friendly-spacing), and mhq-route-contact-deescalate touch the same relocation lifecycle and the same wfbe_hqinuse lock that construction-hqsite-lock-timeout / hqsite-lock-timeout bound. The two lock-timeout keys are DUPLICATES — pick one. Ship the lock-timeout WITH the re-drive nudge: a more-aggressive per-tick re-drive increases lock contention on Construction_HQSite, so the unbounded-wait fix is a prerequisite, not optional, to avoid a new deadlock.
  • RELIEF TRIAGE KEYS ARE OVERLAPPING DUPLICATES that must be consolidated to avoid contradictory edits to the relief picker: relief-reliever-strength-gate, relief-eta-mounted-reach, relief-strength-and-scaling, relief-multi-town-scale, relief-triage-by-value-and-multi, relief-eta-and-strength-and-scale, and relief-prioritize-human-held-towns all rewrite the same nearest-team selection. Merge into one ETA+strength+value+multi-town+human-bias picker before coding; shipping them as separate edits will thrash the same function.
  • CONCENTRATION CHOREOGRAPHY DEPENDS ON THE CAPTURE-PHASE INTERRUPT: concentration-arrival-arc-by-lanejit, armor-screen-while-infantry-captures, and rally-break-off-depot-hold-attrition-trigger all modify behavior INSIDE the depot-hold capture loop — they require capture-phase-seq-interrupt (honor fresh order seq + disband flag to break the camp/depot while-loops) to land FIRST, otherwise the loop is still blocking and the new arc/screen/rally behaviors can't be re-tasked in mid-hold. Also reconcile with camp-plant-dostop-proximity-rewake so the never-frozen-AI guardrail isn't violated by the new hold behavior.

Residual gaps (post-B69)

  • GARRISON-RELEASE LEVER (root of the 'dominant-but-passive' stall) is still only INSTRUMENTED, not FIXED: deepKept has stall-telemetry-add-garrison-bodies (measure) and territory-credited-press-gate (keep attacking) and the enstr-symmetry fix (broadKept), but there is still NO candidate that actually CAPS a town garrison or RELEASES garrison bodies back into the maneuver _myStr pool. The highest-severity strategy root is measured and posture-nudged but the mechanism that miscounts garrisons as maneuver strength is untouched. harvestTop corroborates via 'Town static-defense HC manning is guerilla/resistance-only; occupied W/E town statics never HC-manned' and 'commander-buildable defense positions branch-only'.
  • HC DELEGATION FAILOVER (the entire Headless-Client wiki cluster) is unrepresented in either kept set, yet it is the dominant unattended-soak robustness surface: Mode-2 HC delegation has no per-function server fallback (groups silently skipped on HC drop), DR-21 (HC disconnect orphans its AI, no re-registration watchdog), DR-42 (HC-created statics invisible to the server, no accounting/cleanup), the racy fixed sleep-20 registration handshake with no ack, and unbounded delegated-group cleanup polls. Since CMDRSTAT shows 100% of live teams are HC-founded, an HC drop mid-round is the single most likely real-world AICOM failure and the supervisor-watchdog candidates (which guard the per-side supervisor loop) do NOT cover delegation/HC-pool recovery.
  • DORMANT/UNCALLED SCHEDULERS surfaced by harvest are not in scope and may invalidate assumptions: AICOM upgrade scheduler has no caller/cadence, AIBuyUnit (unit-production) uncalled, MOVE_INTERVALS movement scheduler orphaned, WFBE_SE_FNC_AI_SetTownAttackPath compiled-but-never-called, AICOM supply-truck FSM permanently broken, and the AICOM upgrade AI_ORDER off-by-one cost-index bug. The fwd-resupply-truck-dispatch-to-spearhead deepKept item reuses the W17 convoy precisely BECAUSE the native supply FSM is dead — but the broken FSM and the uncalled upgrade/production schedulers are left as-is; if any future tech-progression work assumes they run, it will silently no-op.
  • TRUE FOG-OF-WAR is still only APPROXIMATED, not modeled: the recon candidates (enstr-contact-recency-decay = HQ-proximity weighting; spearhead-avoid-enemy-concentration = exploit omniscience to flank; relief-trigger-last-seen-fallback) improve targeting but every strategy read STILL pulls ground-truth off the enemy team registry. No belief/confidence-decay store (harvestTop 'Quad AI Commander: log/intel context store with belief + confidence decay' remains unadopted). This is acceptable for B69 (the kept items exploit omniscience smartly) but the fairness/believability direction is still unbuilt.
  • COMMANDER HANDOFF / DISCONNECT-TO-AICOM TAKEOVER (harvest Commander-HQ-Lifecycle / Vote cluster) is uncovered: commander disconnect clears the side but does NOT auto-reassign or restart a vote, manual-reassignment call-shape + duplicate-notification (DR-15), vote-menu loops iterate one index past the team array, ATTACK_WAVE_INIT is a forgeable direct-PV channel. On a populated/hybrid server these directly affect whether AICOM cleanly retakes a side — relevant given the locked B67 hybrid-takeover re-tasking decision, and none are in the kept set.
  • FIXED-WING AIR and AIR-RECON remain entirely absent — air candidates are all attack-heli (loiter-CAS, intercept, cannon-nudge). No fixed-wing doctrine and no use of air for the recon layer (which would have doubled as the fog-of-war fill). Low priority for B69 but still a whole sub-doctrine at zero.

Owner decisions

  • HQ-strike finisher: ship the three core fixes (order-contract + town-gate-fraction + vehicle-punch picker) as ONE atomic B69-A patch, or stage order+gate first and add the picker after a soak? The package mis-fires if split, but a single combined patch is harder to bisect if a round-ender regresses. Recommend atomic with a single MISSINIT marker.
  • Town-gate fraction value: what fraction of WFBE_C_TOWNS_AMOUNT should arm the strike on the 7-town live config (e.g. >60% owned = strike-eligible)? Needs an explicit threshold you are comfortable with, since this directly controls how often rounds end.
  • HC units-bleed: confirm the MERGE path (fewer+bigger, FPS-DOWN) over a refill/top-up. Merge keeps total AI flat-or-down per the hard constraint, but changes team identity mid-round. Acceptable, or do you want refill-to-floor despite the count pressure?
  • Supervisor watchdog restart: on a re-Spawn after a wedged supervisor, do we re-adopt existing teams in place (preserve bodies) or accept a brief re-registration gap? Re-adopt is safer for the no-freeze guardrail but more code.
  • Garrison-vs-maneuver split is instrument-first this build (stall-telemetry-add-garrison-bodies + territory-credited-press-gate). Are you OK shipping the press-gate territory credit in B69 BEFORE the telemetry has sized the split, or hold the press-gate one build until we have the garrison body-count data?
  • Realism cluster (intel-lite / human-awareness / air-CAS / doctrine / logistics / withdrawal): which ONE or TWO marquee items do you want in B69 to make the AI feel qualitatively smarter? Recommend heli-team-loiter-cas-not-depot-park (feeds the HQ-strike punch) plus enstr-contact-recency-decay (cheap fog model, FPS-neutral). The rest park.
  • Several harvestTop/wiki items (AICOM upgrade scheduler has no caller, AIBuyUnit uncalled, supply-truck FSM broken, dormant attack-path helper, commander map-order executor unproven) are dormant-code findings from other agents that overlap our logistics/doctrine themes but were NOT in the 3-vote/5-vote verified sets. Do you want a separate scoping pass on those, or treat them as out-of-scope for B69?
  • Default posture: harvestTop notes feat/ai-commander flips WFBE_C_AI_COMMANDER_ENABLED default to 1. B69 sharpens AICOM heavily - do you want to keep AICOM opt-in or flip the default on once the finisher is validated?

Critic verdict

B69 IS READY for a focused first ship, and is materially MORE complete than the embedded critic block implies — that critic was written against the broad pass and its "no kept candidate" complaints for the four highest-severity items are now STALE: the deep pass closed them. The HC-team units-bleed (4-5-unit dribble vs 8-12 policy) now has a full shipping chain (deepKept hctopup-stamp-teamtype-at-founding → hctopup-wire-consumer-on-owning-hc → hctopup-same-hc-merge-depleted-pairs → hctopup-centralize-missing-constants). The supervisor round-ending SPOF now has aicom-supervisor-heartbeat-stamp + aicom-supervisor-watchdog-restart-loop + aicom-worker-call-guard-noheartbeat-on-error. The "AI is omniscient / no recon" and "air is just slow ground" qualitative gaps both got real candidates (enstr-contact-recency-decay, spearhead-avoid-enemy-concentration, hqstrike-time-to-enemy-away-window; heli-team-loiter-cas-not-depot-park, heli-cas-intercept-enemy-spearhead). Combined-arms, dynamic difficulty, human-combatant awareness, forward logistics, graceful withdrawal and doctrine selection all moved from zero to covered. RECOMMENDED SHAPE: ship B69 as the strategy spine first (the HQ-strike package + relief/MHQ/MP-robustness from broadKept) because it is the verified root cause of the multi-hour AI-vs-AI stalemates and is small/FPS-neutral; then a fast-follow B69.x for the deep behavioral leads (HC-refill-or-merge, supervisor watchdog, recon/air/choreography) which are higher-effort and benefit from in-engine A2-OA smoke. Do NOT block the spine on the deep cluster. The slate is good enough to finish rounds; it is NOT yet a from-scratch-complete AICOM brain, and one more pass is warranted but it can be POST-B69.

Implementation sketches

A2-OA-safe SQF sketch for every item is on the companion page: AI Commander B69 Implementation Sketches.

Continue Reading

Previous: AI commander autonomy audit | Next: AI commander B69 implementation sketches

Main map: Home | AI route: AI runtime/HC loop map | Status: Progress dashboard

Sidebar

Clone this wiki locally