Gitea #10: systematic gauge-data audit -- 45-row verdict table + findings

docs/GAUGE_COMPOSITE.md gains the AUDIT 2026-07-19 section: every widget on the
6 pod MFD surfaces + the secondary screen + the HUD reticle audited for
binary-correct data (static pass vs decomp + two instrumented live sessions).
Verdicts: 34 CORRECT / 1 WRONG (filed) / 6 AUTH-STATIC / 6 DEFERRED-FEED.

Findings:
A. The 'SYSTEM 10 PPC ammo readout' (entry a) root-caused: header/label/screen
   mapping are CORRECT ([vss] dump == authored sub+0x1dc); the ammo box is a
   GHOST -- stale pixels from the sibling ballistic/sensor page on the shared
   Eng plane, persisting because the port SeekVoltageGraph::Execute is a
   bring-up no-op. In the binary the graph IS the top-box eraser (view =
   (0x97,0x80)-(0x17d,0x13b) @004c6798; clear @004c6be4 on the @004c6920
   activation sentinel) -- ghost-free on the pod. Full reconstruction FILED
   (4 Seek* attrs + vtbl+0x3C sampler + x87 recovery); no erase-only stand-in.
B. HUD attr table @5110c0 conflict (entry b) RESOLVED -- see commit 904c75a.
C. Entry c: no [T3] tags remain in gauges-hud.md; the single [T4]
   (reticlePosition writer) stays flagged.
D. BT_SHOT dock-capture regression found + fixed (commit 904c75a).

Live re-verifications this audit: heat digits climb (515->680 under autofire),
reservoir flush 6->0 (~1s held) + PFX cloud, ammo counter moves (24->19 after
missile autofire), heading 089->120 + speed 0->182 under BT_GOTO, secondary
dama->crit->heat cycle (masks 0x450421/0x490421/0x510421), preset cycles visit
exactly the populated page set (MFD1:1,2,4 MFD2:1-4 MFD3:1,2), mission clock,
Comm 0/0, pips/compass/tape/caret render.

Audit performed by the agent; findings await human review, fixes await human
verification.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
arcattack
2026-07-19 18:33:59 -05:00
co-authored by Claude Fable 5
parent 904c75aff9
commit f1a6ccbaaf
2 changed files with 140 additions and 2 deletions
+10 -2
View File
@@ -7,7 +7,8 @@ related_topics: [reconstruction-gotchas, decomp-reference, subsystems, pod-hardw
key_terms: [gauge, methodDescription, attribute-pointer, GaugeRenderer, MFD, PCC]
open_questions:
- "MessageBoard LIVE 2026-07-12 (kill ticker); remaining: only strip 0 (kill) is produced -- survey the other btsmsgs.pcx strips for authentic producers"
- "HUD binary attr table @005110c0 offsets conflict with the port HUD layout on 3 slots (0x1D8/0x1EC/0x1F8) -- re-dump before publishing"
- "HUD attr table RESOLVED 2026-07-19 (Gitea #10 audit): re-dumped @5110b8 -- the table starts one record earlier (id 3 FlickerRate@0x1D8), every hud.hpp offset was shifted one slot; hud.hpp/CLASSMAP corrected, no behavioral impact (the reticle feeds via port globals). See GAUGE_COMPOSITE.md AUDIT finding B"
- "SeekVoltageGraph reconstruction FILED 2026-07-19 (Gitea #10 finding A): the port Execute is a bring-up no-op, so the emitter/myomer eng pages never erase their top data box (the binary graph IS the box eraser: view=(0x97,0x80)-(0x17d,0x13b), clear @004c6be4 on the @004c6920 activation sentinel) -> stale ammo/sensor ghosts from sibling pages (the 'SYSTEM 10 PPC ammo readout'). Needs: 4 Seek* attrs on Emitter+Myomers, the subsystem vtbl+0x3C sampler, x87 recovery of @004c6934/@004c6c6c/@004c6c30"
- "Secondary-view cycling RESOLVED 2026-07-19 (Gitea #6): the selector is the DISPLAY mode (CycleDisplayMode -> vtbl+0x4C override @4d1ae4), NOT CycleControlMode; desktop 'N' / pad RightThumb wired; pixel-verified dama->crit->heat"
- "Upper-MFD PRESET pages RESOLVED 2026-07-19 (Gitea #9): SetPresetMode table @0051dbf0 re-decoded (little-endian -> ModeMFD bits 0-14), per-MFD pod button banks identified from the .CTL dump, desktop J/K/L cycle wired; remaining: the always-active 0x28-0x2F / 0x1A-0x1D per-subsystem msg-4 records (subs 3-13 -- likely the condenser-valve/coolant buttons) unidentified"
- "MP DEATHS resolved 2026-07-12 (observed-death tally + display clamp); remaining: verify multi-death tallies stay in sync across a long session (GAUGE_COMPOSITE.md)"
@@ -19,6 +20,11 @@ The pod's cockpit instruments: the secondary MFD (radar/heat/comm), the 5 mono M
engineering screens. Full map + per-widget history in **`docs/GAUGE_COMPOSITE.md`**. **The gauge
system is COMPLETE** at the registration+binding level: all 50 config attribute bindings resolve
(0 NULL) and every config gauge primitive is registered + built (0 parse-skips). [T2]
**AUDIT 2026-07-19 (Gitea #10):** the full per-widget verdict table (45 rows: 34 CORRECT / 1
WRONG-filed / 6 AUTH-STATIC / 6 DEFERRED-FEED) is in `docs/GAUGE_COMPOSITE.md` §"AUDIT
2026-07-19" — the one WRONG is the missing SeekVoltageGraph reconstruction (the emitter/myomer
eng pages' POWER curve + the authentic top-box eraser; causes the stale-ammo "SYSTEM 10 PPC"
ghost). [T2]
## Architecture (three layers)
1. **The config** `content/GAUGE/l4gauge.cfg` — a text file the engine `GaugeInterpreter` parses
@@ -310,7 +316,9 @@ and every instrument is now live [T2]:**
[T4]). The old "translates to the torso boresight" wording here was the falsified
body-mounted-view model — see [[combat-damage]] Targeting for the full re-correction.
This recovery also CONFIRMS the HUD attr-table ids 4/5/6/8/0xA/0xB/0xC/0xD name↔use pairings
(hud.hpp had flagged them uncertain). Deferred: PNAME1-8.bgf 3D marker chain. (The canopy shell
(hud.hpp had flagged them uncertain; the OFFSETS were re-based 2026-07-19 — the table @5110b8
starts with id 3 FlickerRate@0x1D8, so Rotation=0x1DC…CompassHeading=0x214 Scalar; hud.hpp/
CLASSMAP corrected, names/ids unchanged). Deferred: PNAME1-8.bgf 3D marker chain. (The canopy shell
is now authentic and shows by default — see [[cockpit-view]]; `BT_HIDE_COCKPIT=1` hides it.)
Player CALLSIGN labels (kill/damage feed, radar/target tags, score display) are 1bpp name
+130
View File
@@ -638,3 +638,133 @@ numericSpeed units (open).
Degradation/Failure temps (fixed threshold markers); AmbientTemperature
300; MaxRunSpeed (per-mech constant); cmArmor/cmCrit all-green (undamaged solo player — BT is PvP-only);
CoolantMassLeakRate 0 on a pristine mech (damage-gated); Player RANK 1 in solo.
---
## AUDIT 2026-07-19 (Gitea #10) — systematic per-widget gauge-data audit
Every widget on the cockpit displays audited for BINARY-CORRECT data: static pass (CFG configure
blocks + `BTL4MethodDescription[]` + widget sources vs the decomp) + live pass (two instrumented
sessions, BLH/ARENA1, docked composite + BT_SHOT series; drivers: BT_PRESET_TEST, BT_VIEWCYCLE_TEST,
BT_FLUSH_TEST, BT_AUTOFIRE(+AF_MISSILE), BT_GOTO movement; logs audit2/3/4.log). Verdicts:
**CORRECT** (binary-correct data, evidence cited) / **WRONG** (defect; fixed or filed) /
**AUTH-STATIC** (authentically static — do not fix) / **DEFERRED-FEED** (widget correct, data
source a documented deferred system).
### Coverage inventory (static pass)
All 26 distinct CFG primitives resolve: 17 BT-specific registrations (btl4grnd.cpp:135-152) +
engine base (numeric/numericSpeed/digitalClock/rankAndScore/bgPixelMap/bgBitMap/configure/
reconfigure/externalConfigure); parse-skip list EMPTY ([gskip]=0), all 50 attr bindings resolve
(0 NULL) — the gauge-complete wave claims re-verified against btl4grnd.cpp + the CFG keyword census.
### Verdict table
| # | Surface / widget | Binding → producer | Evidence | Tier | Verdict |
|---|---|---|---|---|---|
| 1 | Heat: condenser temp two-part bars ×6 (TMP) | HeatSink/CurrentTemperature + Degradation/Failure endpoints → heat.cpp table | attr wave incr.1 + tasks #9/#10 heat economy; LIVE: bank S 515→680 climbing under autofire (audit4) | T2 | CORRECT |
| 2 | Heat: SETS valve sliders ×6 (vertNormalSlider) | Condenser/ValveSetting → coolantFlowScale (RecomputeCondenserValves FUN_0049f788, 1/N) | task #13 live valveState 1→5 → flow 1/6→5/10 | T2 | CORRECT |
| 3 | Heat: LEK LeakGauge column | CoolantMassLeakRate → coolantDraw (damage-gated) | writer census; pristine=0 | T2 | AUTH-STATIC (pristine) |
| 4 | Heat: COOLANT A numeric | HeatSink/AmbientTemperature → AggregateHeatSink 300 (ctor @4ae8d0) | LIVE: reads 300 (audit3/4 shots) | T2 | AUTH-STATIC (hardcoded 300) |
| 5 | Heat: COOLANT S numeric | HeatSink/CurrentTemperature (bank) | LIVE: 515→653→680 climbing | T2 | CORRECT |
| 6 | Heat: RES coolant vertBar C | Reservoir/CoolantMass → coolantLevel@0x12C (CFG:4526) | Gitea #7; re-verified LIVE this audit: [flush] 6→0 in ~1.0s held, PFX cloud | T2 | CORRECT |
| 7 | GeneratorCluster A-D panels | Generator/OutputVoltage → outputVoltage@0x1DC + state lamps | gauge wave (@004c72ac); task #12 GenSelect live | T2 | CORRECT |
| 8 | Comm: pilotList KILLS | victim-posted ScoreMessage → killCount (cross-player credit) | commit 34aaa7d; solo 0 observed (authentic) | T2 | CORRECT |
| 9 | Comm: pilotList DEATHS | observed-death tally + 2/1 display clamp (BTPilotDeaths) | 2026-07-12 resolution; solo 0 observed | T2 | CORRECT |
| 10 | Comm: SELECT-TARGET highlight | BTPilotIsSelected accessors (ex raw-offset AV) | commit 34aaa7d root-cause note | T2 | CORRECT |
| 11 | Plasma: rankAndScore | engine primitive → external serial annunciator | not a D3D surface (L4PLASMA=com2) | T0 | CORRECT (n/a on dev composite) |
| 12 | Quad mini-panels: temp bars / cooling-loop / power-bus lamps / evolt bar / cmode lamp | SubsystemCluster children (@004c8140 map) reading InputVoltage/HeatSink/temps | VEHICLE_SUBSYSTEMS.md phase 2; LIVE: panels render per-subsystem, [vss] roster matches authored aux screens 1-10 | T2 | CORRECT |
| 13 | Quad: recharge dial (SegmentArc270) | PercentDone → rechargeLevel@0x320 | writer census: Emitter::ComputeOutputVoltage @004ba738 only — projectile dial full-once | T1/T2 | CORRECT (emitters) + AUTH-STATIC (projectile) |
| 14 | Quad: ammo count (ammoCountA) | AmmoBin::ammoCount via BTAmmoBinCountPtr bridge | AFC100 fix 2026-07-12; LIVE: 24 fresh (audit4) vs 19 after missile autofire (audit3) — counter moves | T2 | CORRECT |
| 15 | Quad: ConfigMap regroup lamps | LBE4ControlsManager buttonGroup map state | task #6: NO SetColor caller in the binary → color=0, Execute early-outs | T1 | AUTH-STATIC (dormant; BT_CONFIGMAP dev enable) |
| 16 | Eng pages: prepEngr SYSTEM NN + subsystem label + class cells | roster walk, sub+0x1dc auxScreen == screen (BTGetSubsystemAuxScreen) | FUN_004c7e48 matched line-by-line; [vss] dump: scr1/2/4=PPC/Strk6/ERMed, 5-8=Sens/Myo/ERMed/ERMed, 9/10=Strk6/PPC — page headers+labels CORRECT | T1/T2 | CORRECT |
| 17 | Eng ballistic page: ammoCountB / jam / fire / reload numeric / destroyed lamp | bin count bridge + weaponAlarm@0x364 (MechWeapon layout static_assert-locked) | ctor @004c9558 coords matched; LIVE renders | T2 | CORRECT |
| 18 | Eng ballistic page: eject wipe (BitMapInverseWipeScalar @004c61c8) | subsys+0x3f8 eject timer | port tracked NULL (class not reconstructed) | T3 | DEFERRED-FEED |
| 19 | Eng emitter/myomer pages: SeekVoltageGraph (POWER curve) | 4 Seek* attrs + subsystem vtbl+0x3C sampler | WRONG — port Execute is a bring-up no-op (btl4gau2.cpp:331); see finding A below | T1 (binary) | WRONG (filed) |
| 20 | Eng emitter page: seek-step lamp (bteseek) | Emitter::seekVoltageIndex@0x3F0 (static_assert-locked) | @004c93b0 :2146 | T2 | CORRECT |
| 21 | Eng myomer page: seek-step lamp | Myomers@0x320 INFERRED (ctor @004c8df4 not in the decomp export) | marked in code | T3 | CORRECT (best-effort; flagged) |
| 22 | Eng page: linked heat-sink number (hs+0x1d4 guarded raw) | PrepEngr numeric #2 | marked BEST-EFFORT (guarded) | T3 | CORRECT (guarded; flagged) |
| 23 | sec: radar map (wedge/blips/scale) | Mech Radar* attrs; wedge ← Torso::currentTwist@0x1D8 (Gitea #1) | #1 [T2]; LIVE: blips + wedge render, zoom via SetTargetRange | T2 | CORRECT |
| 24 | sec: radar pip/name symbology | GetVideoObject/LookUpPip/GetNameID | task #17 under reconstruction — cross-blip stand-in | T3 | DEFERRED-FEED |
| 25 | sec: headingPointer needle + numeric | YawPitchRoll decomposition (engine-convention port of euler[0]) | LIVE: 089→120 while turning under BT_GOTO | T2 | CORRECT |
| 26 | sec: numericSpeed | LinearSpeed (abs(adv)/dt) | LIVE: 0 parked → 176-182 walking | T2 | CORRECT (units question stays open) |
| 27 | sec: digitalClock MISSION TIME | engine mission clock (format enum arg) | LIVE: 09:19→06:04 counting | T0/T2 | CORRECT |
| 28 | sec: sectorDisplay (overlay) | localOrigin → Round(Z·0.01)+500 / Round(X·0.01)+500 | commit 4a4ec68 [BT_SECTOR_LOG live]; NOTE: overlay plane not composited into the dev sec cell (polish item) — data verified by log | T2 | CORRECT |
| 29 | sec: schematic ARMOR view (cmArmor/multiArmor, dama.pcc) | zone damageLevel ×100 → adpal ramp | incr.3/4; all-green pristine LIVE | T2 | CORRECT (AUTH-STATIC all-green solo) |
| 30 | sec: schematic CRITICAL view (cmCrit) | subsystem simulationState/damage | LIVE this audit: N-cycle shows the full subsystem list (GEN A-D, LOOP 1-6, HUD, SENSORS, GYRO, TORSO, weapons) | T2 | CORRECT |
| 31 | sec: schematic HEAT view (cmHeat) | subsystem currentTemperature tint | #6 pixel-verified; re-cycled this audit (mask 0x450421→0x490421→0x510421) | T2 | CORRECT |
| 32 | sec: view cycling (N / pod 0x15) | CycleDisplayMode → vtbl+0x4C @4d1ae4 | #6 resolution re-verified live ([mode] display notify 0/1/2) | T2 | CORRECT |
| 33 | sec: CONTROL MODE lamp (BAS/MID/ADV) | ControlsMapper/DisplayMode oneOfSeveralPixInt | attr wave incr.5; M-cycle verified #6 | T2 | CORRECT |
| 34 | sec: duck / searchlight button lamps | duckState (ctor-zeroed only) / Searchlight LightOn | duckState writer missing (P3 leftover) | T3 | DEFERRED-FEED (duck); CORRECT (light attr published) |
| 35 | sec: messageBoard ticker | StatusMessagePool (NULL stub) + kill ticker strip 0 | 7fc4acb; kill ticker live 2026-07-12, other strips unsurveyed | T2/T3 | DEFERRED-FEED (partial) |
| 36 | MFD preset paging (J/K/L, pod RIO banks) | SetPresetMode table @0051dbf0 (little-endian re-decode) | #9; re-verified live this audit: cycles visit EXACTLY the populated set (MFD1: 1,2,4; MFD2: 1-4; MFD3: 1,2) | T2 | CORRECT |
| 37 | HUD: range ladder + caret (500 m/s slide) | BTSetHudTargetRange ← targeting; HudSimulation :5652-5670 | task #37 [T1] + live | T1/T2 | CORRECT |
| 38 | HUD: weapon pips (loaded/dark/hidden; group filter) | attr 0x1C WeaponState == stateConst2; damage state 1 hides | 2026-07-18 fix (projectile pips un-pinned); pips visible in audit shots | T2 | CORRECT |
| 39 | HUD: bottom 21-tick TORSO-TWIST tape | RotationOfTorsoHorizontal / HorizontalTorsoLimit (attrs 4/5/6) | task #58; BLH fixed-torso → centred (authentic) in audit shots | T2 | CORRECT (AUTH-STATIC on BLH) |
| 40 | HUD: compass + threat trail | CompassHeading (attr 0xD, yaw+twist :5676); ThreatVector (attr 0xC) ← TakeDamage push | task #37/#38; compass rose renders in shots | T2 | CORRECT |
| 41 | HUD: lock ring (4°/frame spin) | Lock rule :5619-5634 (own zone <0.75, target zone <1.0) | task #38 | T2 | CORRECT |
| 42 | HUD: target hotbox / edge arrows | HotBoxVector projection (live per-axis) | task #37 | T2 | CORRECT |
| 43 | HUD: simple-X mode | PrimaryHudOn mask 0x20 state switch | ctor @4689-4705 | T1/T2 | CORRECT |
| 44 | HUD: PNAME1-8.bgf 3D name marker chain | — | deferred | T4 | DEFERRED-FEED |
| 45 | HUD attr table @005110b8 (ids 3-0xD) | hud.hpp/CLASSMAP corrected this audit | finding B below | T1 | CORRECT (fixed) |
**Counts: 34 CORRECT · 1 WRONG (filed: SeekVoltageGraph) · 6 AUTH-STATIC (incl. dual-verdict rows
13/29/39) · 6 DEFERRED-FEED (rows 18/24/34-duck/35/44 + the sec messageBoard partial).**
(Dual-verdict rows counted in both columns.)
### Finding A — the "SYSTEM 10 PPC ammo readout" (issue entry point a) — ROOT-CAUSED, FILED
**The page header, label and screen→subsystem mapping are CORRECT** ([vss] live dump matches the
authored sub+0x1dc assignments; CFG prepEngr(ModeMFD3Eng2, 10, ...) pairing consistent;
FUN_004c7e48 reconstruction line-exact). The ammo readout on the SYSTEM 10 (PPC) page is a
**GHOST — stale pixels from the previously-shown SYSTEM 9 (Streak 6) page** on the SAME shared
Eng3 bit-plane. Reproduced live (audit3): SYSTEM 04 ERMED LASER (emitter) showed the "0019"
ammo box left by the SYSTEM 02 Streak page; SYSTEM 08's POWER box showed the SENSOR RANGE label
left by SYSTEM 05. Mechanism chain, all decomp-verified:
- Ballistic/sensor eng children (ammoCountB @(0xdc,0x104)-(0x140,0x12C), jam/fire lamps, reload
numeric — ctor @004c9558) draw INSIDE the top data box (0x97,0x80)-(0x17d,0x13b).
- On a page switch the engine moves gauges active↔inactive (DeactivateGaugeBases,
GAUGREND.cpp:3909) — BecameInactive() is a no-op everywhere [T0]: NOTHING erases on deactivation.
- PrepEngrScreen::BecameActive (@004c7e48) erases the top box ONLY for the ballistic/sensor/gauss
cases (topBox=1); the emitter/PPC and myomer cases pass 0 — **because in the binary those pages'
box is owned by the SeekVoltageGraph**: its localView IS the box rect (ctor @004c6798
SetPositionWithinPort(0x97,0x80,0x17d,0x13b)), BecameActive @004c6920 poisons the cached
sample (this+0xAC = 10000.0f), and the next Execute (@004c6934) calls the clear helper
@004c6be4 (SetColor 0 + filled rect 1000×1000 clipped to the view = FULL BOX ERASE) before
re-plotting the voltage curve. Every topBox=0 page has a graph child (EnergyWeaponCluster
@004c93b0 :2137; MyomerCluster @004c8df4) — the design is coherent and ghost-free on the pod.
- **The port's SeekVoltageGraph::Execute is a marked bring-up NO-OP** (btl4gau2.cpp:331), so the
erase never runs and the POWER curve never draws → the ghost.
**Fix required (LARGE — filed, not half-fixed per the no-stand-ins rule):** full SeekVoltageGraph
reconstruction — publish the 4 CurrentSeekVoltageIndex/MinSeekVoltageIndex/MaxSeekVoltageIndex/
SeekVoltage attributes on Emitter(+PPC)+Myomers, identify + reconstruct the subsystem vtbl+0x3C
voltage-response sampler, x87-recover the plot math (@004c6934 loop constants _DAT_004c6bdc/_be0,
DrawTicks @004c6c6c, DrawCursor @004c6c30, clear @004c6be4 — Ghidra dropped the FPU args;
tools/disas2.py). An erase-only patch was deliberately NOT made (it would be a stand-in for the
missing curve).
### Finding B — HUD binary attr table @005110c0 conflict (issue entry point b) — RESOLVED, FIXED
Re-dumped section_dump.txt @5110b8: the table starts ONE RECORD EARLIER than transcribed — a full
16-byte record {id 3, "FlickerRate", 0x1D8|1, 0} (the old reading took the FlickerRate name ptr
as a "category label"), so every subsequent offset in hud.hpp was shifted one slot. Binary truth:
Rotation@0x1DC ← Torso::currentTwist(+0x1D8), LimitR@0x1E0, LimitL@0x1E4, Speed@0x1E8,
RangeToTarget@0x1EC, (0x1F0 unbound), Visible@0x1F4(init 1), Lock@0x1F8(init 0), HotBoxVector
P3D@0x1FC, ThreatVector P3D@0x208, CompassHeading Scalar@0x214 (= yaw euler[0] + twist :5676).
Cross-checked against the ctor @004b7f94 and HudSimulation @004b7830 — ALL consistent (the Lock
rule :5622/:5633 writes @0x1F8; the 1200-default + 500 m/s slide writes @0x1EC). **Behavioral
impact: NONE** — the port reticle feeds through its own globals (gBTHudLockState etc.) which
implement the correct semantics, l4gauge.cfg never binds HUD attrs, and the mislabeled
SetCompassHeading (@004b7810, actually SetThreatVector — writes @0x208) has no port caller.
FIXED: hud.hpp member renames + table comment, hud.cpp ctor inits (Visible=1/Lock=0 per binary),
SetThreatVector rename, CLASSMAP.md entry. The ids 4-0xD NAME↔USE pairings from task #37 stand.
### Finding C — [T3]/[T4] tag review (issue entry point c)
context/gauges-hud.md contains NO [T3] tags (all previously-T3 claims were promoted in the
#1/#6/#7/#9 waves). The single [T4] — the un-exported reticlePosition writer / fixed-torso
free-aim channel (mech+0x36c) — remains a genuine unknown and stays flagged. In-code BEST-EFFORT
markers audited as table rows 18/21/22/24/34.
### Finding D — BT_SHOT dock-capture regression (found + fixed during this audit)
The 2026-07-18 capture reorder left BT_SHOT BEFORE BTDrawGaugeInset, so BT_DEV_GAUGES_DOCK
screenshots silently omitted the gauge panel (audit runs 1-2 captured cockpit-only frames).
Moved the capture after the inset (L4VIDEO.cpp) — dock shots again show what the screen shows.
Also noted: BT_DEV_GAUGES_DOCK alone does NOT enable the composite — DevGaugeComposite() gates
on BT_DEV_GAUGES (L4VB16.cpp:105); set BOTH.