Files
BT411/scratchpad/SESSION_HANDOFF_20260803.md
T
2026-08-05 19:46:09 -05:00

28 KiB

Session handoff — 2026-08-03 (armor visibility + eject arm chain)

Committed this session (all on master, exe deployed to content/)

  • fe48acc #87 root cause: zone-level replication send was missing — the binary's effect watcher (FUN_0042aa2c) ForceUpdates on BAND-THRESHOLD crossings (master-gated); the port only had the gstate branch. Observers saw 0.0 forever. Fixed + 2-node verified (replicant peaks == master finals to 4 decimals).
  • 440cee1 #87 dig closure: host response is LINEAR (raw re-read @004573e4/@00457784, 0.1 literal at call site); the pixel curve was i860 DIV-CARD firmware (flush_material @0048d4d4 just marshals) — logged in open-questions. Field claim reconciled: one 25-pt hit snaps a 77-pt arm 0→0.325 (measured; snap is visible, 2-pt ERS creep is not). Bench: BT_WALK_ZONES filter (legwalk.sh), BindArmourDamage ORPHAN inventory (0 orphans).
  • 8165cee #118 eject alive: the evaluator's per-frame caller found by E8-scan — FUN_004a9b5c (Mech MASTER PERF, export hole)+0x10 calls @0049fa1c every frame. Restored at top of Mech::PerformAndWatch (master-gated). Mislabel swept: mech+0x414 = ejectPermitted (NOT missionReviewMode; real review mode = GLOBAL DAT_004fd550). Verified: gen-kill → panic-arm mode ON → miniconsole Panic button LIGHTS (pixel proof panicbtn.png) → punch-out → respawn disarms. BT_EJECT_LOG=1 logs edges. Also: msg id 0x1a = DuckRequest@0049fa00 latches mech+0x398 — NO reader in image (vestigial).
  • 0089b32 G = Flush binding (was: action existed, NO key bound — desktop players could never flush!) + BT_FLUSH_HOLD= scalpel.

IN FLIGHT — the user's firsthand eject test (they asked, then had to shut down)

Dry run result (content/fl.log): full flush drains the TANK to 0/14 in ~30 s but does NOT arm eject — InjectCoolant moves tank coolant INTO the loops (bank RISES); idle heat draw won't burn the loops below the 5% arm threshold in minutes. Firsthand recipe to give the user next session (needs build with 0089b32 — exe in content/ is current, but the DIST zip is not):

  1. Solo (play_solo), get in.
  2. HOLD G until the COOLANT RES gauge hits 0 (~30 s; flush cloud + audio confirm).
  3. Then run HOT: hold fire (lasers) continuously / keep moving. With the tank dry the loops burn coolant with no refill. Watch coolant bars fall.
  4. When the bank crosses 5%: the Panic button (bottom-left panel) lights bright — press it (or Backspace = key Back action Eject) → punch-out. Faster alternates that also arm: lose all 4 generators; or (novice sim) leg-gimp. OPEN: how long step 3 takes firsthand (not yet measured — the 3-min idle bench never armed; sustained fire should be much faster). If it's tediously long, consider whether weapon heat actually draws LOOP coolant in our reconstruction (#100/#120 territory — check ConsumeCoolant path under fire before telling testers "minutes").

Next-session queue

  1. Give the user the firsthand recipe above (they explicitly asked to test it).
  2. Time-to-arm under sustained fire — bench it (fire scalpel + BT_COOL_LOG) BEFORE promising the recipe works in reasonable time.
  3. Cut dist 717: carries score fix, 28 Hz, eject core+arm chain, #119, #124 triangle pick, #87 replication send, G-flush binding. Testers verify: missile snap darkening visible in MP now; eject lamp + punch-out.
  4. Gitea: #87 and #118 both commented + awaiting-verification (labels set). #118 note says flash-vs-solid lamp is answerable if pod veterans remember blinking (GaugeAlarm SetAlertState overlay — not authored for panic in shipped streams as far as checked).
  5. Carried: #55, #100 (reservoir drain — RELATED to step 2 above), #120 (flush floor — note: our tank DID reach 0/14, so the floor report may be the LOOP levels, not the tank), #121-#123, #125-#130; mover-gravity dt-less lead in open-questions.

Bench inventory added today

  • scratchpad/night10/zonewalk.sh (A now has BT_ARMOR_LOG + BT_SHOT_EVERY=zwA) — the standing zone-replication receipt bench; digest_walk.py reads it.
  • scratchpad/night10/legwalk.sh — leg/foot concentrated audit (BT_WALK_ZONES=leg,foot).
  • scratchpad/night10/armorpx.sh — BT_ARMOR_FORCE 0/1 pixel A/B.
  • BT_EJECT_LOG, BT_FLUSH_HOLD, BT_WALK_ZONES, armor ORPHAN dump (BT_ARMOR_LOG).
  • Proof artifacts in content/: panicbtn.png, forceladder.png, snapdiff.png, legdiff.png, dollcrop_*.png (all disposable).

KB updated (all committed)

combat-damage §Zone-LEVEL replication + snap-vs-creep fidelity boundary; decomp-reference §4 (effect watcher cluster) + EJECT ARM CHAIN entry; multiplayer (band-granularity observer model); test-harness (zone-walk armor receipts); open-questions (i860 DIV-CARD firmware ask).


EVENING SESSION ADDENDUM (the eject sprint + the MFD corruption arc)

Eject system — COMPLETE and firsthand-verified (commits 8165cee..7872254)

  • Arm chain per-frame (FUN_004a9b5c+0x10, E8-scan) [T1]; mislabel swept (mech+0x414 = ejectPermitted; review mode = GLOBAL DAT_004fd550).
  • EjectPilot @0049f854 confirmed via the image message table ('EjectPilot' id 0x19); DuckRequest = id 0x1a @0049fa00 (mech+0x398 latch, NO reader — vestigial).
  • ⚠ CORRECTED (same night): an earlier "eject was UNFINISHED/dead code in 4.10" claim was WRONG — the absolute-pointer scan missed the E8-relative call; the master perf (FUN_004a9b5c+0x10) evaluates per frame, so the ARCADE's eject was LIVE. Only the PORT was missing the call (our PerformAndWatch recon predated knowing the export-hole fn's contents). Swept from code comments same night.
  • THE PRESS MODEL [settled]: pilot eject = the PILOT KEYPAD bank while armed (+ the PANIC key, which reports through that matrix). The MFD soft keys NEVER pilot-eject in the binary — every page routes them to authored functions (weapon eng: EjectAmmo; myomer eng: seek toggle) — the flashing engEject cell is the INVITE LAMP. Our page-gated eng-key eject is a MARKED PORT CONVENIENCE (deviation), operator-requested; drop it if strictness wins.
  • Inputs, all live: Panic button (0x3D→pilot-keypad wire), NUMPAD = pilot keypad (CONTROLS.MAP keypad pilot bindings), Backspace/pad action, and the eng-page EJECT key (0x0B/0x23/0x03) page-gated in the RIO drain [T3 intent-completion]. MFD soft keys otherwise keep authored functions (streamed .CTL: no 0x200000 records — the 109-record dump is the proof).
  • Generator destruction → stateAlarm 4 (GeneratorOut, renamed from placeholder) [T3 inferred link] → the AUTHORED invite trail flashes (gotoEngineering 0x80 + engEject 0x85, alarm conditions 4/5).
  • KeypressMessageID pinned to binary 0x19 (chain arithmetic gave 0x17 — the armed press was silently swallowed; two mapper ids 0x17/0x18 remain unreconstructed).

The MFD corruption arc (gotcha #27) — RESOLVED

Root cause = MY two new draws, not eject logic: (1) the eject-wipe gauge scribbling a shared ENG/weapon composite plane during eject cycles (re-stubbed, class kept in btl4gaug for a proper FUN_004c5fb8 draw-op RE); (2) the full-face flash overlays (L4VB16 + L4GLASSWIN, both REMOVED — the side buttons are big under-surface rects; the protruding edge IS the lamp; DrawDevSurface's bound texture turned un-reset fills into gauge-atlas stripes). Pixel-verified clean under full stress; edge lamp 0x27 square-waves 34.0↔28.9 across captures = the flash works at authentic scale.

Next-session queue (no release went out tonight)

  1. Cut dist 717 after a fresh operator pass on 0535a7a-era build.
  2. Eject-wipe draw-op RE (FUN_004c5fb8 view vtbl+0x58 arg roles) → un-stub the slot graphic.
  3. The eng-page label-vs-lamp position question: operator saw the flash beside GEN-MODE, not EJECT, on one page — cross-check the DRAWN eng-page layout (streamed gauge pages) against kBTEngBankTop math per bank.
  4. Authentic generator death (combat crits / overload, not the scalpel) reaching state 4/5 — then the [T3] MarkGeneratorOut bridge can be checked against the real transition site (MechSubsystem::TakeDamage/OnAlarmChanged cluster RE).
  5. Flash presentation: the edge-lamp scale is the design; if the operator wants more presence it is a DELIBERATE glass-layer decision (discuss, don't impose).

DAY-2 ADDENDUM (2026-08-04): eject epilogue + the stale-tracker sweep + #108/K-D

Settled today (all committed, tip 0bd9bb6+)

  • Eject FINAL: strict binary model shipped (soft keys never eject; Panic/numpad/ Backspace do; invite lamps decoded -- conds 4/5 = WEAPON ammo/jam purge invite, cond 6 = bus invite via !HasVoltage; hysteresis tried+REMOVED, flap is authentic; MarkGeneratorOut bridge removed -- state 4 = the thermal breaker, destruction touches nothing electrical @0049c9a8). TechStatus bit table in decomp-reference.
  • #119 leak-voice stutter: AUTHENTIC (wooHoo latch authored all-zeros + no armer in the image; the hunt at drained tanks clips the phrase-sequenced voice; our only real bug was 2x cadence, already fixed). Deterministic leak scalpel added: BT_KILL_SUBSYS partial form "Condenser4=0.5".
  • Tracker STALE sweep: #80 (crits -- landed a5fb96a 07-29, re-verified live: [critroll] chance=0.01+0.7*lvl^2 byte-extracted) CLOSED; #2 (experience -- wired 07-20, [exp] sentinel live) CLOSED; #22 marked awaiting-verification (respawn ammo-refill receipts in tonight's logs).

IN FLIGHT: #108 ghost recurrence + the K/D accuracy report (SAME ACTION)

  • #108 hypothesis: per-entity replication dropout on one node (miss death mode + wreck gstate + respawn teleport together -> frozen ghost at the old spot while hits register elsewhere). Lead mechanic: the wreck SINK (-8u underground) may make the entity interest-culled for distant nodes; if re-interest never fires after the respawn teleport, that node's replicant freezes forever. UNPROVEN -- 693 field logs lack entity ids and every discriminating marker is env-gated.
  • K/D inaccuracy (night-11 report, build 716): the tally/credit receipts (PLAYER_DEAD matchlog rows, [score] panel DRAW probe) are ALL env-gated off in field builds -- logs show only roster rebuilds. Cannot confirm or deny from the field data. NOTE: K/D columns are replicated state; a #108-style stream dropout would corrupt both ghosts AND tallies on the same node -- one cause.
  • THE ACTION (next block, before cutting 717): make field logs self-diagnosing:
    1. players/play_steam.bat (+join*.bat): set BT_MATCHLOG=1 (or a curated death/score subset if per-shot DMG volume is too hot -- check matchlog.hpp categories) + BT_SCORE_LOG=1.
    2. Entity IDs on the ungated render lines (wreck swap / MakeMechRenderables / RemakeEntity -- btl4vid).
    3. NEW ungated [ghost] staleness detector: a replicant whose last-applied update record is > N s old while not buried -> one line with entity id + age + last-known position (the #108 indictment line).
    4. Un-gate (or default-on) the respawn un-wreck line. Then 717's night-11 logs convict #108's mechanism and settle the K/D claim.

Next-session queue (post-717-cut)

  1. The instrumentation block above -> cut 717 -> field night.
  2. #35 Owens laser crash; #126 invisible peer fire; #89 splash; #92 Loki feet; #73 (check against the #124 triangle-pick fix -- likely closable).
  3. #118 last tail: MP console notice delivery audit.

#108 CONFOUND (operator recall, 2026-08-04): Conn Man ran a WRONG BUILD for

much of night 9 -- raw-struct replication + version skew can desync one connection's stream (one node loses one entity: the exact ghost signature), and same-build benches can't reproduce (59 clean cycles again today). K/D bookkeeping verified EXACT both columns (4-node deaths + 2-node cross-player kills, matchcheck-reconciled). NEW 717 item: BUILD HANDSHAKE at join/relay (version already in matchlog HDR) -- refuse mismatched builds loudly. Instrumentation block unchanged (it discriminates skew vs real bug).

BUILD HANDSHAKE: SHIPPED for Steam (2026-08-04, 22f732f + d050db5)

The #108 build-gate item above is DONE for the Steam path (game/glass/ btl4lobby.cpp, ~60 lines, in the 717 cut):

  • Host lobby stamped btl4ver=BT_VERSION_STRING (unique per zip -- btversion is an always-run custom target, re-stamps from git every build; verified build/btversion.h ticked 749->754 across today's commits).
  • Joiner search filters on exact btl4ver match; the no-lobby log names the local build so field reports self-diagnose (#68 lesson). Post-join GetLobbyData verify covers invites/unstamped hosts: loud log + LeaveLobby.
  • HOST HALF (the part that catches OLD exes, i.e. the actual Conn Man case): PublishSelf adds per-member bv=build; the GO mint SKIPS any non-self member with absent/mismatched bv -> no token in btl4map -> the stale client's own pre-existing "the host's map is missing us" bail fires (that code ships in every old build already). Room screen marks such members [WRONG BUILD -- WILL NOT LAUNCH] so the host sees it BEFORE pressing GO.
  • Old-build member experience: sits in room, GO fires, their exe fails the join back to the FE. They get no in-client message (impossible to add text to an exe they already have) -- the host-side room marker + REJECT LobbyLog line are the operator's tools.
  • Verified: link clean vs the documented 20-stub /FORCE baseline (build-and-run.md:28), gate strings confirmed in the deployed exe (ascii + utf16 scans), content/btl4.exe = committed tree (4.11.754). NOT yet field-tested (needs two Steam machines; single-account can't exercise join-vs-host). First 717 Steam night proves it.
  • NOT COVERED: LAN/relay (join.bat / btconsole relay) -- a stale zip can still join a LAN session. Relay-side version check = separate item if wanted (version already rides the matchlog HDR for post-hoc detection).
  • ADDENDUM (648f6b1): join-side rejections now MESSAGE-BOX the player (LobbyNotice = day-log line + MessageBox): BUILD MISMATCH (probe re-search without the version filter names the host's build vs ours, read from list-cached lobby data without joining), NO LOBBY FOUND, STEAM UNAVAILABLE, LEFT BEHIND (no token in btl4map). Old exes still quit silently on rejection (unfixable in the field); host roster marker is the operator's view. content/btl4.exe = 4.11.756 (648f6b1).

#91 thor "black rectangle": ROOT-CAUSED + FIXED (2026-08-04)

Ronin's report (3rd sighting) pinned it: the rectangle = the thor's OWN thx_msl missile-pod mount plate. The inside view is a per-mech AUTHORED type-A set (KB "exactly one mesh" claim corrected in cockpit-view.md): thor = cop+tor+MSL, owens = cop+BOTH LEGS+tshd, sunder/loki/avatar = cop+tor. Pilot-facing surfaces are skin:blakskn_dz_* -- the same interior-structure material as the canopy frame -- but the unlit frame constant keyed on the _cop FILENAME, so pod/legs rendered void (0,0,0) instead of (0.13,0.12,0.15). bgfload now keys on the material family (mechfx shadow quads excluded). Verified by walking captures (zero pure-black lower-band px; plate blends with the frame bar at rest). Diags: BT_MAT_LOG, BT_HIDE_INSIDE_SEG, [view] roster names; bench scratchpad/night11/thorrect.sh. #91 labeled awaiting-verification -- Ronin should re-fly the thor on 717.

#92 loki feet: ALREADY FIXED -- bench-verified 2026-08-04

Zone-walk rig vs a LOKI target (scratchpad/night11/zonewalk_loki.sh): both feet take aimed direct fire (lfoot zone 4 / rfoot zone 15, pick resolves correctly, 7 dmg applications each, all 21 zones alive). Oracle's night-7 report was build 659 = pre-#124 pick fix; collateral, cured. Labeled awaiting-verification -- Oracle re-flies on 717.

#124 twist-sign verify: DONE -- sign CORRECT (2026-08-04)

The last inferred half of the frame adapter is now runtime-verified: torso pinned 0/+140/-140 (new BT_FORCE_TWIST sim-level diag; the input- level pin was dead -- CONTROLS.MAP device push owns live input, Basic auto-centers), LRM salvos, new [slice] log (twist, thetaIn/Adj, wedge). Picks track the physically-facing flank both directions; wrong sign excluded (slice 7 vs observed slice 1). No game-code change. Remaining on #124: only the 717 field re-run of Oracle's audit rows.

RESPAWN-RESET AUDIT (2026-08-04, operator request): COMPLETE

Full matrix in docs/RESPAWN_REARM_PLAN.md addendum. Fixed: coolant VALVES (Condenser @004ae534 raw-disasm'd -- missing from export; detent->1 + massScale restore + Mech::Reset's @0049f788 recompute tail; bench receipt "detent 5 -> 1") and #129 SPAWN SMOKE (replicant un-wreck edge now runs the @004d0c14 effect cleanup; peers-only symptom explained). AUTHENTIC (no fix): weapon->gen taps + MFD display/control modes persist (mapper vtables = root bodies, read from exe). #55/#129 commented, labeled. Bench: scratchpad/night11/respawnreset.sh.

CUT: BT411_4.11.767.zip (2026-08-04) -- the "717" field build

dist/BT411_4.11.767.zip, stamp 4.11.767 (81dda84), STEAM=ON EXPIRE=ON. Carries the whole two-day ledger PLUS today: Steam build gate (both halves + player-visible rejections), #91 pod-plate fix, #92 receipts, #124 twist-sign verify, respawn-reset audit (valves + #129 smoke), and the #108 forensics block (ghost detector verified both ways, render IDs, field envs in the bats). Zip contents verified by direct inspection (gate strings, ghost string, bat envs, clean stamp). FIELD NIGHT CHECKLIST: #87 snap darkening, eject flow, #91 (Ronin re-fly thor), #92 (Oracle re-fly loki feet), #129 spawn smoke, valve reset, #22/#35/#55 awaiting-verification items, and #108 -- gate guarantees same-build, so any ghost now leaves a [ghost]/GHOST record.

RE-CUT: BT411_4.11.771.zip supersedes 767 (never distributed)

Merged Cyd's glass-lamp-latency (per-frame lamp STATE sweep, glass only, BT_GLASS_LAMP_SWEEP=0 restores; #45 citation in his comment fixed to "field reports"). Smoke-tested: cockpit + all MFD panels un-regressed, no compositor artifacts. SCOPE NOTE for testers: this fixes BUTTON/lamp responsiveness under load in all glass layouts INCLUDING separate windows; instrument-SURFACE refresh (needles/pages) still rides the throttled background gauge sweep and can lag on heavy missions -- the background-sweep starvation dig is the follow-up. 767 zip deleted.

#124 CORRECTION: per-PANEL hull zones (2026-08-04, field pushback)

The "aimed torso = always center" claim was WRONG -- players' era memory was right. Proof: MAD_TOR patch tags (9 hull zones in the art), dpl GEOGROUP-granularity hit block, @49db20 has no runtime caller. Pick now resolves the struck patch's dz_* zone via the #87 dmgBinds (segment dzone fallback); ZoneAimPoint aims patch centroids. Bench: every hull panel resolves individually (utorso 11/12; pre-fix 102/102 -> dtorso), victim applied across all panel families. KB + release notes corrected; #124 tracker comment posted. Oracle's audit re-run on the new build is the acceptance test.

NIGHT 12 FIELD RESULTS (2026-08-04, build 4.11.774) -- "mostly a win"

TEN issues field-verified + CLOSED with receipts: #124 (per-panel targeting ACCEPTED, all 8 chassis perfect incl. searchlight), #16, #73, #87 (darkening + per-panel smoke "working very well"), #129, #92, #91 ("thor bowtie worked"), #55 (valves/loops reset, assignments persist), #68 (wrong-build join rejected VISIBLY -- gate held in the field), #118 (panic arms on all 3 authored conditions; dunce-cap notice works). NO ghost report all night; skating returned instead (#52 commented: 3 sightings with times). NEW ISSUES #131-#138: reticle false-lock/no-reg (BLACKHAWK-correlated -- the operator's headline; sphere-fallback + NO-TRIS leads flagged in the issue), Conn Man's yellow HUD line, gen X-out era question, panic score penalty missing, Rajel's non-glass leak lamps, leak/component-toggle interaction (repro pending), Oracle's maxed-myomer respawn, glass unfocused-window flash throttle (Cyd root-caused + fixing, plus red panic button + vPlasma noframe). Field logs staged UNSCANNED: scratchpad/night12/steam_20260804_{a,b,c} .log (gitignore-verified). Probable mapping from chat headers: MS-FIREFLY/santo=Conn Man (Steam DOWN -- winsock fallback, note!), GAMERSLAB/rajel=RajelAran, SCREECH-PC/Dave=Oracle -- confirm from session headers at scan time. NEXT: log scan (crash @8:45PM ET Oracle lobby launch; [ghost] lines vs skating windows; #131 forensics).

#131 FALSE LOCK: FIXED -- miss-means-miss (2026-08-05)

Root cause: sphere + AABB fallbacks answered where the 1995 card would MISS; exposed by LEVEL boresight over the SHORT blackhawk (ray clears the mesh, threads the spheres -- ring lit above its head; operator watched it live). Fix: pick returns hit/TRUE-MISS/no-tree; spheres only for unreadable meshes (none exist); AABB only pre-tree. Receipts: level sweep 0 locks (was 168 sphere answers); down-pitch 100% tri-sourced; walk matrix tri=18874/sphereFB=0, 156 hits across 16 zones on bhk1. New instruments: BT_LOCK_SWEEP / BT_LOCK_ENVELOPE / [picksrc] counters. BUILD RITUAL (stale-link flake, bit 3x today): rm build/Release/btl4.exe before the build, string-verify the new exe before deploying. FIELD NOTE: locking strictly tighter now; if era testers want linger, that becomes a sourced investigation (Draco's memory, #131 comment).

NIGHT-12 LOG SCAN (2026-08-05): 3 staged players, ~49 sessions, all 774

  • SKATING DISCRIMINATED: zero [ghost] lines anywhere -> records flowed -> #52/#130 is the GAIT/LEG-STATE replication path, NOT starvation. Next: 2-node gait-state bench.
  • #134 CONFIRMED from data: 3 punch-outs -> 3 DWH notices -> deaths, ZERO score awards any sign (SCORE_LOG forced on). Mechanism: eject = self- damage killBonus; kill-scoring never engages for self-kill; authentic debit likely rides the DEFERRED id-0x16 kill-report block -- that reconstruction is the fix.
  • Oracle's 8:45PM "crash": 7-line session dying between "lobby up" and the room screen, no exception -- filed with fingerprint (new issue).
  • Conn Man winsock header: ONE failed boot (Steam not ready), relaunched 46s later on Steam -- benign, no mixed transport.
  • #135/#137: field logs lack lamp/heat instrumentation -- RECOMMEND adding BT_LAMP_LOG=1 to players/*.bat next cut; both need local repro.

#52 SKATE detector: negative-verified, awaiting field or gimp bench

[skate]/SKATE forensic on master (channel-agnostic -- first build keyed legCycleSpeed alone and false-fired; peers pose from the BODY channel). 2-node bench: 7 respawn-while-moving cycles, zero hits, zero false fires. Field logs already ruled out starvation. NEXT provocations: leg-gimped walker (#82 family), 6-player load. The detector rides the next cut regardless -- one field SKATE record names the failing case.

#52 LAB CAMPAIGN CLOSED (2026-08-05): matrix passes, field instrument rides

Healthy walk / 7x respawn-while-moving / gimp-onset at speed / 21s SUSTAINED GIMPED WALKING (BT_SELF_DAMAGE_ZONE=dz_ldleg -- the recipe) / leg-death (authentic at 1.0) / respawn: ZERO skate, and the peer's gimp view verified live (gl=3, gimp bodyStates cycling => #82 holds). Field skating needs field scale -- [skate]/SKATE detector ships next cut. BT_LAMP_LOG=1 added to the three player bats (#135 forensics). Bench recipe archive: scratchpad/night12/skatebench7.sh (clean-room; sed-derived script chains dropped envs twice -- write benches fresh). READY TO CUT: everything since 774 incl. #131 fix + both detectors.

#89 DEATH BLAST: reconstructed + verified (2026-08-05, pre-cut)

Second SplashDamage caller found in the TakeDamage tail (raw disasm @0x4a07b8-0x4a0bda). Gates: advancedDamageOn && !suppressConsole (ejects never blast). Damage: Explosive, authored DeathSplashDamage/ Radius (PROMOTED from the global Wword bank -- was clobbered per-mech), bursts = 0.015 x moverMass, falloff dist^1.25 in the shared core. Bench: madcat radius=50 amt=5 mass=75000 -> neighbor at 8.9u took 73 bursts cross-pod, SPLASH/DMG reconciled. Deferred: burning dispatch (0x17 handler), score post (id-0x16, #134). #89 awaiting-verification.

2026-08-05 (later): #45/#134 -- the authentic score/death report tail (91bd286)

User said "see it through" on the deferred id-0x16 block. Full reconstruction from raw disasm of the dark-gap tail (@0x4a02f4-0x4a0890):

  • THE BIG DECODES: BTPlayer handler table byte-scanned (file 0x112dxx): 6 entries, 0x16 Score -> @0x4c02e4 (the type-switch handler; our port's transcription was already faithful), 0x17 VehicleDead -> @0x4c05c4, 0x1a ScoreUpdate; @0x4c0200 ("ScoreInflicted") IN NO ENTRY = dead 1995 code. The death tail's id-0x17 message = Player::VehicleDeadMessage (NOT SetBurningState -- #89 banner corrected; mech-table 0x17 label/body mismatch logged in open-questions). 1995 SCORING MODEL [T1]: kills + received-damage penalties + death costs. NO per-hit credit (type-0 lands in a Verify arm that folds an UNINIT stack float -- real 1995 bug; port banks 0). Kill award = (victimKillBonus + tally) x inflictedMod x (victimAvgDmg@0x354 x damageBias + 1) x tonnage ratio; teamkill = -ffPenalty; SELF-KILL NEGATED (fchs @0x4c03ab) = the #134 penalty.
  • CODE: BTMechPostCombatReports + BTMechPostVehicleDead (btplayer.cpp bridges); mech.cpp handler restructured (death latch at ENTRY, collision divert falls through to the tail per @0x4a0375 jmp -- wall deaths now respawn+blast); BT VehicleDeadMessage 0x38 ext {killed-by player, kill zone}; ScoreMessage fields renamed (vitalHit/zoneIndex/subsysID) + wire static_asserts; VTVDamaged points_transfered corrected (Round(award), not Now() -- ST0-arg __ftol misread). RETIRED: BTPostDamageScore/BTPostKillScore + 3 call sites + the mech4 VehicleDead dispatch (the [T3 sender-undecoded] flag is resolved -- this IS the sender).
  • BENCHES (all PASS): scorekill.sh cross-node kill (killer kills=1 award=4.88; victim log killedBy=2:1 zone=3; death #1 single cycle); scoreself.sh #134 (type=2 award=-39.00 kills=0, total drops); deathblast2.sh regression (72 bursts ~9u). Collision-tail = inspection [T3]. Bench gotchas hit: spinner target splits leg damage across legs (drop BT_SPIN_SELF); BT_ZONE_WALK=60 paces pulses too slow (use =8 + BT_WALK_ZONES=dz_ldleg for a ~2min kill).
  • TRACKER: #134 CLOSED (awaiting-verification) w/ bench receipts; #45 + #89 follow-up comments.
  • KB: combat-damage (new report-tail section), decomp-reference (BTPlayer table + role offsets + msg layouts + mech+0x354), open-questions (0x17 mislabel, @0x4c05c4 ext-field consumption, collision bench, uninit-award curiosity), multiplayer, KD_SCOREBOARD addendum. checkctx CLEAN.
  • FIELD-VISIBLE CHANGE FOR RELEASE NOTES: score column now behaves like 1995 (kills pay, taking damage costs, panic eject costs, per-hit credit gone). KILLS/DEATHS columns unchanged.
  • NOT DONE: burning-state (mech-0x17 mislabel blocks it); @0x4c05c4 killed-by consumption (sender carries the fields); DIV firmware intersection routine (unchanged).

2026-08-05 (evening): SEARCHLIGHT reconstructed (412053d + KB commit)

User picked searchlight over crouch (crouch's +0x398 consumer is un-located in the export = an open-ended dig; parked). Findings + state:

  • SUBSYSTEM was already DONE (searchlight.cpp); input already bound (F5 -> streamed 0x14). The GAP was visuals, decoded from @004cef28 case 0xbd8 [T1]: COCKPIT = FOG SWAP (fog= lit set vs nosearchlightfog= dark set, authored per BTDPL.INI page; arena_night 40/400 vs 5/400!) via SetFogStyle 2/3 -- the engine kept ALL of it by name; completed the stubbed plane application + transcribed the @456778/@456814 watcher into TickSearchlight (inverted-cache first-tick sync = authentic DARK night start). EXTERNAL = spot.bgf cone on the searchlight SITE joint, LightOn-driven (@45612c watcher); site segments now get geometry-less DCS children (were skipped entirely).
  • FIDELITY BUG FIXED: all prior builds rendered the LIT fog permanently (nothing ever called SetFogStyle(3)). Tonight night is AUTHENTICALLY DARK -- release notes MUST say "press the searchlight (F5)" or expect "game too dark / broken" reports.
  • mountSegment @0x1DC identified (was "commandedOn, role unidentified") = resource segmentIndex.
  • BENCHED: searchfog.sh (solo: first-tick dark sync, press->SetFogStyle(2), red-fog probe proves the fog pipeline end-to-end), spotcone.sh (2-node: B press -> replication -> A "[spot] cone SHOWN (seg 20)"). Bench traps hit: BT_BTNTEST too early (2-node spawn ~poll 900), the renderer-level LoadObject wrapper is a btstubs NO-OP (marker case dormant! open-questions) -- cone loads via d3d_OBJECT::LoadObject direct.
  • OPEN: cone size/aim eyeball pass (user launch); des_night pages have subtle deltas (arena = the drama); LoadObject wrapper + dormant marker.
  • NOT DONE tonight: crouch (0x1a DuckRequest latch is 4 lines; the CONSUMER needs a byte-scan dig for [reg+0x398] readers -- a good quiet-day project).