Files
BT411/scratchpad/SESSION_HANDOFF_20260803.md
T

324 lines
21 KiB
Markdown

# 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=<frames> 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 <pfx>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).