Joe DiPrima
e693b481b3
commit-hygiene sweep: (1) the #170 L4STEAMNET.h contract comment never landed in 2fe58b8 -- the git add used the lowercase filename and the case-mismatch left the tracked (uppercase) path unstaged, silently; (2) the gauges-hud #172 correction was a silent no-op -- a python str.replace whose multi-line needle didn't match printed 'corrected' anyway. Both applied for real now (verified by grep, not by exit code). Note the pattern: two silent tool no-ops in one evening -- verify edits by READING the result, not by the tool's success message
2026-08-13 02:15:45 -05:00
Joe DiPrima
81b0887033
#172 corrected same day (user challenge upheld): the 6px-strip-was-invisible framing RETRACTED -- [lampblink] receipts prove the surround paints the flash at a metronomic 125ms (code-identical loop in 913), and Elengil's layout receipts show the stock surround with the lamp on screen. The real mechanism is EXPECTATION: a generator leak lights the button BY THE RADAR (authentically the only place -- no MFD carries a generator-leak indicator) while testers watch the MFDs. Ships: handout WHERE-TO-LOOK entry ( #172 ) + the refined #136 voice-loop wording; the alert ring is GATED OFF by default (BT_ALERT_RING=1 keeps it available if Friday proves testers miss the lamp even knowing its location); [lampblink] shade-transition receipt added (BT_LAMP_LOG). Era question posted for Oracle: how prominent was the pod's physical generator button light?
2026-08-13 02:14:13 -05:00
Joe DiPrima
8b3d1c8113
#172 root-caused: the leak-lamp chain was NEVER broken -- all 35 night-16 leak events flashed same-frame (Elengil's 'fatal no-flash' lamp flashed 28.4s in the ~6px glass radar-rail strip; the 'delayed' weapon-leak flashes are the AUTHENTIC page gate delivering at eng-page entry; the leak voice is a LOOPING sequence so 5-6 repetitions carried zero edge information -- the testers' clock was the bug's best disguise). Ships: the ALERT BLOOM (glass-only #154-class deviation -- an alternating surround lamp paints a +8px halo UNDER the surfaces, so only the outward bloom shows, respecting the twice-field-broken no-overlay rule) + two always-on receipts closing the observability holes this hunt fell into: [seqloop] START/STOP (looped alarm sequences -- voice-vs-lamp timing now log-readable) and [lamppx] alert ON/OFF (lamp state -> PIXELS, with cell size). Verified live: GeneratorB=0.6 leak -> seqloop START + lamp 0x1b FLASHING + lamppx bloom8 same cluster. #136 refined: edge-started, level-LOOPED, edge-stopped. KB: gauges-hud leak-lamp routing map (generator=rail-only authentic, condenser 0x2c gap authentic, weapon page-gating authentic, cond 1/3 have NO authored lamps)
2026-08-13 01:56:36 -05:00
Joe DiPrima
e614924107
one night = ONE log file: the 8MB size roll-over retired (it cost field evidence the moment it existed -- night16: Elengil's incident window sat in an unsent pre-rotation part; testers attach 'the log' = the newest part). The 6am log-day boundary stays. Transport moves to players/SENDLOGS.bat (ships at the dist root): one double-click zips every log/matchlog/lastrun from the last 36h to a Desktop BTLOGS_<machine>_<date>.zip (~10:1 text compression -- a 13MB night = 1.8MB, well under Discord's 10MB free cap, which is what the roll-over was protecting against). Handout HOW TO REPORT updated; mkdist carries the bat
2026-08-13 00:45:21 -05:00
Joe DiPrima
fcd592c0f2
#165 ROOT-CAUSED after three failed fixes -- the binary keeps ONE destroyed cell per subsystem (+0x40: fire gate, dial X, wire header, every writer) and the port split it into FOUR stores; the everyday CRIT-LOTTERY kill (MechWeapon::TakeDamage) bypassed the reconstructed base and wrote only the X store, so X'd weapons kept firing while every prior fix aimed at a gate that was never broken (the 4,213-refusal bench drove BT_KILL_SUBSYS, which writes all cells -- it validated readers, not writers). FIX: MechWeapon::TakeDamage chains to MechSubsystem::TakeDamage (@0x4ac0bc semantics); the port-authored FSM-from-damage tail is DELETED (it parked partial-crit weapons at level 1 -- no FSM case, the silent freeze, and with beamFlag armed the 883 hanging beam: #164 's upstream writer, caught red-handed by berserker's 20x STUCK-ON receipts); the phantom uninitialized simulationState int is ctor-initialized and kept in lockstep at every destroyed write; always-on [crit] DESTROYED receipt makes crit kills field-visible. BT_CRIT_SUBSYS bench hook drives the REAL writer path; weaponx_bench PASS: kill phase 0 FIRED post / 5,664 refusals / X+gate agree, partial phase keeps firing. Gotcha 30; #174 filed (cascade re-descend)
2026-08-13 00:35:33 -05:00
Joe DiPrima
2fe58b8b89
#170 root-caused + fixed: the #163 SteamAPI_Shutdown was the crash -- at round end every peer's close events are ALWAYS in flight, and Shutdown tears client state down while steamclient's own service thread dispatches them (the field stack: a steamclient worker calling literal NULL, zero btl4 frames, 7 hits / 3 machines / one module-relative stack). BTSteamNet_ShutdownAll is now a QUIESCE: steamActive gated FIRST, linger closes ('round over' not timeouts), one SNS drain, 60ms grace, NO SteamAPI_Shutdown -- and every exit path dies via TerminateProcess (menu-quit no longer returns through the CRT; it uses BTOrderlyDie like everything else, so the 883 detach deadlock stays dead too). Status callback guarded for the dying window. Crash filter now names foreign DLL frames (module+offset via VirtualQuery/GetModuleFileName) so the next foreign-thread crash arrives pre-symbolized. Exit contract: steam-networking.md
2026-08-12 23:23:23 -05:00
Joe DiPrima
c3258ee2e1
night-16 field intelligence (build 913, 20260812): tracker housekept -- 6 field-verified closes (#162/#156/#154/#135/#169/#128), #165 FAIL detail + #76 Nanook comment, 4 new tickets ( #170 menu-relaunch NULL-callback crash = top defect, #171 ballistic hitscan era question ON HOLD, #172 leak first-flash edge, #173 chicken-walker myomer overheat); KB gains the night-16 section + the spawn-discharge/generator-bias heat note [T3]
2026-08-12 23:05:55 -05:00
Joe DiPrima
6ac62dff6f
KB sweep: the game is NOT '1995' -- era witnesses say BT 4.10 shipped later, and the 1995 belief traced to the MUNGA library RCS strings inside BTL4OPT.EXE (library code date, not the game; the exe has no game-copyright year). ~120 era references across CLAUDE.md/context/glossary/handout rewritten to 'the original'/'the shipped machine'; genuine dated facts kept (RCS $Id strings, Borland 1994, the 30-Nov-1995 asset timestamp); dating note + evidence added to project-overview.md
2026-08-12 11:50:56 -05:00
Joe DiPrima
535dc8bfa7
tester handout regenerated for Friday (build 4.11.913): section A rebuilt around the week's 9 fielded fixes ( #162 headliner + #156/#154/#164/#163/#135/#128/#166/#169, Cyd's #48-family, #136 explained-authentic), #167 added to monitor, #132 cross-referenced to the #164 beam family, counts recomputed (58 open)
2026-08-12 11:34:01 -05:00
Joe DiPrima
256c45f509
Merge Cyd's vPLASMA_fix: the desktop plasma marquee showed heap garbage from boot until the first callsign draw -- PixelMap8 allocates uncleared and the glass window blits the WHOLE buffer (the pod's serial path only sent changed lines, so hardware never showed it). Ctor memset to index 0; glass-only.
2026-08-12 10:57:19 -05:00
Joe DiPrima
3db7990d6c
Merge Cyd's glass-palette-token: the dirty-skip repaint token now folds in a palette write generation -- the ColorMapper family (armor rosette tints, adpal damage flash) animates via CLUT writes with zero pixel churn, so palette-expanding glass windows held stale colors while the D3D surround tracked live. Generation bumps only on a REAL entry change (the flash writes identical RGB at zero damage every Execute).
2026-08-12 10:57:18 -05:00
Joe DiPrima
c6c6ddad6c
Merge Cyd's sec-phantom-fix: #48 refined -- out-of-range art indices map to plane BACKGROUND, not cycled in-plane (idx-254 art in SMODE.PCC + BTSEC1.PCX was landing on the live right-armor damage slot: the phantom mode-box fills and the stray bar by the heading dial). Background is the shipped machine's on-screen result.
2026-08-12 10:57:17 -05:00
Joe DiPrima and Claude Fable 5
1282063cc7
#164 hardened to impossibility + the config theory tested NULL: the beam draw now requires the weapon to actually BE in Firing(0) -- the 1995 visual rode ContinueDischarge's per-frame re-messaging which stopped the instant the state left 0, so state-gated drawing is the faithful semantics and makes ANY beamFlag bookkeeping stick invisible by construction (Conn Man's screenshot: red laser, leg-level origin, dials green = a live weapon with a stuck flag). Receipts stand armed for the field: [beam] STUCK-ON (armed flag outside Firing) and DESTROYED-BUT-ON, each naming the weapon. The config-mid-discharge theory was tested deterministically (BT_CFGTEST waits for state 0 and dispatches ConfigureMappables to that weapon): the dispatch landed with beamFlag=1 and NO stick followed -- the handler does not disturb the discharge; theory retired with receipts. Upstream cause remains open; one field recurrence now names it.
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-12 02:14:34 -05:00
Joe DiPrima and Claude Fable 5
f4feaea4c1
KB: the replicant StopMission authority leak ( #156 layer 3) recorded in multiplayer's owner-only discipline + fade_bench registered in the bench suite table
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-12 01:57:42 -05:00
Joe DiPrima and Claude Fable 5
d01409a48c
#164 guard + smoking-gun receipt: the beam draw walk (DrawWeaponBeams) filtered by CLASS only -- a destroyed emitter with beamFlag still armed kept drawing, and a destroyed ARM's mount segment is gone so the muzzle falls back to the mech ORIGIN: Conn Man's feet-anchored rudder-riding hanging beam (his MS-FIREFLY log: every destruction all night was an ERPPC+ERSLaser arm pair). The walk now refuses destroyed weapons (dual-cell read, gotcha 22 accessors) and prints '[beam] DESTROYED-BUT-ON' when it catches an armed beamFlag on a dead weapon -- one field recurrence names the upstream stick; the visual cannot render regardless.
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-12 01:52:35 -05:00
Joe DiPrima and Claude Fable 5
880ee20005
#156 layer 2+3, both field-caught watching the fade live: (a) the fade-out completed into a phase-0 re-arm that RESTORED normal fog for the ~2s before teardown -- the binary's zone fog stays closed, so the machine now holds a terminal black phase until the next MissionStarting edge; (b) the 3.0s end window itself never existed on ANY node: a REPLICANT player copy mirrors the remote master's MissionEndingState through its record header, and its never-armed fadeTimeRemaining (<=0 at first tick) dispatched the second StopMission instantly -- Stop() killed the mission loop before the fade could render ([fade-clk] receipts: a clean 3->2.976->... countdown interleaved with a stray remaining=-0.976). ManageApplicationStatus is now owner-gated (a replicant player must never drive application state -- the same authority discipline as scoring). This was the FIELD half of the no-fade report too: steam nodes hold up to 7 replicant players, any of which cut the window to ~one record heartbeat. Receipts now: 124-tick single countdown, phases 1-5 on both nodes, fade rendered + black held to teardown.
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-12 01:43:14 -05:00
Cyd and Claude Opus 4.8
6a60b46f8d
plasma window: initialize the display area (junk shown until the callsigns)
...
The desktop plasma marquee showed heap garbage from boot until the gauge
renderer first drew the callsigns. Root cause [T0]: PixelMap8(w,h) allocates
its pixel bytes UNCLEARED (GRAPH2D.cpp `new Byte[w*h]`, no memset) and
Video8BitBuffered never clears them either -- only changedLine[] is zeroed.
The real pod never showed it: the serial PlasmaDisplay transfers only CHANGED
lines, so the garbage never left the buffer and the hardware marquee sat at
its power-on blank. PlasmaWindow::Update however blits the WHOLE buffer
every frame, exposing the junk for the window-up-to-first-draw gap (seconds
on slower rigs).
Fix: PlasmaWindow ctor memsets the pixelBuffer to index 0 (the near-black
background) -- the window comes up blank like the hardware did. Glass-layer
only; the serial pod path is untouched. Verified: glass boot shows a clean
marquee from the first visible frame.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-08-11 20:29:33 -05:00
Cyd and Claude Opus 4.8
937c9ad74c
sec-surface phantoms: #48 wrap lit idx-254 art in live armor colors
...
Playtester report: (1) the CONTROL MODE stack showed filled boxes around the
inactive MID/ADV entries, (2) a phantom block between the HEADING dial and the
ARMOR rosette. Root-caused [T1]:
The #48 translation-table cycle-fill (6bb03ae , 2026-07-25) mapped
out-of-range art indices in-plane as (index mod 2^bits) -- so art index 254
landed on plane slot 62 = the LIVE colorMapperMultiArmor right-armor damage
slot. And idx-254 art EXISTS: every SMODE.PCC frame fills the INACTIVE
mode-box interiors with 254, and BTSEC1.PCX carries a stray 52x13 idx-254
bar at port (199-250,101-113) between the heading dial and the rosette (a
scratch duplicate of the rosette quadrant bars). Both lit up in the
current right-armor color (adpal ramp green/orange/red) on EVERY render
path. On the shipped machine those regions rendered BLACK (the garbage
entry's low plane bits were 0), which is why the 2026-07-19 smode audit --
run before the cycle-fill landed -- verified CORRECT.
FIX (BuildSecondaryTranslation): map [2^bits..255] to translationTable[0]
(plane BACKGROUND) -- the authentic on-screen result, same no-leak
guarantee. Verified on both desktop paths: MID/ADV back to authored
borders+text (idx 5/9), no interior fills; the phantom bar gone; the BAS
badge and the live armor rosette (in-range slots 60-63) untouched.
KB: gauges-hud #48 REFINED addendum; GAUGE_COMPOSITE audit row 33 corrected
(binding is ControlsMapper/ControlMode, not DisplayMode) + re-verification
note.
(The companion glass-token palette-generation fix lives on glass-panel-perf --
it depends on the dirty-skip code there. The two branches touch disjoint
hunks and merge in either order.)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-08-11 20:29:20 -05:00
Cyd and Claude Opus 4.8
7516eee4d8
glass dirty-skip: fold palette generation into the repaint token
...
Latent flaw in the c9e25e5 dirty-skip (now in master): the token hashes plane
PIXELS + lamp state only, but the ColorMapper gauge family (armor rosette
tints, the adpal/adpal2 damage flash) animates by writing CLUT entries with
ZERO pixel churn -- so a glass window whose plane is pixel-static held stale
colors while the D3D surround (which re-expands every frame) tracked live.
New SVGA16::paletteGeneration, bumped by the palette writers:
- BuildSecondaryColor: only on a REAL entry change (the flash alternates
palettes every Execute writing identical RGB at zero damage -- an
unconditional bump would repaint every palette-expanding window every
pump for nothing);
- BuildSecondaryPalette / BuildAuxiliaryPalette / BlankPalette (full
rebuilds): unconditionally.
GlassWindowToken folds it in for palette-expanding windows (monoTint < 0, or
all windows under BT_GLASS_MFD_PAL); mono-tint windows don't read the palette
and keep their pixel-only token.
KB: glass-cockpit.md gains the repaint-pump section (records f3d27f5 +
c9e25e5 + this). Companion branch sec-phantom-fix carries the idx-254
translation-table fix -- disjoint hunks, merges in either order.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-08-11 20:29:06 -05:00
Joe DiPrima and Claude Fable 5
fc71f9c0bb
#156 the mission start/end fade RECONSTRUCTED: POVStartEndRenderable was an inert stub (rounds hard-cut) -- the binary's 5-phase fog machine (ctor @00454394, Execute @0045447c; constants byte-read @0x454740-50: flash 0.1s, fades 1.0s, plane floors 0.01/0.05) now runs at the renderer frame head keyed on the local player's SimulationState (3 MissionStarting -> white flash + 1.0s fade-in from white; 4 MissionEnding -> 1.0s fade-to-black, planes closing to the floors, re-arm). Drives the live fog pipeline (currentFogNear/Far + FOGCOLOR, which the frame Clear also samples -- the fade owns sky/void too) and re-reads the STYLE members per frame exactly as the binary re-reads live view fog (mid-fade searchlight swaps track). Armed by the now-real ctor in btl4vid.cpp (house pattern: inert object, module machine). Bench fade_bench.sh: 40s relay-clocked round, both nodes PASS armed + phases 1/2/3/4 in order with the end edge on simState=4. Rider: the [rio] STALL detector now keys on REPLY drought instead of request age (which the 50ms poll refreshed forever -- the detector could never fire; #160 telemetry).
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 18:54:12 -05:00
Joe DiPrima and Claude Fable 5
2938d4918c
context-system housekeeping: the 2026-08-11 wave lands in the digests -- router Current-front refreshed + the four audit ledgers listed + the docs/ AI-vs-human split labeled; test-harness gains the standing bench-suite table (kd4/kd8/proj_ttl/gen_edge/xfire + rig notes: clone-the-pilot-page pattern, only map-defined dropzones are valid); multiplayer gains the K/D authority + #45 mirror section with the 4/8-node stress record; combat-damage gains the synchronous-death-transition section (gotcha 25 pointer, tripwire semantics); open-questions replicant-delivery entry gains the 0-of-35-deaths bench datapoint (needs field conditions); the #154 multi-agent audit lanes preserved from session temp as docs/GEN_WARNING_AUDIT_20260811.md (with the no-speech retraction lens noted). checkctx: CLEAN.
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 18:37:59 -05:00
Joe DiPrima and Claude Fable 5
4b986af94d
KB: gotcha section 25 (same-pass edge latch sampling deferred state -- the #162 double-credit class) + decomp-reference gains the synchronous mode-9 timing fact (part_012.c:14761 reads it flipped in-pass) and the 4/8-node mirror-convergence bench record
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 18:16:39 -05:00
Joe DiPrima and Claude Fable 5
1b6d247e51
#162 4-node retest CAUGHT + FIXED a same-frame double-credit: two lethal deliveries of one salvo (direct + splash, 2ms apart, no sim tick between) each read destroyedAtEntry=0 -- the entry latch samples movementMode 2||9 but our death transition (mode 9 write) ran NEXT TICK in UpdateDeathState, while the binary flips mode SYNCHRONOUSLY inside the same damage pass (its tail gate part_012.c:14761 reads 9||10 already set). Result: duplicate kill credit to the shooter (bench receipts: kills 1->2 in 2ms, awards 525.00/516.67) and a duplicate VehicleDead whose death cycle the receiver dedup swallowed -- but the kill report had already escaped. Invisible to every 2-node bench (direct kills deliver one lethal hit; splash+direct overlap needs crowds) -- the 8-player field 'kills way off' shape. Fix: the death tail now runs the once-per-death transition inline (mode 9 + type-6 + effects) before returning, exactly the binary's sequence; the next lethal message latches on both destroyedAtEntry and deathBlastArmed. The wrong 'synchronous' claim in the old comment corrected. Benches: kd4_bench (receipt-derived per-player invariants + bystander mirror convergence + no-mirror-exceeds-authority + inst=R audit) PASS 9/9/9/9 SWALLOWED=0; kd8_stress staged (8-node all-vs-all melee).
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 17:52:51 -05:00
Joe DiPrima and Claude Fable 5
7fa6dc536c
#135 FIXED, two defects: (1) the generator lamp special was mis-reconstructed -- the binary @004cc27c is table_0051d070[generatorNumber] (bytes {0x29,0x1A..0x1D}, 1-based A..D, same shape as the condenser special), not an aux-screen placement probe generators never fill; a leaking generator now flashes its own lamp (benched: '[lamp] 0x1a <- 0x37 (FLASHING)' on a GeneratorA leak; was the field-logged 'NO LAMP RESOLVED'). (2) the eternal loop-button flash: Lamp::SetAlertState/SetState drop their panel notify when the edge lands off-page or in the one-frame mask race of a page transition, and the panel value latches the last-asserted flash forever -- Oracle's 'Loop 6 NEVER stopped' with Condenser6 SET/CLEARED balanced 3/3 in his log (the alarm manager was right; the lamp was stale). The skipped notify is now remembered and delivered at the lamp's next in-mode frame. KB: decomp-reference gains the 0x51d070 table + the stale-flash gotcha.
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 17:08:48 -05:00
Joe DiPrima and Claude Fable 5
14c62f184d
#166 mechanism pinned + two input-layer fixes: Oracle's LRM jam = the ammo bin PARKED at Ejecting(3) with rounds aboard (his log: 'NoAmmo (gate2): rounds=18 binState=3', twice; eject tap cleared it exactly as the handler predicts). The MFD/HUD 'desync' is honest: the full green circle is the RECHARGE dial (untouched by the gate2 pin) and the btejam lamp keys only on weaponAlarm 5 (binary @004c9a38) -- state-7 pins show neither, authentically. The parking producer needs an unpaired eject PRESS, which pod hardware cannot make but our glass mouse layer could: (1) WM_CAPTURECHANGED now releases a held panel button when capture is stolen (Steam overlay/popups ate the WM_LBUTTONUP), (2) a new press releases any still-held previous button instead of orphaning it. Forensics: every EJECT message now logs data/bin/ejectState/binState/rounds always-on (ejects are rare) -- Friday names the producer if it recurs. Smoke: BT_EJECTTEST replays the full press/hold/dump receipt chain incl. the authentic mid-eject gate2 pin.
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 16:45:12 -05:00
Joe DiPrima and Claude Fable 5
18fba98298
#165 does not reproduce -- the destroyed-weapon fire gate HOLDS on the exact field path: bench (xfire_bench.sh) kills ERPPC_1+ERSLaser_1 via the cascade's own ForceCriticalFailure writer under held autofire -- ERSLaser_1 9 FIRED pre-kill, 0 post, 4213 refusals (destroyed=1), surviving ERMLaser fires on. Rajel's field read explained: the refusal tail recomputes output voltage every tick (binary-authentic), so a destroyed weapon's recharge dial keeps CYCLING under its X while the surviving torso lasers put the beams peers saw. Rider: the [emitter] FIRED receipt now NAMES its weapon under BT_DMG_LOG (the #110 nit) so the next field session can settle it by name.
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 16:13:39 -05:00
Joe DiPrima and Claude Fable 5
df4d1c8ac7
#169 rider: shorten the roster build-gate tag to [WRONG BUILD] -- the '-- WILL NOT LAUNCH' tail clipped at the 536px row edge (caught in the layout preview render)
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 15:55:23 -05:00
Joe DiPrima and Claude Fable 5
c8373f2407
#169 lobby room layout: LEAVE button was half-clipped because 560x360 was the OUTER window size (the caption bar ate the bottom ~47px of a client that needed 336+), and rosters past 6 members drew through the fixed LAUNCH frame at y=250 (rows flow to 268 at 8 players). Buttons now sit below the full 8-slot roster (LAUNCH 280-326, LEAVE 336-366) and the window is sized by CLIENT rect via AdjustWindowRect (560x382). Geometry-proven; visual verify = next lobby + Friday's 8-player night.
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 15:51:07 -05:00
Joe DiPrima and Claude Fable 5
fef6fad47a
#154 phrase identity ear-verified: the generator trigger's sequence (Warnings01 z4/z0/z3) is Yip's spoken 'generator out' line -- the deviation now speaks the real voice at the trip. KB tier bumped to T2.
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 15:47:15 -05:00
Joe DiPrima and Claude Fable 5
8d2f48225b
#154 correct the record: the warnings ARE VOICE -- Warnings01/AllWarning zones are Yip's recorded words, phrase-sequenced by the AudioControlSequences (our own #119 commit 42b0691 said so); the generator sequence z4/z0/z3 is the spoken 'Warning, generator out'. The same-day 'BT 4.10 shipped no speech / era memory is Firestorm' claim is retracted -- it rested on preset names and ignored repo history; with the voice real, the era memory of hearing it at the TRIP may be genuine (possibly a later floor revision fixing the same authored bit our deviation flips). The fix itself stands and is strengthened. KB entry rewritten + process lesson recorded (grep git log before asserting absence).
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 15:27:07 -05:00
Joe DiPrima and Claude Fable 5
08fc87ec6e
#154 settled: the generator-out warning was authored on the WRONG EDGE in the shipped 1995 content -- BTL4.RES keys it (trigState=4, inverse=1, Start) = fire on LEAVING GeneratorOut, so a thermal trip was SILENT and the klaxon played at recovery/respawn (live-benched both ways; decode triple-verified: T0 read order, binary @0043e7d4/@0043eb40 semantics, independent byte parse; 144-row census = the game's ONLY inverse-Start fault trigger). DELIBERATE DEVIATION (user-approved, the port's only content override): AudioStateTrigger ctor flips it to enter-4 at stream time -- warning at the TRIP, silent at recovery + the respawn 4->0 edge; BT_GEN_WARN_SHIPPED=1 restores shipped. Threshold audit closes AUTHENTIC: recovery at heatAlarm NormalHeat = T<=1000 vs trip at 2000 = exactly the manual p23 half-cooled rule, and the heat bar's red fill maps to it to the tick. Era-witness reconciliation: BT 4.10 shipped NO speech samples (full AUDIO1/2.RES census) -- the remembered voice at trip is Firestorm's. Rig: BT_GEN_HEAT injection + BT_AUDIO_EDGE receipts, gen_edge_bench.sh PASS (4 fixups, trip FIRED, recovery 0). KB: decomp-reference generator section + no-speech note; manual p23 also answered #133 (X = crit-destroyed).
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 07:39:42 -05:00
Joe DiPrima and Claude Fable 5
e2ab17665d
#168 settled from the binary: projectiles are TIME-capped, never range-capped -- plain shell 5.0s (@4bddec), missile burnTime+10s + y<-1 kill-plane (@4bef78), WeaponRange is fire-control only (FireWeapon @4bcc60 has no range gate), so AFC50 hits at 2000+u are authentic. Two port defects killed: the invented len*1.3+60 flight cap (replaced by the authentic clocks) and the stale-point auto-hit (unguided contact tested the fire-time pick, so a locked AC could not miss a moving target -- the pool now tracks the live target). KB: decomp-reference gains the flight/expiry section, CLASSMAP's swapped authoritative/ghost Performance labels corrected (ReplicantInstance=4 [T0]), missile.cpp's misdecoded @4bf594 constant pool re-annotated, Missile proximity fuse 4.0u recorded. Bench: proj_ttl_bench.sh (probe fizzles 5.012/12.012 vs caps 5.0/12.0; 86 field launches, 0 early, 0 phantoms). Rides along: the #163 BTSteamNet_ShutdownAll header decl that missed d3f4b9a.
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 04:39:37 -05:00
Joe DiPrima and Claude Fable 5
dfefdfa1d0
#128 terrain-ram instant coolant leak FIXED at the eligibility tag: GUID 0x50e590 is the AGGREGATE BANK's node (0xBBE), not the HeatSink base family -- the family-wide reading made every coolant-bearing subsystem (myomers, condensers, reservoirs...) rattle-eligible, so one over-floor ram sub-hit sprang an instant leak (field: Michael's 3 rams all 'Myomers condition 2 SET' -- a subsystem 1995 can never select). Authentic set {HeatSinkBank .30, Gyroscope .35, Torso .25}; scrapes remain free via the byte-anchored 0.5-pt floor (the 30k-lines/night [crashdmg] spam now sampled). Audit: docs/RAM_LEAK_AUDIT_20260811.md. Bench ram_bench.sh: 20 rattles, zero ineligible strikes
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 02:33:14 -05:00
Joe DiPrima and Claude Fable 5
d3f4b9a55a
#163 round-end freeze + hang-on-exit FIXED: bare ExitProcess ran DLL detach with live Steam threads (no SteamAPI_Shutdown existed anywhere) and intermittently deadlocked -- the dead process's fullscreen frame squatted on screen while its menu child hung in SteamAPI_Init against the wedged sibling (field-captured, ZEUS 22:12:38). Ordered exit everywhere: flush forensics, BTSteamNet_ShutdownAll BEFORE the child spawns, hide our windows, TerminateProcess (detach skipped, deadlock structurally unreachable). Audit ledger: docs/MISSION_END_AUDIT_20260811.md (also yields #156 's fade root cause). Bench: relaunch_bench.sh -- old pids dead, menu children clean
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 01:58:23 -05:00
Joe DiPrima and Claude Fable 5
420558cf4a
#162 eject-arm predicate fix, canary-caught: destroyedAtEntry now samples the binary's MODE-based FUN_0049fb54 (movementMode 2||9), not alarm-based IsMechDestroyed -- EjectPilot's alarm-10 pre-write made a real punch-out read 'already destroyed' and silently ate the suicide type-2 (-499 arithmetic) while cook-off suicides scored; the alarm-vs-mode trap #108 fixed for deathBlastArmed, one latch over. Benches: eject canary 6/6 deaths+costs+type-2s (5 suicides incl. the real eject, 1 kill); primary kd_bench 7/7/7/0 re-verified
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 01:09:13 -05:00
Joe DiPrima and Claude Fable 5
94e80311f2
open-questions: the replicant-side TakeDamage delivery mechanism (inst=R executions vs ENTITY.cpp reroute) -- consequences gated by #162 , cause unmapped
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 00:36:35 -05:00
Joe DiPrima and Claude Fable 5
77bb54d333
KB expansion from the #162 audit: full five-agent evidence record preserved (docs/KD_CHAIN_AUDIT_20260811.md), decomp-reference gains the audit's hard addresses (VehicleDead arm internals, the +0x290 never-set byte-scan, the DropZoneReply clear pair, the 2|9 vs 9|10 latch asymmetry), the stale 'inflicted-only' claim swept (mech.cpp), cross-links + KD plan marked historical
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 00:27:47 -05:00
Joe DiPrima and Claude Fable 5
3545056395
#162 K/D chain fixed at the authority model, once and for all: death tail master-gated (the 1995 sender one-shot restored -- the binary has NO receiver dedup, +0x290 never set [T1 byte-scan]); the #81 latch-clear misattribution corrected (binary site = DropZoneReply tail); steam eggs stamp the host's advancedDamage mission-wide (penalty was silently off for every steam match); #38 badge/patch ride the lobby (bd/pt keys). Bench: kd_bench.sh, five hard invariants, 4/4 deaths+costs+credits, zero dupes
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 00:21:46 -05:00
Joe DiPrima and Claude Fable 5
40c35946cd
tester handout regenerated after Oracle's annotated sweep: 35 closed, 59 open, 883 headliners called out ( #149 glass fix + #150 double-kill, first fielded build with both)
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-10 15:26:31 -05:00
Joe DiPrima and Claude Fable 5
47dcc62fc1
pod RIO investigation day-end: board mutes ~13s after each start (render-load/power-rail hypothesis for tomorrow); USB re-enum does NOT revive it; keep tools/probe_rio.ps1 (raw COM1 hand-poll); note the stall-detector keying fix needed
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-10 13:40:53 -05:00
Joe DiPrima and Claude Fable 5
9754fb1295
correct the record: the 2026-08-10 boot wedges were the USB-serial adapter hanging an unbounded overlapped write, NOT print-deadlock (confounded A/B, retracted); pod runbook gets the full COM1/FTDI diagnosis + remote minidump procedure
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-10 13:35:13 -05:00
Joe DiPrima and Claude Fable 5
716e10e3fa
serial write hardening: bound the overlapped-write wait (500ms + CancelIo + 3s sick window) -- a dropped USB-serial link parked the game forever in GetOverlappedResult (ALPHA-MR minidump: SendPacket <- RIO ctor); txTO= counter joins the [rio] health line
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-10 13:30:41 -05:00
Joe DiPrima and Claude Fable 5
ab1b3439f4
[rio] telemetry FIX: printing from the serial poll path deadlocks against the PCSPAK RX thread (0-CPU park ~10s after every live-RIO boot, A/B-convicted on ALPHA-MR) -- GetNextEvent now only COUNTS; the printer (BTRioHealthReport) rides the glass tick beside [glassperf]
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-10 13:06:06 -05:00
Joe DiPrima and Claude Fable 5
7cd58d3000
pod runbook: schtasks /end orphans the game (dead-RIO trap) + self-cleaning runpod.bat
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-10 12:35:52 -05:00
Joe DiPrima and Claude Fable 5
a28878beaf
[rio] link-health telemetry: req/rep/btn counters, reply age, the existing (never-printed) line-error/abandon/board counters, and STALL/RECOVER event lines -- default-on for hardware RIO, BT_RIO_LOG=0 opts out (encoder-dropout hunt on ALPHA-MR)
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-10 12:34:10 -05:00
Joe DiPrima and Claude Fable 5
a7722d9ca9
pod: EDID monitor:id binding DEPLOYED + verified on ALPHA-MR; runbook updates (Default_Monitor radar identity, cmd 1>> trap, tester-procedure deploy verified)
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-10 11:56:26 -05:00
Joe DiPrima and Claude Fable 5
bf04e1c079
port-layer papercuts for the playtest: #69 Denkou rename, #71 plasma X=minimize, #157 round-end UX (foreground handoff + lastrun clean-exit markers + bat sign-off rewording); tester-facing open-issues handout (docs/) + field-log anatomy notes
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-10 11:29:01 -05:00
Joe DiPrima and Claude Opus 5
46ff8dd262
#150 double kill FIXED (two binary-cited gates) + #151 measured AUTHENTIC to the point
...
#150 -- one kill credited twice (Rajel on Oracle, Oracle on Conn Man).
CAUGHT: one death -> two type-2 arms 1ms apart (awards 501.96/505.88 -- the
tally GREW between them), victim inst=R. Mechanism: this port deliberately
applies damage on replicants for local visual response; the report tail ran
there too, and a replicant's movement mode cannot flip to wreck until the
victim's death record round-trips -- so each round of a killing VOLLEY inside
that window re-posted the kill. Why missiles, why intermittent.
The binary forbids the whole situation: its handler OPENS with the assertion
if ((flags & 0xc) == 4) Fail("Replicant Mech recieving takedamage",
MECH.CPP, 0x3da) [part_012.c:14613]
-- TakeDamage on a replicant was a BUG in 1995; the tail only ever ran on the
victim's master. Fix: (1) gate the REPORT TAIL master-only (local damage
application stays); (2) adopt the binary's once-latch -- the 0->1 edge of
IsMechDestroyed() across the handler call (local_14), replacing the
deathBlastArmed form for the report gate.
VERIFIED (scratchpad/night14/scorepair.sh): 3 victim deaths, 5 shooter
respawns -> exactly one type-2 per credited kill, kills 0->1->2, zero doubles
(was: kills 0->2 on one death).
#151 -- panic eject "-499 instead of 0" is AUTHENTIC 1995 SCORING, decoded
from EjectPilot @0049f854: the punch-out dispatches a SELF TakeDamage of
damageAmount = role->killBonus (+0x1c, 500 in dfltrole), type Explosive,
senderMechID = SELF, player->suppressConsole = 1, graphicAlarm -> 10
which flows through the report tail as a SUICIDE kill: award = -CalcKillScore
(your own death), plus the type-1 death cost. 1000 - ~999 - 500 = -499:
the binary predicts Oracle's exact number. Our port already used
role->killBonus for the blast (mech.cpp:652) -- faithful end to end; bench
shows each eject charged exactly once (-900/-1050 across three ejects).
Panic eject = scored as suicide. Whether that is fun is a design question;
it is not a porting defect.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_018SgmXGNMXavXiafKXf9MDC
2026-08-10 10:30:12 -05:00
Joe DiPrima
773595b347
integrate Cyd's glass-panel-perf (adopted over the local dirty-gate draft)
...
# Conflicts:
# engine/MUNGA_L4/L4GLASSWIN.cpp
2026-08-09 23:27:16 -05:00
Cyd and Claude Opus 4.8
3aeb2dbbe8
glass panels: add the PlaneChecksum header decl (completes c9e25e5)
...
The dirty-skip commit staged the header via a lowercase path (l4vb16.h) while git
tracks it as L4VB16.h on this case-insensitive FS, so the PlaneChecksum declaration
was left out -- c9e25e5 as committed would not build from clean (L4VB16.cpp defines
SVGA16::PlaneChecksum, L4GLASSWIN.cpp calls it, but the header never declared it).
This adds the one-line decl. HEAD now builds standalone.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-08-09 23:03:41 -05:00