From 2bb9b602bbc2268e5249aa96ab042d1bffaf7f0a Mon Sep 17 00:00:00 2001 From: Cyd Date: Thu, 16 Jul 2026 19:46:50 -0500 Subject: [PATCH] KB: record the CoolingLoopConnection databinding-trap AV fix (gauges-hud) Co-Authored-By: Claude Fable 5 --- context/gauges-hud.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/context/gauges-hud.md b/context/gauges-hud.md index 2b13a77..e4552d7 100644 --- a/context/gauges-hud.md +++ b/context/gauges-hud.md @@ -63,6 +63,17 @@ TestInstance/BecameActive/Execute. **Gotchas that bite EVERY widget:** - **Condenser valve gauge:** ValveSetting→coolantFlowScale reads the authentic **1/N** (`RecomputeCondenserValves`, FUN_0049f788, was a no-op stub). [T2] +## CoolingLoopConnection AV — FIXED 2026-07-14 [T3] +`CoolingLoopConnection::Update` (btl4gau2.cpp) walked the binary's plug→link→subsystem chain via +raw `+8` offsets; our reconstructed subsystem layout isn't byte-identical, so an intermediate +`link` came out non-null-but-garbage and `*(link+8)` AV'd — **the moment a mech's coolant loop +goes active** (`source+0x134==1`), so it crashed the **real pod path too**, not just +`BT_DEV_GAUGES` (the gauge background task runs `Update` whenever gauges are active). Pre-existing +(byte-identical across the 2026-07-14 BT411 merge). Fix: `BTPtrReadable` (VirtualQuery) guards +each raw deref → an invalid chain resolves to the authentic "no source" branch (0). Classic +[[reconstruction-gotchas]] databinding trap; the proper follow-up is named Plug/Link accessors in +a complete-type TU instead of raw offsets. With the guard, the full cockpit MFD suite renders. + ## Dev composite (off-pod) `BT_DEV_GAUGES` renders the 6 pod [[MFD]] surfaces in a separate 960×384 window (bit-plane masks over one shared `SVGA16` pixelBuffer; `SVGA16::DrawDevSurface`). On the POD they come from