Commit Graph
955 Commits
Author SHA1 Message Date
Joe DiPrimaandClaude Fable 5 65b30d4633 #147 receipt promoted always-on (capped 20): the NaN trap fired silently behind BT_RANGE_LOG, which the player fleet never sets -- a Friday poisoning would have been corrected invisibly, wasting the one event that can name the NaN source and settle the ticket's causal inference. The #172 rare-forensic-event precedent (one line per poisoning, re-seed clears it).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-13 23:48:40 -05:00
Joe DiPrimaandClaude Fable 5 ad5fc7b524 #179 FIXED: the look-state machine never committed the SPAWN state -- the Nova showed its rear laser's range pips in the forward view until the first look toggle (Oracle, night 17, same-evening report). The mapper commits eyepoint/enables/pip-group-mask on lookState EDGES only, and both state cells constructed equal (LookNone), so the first tick saw no edge; the reticle's group mask kept its construction bits. Fix: ctor seeds lookState = -1 (impossible), making the first tick an edge into LookNone that stamps the forward view at spawn. The firing half was never wrong -- the weapon ctor is binary-faithful (viewFireEnable = !rearFiring @004b99a8 [T1]); only the pips lied. Verified: pre-fix logs show ZERO [mppr] look-state commits without a look press (retroactive proof of the bug); the fixed build prints exactly one 'look state -> 0' at spawn with zero inputs (25s solo smoke). Rides Friday.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-13 23:32:30 -05:00
Joe DiPrimaandClaude Fable 5 87e45547c0 Oracle-return actionables closed out: generator-reassignment charge persistence VERIFIED by code-read (attach/detach are pure linkage; the emitter's only currentLevel=0 is the fire discharge -- matches his 'resumed where it left off'); Mischief identified as lok2 via the exe variant-name table + the Loki gauge section's GAUSS/AmmoBinGAUSS rows (his Gauss-carrier memory checks out against content); PPC electrical-rider verification ticketed (his auto-mode reassignment observation is the field signature; queued behind Friday); NARC/STREAK per-type maneuverability recorded as an open question with the +0x4c model-record candidate; twin-GAUSS_1/_2 section family unidentified (low).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-13 23:11:34 -05:00
Joe DiPrimaandClaude Fable 5 f450f9cce0 Oracle-return verification pass, both CONTRADICTS run to ground against the binary same night: #176 the seek-gear square law is the Emitter ctor's OWN calibration (@004bb120 EC = E/(0.5 seekV[rec]^2) [T1]) and the authored table (LLaser {6000,7000,8000,9900}/10000, rec=8000) yields the REAL ladder 56/77/100/153 -- seek 3 IS the published calibration point exactly as Oracle said, seek 4 is an unclamped OVERCHARGE gear (logged 5.80 > authored 5.0 proves it), and the guide's 'half-charge = quarter' example was the wrong part (master guide corrected with the real ladder + the downshift-for-rate / seek-4-alpha doctrine). #177 the BTPlayer ctor stamp table read verbatim (@004c0bc8: +0x260 = level>=2 -> heat at veteran AND expert in 4.10 [T1]; +0x274 = the raw level; +0x26c = standard|veteran) -- the port is faithful; Oracle + the 4.0 manual describe the earlier machine (a genuine 4.0->4.10 balance change); ticket premise corrected (the KB already carried the stamp values -- 'writer never read' was another check-own-history strike). experience-levels.md upgraded to the writer address; #176 open residue: per-weapon gear-fraction variance.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-13 23:03:32 -05:00
Joe DiPrimaandClaude Fable 5 a0a365462b Oracle's weapons-guide return ingested -- the file-edit feedback loop WORKS (first curated .txt return, staged to docs/feedback/ + diffed against the distributed bb4094f copy). Fourteen answers: two CONTRADICTS filed (#176 seek-gear damage swing -- the authored seekVoltage gear table has never been read and may reconcile both; #177 veteran heat -- witness + 4.0 manual say expert-only and the player+0x260 writer is unread [T4]). Confirmed by witness: the out-of-range damage cliff, gear-wrap safety + downshift-for-rate doctrine, charge persistence across generator reassignment (port audit item), splash, SRM 800 pip (450/800 CLOSED), single-tap jam eject, missile speed-drop pre-endorsed. New era gifts: the PPC MFD collapse-to-vertical-line reference photo (ARCHIVED before the Discord link expires -- the visual target for Cyd's ppc-sync pass), PPC auto-mode generator-flip color, AFC no-visible-projectile memory (needs corroboration -- our tracer code is real, its VISIBILITY on the shipped machine is now an era question), the Gauss carrier's variant name (Mischief), and two YouTube videos with the real incoming alarm audible (#83 ear-A/B references).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-13 22:53:08 -05:00
Joe DiPrimaandClaude Fable 5 bca93e181e KB: #175 paperwork -- drift-audit row 12 gains the static-world addendum (solid-tree sweep landed, 345 struct-class bench bursts, owner dispatch, the [T3 minor] fuze-vs-world same-frame ordering note); env-gate table gains BT_WORLDHIT + the BT_DESIGNATE HUD-ring clarification. Tracker #175 comment 1793.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-13 22:45:44 -05:00
Joe DiPrimaandClaude Fable 5 7b120531ea #175 FIXED: missiles detonate on the static world again -- the flight sweep's missing half. The push simulator's world test marched only the VISUAL heightfield (BTGroundRayHit), so every round tunneled through geometry that blocks the walk but is not heightfield -- the arena1-garage class, and the field case (LRM duel through a grass mound, user-observed on the #83 bench). The binary's FUN_0042291c swept the real collision world every tick. Fix: the flight step now also rays the STATIC COLLISION SOLID TREE (WorldStructurePick -> Mover::FindStaticSolidHitBy -- the same static-world tail of the engine collider, already proven by the weapon-pick work), earliest hit wins vs the heightfield march; a struck solid's OWNING entity takes the direct zone=-1 dispatch exactly as the binary missile contact does (@004be078 -- trucks/props are missile-killable); salvo-lead world bursts keep the detonation + cluster splash (near-miss splash vs cover, authentic). BT_WORLDHIT=0 restores heightfield-only (A/B lever). Receipt upgraded: [projectile] WORLD burst (terrain|struct[, owner-dispatched]) + dmg/lead. Verified on the exact reported scenario (grass standoff duel, mound in the line): 185/160 WORLD-burst receipts per node -- ALL struct-class (confirming the mound is solid-tree geometry the old test was blind to), direct mech IMPACTs healthy at 20/18 when the line cleared, user-witnessed: rounds burst on the mound instead of passing through, lofted rounds still arc over (the authored seeker loft). Companion bench hook from the same session: BT_DESIGNATE=enemy (no HUD ring -- designation slots only).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-13 22:44:26 -05:00
Joe DiPrimaandClaude Fable 5 df188e737f KB: #83 paperwork -- gotcha 33 (a fix wired into a blocked transcription: compiles, reads faithfully, never runs; rules: fixes land in the LIVE path, inert transcriptions get an explicit banner, a doc-header FIXED is a claim not evidence, the bench must fail first). decomp-reference section 5 gains the recovered alarm rule (@004bf5b4 ctor socket-registration into target+0x418, @004a9b5c first-member read, death-path list empty, reset 0/FLT_MAX) + env rows BT_INCOMING_LOG / BT_DESIGNATE. AUDIO_FIDELITY F7 corrected: the July fix was dead code; the true fix + bench numbers recorded, field-verify Friday. Tracker #83 comment 1786.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-13 22:28:22 -05:00
Joe DiPrimaandClaude Fable 5 b00fa39af7 #83 FIXED: the incoming-missile alarm sounds again -- the July F7 driver was wired into DEAD CODE. Root cause: the alarm feed (cc2b109) lived in Missile::MoveAndCollide, but the world-entity Missile is a BLOCKED TRANSCRIPTION (2007 Entity-base mismatch) that never flies; live flight is the BTPushProjectile simulator in mech4.cpp -- so IncomingLock/DistanceToMissile stayed 0/FLT_MAX in every field build (solo AND MP) while the doc header said F7 fixed. Fix: the feed moves to the push simulator's per-frame update -- salvo LEAD only (the port's cluster = the binary's ONE Missile per trigger, @004bf5b4 ctor-registration into target+0x418 read by the target tick @004a9b5c: lock=1, dist=|missile-mech| entity positions); mirror leads on peer nodes report identically (mislanch resolves the live target by replicated ID), which is what puts the alarm in the VICTIM's cockpit -- inbound missiles are always mirrors there. Bridge hardened: BTIsRegisteredMech class check (the binary's 0x50bdb4 check) + the port's latched-death predicate 2||9 (@0049fb54). New: [incoming] receipt (BT_INCOMING_LOG, edges + 1Hz held) and BT_DESIGNATE=enemy (bench designator: production designation slots stamped with the nearest live mech on no-mech frames only -- standoff locks the boresight pick can't hold). Transcription block kept in missile.cpp with an INERT banner so the trap can't re-bite. Bench (2-node standoff LRM duel, 700-800u): 54/55 lock edges per node, dist closing 792->87 over ~2.2s, beeper STARTs with LIVE authored tempo (10 far -> 435 close, the 100..800->600..10 map) -- on replicant mirrors, i.e. the MP case. Era witness: Oracle identified [1:74] IncomingAlarm01 n58 on the soundboard same day ('sped up in the pods').
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-13 22:25:38 -05:00
Joe DiPrimaandClaude Fable 5 929d6267c2 audio F7 (missile-lock alarm) era-witness confirmed: Oracle located [1:74] IncomingAlarm01 n58 on the distributable soundboard himself and confirms it is the incoming-missile alarm, 'sped up in the pods' -- independent field confirmation of the sample identity AND the authored DistanceToMissile->tempo acceleration (100..800 -> 600..10). Cross-referenced on Gitea #83 (the soundboard's first field return, day one of distribution). Remaining unknown: the binary's +0x3FC/+0x400 update rule.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-13 20:28:17 -05:00
Joe DiPrimaandClaude Fable 5 2949e190fe field guide: laser damage line de-ambiguated -- 'half-charge release' implied a trigger-hold mechanic that does not exist (the user read it as distance falloff first, then as mid-charge release). Now states the T1 machine: no early fire (trigger blips until Loaded), partial power = lower charge gear only (charge/recommended-gear voltage squared), and damage is flat inside effective range / zero past it. Rides the next guide iteration.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-13 20:15:35 -05:00
Joe DiPrimaandClaude Fable 5 a6cc8d63d2 cadence census checklist: night-17 queue closed out -- five rows moved to DONE with bench numbers (sway inherited 4.5x, gyro timescale-only impulse verdict, footstep ramp90 restored, doppler -20% operand TV with T3 perceptual flag, registry map pattern); new rows: child-entity worldLinearVelocity=0 self-sound doppler (pre-existing, needs a binary-behavior ruling) + the five-clock BTSimClock consolidation note. decomp-reference env-gate table gains BT_GYRO_SPRING_HZ / BT_GYRO_KICK / BT_AUD_SMOOTH_HZ / BT_AUD_DOPPLER_HZ / BT_AUD_DOPPLER_LOG.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-13 19:56:47 -05:00
Joe DiPrimaandClaude Fable 5 f9546d254f cadence census item 4: doppler velocity operand sample-and-held at 28Hz (gotcha 32) [T2 mechanism / T3 perceptual]. worldLinearVelocity is a raw per-render-frame position derivative; at ~59fps its gait-aliasing noise reached the doppler divisor directly. Fix is consumer-side only per the census: the relative WORLD velocity held per AudioLocation on a 28Hz wall clock; head-frame transform + geometry stay live per call; the mech4 producer untouched. BT_AUD_DOPPLER_HZ override (=0 per-call) + [doppler] receipt under BT_AUD_DOPPLER_LOG (cents/v/d/h/hm2). Measured: clock proven live (55% of calls held vs 0% in control), operand total-variation 67.8 -> 54.2 u/s-per-s (-20%) with std preserved (real stride oscillation kept). T3 flag: cents jitter only -11% on the solo rig because the loud sources ride the player's own entity at d~1 where live near-field geometry dominates -- the nearby-walking-mech warble needs an ear A/B or a 2-node rig. Bonus finding (pre-existing, receipt-exposed, NOT touched): sources linked to child entities of a moving mech read relative v = full ground speed (child worldLinearVelocity=0) -> cents ~ -200 on self-sounds; new census row.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-13 19:54:50 -05:00
Joe DiPrimaandClaude Fable 5 b355844847 cadence census item 3: footstep smoother intake clocked at 28Hz (gotcha 32) -- the authored olympic windows breathe at their authored width again. The N=30/15 fill-0 windows (AUDWTHR.h:457) are sized for one sample per POD frame; the port's watcher poll fed one per poll, and the bench measured the poll path at ~141-147/s (MORE than render -- the wall window was 0.2s, not even 0.5s). Fix: only the Add is clocked (per-instance 28Hz wall clock, catch-up repeats the current sample capped at the largest authored window 30); the downstream forward still runs every poll with the held average, so watcher semantics are untouched; N untouched. BT_AUD_SMOOTH_HZ override (=0 restores per-poll). Measured: avgUpdates 70.6 -> 19-20/s, envelope wobble -26-45%, ramp90 0.55s -> 1.23s (the authored 30-sample/28Hz ~ 1.07s window restored in wall time), steady levels unchanged (0.852 vs 0.863 -- smoothing only, no level shift).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-13 19:54:34 -05:00
Joe DiPrimaandClaude Fable 5 567ffacaae cadence census item 5: ring registry productionized -- the 16-slot bench-era fixed registry becomes the heat.cpp #119 static-map pattern (unbounded, per-instance, no layout growth). The old registry's silent overflow would have reverted a 17th mech to render-cadence |a| sampling with zero receipts -- exactly the failure class gotcha 32 exists to kill. Smoke bench (identical rig to the sway run): instab median 0.130 vs 0.109, |a| p90 13.8 vs 14.5 -- the same 28Hz signature within run-to-run noise, nowhere near the render-cadence control (16.8/48).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-13 19:54:24 -05:00
Joe DiPrimaandClaude Fable 5 f811c64590 cadence census item 2: gyro spring-damper stepped on the pod's 28Hz clock (gotcha 32) -- the cockpit bounce runs the machine's timescale again. The binary steps IntegrateEyeJoint @004b2ec0 / IntegrateBody @004b30ec once per pod frame with PER-TICK math (no-dt position step, damping overwrite carrying last-tick state); at ~60fps the springs stepped 2.14x too often. Fix: 28Hz per-instance accumulator (heat.cpp #119 map pattern), 1/28 slices, remainder carried, catch-up capped 28; integrator BODIES byte-untouched; BT_GYRO_SPRING_HZ override (=0 restores render cadence, proven behaviorally identical to the old code: control run reproduces the BEFORE curve exactly, 0.0471 @ +0.240s / period 1.435s). Impulse bench (new BT_GYRO_KICK one-shot deterministic hit through the authentic GyroApplyDamage fan-out; [gtrace] gains wall-ms): BEFORE eye trough -0.0452 @ +0.24s, overshoot 23%, period ~1.43s, settle +3.44s; AFTER trough -0.0537 @ +0.29s, overshoot 7%, period ~2.4s, settle +3.49s; 97 integrator steps / 3.49s ~ 28Hz -- the clock provably ticks. Shape verdict: both single-overshoot damped responses; every delta is the per-tick semantics at dt=1/28 (per-SECOND damping ~e^c is cadence-invariant, hence equal settle). Nothing beyond the timescale.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-13 19:54:14 -05:00
Joe DiPrima 2c6dc001e3 Friday forensics net: all four player launchers set BT_DMG_LOG=1 -- named per-shot [emitter]/[dmghit]/[crit] receipts fleet-wide, making every weapon incident attributable by name (the #165/#171 verification recommendation). environ.ini deliberately NOT used (player-owned, never shipped by design). Verbosity rides the single-file log + SENDLOGS compression; flag comes out after the weapons-verification cycle 2026-08-13 19:11:07 -05:00
Joe DiPrima ca9e5ff5c0 #173 FINAL: port cadence defect FIXED -- the velocity ring now samples at the pod's 28Hz by default (BT_MYO_RING_HZ overrides). Measured [T2, six curves m173v2]: at ~59fps the |a| operand carried 64-66% gait-aliasing noise = drive heat 2x the machine's; at 28Hz + the authored loop-5 boost (detent 50 receipt-proven, flow 0.909) a vulture holds FULL supercharge 54-57 u/s indefinitely at stable Tm~1500 -- the machine's valve lever worked, the manual's Super Charged print was honest, witnesses 7-0 (Draco/Oracle/Elengil + the user's eyes beat the solver AND the first bench). Balanced seek-4 still cooks authentically (~18s); wrap trap stands; display pixel-verified in sync. BT_VALVE5 bench hook added (receipted detent presses). Post-promotion smoke: boosted vulture stable ~1500 dipping under. Gotcha 32 (sampled-history operands at render cadence; a validated model EXTRAPOLATES, only the bench INTERPOLATES); cadence census -> BTSimClock migration checklist in open-questions (gyro bounce timescale next, footstep smoothers, doppler; heatLoad was already pod-clocked #119 = the reference pattern). Guide 2B rewritten with the confession + the measured fix 2026-08-13 19:03:41 -05:00
Joe DiPrima 0f5c87dc84 drift audit: row 7 tracer-visual verdict flipped to FIXED-THIS-BUILD (the recovered TOF constants landed in b94636b; the row still carried the pre-landing 'close it' directive) 2026-08-13 18:00:05 -05:00
Joe DiPrima 25ed1ca627 #21 closed at the true root + 'arcade shipped a brick' RETRACTED (era witnesses 6-0): _DAT_004ba830 is a DOUBLE 1.0, not float 0.0 -- the entire brick claim was a constant-width misread (dword read of a qword; the low half of 1.0's mantissa is zeros). Binary truth [T1 raw disasm @004ba738]: overcharge CLAMPS to exactly 1.0f, the ==1.0 Loaded test passes next tick, the weapon fires the stored charge at normal top-gear damage (divisor is the recommended gear). Fix: clamp corrected to 1.0f; the rescue scaffolding REMOVED (it patched our own misread -- 38 'rescues' were 38 events the machine silently clamped); gauge-side zeroing inherits the fix, which is almost certainly #21's ORIGINAL field symptom (dark recharge arc + dark ready-dot = the dial reading our zeroed ratio while the rescue kept the weapon firing). seek21 bench PASS: 65 switches / 16 wraps / 9 overcharges -> fires through all, 13 post-overcharge gauge probes FULL, zero rescue prints. Docs: field guide section 2 rewritten as settled-by-testimony (credit to the group), decomp-reference block retracted with extracted constants, drift audit energy lane -> FAITHFUL, ZERO deviations. The witnesses' 'nah, that didn't happen' was worth eight bytes read at full width 2026-08-13 17:59:24 -05:00
Joe DiPrima 47826018cf #173 CLOSED-AUTHENTIC with measurements: chicken-walker seek-4 overheat is the machine's own balance -- heat plumbing byte-identical on all 18 chassis (loop 5 = GenD+Myomers only, the MINIMUM load; walkers carry the LARGEST banks), no speed-dependent cooling exists in the binary, and the decisive control is a HUMANOID Avatar cooking identically in the same speed class (14.3s vs vulture 13.9s). Manual speed cross-check kills the last defect avenue: the machine's walkers were PRINTED FASTER than the port runs them. Ticket's 16x premise corrected (gears 1-3 heat-identical; seek-4 = 2.04x). The authored lever validated: loop-5 valve at detent 50 = 2.7x capacity = sustained gear-4 vulture; the detent cycle 1->5->50->0 wrap explains 'boosted and still cooked'. Oracle's spawn-discharge claim CONFIRMED end-to-end. Field guide gains section 2B (sprint-gear doctrine + valve trick + wrap warning + the 15-second era question); Loki-family repro predicted for Friday. Residual [T3]: gait-surge |a| at render cadence vs the pod's 28Hz -- one bench + one era answer close it 2026-08-13 17:31:12 -05:00
Joe DiPrima ef90b6af8c audio: Yip voice zones EAR-VERIFIED at game rate via the soundboard (user, 2026-08-13) -- SOUNDBOARD_BT411.zip approved for tester distribution 2026-08-13 16:41:18 -05:00
Joe DiPrima 8e6697312f soundboard game-rate fidelity + distributable: rate formula fileRate x 2^((note-60)/12) [T1 L4AUDIO BTNotePitchFactor via AL_PITCH; notes come ONLY from AudioControlSequence]; BTL4.RES audio-stream record format cracked -- all 324 sequences parsed, 92 (sample,note) pairs play OFF file rate, headline: Warnings01/Yip voice zones trigger at notes 16-40 = x0.079-x0.315 (raw files play the voice 3.2-12.7x TOO FAST -- the long-remembered mismatch, now quantified); dead zones found (Death01 z8-11, AuxExplosion01 z6-7 unreachable by any authored note). tools/soundboard.py plays game rates (header-rewrite temp copies, per-note buttons, raw toggle); NEW tools/mksoundboard.py -> dist/SOUNDBOARD_BT411.zip (31.8MB): self-contained index.html, 603 cards, playbackRate+preservesPitch=false, per-note buttons, COPY reference strings for tester bug reports, no fetch (file:// safe), tester README. AUDIO_FIDELITY.md gains the authored trigger-note census 2026-08-13 16:39:18 -05:00
Joe DiPrima e4546923f8 weapons batch VERIFIED on the final tree + last two gaps closed: BYSTANDER SWEEP landed (guided damage rounds test the flight segment vs every mech, detonate on interposers like the binary's world sweep @0042291c -- 11 legitimate strikes in the sweep bench, zero self/phantom/fuze-race hits per forensics) + COAST GRAVITY (-6.5 after burnout). Comprehensive 2-node weapons_sweep bench PASS, all families: ENERGY 184 named FIRED / 79 hits; AC 17 type=1 hits ALL burst=1 + 84 ballistic pushes ALL dmg=0 (hitscan live-proven multi-node on final code); MISSILE 593 type=2 hits, 576 salvo bursts (4.0 fuze + drag speeds work); #174 guard worst-repeat=1 across 13 lives; detector SELF-TESTED against synthetic pre-fix shapes before any verdict trusted. Rig lessons -> test-harness.md: BT_FIRE_AT_ICON designates BUILDINGS (use BT_GOTO=enemy + throttled BT_AUTOFIRE/BT_AF_MISSILE, the kd pattern); mad2 'Zanin Neko' carries AFC50+ERPPC+LRM15+SRM6x2+ERMLaser -- all families on one engaging chassis; -net 1501 -> pilot :1502 mapping 2026-08-13 15:47:23 -05:00
Joe DiPrima bb4094fe7e field guide: file-editing is THE feedback method -- Discord-reply protocol removed; YOUR NOTES block (callsign-first entry lines) inserted after all 9 WE NEED YOUR MEMORY sections; head/tail instructions rewritten (edit the file, post it back) 2026-08-13 15:14:55 -05:00
Joe DiPrima 5272a3db64 field guide: second reply mode added -- mark up the file itself and post it back (the Oracle workflow from the issues handout; spreadsheet exports welcome), alongside the per-section Discord replies 2026-08-13 15:12:51 -05:00
Joe DiPrima 510f4f4c1b field guide updated post-drag-audit: missile section now pre-announces the SPEED DROP (drag governor restored -- LRM ~550/SRM ~775 terminals vs the old dragless 3000+; framed as the pod's real feel, confirmation-worthy) and the stale 'Streak speed authentic' claim softened (that corpus measured the dragless model); SRM range-pip era question added (manual prints 450 x3, content authors 800 -- revision-dating question, display-only either way) 2026-08-13 15:00:27 -05:00
Joe DiPrima b94636b607 velocity/dt audit: DRAG WAS THE GOVERNOR -- the binary applies -0.001*v^2 every frame, burn AND coast (@004bef78 + thruster @004be474, ctor precomputes terminal sqrt(T/COD) into +0x348 as the seeker lead base; authored COD 0.001 byte-read from BTL4.RES type-15 srm/lrm/strk/nrk). The port omitted it: LRM hit 3030 u/s at burnout vs the machine's 547.7 terminal (5.5x), 3912u downrange at t=5s vs 2108u -- a major slice of the 'missiles reach anything' field feel. Pool now integrates speed += (accel - 0.001*v^2)*dt. The dt MODEL itself verified FAITHFUL (Mover zeroes accel per frame + integrates x dt in seconds, matched line-for-line to T0 MOVER.cpp -- the 28Hz myomer idiom does NOT apply; open-question closed). AC cosmetic tracer TOF constants landed (2.0f @0x4bc678, 1/9.8 x87 EXTENDED @0x4bc67c, muzzleHeight term via ResolveLaunchVelocity deferred-first-use). Stale banners swept (misthrst @004be474 recovered; projweap #168 flight-contact banner gone). KB: decomp-reference Mover-gravity fix + flight-model bullet, coast gravity = 6.5 not 9.8. Drift audit: SSVELOCITY/DT + SSRANGE AUTHENTICITY (manual cross-check: PPC/AFC100 MATCH, SRM 450-vs-800 authoring drift; rangefinder ladder NOT miscalibrated -- fixed 0-1200 + authored pips both sides; -100m range-bias state unimplemented, parked). Build clean 2026-08-13 14:58:04 -05:00
Joe DiPrima 6517ebe505 weapons physics audit (7-agent, all classes): docs/WEAPONS_FIELD_GUIDE.txt (tester-facing per-weapon review doc for the playtest group) + docs/WEAPONS_DRIFT_AUDIT.md (engineering drift table with addresses/tiers). Headline corrections the audit itself produced: (1) GAUSS RETRACTION -- the fielded GAUSS record is classID 0xBCD ProjectileWeapon (BTL4.RES @0xf16e6 raw bytes), full AC hitscan WITH damage; GaussRifle 0xBCE + shell 0xBD1 are dead code BOTH sides (zero shipped records; content census 78x0xBC8/16x0xBCD/30x0xBD0/14x0xBD4); the 'port Gauss damage is an invention' claim retracted in KB + ticket. (2) effectiveRange K byte-confirmed 1.0f @004b9c98. (3) PPC EnergyDamage victim-side GAUGE SCRAMBLE rider identified (@004a0230 -> gauge renderer) -- unimplemented in port, and it is exactly what Cyd's held ppc-sync-distortion branch implements: that branch is an AUTHENTIC-feature candidate, not an invention. (4) AC tracer TOF constants recovered (2.0f @0x4bc678, 1/9.8 x87 EXTENDED @0x4bc67c) -- port's 1.0 stand-ins closable. (5) missiles verified FAITHFUL end-to-end (382-impact corpus matches the salvo roll). Era questions consolidated in the guide; #21 overcharge-brick rescue documented as the one deliberate energy deviation 2026-08-13 14:08:35 -05:00
Joe DiPrima bbb3b4ec82 #171 IMPLEMENTED: the AC is trigger-time hitscan again (@004bc104 restored: counter/TracerInterval batching, ComputeTimeOfFlight inside the tracer branch refreshing LIVE effectiveRange, dist<=+0x328 fire-time gate, ONE single-panel batched damage to the locked target via @004b9728; the flying round is the cosmetic 0xBCD tracer, damage 0 -- shell class 0xBD1 stays dead). Missiles keep flight, corrected to the binary: lock-drop = movementMode 2||9 exactly (@0049fb54, tracks THROUGH the fall), proximity fuze 4.0 (_DAT_004bf5a4 -- was misused as a turn gain), salvo roll floor-of-1 REMOVED (binary sender rolls 0; the receiver burst do-while is the floor, mech.cpp:1229). Gauss untouched pending the era witnesses (shipped binary deals NO Gauss damage -- group question on #171). Verification: line-by-line vs part_013.c:16023-16125/18260-18285 (verify workflow + review); end-to-end receipts from the engaged bench run: type=1 burst=1 hitscan hits incl. a 13-round batch, all DETs dmg=0. Local rig cannot form avatar locks for a clean re-run (rig, not feature) -- Friday's field receipts are armed and decisive. Closes the #168 mis-generalization; #112 single-panel restored 2026-08-13 13:19:18 -05:00
Joe DiPrima 80037a7c78 #171 verdict: the era witnesses were RIGHT and half of #168 was a mis-fix -- the AC is TRIGGER-TIME HITSCAN (@004bc104, recovered 2026-08-06 but hidden behind projweap.cpp's stale 'body NOT recovered' banner from the old export: the root cause -- #168 generalized the MISSILE launcher's body to ballistics). Binary truth [T1, cross-examined]: AC batches rounds, range-gates at fire time on live effectiveRange (same gate as energy), sends ONE single-panel damage to the locked target, spawns NOTHING (shell class 0xBD1 = dead code, 0xbd1 appears once in the whole export; the visible round is the 0xBCD renderer tracer); missiles genuinely fly with seeker-computed lead (4.0u fuze, swept contact, salvo randomization, lock-drop on death) so 'no leading' is right for them too; Gauss deals NO damage in the shipped binary (charge dump only -- port damage is an invention). #112 shotgun = port per-round scatter vs the binary's one batched message. KB corrected + swept (decomp-reference SS5, combat-damage, projweap banner). NO code behavior changed -- implementation awaits the #171 group decision per Oracle's HOLD; evidence package queued for the ticket (server down) 2026-08-13 03:20:07 -05:00
Joe DiPrima 3c1decdcc6 gitignore: scratchpad landmine patterns (session handoffs, agent dumps, run outputs, binaries) -- the 6a744ef near-miss: a stray bulk git add pushed a handoff file carrying the gitea credential; history force-rewritten same minute (5cde991), server-side the orphan lingers until gc -- credential rotation recommended regardless 2026-08-13 02:42:38 -05:00
Joe DiPrima 5cde991f56 #174 root-caused + fixed with a negative control: the binary's ONLY re-descend protection is the burst loop's zone-state guard wrapping the WHOLE per-burst application (@0x4a0446, part_012.c:14661 -- crit roll, TakeDamage, score tally, destroyed-flag; RecurseSegmentTable/SendSubsystemDamage have NO internal re-entry protection: no used-marking, no top gate). The port had narrowed the guard to the crit roll -- continued fire re-saturated dead zones (cascade re-fired: night-16 zone 18 x7, each pass re-pushing crit allotment = the ram 'crits worsened with each collision'), and hits on wreckage kept SCORING (binary awards zero -- a quiet farm-the-wreck exploit). Fix: guard restored to binary scope. Bench: BT_ZONE_HAMMER hook (4Hz explicit-zone self-damage) -- fixed build 1 cascade/10 hits/0 post-saturation applications; NEGATIVE CONTROL (fix stashed): 147 cascades. 147 -> 1. Gotcha 31: guard-scope narrowing -- diff the BRACE SCOPE when transcribing decomp ifs; and prove a bench detects the bug before trusting its pass 2026-08-13 02:42:07 -05:00
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 DiPrimaandClaude 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 DiPrimaandClaude 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 DiPrimaandClaude 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 DiPrimaandClaude 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
CydandClaude 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