Skip to content

WASPSCALE V2 Telemetry Reference

rayswaynl edited this page Jul 3, 2026 · 2 revisions

WASPSCALE V2 Telemetry Reference

Source-verified on 2026-07-03 against origin/claude/build84-cmdcon36@5fca3239069a5eff6335f06fecb26bb72e8c9ceb.

WASPSCALE|v2 is the server RPT scale/performance snapshot emitted from the AI commander supervisor. It is a sibling stat family to AICOMSTAT, SRVPERF, GRPBUDGET, HCDELEG, HCSTAT, PLAYERSTAT and WASPSTAT; parsers should route it by its own prefix instead of folding it into AICOM event telemetry.

Emitter And Cadence

The emitter lives in Missions/[55-2hc]warfarev2_073v48co.chernarus/Server/AI/Commander/AI_Commander.sqf:893-988, inside the server-global SRVPERF throttle. It fires once per roughly 300 seconds, regardless of which side's commander loop reaches the block first.

The main cost is one allUnits pass per window to bucket live AI by side and count human players. Other appended fields are cheap reads from state already maintained elsewhere: towns, side logic posture variables, missionNamespace counters, public patrol registries, TEL refs, territorial victory clocks, cached group counts, the HC fps registry and oilfield state.

fpsmin is fed by the small in-loop sampler at AI_Commander.sqf:167-173. The 300-second emit consumes wfbe_fpsmin_acc and resets it at :969-970, so fpsmin is the low server fps seen during the window, not the instant diag_fps sample.

Wire Format

WASPSCALE|v2|<elapsedMin>|tier=<n>|players=<n>|AI_W=<n>|AI_E=<n>|AI_GUER=<n>|AI_TOT=<n>|groups=<n>|fps=<n>|map=<worldName>|build=<tag>|hc_fps=<n>|townsW=<n>|townsE=<n>|townsG=<n>|postW=<mode>|postE=<mode>|disp=<n>|arrv=<n>|recov=<n>|mhqrel=<n>|patr=<n>|sort=<n>|telW=<0|1|2>|telE=<0|1|2>|terr=<none|W:n|E:n>|fpsmin=<n>|hc2fps=<n>|grpW=<n>|grpE=<n>|oilOwn=<-|W|E|G|N>[!]|oilInc=<n>

The v2 contract is append-only. The base v2 fields keep the original order through hc_fps; cmdcon42 v2-EXT fields append after that. Consumers must treat appended keys as optional because older Build 86/cmdcon logs can carry only the base v2 shape.

Base Fields

Field Meaning Source
tier Current WFBE_PopTier population tier. missionNamespace getVariable ["WFBE_PopTier",0]
players Human units from the emitter's allUnits pass. isPlayer count
AI_W, AI_E, AI_GUER, AI_TOT Non-player live AI buckets by side plus total. Same allUnits pass
groups Current count allGroups at emit time. Server global group count
fps Rounded instant server diag_fps. Server RPT sample
map worldName. Current terrain
build Cached short build tag parsed from missionName, preferring the cmdcon... token. A2-safe toArray/toString scan in AI_Commander.sqf:904-923
hc_fps Minimum fresh HC fps report, or -1 when no HC report is fresh. WFBE_HCFPS_REG, reports age out after about 120 seconds

Server/PVFunctions/HCStat.sqf:20-34 updates WFBE_HCFPS_REG from each HC's existing 60-second stat payload, then emits the separate HCSTAT|v1|<name>|fps=...|units=...|groups=...|t=... line at :36.

V2-EXT Fields

Field Meaning Notes
townsW, townsE, townsG Town ownership counts by sideID 0/1/2. Collected in one towns pass.
postW, postE Current side-logic wfbe_aicom_strat_mode. ? if a side logic is absent.
disp Cumulative assault dispatches. Incremented in AI_Commander_AssignTowns.sqf:757.
arrv Cumulative assault arrivals. Incremented in AI_Commander_AssignTowns.sqf:105.
recov Cumulative server-local recovery actions. Incremented by Common_RunCommanderTeam.sqf:985 and Common_AICOM_AutoFlip.sqf:95. HC-local recovery detail still belongs to HC RPT UNSTUCK_FIRED lines.
mhqrel Cumulative AI MHQ relocation deployments. Incremented in AI_Commander_MHQReloc.sqf:551.
patr Active side patrol registry length. count WFBE_ACTIVE_PATROLS.
sort Active town sortie groups. Same towns pass, wfbe_sortie_grp.
telW, telE SCUD TEL state by side. 0 none/feature absent, 1 alive, 2 dead or awaiting respawn while TEL feature is present.
terr Territorial victory clock. none, W:<minutes> or E:<minutes> from WFBE_TERRITORIAL_CLOCK_0/1.
fpsmin Rounded low server fps during the emit window. Consumes and resets wfbe_fpsmin_acc.
hc2fps Maximum fresh HC fps report. With one fresh HC it equals hc_fps; with no fresh HCs both are -1.
grpW, grpE Cached per-side group counts. Reads wfbe_grpcnt_west/east from the group-GC cache, avoiding a second group walk.
oilOwn Takistan oilfield owner state. - absent/pre-unlock, W, E, G, N, with ! suffix when sabotaged.
oilInc Cumulative oilfield income paid this round. -1 absent/pre-unlock.

The oilfield keys are emitted from cheap reads of WFBE_OILFIELD_OWNER, WFBE_OILFIELD_SABOTAGED and WFBE_OILFIELD_INCOME_ACCRUED, which Server/Server_Oilfields.sqf publishes and updates.

Counter Semantics

Treat disp, arrv, recov and mhqrel as cumulative counters. Useful soak KPIs come from deltas between samples, such as d(arrv) / d(disp) for arrival conversion, not from absolute values in one line.

Treat towns*, post*, patr, sort, tel*, terr, fps, fpsmin, hc_fps, hc2fps, grp*, oilOwn and oilInc as gauges. Some gauges carry sentinel values: hc_fps=-1 or hc2fps=-1 means no fresh HC report; oilOwn=- and oilInc=-1 mean the oilfield feature is absent or not unlocked yet; terr=none means no territorial clock is active.

Parser Contract

Tools/Soak/analyze_soak.py owns the current offline parser contract:

  • RE_SCALE at :253-255 matches WASPSCALE|v2|<tick>|....
  • The parser reads key/value fields into self.scale at :446-486, using missing-key defaults so base v2 logs remain valid.
  • scale_ext_summary() at :717 returns present=False when no v2-EXT field is present.
  • The report renderer's WAR STATE section at :1083 derives arrival conversion, recovery/MHQ deltas, town trajectories, posture, patrol/sortie/group gauges, TEL alive percentages and territorial-clock samples.

At this base, analyze_soak.py stores the base fields plus v2-EXT fields through grpE. oilOwn and oilInc are present in raw WASPSCALE|v2 RPT lines, but downstream tooling must add explicit parser fields before those values appear in structured JSON/report output.

Tools/Soak/README.md:59-131 classifies WASPSCALE|v2 as a server RPT performance family and uses it for the PERF section: server fps, HC fps, AI_TOT, GUER load and fps-at-peak-AI checks.

Reading Cautions

  • Do not parse WASPSCALE as AICOMSTAT; it has its own prefix and schema.
  • Do not assume v2-EXT keys exist in older logs. Use key/value parsing with defaults.
  • Do not treat hc2fps as a literal second HC slot. It is the maximum fresh HC fps, while hc_fps is the minimum fresh HC fps.
  • Do not treat recov as the full recovery universe. It is the server-visible recovery counter; HC-delegated recoveries also need HC RPT lines.
  • Do not compare raw cumulative counter values across different match starts. Use deltas within one match.
  • Do not read fps alone as the low-fps signal. fps is instantaneous; fpsmin is the per-window floor.

Continue Reading

Sidebar

Clone this wiki locally