RETRACTION + FIX: the myomer seek->speed coupling IS in the 4.10 binary --

restored byte-grounded; the morning's removal was export-gap blindness

Player testimony (Oracle, pod veteran: seek-4 humanoid = 182 kph -- the
manual's printed Super Charged figure; overheat = 'freezing up') forced a
re-audit of the morning's 'no dynamic myomer->speed feed' verdict.  The
verdict was WRONG: a raw-image capstone sweep for FPU reads of [reg+0x31C]
found the consumer inside the UN-EXPORTED master-perf region -- the same
decomp gap that hid the #93 crash block.  Decoded @0x4a9cf2-0x4a9da4 [T1]:

  per frame: MAX speedEffect@0x31C over the myomer chain (+0x7AC)
             -> mech+0x79C
             mapper->speedDemand@0x128 *= it        (the SPEED coupling)
             if |drive| <= 1e-4 (@0x4ab16c):
                 mapper->turnDemand@0x12C = 0       (the FREEZE)

Everything the manual + the veterans describe emerges: gear 4 rides
speedEffect ~1.43 into the RegisterMaxOutput gait cap (base x 1.4284 --
the two mechanisms interlock: 61.5 x 1.43 = 87.9 vs cap 87.8 measured) =
SUPERCHARGE; myomer heatFactor degradation slows you; overheat freezes
speed AND turn; damage slows (speedEffect carries 1-damage -- #75's
original premise was RIGHT and its 'falsified' close was wrong).

Restored in mechmppr.cpp, byte-grounded and better than the pre-removal
draft: MAX over the chain (was first-found), NO 1.0 clamp (the old clamp
ate the overdrive), turn-freeze included.  BTMyomersSpeedEffectOf
(unclamped) replaces the deleted BTMyomersDriveOf.

Verified live: healthy drive=1.0 (no speed change), collision-rattled
myomers drive 0.999 -> 0.892 -> 0.742 with demand scaling in lockstep
(61.5 -> 54.9 -> 45.7).

KB corrected in place (subsystems WAVE 6, pod-hardware manual audit
retraction, open-questions resolved) + NEW GOTCHA #21: export-gap
blindness -- 'no callers in the decomp' is not 'no callers in the
binary'; sweep the raw image for the operand pattern before declaring a
data path dead, and when a primary source disagrees with your decomp
sweep, suspect your evidence first.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019Zh7PTkFy4KwTzVighLR9J
This commit is contained in:
Joe DiPrima
2026-07-31 10:54:11 -05:00
co-authored by Claude Fable 5
parent 4704ab3d41
commit 905a4a86c0
6 changed files with 113 additions and 33 deletions
+7 -2
View File
@@ -161,8 +161,13 @@ register. ⚠ The audit also flags the damage-economy item as SELF-CONTRADICTOR
(task #8 "landed" vs the kShotDamage=12 bring-up residue) — audit before reworking.
## Deferred subsystems / feeds (authentic path scoped, marked in code)
- **Myomer seek "SUPERCHARGE" — 4.0-manual vs 4.10-binary, AWAITING THE PLAYER VERSION-PROBE
(2026-07-31).** The 1995 manual (p20/p22 + stat sheets) says seek changes TOP SPEED (gear 4 =
- **~~Myomer seek "SUPERCHARGE"~~✅ RESOLVED same day: the players' testimony (Oracle:
seek-4 humanoid = 182 kph, overheat = freeze) prompted a re-audit that found the coupling in
the un-exported master-perf gap (@0x4a9cf2). The manual was right, 4.10 HAS supercharge, and
the port now implements it byte-grounded ([[subsystems]] WAVE 6 correction). LESSON: a
"no callers in the decomp" claim is only as good as the export coverage — sweep the raw image
for the operand pattern before declaring a data path dead ([[reconstruction-gotchas]]).
Original entry below for the record:** The 1995 manual (p20/p22 + stat sheets) says seek changes TOP SPEED (gear 4 =
"Supercharge", expert-only; Loki/Thor print Normal 143 / Super Charged 182 / Gimped 40 kph).
The 4.10 binary provably has NO runtime myomer→speed coupling (full data-flow closure [T1]:
demand fn @004afd10 all branches, all speedDemand writers, AvailableOutput's 2 callers, the
+9 -1
View File
@@ -208,7 +208,15 @@ every checked control behavior:
side button columns + **EJECT button** beside the joystick + per-mech COOLANT LOOP tables
(weapons+generators per loop 1-6) and stat sheets (tonnage/armor/reservoir liters/heat
sinks/top speeds incl. "Super Charged").
- **MYOMER SEEK / "SUPER CHARGE" — a documented 4.0→4.10 DRIFT (2026-07-31) [T1 both sides].**
- **MYOMER SEEK / "SUPER CHARGE" — ⚠ the "4.0→4.10 drift" verdict below was WRONG and is
RETRACTED (same day).** 4.10 HAS the seek→speed coupling — in the un-exported master-perf
gap (@0x4a9cf2: `speedDemand *= max myomer speedEffect`, turn-freeze at dead drive; see
[[subsystems]] WAVE 6 correction). The manual is ACCURATE for 4.10; Oracle's pod memory
(seek-4 humanoid = 182 kph = the printed figure) confirmed it and prompted the re-audit.
The paragraph below is retained as the record of the error (its BINARY facts — the two
exported AvailableOutput callers, the single attr ref — were correct but incomplete:
export-gap functions are invisible to decomp text sweeps).
~~ORIGINAL (WRONG) VERDICT:~~
Manual p20/p22: seek "translates to a lower or higher top speed", gear 4 is named
**Supercharge** (screenshot caption "Seek Level Is Set to Supercharge"), expert-only ("in
standard simulation mode, you are not able to supercharge"), and "overheated myomers can
+17
View File
@@ -700,3 +700,20 @@ damage isn't only cross-TU reads (gotcha #23) — it is **which half rides the w
**Tool:** scope the trap. `StateIndicator`/`Simulation` state traps drown in subsystem churn —
filter to one watched object (`g_btGimpWatchMech`) and print the caller module-relative
(`btl4+0x…`) so `tools/symcrash.py` names it. That turned a two-hour guess into one line.
## §21 — Export-gap blindness: "no callers in the decomp" is NOT "no callers in the binary"
**(2026-07-31, the myomer seek retraction — the costliest wrong verdict to date.)** The Ghidra
export has GAPS (gitea #60): whole functions absent from `reference/decomp/all/*.c` — the
master-perf region 0x4a9770-0x4ab188, the 0x4a03xx crit caller, @004b838c, and others. A text
sweep of the decomp for callers/readers of a symbol **cannot see a consumer that lives in a
gap**. The myomer `speedEffect@0x31C` demand feed was declared dead on exactly such a sweep
("two AvailableOutput callers, one attribute reference, no raw readers") and an already-correct
port mechanism was deleted on that basis — while the real consumer sat un-exported at
@0x4a9cf2 (`speedDemand *= max myomer speedEffect` + the dead-drive turn freeze). Field
testimony (Oracle: pod seek-4 = 182 kph, the manual's printed figure) forced the re-audit.
**RULE: before declaring a data path dead, sweep the RAW IMAGE for the operand pattern**
capstone over the CODE section for the addressing form (e.g. FPU reads of `[reg+0x31C]`, SIB
`[reg+reg*4+0x330]`). Minutes of scanning; it found in one pass what three decomp sweeps
missed. Corollary: when the decomp and a PRIMARY SOURCE (the manual, a pod veteran) disagree,
treat the disagreement as a hole in YOUR evidence first, not in theirs.
+17 -10
View File
@@ -70,10 +70,20 @@ Making a base byte-exact GROWS every subclass — they must be re-based TOGETHER
was built on a misattribution.** `@004b9550/@004b95b8` (the "ConnectToMover/DisconnectFromMover"
bodies) are **MechWeapon::ConfigureMappables/ChooseButton** — their `+0x31C` is the weapon
TriggerState and `**(mech+0x128)` is the CONTROLS MAPPER's button roster (proven by the
MECHWEAP.CPP assert string + the trigger-edge detector @004b9608 adjacent). **The binary has NO
dynamic myomer→speed feed**: `AvailableOutput` has exactly TWO callers in the whole image
`RegisterMaxOutput` (assembly) and the SeekVoltageGraph sampler — and `speedEffect@0x31C` is a
published GAUGE attribute. The authentic myomer system, all live in the port now:
MECHWEAP.CPP assert string + the trigger-edge detector @004b9608 adjacent).
**⚠ SAME-DAY CORRECTION (the seek audit): the binary DOES have a dynamic myomer→speed feed
it lives in the un-exported master-perf gap** (@0x4a9cf2-0x4a9da4, raw capstone; the same gap
that hid the #93 crash block). Per frame: MAX `speedEffect@0x31C` over the myomer chain
(+0x7AC) → `mech+0x79C` → **`mapper->speedDemand@0x128 *= it`**, and at |drive| ≤ 1e-4
(@0x4ab16c) the mapper's `turnDemand@0x12C` is ZEROED — dead/overheated myomers freeze speed
AND turn. The morning's "no feed" verdict was export-gap blindness (text sweeps cannot see
un-exported functions; the decisive tool was a raw-image capstone scan for FPU reads of
+0x31C). Field truth agrees: Oracle (pod veteran) — seek-4 humanoids ran 182 kph (the
manual's printed Super Charged figure), overheat = "freezing up". The port restored the
demand scale byte-grounded (mechmppr.cpp): MAX over the chain, UNCLAMPED (gear 4 rides ~1.43×
demand into the RegisterMaxOutput cap = SUPERCHARGE), turn-freeze included; damage slows
(speedEffect carries 1damage — gitea #75's original premise was RIGHT).
The rest of the myomer system, all live in the port:
1. **Heat** — the drive-heat integrator (#85, below).
2. **Vital death** — myomers are the ONLY `vital=1` subsystem in the authored records
(BTL4.RES `res+0x48` scan): destroying them KILLS the mech (the #80 vital-crit path). This
@@ -95,12 +105,9 @@ Making a base byte-exact GROWS every subclass — they must be re-based TOGETHER
on a damaged generator freezes the pilot's AIM until they downshift. On a healthy mech,
gears 1-3 are literally identical (heat ratio floors at 1, no speed coupling); gear 4 =
double heat + a tighter dropout threshold for nothing but the taller graph — a trap.
**Deliberately REMOVED (was an invention): the `speedDemand *= speedEffect` demand multiplier**
(mechmppr.cpp) and `BTMyomersDriveOf`. Damaged-but-alive myomers heat faster and drop the
power curve but do NOT slow the mech — gitea #75's premise is falsified by the binary; the
mech's damage slowdown is the LEG-damage gimp gait, a separate live mechanism. Seek gears do
NOT change speed (heat + sourcing + graph only). Verified live: a mech with dmg=0.234
(speedEffect attr 0.766) beelines at full commanded speed with dmgGain=1.234 heat.
(A `speedDemand *= speedEffect` multiplier was removed in the morning commit and RESTORED,
byte-grounded and improved, the same day — see the correction above. Verified live: healthy
drive=1.0, collision-rattled myomers drive 0.89→0.74 with demand scaling in lockstep.)
**✅ MYOMER DRIVE HEAT LIVE (#85, 2026-07-31) [T2].** The five Mech motion operands of the
drive-heat integrator `@004b8d18` were `return 0.0f` cross-family shims, so the (fully
reconstructed) integrator accumulated `ratio² · damageGain · 0` every tick — myomers ice cold at
+44 -13
View File
@@ -969,19 +969,49 @@ void
speedDemand = -mech->reverseStrideLength * throttlePosition;
}
// (The myomer `speedDemand *= speedEffect` DRIVE SCALE is GONE -- myomer-
// system completion, 2026-07-31. It was an invention built on the
// ConnectToMover misattribution: the binary has NO dynamic myomer->speed
// coupling. AvailableOutput's only callers are RegisterMaxOutput (the
// assembly-time gait cap, now live via MyomersSimulation) and the ENG-page
// graph sampler; damaged-but-alive myomers heat faster and drop the power
// curve but do NOT slow the mech, and DESTROYED myomers KILL it (the
// authored vital flag + the #80 vital-crit death). GIMP slowdown: the
// binary's real mechanism is the gimp gait machines -- the LIVE demand is
// clamped to the wg clip's speed and the limp cadence enforces it;
// BT_GIMP_SPEED remains as an optional override multiplier (unset = 1.0 =
// authentic).)
// (History note: this block was briefly REMOVED on the morning of
// 2026-07-31 on the claim "the binary has NO dynamic myomer->speed
// coupling" -- an export-gap-blind conclusion, retracted the same day
// when the pod veterans testified seek 4 = 182 kph and the raw-image
// float-read sweep found the consumer inside the un-exported master-perf
// region. The restored form below is now BYTE-GROUNDED, and better than
// the pre-removal draft: MAX over the myomer chain (not first-found), NO
// 1.0 clamp (overdrive is real), and the turn-freeze at dead drive.)
{
// THE MYOMER DRIVE SCALE -- RESTORED + BYTE-GROUNDED (2026-07-31, the
// seek-audit correction). The morning's removal ("the binary has NO
// dynamic myomer->speed coupling") was EXPORT-GAP BLINDNESS: the
// master perf's un-exported region (@0x4a9cf2-0x4a9da4, raw capstone
// -- the same gap that hid the #93 crash block) walks the mech's
// MYOMER capability chain (+0x7AC) every frame, keeps the MAX
// speedEffect@0x31C in mech+0x79C, and MULTIPLIES the mapper's
// speedDemand@0x128 by it in place; when |max| <= 1e-4 (@0x4ab16c)
// it ALSO zeroes the mapper's turnDemand@0x12C -- dead/overheated
// myomers freeze BOTH speed and turn ("less than a minute at seek 4
// before overheating and freezing up" -- Oracle, who put pod seek-4
// humanoids at 182 kph: the manual's printed Super Charged figure).
// speedEffect = (gear/recGear) x heatFactor x (1 - damage), NO 1.0
// clamp: gear 4 rides ~1.43x demand into the RegisterMaxOutput gait
// cap (base x 1.4284) = SUPERCHARGE. [T1 disasm]
Scalar drive = 0.0f; // mech+0x79C accumulator
int myomers = 0;
extern Scalar BTMyomersSpeedEffectOf(void *subsystem); // myomers.cpp (-1 = not a Myomers)
int n = mech->GetSubsystemCount(); // chain-walk emulation (the
for (int i = 2; i < n; ++i) // +0x7AC fill is the SubProxy stub)
{
Scalar f = BTMyomersSpeedEffectOf(mech->GetSubsystem(i));
if (f >= -0.5f) // a Myomers (value may be 0)
{
++myomers;
if (f > drive) drive = f; // MAX over the chain (@0x4a9d20)
}
}
if (myomers > 0)
{
speedDemand *= drive; // @0x4a9d63: in-place demand scale
if (fabsf(drive) <= 1.0e-4f) // @0x4a9d89 vs _DAT_004ab16c
turnDemand = 0.0f; // @0x4a9d9e: mapper+0x12C -- the FREEZE
}
extern int BTMechGimpLevel(void *mech_v); // mechdmg.cpp (the TU-safe read)
int mm = BTMechGimpLevel(mech); // the gimp cell (see above)
if (mm == 3 || mm == 4)
@@ -1001,7 +1031,8 @@ void
if (s_dAcc >= 1.0f)
{
s_dAcc = 0.0f;
DEBUG_STREAM << "[drive] mm=" << mm << " dmd=" << speedDemand
DEBUG_STREAM << "[drive] drive=" << drive << " nMyo=" << myomers
<< " mm=" << mm << " dmd=" << speedDemand
<< " mech=" << (int)mech->GetEntityID()
<< " @" << (void *)mech << "\n" << std::flush;
}
+19 -7
View File
@@ -414,13 +414,25 @@ Scalar Myomers::SeekVoltageResponse(Scalar input_voltage)
// (see emitter.cpp BTSeekVoltageSample). Guarded: a non-Myomers subsystem
// samples 0 (only emitter/myomer pages own a graph in the shipped config).
//***************************************************************************
// (BTMyomersDriveOf is DELETED -- myomer-system completion, 2026-07-31. The
// demand-side `speedDemand *= speedEffect` coupling it fed (mechmppr.cpp) was
// an invention built on the ConnectToMover misattribution. The binary's only
// runtime AvailableOutput consumers are RegisterMaxOutput (assembly) and the
// SeekVoltageGraph sampler; myomer damage does NOT slow a live mech -- a
// DESTROYED myomers KILLS it, via the authored vital flag (the only vital=1
// subsystem in the RES) + the #80 vital-crit death path.)
//***************************************************************************
// BTMyomersSpeedEffectOf -- the myomer drive fraction for the master perf's
// demand scale (mechmppr.cpp). RESTORED 2026-07-31 (the seek audit): the
// morning's deletion of the predecessor (BTMyomersDriveOf) rested on an
// export-gap-blind sweep -- the REAL consumer lives in the un-exported
// master-perf region @0x4a9cf2-0x4a9da4: MAX speedEffect over the myomer
// chain -> mech+0x79C -> `mapper->speedDemand *= it` (+ turn freeze at
// |drive| <= 1e-4). UNCLAMPED (the old bridge's f>1 -> 1 clamp ate the
// gear-4 overdrive): speedEffect legitimately rides to ~1.43 at seek 4.
// Returns -1 for a non-Myomers subsystem. [T1 disasm]
//***************************************************************************
Scalar BTMyomersSpeedEffectOf(void *subsystem)
{
Entity *entity = (Entity *)subsystem;
if (entity == 0 || !entity->IsDerivedFrom(Myomers::ClassDerivations))
return -1.0f;
Scalar f = ((Myomers *)entity)->SpeedEffect();
return (f > 0.0f) ? f : 0.0f;
}
Scalar BTMyomersSeekSample(void *subsystem, Scalar voltage)
{