Skip to content

WASPSCALE V2 Ext Coverage Gap Audit

rayswaynl edited this page Jul 3, 2026 · 1 revision

WASPSCALE V2 Ext Coverage Gap Audit

Source-verified on 2026-07-03 against origin/claude/build84-cmdcon36@573023228807a83121579126555f3206c76ebb72.

This page is the lane 300 audit of the WASPSCALE|v2 extended fields emitted by AI_Commander.sqf and the current Tools/Soak/analyze_soak.py parser coverage. It is a companion to WASPSCALE V2 Telemetry Reference, not a replacement.

Current Finding

The prompt snapshot for this lane was stale for several fields. Current analyze_soak.py already parses and reports the cmdcon42 v2-ext fields through grpE: town ownership, AICOM posture, dispatch/arrival counters, recovery, MHQ relocation, patrols, sorties, TEL state, territorial clock, server fps floor, second-HC fps and side group counts.

The remaining source-visible parser gap is the oilfield pair:

  • oilOwn is emitted from all three maintained AI_Commander.sqf mirrors, but is not parsed into self.scale, war_state_ext, text output or JSON.
  • oilInc is emitted from all three maintained mirrors, but is not parsed into structured output.
  • Tools/Soak/sample_build86.rpt contains only the base WASPSCALE|v2 shape through hc_fps, so it does not smoke-test the optional v2-ext parser block.

A synthetic v2-ext sample with all fields confirmed the current JSON contains perf.fpsmin, perf.hc2fps and war_state_ext values through grpE, while oilOwn and oilInc disappear from output.

Source Anchors

Emitter:

  • Missions/[55-2hc]warfarev2_073v48co.chernarus/Server/AI/Commander/AI_Commander.sqf:930-994 documents and emits the v2-ext fields.
  • The maintained Takistan and Zargabad mirrors contain the same oilOwn / oilInc emit line at their AI_Commander.sqf:982-994 blocks.
  • fpsmin is fed by the sampler at AI_Commander.sqf:166-173 and consumed/reset in the v2-ext block.
  • disp, arrv, recov and mhqrel read missionNamespace counters bumped by AssignTowns, recovery and MHQ relocation code paths.
  • oilOwn / oilInc read WFBE_OILFIELD_OWNER, WFBE_OILFIELD_SABOTAGED and WFBE_OILFIELD_INCOME_ACCRUED, which are owned by Server/Server_Oilfields.sqf.

Analyzer:

  • Tools/Soak/analyze_soak.py:37-44 documents v2-ext fields only through grpE; the oilfield pair is missing from the docstring.
  • Tools/Soak/analyze_soak.py:451-486 parses base v2 plus v2-ext fields through grpE into self.scale.
  • Tools/Soak/analyze_soak.py:689-714 turns fpsmin and hc2fps into PERF min/median/max values.
  • Tools/Soak/analyze_soak.py:717-809 derives war_state_ext from v2-ext fields through grpE.
  • Tools/Soak/analyze_soak.py:1055-1135 renders fpsmin, hc2fps and the WAR STATE section.
  • Tools/Soak/analyze_soak.py:1279-1284 exports perf.fpsmin, perf.hc2fps and war_state_ext to JSON.
  • Tools/Soak/README.md:100-131 describes the scorecard and PERF section, but does not call out the oilfield keys.

Coverage Matrix

Field Emitter meaning Parser status Current KPI/output Priority
townsW, townsE, townsG Town counts by sideID 0/1/2 from one towns pass. Parsed as optional ints. war_state_ext.towns*; text prints first, peak and last town trajectory. Covered
postW, postE Side logic wfbe_aicom_strat_mode. Parsed as optional strings. Last posture and distinct posture count per side in WAR STATE. Covered
disp, arrv Cumulative assault dispatch and arrival counters. Parsed as optional ints. Delta arrival rate from cumulative counters in WAR STATE and JSON. Covered
recov Cumulative server-visible recovery actions. Parsed as optional int. recov_run delta in WAR STATE and JSON. Covered
mhqrel Cumulative AI MHQ relocation deployments. Parsed as optional int. mhqrel_run delta in WAR STATE and JSON. Covered
patr Active side-patrol registry length. Parsed as optional int. Min, median and max active side patrols. Covered
sort Active town sortie groups. Parsed as optional int. Min, median and max active sorties. Covered
telW, telE SCUD TEL state: 0 absent, 1 alive, 2 dead or awaiting respawn. Parsed as optional ints. TEL alive percentage by side. Covered
terr Territorial victory clock: none, W:<mins> or E:<mins>. Parsed as optional string. Active sample count and last seen clock. Covered
fpsmin Lowest server FPS sampled in the 300-second emit window. Parsed as optional float, -1 filtered out. PERF min, median and max server fps floor; JSON perf.fpsmin. Covered
hc2fps Maximum fresh HC FPS report, paired with hc_fps minimum. Parsed as optional float, -1 filtered out. PERF min, median and max HC2 FPS; JSON perf.hc2fps. Covered
grpW, grpE Cached WEST/EAST group counts from server group GC. Parsed as optional ints. Min, median and max groups per side in WAR STATE. Covered
oilOwn Oilfield owner state: -, W, E, G, N, with ! suffix when sabotaged. Not parsed. No text or JSON output. P1
oilInc Cumulative oilfield supply income paid this round, -1 when absent/pre-unlock. Not parsed. No text or JSON output. P1

Analyzer Extension Ranking

  1. P1: Parse and expose oilOwn / oilInc. Add both keys to the self.scale.append dictionary. Extend scale_ext_summary() with an oilfield subsection: last owner, owner transition count, sabotaged sample count, income first/last/delta and absent/pre-unlock sample count. Render it under WAR STATE and include it under war_state_ext JSON.

  2. P1: Add a v2-ext fixture. Add a small fixture line that includes every field from townsW through oilInc. The current sample_build86.rpt is still valuable for base-v2 compatibility, but it cannot catch regressions in optional v2-ext parsing.

  3. P2: Update analyzer docs after the oil parser lands. Add oilOwn and oilInc to the analyze_soak.py docstring and Tools/Soak/README.md scorecard description so operators know the oilfield state is available in JSON and text output.

  4. P3: Add optional compare-json deltas for v2-ext fields. war_state_ext already appears in JSON, but the comparison table focuses on headline KPIs. Future comparisons could include arrival rate from disp/arrv, recov_run, mhqrel_run, fpsmin, hc2fps and oil income delta.

  5. Done: No parser work is needed for terr, fpsmin, hc2fps or grpW / grpE on the current target. These fields are already parsed and surfaced. Future work should preserve their optional-key behavior for old logs.

Compatibility Notes

  • Treat all v2-ext keys as optional. Base WASPSCALE|v2 logs through hc_fps are still valid and should yield war_state_ext.present=false.
  • Use deltas for cumulative counters: disp, arrv, recov, mhqrel and future oilInc income runs.
  • Keep fps and fpsmin separate. fps is instant server FPS at emit time; fpsmin is the low server FPS over the emit window.
  • Keep hc_fps and hc2fps separate. Current semantics are min fresh HC FPS and max fresh HC FPS, not fixed HC slot 1 and slot 2.
  • Preserve oil sentinels: oilOwn=- and oilInc=-1 mean the oilfield is absent or not unlocked yet; oilOwn=W! means WEST owns it while sabotaged.

Suggested Build Lane

A focused follow-up can touch only Tools/Soak/analyze_soak.py, Tools/Soak/README.md and a soak fixture:

  1. Parse oilOwn as a string and oilInc as an optional int.
  2. Add oil_last, oil_owner_changes, oil_sabotaged_samples, oil_income_run and oil_absent_samples to scale_ext_summary().
  3. Render an oilfield line in WAR STATE only when at least one oil key is present.
  4. Add JSON fixture coverage for a sample with oilOwn=W!|oilInc=250.

Continue Reading

Sidebar

Clone this wiki locally