Commit Graph
975 Commits
Author SHA1 Message Date
Joe DiPrimaandClaude Opus 5 277337c3a5 tracker: date undated tester entries from gitea evidence, and record the self-reference trap. 12 entries pinned to real dates by finding where their text is quoted in a ticket body or an earlier comment -- if a report is quoted in a body, it existed by that ticket's creation date, which is how #170's three crash lines pin to 2026-08-12 (its body says FIELD 2026-08-12 and lists those exact times, settling that they are the ORIGINAL occurrences and not a post-fix recurrence). 27 entries that nothing in gitea pins stay marked (undated) rather than guessed. THE TRAP, hit once during this pass: dating an entry from a comment written while harvesting the sheet -- those quote the tester text verbatim, so a naive search dates the report to your own housekeeping instead of the event (a #170 line briefly carried the harvest date). Exclude same-day comments and take the earliest match.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-15 00:50:56 -05:00
Joe DiPrimaandClaude Opus 5 a4986faffc tracker: date every tester entry, and mark unknown-provenance ones (undated) rather than guessing. The build is cut per session, so the date implies the build -- which is what makes a Pass or Fail interpretable at all. Entries carried over from before the convention are marked (undated) = provenance unknown, not fresh evidence: the sheet was seeded from earlier tracking and nobody can now say which rows are original, so stamping them all with the session date would manufacture precision. That is exactly the error that produced the false 'still crashing after the fix' claim on #170 -- its row carries the same three timestamps and the same players as its own 2026-08-12 body, and whether that is a copy-forward or a genuine recurrence is STILL UNRESOLVED. 41 legacy entries relabelled (undated); 17 tester-dated entries left intact; header hover notes on both Tester Comments columns teach the convention in the sheet itself.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-15 00:17:18 -05:00
Joe DiPrimaandClaude Opus 5 dba09e44b9 tracker: add the FAILED RETEST status + the explicit post-playtest sweep. A tester Fail on a shipped fix was collapsing into QUEUED, which reads as 'never started' and understates a regression -- it now gets its own red status. Sweep rules made explicit per Test Status on every PATCHED-RETEST row: Pass -> close + move to CLOSED; Fail with detail -> FAILED RETEST + reopen + raise to >=P2 + post the evidence; Fail without detail -> NEED INFO with ONE discriminating question; blank -> stays yellow and rolls forward. Also records the ambiguity underneath all of it: a Pass or Fail carrying no BUILD NUMBER is uninterpretable (a Pass on an older build cannot verify a later fix), which is exactly why #27 and #38 sit at NEED INFO asking for the boot-screen build instead of going straight to red -- so every PATCHED-RETEST comment should stamp the build the fix shipped in. Sheet hover legends on the Test Status and Dev Status headers rewritten to teach both the vocabulary and the sweep to testers directly.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-14 23:42:44 -05:00
Joe DiPrimaandClaude Opus 5 74534cec9e KB: the playtest tracker sheet is now a first-class topic (context/playtest-tracker.md) -- the testers moved issue tracking off the .txt handout onto a shared Google Sheet on 2026-08-14, making it the primary feedback channel with gitea still the system of record. Documents the two-tab shape (OPEN priority-ordered / CLOSED), the dev-status vocabulary with the colour EMBEDDED IN THE LABEL, the priority tiers, and the Dev-Comments contract (what is wrong / STATUS / NEED FROM YOU, written for a player in under ~55 words with a concrete ask). Captures the working rules that were learned the hard way this session: read the gitea COMMENT THREAD never the body (re-triaging 53 tickets from threads moved a third of the statuses and dropped P1 from 5 to 2); undated tester rows are HISTORICAL and reading them as fresh produced a false 'still crashing after the fix' claim on #170 that had to be retracted across seven tickets; never write DONE on the OPEN tab; merge duplicates to one row per ticket; never use cell fills for status (fills live on cells, labels on text -- every re-sort desyncs them, re-fixed three times before embedding); a leftover FILTER hides rows after a rewrite (skipping row numbers in the gutter = hidden rows, not lost data); pin row heights or autofit makes wrapped rows unreadably tall. Access documented both ways: read via the public CSV export (the Claude Drive connector CANNOT see it -- scoped to files it created, and it has no cell-write capability at all, so sharing does not help), write via an Apps Script bridge whose URL+token stay in local operator memory and NEVER in this repo. Quick Lookup row added; handout demoted to secondary; operator-console cross-linked. checkctx CLEAN.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-14 23:38:29 -05:00
Joe DiPrimaandClaude Opus 5 6dc86792ad #160 CLOSED -- the cab's RIO axis dropouts + frozen boots were the FTDI adapter's BUFFER SIZE set too high (Nick, on the cab). An oversized receive buffer batches incoming serial instead of delivering it promptly: analog samples arrive late and in clumps (the field 'encoder dropouts') and the boot handshake can miss its window entirely (the wedge). NO port code was ever at fault -- every software hypothesis in the pod-hardware RIO section (power-rail sag under mission load, board-side wedge, print deadlock) is superseded; what survives from those notes is the diagnostic procedure, not the theories. Recorded in context/pod-hardware.md 9a with the setting path (Device Manager -> COM port -> Port Settings -> Advanced -> lower Receive (Bytes); Latency Timer flagged [T4] as the adjacent standard knob, not confirmed part of the fix) and as an operator-facing troubleshooting row in docs/OPERATOR_GUIDE.md, because a fresh FTDI install on any future cab build comes up with defaults that reproduce it. Ledger lesson: a fault that reproduces on ONE machine and survives every code change is a DRIVER/CONFIG suspect before it is a code suspect.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-14 23:29:53 -05:00
Joe DiPrimaandClaude Fable 5 91351b94bc #125 FIXED + 2-node benched: peers now see a killed arm WRECK + its gun pod DROP OFF on the FIRST hit. Root pair: (1) the MechDeathHandler Tick transcription carried an INVENTED write -- ApplyDamageGraphicState(descriptor->graphicState) -- where the raw @0042aa2c (part_003.c:10963-93) only PICKS an effect resource (level flag & 4 -> DescriptorForLevel; gstate flag & 8 -> DescriptorForGraphicState(the zone's CURRENT gstate), overwriting the level pick); with the port's pick hardcoded to Destroyed(1) the invention STOMPED every destruction-cascade child's authored Gone(2) back to 1 in the same tick, master-side, BEFORE the record shipped -- the wire itself carried the corruption, so no peer could ever render the pod dropping (receipts: legacy A remade jointrgun to gstate 2 then re-remade it to 1; legacy B received 'dz_rgun gstate 0->1'). Gotcha 36: an added write is worse than a stub -- it actively fights the authentic writers on every node. (2) the destroyed-mesh swap trigger was descriptor-gated (DescriptorForLevel returns NULL past the last threshold; cascade children have gstate edges with NO level edge) -- the binary needed no trigger at all (its renderer re-picked every segment's mesh from zone gstate PER FRAME); the port's built-once render tree now gets the event equivalent: per-zone gstate caches in Tick fire ONE coalesced RemakeEntityRenderables on any edge, which is also the PEER's only trigger for replicated gstate-only beats. Restored authored two-stage story: a directly-killed gun zone hangs its wrecked variant mesh (thrdrgun-family, exterior skeleton; every zone's descriptor table carries lvl=-1 gs=1/gs=2 terminals -- unreachable by level, existing exactly for the gstate picks); a killed ARM swaps to its wrecked variant AND the pod segment vanishes. Effects suppressed on ->Exists edges (the binary's heal writes the cell raw, no flag -> no respawn puff; regression benched 0 heal puffs across a full death/respawn cycle). 2-node benched both ways (night18/mp_zone125.sh + zonedump.sh): fix = peer receives dz_rarm gstate 0->1 + dz_rgun 0->2 on ONE beat, swaps thrdrarm.bgf and HIDES the pod, first-beat remake receipt; legacy = the stomp conviction above. KB: combat-damage.md MechDeathHandler section rewritten to the corrected reading; gotcha 36.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-14 18:45:12 -05:00
Joe DiPrimaandClaude Fable 5 f597f76a30 #102 FIXED + benched: the Owens run->reverse 'hang' was the port missing the machine's whole HARD-BRAKE system -- master perf @0x4aa158-0x4aa365 (raw part_013.c:3353-95): a forward gait meeting a negative demand latches +0x3f4 (the recon's 'airborneSelect' -- another jump-jet-family misread: it is the BRAKE flag) and swaps the gait slew to the model's SuperStopAcceleration (+0x5bc, ex-'airborneCycleRate'), kicks the gyro with a random-sign Z lurch, judders the cab 0.2 every 0.4s while braking above walk speed (gyroRumbleTimer@0x5c4), ships the flag on the type-8 record, restores the ground rate on release. Content: heavies brake harder than they drive (10->20); the sprinters brake WEAKER -- owens 50->25, blkhawk 30->10 -- the Owens' long coast into reverse is AUTHORED, and the pod communicated it through the seat; the un-ported port coasted with zero feedback = the felt hang. Ported to the mech4 drive block ([brake] receipts under BT_GAIT_TRACE) + the replicant rate select restored in the peer motion path (the binary's IntegrateMotion:298 line -- dead TU in the port, Simulate bypassed). Plus gotcha 35: the binary's SM switch re-reads the state cell after the wind-down-gate/death-latch preamble (one cell: @0x3b0/@0x728 == the alarm level); the recon's split alarm/int pair dispatched the STALE pre-gate state for a frame -- re-synced, both channels. The 'leg in the air until you twist' statue is the MACHINE's own trn turn-stop MID-PIVOT park, authentically INVISIBLE on the pod (no external self-view existed; the chase cam is a port addition) -- bench-reproduced at trn legFrm=10 + twist rescue, documented not-a-bug (Owens reads worst: deepest mid-swing of the 8 chassis, thigh -43deg vs madcat -27). Reverse-input truth [T1]: reverse is the red button 0x3F/LALT held with the throttle OPEN (manual p7); demand = -runSpeed*throttle (NO fwdScale term in reverse); the throttle channel is [0,1] like the pod lever, so brake keys can NEVER produce reverse -> handout education line. Bench rig: BT_KEYSIM/_REV/_TURN drive the REAL lever+detent+SM chain headlessly (scratchpad/night18/gaithang_bench.sh). Benched (owens/grass): LALT flip at full run -> [brake] ENGAGE rate=25 (ground 50) -> 12->15->6->9->0->16->18<->19 back cycles at the authored -14.1 cadence -> clean recovery on release; held brake key -> authored stand park, ZERO brake engagements (authentic: no button, no brake). Side-find filed: hardware-RIO cab reverse is DEAD (AddOrErase stubs; open-questions row). 674 forensic: that build boots GLASS by default -> reverse was exclusively LALT in the field.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-14 17:55:08 -05:00
Joe DiPrimaandClaude Fable 5 b67cf72f38 radar audit ledger: docs/RADAR_MAP_AUDIT.md distills the 3-agent audit (architecture, authenticity verdicts, the #49 root+fix, deliberate port deviations, stale-note sweep, follow-ups incl. the arena-edge era question and the 45deg-wedge-vs-manual-60 flag); gauges-hud gains the pointer section; the mech.cpp 'SetTargetRange is stubbed' stale comment swept (live since the zoom work).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-14 16:23:50 -05:00
Joe DiPrimaandClaude Fable 5 c2193e2e80 #49 FIXED + OPERATOR-VERIFIED: the radar draws the static world again -- walls, buttes, hills, ridges, buildings, trees. Root cause (radar/map drift audit, 3-agent, receipts in scratchpad/night17/radar_audit_*.txt): the original filed every pip-bearing Terrain-GRAPH entity into the gauge staticEntities grid via the interest feed (@004cbfa0: pip gate, Mover->moving / Terrain->static; the derivation graph parents UnscalableTerrain 0x2A + CulturalIcon 0x5E + Landmark 0x56 onto Terrain [T0 TERRAIN.cpp:183]), and MapDisplay::DrawStatic (@004c25b4) drew each entity's AUTHORED vector-outline pip (110 type-0x12 GIMs ship: wall1-3, aw01-05 arena walls, buttea-e, hillg/dhillg, sr1e/n/s/w polar ridges, trees, buildings) world-rotated and metre-scaled. The port's RebuildEntityGrid (the shim replacing the dropped interest feed) iterated DYNAMIC entities only -- the 1008 statically-registered UnscalableTerrain instances never reached the grid, so the scope showed no world at all. Fix: a third pass files non-dynamic Terrain-graph entities from HostManager::AllEntityIterator; pipless entities (floors, sky, the wall10k outer fence -- authentically invisible on the shipped radar too) no-op at the pip lookup exactly as on the machine. Receipts: [map-grid] worldStatics census + a capped per-static [map] dump (cls/rid/pip/dsq) symmetric to DrawMoving's. Benched: grass files cls=42 hill rid=2190 pip=1 drawing at 466m beside 313 trees; arena1 files 126 world statics with the aw wall sections (rid 1918/1915) pip=1 drawing and the unpipped walkway/banner props correctly skipped (authored omissions preserved). Operator-verified live on arena1: 'muuuuch better'.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-14 16:21:44 -05:00
Joe DiPrimaandClaude Fable 5 7b641f9b40 KB: gotcha 34 -- change detection against a shared multi-writer scratch (the #155 previousModeMask class): a change-detector must own its own baseline; audit every manager-scratch read that an authentic high-frequency toggler can starve. Ticket #155 comment 1858 carries the fix + live verification.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-14 14:56:23 -05:00
Joe DiPrimaandClaude Fable 5 caa50ef0f6 #155 FIXED + LIVE-VERIFIED: the dead eng/weapon MFD banks under a lit PANIC lamp were the gauge renderer's change-detection XOR reading the mode MANAGER's previousModeMask -- a shared scratch overwritten by EVERY Add/RemoveModeMask call. The authentic panic-arm chatter (the no-hysteresis eject evaluator, kept for strict fidelity 2026-08-03) writes that scratch per frame, stomping the SetPresetMode page bits out of the XOR before ExecuteForeground samples it: page EXITS died (reactivation requires the change bit; first entries still worked via !alreadyActivatedFlag), always-active gauges (radar/score/coolant) stayed live -- Oracle's exact bank split. Fix: one line -- sample the renderer's OWN previousModeMask member (already ctor-init'd and maintained at the activate/deactivate guard; the manager read looks like lineage drift), making the change mask accumulate everything since the last RENDER frame, correct under any number of mode writers; single-transition frames identical. Diagnosis chain: authenticity cleared in three legs (121 streamed rows zero eject-gated, MechRIOMapper 0x200000 = PANIC+lamp only, engine dispatch = AND); headless injection exonerated the mapping layer under steady arm AND 2063-edge chatter; the OPERATOR's live mouse session produced the receipts that convicted presentation ([mode] preset fired for the stuck exits while the screen held); fix verified live same session -- 8 transitions incl. 4 exits across all 3 MFDs under 2833 flap edges, all rendered. The PANIC flicker itself stays: authentic (incandescent filament was the pod's low-pass; a glass persistence filter remains a design call). Rig hooks kept: BT_FORCE_EJECT_ARM=1/2.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-14 14:55:30 -05:00
Joe DiPrimaandClaude Fable 5 97bdb5cc0c #155 rig: BT_FORCE_EJECT_ARM hook (=1 steady / =2 chatter at the evaluator's rate) -- pins the panic-arm state with zero damage side-effects. Repro results so far, all NEGATIVE through the PadRIO screen-button injection path (BT_BTNTEST): bank presses deliver and pages flip with ModeEject steady ON (mask 0x650430 observed), and with the arm CHATTERING (2063 edges/run, two presses on two MFDs both delivered). Combined with the authenticity verdict (no eject gating anywhere in content/binary/engine), the dead-bank defect lives ABOVE the mapping layer: prime suspects are the glass window's mouse hit-test / panel rebuild under per-frame mode churn, and the HOTAS CONTROLS.MAP route. Next step needs a human at the desktop: BT_FORCE_EJECT_ARM=2 + mouse clicks on the eng/weapon MFD buttons (and the HOTAS bindings), watching [mode] preset receipts -- ten minutes, fully scripted otherwise.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-14 14:29:25 -05:00
Joe DiPrimaandClaude Fable 5 ccfa875b65 handout correction (#151): my 'expect ~zero on eject' line RETRACTED -- the ticket's own 2026-08-10 bench decode (unread in yesterday's body-only triage, the exact failure the new read-ticket-threads memory records) proves -499 is the machine's arithmetic: suicide (-CalcKillScore ~999) + death cost (-500) from 1000, three ejects benched, never doubled, #162 uninvolved. Entry rewritten as the correction + the restored design call (authentic ~-1500 swing vs house-rule); counts 16 verify / 3 design calls. Tracker #151 comment 1848 carries the retraction; #104 comment 1850 holds the NARC rename (the 360dps receipts say the label may be truthful about the round profile).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-14 13:39:23 -05:00
Joe DiPrimaandClaude Fable 5 d048aab9d3 KB: the authored turn-rate landing recorded -- open-questions Sunday item marked landed with the A/B numbers + the mad2 Narc-profile-under-LRM-label receipt find; drift audit steering row updated (authored cap [T1] over the port-shape blend [T3]); field guide section 8 swarm entry rewritten for the next iteration (found-and-wired, with the two-racks-two-personalities not-a-bug warning).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-14 12:45:08 -05:00
Joe DiPrimaandClaude Fable 5 cec64583db #113 follow-on: missiles fly their AUTHORED agility -- the turn-rate cap is wired (model+0x40 deg/s, the field the #113 audit identified: pi/180-scaled into the binary thruster @004be7c4[0x3a], _DAT_004be8b8 byte-verified [T1]). The thrust table now reads tail[0] (it always fetched and dropped it); mislanch passes the rate via a salvo-scoped latch (BTPushSetTurnRate -- deliberately NOT a BTPushProjectile signature change: six call sites + three externs under /FORCE is the silent-AV churn class), master AND replicant mirror so peers see the same arcs; the steering keeps the field-verified exponential blend [T3] and CAPS this frame's heading change at turnDps*dt -- below the cap the old behavior is bit-identical, above it the round slews at the authored rate. BT_TURN_AUTH=0 restores uncapped; [projturn] CAP receipts under BT_PROJ_LOG. A/B bench (2-node standoff, scratchpad/night17/turn_bench.sh): AUTH runs 43/69 CAP receipts, ALL at 60dps (the blend wants <=~220 so 360 rounds are authentically unconstrained; LRMs slew ~3.6x slower during corrections -- the era 'sluggish 60 deg/sec' look); OFF runs ZERO CAP lines (negative control); impacts 25/9 vs 7/4 -- no accuracy collapse. Data bonus: mad2's 'LRM15'-labeled racks resolve 360dps (Narc-profile rounds, the guide's authored-mislabeling lore confirmed by receipts); madcat's are true 60dps LRMs.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-14 12:43:24 -05:00
Joe DiPrimaandClaude Fable 5 569b8d31b5 #113 audit closed FAITHFUL + the turn-rate mechanism found: the missile flight envelope needed no change -- ttl = lifetime + 10.0 (_DAT_004bf5ac byte-read) and kill-plane -1.0 (_DAT_004bf5b0) are the binary's own laws, so the port's burn+10 shape was exact all along; the #84 label 'burn' vs the ctor's 'maxTimeOfFlight' is the same field genuinely double-serving (thrust duration AND the retirement base). The real find: model+0x40 IS the authored per-round turn rate (60/360 deg/s), scaled pi/180 (_DAT_004be8b8) into the thruster -- the binary flies authored agility while the port uses uniform tuned gains [T3]; open-questions' +0x4c candidate corrected to +0x40 and the Sunday item rescoped to wiring the authored rates (the NARC/STREAK 'angry bees'). Ledger nuances recorded: the silent displacement reaper beside the detonating world path; burn-phase lateral zero-stabilization. Ticket #113 comment 1842.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-14 12:12:52 -05:00
Joe DiPrimaandClaude Fable 5 c3741d96df weapons field guide SECOND EDITION (build 4.11.957): the round-trip demonstrated -- Oracle's fourteen answers are quoted inline as [ANSWERED] verdicts (out-of-range cliff, charge persistence retired-as-verified, gauss/Mischief cross-confirmed, recoil-by-caliber, tap-unjam, splash, rack personality acknowledged as the authored vectors, SRM pip SETTLED at 800); section 2 carries the real gear ladder 56/77/100/153 with charge-time multipliers + the alpha-strike doctrine; 2B updated to shipped-tense with the 4.0-vs-4.10 veteran-heat note; PPC section now carries Oracle's vertical-line collapse spec + the #178 generator-flip watch; AC section ships the trigger-time cannon + the NEW tracer-visibility era question (second witness wanted); missiles section folds #175 cover + bystander + true speeds as shipped; section 10 rewritten as the found-fixed-shipped story with the ears-only verification ask; appendix gains the gear-ladder table + terminal speeds. Section numbering unchanged so first-edition returns still line up; scoreboard note: pilots 9-and-1 against our code-reading.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-14 00:25:53 -05:00
Joe DiPrimaandClaude Fable 5 29bb05cf4f tester handout regenerated for build 4.11.957: section A rebuilt around the fifteen-fix batch (headliners #173 walkers / #171 ballistics / #83 incoming alarm; #175 cover, #165 one-cell, #170 exit, #174 dead zones, #21 wrap, #111 bubble, #179 pips, #151 eject math, the cadence feel trio; holdovers #27/#38/#30/#166/#158/#147 kept with their tests); NEW section B 'NOT BUGS -- THE REAL MACHINE' (veteran heat, the real seek-gear ladder 56/77/100/153, the #153 elevation snap, the leak-voice loop + lamp location) so the settled-authentic verdicts stop generating repeat reports; era questions gain the three Oracle-return items (AFC tracer visibility, PPC vertical-line collapse, PPC generator flips -- corroboration wanted); #151 removed from design calls (resolved authentic); #83/#111/#112 out of known gaps; #176/#178 filed under internal; header 2026-08-14, count 57, reporting section now names the soundboard COPY workflow and the field-guide file-return loop as proven channels.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-14 00:21:37 -05:00
Joe DiPrimaandClaude Fable 5 32e5e8c6a6 KB: #111 paperwork -- translocation-warp topic updated (peer sphere retired: port extension vs the POV-only authentic effect; the DropZoneLocation-anchor nuance and the slot-contention skip both moot; observers see the un-wreck swap). Release notes gain the no-bubble-on-others line crediting Lynx's night-9 call. Tracker comment posted, field-verify Friday.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-14 00:03:10 -05:00
Joe DiPrimaandClaude Fable 5 3013cf86c5 #111 FIXED: the peer-visible warp sphere is RETIRED -- observers see the un-wreck model swap, exactly what the pods showed. The blue bubble on another player's dying/respawning mech was never binary behavior: the authentic effect is the POV-ONLY translocation (POVTranslocateRenderable, the dying pilot's own eye-centred collapse/reveal -- btl4vid.cpp's own banner says 'the authentic effect is POV only', twice), and the world-anchored peer sphere was a deliberate July-10 port extension (160b78e) that the field read as a wrong effect ('should just be the big boom from other POV' -- Lynx, night 9, confirmed in follow-up). The death-side collapse was already local-gated (GetMissionPlayer, verified back through build 693), so retiring the extension removes the LAST peer-visible warp; the corpse-vs-dropzone replication-order question the field receipts could not settle becomes moot. Un-wreck edge keeps everything else: pfx cleanup (#129), model rebuild, the ungated [respawn] receipt (text updated: 'un-wrecked', no '+ warp'). BTStartWarpEffect kept caller-less as slot-guard documentation. Night-16 field receipts audited on the way in: all 24+ un-wreck edges are clean mode 9->1, no death-state jitter.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bw71WVsccjwW7uKRg4aWD
2026-08-14 00:01:39 -05:00
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