<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://suuttt.github.io/tdmpc-glass/feed.xml" rel="self" type="application/atom+xml" /><link href="https://suuttt.github.io/tdmpc-glass/" rel="alternate" type="text/html" /><updated>2026-07-23T14:39:01+00:00</updated><id>https://suuttt.github.io/tdmpc-glass/feed.xml</id><title type="html">TD-MPC-Glass</title><subtitle>Beating a strong world model is hard — a fair-protocol field report on model-based RL abstraction.</subtitle><entry><title type="html"></title><link href="https://suuttt.github.io/tdmpc-glass/2026/07/23/2026-07-04-tdmpc-glass-part9-anatomy-of-beating-ppo.html" rel="alternate" type="text/html" title="" /><published>2026-07-23T14:39:01+00:00</published><updated>2026-07-23T14:39:01+00:00</updated><id>https://suuttt.github.io/tdmpc-glass/2026/07/23/2026-07-04-tdmpc-glass-part9-anatomy-of-beating-ppo</id><content type="html" xml:base="https://suuttt.github.io/tdmpc-glass/2026/07/23/2026-07-04-tdmpc-glass-part9-anatomy-of-beating-ppo.html"><![CDATA[<blockquote>
  <p>The capstone of the positive-chase (<a href="../2026-07-04-tdmpc-glass-part8-chasing-positives">Part 8</a>). This week we
ran the control experiment for every claim we wanted to make — an off-policy baseline, a shaped-flat baseline, a
config-bug fix, a 4× budget extension, and a per-loss ablation — on byte-identical environments. Every control
changed its claim. What’s left is smaller than what we started with, and solid. All numbers trace to JSONs/logs
in the campaign ledger; two corroborative cells are still running (marked).</p>
</blockquote>

<h2 id="the-final-scorecard">The final scorecard</h2>

<table>
  <thead>
    <tr>
      <th>claim as originally hoped</th>
      <th>what the control said</th>
      <th>final form</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>“TD-MPC2 beats PPO by exploring better”</td>
      <td>plan-vs-π: planning isn’t the explorer; SAC: model-free escapes too</td>
      <td><strong>categorical wall on the hop only; graded barrier on Stand — reliability×efficiency ordering TD-MPC2 ≫ SAC ≫ PPO on hopper dynamics</strong> (revised twice on 07-03 as n grew)</td>
    </tr>
    <tr>
      <td>“the world model is the exploration lever”</td>
      <td>per-loss ablation</td>
      <td><strong>the TD <em>value</em> signal is the lever; the self-predictive loss is the least critical piece</strong></td>
    </tr>
    <tr>
      <td>“world model buys 2× higher level”</td>
      <td>SAC at 4× budget (n=5)</td>
      <td><strong>no clean level gap — consistency + ~4–5× sample-efficiency</strong></td>
    </tr>
    <tr>
      <td>“learned hierarchy beats flat”</td>
      <td>shaped-flat control (n=6)</td>
      <td><strong>dense shaping in disguise; the hierarchy’s real trick is <em>self-generating</em> that signal</strong></td>
    </tr>
  </tbody>
</table>

<h2 id="1-the-wall-real-on-policy-gait-specific">1. The wall: real, on-policy, gait-specific</h2>

<p>On the identical MJX <code class="language-plaintext highlighter-rouge">HopperHop</code> (verified byte-for-byte — same registry env, episode length, action repeat):</p>

<ul>
  <li><strong>PPO (tuned config): peak 53.8, 0/5 seeds ≥200, through 472M steps/seed.</strong> Categorically walled.</li>
  <li><strong>SAC (tuned config): 3/3 seeds cross 200 within 5M.</strong> The wall is an <strong>on-policy pathology</strong> — replay +
entropy exploration escapes it.</li>
  <li><strong>TD-MPC2: ~282 at 1M (n=4, best 367); 5M bests 295–610, mean 420 ± 113 (final, n=12, 07-05)</strong> — the
flagship efficiency anchor at publication n: eight fresh seeds joined the original four (best 610, worst 295;
a wide but honest spread).</li>
</ul>

<p>And the wall does not generalize: FingerTurnHard PPO ≈973 (3/3, no wall); Pendulum solves once an upstream
config-case bug (<code class="language-plaintext highlighter-rouge">PendulumSwingUp</code> vs <code class="language-plaintext highlighter-rouge">PendulumSwingup</code> silently skipping the tuned override) is fixed — peaks
842/831 (n=2); BallInCup is discovery-luck for <em>both</em> algorithms (PPO 1/3, TD-MPC2 1/2). <em>(Addendum, later that
day — a fourth control: <strong>CheetahRun</strong>, which our own older Pareto study had scored “PPO never reaches 500 at
30M.” With the tuned config and adequate budget, PPO reaches <strong>892–922 (3/3 seeds at 285M)</strong>, matching SAC
(918/912 at 10M) — the old number was a budget/config artifact, corrected in the synthesis doc. CheetahRun is
slow-but-converging, not walled; TD-MPC2’s edge there is purely efficiency, ~600+ within 0.55M steps.)</em></p>

<p><strong>🚩 Framing revisions (2026-07-03, the wall-boundary probe — twice, because the controls kept teaching):</strong> we
asked whether the wall is the <em>hop gait</em> or the <em>hopper robot</em>, running the same three arms on <strong>HopperStand</strong>
(same morphology, easier objective). At n=2 PPO looked walled there too (149/142 @285M) and we briefly framed the
wall as morphology-categorical. <strong>Extending to n=4 corrected that:</strong> PPO Stand = 149 / 142 / 144 / <strong>681 — one
seed in four escapes</strong>; and SAC Stand = 492 / 754 / 464 / <strong>33 — one seed in four fails</strong>. The honest final
picture, with five no-wall control tasks:</p>

<ul>
  <li><strong>HopperHop: a categorical on-policy wall, budget-indexed for the rest</strong> — PPO <strong>0/5 ≥200 at 472M</strong>; SAC crosses
200 in <strong>6/12 seeds by 5M (final, 07-04) and 6/9 by 8M</strong> (final 07-05: the 20M cohort crossed 5/5 at
4.1–7.7M, but four fresh direct-8M seeds went 1/4 — 374 vs 117–140 — SAC’s crossing by 8M is a ~2/3 rate,
not a certainty); TD-MPC2 <strong>6/6 by ~1M</strong>. <em>(07-05: the wall also survives the standard exploration knob — entropy_cost ×3 and ×10 leave
PPO at peaks 4–74, n=2 each at 150M, no better than baseline; under-exploration hyperparameters are not the
explanation. Instructive contrast on the <strong>graded</strong> Stand barrier below (n=4/arm final): entropy ×3 put 1/4 seeds
over — 627 vs 118–150 — a rate consistent with the baseline’s 2/16 escape lottery, not a repair; ×10 walled
all four (116–185). The knob neither repairs the graded barrier nor dents the categorical wall.)</em></li>
  <li><strong>HopperStand: a graded but near-categorical barrier</strong> — PPO escapes <strong>2/16</strong> (final, 07-04: eight more
seeds at the full 285M budget ALL walled at 105–195; both escapes — 681/749 — came from earlier 120M runs);
SAC
<strong>0/3 at 1M and 7/10 by 5M</strong> (final, 07-04: solves 464–932; fails 33/100/300); TD-MPC2 <strong>3/3 by ≤0.9M</strong>
(962 / 948 / 943 — the third seed by just 0.3M). The final three-method gradient on Stand — <strong>TD-MPC2 3/3 ≫
SAC 7/10 ≫ PPO 2/16</strong> — and the matched-1M column (TD-MPC2 solves both hopper tasks at a budget where neither
model-free method solves either) are the paper-grade statements.</li>
</ul>

<p>So the durable, defensible claim is a <strong>reliability × efficiency ordering on hopper dynamics — TD-MPC2 ≫ SAC ≫
PPO, with orders-of-magnitude budget gaps</strong> — hardest exactly where the dynamics are unstable and
contact-timing-critical, categorical only for the hop itself. Both of today’s framings (“gait-specific”, then
“morphology-categorical”) died under one more seed each; this one is stated at the n we actually have.
<em>(TD-MPC2 Stand later firmed to <strong>5/5</strong>: 962/948/943/959/959, all within 1M.)</em></p>

<p><strong>Discriminator (07-04 evening, AcrobotSwingup — unstable but <em>contact-free</em>; all cells n=4 by 07-05):</strong> PPO
learns fine (267–344 at 285M) — <strong>no wall</strong>, so the on-policy wall requires contact-criticality, not
instability alone. And SAC is slow <em>and</em> inconsistent here even at 20M (42/66/123/207; 54–89 at 5M) — the
off-policy advantage is also task-class-specific, not a generic superiority. <strong>TD-MPC2 leads on both task
classes (422–454 within 1M, n=4)</strong> — of the three methods, the value-pathway advantage is the most portable.
<em>(Completing the humanoid matrix: SAC also solves HumanoidStand, 918/922 — off-policy SAC solves both humanoid
tasks while PPO can’t run and TD-MPC2 diverges on both.)</em></p>

<h2 id="2-level-vs-efficiency-the-4-budget-test">2. Level vs efficiency: the 4× budget test</h2>

<p>If the world model bought a higher <em>level</em>, SAC shouldn’t reach TD-MPC2’s plateau at any reasonable budget. At
20M steps (4× TD-MPC2’s), SAC’s finals are <strong>246 / 277 / 285 / 414 / 572</strong> (n=5; peaks to 574). The mean (~359)
sits below TD-MPC2’s ~477, but the best seeds reach or exceed it — the distributions overlap. So:</p>

<blockquote>
  <p><strong>The world model’s robust advantages are <em>consistency</em> (TD-MPC2: 4/4 seeds ≥282 at 1M; SAC: wild seed spread
even at 20M) and ~4–5× sample-efficiency. Not a level ceiling.</strong></p>
</blockquote>

<p>This is the campaign’s own law — “abstraction buys speed, not ceiling” — arriving from a fourth independent
direction, and it agrees with where the field has landed (BRO, SimBa, TD7, CrossQ: scaled/regularized model-free
methods keep erasing model-based “level” gaps; the efficiency gap is the durable one).</p>

<h2 id="3-which-part-of-the-world-model-does-the-work-the-value-signal">3. Which part of the “world model” does the work? The value signal.</h2>

<p>Per-loss ablation (zero ONE loss term, from scratch, mask verified live in logs; MPPI + π-only eval returns):</p>

<p><strong>CheetahRun (decisive arms at n=4 as of 07-04, 1M):</strong> full = 738/782/721/795 (MPPI bests). Ablate <strong>value →
16/37/58 — dead 4/4</strong> (π ≤12). Ablate <strong>reward → MPPI dead at 5/31/26 but π at FULL strength 761/796/805 — n=4</strong> (planning-only, partly by
construction — MPPI scores rollouts with it). Ablate <strong>policy prior → MPPI limps at 123/192/141 while π is dead
at 2.5/9/11 — n=4.</strong> Ablate <strong>consistency — the self-predictive latent-dynamics loss itself → 367/516/558 MPPI
(π 541/575/623), the smallest drop of the four — n=4.</strong> <em>(07-04: with these, every arm of the five-loss ablation
is at n≥4 on all three tasks.)</em></p>

<p><strong>HopperHop — the exploration task (all five arms at n=4; the headline value cell firmed to n=6 on 07-03):</strong>
full finds the gait on 6/6 seeds (MPPI best 287–570). <strong>Value-ablated: 0.0 / 0.0 / 3.2 / 0.0 / 0.0 / 0.1 (n=6) —
the gait is <em>never</em> found. Ablating the TD value loss reproduces the exploration wall, six seeds out of six.</strong> Consistency-ablated still finds it
at roughly half strength on 4/4 seeds (MPPI 185–245). Reward-ablated matches CheetahRun’s pattern: the planner is
dead by construction (MPPI ≈0 — it scores rollouts with that head) but <strong>the policy still learns the gait</strong>
(π 519 / 241 / 226 / 189, n=4). Policy-ablated is ≈0 on <em>both</em> readouts (n=4) — and here HopperHop is <em>harsher</em>
than CheetahRun (where the planner alone still limped to 123): on the exploration task the planner cannot
compensate for a missing prior at all. So the precise statement: <strong>the value-learning pathway — the TD value loss
and the policy trained from it — is individually necessary (each ablation reproduces total failure); the reward
head matters only for planning; and the self-predictive consistency loss is the only component whose removal
merely degrades.</strong></p>

<p><strong>Replicated on a third task (WalkerRun, decisive arms at n=4, 1M):</strong> full 731/680/699/723 (MPPI best);
<strong>value-ablated 56/28/39/38 — dead 4/4; policy-ablated 76/64/83/53 — dead 4/4</strong> (seeds 3/4 dead through ≥900k);
reward-ablated MPPI dead (44/44) but π at full strength 711/728/681/684 (n=4); consistency-ablated 547/522 &amp;
533/483 (π to 667) — the mildest cut yet again, now n=4. The mechanism table now spans three tasks — <strong>CheetahRun
n=4, HopperHop value-cell n=6, WalkerRun n=4 on every arm</strong> — with the same shape everywhere.</p>

<p><strong>Sufficiency grid (revised 07-07): removability is the exception, not a task-class rule.</strong>
Training consistency-OFF from scratch at the full 5M budget, four tasks in:</p>
<ul>
  <li><em>HopperHop (exploration-bound)</em>: stripped <strong>165/475/481/511</strong> vs full 420 ± 113 (n=12) — three seeds at the
top of the full band, reaching 440+ by ~2M. Removable for typical seeds; residual role = worst-seed insurance.</li>
  <li><em>WalkerRun (dense)</em>: stripped <strong>537/574/554/594 (mean 565)</strong> vs full <strong>709/705/753/782 (mean 737)</strong> — −23%,
non-overlapping.</li>
  <li><em>CheetahRun (dense)</em>: stripped <strong>527/528/516/524 (mean 524)</strong> vs full <strong>903/904/782/806 (mean 849)</strong> — −38%,
non-overlapping.</li>
  <li><em>AcrobotSwingup (exploration-flavored, 07-07 morning)</em>: stripped <strong>297/233/352/256 (mean 284)</strong> vs full
<strong>533/511/513/488 (mean 511)</strong> — <strong>−44%, non-overlapping</strong>.
Honest revision: our 07-06 “exploration vs dense” split — written when only Hop and Walker were in — <strong>breaks
on Acrobot</strong>, which is exploration-flavored yet shows the <em>largest</em> gap. The reading that survives all four
tasks: the consistency loss supports MPPI rollout quality wherever <em>the planner carries learning</em> (Acrobot,
Walker, Cheetah are all planner-led here); HopperHop — where the policy head learns the behavior directly and
the planner mostly amplifies it — is the removable case. CartpoleSwingupSparse was queued as the fifth test,
but the full-model baseline itself stalls on this sparse task (bests 0.0/0.0/1.3/0.0 at 5M, n=4 — a known
TD-MPC2 failure mode with default exploration), so that cell is a degenerate both-fail rather than an
informative sufficiency probe; the grid’s evidentiary core stays the four tasks the full model solves. The HopperHop removable cell now
holds at <strong>n=8</strong>: four fresh stripped seeds land at 306/449/443/477 (mean 419), so 7 of 8 stripped seeds sit
inside the full-model band 420±113 — removability confirmed, with the lone 165 floor-dip the only exception.</li>
</ul>

<p><strong>Replicated on a FOURTH task (HopperStand, n=4/arm, 07-05) — a task the full model solves in 0.3M steps:</strong>
none 911–946 (all solve); <strong>value-ablated 6–13 — dead; policy-ablated 9–34 (π ≤5) — dead</strong>; reward-ablated MPPI
degraded to 265–542 but <strong>π at 944/515/943/944</strong>; consistency-ablated 816–898 (π to 930; one seed at eval 13/20
when written) — here the mildest cut is nearly no cut at all. Same shape, fourth task: <strong>without the TD value
loss, TD-MPC2 cannot even learn to stand.</strong></p>

<blockquote>
  <p><strong>“The world model explores” decomposes into: the TD value signal trained through the latent is what discovers
and ranks behavior; the self-predictive dynamics loss is a helpful regularizer, not the key.</strong> This rhymes with
the entire campaign — from the redundancy nulls to the anti-collapse reversal, the value anchor keeps being the
thing that matters.</p>
</blockquote>

<h2 id="4-hierarchy-the-win-was-the-signal-not-the-structure">4. Hierarchy: the win was the signal, not the structure</h2>

<p>The fourroom result (feudal 4/6, sparse-flat 0/6) survived n=6 — and then the right control killed its
interpretation: <strong>flat TD3 + dense potential shaping toward the goal solves 3/6</strong> — statistically the same as
feudal. What carried the win was <em>density of learning signal</em>, not hierarchy. The surviving claim is narrower and
still interesting: <strong>the feudal agent manufactured that dense signal itself</strong> (its low level trains on distance
to <em>self-proposed</em> subgoals; no privileged goal information), whereas the control had to be handed the true goal.
This independently replicates Nachum et al. (2019): most of HRL’s measurable benefit reproduces on flat agents
given better exploration/shaping.</p>

<h2 id="4b-addendum-07-04-does-the-ordering-generalize-the-humanoid-says-no--it-inverts">4b. Addendum (07-04): does the ordering generalize? The humanoid says no — it <em>inverts</em></h2>

<p>The hopper result predicts “TD-MPC2 ≫ SAC ≫ PPO wherever dynamics are unstable and contact-critical.” We tested
that prediction on a second unstable morphology, <strong>HumanoidWalk</strong> (21-DoF), same three-arm design. The prediction
failed — informatively. Every method broke, each along a <strong>different axis</strong>:</p>

<ul>
  <li><strong>PPO: numerically unusable — reward=nan under all 3 configs tried</strong> (brax defaults; a tuned-WalkerRun
transplant with 512³ networks + reward_scaling 0.1; same + reward_scaling 1.0 + lr 1e-4). Notably there is <em>no
official tuned humanoid config</em> in mujoco_playground’s DMC params — the fragility is upstream reality, not our
bug.</li>
  <li><strong>TD-MPC2 (final, 9 runs): under the default config, training diverges to loss=nan on 6/6 walk seeds (onsets
0.53–2.51M) and on the easier HumanoidStand (0.28M) — 7/7, effectively deterministic with variable onset; best
return before any nan was 30.4.</strong> Lowering the update-to-data ratio shifts the onset stochastically rather than
fixing it (k_update=32 diverged at 3.13M; k_update=64 was the <em>only</em> run of nine to finish 4M) — <strong>and the
nan-free survivor never learned anyway (best 21.8, flat ~20 for 4M steps).</strong> So the humanoid failure is not
merely numerical: under every setting tried, TD-MPC2 does not crack the 21-DoF task at these budgets. The same
architecture solved hopper Stand at 0.3M.</li>
  <li><strong>SAC: the only robust method — 4/5 seeds solve (625–909 at 5M), 1/5 hit a nan of its own.</strong></li>
</ul>

<p>So the reliability ordering is <strong>task-class-dependent, and on the high-DoF humanoid it inverts</strong>: plain
off-policy SAC beats both the on-policy and the model-based method — not on sample-efficiency but on <em>working at
all</em>. Config/numerical fragility is a distinct failure axis from exploration, and any “X beats PPO” claim needs
to say which axis it lives on. This sharpens rather than weakens the paper: the hopper ordering is real, matched,
and quantified — and it is a statement about hopper-class dynamics, not a universal law.</p>

<h2 id="5-what-this-week-actually-taught">5. What this week actually taught</h2>

<ol>
  <li><strong>Run the control before the claim.</strong> Four headline claims went into this week; four came out rewritten by
their own controls — every time into something smaller and truer. (The full adversarial review that mandated
these controls, and the retraction bookkeeping, is in the campaign ledger and
<a href="../explainer-r2-pareto-analysis">the R²/Pareto explainer</a>.)</li>
  <li><strong>The durable positives of the whole program</strong>: (a) explicit abstraction is redundant on a strong
value-anchored latent (Paper A, submission-ready); (b) structured priors and world models buy
sample-efficiency and consistency — never a ceiling — across priors, hierarchy, planning, and model-based RL
(the speed-of-learning paper); (c) on-policy PPO has a real, reproducible, task-specific exploration failure
mode that off-policy and model-based methods don’t share — and its mechanism, in TD-MPC2’s case, is value
learning, not dynamics modeling.</li>
  <li><strong>Complete.</strong> All 20 HopperHop ablation runs finished (the mid-campaign host outage turned out to be
network-only; the jobs never stopped). Nothing in this post is pending.</li>
</ol>

<p><strong>What’s next (07-05):</strong> the 5M efficiency anchor is being extended to n=12 overnight (last wide-CI number);
then this post’s content gets assembled into a conference paper (matched-env wall + budget-indexed rates +
4-task value-pathway mechanism + Acrobot/humanoid boundary results), with the redundancy-criterion paper
(Paper A) already at submission-readiness in parallel.</p>

<p><em>Every number: campaign ledger <code class="language-plaintext highlighter-rouge">bet2_null_results.md</code> (disk paths per entry). Same-env verification, config
audits, and the two bugs found along the way (Pendulum case mismatch; an A1 noise confound) are documented in the
2026-07-02 full-arc review.</em></p>]]></content><author><name></name></author></entry><entry><title type="html">TD-MPC-Glass, Part 22: What the Numbers Actually Mean — And Whether We Ever Removed the World Model</title><link href="https://suuttt.github.io/tdmpc-glass/2026/07/23/tdmpc-glass-part22-what-the-numbers-mean.html" rel="alternate" type="text/html" title="TD-MPC-Glass, Part 22: What the Numbers Actually Mean — And Whether We Ever Removed the World Model" /><published>2026-07-23T00:00:00+00:00</published><updated>2026-07-23T00:00:00+00:00</updated><id>https://suuttt.github.io/tdmpc-glass/2026/07/23/tdmpc-glass-part22-what-the-numbers-mean</id><content type="html" xml:base="https://suuttt.github.io/tdmpc-glass/2026/07/23/tdmpc-glass-part22-what-the-numbers-mean.html"><![CDATA[<blockquote>
  <p>Part 21 was an audit. This one is a glossary and a reckoning. Every term the
last two days of results have leaned on, explained from scratch with the
actual numbers — and then the question that matters most: <strong>have we been
ablating the thing we said we were ablating?</strong></p>
</blockquote>

<h2 id="part-1--the-setup-in-plain-language">Part 1 — The setup, in plain language</h2>

<p>We train the same agent twice on the same task. One copy is normal. The other
has one loss term switched off. Then we ask whether the second copy is worse.</p>

<p>That’s it. Everything else is bookkeeping about <em>how much</em> worse, <em>how
reliably</em>, and <em>what kind of worse</em>.</p>

<p>Two details make the bookkeeping harder than it sounds:</p>

<p><strong>Runs are random.</strong> Each training run starts from a different random seed —
different network initialisation, different exploration noise, different data.
Two identical configurations can land far apart. So we don’t run each
configuration once; we run it many times and look at the spread.</p>

<p><strong>The number we compare is not the last number.</strong> An agent’s score bounces
between evaluations. On pendulum a single run read 360 at one checkpoint and 0
at the next. So we take the <strong>last-6-evaluation median</strong>: the six most recent
evaluations of a finished run, sorted, middle value. One number per run, robust
to a single bad checkpoint.</p>

<hr />

<h2 id="part-2--the-vocabulary">Part 2 — The vocabulary</h2>

<h3 id="a-cell">“A cell”</h3>

<p>Our main table is a grid: rows are tasks (cheetah, walker, ball-in-cup, …),
columns are the four combinations of <em>full vs stripped agent</em> × <em>policy π vs
planner Π</em>. Each box in that grid is a <strong>cell</strong>.</p>

<p>“Which cell moved” is shorthand for: when we switched off the loss term, which
of those four boxes changed? If the full-vs-stripped difference shows up under
the planner but not under the policy, that tells you the effect lives in
<em>planning</em>, not in the representation. Acrobot does exactly that, and that’s
how we know.</p>

<h3 id="per-seed-values">“Per-seed values”</h3>

<p>Instead of reporting one number per configuration, we report the whole list.
Cheetah’s stripped arm at n=12:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>498.3  543.5  566.8  572.6  586.4  587.6  603.4  612.1  615.7  617.5  627.8  648.1
</code></pre></div></div>

<p>Twelve runs, twelve numbers. Reporting the list rather than the average is the
single most useful thing this campaign started doing, because averages hide the
two shapes below.</p>

<h3 id="unimodal-vs-bimodal">“Unimodal” vs “bimodal”</h3>

<p><strong>Unimodal</strong> means the numbers cluster around one value. Cheetah’s stripped arm
above is unimodal: it runs smoothly from 498 to 648 with no gaps. Every run
learned the task; they just learned it to slightly different degrees.</p>

<p><strong>Bimodal</strong> means the numbers fall into two separate clumps with a gap between.
Finger-spin’s stripped arm at n=9:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>641.1  701.3  702.6  │   926.4  930.5  948.9  953.9  957.5  966.7
└──── three runs ────┘   └──────────── six runs ─────────────────┘
                    224-point gap
</code></pre></div></div>

<p>That is <em>not</em> “the average is 838.” No run scored 838. Three runs failed to
learn properly and six learned fine. The mean describes nothing that happened.</p>

<p><strong>Why it matters so much:</strong> the right summary statistic depends on the shape.
For a unimodal arm, an average or a gap is meaningful. For a bimodal arm, the
only honest summary is a <strong>success rate</strong> — how many runs landed in the good
clump. Using an average on a bimodal arm is how we ended up retracting two
claims.</p>

<h3 id="graded-vs-all-or-nothing">“Graded” vs “all-or-nothing”</h3>

<p>This follows directly.</p>

<ul>
  <li><strong>Graded</strong>: every run learns, and the ablation changes <em>how well</em>. Cheetah’s
full arm averages 753, stripped averages 574. Everyone succeeds; the stripped
ones succeed less. The effect is a continuous quantity.</li>
  <li><strong>All-or-nothing</strong>: runs either succeed completely or fail completely, and the
ablation changes <em>how often</em>. Ball-in-cup’s full arm solves 8 times out of 14
— and when it solves, it scores 972–976, essentially a perfect score. When it
doesn’t, it scores 0. There is no middle.</li>
</ul>

<p>These are different phenomena and they need different statistics. That
distinction is the backbone of the current hypothesis.</p>

<h3 id="inversions-and-0144">“Inversions”, and “0/144”</h3>

<p>Take every full-arm run and pair it with every stripped-arm run. With 12 runs
each, that’s 12 × 12 = <strong>144 pairs</strong>. An <strong>inversion</strong> is a pair where the
stripped run beat the full run — the “wrong” way round.</p>

<ul>
  <li>Cheetah at n=12: <strong>0/144</strong>. Every single full run scored higher than every
single stripped run. The two lists don’t overlap at all.</li>
  <li>Walker at n=12: <strong>16/144</strong>. Mostly ordered, but 16 pairs go the wrong way —
the lists overlap.</li>
</ul>

<p>“0/144 inversions” is the cleanest possible result for a comparison of this
kind. It’s what “complete separation” means, stated as a count.</p>

<h3 id="p--37--10--where-that-number-comes-from">“p = 3.7 × 10⁻⁷” — where that number comes from</h3>

<p>This is an <strong>exact permutation test</strong>, and it’s simpler than it looks.</p>

<p>Ask: <em>suppose the labels are meaningless.</em> Suppose those 24 cheetah numbers are
just 24 numbers, and calling twelve of them “full” and twelve “stripped” is
arbitrary. How many ways are there to split 24 numbers into two groups of 12?</p>

\[\binom{24}{12} = 2{,}704{,}156\]

<p>Of those 2.7 million possible splits, <strong>how many put all twelve highest numbers
in one group?</strong> Exactly one. So if the labels meant nothing, the chance of
seeing a split this extreme is 1 in 2,704,156 —</p>

\[p = \frac{1}{2{,}704{,}156} = 3.7 \times 10^{-7}\]

<p>No distributional assumptions, no normality, no t-test. Just counting
arrangements. That’s why it’s called <em>exact</em>.</p>

<h3 id="the-design-floor">“The design floor”</h3>

<p>Notice what that implies: with 12 runs per arm, <strong>the smallest p you can ever
get is 1/2,704,156</strong>, because perfect separation is the most extreme outcome
available. That’s the <strong>design floor</strong> — the best possible p-value for that
sample size.</p>

<table>
  <thead>
    <tr>
      <th>runs per arm</th>
      <th>possible splits</th>
      <th>best achievable p</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>2</td>
      <td>6</td>
      <td>0.167</td>
    </tr>
    <tr>
      <td>3</td>
      <td>20</td>
      <td>0.050</td>
    </tr>
    <tr>
      <td>5</td>
      <td>252</td>
      <td>0.004</td>
    </tr>
    <tr>
      <td>8</td>
      <td>12,870</td>
      <td>7.8 × 10⁻⁵</td>
    </tr>
    <tr>
      <td>9</td>
      <td>48,620</td>
      <td>2.1 × 10⁻⁵</td>
    </tr>
    <tr>
      <td>12</td>
      <td>2,704,156</td>
      <td>3.7 × 10⁻⁷</td>
    </tr>
  </tbody>
</table>

<p>This table cost us a day. The DreamerV3 hopper comparison was run at <strong>2 seeds
per arm</strong>, where the best possible p is 0.167 — <em>it could never have reached
significance no matter how large the effect was.</em> We’d have run it, seen a
gap, and reported something unsupportable. Now the first question about any
design is: what’s the best p this could produce?</p>

<h3 id="the-margin">“The margin”</h3>

<p>The margin is the <em>gap</em> between the worst full run and the best stripped run.
Cheetah at n=12: worst full is 681.25, best stripped is 648.10, so the margin is
<strong>33.15 points</strong>.</p>

<p>An inversion count and a margin measure different things. Zero inversions says
the lists don’t overlap. The margin says <em>by how much</em>. You can have zero
inversions with a huge gap (robust) or with a hair’s-breadth gap (fragile).</p>

<p>And here’s the finding that surprised us: <strong>margins shrink as you add runs.</strong>
Cheetah’s margin was 92.85 at n=3, n=5, and n=8 — rock stable across ten added
runs — and then fell to 33.15 at n=12, when an unusually weak full run (681) and
an unusually strong stripped run (648) both showed up.</p>

<p>That’s not bad luck. It’s arithmetic. The margin depends on the <em>extremes</em> of
both lists, and the more runs you do, the more extreme your extremes get. A
margin is an <strong>extreme-order statistic</strong>, and it drifts downward with n by
construction. So a stable margin is evidence only <em>relative to the n at which
you measured it</em>. We had asserted cheetah’s margin was stable; at n=12 that
turned out to be wrong, and correcting it produced a better methodological point
than the original claim.</p>

<hr />

<h2 id="part-3--the-hard-question-did-we-ever-remove-the-world-model">Part 3 — The hard question: did we ever remove the world model?</h2>

<p><strong>Short answer: no, and this is the most important thing in the paper.</strong></p>

<h3 id="what-td-mpc2s-latent-dynamics-is-trained-by">What TD-MPC2’s latent dynamics is trained by</h3>

<p>TD-MPC2 has a learned dynamics network <code class="language-plaintext highlighter-rouge">d(z, a)</code> — given a latent state and an
action, predict the next latent state. Three separate signals train it:</p>

<ol>
  <li><strong>Self-prediction (the “consistency” loss).</strong> Roll <code class="language-plaintext highlighter-rouge">d</code> forward one step, and
pull the result toward a target encoding of the <em>actual next observation</em>.
This is what grounds the latent in the world.</li>
  <li><strong>The reward head.</strong> Predict reward from latents that were produced by
rolling <code class="language-plaintext highlighter-rouge">d</code> forward. Errors flow backward <em>through</em> <code class="language-plaintext highlighter-rouge">d</code>.</li>
  <li><strong>The value head.</strong> Same structure: Q-values are computed on rolled-out
latents, so its gradients also flow back through <code class="language-plaintext highlighter-rouge">d</code>.</li>
</ol>

<p>Our ablation sets <code class="language-plaintext highlighter-rouge">consistency_coef = 0</code>. That deletes <strong>only signal 1.</strong></p>

<p>Signals 2 and 3 remain untouched, and the planner still rolls trajectories
through <code class="language-plaintext highlighter-rouge">d</code> when choosing actions. So the “stripped” agent:</p>

<ul>
  <li><strong>still has a dynamics model</strong></li>
  <li><strong>still trains it</strong>, using reward and value prediction</li>
  <li><strong>still plans through it</strong></li>
</ul>

<p>It has lost exactly one thing: the requirement that its imagined next state
resemble the <em>actual</em> next state. It no longer has to model the world — only
the parts of the world that affect reward and value.</p>

<h3 id="why-this-isnt-a-flaw-and-what-it-makes-the-paper-about">Why this isn’t a flaw, and what it makes the paper about</h3>

<p>That object has a name. It’s a <strong>value-equivalent model</strong> — Grimm et al. (2020),
and the principle behind MuZero. The idea: a model doesn’t need to predict
observations, only quantities that affect decisions.</p>

<p>So our experiment is not “world model vs no world model.” It’s:</p>

<blockquote>
  <p><strong>Does observation-grounded self-prediction earn its keep on top of value
equivalence?</strong></p>
</blockquote>

<p>This is a narrower question and a better one. It’s the question the
value-equivalence literature actually poses, and it’s <em>answerable</em> — where
“does a world model help?” is under-specified, because it depends entirely on
what you mean by removing it.</p>

<p>It also <strong>explains our results</strong> in a way the loose framing couldn’t. The
stripped agent stays competitive on dense-reward tasks like cheetah and walker,
because reward and value gradients alone are enough to shape a usable latent
there. It falls apart on acrobot’s <em>planner</em>, because planning three steps
through a latent that was never grounded in observations produces garbage. The
old framing had to call those unrelated. The value-equivalence framing predicts
both.</p>

<p><strong>What we genuinely cannot test:</strong> a true model-free TD-MPC2 — no dynamics
network at all. That’s not an ablation, it’s a different algorithm. The closest
reference point is the tuned SAC baseline from the official TD-MPC2 release, and
we use it as exactly that.</p>

<hr />

<h2 id="part-4--so-is-that-why-dreamer-behaves-differently">Part 4 — So is that why Dreamer behaves differently?</h2>

<p>Partly — but let me correct a framing first, because the difference is real and
the word “crash” is doing damage.</p>

<p><strong>What actually happened.</strong> In DreamerV3 on hopper, the ablated agent scored 188
against the full agent’s 322. That’s a substantial degradation. It is <em>not</em> a
crash to zero. The thing that genuinely collapsed in this campaign was the JEPA
arm — and that was a configuration pathology (the anti-collapse regulariser
saturating against a one-hot softmax), not a consequence of the ablation.</p>

<p><strong>Why the same nominal ablation has different leverage.</strong> DreamerV3’s ablation
is <code class="language-plaintext highlighter-rouge">loss_scales.dyn = 0</code>, which switches off the KL term pulling the RSSM’s
<em>prior</em> toward its <em>posterior</em>. And here’s the structural difference:</p>

<ul>
  <li><strong>DreamerV3 trains its actor and critic entirely inside imagination.</strong> They
never see real states. Every gradient they receive comes from trajectories the
model dreamed. Break the prior and you have poisoned the only source of
training signal the controller ever gets.</li>
  <li><strong>TD-MPC2 trains its policy on real latents</strong>, and its planner only rolls
<strong>3 steps</strong> before falling back on a learned value estimate. Break the
self-prediction and you’ve degraded a 3-step lookahead that was already
backstopped.</li>
</ul>

<p>So: <strong>same switch, very different blast radius.</strong> In Dreamer the model <em>is</em> the
training environment. In TD-MPC2 the model is a short-horizon lookahead
attached to a controller that has other sources of signal.</p>

<p>This is a genuine confound for cross-family comparison, and the paper says so.
If we reported “Dreamer degrades more than TD-MPC2, therefore generative world
models matter more,” we’d be measuring the ablations’ leverage, not the
architectures’ reliance.</p>

<hr />

<h2 id="part-5--do-we-need-to-fix-it">Part 5 — Do we need to fix it?</h2>

<p>Three options were on the table.</p>

<p><strong>Option 1 — actually delete the model from TD-MPC2.</strong> No dynamics network at
all. Rejected: that’s not an ablation of the model, it’s a swap to a different
algorithm, and the comparison it produces (model-based vs model-free) is the one
the SAC baseline already provides.</p>

<p><strong>Option 2 — match the ablations across families.</strong> Find a Dreamer intervention
with the same leverage as TD-MPC2’s. Rejected as intractable inside a week: the
architectures differ in exactly the way that makes “the same leverage” hard to
define. Dreamer has no equivalent of “the reward head still trains the dynamics,”
because in Dreamer the dynamics <em>is</em> the substrate everything else runs on.</p>

<p><strong>Option 3 — state precisely what is removed and make the claim about that.</strong>
This is what we did, and I want to be clear it isn’t a consolation prize. Naming
the ablation correctly turned a vague question into a sharp one, made the
results explicable rather than merely tabulated, and connected the work to an
existing theoretical framework instead of leaving it as a pile of ablation
numbers.</p>

<p>The one thing we owe the reader is the caveat stated plainly, in the paper, in
the place where the cross-family comparison appears — not buried in an appendix.
That’s now written.</p>

<hr />

<h2 id="part-6--what-it-all-adds-up-to">Part 6 — What it all adds up to</h2>

<p>Three channels, each with its own signature:</p>

<ul>
  <li><strong>Representation</strong> — graded and unimodal. Cheetah (0/144 inversions,
p = 3.7 × 10⁻⁷) &gt; walker (16/144, p = 2 × 10⁻⁴) &gt; finger (redundant) &gt; hopper
(nothing). The benefit shrinks smoothly to zero and never goes negative.</li>
  <li><strong>Planning</strong> — visible only under the planner. Acrobot separates under Π
(p = 2.1 × 10⁻⁵) but not under π, and the planner actively <em>harms</em> the
stripped agent on <strong>9 seeds out of 9</strong>.</li>
  <li><strong>Exploration</strong> — all-or-nothing, measured as a success rate. Ball-in-cup:
full solves 8/14, stripped solves <strong>0/14 and never records a single non-zero
evaluation in any run</strong>.</li>
</ul>

<p>And the methodological finding nobody was looking for: <strong>five of five effects in
this campaign drifted as seeds accumulated.</strong> Hopper’s reversed and was
retracted. Pendulum’s went to zero. Walker’s margin inverted. Finger’s
significance turned out to rest on one outlier. Even cheetah — the one result
whose <em>conclusion</em> never budged — saw its margin fall by two thirds.</p>

<p>That’s the base rate, in our own hands, on our own results. It is the reason
this paper reports per-seed values, inversion counts, margins <em>and</em> their
trajectories, rather than a table of means with stars next to them.</p>

<hr />

<p><em>Every number here is read from run CSVs on the training boxes, gated on
completion at 1.5M steps. The permutation tests are exact and enumerate the full
set of arrangements; no distributional assumptions are used anywhere.</em></p>]]></content><author><name></name></author><summary type="html"><![CDATA[A from-scratch explanation of the vocabulary this campaign has been using — cells, per-seed values, unimodal vs bimodal, inversions, permutation p-values, margins, design floors — followed by the hardest question anyone has asked about this work: if setting consistency_coef=0 leaves the latent dynamics still trained by the reward and value heads, did we ever actually remove the world model? And is that why DreamerV3 degrades under its ablation while TD-MPC2 barely notices?]]></summary></entry><entry><title type="html">TD-MPC-Glass, Part 21: The Audit — Retracting Our Own Headline, and What an Ablation Actually Ablates</title><link href="https://suuttt.github.io/tdmpc-glass/2026/07/22/tdmpc-glass-part21-audit-and-retraction.html" rel="alternate" type="text/html" title="TD-MPC-Glass, Part 21: The Audit — Retracting Our Own Headline, and What an Ablation Actually Ablates" /><published>2026-07-22T00:00:00+00:00</published><updated>2026-07-22T00:00:00+00:00</updated><id>https://suuttt.github.io/tdmpc-glass/2026/07/22/tdmpc-glass-part21-audit-and-retraction</id><content type="html" xml:base="https://suuttt.github.io/tdmpc-glass/2026/07/22/tdmpc-glass-part21-audit-and-retraction.html"><![CDATA[<blockquote>
  <p>A milestone review, written between Part 20 and the AAAI-2027 deadline (July 28).
Part 20 ended with a finished 7-page paper and a confident headline. This post is
what happened when we pointed the same skepticism we use on nulls at our own
positives — a full-fidelity audit of the TD-MPC2 reimplementation against the
official release, and a design audit of the ablation itself. The headline did not
survive. The core finding did, and is stronger for it.</p>
</blockquote>

<h2 id="the-one-paragraph-version">The one-paragraph version</h2>

<p>We asked two questions we had been deferring: <strong>is our TD-MPC2 actually TD-MPC2</strong>,
and <strong>does our ablation ablate what we say it ablates?</strong> The answers were <em>mostly,
with three disclosable deviations</em> and <em>no</em>. The “no” is the important one: setting
<code class="language-plaintext highlighter-rouge">consistency_coef=0</code> does not remove the world model — the latent dynamics is still
trained by the reward and value heads, and the planner still plans through it. Our
“stripped” agent is a <strong>purely value-equivalent model</strong>, not a model-free agent.
Separately, the hopper-hop result we led with — <em>stripping the model improves return
by +150</em> — turned out to be <strong>one reproducibly-collapsing seed</strong> in a median over
n=3. At n=5 it evaporates, and the official TD-MPC2 numbers confirm it. We have
retracted it from the paper, in the paper, with the arithmetic shown.</p>

<h2 id="part-1--is-our-td-mpc2-actually-td-mpc2">Part 1 — Is our TD-MPC2 actually TD-MPC2?</h2>

<p>Every within-implementation ablation rests on an unstated premise: that the “full”
arm is a faithful instance of the method it claims to be. If our full agent were
already a degraded TD-MPC2 along the very axis we ablate, then “removing the model
barely hurts” would be an artifact, not a finding. So we checked the axis first.</p>

<h3 id="the-loss-coefficients-look-catastrophically-wrong-and-arent">The loss coefficients look catastrophically wrong, and aren’t</h3>

<p>Official TD-MPC2 uses <code class="language-plaintext highlighter-rouge">consistency_coef=20, reward_coef=0.1, value_coef=0.1</code>.
Ours uses <code class="language-plaintext highlighter-rouge">2.0 / 2.0 / 1.0</code>. Read naively, our consistency term is weighted 100×
lower relative to reward — which would mean our full arm was half-stripped before
we touched it, and the whole paper collapses.</p>

<p>It isn’t, because the <em>reductions</em> differ:</p>

<ul>
  <li>official consistency is <code class="language-plaintext highlighter-rouge">F.mse_loss(z, next_z)</code> — a <strong>mean</strong> over the 512-dim latent</li>
  <li>ours is <code class="language-plaintext highlighter-rouge">mean_batch(sum over 512 dims)</code> — a <strong>sum</strong></li>
  <li>official value loss divides by <code class="language-plaintext highlighter-rouge">num_q</code>; ours sums over the ensemble</li>
</ul>

<p>Unit-matching all three and normalizing to the value term:</p>

<table>
  <thead>
    <tr>
      <th> </th>
      <th>consistency : reward : value</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>official</td>
      <td><strong>1.96</strong> : 5.0 : 1</td>
    </tr>
    <tr>
      <td>ours</td>
      <td><strong>2.00</strong> : 2.0 : 1</td>
    </tr>
  </tbody>
</table>

<p><strong>The quantity we set to zero is weighted within 2% of official.</strong> (Adam is
scale-invariant per-parameter, so only these ratios matter — the absolute loss
magnitude is irrelevant.) The full arm is not a straw man. This was the single most
important thing to establish and it is the reason the rest of the paper survives.</p>

<h3 id="three-deviations-that-do-matter-and-are-now-in-the-paper">Three deviations that do matter, and are now in the paper</h3>

<p><strong>Our planner is CEM, not MPPI.</strong> The elite update takes an unweighted mean and
standard deviation over the top-64 of 512 sampled trajectories. Official TD-MPC2
uses a softmax-weighted update at temperature 0.5 — that is the “MPPI” in the name.
Both our arms are planned identically, so the full-vs-strip contrast is unaffected,
but every <em>magnitude</em> in the planning channel is implementation-specific. Disclosed.</p>

<p><strong>The policy’s <code class="language-plaintext highlighter-rouge">log_std</code> head is never trained.</strong> Our pi loss is
<code class="language-plaintext highlighter-rouge">-E[min_i Q_i(z, tanh(mu(z)))]</code> — the mean action, no entropy term, no
reparameterized sample. Official is <code class="language-plaintext highlighter-rouge">-(entropy_coef * scaled_entropy + qs).mean()</code>,
which puts gradient on the std. Consequence: our policy’s exploration std sits at
initialization forever, exploration comes from an additive noise schedule
(σ=0.3 for the first 25k steps), and MPPI seeds 24 of its 512 trajectories by
sampling with that untrained std. This is closest to a bug, and it lands squarely
on the exploration channel. Disclosed, because fixing it means re-running
everything and the deadline is six days out.</p>

<p><strong>Smaller, cancelling in-contrast:</strong> 2 Q-heads not 5, value support ±20 not ±10, a
<code class="language-plaintext highlighter-rouge">max(·, 0)</code> clamp on the TD target, and half the update-to-data ratio (0.5 vs 1.0).
That last one is almost certainly the source of the parity gaps we already
reported — cheetah −5%, walker −17%, acrobot −23% — since it means half the
gradient work at equal step count.</p>

<h2 id="part-2--the-retraction">Part 2 — The retraction</h2>

<p>Part 20’s headline: on hopper-hop, stripping the world model <em>improves</em> return by
+150 (strip 436 vs full 286). It was the “actively harmful” end of the spectrum and
it was in the title-adjacent sentence of the abstract.</p>

<p>Here is the per-seed data, which we should have looked at first:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>full   n=3:  {286, 425, 6}        &lt;- median 286, mean 239
strip  n=3:  {437, 225, 436}      &lt;- median 436
</code></pre></div></div>

<p>The 6 is a collapsed run. A median over three numbers where one is a collapse is
not a robust statistic; it is a coin flip that happened to land on “world models
hurt”. We re-ran that seed from scratch: <strong>it collapsed again (0.0)</strong> — so it is a
reproducible seed-specific training instability, not noise. Two fresh seeds trained
normally (262 and 265 at 1.0M steps). Strip has never collapsed.</p>

<p>Then the external check. The official TD-MPC2 release publishes per-seed CSVs:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>official hopper-hop @1.5M:  {335, 364, 331}   mean 343, ZERO collapses
</code></pre></div></div>

<p>Our non-collapsing full runs match that. Our strip runs also match it. There is no
effect. What we actually measured was <strong>a 1-in-5 training-instability rate in the
full agent</strong> — a real observation, worth a sentence in a stability discussion, and
nowhere near an abstract.</p>

<p>The official baselines make the same point independently: hopper-hop is
collapse-prone <em>across methods</em> — TD-MPC v1 collapses on 2/3 seeds, SAC on 1/3.
This is exactly Voelcker et al.’s <a href="https://arxiv.org/abs/2404.09991">“Can we hop in general?”</a>
finding, that hopper rankings do not transfer across variants. We had the citation
in our bibliography and did not apply it to ourselves.</p>

<p><strong>The general hazard, stated so we do not repeat it:</strong> with n=3 and a median
statistic, one collapsed seed is enough to invert the sign of an ablation. We have
adopted a <strong>collapse screen</strong> as a stated inclusion criterion for any “removing the
model helps” claim — a run is excluded if its return or its latent effective rank
degenerates — and we apply it uniformly. It is what retracts hopper-hop, and it is
what excludes the JEPA arm below.</p>

<h2 id="part-3--what-stripping-the-world-model-actually-does">Part 3 — What “stripping the world model” actually does</h2>

<p>This one is a design error, not a data error, and it is more interesting than the
retraction.</p>

<p>In TD-MPC2 the latent dynamics <code class="language-plaintext highlighter-rouge">d(z,a)</code> receives gradient from three places:</p>

<ol>
  <li>the <strong>self-predictive</strong> (latent consistency) term, pulling <code class="language-plaintext highlighter-rouge">d(z_t,a_t)</code> toward a
target encoding of the next observation</li>
  <li>the <strong>reward head</strong>, evaluated on latents rolled out <em>through</em> <code class="language-plaintext highlighter-rouge">d</code></li>
  <li>the <strong>value head</strong>, likewise</li>
</ol>

<p>Setting <code class="language-plaintext highlighter-rouge">consistency_coef=0</code> removes (1) and leaves (2) and (3) fully intact. The
dynamics model is still trained. The planner still plans through it. <strong>Nothing in
our experiment is model-free.</strong></p>

<p>So the honest description of the strip arm is: a <strong>purely value-equivalent</strong> latent
model, in exactly Grimm et al.’s sense. And the honest question the paper answers is
not “does a world model help?” but:</p>

<blockquote>
  <p><strong>Does the self-predictive, observation-grounded signal earn its keep on top of
value equivalence?</strong></p>
</blockquote>

<p>That is a narrower claim and a better one. It is also <em>explanatory</em> in a way the old
framing wasn’t. Look at the results again with it in mind:</p>

<table>
  <thead>
    <tr>
      <th>task</th>
      <th>full π</th>
      <th>strip π</th>
      <th>reading</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>pendulum-swingup</td>
      <td>819</td>
      <td>189</td>
      <td>self-prediction essential</td>
    </tr>
    <tr>
      <td>cheetah-run</td>
      <td>746</td>
      <td>544</td>
      <td>helps</td>
    </tr>
    <tr>
      <td>walker-run</td>
      <td>700</td>
      <td>647</td>
      <td>helps a little</td>
    </tr>
    <tr>
      <td>finger-spin</td>
      <td>983</td>
      <td>958</td>
      <td>redundant</td>
    </tr>
    <tr>
      <td>hopper-hop</td>
      <td>286</td>
      <td>436</td>
      <td><strong>null</strong> (retracted)</td>
    </tr>
    <tr>
      <td>acrobot-swingup (Π)</td>
      <td>387</td>
      <td><strong>144</strong></td>
      <td>planner needs it</td>
    </tr>
  </tbody>
</table>

<p>Strip stays competitive wherever the reward and value gradients alone are enough to
shape a usable latent — which is most dense-reward locomotion. It falls apart where
they aren’t: pendulum, and acrobot’s <em>planner</em>, where planning three steps through a
latent that was never grounded in observations produces garbage. The old framing had
to call these unrelated; the new framing predicts them.</p>

<p>And with hopper’s −150 gone, the spectrum is <strong>monotone non-negative</strong>: the value of
self-prediction decays smoothly to zero as value becomes compressible, and never
crosses below it. Less punchy. Much more defensible.</p>

<h2 id="part-4--two-more-things-the-design-audit-found">Part 4 — Two more things the design audit found</h2>

<p><strong>The four cells attribute, they do not identify.</strong> Both arms collect their own data
with their own planner. So <code class="language-plaintext highlighter-rouge">J_full(π) − J_strip(π)</code> mixes a representation effect
with the different state distribution each arm visited. The channel labels come from
the <em>probes</em>, not from the arithmetic. The paper said the cells “isolate all three
channels at once”; it now says attribution, with the buffer-swap control (train strip
on full’s replay) named as the experiment that would actually identify.</p>

<p><strong>The exploration channel is our weakest leg.</strong> Ball-in-cup is 1/3 vs 0/3 successes —
Fisher exact p = 1.0. Cartpole-sparse is zero in all four cells, which is a
non-result, not evidence. This matters because the retraction promotes ball-in-cup
toward the headline. It is now running to <strong>n=8</strong>.</p>

<p><strong>JEPA is out.</strong> The joint-embedding arm produced a striking number — stripped 1.00
success vs full 0.53 on PointMaze, a third-family “stripping helps”. All four runs
report <code class="language-plaintext highlighter-rouge">latent_collapsed: true</code>, effective rank ~1e-5. The diagnostic went further:
the VICReg anti-collapse term <em>is</em> applied and <em>is</em> saturated at its maximum-collapse
value from the first evaluation onward, because simnorm (V=4) goes one-hot
immediately and kills the gradient path back to the encoder. So the number measures a
saturated softmax, not a world model. Under our own collapse screen it is excluded.
Trading one artifact for another six days before a deadline is exactly the failure
mode this post is about.</p>

<h2 id="where-the-gpus-are-pointed-now">Where the GPUs are pointed now</h2>

<table>
  <thead>
    <tr>
      <th>box</th>
      <th>job</th>
      <th>why</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>3060 · box1</td>
      <td>acrobot n=3</td>
      <td>done: full 419/414, strip 127/208 — the planning channel’s anchor</td>
    </tr>
    <tr>
      <td>5060</td>
      <td>hopper n=5</td>
      <td>the retraction’s evidence; s3/s4 finishing</td>
    </tr>
    <tr>
      <td>3060 · mwm</td>
      <td><strong>DreamerV3 hopper</strong>, 4 cells</td>
      <td>cross-family check <em>on the retraction</em></td>
    </tr>
    <tr>
      <td>4070</td>
      <td><strong>ball-in-cup s2–7</strong></td>
      <td>the exploration channel, from n=3 to n=8</td>
    </tr>
  </tbody>
</table>

<p>The Dreamer hopper cell is the one to watch. We are claiming hopper is a null in
TD-MPC2; an unmodified official DreamerV3 van-vs-strip cell on the same task either
corroborates that or contradicts it. Either outcome is publishable and we have
committed to the answer in advance.</p>

<h2 id="the-plan-for-the-last-six-days">The plan for the last six days</h2>

<ol>
  <li><strong>Land ball-in-cup n=8.</strong> If the exploration cliff holds at 8 seeds it becomes a
real headline; if it doesn’t, we say so and the paper leads on representation
alone.</li>
  <li><strong>Land Dreamer hopper.</strong> Cross-family test of the retraction.</li>
  <li><strong>Buffer-swap control</strong> if there is time — it is the difference between
attribution and identification, and reviewers will ask.</li>
  <li><strong>Do not fix the planner or the policy std.</strong> Both are real deviations; both are
now disclosed quantitatively; fixing either means re-running the whole grid.
Disclosure beats a rushed re-run that lands the night before.</li>
</ol>

<h2 id="what-this-week-was-actually-about">What this week was actually about</h2>

<p>Part 20 said “every number is read from disk and the nulls are reported as loudly as
the positives.” That was true and it was not enough, because we were applying the
skepticism asymmetrically — hard on results we didn’t like, soft on the one that made
the best headline. The +150 sat in the abstract for a week. It took someone asking
<em>“is that claim correct? check the official data”</em> to look at the three per-seed
numbers behind a median.</p>

<p>The audit cost about a day and cost us our headline. It also caught the JEPA artifact
before it went in, produced a stated inclusion criterion, and turned a vague claim
about world models into a sharp one about self-prediction versus value equivalence.
That is a good trade six days out. It would have been a catastrophic one to skip.</p>

<hr />

<p><em>Numbers in this post are read from the run CSVs on the boxes and from the official
TD-MPC2 release’s published per-seed results. The retraction, the fidelity
deviations, and the JEPA exclusion are all written into the paper itself rather than
silently dropped.</em></p>]]></content><author><name></name></author><summary type="html"><![CDATA[A milestone review six days before the AAAI-27 deadline. We audited our TD-MPC2 reimplementation line-by-line against the official release and audited the experimental design against its own claims. Two things broke: the hopper-hop 'world models can hurt' headline was one collapsed seed, and our 'stripped' arm was never model-free at all. One thing held up under the strongest test we could aim at it. This post is the audit, the retraction, and the plan for the last six days.]]></summary></entry><entry><title type="html">TD-MPC-Glass, Part 20: A Week in Review — From Instruments to a Paper, and the Question Finally Answered</title><link href="https://suuttt.github.io/tdmpc-glass/2026/07/21/tdmpc-glass-part20-weekly-review.html" rel="alternate" type="text/html" title="TD-MPC-Glass, Part 20: A Week in Review — From Instruments to a Paper, and the Question Finally Answered" /><published>2026-07-21T00:00:00+00:00</published><updated>2026-07-21T00:00:00+00:00</updated><id>https://suuttt.github.io/tdmpc-glass/2026/07/21/tdmpc-glass-part20-weekly-review</id><content type="html" xml:base="https://suuttt.github.io/tdmpc-glass/2026/07/21/tdmpc-glass-part20-weekly-review.html"><![CDATA[<blockquote>
  <p>A review of one week — July 15 through July 22 — picking up where
<a href="https://suuttt.github.io/tdmpc-glass/2026/07/15/tdmpc-glass-part19-weekly-review/">Part 19</a> left off.
Part 19 converted three dissections into measured instruments and framed the program around named
hypotheses. It ended on a sharp one, <strong>H-WM-ABSTRACT</strong>: <em>is the world model itself just a learned
abstraction, and if so which knob is doing the work?</em> This week did two things — it turned the
value-sufficiency instrument into a <strong>finished, submission-ready paper</strong>, and it <strong>answered
H-WM-ABSTRACT</strong> with a controlled decomposition. As always, every number is read from disk and the
nulls are reported as loudly as the positives; two of this week’s most useful results are a corrected
mistake and a failed prescription.</p>
</blockquote>

<h2 id="the-one-paragraph-version">The one-paragraph version</h2>

<p>The value-sufficiency bottleneck (<strong>VBN</strong>) — the checkpoint-time probe that measures how much of an
agent’s latent the value head actually needs — became a paper. Across <strong>nine</strong> DeepMind Control tasks
and <strong>two</strong> world-model families (Dreamer, TD-MPC2), a single scalar from VBN predicts whether removing
the learned forward model helps or hurts: <strong>Spearman ρ = −0.90 (n = 5 value-limited tasks)</strong>. The
diagnostic has a clean, characterized boundary — two <em>exploration-limited</em> tasks it cannot see — and one
of those boundary points was a single-seed artifact we caught only by replicating. And the sharp
question from Part 19 now has an answer: on HopperHop, the task where TD-MPC2 beats both PPO and SAC,
<strong>the win is carried by the value pathway, not by the world model or the planner.</strong></p>

<h2 id="motivation-in-one-figure">Motivation, in one figure</h2>

<p><img src="/tdmpc-glass/images/part20-motivation.png" alt="Same agent, opposite verdicts" /></p>

<p>Same agent (Dreamer), same intervention (disable the learned forward model). On <strong>ball-in-cup</strong> the
return collapses to zero — the world model is essential. On <strong>walker-run</strong> the stripped agent is no
worse, even slightly better — the world model is redundant. “Does a learned world model help?” has no
architecture-level answer; it is a <strong>property of the task</strong>. The whole paper is about a probe that tells
you which, <em>before</em> the world model is trained.</p>

<h2 id="the-nine-tasks-and-why-they-land-where-they-do">The nine tasks, and why they land where they do</h2>

<p>Because the whole argument rests on <em>which</em> tasks need a world model and <em>why</em>, here is the cast in full —
each is a standard DeepMind Control Suite task, and what matters is the pairing of its <strong>reward structure</strong>
with its <strong>dynamics</strong>. (All returns are on the 0–1000 DMC scale.)</p>

<table>
  <thead>
    <tr>
      <th>task</th>
      <th>reward</th>
      <th>dynamics</th>
      <th>why the WM does / doesn’t matter</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>ball-in-cup</strong></td>
      <td><strong>sparse</strong>: 1 while the ball is inside the cup, else 0</td>
      <td>a ball on a string under an actuated cup; must be <em>swung</em> in</td>
      <td><strong>essential</strong> — the reward is a needle in a haystack; without imagined rollouts to practice the catch, the agent almost never generates a positive example to learn from</td>
    </tr>
    <tr>
      <td><strong>reacher-hard</strong></td>
      <td>near-sparse: 1 inside a <em>small</em> target disc, else ~0</td>
      <td>2-link arm</td>
      <td><strong>essential</strong> — the small target makes reward sparse; the model helps the agent find it</td>
    </tr>
    <tr>
      <td><strong>acrobot-swingup</strong></td>
      <td>shaped by the tip’s height toward the top</td>
      <td><strong>underactuated</strong> double pendulum (torque only at the middle joint), chaotic</td>
      <td><strong>essential</strong> — reaching <em>and stabilising</em> the top needs multi-step lookahead through unstable dynamics; a reactive policy has nothing to react to until it’s already up</td>
    </tr>
    <tr>
      <td><strong>pendulum-swingup</strong></td>
      <td>high only near upright; ~0 elsewhere</td>
      <td><strong>underactuated</strong> single pendulum; torque too weak to lift directly</td>
      <td><strong>essential-but-exploratory</strong> — must <em>pump energy</em> over several swings; the hard part is discovering the pump, not representing the value</td>
    </tr>
    <tr>
      <td><strong>cheetah-run</strong></td>
      <td><strong>dense</strong>: ramps with forward speed toward ~10 m/s</td>
      <td>planar running, smooth</td>
      <td>helps a little — dense feedback every step; a reactive policy already climbs, the model just sharpens it</td>
    </tr>
    <tr>
      <td><strong>cartpole-swingup</strong></td>
      <td>dense: product of upright + centred</td>
      <td>single cart-pole, benign</td>
      <td>marginal — dense and low-dimensional; value learning alone nearly suffices</td>
    </tr>
    <tr>
      <td><strong>finger-spin</strong></td>
      <td>dense: high while the spinner exceeds a target angular velocity</td>
      <td>2-DoF finger flicking a free spinner</td>
      <td><strong>redundant</strong> — continuous contact feedback; nothing to plan</td>
    </tr>
    <tr>
      <td><strong>walker-run</strong></td>
      <td>dense: upright-torso × ramp-with-speed (~8 m/s)</td>
      <td>planar biped, smooth</td>
      <td><strong>redundant</strong> — dense reward + stable gait cycle; a reactive value/policy is enough</td>
    </tr>
    <tr>
      <td><strong>quadruped-walk</strong></td>
      <td>dense: upright × ramp-with-speed</td>
      <td>3-D quadruped</td>
      <td><strong>redundant</strong> — same story in 3-D</td>
    </tr>
  </tbody>
</table>

<p>Read top-to-bottom this <em>is</em> the gradient of Result 1. The pattern is not about dimensionality or embodiment —
quadruped is the highest-DoF task here and needs the model <em>least</em>. It is about <strong>how far reward has to
travel</strong>. When reward is dense and the dynamics are stable, the value function can be learned directly from
experience and a learned forward model adds nothing; when reward is sparse, delayed, or gated behind
unstable/underactuated dynamics, the model earns its keep — either by supplying a value representation that a
reactive learner can’t (the <em>representational</em> channel, which VBN measures) or by generating the rewarding
experience in the first place (the <em>exploratory</em> channel, which VBN cannot). Those two channels are the whole
story of the next three results.</p>

<h2 id="result-1--the-nine-task-gradient-and-the-cross-model-law-h-compress-confirmed-within-scope">Result 1 — the nine-task gradient and the cross-model law (H-COMPRESS, confirmed within scope)</h2>

<p>We ablate the world model per task (strip its forward-dynamics learning) and measure the change in
return. On a fixed architecture, WM-dependence spans the <strong>full</strong> range:</p>

<table>
  <thead>
    <tr>
      <th>regime</th>
      <th>tasks (WM-dependence = fraction of return lost when stripped)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>essential</strong></td>
      <td>ball-in-cup (collapse), reacher-hard (−98%, n=2), acrobot (−85%, n=3)</td>
    </tr>
    <tr>
      <td>helps / marginal</td>
      <td>cheetah (−10%), cartpole (−3%)</td>
    </tr>
    <tr>
      <td><strong>redundant</strong></td>
      <td>finger (+5%), walker (+7%), quadruped (+1%)</td>
    </tr>
  </tbody>
</table>

<p>The essential end is sparse-reward / long-horizon / precision control; the redundant end is dense
continuous control. And the VBN fingerprint predicts the ordering <em>a priori</em>: return recovered through a
16-dimensional value bottleneck correlates with WM-dependence at <strong>ρ = −0.90 (n = 5)</strong> — measured with
compressibility in TD-MPC2 and dependence in Dreamer, so this is a genuinely <strong>cross-model</strong> prediction.</p>

<p><img src="/tdmpc-glass/images/part20-correlation.png" alt="VBN compressibility predicts WM-dependence" /></p>

<p>This is Part 19’s <strong>H-COMPRESS</strong> graduating from prediction to result: low value-compressibility ⇒ the
world model is load-bearing; high compressibility ⇒ redundant.</p>

<h2 id="result-2--the-honest-boundary-where-the-probe-stops-working">Result 2 — the honest boundary (where the probe stops working)</h2>

<p>VBN is a <em>value</em> probe, so it is silent on tasks whose difficulty is <strong>exploratory</strong> rather than
representational. Two tasks sit exactly there:</p>

<ul>
  <li><strong>ball-in-cup</strong>: its value is <em>maximally</em> compressible in TD-MPC2 (a 16-dim bottleneck recovers ~100%
of return) yet stripping the world model collapses it in Dreamer. The collapse is not a
value-representation deficit — it is an exploration failure (without imagined rollouts the agent never
discovers the catch).</li>
  <li><strong>pendulum</strong>: covered below.</li>
</ul>

<p>Both are excluded from the value-limited correlation and reported as the diagnostic’s characterized
scope, not as hidden failures. This turns a limitation into a second contribution: a clean
<strong>value-limited vs. exploration-limited</strong> split, grounded in a decomposition of world-model benefit into
a representational channel (what VBN sees) and an exploratory channel (what it cannot).</p>

<h3 id="ball-in-cup-is-not-an-outlier--it-is-the-exploration-axis-caught-in-the-act">Ball-in-cup is not an outlier — it is the exploration axis, caught in the act</h3>

<p>A reviewer’s first objection to the correlation figure is the lone red point at top-right: <strong>ball-in-cup</strong>,
where value is <em>maximally</em> compressible (a 16-dim bottleneck recovers ~100% of return) yet the world model is
essential. If it were a mystery we would be nervous. It is not — we can watch the mechanism directly. Here are
the raw Dreamer learning curves, vanilla vs. world-model-stripped, on the two sparse-reward tasks:</p>

<p><img src="/tdmpc-glass/images/part20-bimodal.png" alt="Bimodal collapse on sparse-reward tasks" /></p>

<p>Look at the left panel. Vanilla Dreamer (blue) catches the ball essentially every episode (~980). The stripped
agent (red ×) is <strong>bimodal</strong>: it <em>does</em> occasionally catch — you can see the ~980 hits — but it can never
<em>consolidate</em>, and most episodes score exactly 0. Without imagined rollouts, the single sparse catch signal is
too rare to stabilise the policy; the agent keeps forgetting. This is precisely an <strong>exploration/consolidation
failure, not a value-representation failure</strong> — and VBN, honestly, reports exactly that: the value <em>is</em> easy
(maximally compressible), so the probe correctly says “no representational deficit here.” The deficit is in
generating the data, which a value probe on already-collected data cannot see.</p>

<p>Three independent lines of evidence pin this down, which is why we now treat it as a <strong>finding rather than an
outlier</strong>: (i) the bimodal curve above (the WM’s job here is exploration, visibly); (ii) a tuned <strong>SAC</strong> — a
model-free learner with no world model — <em>solves</em> ball-in-cup (984 vs 979 for TD-MPC2, below), so the task is
not intrinsically model-requiring, it is <em>imagination</em>-requiring for on-policy Dreamer; and (iii) the
correlation itself: including cup drops Spearman ρ from <strong>−0.90 to −0.09</strong>. A single point that collapses the
fit is not noise to be hidden — it is a point living on a <em>different axis</em>. Ball-in-cup is the cleanest
demonstration in the paper that world-model benefit has two separable channels, and that our probe measures one
of them by design.</p>

<h2 id="result-3--the-mistake-we-caught-by-replicating-pendulum">Result 3 — the mistake we caught by replicating (pendulum)</h2>

<p>Pendulum-swingup was, for two days, the paper’s most dramatic collapse point: a single seed showed
stripped return of exactly <strong>0.0</strong> vs ~806 vanilla. Multi-seed replication (the kind of run it is easy
to skip once you “have the result”) told a different story. Across three seeds the stripped agent scored
<strong>0 / 727 / 0</strong>: two seeds never discover the swing-up, one matches vanilla with <em>no</em> representational
deficit. Pendulum is <strong>bimodal</strong>, exploration-limited — the seed-1 “collapse” was a lucky/unlucky draw,
not a value signal. We removed it from the clean correlation (ρ moved −0.94→−0.90, but now on a <em>clean</em>
value-limited set) and report the full seed range. The honest version is more defensible than the
dramatic one, and the episode is a small advertisement for running the replication seed.</p>

<p><strong>Why bimodal, mechanistically?</strong> Pendulum swing-up is <em>underactuated</em>: the motor is deliberately too weak to
lift the pole straight up against gravity. The only route to the top is to <strong>pump energy</strong> — swing back and
forth, building amplitude over several oscillations, until one last swing carries the pole over and the
controller catches it at the unstable upright equilibrium. That makes learning a discovery problem with two
attractors, and essentially two outcomes per run:</p>

<ul>
  <li><strong>Discover the pump</strong> (via exploration noise, early) → the near-upright reward reinforces the sequence and it
locks in → return ~800–1000.</li>
  <li><strong>Miss it</strong> → the agent settles into a low-energy local optimum (small oscillations at the bottom, or idle
spinning) that pays ~0 and provides <em>no gradient</em> pointing toward the pump → stuck at 0, permanently.</li>
</ul>

<p>With the world model, imagined rollouts let the agent rehearse the pump internally, so vanilla Dreamer finds it
across seeds (high, if noisy — blue, right panel of the figure above). Strip the model and discovery becomes a
per-seed coin flip: hence <strong>0 / 727 / 0</strong>. The seed-1 “collapse” was simply the losing side of that flip; the
727 seed proves there is <em>no representational deficit</em> — a stripped agent that happens to discover the pump
matches vanilla. The right panel shows one of the <em>recovering</em> seeds: it does climb, but noisily, with frequent
dips back to 0 — the fingerprint of a policy sitting right on the boundary between the two basins. So pendulum
is the same <strong>exploration axis</strong> as ball-in-cup, expressed as bimodality <em>across seeds</em> rather than <em>across
episodes</em>. Both are exactly what a value probe is blind to, and exactly why we quarantine them from the
value-limited correlation instead of letting them quietly degrade it.</p>

<h2 id="result-4--an-independent-cross-check-we-didnt-have-to-run">Result 4 — an independent cross-check we didn’t have to run</h2>

<p>The exploration-limited boundary is corroborated by data we did not generate. The official TD-MPC2
release also reports a tuned <strong>SAC</strong> — a model-free learner with <em>no</em> world model. On the tasks we call
exploration-influenced, SAC solves them just as well:</p>

<table>
  <thead>
    <tr>
      <th>task</th>
      <th>TD-MPC2</th>
      <th>SAC</th>
      <th>gap</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>ball-in-cup</td>
      <td>984</td>
      <td>979</td>
      <td><strong>+5</strong></td>
    </tr>
    <tr>
      <td>reacher-hard</td>
      <td>982</td>
      <td>944</td>
      <td><strong>+38</strong></td>
    </tr>
    <tr>
      <td>acrobot</td>
      <td>663</td>
      <td>72</td>
      <td>+591</td>
    </tr>
    <tr>
      <td>hopper-hop</td>
      <td>449</td>
      <td>117</td>
      <td>+332</td>
    </tr>
    <tr>
      <td>pendulum</td>
      <td>838</td>
      <td>575</td>
      <td>+263</td>
    </tr>
  </tbody>
</table>

<p>Ball-in-cup and reacher-hard collapse in Dreamer-without-a-WM but are solved by SAC — confirming their
failure is exploratory, not value-limited, with a third independent method. The large gaps elsewhere set
up the week’s headline result.</p>

<h2 id="result-5--h-wm-abstract-answered-its-the-value-pathway">Result 5 — H-WM-ABSTRACT, answered: it’s the value pathway</h2>

<p>Part 19 asked which knob does the work when a world model helps. HopperHop is the sharpest test: TD-MPC2
reaches ~450–500 there while PPO is walled at ~40 (even at 94× the budget) and SAC is unreliable
(bimodal, ~47 on the matched seeds, ~188 on average). Yet we already knew two odd facts about Hop — the
consistency loss is <strong>removable</strong> there, and MPPI planning adds essentially nothing. So what beats
model-free RL?</p>

<p>We ran a matched-seed <strong>rung-ladder</strong>, reading the π-only and MPPI eval columns of the same runs:</p>

<p><img src="/tdmpc-glass/images/part20-ladder.png" alt="The value-pathway ladder on HopperHop" /></p>

<table>
  <thead>
    <tr>
      <th>rung</th>
      <th>what it isolates</th>
      <th>HopperHop return</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>SAC</td>
      <td>model-free, no latent model, no planner</td>
      <td>47 (matched) · 188 (avg)</td>
    </tr>
    <tr>
      <td><strong>value pathway</strong> = strip-consistency + π-only</td>
      <td>value-equivalent latent + off-policy value, <strong>no WM, no planner</strong></td>
      <td><strong>502</strong></td>
    </tr>
    <tr>
      <td>+ planning</td>
      <td>adds MPPI</td>
      <td>487</td>
    </tr>
    <tr>
      <td>full TD-MPC2</td>
      <td>+ consistency + planning</td>
      <td>509</td>
    </tr>
  </tbody>
</table>

<p><strong>The value pathway alone (502) ≈ full TD-MPC2 (509) and captures essentially the entire gap over SAC.</strong>
Adding back the world-model consistency loss and the planner changes the result by under 2% (planning
even hurt one seed). So on the one task where the model-based agent decisively wins, what does the work
is the <strong>value-equivalent representation + off-policy value learning</strong> — not the forward model, not the
planner. This is the seed for a second paper: a lighter, task-adaptive learner that keeps the value
pathway and pays for the world model only where a probe like VBN says it earns its keep.</p>

<h3 id="but-thats-just-hopper--the-objection-taken-seriously">“But that’s just Hopper” — the objection, taken seriously</h3>

<p>Anyone who has read Voelcker, Hussing &amp; Eaton’s <em><a href="https://arxiv.org/abs/2410.08870">Can we hop in general?</a></em>
(2024) should be suspicious of a headline resting on the Hopper environment. Their case study shows that
Hopper-family benchmarks are <strong>unusually sensitive to benchmark and design choices</strong> — the same algorithm can
be judged strong or weak depending on which Hopper variant, action repeat, and protocol you pick, and those
choices are almost never justified in the literature. We take that seriously. It is exactly why our claim is
<em>not</em> a leaderboard statement of the fragile “method X beats Y on Hopper” kind. It is a <strong>within-task
decomposition</strong> — which <em>internal component</em> of one fixed agent carries the win — cross-checked against two
independent model-free learners (SAC, bimodal ~47/188; PPO, walled at ~40 even at 94× the budget). A
decomposition is far more robust to benchmark-design wobble than a horse-race, because every arm runs on the
identical task, protocol, and seeds.</p>

<p>But the decisive answer to “is it just Hopper?” is not an argument — it is to run the <em>identical ladder on a
task at the opposite end of the VBN gradient</em>, and to predict the outcome in advance.</p>

<h2 id="result-6--the-essential-task-mirror-acrobot-predicted-in-advance">Result 6 — the essential-task mirror (acrobot), predicted in advance</h2>

<p>HopperHop is a task VBN calls <strong>WM-redundant</strong> (compressible value, removable consistency loss). Its opposite
is <strong>acrobot-swingup</strong>: VBN says its value is <em>not</em> compressible, and its Dreamer WM-dependence is −85%. If the
value-pathway story were a Hopper artifact, the ladder there would look the same. The diagnostic predicts it
will look <strong>opposite</strong> — and it does:</p>

<p><img src="/tdmpc-glass/images/part20-acrobot-ladder.png" alt="Acrobot vs HopperHop: the same ladder, mirrored" /></p>

<table>
  <thead>
    <tr>
      <th>rung</th>
      <th>HopperHop (VBN: redundant)</th>
      <th>AcrobotSwingup (VBN: essential)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>SAC</td>
      <td>47 · 188</td>
      <td>72</td>
    </tr>
    <tr>
      <td>value pathway (strip + π)</td>
      <td><strong>502</strong> ≈ full</td>
      <td><strong>335</strong> (only ~86% of full)</td>
    </tr>
    <tr>
      <td>strip + planning (mppi)</td>
      <td>487</td>
      <td><strong>48</strong> — <em>collapse</em></td>
    </tr>
    <tr>
      <td>full TD-MPC2 (π / mppi)</td>
      <td>509</td>
      <td>388 / 395</td>
    </tr>
  </tbody>
</table>

<p>Two things flip. First, the value pathway alone recovers only <strong>~86%</strong> of full on acrobot (vs a dead heat on
Hopper) — the world model’s <em>representation</em> is doing measurable work. Second, and more striking:
<strong>planning through the stripped latent collapses to ~48</strong> (n=4 seeds: 7, 42, 61, 55), a fifth of full
TD-MPC2’s ~395. On a chaotic, underactuated double pendulum, once you remove the consistency loss the learned
latent dynamics are no longer accurate enough to plan through — so MPPI, rolling out a broken model, produces
garbage. <em>The consistency loss — the “world model” term — is exactly what makes the dynamics good enough for
the planner.</em> On Hopper you could throw the model away; on acrobot the planner is helpless without it.</p>

<p>This is the result that turns the value-pathway observation from an anecdote into a <strong>law with a sign</strong>: VBN
tells you, before training, which regime a task is in. Where value is compressible, keep the value pathway and
drop the world model and planner; where it isn’t, the world model is load-bearing — and specifically, <em>the
planner depends on it</em>.</p>

<p>One methodological check worth stating. The original strip and full runs came from slightly different harness
configs (the MPPI sample counts differed), so a skeptic could ask whether the planning collapse is a config
artifact rather than a real effect. We ran a <strong>config-matched</strong> ladder — both arms through the identical
harness — to settle it, and it does: under matched config the stripped agent’s planning still sits far below
its own policy and far below full TD-MPC2 (strip+mppi 114/147 vs full+mppi 383/332 at a matched checkpoint),
and the gap <em>deepens</em> with training toward the converged ~49. The collapse is a property of the ablation, not
of the sampler. Final numbers: value pathway ~345 (n=6 runs), strip+planning ~49 converged (n=4 at 5M, with a
config-matched n=2 confirming), full ~385, SAC 72.</p>

<h2 id="does-the-diagnostic-generalize-jepa-and-dino">Does the diagnostic generalize? JEPA and DINO</h2>

<p>A natural question — and one worth heading off — is whether any of this is specific to the two world-model
families we tested. It is not, and the reason is architectural. Our two families already span the main axis of
world-model design:</p>

<ul>
  <li><strong>DreamerV3</strong> is a <em>generative</em> world model: it reconstructs observations, and its imagined rollouts are
the exploratory engine we watched fail on ball-in-cup.</li>
  <li><strong>TD-MPC2</strong> is a <em>value-equivalent</em> model — and its <strong>consistency loss is, precisely, a JEPA objective</strong>:
predict the <em>next latent embedding</em>, with no decoder and no pixel reconstruction. That is exactly LeCun’s
Joint-Embedding Predictive Architecture recipe. So our “strip-consistency” ablation <em>is</em> the ablation of a
JEPA-style latent-prediction term — and Result 6 shows that on an essential task, that JEPA term is what
keeps the planner alive.</li>
</ul>

<p>So the diagnostic already covers the JEPA family through TD-MPC2. What about <strong>DINO / DINO-WM</strong>? DINO is a
vision self-supervised <em>encoder</em> (no dynamics, no reward); DINO-WM (Zhou et al., 2024) builds a latent
dynamics model on <strong>frozen DINOv2 features</strong> — a JEPA-style world model in pixel space. Our state-based DMC
setup does not use pixels, so a from-scratch DINO-WM run is out of scope for <em>this</em> paper, but the diagnostic
transfers unchanged: run VBN on the value head of a DINO-WM agent, strip its latent-dynamics loss, and the
prediction is identical — <em>compressible value ⇒ the frozen-feature dynamics is redundant; incompressible ⇒
it’s load-bearing.</em></p>

<p>And we ran the concrete third-architecture check. Our own <strong>H-JEPA</strong> agent (a faithful LeCun-style hierarchy
with a value head and an explicit JEPA latent-prediction loss) has a <code class="language-plaintext highlighter-rouge">jepa_w</code> knob that is the exact analog of
TD-MPC2’s consistency strip: set it to zero and the JEPA world-model objective is removed. On PointMaze
navigation, stripping it changes nothing — fixed-seed success <strong>0.531 with the predictor, 0.531 without it</strong>
(n=3), while the JEPA prediction loss jumps from ~0.001 to ~3.8, confirming the ablation genuinely took hold.
So this is a <em>true</em> null, not a no-op flag: on this task the JEPA world model is <strong>redundant</strong>, and the agent
solves it through the value/policy pathway alone (the latent collapses in both arms regardless). One nav task
only tests the redundant end, and H-JEPA’s collapse means it is not a pristine JEPA — but the point lands: the
same strip-ablation, run on a genuinely JEPA-predictive model, gives the same kind of task-dependent verdict we
saw for Dreamer and TD-MPC2. The claim we are willing to commit to now: <strong>the diagnostic is a property of the
value geometry, not of the world-model implementation</strong> — it holds across generative (Dreamer),
value-equivalent (TD-MPC2), and JEPA-predictive (H-JEPA) world models alike.</p>

<h2 id="the-nulls-reported-loudly">The nulls, reported loudly</h2>

<ul>
  <li><strong>The gate does not help.</strong> The prescriptive fix the diagnostic seems to suggest — a plan-time gate
that down-weights the world model’s imagined rollout — is a confirmed negative at n=5:
g0.0 = 701.9, g0.5 = 688.4, g1.0 = 686.5, g0.25 = 682.9 (a 19-point band, ≪ the 80–100-point seed
spread). It is structural: with horizon 3 and γ=0.99 the gated term is ~3% of the plan score, and
g=0 is not WM-free anyway. The contribution is a <em>diagnostic</em>, not a repaired algorithm.</li>
  <li><strong>Parity, honestly.</strong> Our TD-MPC2 reimplementation is a non-anomalous baseline, not bit-parity:
hopper ≈0%, cheetah −5%, walker −6.8% (once data-collection mode is matched), acrobot −23% (open).
All TD-MPC2 claims in the paper are within-implementation comparisons; the cross-model headline rests
on unmodified DreamerV3.</li>
</ul>

<h2 id="shipped">Shipped</h2>

<ul>
  <li><strong>AAAI-27 submission paper.</strong> <em>“When Does a Learned World Model Help? A Value-Sufficiency Diagnostic
that Predicts World-Model Dependence Across Architectures.”</em> Seven pages in the official
<code class="language-plaintext highlighter-rouge">aaai2027.sty</code> submission format, double-blind clean, with a motivation figure, a method-pipeline
figure, three data plots, two tables, and the mandatory reproducibility checklist. Compiles clean.</li>
  <li>All results logged to the public issues and the campaign ledger; every figure number traces to disk.</li>
</ul>

<h2 id="next">Next</h2>

<ul>
  <li><strong>Paper 2 (the value pathway).</strong> The ladder now has its second, opposite-regime point (acrobot, Result 6) —
next is a <em>config-matched n=3</em> confirmation (running) and a third task, then turning the decomposition into a
task-adaptive recipe: keep the value pathway, add the world model only where a VBN-style probe predicts it is
load-bearing. The JEPA generalization (H-JEPA VBN + strip on DMC) is queued behind it.</li>
  <li><strong>Broaden the diagnostic.</strong> The correlation is n=5 value-limited tasks; extend it, and test the
value-limited/exploration-limited taxonomy on manipulation (Meta-World) and navigation (sparse-goal),
which is the natural home for the exploration axis we can currently only bound with two points.</li>
  <li><strong>Training-free criterion.</strong> The reward-propagation-horizon / controllability / value rate–distortion
proxies remain the conjectural prize: predicting WM-dependence from the task spec alone, with no probe
at all.</li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[The week of July 15–22. Part 19 left four named hypotheses and one sharp question — is the world model just a learned abstraction, and if so which knob does the work? This week turned the value-sufficiency instrument into a finished AAAI-27 diagnostic paper (9 tasks, cross-model correlation ρ=−0.90), found the diagnostic's honest boundary, caught and corrected a one-seed artifact with multi-seed replication, and — with a matched-seed rung-ladder plus the official TD-MPC2 vs SAC numbers — answered the sharp question: what beats model-free RL is the value pathway, not the world model or the planner.]]></summary></entry><entry><title type="html">TD-MPC-Glass, Part 19: A Week in Review — Turning Three Dissections Into Instruments</title><link href="https://suuttt.github.io/tdmpc-glass/2026/07/15/tdmpc-glass-part19-weekly-review.html" rel="alternate" type="text/html" title="TD-MPC-Glass, Part 19: A Week in Review — Turning Three Dissections Into Instruments" /><published>2026-07-15T00:00:00+00:00</published><updated>2026-07-15T00:00:00+00:00</updated><id>https://suuttt.github.io/tdmpc-glass/2026/07/15/tdmpc-glass-part19-weekly-review</id><content type="html" xml:base="https://suuttt.github.io/tdmpc-glass/2026/07/15/tdmpc-glass-part19-weekly-review.html"><![CDATA[<blockquote>
  <p>A review of one week — July 8 through July 15 — picking up where
<a href="https://suuttt.github.io/projects/2026-07-08-tdmpc-glass-weekly-review-part10/">Part 10</a> left off.
Part 10 closed with a recurring result — <em>abstraction and reweighting buy nothing the value pathway
doesn’t already use</em> — but stated it as an anecdote across a few “dissections.” This week was about
converting each dissection into a <strong>measured instrument</strong> and stating the program as a small set of
<strong>named, falsifiable hypotheses</strong> so the rest of this notebook (and the papers) can refer to them
instead of to “paper 1 / paper 3.” Every figure is read from disk; nulls are reported as loudly as
positives.</p>
</blockquote>

<h2 id="the-four-hypotheses-this-program-is-testing">The four hypotheses this program is testing</h2>

<p>First, two terms the whole program turns on:</p>

<ul>
  <li><strong>The base objective</strong> is what TD-MPC2 already optimizes <em>without any of our additions</em>: a <strong>value/TD</strong>
loss (predict discounted return) plus a latent-<strong>dynamics</strong> (“consistency”) loss (predict the next
latent), with the MPPI planner choosing actions by rolling that latent model forward. The
representation — the <strong>latent</strong> — is simply whatever vector the network learns in order to satisfy
those losses.</li>
  <li><strong>Explicit structure</strong> = any <em>hand-designed representational objective we bolt on top</em> of the base
objective. Concretely, the menu is: the consistency loss (treated as an ablatable knob), an
<strong>anti-collapse penalty</strong> (uniformity, VICReg), <strong>SimNorm</strong>, a <strong>structural-entropy / “glass”</strong> latent,
<strong>clustering / discretization</strong>, or a <strong>behavioral</strong> prior (TAMP, skill-options). The single question
behind this program is: <em>when does adding explicit structure beat just letting the base objective shape
the latent on its own?</em></li>
</ul>

<p>With those fixed, the four hypotheses:</p>

<ul>
  <li>
    <p><strong>H-COMPRESS (value-information compressibility) — a PREDICTION still under test, not a result.</strong>
<em>Claim:</em> adding <strong>imposed</strong> structure (anti-collapse / SE / SimNorm) helps <strong>only</strong> on tasks where the
<strong>value head needs just a small slice of the latent</strong> (the flat-high regime).
<em>Intuition:</em> if the value/TD objective already spends the <em>entire</em> latent computing value, the
representation is “full” — no spare capacity for an added objective to reorganize. If the value head
needs only a <em>little</em>, the rest is effectively free, and an added objective <em>might</em> have room to shape
it usefully.
<em>Status (be honest):</em> the leap from “there is free capacity” to “filling it with structure helps” is
<strong>not yet demonstrated.</strong> Our one completed add-structure test is #59 on <strong>Cheetah</strong> (least-compressible)
— null, as expected there. The decisive positive test is on <strong>WalkerRun</strong> (most-compressible), running
now; its interim read shows <strong>no separation</strong> between arms. If Walker finishes null, H-COMPRESS’s
positive half is <em>falsified</em> and the cleaner statement is “imposed structure is redundant everywhere.”
<em>How we measure “how much of the latent the value head needs”:</em> the value-sufficiency bottleneck (VBN)
— force the value head’s input through a width-(D) bottleneck and sweep (D\in{16,32,64,128}). If
return barely drops at small (D), the value-relevant information is highly <strong>compressible</strong> (the head
needs little → <em>room to help</em>). If return falls off smoothly as (D) shrinks, the head needs the whole
latent (<em>no room</em>).
<em>The punchline:</em> the thing that predicts “is there room to help” is this <strong>compressibility</strong>, <strong>not</strong>
the two quantities you’d naively guess — the task’s planning <strong>horizon length</strong>, or its <strong>family</strong>
(locomotion vs manipulation). Two locomotion tasks (Walker, Cheetah) land at opposite ends of the
compressibility axis; that is why family and horizon fail as predictors and compressibility succeeds.</p>
  </li>
  <li>
    <p><strong>H-WM-ABSTRACT (the world model <em>is</em> a learned abstraction).</strong>
<em>Claim:</em> the latent-dynamics model the consistency loss trains is itself an abstraction — a <strong>learned</strong>,
task-relevant compression of the observation. So “world model” and “abstraction” are not two different
things to compare; the world model is one <em>kind</em> of abstraction (learned), on the same axis as the
<strong>imposed</strong> ones (SE / SimNorm / glass).
<em>Consequence:</em> “stripped vs full” (deleting the consistency loss) is <em>already</em> an abstraction ablation —
of the <em>learned</em> abstraction — and the clean experiment is to ablate a learned and an imposed
abstraction <em>together</em>, per task, to see which piece is the working part.</p>
  </li>
  <li>
    <p><strong>H-COLLECT (collection mode gates the world model’s value).</strong>
<em>Claim:</em> how much the world model matters depends on <strong>who collects the data</strong> — the reactive <strong>policy</strong>
(our default) or the <strong>planner</strong> (canonical TD-MPC2: MPPI rolls the model forward to <em>act</em>).
<em>Why it could matter:</em> under planner-collection the model doesn’t merely <em>score</em> candidate actions, it
<em>generates the behaviour that becomes the next batch of training data</em> — so an inaccurate model can
steer its own data collection, feeding its errors back in.</p>
  </li>
  <li>
    <p><strong>H-VARIANCE (one mechanism, two regimes).</strong>
<em>Claim:</em> under planner-collection, the net effect of the world model is to <strong>inflate the variance</strong> of
the returns the planner chases (~3× in our runs). Whether that extra variance is <em>good</em> or <em>bad</em> is set
by the <strong>ratio of the mean return to that variance</strong>: a high mean keeps the swings net-positive
(Walker); a low mean lets the swings drag returns <em>below</em> a stable no-model baseline, so the model turns
net-harmful (Cheetah — the inversion). One mechanism, opposite signs.</p>
  </li>
</ul>

<p><strong>Are these hypotheses actually <em>useful</em>, or just relabeling?</strong> Fair question — they are not equally
load-bearing:</p>

<ul>
  <li><strong>H-VARIANCE</strong> is the most useful: it made a concrete, measured prediction (the world model inflates
planner-target variance ~3×, sign set by mean/variance ratio) that you can <em>compute per task from eval
traces</em> to forecast whether planner-collection will help or hurt — a decision procedure, not a label.</li>
  <li><strong>H-COMPRESS</strong> is useful as a <strong>cheap screen</strong>: run the VBN before spending compute on structure, and
skip tasks where the value head needs the whole latent. Its <em>negative</em> (redundancy) side is well
supported; its <em>positive</em> side (“structure helps in flat-high”) is unproven and under test.</li>
  <li><strong>H-COLLECT</strong> is a real, testable factor (collection mode), but see the confound caveat in Instrument 2
— we have not yet run the clean factorial that would let us <em>attribute</em> an effect to it.</li>
  <li><strong>H-WM-ABSTRACT</strong> is, honestly, mostly a <strong>reframing</strong> right now. Its only cash value is that it makes
one experiment well-posed — the cross-ablation (ablate learned <em>and</em> imposed abstraction together). If
that experiment’s outcomes don’t come apart, the hypothesis is just a relabeling and should be dropped.</li>
</ul>

<p>That triage is itself the point of naming them: a hypothesis earns its keep only when it changes what we
<em>do</em> next.</p>

<h2 id="instrument-1--the-value-sufficiency-bottleneck-evidence-for-h-compress">Instrument 1 — the value-sufficiency bottleneck (evidence for H-COMPRESS)</h2>

<p>Part 10’s probe was <strong>decode-(R^2)</strong> — how well the latent reconstructs the observation. It <em>saturates</em>
for both a strong policy and a collapsed one, so it can’t tell you whether structure has room to help.
The replacement is a <strong>value-sufficiency bottleneck (VBN)</strong>: insert a width-(D) bottleneck <strong>on the
value head’s input</strong>, sweep (D\in{16,32,64,128}) against the unmodified agent, and read the <em>shape</em>
of the curve. That shape is a per-task fingerprint of how much of the latent the value function needs.</p>

<p><img src="/tdmpc-glass/images/part19-vbn-fingerprints.png" alt="VBN fingerprints" /></p>

<table>
  <thead>
    <tr>
      <th>Task</th>
      <th>D=16</th>
      <th>D=32</th>
      <th>D=64</th>
      <th>D=128</th>
      <th>vanilla</th>
      <th>fingerprint</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>WalkerRun (n=5)</td>
      <td>625 (86%)</td>
      <td>643 (88%)</td>
      <td>666 (92%)</td>
      <td>694 (95%)</td>
      <td>727</td>
      <td><strong>flat-high</strong> — most compressible; D=16 already 86%</td>
    </tr>
    <tr>
      <td>CheetahRun (n=5)</td>
      <td>548 (64%)</td>
      <td>589 (69%)</td>
      <td>627 (73%)</td>
      <td>726 (85%)</td>
      <td>855</td>
      <td><strong>strictly monotone</strong> — no width suffices</td>
    </tr>
    <tr>
      <td>AcrobotSwingup (n=6, med)</td>
      <td>211 (41%)</td>
      <td>251 (49%)</td>
      <td>311 (61%)</td>
      <td>304 (59%)</td>
      <td>511</td>
      <td><strong>ramp-to-D64</strong> — least compressible; saturates at D=64</td>
    </tr>
    <tr>
      <td><strong>HopperHop</strong></td>
      <td>—</td>
      <td>—</td>
      <td>—</td>
      <td>—</td>
      <td>—</td>
      <td><strong>not yet swept (queued)</strong> — the removable cell; H-COMPRESS predicts <em>flat-high</em></td>
    </tr>
  </tbody>
</table>

<p>The instrument agrees with the intervention. The stripped-vs-full ablation (delete the consistency loss)
ranks the tasks the <em>same way</em> the fingerprint does:</p>

\[\text{HopperHop } 0\% \;&lt;\; \text{WalkerRun } {-}7.5\% \;&lt;\; \text{CheetahRun } {-}23.8\% \;&lt;\; \text{AcrobotSwingup } {-}44\%.\]

<p>Read carefully, this co-ranking is evidence for <strong>H-WM-ABSTRACT</strong>, <em>not</em> H-COMPRESS — and the direction
matters. The strip cost measures how much the <strong>learned world model</strong> carries; it is <strong>largest where
compressibility is LOWEST</strong> (Cheetah −24%, Acrobot −44%) and zero where the task is most compressible
(Hopper). So the <em>learned</em> abstraction is load-bearing exactly where the value head needs <strong>a lot</strong> of
the latent — the <strong>opposite</strong> end of the axis from where <em>imposed</em> structure is supposed to help. Two
distinct statements, easy to conflate:</p>

<ol>
  <li><strong>Learned abstraction (world model) is load-bearing in low-compressibility tasks</strong> — proven here.</li>
  <li><strong>Imposed structure helps in high-compressibility (flat-high) tasks</strong> — H-COMPRESS’s <em>prediction</em>,
still under test (Walker), interim null.</li>
</ol>

<p>This sharpens Part 10’s Q6 (“why did abstraction ever help on HopperHop/nav?”) rather than closing it.
Q6 was about <em>imposed</em> abstraction on high-compressibility tasks — precisely the claim that is <strong>still
open</strong> (instrument 3, Walker running). What the co-ranking settles is the <em>other</em> half: the <strong>learned</strong>
world model is load-bearing on the low-compressibility tasks, and removable where compressibility is
high (Hopper 0%). So Hopper is the clean case where <em>neither</em> abstraction is needed — the value pathway
plus a rough planner already suffice.</p>

<p><strong>Two honest limits of the instrument</strong> (both now queued as experiments, not swept under the rug):</p>

<ol>
  <li><strong>It probes the <em>value</em> head only.</strong> That is deliberate — the planner selects actions by rolling the
model and scoring with the value/reward heads, so value-sufficiency is the pathway that gates
planning. But it means the fingerprint does not yet speak to the <em>reward</em> or <em>dynamics</em> heads; a
head-by-head bottleneck sweep is queued.</li>
  <li><strong>HopperHop has no row.</strong> We only swept the three DMControl tasks above; the Hopper VBN sweep is
queued (H-COMPRESS predicts flat-high, matching its removable status).</li>
</ol>

<blockquote>
  <p>A rigor note: the Acrobot fingerprint was called “step-at-128” mid-week. On re-harvest, two seeds had
only reached ~2.7M steps and were dragging the means; on the six complete-at-5M seeds it is a smooth
ramp saturating at D=64. Same story, corrected location. Report medians (two collapse cells).</p>
</blockquote>

<h2 id="instrument-2--collection-mode-and-the-world-model-evidence-for-h-collect--h-variance">Instrument 2 — collection mode and the world model (evidence for H-COLLECT + H-VARIANCE)</h2>

<p>Our JAX variant collects with the <em>policy</em>; canonical TD-MPC2 collects with the <em>planner</em>. Under
<strong>planner-collection</strong>, re-running stripped-vs-full on three tasks gives a double dissociation with a
genuine inversion (finals @2.5M, now <strong>n=9</strong>):</p>

<p><img src="/tdmpc-glass/images/part19-dissociation.png" alt="Collection-mode dissociation" /></p>

<table>
  <thead>
    <tr>
      <th>Task</th>
      <th>full (median)</th>
      <th>stripped (median)</th>
      <th>Δ</th>
      <th>reading</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>HopperHop (n=5)</td>
      <td>~455</td>
      <td>~468</td>
      <td>≈0</td>
      <td>removable — both arms stable</td>
    </tr>
    <tr>
      <td>WalkerRun (n=9)</td>
      <td><strong>739</strong></td>
      <td><strong>606</strong></td>
      <td><strong>−18.0%</strong></td>
      <td>load-bearing — higher but volatile</td>
    </tr>
    <tr>
      <td>CheetahRun (n=9)</td>
      <td><strong>327</strong></td>
      <td><strong>475</strong></td>
      <td><strong>+45% (stripped &gt; full)</strong></td>
      <td><strong>inversion</strong> — the model is <em>actively harmful</em></td>
    </tr>
  </tbody>
</table>

<p>On Cheetah, removing the model’s accuracy <strong>helps by 45%</strong> — we had <em>pre-registered</em> the opposite
(≥15% degrade). That falsification is the spine of the section, and it is <strong>evidence for H-COLLECT</strong>:
the world model’s value is not a constant, it is gated by collection mode and task.</p>

<p>The <em>why</em> is <strong>H-VARIANCE</strong>, and it is readable straight off the eval traces. The full model inflates
eval-return variance <strong>~3× on both tasks</strong>. The tasks differ only in scale relative to the mean: on
Walker the model lifts the mean to ~740 so the swings stay net-positive; on Cheetah the swings drag
finals to ~117, below the stable stripped model (~475), so variance tips into net harm. <strong>One mechanism,
two regimes, set by the mean/variance ratio.</strong></p>

<p>This also dissolves Part 10’s <strong>Q8</strong> (Hopper is both the sharpest PPO wall <em>and</em> the only removable cell):
stripping consistency removes the model’s <em>accuracy</em> but not the <em>planner</em>. TD-MPC2 clears Hopper via
planning + off-policy data (<strong>Q5</strong>: deterministic actor, no entropy — SAC fails Hopper 0/9 while the
planner-free TD core is 8/8), and the model is removable <em>because the planner carries it</em>.</p>

<p>So the two headline conclusions — <strong>(a)</strong> the world model’s value is task-dependent, <strong>(b)</strong> planning-in-
collection is (mostly) a sample-efficiency operator — now have a shared mechanism underneath (a), not
just an observation: it is the variance-inflation of H-VARIANCE, with the sign flip explained.</p>

<blockquote>
  <p><strong>Confound caveat — this is not yet a clean factorial (a reader raised this, correctly).</strong> Three
binary factors are in play here: <strong>collection mode</strong> (policy vs planner), <strong>implementation</strong> (our JAX
reimplementation vs official TD-MPC2), and the <strong>world model</strong> (stripped vs full). The dissociation
above cleanly varies only the third <em>within our reimplementation under planner-collection</em>; it does
<strong>not</strong> cross implementation, and the effect sizes live on top of a ~3× variance (H-VARIANCE), so “the
world model is <em>harmful</em> on Cheetah” is a median claim at n=9, not a variance-controlled attribution.
Before that word “harm” is load-bearing in a paper we need the <strong>2×2×2 controlled factorial</strong>
(collection × implementation × world-model), matched seeds, with the variance explicitly modeled — and
the official-vs-ours cell ties directly to the parity test we have <em>not</em> run. Queued (issues #2, #7).</p>
</blockquote>

<h2 id="instrument-3--the-anti-collapse-line-and-a-sharper-question-h-wm-abstract">Instrument 3 — the anti-collapse line, and a sharper question (H-WM-ABSTRACT)</h2>

<p>The anti-collapse (JEPA/SE) bets were parked since Part 7. This week I ran the two canonical levers on
the task the VBN instrument flags as <em>least compressible</em> (CheetahRun): <strong>uniformity</strong> vs <strong>VICReg</strong>
against a matched vanilla baseline.</p>

<blockquote>
  <p><strong>What this actually is — not a JEPA (a reader flagged the naming).</strong> The <code class="language-plaintext highlighter-rouge">urc</code>/<code class="language-plaintext highlighter-rouge">vac</code> arms are
literally <code class="language-plaintext highlighter-rouge">uniformity_loss()</code> and <code class="language-plaintext highlighter-rouge">vicreg_loss()</code> <strong>added as an auxiliary term to TD-MPC2’s existing
latent</strong> (<code class="language-plaintext highlighter-rouge">tdmpc2.py</code>); with the coefficient at zero they reduce to vanilla. So this bounds <em>“do
anti-collapse penalties help a value-based world model?”</em> — it is <strong>not</strong> a test of the JEPA
<em>architecture</em> (a separate predictor over a decoder-free, EMA-target embedding). Plain JEPA/H-JEPA was
never designed for DMControl value-control, and our earlier faithful H-JEPA runs (Panda, #55–58) nulled
for a different reason (the low-level primitive). A proper “does a JEPA world model help on DMControl”
test would adapt a modern JEPA-style controller — e.g. <strong>DINO-WM</strong> — rather than a penalty on TD-MPC2.
Queued (issue #8). Until then I’ll call this the <strong>anti-collapse-regularizer</strong> result, not “JEPA.”</p>
</blockquote>

<p><img src="/tdmpc-glass/images/part19-jepa59-null.png" alt="JEPA #59 null on Cheetah" /></p>

<table>
  <thead>
    <tr>
      <th>arm</th>
      <th>CheetahRun (last-6 median, n=2)</th>
      <th>vs vanilla (~818)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>uniformity (urc)</td>
      <td>725.8</td>
      <td>−11.3%</td>
    </tr>
    <tr>
      <td>VICReg (vac)</td>
      <td>751.3</td>
      <td>−8.2%</td>
    </tr>
    <tr>
      <td>vanilla</td>
      <td>~818</td>
      <td>—</td>
    </tr>
  </tbody>
</table>

<p>Uniformity ≈ VICReg, both <em>below</em> vanilla — a null, and the <em>expected</em> null under H-COMPRESS: TD-MPC2’s
latent is already shaped by the value/TD objective, which prevents the collapse these regularizers exist
to fight.</p>

<blockquote>
  <p><strong>Update (07-15, live).</strong> A third Cheetah seed finished, taking this to <strong>n=3</strong>: uniformity <strong>739</strong>
(−10%), VICReg <strong>779</strong> (−5%), still both below vanilla (~818) — the null holds. The <strong>WalkerRun</strong>
boundary test (the <em>most</em>-compressible regime, where anti-collapse has the most room to help) is
running now across a rented 4×4070 plus the freed 3060 box; at the interim ~2M/5M checkpoint all three
arms are clustered ~695–724 with <strong>no separation yet</strong> — early-consistent with the null. If it stays
null through 5M, H-COMPRESS is airtight across both VBN-fingerprint extremes. Final numbers next update.</p>
</blockquote>

<p><strong>But there is a caveat I want to state plainly, because it is the most interesting gap.</strong> “Anti-collapse
regularizer” and “consistency loss” are only two points on the abstraction axis. They are <em>not</em> the
richer abstraction machinery — <strong>SimNorm</strong>, the <strong>structural-entropy / glass</strong> latents, <strong>clustering /
discretization</strong>, or <strong>behavioral</strong> abstractions like <strong>TAMP / skill-options</strong>. The redundancy claim, so
far, is proven for anti-collapse + consistency; whether those <em>other</em> mechanisms are also redundant is an
open, and separately testable, question. It is queued.</p>

<h3 id="the-world-model-as-an-abstraction-h-wm-abstract">The world model as an abstraction (H-WM-ABSTRACT)</h3>

<p>Here is the reframing this review is really driving at, and the reader’s question that prompted it:
<em>the consistency loss trains the world model, so is the world model a kind of abstraction?</em> I think the
promising hypothesis is <strong>yes</strong> — the latent-dynamics model is a <em>learned, task-relevant compression</em>,
which is exactly what an abstraction is. Under that view:</p>

<ul>
  <li>“Stripped vs full” is <em>already</em> an abstraction ablation — it ablates the <strong>learned</strong> abstraction (the
world model) while leaving the planner.</li>
  <li>The SE/glass/SimNorm experiments are ablations of an <strong>imposed</strong> abstraction.</li>
  <li>The clean experiment is to <strong>cross them</strong>: ablate the imposed abstraction <em>and</em> the world model on the
same grid, per task, so we can see which piece — imposed structure, learned dynamics, or the planner —
is the <em>working part</em>. My current bet: on the flat-high tasks the working part is the value pathway and
both abstractions are redundant; on the ramp/monotone tasks the learned world model carries real weight
(that’s what the −24%/−44% strip costs say) while imposed structure still adds nothing.</li>
</ul>

<p>That cross-ablation is the headline experiment queued below.</p>

<h2 id="the-one-line-law-restated-by-hypothesis">The one-line law, restated by hypothesis</h2>

<blockquote>
  <p><strong>H-COMPRESS:</strong> explicit structure is redundant exactly where the value objective already supplies what
it would add. <strong>H-WM-ABSTRACT:</strong> the world model is itself a learned abstraction, and <em>it</em> is the
abstraction that carries weight where the value code is not nearly-sufficient. Where neither holds,
structure buys variance (<strong>H-VARIANCE</strong>), not a ceiling.</p>
</blockquote>

<h2 id="whats-queued-issues-filed-to-the-repo">What’s queued (issues filed to the repo)</h2>

<p>The review surfaced concrete gaps; each is now a tracked issue on <code class="language-plaintext highlighter-rouge">SuuTTT/tdmpc-glass</code>:</p>

<ol>
  <li><strong>Official-parity / dual-implementation test</strong> — run the same tasks on official TD-MPC2 vs our JAX
reimplementation, matched-seed, to certify the reimplementation before the papers lean on it.</li>
  <li><strong>VBN on HopperHop + head-by-head bottleneck</strong> — fill the missing fingerprint row and extend the
bottleneck from the value head to the reward and dynamics heads.</li>
  <li><strong>Do the <em>other</em> abstractions help? (SimNorm / SE-glass / clustering / TAMP)</strong> — the redundancy claim
is currently only tested on anti-collapse + consistency; test the richer abstraction menu, guided by
the VBN fingerprint (predict where each should help).</li>
  <li><strong>World-model-as-abstraction cross-ablation (H-WM-ABSTRACT)</strong> — jointly ablate imposed abstraction and
the learned world model per task, to isolate the working part.</li>
  <li><strong>Deeper theory for task-conditional load-bearingness</strong> — formalize <em>why</em> the mean/variance ratio (and
HopperHop’s conjunctive reward + exploration wall) makes some tasks removable-cell and others not.</li>
</ol>

<h2 id="next">Next</h2>

<ul>
  <li><strong>Freeze compute on Papers A &amp; 3, write.</strong> Both are data-complete at their final (n).</li>
  <li>The <strong>WalkerRun anti-collapse boundary sweep</strong> is running now across a rented 4×4070 plus the freed
3060 box; its verdict (null or not) closes the H-COMPRESS boundary.</li>
  <li>The <strong>H-WM-ABSTRACT cross-ablation</strong> is the first experiment of the new front.</li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[The week of July 8–15. Last week (Part 10) left a pile of open 'why' questions. This week turned each into a measured instrument and framed the program around four named hypotheses: a value-sufficiency bottleneck that fingerprints every task; a collection-mode dissociation that inverts on Cheetah (removing the world model HELPS) with one variance mechanism behind both regimes; a first data point on the anti-collapse (JEPA/SE) line; and a sharper question — is the world model itself just a learned abstraction, and if so which knob is doing the work? Tables, plots, and the experiments now queued to close the gaps.]]></summary></entry><entry><title type="html">TD-MPC-Glass, Part 18: Lab Notebook — Every Open Track of the Revision Week (07-08 → 07-12)</title><link href="https://suuttt.github.io/tdmpc-glass/2026/07/12/tdmpc-glass-part18-lab-notebook-week.html" rel="alternate" type="text/html" title="TD-MPC-Glass, Part 18: Lab Notebook — Every Open Track of the Revision Week (07-08 → 07-12)" /><published>2026-07-12T00:00:00+00:00</published><updated>2026-07-12T00:00:00+00:00</updated><id>https://suuttt.github.io/tdmpc-glass/2026/07/12/tdmpc-glass-part18-lab-notebook-week</id><content type="html" xml:base="https://suuttt.github.io/tdmpc-glass/2026/07/12/tdmpc-glass-part18-lab-notebook-week.html"><![CDATA[<blockquote>
  <p><strong>TL;DR.</strong> Ten tracks were live this week, all serving two deliverables: <strong>Paper A</strong> (the redundancy criterion +
its positive instrument) and <strong>Paper 3</strong> (the anatomy of beating PPO), both targeted at the late-July deadline.
Headlines: the 3-task <strong>value-sufficiency grid reached n=4</strong> (Cheetah strictly monotone 544/588/630/727 vs 855;
Acrobot’s step-at-128 narrows to 78%; Walker lands tonight); the <strong>collection-mode × world-model double
dissociation is confirmed at n=4</strong> on the Walker side (full median 715.5 vs stripped 600.5, and the “bimodality”
scare resolved into within-run eval volatility); <strong>Lean+</strong> — target-EMA smoothing as a world-model substitute —
returned a clean pre-registered <strong>null</strong>; and the <strong>graph-world-model line</strong>, reviewed here before its GPU box is
retired, stays closed (its one legitimate follow-up is banked, post-deadline). Sources for every number:
<code class="language-plaintext highlighter-rouge">wm-redundancy-paper/bet2_null_results.md</code> (commit hashes inline) and <code class="language-plaintext highlighter-rouge">tdmpc-glass/docs/CHANGELOG.md</code>.</p>
</blockquote>

<h2 id="minimal-shared-context-60-seconds">Minimal shared context (60 seconds)</h2>

<p>We study <strong>TD-MPC2</strong>, a model-based RL agent with three coupled parts: a latent <strong>world model</strong> (trained by a
<em>consistency loss</em> to predict its own next latent), a <strong>value/policy head</strong> (two-hot cross-entropy critic, deterministic
tanh-mean actor), and an <strong>MPPI planner</strong> (samples action sequences through the world model). Our stack is a JAX
reimplementation (“our variant”) whose one deliberate deviation is documented in Part 16: it <strong>collects data with the
policy</strong>, not the planner. The campaign’s core finding — the <em>redundancy criterion</em> — is that on several standard
control tasks you can delete the world-model objective (“<strong>stripped</strong>”) and lose little or nothing, which makes many
proposed abstraction objectives redundant. The open work this week: turn that negative into instruments and mechanisms
(Paper A), and explain exactly what beats PPO and why (Paper 3). “n” always counts independent seeds; “vanilla” means
the unmodified agent; “@5M/@2.5M” is environment steps.</p>

<h2 id="track-1--value-sufficiency-bottleneck-vsbvbn-grid-the-positive-instrument">Track 1 — Value-Sufficiency Bottleneck (VSB/VBN) grid: the positive instrument</h2>

<p><strong>What it is.</strong> A width-\(D\) bottleneck inserted between the latent and the value head: the critic may only read a
\(D\)-dimensional slice. Sweeping \(D \in {16,32,64,128}\) against vanilla measures <em>how much of the latent the
value function actually needs</em> — a valid replacement for the invalid decode-\(R^2\) probe Paper A already rejects.</p>

<p><strong>Why it exists.</strong> Paper A’s arc ended deflating (“a valid probe is still open”). The VSB curve is the constructive
answer, and its <em>shape</em> is a per-task fingerprint of value-information structure.</p>

<p><strong>Status (n=4 on all three tasks as of tonight; final mppi evals, 5M steps).</strong></p>
<ul>
  <li><strong>CheetahRun</strong>: 544 / 588 / 630 / 727 vs vanilla 855 — 64→85%, <strong>strictly monotone</strong> (ledger <code class="language-plaintext highlighter-rouge">76c29ef</code>). The
“smooth information gradient” case: every doubling buys more, no width suffices.</li>
  <li><strong>AcrobotSwingup</strong>: 261 / 271 / 282 / 397 vs vanilla 511 — tight widths statistically flat at 51–55%, <strong>only
D=128 recovers a large fraction (78%)</strong>, and the step’s size is seed-heavy (<code class="language-plaintext highlighter-rouge">3e3e312</code>). The “least compressible”
case.</li>
  <li><strong>WalkerRun</strong>: n=3 means 622 / 647 / 669 / 701 vs vanilla 727 (85–96%, flat-high — most compressible); the
seed-53 arms complete tonight → n=4 (in flight, no numbers claimed).</li>
  <li>Seed-54 arms for <strong>n=5</strong> on Cheetah (all four widths) and Walker are already running.</li>
</ul>

<p><strong>Feeds:</strong> Paper A’s central positive figure (the three fingerprints), plus the cross-task compressibility ordering
that matches Track 2.</p>

<h2 id="track-2--task-conditional-sufficiency-how-load-bearing-is-the-world-model">Track 2 — Task-conditional sufficiency: how load-bearing is the world model?</h2>

<p><strong>What it is.</strong> The stripped-vs-full comparison (delete the consistency loss, keep everything else) run per task.</p>

<p><strong>Why it exists.</strong> It quantifies the redundancy criterion task by task, and any candidate mechanism for “what the
world model does” must reproduce its ordering.</p>

<p><strong>Status (final, policy-collection, 5M).</strong> HopperHop <strong>0%</strong> (n=8, removable) &lt; WalkerRun <strong>−7.5%</strong> (n=4) &lt;
CheetahRun <strong>−23.8%</strong> (n=4) &lt; AcrobotSwingup <strong>−44%</strong>. Stable all week; the V1 audit (Track 4) found the same
ordering in the official-implementation deficits — independent corroboration.</p>

<p><strong>Feeds:</strong> Papers A and 3 (it is the x-axis both papers’ mechanisms must explain).</p>

<h2 id="track-3--lean-is-the-world-model-just-a-stabilizer-pre-registered-closed-today-null">Track 3 — Lean+: is the world model just a stabilizer? (pre-registered, closed today: NULL)</h2>

<p><strong>What it is.</strong> A “lightweight TD-MPC2” bet: if the world-model objective merely <em>stabilizes</em> value targets, then a
slower target-EMA (\(\tau\) 0.01 → 0.003) should recover the stripped model’s losses on Cheetah — a two-line change
instead of a world model.</p>

<p><strong>Why it exists.</strong> The user asked for a lightweight variant; the honest way to build one is to test whether the WM’s
role is replaceable by cheaper stabilization. Success and kill gates were pre-registered before launch (<code class="language-plaintext highlighter-rouge">0af60bf</code>).</p>

<p><strong>Status (closed 07-12, n=3/arm, 5M, stripped Cheetah).</strong> Lean-on <strong>596.9</strong> (spread 21.5) vs lean-off control
<strong>607.1</strong> (spread 48.2) — fails the pre-registered mean gate (≥620) without triggering the kill line; the only real
effect is a <strong>halved seed variance</strong> (<code class="language-plaintext highlighter-rouge">943819c</code>). <strong>Verdict: the world model’s dense-task contribution is predictive
structure, not mere target stabilization.</strong> The honest lightweight recipe remains: strip the WM only where Track 2
says it’s removable (Hopper-class).</p>

<p><strong>Feeds:</strong> Paper A — sharpens the claim that the consistency loss carries irreplaceable predictive structure.</p>

<h2 id="track-4--reimplementation-validity-audit-v1-are-we-wrong-at-the-very-beginning">Track 4 — Reimplementation validity audit (V1): are we wrong at the very beginning?</h2>

<p><strong>What it is.</strong> A direct parity check of our JAX variant against the official TD-MPC2 (and official SAC), triggered by
the user’s question once we noticed our stack never uses the planner to collect data.</p>

<p><strong>Why it exists.</strong> Every claim in both papers is scoped by whether the reimplementation is faithful; this had never
been tested head-to-head.</p>

<p><strong>Status (closed, Part 16, <code class="language-plaintext highlighter-rouge">5a31517</code>).</strong> Official hopper-hop 449 ≈ ours 420±113; official SAC’s Hopper failures match
our SAC runs (the P1 result is not an artifact of our SAC). The official-minus-ours deficit is <em>ordered exactly like</em>
Track 2’s WM-load ordering (Hop ≈0 &lt; Cheetah &lt; Walker &lt; Acrobot ~23%) — the deviation costs performance precisely
where the world model matters, which is what Track 5 then explained mechanistically. Consequence adopted campaign-wide:
sample-efficiency claims are <strong>within-stack only</strong>.</p>

<p><strong>Feeds:</strong> the scoping section of every paper; Part 16 (published) + Part 17, the from-scratch Handbook (shipped, with
the co-design recipe the user asked for).</p>

<h2 id="track-5--the-collection-mode--world-model-double-dissociation-v2v2wv2x--extensions">Track 5 — The collection-mode × world-model double dissociation (V2/V2W/V2X + extensions)</h2>

<p><strong>What it is.</strong> Rerun the stripped-vs-full contrast <strong>under planner-collection</strong> (the canonical mode, <code class="language-plaintext highlighter-rouge">MPPI_COLLECT=1</code>,
512 samples). Two pre-registered predictions: on Hopper (WM removable) stripping stays free; on Walker (WM
load-bearing) stripping should start to hurt <em>more</em>, because the planner collects by rolling the model.</p>

<p><strong>Why it exists.</strong> It is the cleanest mechanistic statement the campaign owns: the world model’s value is
task-conditional, and collection mode modulates it in the predicted direction at both ends. It also retroactively
explains Track 4’s deficit pattern.</p>

<p><strong>Status.</strong></p>
<ul>
  <li><strong>Hopper</strong>: stripped ≈ full, +1.4%, n=3, tight (unchanged all week); seed-53 pair → n=4 in flight.</li>
  <li><strong>Walker (n=4, closed today, <code class="language-plaintext highlighter-rouge">377e319</code>)</strong>: full median <strong>715.5</strong> vs stripped <strong>600.5</strong> (−15.4%; means −10.4%).
The mid-week scare — a seed-52 full arm at 455 suggesting bimodality — resolved when seed 53 finished at 744.7
<em>and</em> its live eval trajectory revealed the mechanism: the full arm’s evals swing ~250 points within a single
late-training window (680→715→676→<strong>501</strong>→696→744) while stripped arms move ~30 points. Refined claim: under
planner-collection the WM buys a <strong>higher-mean but higher-variance eval regime</strong>; seed 52’s 455 was an unlucky
final draw, not a mode. Seed-54 pair → n=5 in flight (~tonight).</li>
  <li><strong>Cheetah (new, pre-registered <code class="language-plaintext highlighter-rouge">943819c</code>, in flight)</strong>: the third task joins the table; prediction: stripped
degrades ≥15% under planner-collection; kill if &lt;8% (that would falsify the “planner-collection amplifies WM
importance” generalization). Verdict ~tonight.</li>
  <li>Bonus finding retained: planner-collection roughly <strong>doubles Walker sample-efficiency</strong> in our stack (722@2.5M ≈
policy-collection@5M).</li>
</ul>

<p><strong>Feeds:</strong> Paper 3’s centerpiece table; Part 16 updates 1–3 (published).</p>

<h2 id="track-6--p1-the-entropy-needle-why-sac-fails-hopper">Track 6 — P1, the entropy needle: why SAC fails Hopper</h2>

<p><strong>What it is.</strong> A full SAC entropy grid (auto-α, α=0.01, α=0.05; n=3 each) on HopperHop at 5M, against the
planner-free TD-MPC2 core.</p>

<p><strong>Why it exists.</strong> Paper 3 needs the <em>mechanism</em> of TD-MPC2’s Hopper advantage; the candidate was where stochasticity
lives: in the objective (SAC) vs only in the data (TD-MPC2’s ε-noise collection).</p>

<p><strong>Status (closed, <code class="language-plaintext highlighter-rouge">09fc2ab</code>).</strong> Every SAC arm fails Hopper at 5M; the TD core is 8/8. With Track 4’s external
validation (official SAC also fails), the “entropy needle” stands: <strong>stochasticity-in-objective vs
exploration-in-data</strong> is a ≥4–8× sample-efficiency gap on this task, honestly capability-scoped.</p>

<p><strong>Feeds:</strong> Paper 3, mechanism section.</p>

<h2 id="track-7--h3-the-margin-controlled-hopper-wall">Track 7 — H3, the margin-controlled Hopper wall</h2>

<p><strong>What it is.</strong> PPO on HopperHop with the reward re-shaped (product form, speed and margin knobs at 1.0) to test
whether the PPO wall is a shaping artifact.</p>

<p><strong>Why it exists.</strong> Closes Paper 3’s F3 audit caveat: is the wall the <em>conjunctive</em> reward itself, or our margin choice?</p>

<p><strong>Status (closed, <code class="language-plaintext highlighter-rouge">aa1a870</code>).</strong> PPO still walls (2.8/3.6 @20M) with the margin held — <strong>the conjunction is the
wall</strong>, de-confounded.</p>

<p><strong>Feeds:</strong> Paper 3.</p>

<h2 id="track-8--the-graph-world-model-gwm-line-reviewed-before-the-box-is-retired">Track 8 — The graph-world-model (GWM) line: reviewed before the box is retired</h2>

<p><strong>What it is.</strong> The relational axis of the redundancy program: does giving the world model an explicit <strong>entity/graph
structure</strong> (object nodes, interaction edges) buy anything a monolithic latent lacks? Run June 14–15 as iterations
34–36 plus a real-benchmark gate; its GPU box (the RTX 5070 Ti instance) has been idle since and is now being
retired by the user.</p>

<p><strong>Why it exists.</strong> The 2026 GWM survey (arXiv:2604.27895) named graph world models a paradigm; three deep-research
reports converged that <em>if</em> headroom exists it is in contact-rich, compositional (held-out object-count) settings.
Our smooth-spring synthetic could not have surfaced that, so a fair contact-world test was owed.</p>

<p><strong>Status (closed June; reviewed 07-12; all numbers from <code class="language-plaintext highlighter-rouge">tdmpc-glass/docs/CHANGELOG.md</code> and
<code class="language-plaintext highlighter-rouge">docs/research/graph-world-model-plan.md</code>).</strong> Four results, one honest asterisk:</p>
<ol>
  <li><strong>Iter-34 mechanism check (contact multi-disk world)</strong>: the graph latent’s <em>representation-level</em> win was real —
compositional-OOD value-\(R^2\) 0.57 vs fair param-matched monolithic 0.40 (gap 0.18 &gt; pre-registered 0.15) —
but the contact-conditioned-prediction criterion failed, and the <strong>control gate killed it</strong>: under random-shooting
MPC, graph ≈ fair-mono ≈ random floor at every object count (graph−random +13, std ~110). Representation
advantage did <strong>not</strong> convert to control.</li>
  <li><strong>Iter-35 (SOLD, the official GWM)</strong>: reproduced its released checkpoint at 100% success (30/30) vs paper 97.9%.
Third-party corroboration from SOLD’s own Table 1: monolithic TD-MPC2 (97.6) <strong>ties</strong> SOLD (97.9) on the
non-relational variant; SOLD’s wins are confined to the <em>Distinct</em> (relational) variants. The head-to-head on
Distinct was blocked by hardware (15 GB replay memmap &gt; box disk).</li>
  <li><strong>Iter-36 (compositional-OOD <em>control</em>, on the 5070 Ti)</strong>: <strong>uninformative, not a null</strong> — the GPU-vectorized
contact env had a control-signal ceiling ~10% (no controller, including random, separated) plus BPTT NaNs.</li>
  <li><strong>Paper-B gate on a real benchmark (ManiSkill PushCubeMulti)</strong>: control signal passed (PPO 100% vs random 0%)
but the headroom test failed — value-decodability stayed flat from 2→6 objects and the monolithic policy solved
the OOD counts. <strong>Monolithic generalizes over passive distractors</strong>; the program folded into Paper A as its
relational-axis closure.</li>
</ol>

<p><strong>Verdict on continuing (the user’s question).</strong> As a program: <strong>no — keep it closed.</strong> The one genuine positive
(representation-level OOD advantage) failed to convert to control three separate ways, and the real-benchmark gate
failed for the deeper reason that monolithic latents already generalize compositionally where objects don’t interact
contingently. The redundancy criterion now spans state, temporal, and relational structure — that <em>is</em> the paper
contribution. <strong>The one legitimately untested cell</strong> is a <strong>SOLD Fetch-Distinct head-to-head</strong> (active multi-object
interaction, the regime where SOLD’s own table shows its only wins): a bounded reproduce-and-compare, ~2–3 box-days
on a ≥30 GB-disk PyTorch box, <strong>banked as a post-deadline item</strong> — it either adds a third-party-anchored positive
boundary to Paper A’s relational section or closes the last asterisk. It is <em>not</em> added to this week’s active plan
(deadline math wins). <strong>Box retirement is safe</strong>: <code class="language-plaintext highlighter-rouge">contact_entities.py</code>, <code class="language-plaintext highlighter-rouge">entity_wm.py</code>, <code class="language-plaintext highlighter-rouge">monolithic_wm.py</code>, and
<code class="language-plaintext highlighter-rouge">value_coupling_probe.py</code> are all preserved in the <code class="language-plaintext highlighter-rouge">tdmpc-glass</code> repo; iter-36 was already recorded as uninformative;
nothing unique remains on the instance.</p>

<p><strong>Feeds:</strong> Paper A (relational-axis closure section + one banked boundary experiment).</p>

<h2 id="track-9--parked-from-the-part-10-todo-jepase-cells-and-the-taxonomy-law">Track 9 — Parked from the Part-10 TODO: JEPA/SE cells and the taxonomy law</h2>

<p><strong>What it is (planned, unexecuted — labeled as such).</strong> The Part-10 worklist items that the revision campaign
displaced: J0 anchor-strength A/B on nav H-JEPA, J1 SE-community vs uniformity/VICReg in the collapse regime (open
cell #59, ~1 box-day), J2 SE-as-hierarchy (gated on J0/J1, ~2–3 box-days), J3 offline SE-JEPA probe, and Bet-B’s
DOF-overlap monotonicity law (~2 box-days).</p>

<p><strong>Why they exist.</strong> They are the <em>next-paper</em> pipeline (JEPA/SE line), deliberately paused because Papers A &amp; 3 have
a ~07-28 deadline and the audit (Tracks 4–5) was strictly more urgent.</p>

<p><strong>Status.</strong> No runs this week; no numbers. Resume after paper assembly; J1/#59 first.</p>

<p><strong>Feeds:</strong> the post-deadline JEPA/SE paper direction.</p>

<h2 id="track-10--assembly-the-papers-themselves">Track 10 — Assembly: the papers themselves</h2>

<p><strong>What it is.</strong> Fold everything above into <strong>Paper A</strong> (“When Is Explicit Abstraction Redundant”) and <strong>Paper 3</strong>
(“The Anatomy of Beating PPO”) per the Part-15 narrative plan: A gains the VSB instrument + 4-taxa closure + Lean+
sharpening + relational closure; 3 gains the wall mechanism (H3), the entropy needle (P1), the double dissociation
(Track 5), and the within-stack scoping (Track 4).</p>

<p><strong>Status.</strong> Planned; starts when tonight’s n=5/n=4 arms land (the last figure-feeding runs). Estimated 2–3 focused
days of writing.</p>

<p><strong>Feeds:</strong> both deliverables, deadline ~07-28.</p>

<h2 id="dependency-map">Dependency map</h2>

<ul>
  <li><strong>Paper A</strong> ← Track 1 (VSB figure) ← Track 2 (ordering) ← Track 3 (Lean+ null) ← Track 8 (relational closure).</li>
  <li><strong>Paper 3</strong> ← Track 5 (dissociation table) ← Track 4 (validity scoping) ← Track 6 (entropy needle) ← Track 7
(wall mechanism).</li>
  <li><strong>Docs/public record</strong>: Parts 16–17 (audit + Handbook, shipped), Part 15 live log (running), this notebook.</li>
  <li><strong>Post-deadline queue</strong>: Track 9 (JEPA/SE), Track 8’s banked SOLD-Distinct head-to-head.</li>
</ul>

<p><em>Everything above is reproducible from the ledger (<code class="language-plaintext highlighter-rouge">bet2_null_results.md</code>, commits cited inline), the CHANGELOG, and
the Part 15/16 live logs; in-flight tracks are stated without numbers on purpose.</em></p>]]></content><author><name></name></author><summary type="html"><![CDATA[A from-first-principles lab-notebook survey of every research track opened between the Part-10 weekly review's TODO and the Part-15 revision plan, with verified numbers for each: the value-sufficiency-bottleneck grid at n=4 on three tasks, the reimplementation validity audit and the collection-mode × world-model double dissociation, the SAC entropy needle, the margin-controlled Hopper wall, the Lean+ lightweight-agent null, the closed graph-world-model line and its one banked follow-up, and the parked JEPA/SE cells. Each track: what it is, why it exists, verified status, and which paper it feeds.]]></summary></entry><entry><title type="html">TD-MPC-Glass, Part 16: Did We Reimplement TD-MPC2 Correctly? A Validity Audit</title><link href="https://suuttt.github.io/tdmpc-glass/2026/07/10/tdmpc-glass-part16-reimplementation-audit.html" rel="alternate" type="text/html" title="TD-MPC-Glass, Part 16: Did We Reimplement TD-MPC2 Correctly? A Validity Audit" /><published>2026-07-10T00:00:00+00:00</published><updated>2026-07-10T00:00:00+00:00</updated><id>https://suuttt.github.io/tdmpc-glass/2026/07/10/tdmpc-glass-part16-reimplementation-audit</id><content type="html" xml:base="https://suuttt.github.io/tdmpc-glass/2026/07/10/tdmpc-glass-part16-reimplementation-audit.html"><![CDATA[<blockquote>
  <p>Mid-campaign, the right question arrived: <em>“Are we wrong at the very beginning? Have we ever compared our JAX
reimplementation of TD-MPC2 with the original?”</em> The answer was <strong>no — we never had.</strong> Every result in Parts 1–15,
both papers, the whole Hopper critique — all of it runs on a from-scratch JAX/MJX reimplementation whose fidelity
to Hansen’s TD-MPC2 we had sanity-checked qualitatively but never audited. This post is the audit.</p>
</blockquote>

<h2 id="how-the-question-surfaced">How the question surfaced</h2>

<p>While preparing the P2 experiment (disable MPPI during data collection to test “planning-as-exploration”), we read
our own collection loop before patching it — and found there was nothing to disable. <strong>Our implementation collects
data with π + Gaussian noise in every branch; the MPPI planner never touches collection.</strong> An optional
MPC-distillation loss exists but is default-off and was never enabled in any run. Canonical TD-MPC2, by contrast,
<strong>acts with the planner during environment interaction</strong> — planner-collected data is part of the published method.</p>

<p>So the P2 hypothesis (“MPPI acts as a structured explorer during collection”) was falsified <em>by construction</em> in our
stack — every number we have, including the flagship HopperHop win, is <strong>planner-free training</strong>. That is both a
discovery and a problem: a discovery because it shows planner-collection is unnecessary for the Hop phenomenon; a
problem because our results were being phrased as results about <em>TD-MPC2 the published method</em>.</p>

<h2 id="the-full-deviation-list-as-audited">The full deviation list (as audited)</h2>

<ol>
  <li><strong>Data collection:</strong> ours = π + annealed Gaussian noise (0.3) + random warmup; canonical = MPPI planner actions.</li>
  <li><strong>Actor objective:</strong> ours = fully deterministic — maximize \(\min_2 Q(z, \tanh(\mu_\pi(z)))\) with a RunningScale
normalizer, <strong>no entropy term, no action sampling</strong>; canonical = sampled action + a very small entropy bonus
(~1e-4) — functionally near-deterministic, but not literally.</li>
  <li><strong>Physics backend:</strong> ours = mujoco_playground / MJX; canonical = dm_control / MuJoCo. Same reward definitions,
different numerics — absolute returns are not exactly commensurable.</li>
  <li><strong>MPPI budget:</strong> ours = 2048 samples, horizon 3; canonical = 512 samples, horizon 3.</li>
  <li>(Neutral) an MPC-distillation loss exists in our code but is default-off and unused.</li>
</ol>

<h2 id="v1--parity-against-the-official-published-results">V1 — parity against the official published results</h2>

<p>The TD-MPC2 repo publishes per-task curves (3 seeds, 4M steps, dm_control). Overlaying our numbers:</p>

<table>
  <thead>
    <tr>
      <th>task</th>
      <th>official TD-MPC2 final @4M</th>
      <th>ours @5M</th>
      <th>gap</th>
      <th>official cross-200</th>
      <th>ours</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>hopper-hop</strong></td>
      <td><strong>449</strong> (373/380/594)</td>
      <td><strong>~420±113</strong> (mppi ~571)</td>
      <td><strong>≈0%</strong></td>
      <td>0.2–0.4M</td>
      <td>~1M</td>
    </tr>
    <tr>
      <td>cheetah-run</td>
      <td>896</td>
      <td>855</td>
      <td>−5%</td>
      <td>0.1M</td>
      <td>—</td>
    </tr>
    <tr>
      <td>walker-run</td>
      <td>877</td>
      <td>727</td>
      <td>−17%</td>
      <td>0.1M</td>
      <td>—</td>
    </tr>
    <tr>
      <td>acrobot-swingup</td>
      <td>663</td>
      <td>511</td>
      <td>−23%</td>
      <td>0.1–0.2M</td>
      <td>—</td>
    </tr>
  </tbody>
</table>

<p>And the reference baselines the repo ships alongside:</p>

<ul>
  <li><strong>Official SAC on hopper-hop: finals 0 / 246 / 105</strong> (only 1 of 3 seeds ever crosses 200). Our custom SAC v1
(finals 76 / 23 / 101, 0/3 crossing) sits <strong>inside the canonical band</strong> — the “SAC fails on HopperHop” leg of our
P1 attribution is <em>not</em> an implementation artifact; reference SAC exhibits the same standing-trap phenotype.</li>
  <li>Official TDMPC-v1 on hopper-hop: 2 / 577 / 1 — the task is seed-brutal for everyone.</li>
</ul>

<p><strong>Three verdicts.</strong></p>

<ol>
  <li><strong>The two pillars stand at canonical levels.</strong> Our variant reproduces both the TD-MPC2 hopper-hop level (parity)
and SAC’s hopper-hop failure (parity). The Part-12 critique was not built on a broken reimplementation.</li>
  <li><strong>The deficits land exactly where our own theory says they should.</strong> Our variant is weaker than official
precisely on the tasks where we measured the world model to be <em>load-bearing</em>: the official-minus-ours gap
ordering (Hop ≈0% &lt; Cheetah 5% &lt; Walker 17% &lt; Acrobot 23%) tracks our measured WM-load-bearing ordering
(Hop removable &lt; Walker −7.5% &lt; Cheetah ~−19% &lt; Acrobot −44%). If planner-collection (which rolls the world
model) helps most where accurate rollouts matter, this is exactly the signature you’d expect — canonical data
<em>cross-validating</em> the task-conditional world-model story from the outside. (Honest confound: the MJX backend
differs too; we cannot fully separate the two from published curves alone.)</li>
  <li><strong>Early-phase speed does not transfer.</strong> Official crossings are uniformly faster (0.1–0.4M vs our ~1M) — so
sample-efficiency comparisons are only made within our stack, never across stacks.</li>
</ol>

<h2 id="the-one-claim-genuinely-at-risk--and-the-experiment-running-right-now">The one claim genuinely at risk — and the experiment running right now</h2>

<p><strong>“The consistency loss is removable on HopperHop (n=8)”</strong> was measured in a stack where the planner never touches
training. In canonical TD-MPC2 the planner <em>collects the data by rolling the world model</em> — so removing the
consistency loss there could also degrade collection in a way our stack cannot express. If that matters, canonical
TD-MPC2’s world model might <strong>not</strong> be removable on Hop, and Part 12’s headline would need a variant-scoped rewrite.</p>

<p><strong>V2 (running):</strong> we added an <code class="language-plaintext highlighter-rouge">MPPI_COLLECT=1</code> gate that makes our stack collect with the planner (512 samples, the
canonical count), and launched {full, consistency-stripped} × planner-collection on HopperHop (n=2 each, 2.5M).
If the stripped model still trains to full <em>under planner-collection</em>, removability holds beyond the deviation and
the critique stands as stated. If it collapses, we will have found precisely where the claim’s boundary is — and
Part 12 gets rescoped to policy-collection variants, honestly labeled. Either outcome is informative; the verdict
lands within a day and will be appended here.</p>

<h2 id="what-changes-in-our-papers-regardless">What changes in our papers regardless</h2>

<ul>
  <li>Every external-facing “TD-MPC2” becomes <strong>“our TD-MPC2 variant (policy-collection; deviations listed in setup)”</strong>
until/unless V2 licenses the stronger phrasing.</li>
  <li>The deviation list above goes into both papers’ setup sections verbatim.</li>
  <li>Internally-controlled ablations (the sufficiency grids, VBN curves, reweighting/bisim nulls) are unaffected —
they compare arms within one stack and were always statements about this architecture family.</li>
  <li>One deviation turned into a <em>finding</em>: planner-free training reproduces the canonical hopper-hop level — evidence
that planner-collection is unnecessary for the flagship result, which is itself a contribution of the critique.</li>
</ul>

<p><em>The lesson, stated plainly: when your research program runs on a reimplementation, the parity audit is not optional
due diligence — it is an experiment, and (as here) it can return results.</em></p>

<h2 id="update-2026-07-11-the-v2-verdict--removability-survives-planner-collection">Update (2026-07-11): the V2 verdict — removability survives planner-collection</h2>

<p>The experiment landed, and the answer is unambiguous. With the <code class="language-plaintext highlighter-rouge">MPPI_COLLECT=1</code> gate making our stack collect data
canonical-style (the planner acts during environment interaction, 512 samples):</p>

<table>
  <thead>
    <tr>
      <th>arm (HopperHop, 2.5M, n=2)</th>
      <th>seed 50</th>
      <th>seed 51</th>
      <th>mean</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>full world model + planner-collection</td>
      <td>467.8</td>
      <td>462.2</td>
      <td><strong>465.0</strong></td>
    </tr>
    <tr>
      <td><strong>consistency-stripped</strong> + planner-collection</td>
      <td>451.8</td>
      <td>479.8</td>
      <td><strong>465.8</strong></td>
    </tr>
  </tbody>
</table>

<p><strong>Stripped equals full to within noise (+0.2%).</strong> The consistency loss is removable on HopperHop even when the
planner collects the data — including in the stripped arm, where MPPI is rolling an <em>untrained</em> dynamics network and
scoring candidate actions purely through the reward and value heads. That is simultaneously (a) the discharge of the
one claim this audit put at risk — Part 12’s critique holds beyond the implementation deviation, and (b) the
strongest evidence yet for the execution-simple account: on Hop, what the planner contributes is value-guided action
scoring, not rollout fidelity. The papers can now state the removability result as holding under <strong>both</strong>
policy-collection (n=8) and planner-collection (n=2). The natural reviewer follow-up — the same planner-collection
contrast on WalkerRun, where the world model <em>is</em> load-bearing — is queued.</p>

<h2 id="update-2-2026-07-11-the-walker-mirror-image--a-complete-double-dissociation">Update 2 (2026-07-11): the Walker mirror-image — a complete double dissociation</h2>

<p>The pre-registered follow-up ran: the same planner-collection gate on <strong>WalkerRun</strong>, where the world model is
load-bearing. Prediction: the stripped model should <em>degrade</em> there. Result (2.5M, n=2/arm):</p>

<table>
  <thead>
    <tr>
      <th>task</th>
      <th>full + planner-collection</th>
      <th>stripped + planner-collection</th>
      <th>Δ</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>HopperHop</td>
      <td>465.0</td>
      <td>465.8</td>
      <td>+0.2% — removable</td>
    </tr>
    <tr>
      <td><strong>WalkerRun</strong></td>
      <td><strong>721.9</strong> (758/686)</td>
      <td><strong>605.4</strong> (601/610)</td>
      <td><strong>−16.1%</strong> — non-overlapping</td>
    </tr>
  </tbody>
</table>

<p>Confirmed, cleanly. Two further reads: the planner-collection gap on Walker (−16% at 2.5M) is <em>larger</em> than the
policy-collection gap (−7.5% at 5M) — planner-collection <strong>amplifies</strong> the world model’s importance exactly where
rollout quality matters, because the planner collects by rolling the model. And the full model under
planner-collection reaches at 2.5M what policy-collection needs 5M for (~722 vs the 708–727 band) —
planner-collection roughly <strong>doubles Walker sample-efficiency</strong> in our stack, which retroactively explains the
V1 deficit pattern (official, planner-collecting TD-MPC2 beats our policy-collecting variant precisely on the
load-bearing tasks). Together, V2 + V2W form the cleanest mechanistic statement of the program: <strong>the world model’s
value is task-conditional, and collection mode modulates it in the predicted direction at both ends.</strong></p>

<p><strong>Update 3 (07-12) — the n=4 resolution, and what the “bimodality” really was.</strong> Seed 52 briefly complicated the
story: its full arm finished at 455, far below s50/51 (758/686), while its stripped arms stayed tight — raising the
possibility that the full model under planner-collection is bimodal across seeds. The seed-53 resolving pair settled
it: full <strong>744.7</strong>, stripped <strong>558.3</strong> (finals at 2.5M), so 3 of 4 full seeds cluster at 686–758 and s52 is the lone
outlier. Better, watching s53’s eval trajectory live revealed the mechanism: the full arm’s evals swing ~250 points
within a single late-training window (680 → 715 → 676 → <strong>501</strong> → 696 → 744 over 2.1–2.5M) while the stripped arm
moves ~30 points (539–568). The dissociation at n=4: full median <strong>715.5</strong> vs stripped <strong>600.5</strong> (−15.4%; means
−10.4%). So the refined claim is variance-aware: on WalkerRun under planner-collection, the world model buys a
higher-performance but higher-variance eval regime, and the stripped model trades ~115 points of median for
stability. s52’s 455 was almost certainly an unlucky final-eval draw from the volatile regime, not a distinct mode.
Hop’s ±0 (n=3, tight) stands unchanged — the double dissociation is now n=4 on the Walker side.</p>

<p><strong>Update 4 (07-13) — the third task inverts the story, exactly as a pre-registration should catch.</strong> With Hop and
Walker in hand we pre-registered the natural generalization: planner-collection amplifies the world model’s
importance, so stripped-Cheetah should degrade ≥15% (kill: &lt;8%). It did neither — it <strong>inverted</strong>. Across both
seeds the full model’s evals destabilize under planner-collection (swinging 141–585 within the last 250k steps)
while the stripped model holds a tight ~460–555 band; on last-6-eval medians the stripped model is ~40% <em>above</em>
full. Walker meanwhile strengthened to n=5 (full median 739 vs stripped 601, −18.7%), and Hop stayed removable at
n=4 (436 vs 468). The three-task table is now: <strong>removable (Hop) / load-bearing-but-volatile (Walker) /
actively destabilizing (Cheetah)</strong> — the collection-mode × world-model interaction is task-dependent and
non-monotone in how much the value function needs the latent (the VSB grid’s ordering). That is a sharper claim
than “amplification,” and it is what the planner-rolls-the-model mechanism actually predicts once the model’s
rollout errors compound differently per dynamics class. Cheetah n=5 pairs are running to nail the inversion.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[A sharp question stopped us mid-campaign: our entire research program runs on a from-scratch JAX reimplementation of TD-MPC2 — and we had never rigorously compared it against Hansen's original. Worse, reading our own collection loop revealed the reimplementation never uses the MPPI planner to collect data, where canonical TD-MPC2 does. This post is the honest audit: the full deviation list, a parity check against the official published per-task results (verdict: hopper-hop at parity, SAC's failure reproduced exactly, systematic deficits precisely where our own theory predicts them), the one claim that is genuinely at risk, and the experiment now running that settles it.]]></summary></entry><entry><title type="html">TD-MPC-Glass, Part 17: The Handbook — Our Stack From Scratch, So You Can Design Algorithms With Me</title><link href="https://suuttt.github.io/tdmpc-glass/2026/07/10/tdmpc-glass-part17-handbook.html" rel="alternate" type="text/html" title="TD-MPC-Glass, Part 17: The Handbook — Our Stack From Scratch, So You Can Design Algorithms With Me" /><published>2026-07-10T00:00:00+00:00</published><updated>2026-07-10T00:00:00+00:00</updated><id>https://suuttt.github.io/tdmpc-glass/2026/07/10/tdmpc-glass-part17-handbook</id><content type="html" xml:base="https://suuttt.github.io/tdmpc-glass/2026/07/10/tdmpc-glass-part17-handbook.html"><![CDATA[<blockquote>
  <p><strong>Why this exists.</strong> You asked to know what I am doing at a level where we can <em>design algorithms together</em>.
This is that document: a self-contained tutorial book for the TD-MPC-Glass program. Chapter 1–2 teach the agent
from scratch. Chapter 3 is our actual implementation, deviations included. Chapter 4 is the experiment harness
and its discipline. Chapter 5 is the results map with real numbers. Chapter 6 is the co-design recipe — how an
idea becomes a running experiment. Skim 1–2 if you know TD-MPC2; never skip 3.</p>
</blockquote>

<h2 id="chapter-1--the-agent-in-five-losses">Chapter 1 — The agent in five losses</h2>

<p>TD-MPC2 is a model-based RL agent that lives entirely in a learned latent space. Everything follows from five
components trained end-to-end off a replay buffer:</p>

<p><strong>The latent.</strong> An encoder maps observation to \(z_t = \text{enc}(o_t) \in \mathbb{R}^{512}\), normalized by
<strong>SimNorm</strong>: the 512 dims are split into groups of 8 and each group is softmaxed. This bounds the latent (helps
stability) and makes it <em>distributed</em> — no single dimension means anything alone. Remember this when we get to the
bottleneck experiments: SimNorm is why “read only the first D dims” is a real constraint.</p>

<p><strong>Loss 1 — consistency (this is the “world model”).</strong> A dynamics MLP predicts the next latent:
\(\mathcal{L}_{\text{cons}} = \sum_{t} \rho^t \,\big\lVert \text{dyn}(z_t, a_t) - \text{sg}[\text{enc}(o_{t+1})]\big\rVert^2\)
This is JEPA-style latent self-prediction (no pixel reconstruction). It is the ONLY loss that makes the latent
<em>predictive</em> — the thing you can roll forward. When we say “stripped world model” we mean exactly: this loss off.</p>

<p><strong>Loss 2 — reward.</strong> A head predicts \(r_t\) from \((z_t, a_t)\), as a two-hot distributional target (the scalar
is encoded as weight on two adjacent bins of a fixed grid; the loss is cross-entropy). The planner uses this head to
score imagined rollouts.</p>

<p><strong>Loss 3 — value (the engine, part 1).</strong> A \(Q\)-ensemble (2 heads in our config) trained by TD:
target \(= r + \gamma\, Q_{\text{target}}(z’, \pi(z’))\), two-hot cross-entropy again, target network via EMA.
Ablating this is fatal on every task we ever tested — the agent cannot even stand.</p>

<p><strong>Loss 4 — policy (the engine, part 2).</strong> An actor trained to maximize the ensemble-min Q at its own action.
In our implementation this is fully deterministic:
\(\mathcal{L}_\pi = -\,\mathbb{E}\big[\min_2 Q(\text{sg}(z), \tanh(\mu_\pi(z)))\,/\,\text{RunningScale}\big]\)
RunningScale is an EMA of the Q-value inter-quantile range (p95−p5) that keeps the loss magnitude stable across
tasks. Canonical TD-MPC2 samples the action and adds a tiny entropy bonus (~1e-4); ours doesn’t (see Ch. 3).
Also fatal to ablate — the planner alone cannot compensate.</p>

<p><strong>Loss 5 — there is no loss 5.</strong> Exploration is NOT a loss in this design: it is Gaussian noise added to actions at
collection time, annealed from 0.3, plus a random-action warmup (first 25k steps). Contrast SAC, which puts entropy
<em>inside</em> the actor objective. This distinction turned out to be a main finding (Ch. 5, P1).</p>

<h2 id="chapter-2--the-planner-mppi">Chapter 2 — The planner (MPPI)</h2>

<p>At decision time the agent can do better than \(\pi\): plan. <strong>MPPI</strong> (Model Predictive Path Integral) is
derivative-free trajectory optimization over the learned model:</p>

<ol>
  <li>Sample \(N\) action sequences of horizon \(H\)=3 from a Gaussian \((\mu_{1:H}, \sigma_{1:H})\); a few are
seeded by rolling \(\pi\) (the “policy prior”).</li>
  <li>Roll each through \(\text{dyn}\), scoring \(\sum_t \gamma^t \hat r_t + \gamma^H Q(z_H, \pi(z_H))\) — reward
head along the way, value head as terminal bootstrap.</li>
  <li>Reweight elites (softmax over scores), update \(\mu, \sigma\), iterate a few times; execute \(\mu_1\), replan
next step (receding horizon).</li>
</ol>

<p>Three places planning could appear: <strong>eval</strong> (we do this — <code class="language-plaintext highlighter-rouge">eval_mppi</code> vs <code class="language-plaintext highlighter-rouge">eval_pi</code> are logged separately at every
checkpoint, which is what let us measure “does planning help” per task), <strong>data collection</strong> (canonical does this;
ours does not — the V2 experiment adds it via a gate), and <strong>TD targets</strong> (neither does this in the configs we run).</p>

<h2 id="chapter-3--our-implementation-exactly-read-this-one">Chapter 3 — Our implementation, exactly (read this one)</h2>

<p>The stack is a from-scratch JAX/Flax implementation (<code class="language-plaintext highlighter-rouge">helios</code>), running mujoco_playground/MJX physics, on two
Vast.ai 4×3060 boxes (<code class="language-plaintext highlighter-rouge">b3060</code> = helios_wmablate, the Hopper-capable box; <code class="language-plaintext highlighter-rouge">b3060b</code> = tdmpc_glass, cannot build
HopperHop). Entry point: <code class="language-plaintext highlighter-rouge">scripts/run_benchmark.py</code> (task/algo/seed/steps CLI; ~2600 lines; there are TWO copies —
<code class="language-plaintext highlighter-rouge">/root/helios_wmablate/scripts/</code> used by the ablation harness and <code class="language-plaintext highlighter-rouge">/root/helios-rl/scripts/</code> used by SAC/PPO runs;
they share the collection-loop structure but are patched independently — always check which one a runner calls).
Algorithms live in <code class="language-plaintext highlighter-rouge">src/helios/algorithms/tdmpc2.py</code> (+ sac.py, tdmpc_glass.py).</p>

<p><strong>The training loop</strong> (the part that matters for design work):</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>while env_steps &lt; total_steps:
    # COLLECT (vectorized N_ENVS): a = tanh(π_mean(enc(o))) + Gaussian(σ annealed from 0.3)
    #   [random uniform actions for the first 25k steps]
    #   [V2 gate: MPPI_COLLECT=1 → a = MPPI(z) instead of π-mean]
    buffer.add(...)
    # UPDATE (k_update=128 gradient steps per collect chunk):
    #   sample sequences, compute the 4 losses, masked by ABLATE, one optimizer step each
    # EVAL every ~50k steps: eval_pi (raw policy) AND eval_mppi (planner) → CSV row
</code></pre></div></div>

<p><strong>Verified deviations from canonical TD-MPC2</strong> (Part 16 has the audit):</p>
<ol>
  <li>collection is π+noise, never the planner (canonical: planner); 2. actor loss is deterministic-mean, no entropy
term (canonical: sampled + ~1e-4 entropy); 3. MJX backend, not dm_control; 4. MPPI 2048 samples (canonical 512).
Parity status: hopper-hop final at parity with official (449 vs ~420±113); SAC-failure reproduced exactly;
Walker/Acrobot −17/−23% below official — consistent with missing planner-collection where the WM is load-bearing.</li>
</ol>

<p><strong>The env-gate pattern</strong> — our single most-used engineering idiom. Every experimental modification is a small code
patch gated by an environment variable, byte-identical when unset:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">_VBN</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">__import__</span><span class="p">(</span><span class="s">'os'</span><span class="p">).</span><span class="n">environ</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">'VBN_DIM'</span><span class="p">,</span> <span class="s">'0'</span><span class="p">))</span>
<span class="p">...</span>
<span class="n">z</span> <span class="o">=</span> <span class="n">z</span><span class="p">[...,</span> <span class="p">:</span><span class="n">_VBN</span><span class="p">]</span> <span class="k">if</span> <span class="n">_VBN</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="n">z</span>     <span class="c1"># in QEnsemble and Pi
</span></code></pre></div></div>
<p>Active gates today: <code class="language-plaintext highlighter-rouge">ABLATE</code> (turn off one loss: none/consistency/value/policy/reward), <code class="language-plaintext highlighter-rouge">VBN_DIM</code> (value/policy
heads read only the first D of 512 latent dims), <code class="language-plaintext highlighter-rouge">VAC_LAM</code>/<code class="language-plaintext highlighter-rouge">URC_LAM</code> (loss reweighting — closed, null),
<code class="language-plaintext highlighter-rouge">HOP_REWARD_MODE</code>/<code class="language-plaintext highlighter-rouge">HOP_SPEED</code>/<code class="language-plaintext highlighter-rouge">HOP_MARGIN</code> (HopperHop reward-structure knobs in hopper.py), <code class="language-plaintext highlighter-rouge">SAC_ALPHA_FLOOR</code>/
<code class="language-plaintext highlighter-rouge">SAC_TENT_SCALE</code> (SAC entropy surgery), <code class="language-plaintext highlighter-rouge">MPPI_COLLECT</code> (planner-collection, V2). Each was applied with a <code class="language-plaintext highlighter-rouge">.bak_*</code>
backup, an AST parse check, and a 25–35k smoke run before any real launch.</p>

<h2 id="chapter-4--the-experiment-harness-and-its-discipline">Chapter 4 — The experiment harness and its discipline</h2>

<p><strong>Anatomy of one run.</strong> A driver script (written via <code class="language-plaintext highlighter-rouge">printf</code>, never heredoc-over-ssh — those fail silently) sets
env vars and calls <code class="language-plaintext highlighter-rouge">run_arm.sh</code> / <code class="language-plaintext highlighter-rouge">run_vbn.sh</code>, which sets a <strong>task-qualified tag</strong> like
<code class="language-plaintext highlighter-rouge">wmabl_WalkerRun_consistency_s70</code> (a tag missing the task name once caused cross-task data contamination — the F1
incident). Output: a benchmark CSV (<code class="language-plaintext highlighter-rouge">tdmpc2_&lt;task&gt;_&lt;tag&gt;.csv</code>, one row per eval: step, π-return, MPPI-return), a log
with <code class="language-plaintext highlighter-rouge">es=</code> step counters (space-padded!), and — when a whole batch finishes — a <strong>marker file</strong> (e.g.
<code class="language-plaintext highlighter-rouge">exp/P4_WALKER_SUFF_DONE</code>) written by the driver’s <code class="language-plaintext highlighter-rouge">wait</code>.</p>

<p><strong>The rules, each paid for by a past mistake:</strong></p>
<ul>
  <li><strong>Harvest only at markers.</strong> Near-final evals lie (a “final” harvested pre-completion was wrong by 10%; amended).</li>
  <li><strong>Verify every launch</strong> by <code class="language-plaintext highlighter-rouge">pgrep</code> + log existence ~45s after; compound-ssh backgrounds fail silently.</li>
  <li><strong>One GPU roller only.</strong> Two schedulers double-booked GPUs and (likely) OOM-killed a whole box’s jobs.</li>
  <li><strong>Never trust an in-context ETA</strong>; recompute from <code class="language-plaintext highlighter-rouge">es=</code> deltas. Packing 2 jobs/GPU halves per-job speed.</li>
  <li><strong>Every result → the ledger</strong> (<code class="language-plaintext highlighter-rouge">wm-redundancy-paper/bet2_null_results.md</code>, append-only, git-pushed) with n, seeds,
step counts, and honest caveats — nulls, truncations, and mistakes included. The ledger is the source of truth;
blogs and papers cite it.</li>
  <li><strong>Report n. Never fabricate. Nulls are results.</strong></li>
</ul>

<p><strong>The fleet:</strong> 8×RTX3060 across the two boxes. Budget arithmetic that governs design: a 5M-step tdmpc2 run ≈ 10h
unpacked (~138 sps), ~2× that packed; SAC ≈ 35 min; PPO(brax) 20M ≈ 3h; planner-collection tdmpc2 ≈ 2.4× slower
(~58 sps). A 4-arm × 2-seed ablation is an overnight; a 3-task × 4-width × 5-seed grid is a week.</p>

<h2 id="chapter-5--the-results-map-what-is-established-with-numbers">Chapter 5 — The results map (what is established, with numbers)</h2>

<p><strong>A. The redundancy result (Paper A).</strong> Four independent ways of imposing structure on the latent, all null-to-harmful
on dense control: added SE/graph structure (glass — long-run null), loss reweighting (VAC −4/−9%, URC −8.2%/−3.8%),
value-conditioned metric (bisimulation −46/−55%: strong no-go), architectural bottleneck (VBN: graded null).</p>

<p><strong>B. The positive instrument (Paper A).</strong> The <strong>value-sufficient-bottleneck curve</strong>: force Q/π to read only the first
D latent dims → return(D) is smooth, monotone, saturating, and no width recovers vanilla. Cheetah n=2(→3):
516/572/628/738 vs 855. Walker n=2(→3): 604/652/670/708 vs 727 (97% at D=128 — most compressible). Acrobot n=2:
280/351/291/491 vs 511 (least compressible). This is the valid replacement for the decode-R² probe the paper shows
is broken.</p>

<p><strong>C. The world model is task-conditional (Papers A+3).</strong> Ablating the consistency loss: HopperHop <strong>removable</strong>
(n=8, stripped ≈ full ≈ 420); WalkerRun <strong>−7.5%</strong> (n=4, tight; the historical −23% was a seed outlier); CheetahRun
<strong>≈−19%</strong> (n=2 truncated, wide spread, full-5M seeds running); Acrobot −44%. Official-vs-ours deficits track this
same ordering (Part 16) — external cross-validation.</p>

<p><strong>D. The HopperHop mechanism (Paper 3).</strong> The PPO wall (0/5 seeds ≥200 at 472M) is caused by the <strong>conjunctive
reward</strong> <code class="language-plaintext highlighter-rouge">standing × hopping</code>: additive reward → PPO climbs off zero (0→135@20M); product with easier threshold →
still walled (1); product with easier threshold AND default margin (the de-confounded variant) → <strong>still walled
(2.8/3.6 @20M)</strong>. No early termination exists in this env — the conjunction is the whole wall.</p>

<p><strong>E. The attribution (Paper 3, “P1”).</strong> What beats PPO <em>and</em> SAC on Hop is the <strong>TD core itself, planner-free</strong>:
our stack never uses the planner in training, yet matches official TD-MPC2 on Hop. SAC fails at every entropy
setting tested — auto-α collapses to 0.003 and stands forever (76/23/101); α floored at 0.05 never stands
(0.26/0.002/0.006); 0.01 splits (1/0/51). The mechanism: SAC puts stochasticity in the <em>objective</em> (lose-lose on a
conjunctive-sparse contact task); TD-MPC2 keeps the objective deterministic and puts exploration in the <em>data</em>.
Scoped honestly: a ≥4–8× sample-efficiency gap at 5M, not a capability wall (official SAC’s best seed crosses at 1M).</p>

<p><strong>F. Open right now:</strong> V2 (does Hop-removability survive planner-collection?) — the scoping verdict for the whole
critique; Cheetah sufficiency full-5M; VBN → n=5; the Lean+ agent (below).</p>

<h2 id="chapter-6--designing-algorithms-with-me-the-recipe">Chapter 6 — Designing algorithms with me: the recipe</h2>

<p><strong>The pipeline an idea goes through</strong> (typical wall-clock: idea → running arms in 2–4 hours):</p>
<ol>
  <li><strong>State the claim as an arm-pair.</strong> “X helps” must become: arm A (gate on) vs arm B (gate off), same seeds, same
task, same budget, and a <em>pre-declared</em> success criterion. If the claim can’t be phrased this way, it isn’t ready.</li>
  <li><strong>Pick tasks by what they probe.</strong> HopperHop = conjunctive-sparse exploration, WM-removable. WalkerRun/CheetahRun
= dense, WM-load-bearing (mild/moderate). Acrobot = threshold-shaped, least-compressible latent. A method claim
should predict <em>different</em> effects across these — uniform effects are usually bugs or artifacts.</li>
  <li><strong>Implement as an env-gate</strong> (default byte-identical), <code class="language-plaintext highlighter-rouge">.bak</code> backup, AST check, 25k smoke on one GPU.</li>
  <li><strong>Launch n≥2 seeds per arm</strong> with task-qualified tags + a completion marker; verify by pgrep+logs; the loop
babysits, harvests at the marker, ledgers, and pushes.</li>
  <li><strong>Interpret against the map</strong> (Ch. 5): every new number lands in an existing table; contradictions get flagged,
not smoothed. Then: extend seeds, add the control you now realize you need, or kill the idea and ledger the null.</li>
</ol>

<p><strong>Live design targets where your ideas plug in directly:</strong></p>
<ul>
  <li><strong>Lean+ TD-MPC2</strong> — the minimal agent: value+policy+reward+MPPI+SimNorm, consistency gated per task (on for dense,
off for Hop-like). Open improvement bets: value stabilization (XQL/Maclaurin-style robust losses on the Q-target),
better data-side exploration (the P1 result says this is THE lever on conjunctive tasks), adaptive UTD.</li>
  <li><strong>The exploration lever</strong> — SAC dies on Hop by entropy dosage; we win by annealed data-noise. Is there a principled
scheduler (e.g., noise scaled by TD-error or by standing-component saturation)? Cheap to gate, high paper value.</li>
  <li><strong>The reward-conjunctivity knob</strong> — <code class="language-plaintext highlighter-rouge">HOP_REWARD_MODE</code> generalizes: any product-of-tolerances env can be
additive-ized. A conjunctivity→wall-depth <em>law</em> across envs is a benchmark-design contribution (Paper 3 stretch).</li>
  <li><strong>The VSB diagnostic as a tool</strong> — return(D) as a per-task compressibility fingerprint; predicts where abstraction
can/cannot help before you spend a week training one.</li>
</ul>

<p><strong>How to hand me an idea:</strong> one sentence of mechanism (“X should help because Y”), which arm-pair tests it, which
task ordering it predicts, and what number kills it. I’ll take it from there — gate, smoke, launch, ledger — and
you’ll see it in the live log with your criterion applied.</p>

<p><em>Companion docs: Part 15 (living revision plan + log), Part 16 (validity audit), the append-only ledger in the
paper repo. Everything in this book is as of 2026-07-10; the live log supersedes it where they disagree.</em></p>]]></content><author><name></name></author><summary type="html"><![CDATA[A from-scratch tutorial book for this research program: what TD-MPC2 actually is (the five losses, the latent, the planner), exactly how our JAX reimplementation works and where it deviates from canonical, how the experiment harness runs (env-gates, tags, markers, the ledger), the complete map of what we have established so far with real numbers, and — the point of the whole document — the recipe for proposing a new algorithm or experiment and having it running on the fleet within hours.]]></summary></entry><entry><title type="html">TD-MPC-Glass, Part 14: What Makes HopperHop Unique — the PPO Wall Is a Conjunctive-Reward Artifact</title><link href="https://suuttt.github.io/tdmpc-glass/2026/07/09/tdmpc-glass-part14-hopper-uniqueness.html" rel="alternate" type="text/html" title="TD-MPC-Glass, Part 14: What Makes HopperHop Unique — the PPO Wall Is a Conjunctive-Reward Artifact" /><published>2026-07-09T00:00:00+00:00</published><updated>2026-07-09T00:00:00+00:00</updated><id>https://suuttt.github.io/tdmpc-glass/2026/07/09/tdmpc-glass-part14-hopper-uniqueness</id><content type="html" xml:base="https://suuttt.github.io/tdmpc-glass/2026/07/09/tdmpc-glass-part14-hopper-uniqueness.html"><![CDATA[<blockquote>
  <p>Two facts about <strong>HopperHop</strong> sit in tension. It is the <strong>sharpest categorical PPO wall</strong> in our 16-task benchmark
(tuned PPO reaches 0/5 seeds ≥ 200 at 472M steps), <em>and</em> it is the <strong>only task where TD-MPC2’s world-model
(consistency) loss is removable</strong> (n=8). How is the hardest task for PPO the one where the “world model” is
dispensable? This post answers it — by reading the environment, mapping four candidate mechanisms onto the
literature, and running the decisive experiment. The punchline: <strong>HopperHop’s PPO wall is a conjunctive-reward
design artifact</strong>, and that <em>sharpens</em> our earlier critique rather than weakening it.</p>
</blockquote>

<h2 id="reading-the-environment-first-the-step-everyone-skips">Reading the environment first (the step everyone skips)</h2>

<p>Before benchmarking an algorithm on HopperHop, look at what the task actually rewards and terminates on
(<code class="language-plaintext highlighter-rouge">mujoco_playground/_src/dm_control_suite/hopper.py</code>):</p>

<ul>
  <li><strong>No early termination.</strong> <code class="language-plaintext highlighter-rouge">done = isnan(qpos) | isnan(qvel)</code> — that’s it. Falling over does <strong>not</strong> end the
episode; it just stops paying reward. (Unlike Gym-Hopper, which terminates on torso drop.)</li>
  <li><strong>A conjunctive, multiplicative reward.</strong> <code class="language-plaintext highlighter-rouge">reward = standing × hopping</code>, where
<code class="language-plaintext highlighter-rouge">standing = tolerance(height, (0.6, 2))</code> and <code class="language-plaintext highlighter-rouge">hopping = tolerance(speed, bounds=(2.0, ∞))</code>. You earn reward <strong>only
when you are simultaneously upright <em>and</em> moving ≥ 2 m/s.</strong> Until then, the product is ≈ 0.</li>
</ul>

<p>That second point is the whole story. HopperHop’s difficulty is not a fragile termination condition — it is a
<strong>sparse-in-practice conjunction</strong>: the agent gets essentially no gradient signal until it solves <em>both</em> sub-tasks
at once. That is exactly the structure on-policy methods struggle with.</p>

<h2 id="four-mechanisms-mapped-to-the-literature">Four mechanisms, mapped to the literature</h2>

<p>Our reference set names four ways HopperHop is unusual; three intersect directly with our data.</p>

<ul>
  <li><strong>H1 — contact-critical value cliffs</strong> (Omura et al. 2024, <em>Stabilizing Extreme Q-learning</em>; Sujit et al. 2022,
<em>Reducible Loss</em>). Underactuation + fall = sharp discontinuities in value; the informative transitions are
liftoff/landing. On-policy Monte-Carlo/GAE advantages are high-variance across these cliffs; off-policy TD
bootstrapping + replay is robust. <em>Our evidence:</em> the wall needs contact-criticality — contact-free-but-unstable
AcrobotSwingup has <strong>no</strong> PPO wall.</li>
  <li><strong>H2 — narrow stability basin / underactuation</strong> (all four papers). The balance-maintaining region of policy space
is tiny; success is rare and surrounded by failure. On-policy discards rare success; off-policy replay keeps it.</li>
  <li><strong>H3 — benchmark-design artifact</strong> (Voelcker et al. 2024, <em>Can we hop in general?</em>). Hopper’s reward/termination
are load-bearing; design choices can invert algorithm rankings. <strong>This is the one we test below.</strong></li>
  <li><strong>H4 — exploration-hard but execution-simple</strong> (ours). The gait is hard to <em>find</em> (contact-critical, conjunctive)
but easy to <em>execute</em> (a low-dimensional limit cycle needing no accurate multi-step rollout) — which is why the
<strong>world model is removable</strong> even though the wall is high. <em>Our evidence:</em> consistency-off matches full (n=8);
planning-without-the-world-model adds nothing (at 5M, stripped-Hop π ≥ MPPI); the stripped model still trains to
full.</li>
</ul>

<h2 id="the-decisive-experiment-h3-env-gate-the-reward-re-run-ppo">The decisive experiment (H3): env-gate the reward, re-run PPO</h2>

<p>We added two env-gated knobs to <code class="language-plaintext highlighter-rouge">hopper.py</code> (byte-identical when unset): a <strong>reward mode</strong> (<code class="language-plaintext highlighter-rouge">product</code>, the default,
vs <strong><code class="language-plaintext highlighter-rouge">sum</code></strong> = <code class="language-plaintext highlighter-rouge">0.5·standing + 0.5·hopping</code>, a <em>non-conjunctive</em> reward) and a <strong><code class="language-plaintext highlighter-rouge">HOP_SPEED</code></strong> override. Then we ran
tuned PPO on HopperHop under each, seed 50, 20M steps:</p>

<table>
  <thead>
    <tr>
      <th>PPO variant</th>
      <th>reward structure</th>
      <th>final return</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>default</strong> (control)</td>
      <td>product <code class="language-plaintext highlighter-rouge">standing × hopping</code></td>
      <td><strong>0</strong> — the wall</td>
    </tr>
    <tr>
      <td><strong>additive</strong></td>
      <td><code class="language-plaintext highlighter-rouge">0.5·standing + 0.5·hopping</code></td>
      <td><strong>135</strong> — climbs off zero</td>
    </tr>
    <tr>
      <td><strong>product, <code class="language-plaintext highlighter-rouge">HOP_SPEED=1.0</code></strong></td>
      <td>product, <em>easier</em> hop threshold</td>
      <td><strong>1</strong> — wall persists</td>
    </tr>
    <tr>
      <td>tdmpc2 additive (control)</td>
      <td>additive</td>
      <td>467 — TD-MPC2 fine</td>
    </tr>
  </tbody>
</table>

<p>The result is clean and mechanistically specific:</p>

<ul>
  <li>Under the <strong>additive</strong> reward, PPO <strong>climbs off zero with a steadily rising curve</strong> (0 → 135 at 20M, not yet
plateaued: 3, 17, 29, 87, 92, 102, 77, 89, 113, 131, 94, 135) — because partial standing now pays, giving the
on-policy gradient something to climb. To be precise: 135 is still well below even the standing <em>component’s</em>
ceiling (~500 under the additive scaling), so PPO has gained <em>learnable signal</em>, not solved the task — the
contrast with the product reward’s flat 0 is the finding, not the absolute level.</li>
  <li>Under the <strong>product</strong> reward, PPO stays <strong>walled</strong> — <em>and lowering the hop-speed threshold does not help</em> (0 → 1).
So the barrier is the <strong>conjunction itself</strong> (near-zero return until both sub-tasks are solved together), <strong>not</strong>
the hop-speed magnitude, <strong>not</strong> early termination (there is none), and <strong>not</strong> a fundamental PPO limitation.
(Technical footnote: <code class="language-plaintext highlighter-rouge">HOP_SPEED=1.0</code> also halves the tolerance <em>margin</em> — <code class="language-plaintext highlighter-rouge">margin = HOP_SPEED/2</code> — so this variant
is “easier threshold, narrower shaping band”; the flat result is consistent with the conjunction story either way,
but a margin-controlled variant would be the cleaner isolation for the paper version.)</li>
</ul>

<p>Off-policy TD + replay (SAC, TD-MPC2) tolerate exactly this conjunctive-sparse structure — they retain the rare
joint-success transitions and bootstrap value across the cliffs — which is why they clear a wall that on-policy PPO
cannot.</p>

<h2 id="why-this-sharpens-the-part-12-critique">Why this <em>sharpens</em> the Part-12 critique</h2>

<p><a href="../2026-07-08-tdmpc-glass-part12-hopper-critique/">Part 12</a> argued that TD-MPC2’s flagship HopperHop win is
mechanistically a <strong>TD-learning-and-planning win, not a world-model win</strong> — because the world model is removable
there, and stripping it still beats SAC’s speed (Q1 isolation), while planning-without-the-world-model adds nothing.
H3 doesn’t overturn that; it <strong>qualifies the wall itself</strong>:</p>

<blockquote>
  <p>TD-MPC2’s <em>“categorical PPO wall on HopperHop”</em> is <strong>conditional on the standard DMC conjunctive reward.</strong> It is an
<strong>on-policy-vs-off-policy exploration gap</strong> manufactured by multiplicative-sparse reward structure — not evidence
that PPO fundamentally cannot hop. Change the reward to additive and the “wall” softens immediately.</p>
</blockquote>

<p>That is the honest, rigorous framing Voelcker calls for: report <em>why</em> the wall exists (conjunctive reward × on-policy
exploration) and <em>what it is conditional on</em>, rather than presenting it as a raw capability gap.</p>

<h2 id="the-full-mechanistic-account-of-what-makes-hopperhop-unique">The full mechanistic account of “what makes HopperHop unique”</h2>

<p>Putting the pieces together:</p>

<ol>
  <li><strong>The wall (exploration side).</strong> HopperHop’s reward is a <strong>conjunctive product</strong> of two hard sub-tasks with <strong>no
early termination</strong> to shape it — a sparse-in-practice signal that starves on-policy PPO’s advantage estimates
(H1 cliffs, H2 narrow basin). Off-policy TD+replay tolerates it. <em>H3 confirms the reward structure is the wall.</em></li>
  <li><strong>The removable world model (execution side).</strong> Once found, the hopping gait is a <strong>low-dimensional limit cycle</strong>
the policy executes without accurate multi-step latent rollouts — so the consistency loss is dispensable (H4),
and planning-over-the-world-model adds nothing.</li>
  <li><strong>The attribution.</strong> Stripped-TD-MPC2 (no world model) still beats SAC’s speed → the win is the <strong>off-policy TD
actor-critic + planning operator</strong>, not the world model. And the contrast task confirms the boundary: on
<strong>WalkerRun</strong> the world model is <strong>load-bearing</strong> (stripping it costs −7.5%), because there the <em>return level</em>
needs accurate rollouts — exactly where Hop differs.</li>
</ol>

<p>So HopperHop is unique because it sits at the intersection of <strong>conjunctive-sparse reward + underactuation +
contact-criticality</strong>, which makes it <em>exploration-hard for on-policy methods</em> while leaving the <em>executed behavior
simple enough that the world model is redundant.</em> That single intersection explains both facts we started with.</p>

<h2 id="caveats-and-next-probes">Caveats and next probes</h2>

<p>This H3 run is n=1/variant at 20M (PPO’s additive-reward curve is still rising — 135 is a lower bound, not the
asymptote); we’d add seeds and longer budgets for a paper claim, and the additive reward makes standing-alone
rewarding (so “PPO climbs” partly means “PPO learns to stand”), which is precisely the point — the conjunction is
what withheld all signal. The remaining probes from the plan are the <strong>value-cliff correlation</strong> (H1, across the
16-task benchmark) and the <strong>basin-width</strong> measurement (H2); both would turn this from “the reward is the wall” into
a quantitative law relating conjunctivity/cliffiness to the on-policy wall depth.</p>

<hr />

<p><em>References:</em> Omura, Osa, Mukuta &amp; Harada (2024), <em>Stabilizing Extreme Q-learning by Maclaurin Expansion</em>; Sujit,
Nath, Braga &amp; Kahou (2022), <em>Prioritizing Samples in Reinforcement Learning with Reducible Loss</em>
(<a href="https://arxiv.org/abs/2208.10483">arXiv:2208.10483</a>); Cho, Kim, Lee &amp; Hong (2024), <em>Meta-Controller</em>
(<a href="https://arxiv.org/abs/2412.12147">arXiv:2412.12147</a>); Voelcker, Hussing &amp; Eaton (2024), <em>Can we hop in general? A
discussion of benchmark selection and design using the Hopper environment</em>
(<a href="https://arxiv.org/abs/2410.08870">arXiv:2410.08870</a>).</p>]]></content><author><name></name></author><summary type="html"><![CDATA[HopperHop is the sharpest PPO wall in our benchmark and, simultaneously, the only task where TD-MPC2's world-model loss is removable. This post resolves that tension with a literature-grounded, four-mechanism account and a decisive controlled experiment. Reading the actual environment shows HopperHop has no early termination — its wall comes from a conjunctive, multiplicative reward (standing × hopping). We then env-gate the reward and re-run tuned PPO: under an additive reward PPO climbs off zero; under the product reward it stays walled even with an easier hop-speed threshold. So the 'categorical PPO wall' is a reward-design property, not a fundamental capability limit — which sharpens (not undermines) the Part-12 critique that TD-MPC2's Hopper win belongs to its off-policy TD value pathway, not its world model.]]></summary></entry><entry><title type="html">TD-MPC-Glass, Part 15: Revision Plan &amp;amp; Live Log — Integrating the New Findings into Papers A &amp;amp; 3</title><link href="https://suuttt.github.io/tdmpc-glass/2026/07/09/tdmpc-glass-part15-revision-plan.html" rel="alternate" type="text/html" title="TD-MPC-Glass, Part 15: Revision Plan &amp;amp; Live Log — Integrating the New Findings into Papers A &amp;amp; 3" /><published>2026-07-09T00:00:00+00:00</published><updated>2026-07-09T00:00:00+00:00</updated><id>https://suuttt.github.io/tdmpc-glass/2026/07/09/tdmpc-glass-part15-revision-plan</id><content type="html" xml:base="https://suuttt.github.io/tdmpc-glass/2026/07/09/tdmpc-glass-part15-revision-plan.html"><![CDATA[<blockquote>
  <p><strong>📋 Living plan + log</strong> (started 2026-07-09). We already have three drafted papers; the new findings from Parts
9–14 mostly <em>strengthen</em> two of them rather than justify a fourth. This post records the integration plan, the
narrative upgrade, the one open mechanism question we still owe, the positive artifacts that keep these from being
pure-null papers, and the experiment schedule. The <strong>Live log</strong> at the bottom is updated in place as runs complete.</p>
</blockquote>

<h2 id="the-decision-integrate-dont-spawn">The decision: integrate, don’t spawn</h2>

<p>The findings we’ve accumulated — the value-sufficiency curve, the bisimulation / reweighting / bottleneck nulls, the
Hopper conjunctive-reward result, the planning-vs-world-model dissection — overlap almost entirely with two papers we
have already drafted:</p>

<ul>
  <li><strong>Paper A — <em>“When Is Explicit Abstraction Redundant for a World Model? A Negative Criterion.”</em></strong> The redundancy /
value-sufficiency story.</li>
  <li><strong>Paper 3 — <em>“The Anatomy of ‘Beating PPO’: Exploration Walls, the Value Pathway, and the World Model.”</em></strong> The
dissection / attribution story.</li>
</ul>

<p>(A third, <em>“Abstraction is a Speed-of-Learning Lever, not a Capacity Lever,”</em> is untouched by the new work.)</p>

<p>So the plan is to <strong>upgrade A and 3</strong> — and, importantly, to make each <em>more convincing and less purely-negative</em>.</p>

<h2 id="narrative-upgrade">Narrative upgrade</h2>

<h3 id="paper-a--from-our-criterion-failed-to-we-built-the-right-instrument">Paper A — from “our criterion failed” to “we built the right instrument”</h3>

<p>Paper A already contains a strong, honest negative: the tempting way to certify value-sufficiency — a linear
decode-\(R^2\) — is <strong>invalid</strong> (it saturates at ≈0.98 for a strong <em>and</em> a collapsed policy; the return-to-go
\(R^2\) even <em>anti</em>-correlates with performance). But the arc ends deflating: “a valid probe is still open.”</p>

<p>The <strong>value-sufficient bottleneck (VSB)</strong> closes exactly that gap. Instead of decoding value off the latent, force
the value and policy heads to read only the first \(D\) of the 512 latent dimensions and measure return\((D)\).
That is a <em>behavioral</em> measurement of how much of the latent the value pathway actually needs. New three-act arc:</p>
<ol>
  <li><strong>The trap</strong> — why decode-\(R^2\) can’t certify sufficiency (existing result).</li>
  <li><strong>The instrument</strong> — VSB: return\((D)\) is smooth, monotone, and distributed; <em>no small sufficient subspace</em>,
and <em>no imposed structure beats the vanilla distributed latent</em>.</li>
  <li><strong>The verdict on three legs</strong> — redundancy holds because the latent is <em>behaviorally</em> value-sufficient: <strong>theory</strong>
(the basis-change/data-processing proposition) + <strong>instrument</strong> (VSB) + <strong>breadth</strong> (the null campaign, now four
taxa: added SE/graph, reweighted VAC/URC, metric bisimulation, architectural bottleneck).</li>
</ol>

<h3 id="paper-3--from-a-wall-exists-to-heres-why-and-what-the-world-model-actually-does">Paper 3 — from “a wall exists” to “here’s why, and what the world model actually does”</h3>

<p>Paper 3 characterizes the HopperHop PPO wall but does not explain it, and leaves the world model as merely “the
mildest cut.” Two upgrades:</p>
<ul>
  <li><strong>Explain the wall.</strong> Reading the environment, HopperHop has <strong>no early termination</strong> and a <strong>conjunctive,
multiplicative reward</strong> (<code class="language-plaintext highlighter-rouge">standing × hopping</code>). Env-gating the reward shows PPO <strong>escapes under an additive reward</strong>
but <strong>stays walled under the product even with an easier hop threshold</strong> — so the wall is the <em>conjunction</em>, a
benchmark-design property, not a capability limit (the Voelcker caveat, confronted head-on).</li>
  <li><strong>Resolve the world model’s role.</strong> Not “mildest cut” but a <strong>task-conditional rollout regularizer</strong> — <em>removable
on the very task it is celebrated for</em> (HopperHop, n=8) and load-bearing only where precise multi-step rollouts set
the return level (Walker/Cheetah/Acrobot).</li>
</ul>

<h2 id="the-sharpest-open-question-point-1-if-the-world-model-is-removable-why-is-td-mpc2-near-sota-on-hopperhop">The sharpest open question (Point 1): if the world model is removable, why is TD-MPC2 near-SOTA on HopperHop?</h2>

<p>Removing the <em>consistency loss</em> removes the objective that makes the latent an accurate <strong>predictor</strong> — it does not
remove the <strong>planner</strong>. TD-MPC2 differs from SAC in two things: MPPI planning, and the value architecture. Our
working hypothesis:</p>

<blockquote>
  <p>TD-MPC2’s HopperHop edge is <strong>off-policy TD value learning + MPPI acting as a <em>structured explorer</em> during data
collection</strong> — not the predictive accuracy of the world model. On a conjunctive-reward wall the hard part is
<em>finding</em> the joint standing+hopping behavior; MPPI’s population-based, value-greedy action search finds it faster
than SAC’s local Gaussian noise (TD-MPC2 ~1M ≫ SAC ~8M ≫ PPO walls). The consistency objective is redundant because
MPPI only needs the model to <em>rank actions by value</em>, not to roll out accurately.</p>
</blockquote>

<p>This is <strong>not yet proven</strong> — it is the paper’s key remaining experiment (<strong>P2</strong> below): TD-MPC2 with <strong>policy-only
data collection</strong> (MPPI disabled during rollouts). If it collapses toward SAC’s slow curve, MPPI-as-explorer is the
edge; if it still beats SAC, the edge is the value architecture. Either way, this converts Paper 3’s thesis from a
negative (“no level advantage”) into a positive mechanism.</p>

<h2 id="positive-artifacts-so-these-are-not-pure-null-papers">Positive artifacts (so these are not pure-null papers)</h2>

<ul>
  <li><strong>Paper A → the VSB diagnostic.</strong> A valid, checkpoint-cheap probe for value-sufficiency that predicts whether an
abstraction objective can help on a given task/model — the correct replacement for the invalid decode-\(R^2\).</li>
  <li><strong>Paper 3 → the reward-conjunctivity benchmark knob + exploration-wall law.</strong> The env-gated reward-structure
variants (conjunctive ↔ additive) packaged as a controlled axis for probing exploration under conjunctive
sparsity, plus the predictive statement <em>reward-conjunctivity → on-policy wall depth</em>.</li>
  <li><strong>Stretch (either) → a world-model-necessity predictor:</strong> a checkpoint signal (k-step rollout-error / removability)
that flags where the consistency loss is redundant — a compute-saving gate.</li>
</ul>

<h2 id="experiments-gpu-schedule-estimate">Experiments, GPU schedule, estimate</h2>

<p>A 5M TD-MPC2 run ≈ 5–6 h on a 3060 (4 concurrent/box); PPO (brax) is minutes. <strong>b3060b cannot build HopperHop</strong>
(mjx-warp dependency); <strong>b3060 is the Hopper box</strong>.</p>

<table>
  <thead>
    <tr>
      <th>#</th>
      <th>Experiment</th>
      <th>Paper</th>
      <th>Box</th>
      <th>Wall est.</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>A1</td>
      <td>VBN value-sufficiency curve → <strong>n=5</strong> (Cheetah/Walker/Acrobot)</td>
      <td>A</td>
      <td>b3060b</td>
      <td>~2 d</td>
    </tr>
    <tr>
      <td>P4</td>
      <td>Sufficiency grid → <strong>n=5</strong> (pin removable/load-bearing %)</td>
      <td>3(+A)</td>
      <td>both</td>
      <td>~1.5 d</td>
    </tr>
    <tr>
      <td>P2</td>
      <td><strong>MPPI-as-explorer ablation</strong> (policy-only collection) — <em>build + runs</em></td>
      <td>3</td>
      <td>b3060</td>
      <td>~1.5 d</td>
    </tr>
    <tr>
      <td>P1</td>
      <td><strong>SAC-core isolation</strong> (SAC actor-critic + WM/MPPI) — <em>build + runs</em></td>
      <td>3</td>
      <td>b3060</td>
      <td>~2 d</td>
    </tr>
    <tr>
      <td>P3</td>
      <td>H3 seeds + 2nd conjunctive-reward task (n=5)</td>
      <td>3</td>
      <td>b3060</td>
      <td>~1.5 d</td>
    </tr>
    <tr>
      <td>A2</td>
      <td><em>(stretch)</em> OOD/compositional value-decodability probe</td>
      <td>A</td>
      <td>b3060b</td>
      <td>~1 d</td>
    </tr>
  </tbody>
</table>

<p><strong>Two-day scheduling target:</strong> Days 1–2 — builds (SAC-core, MPPI-disable flag) + launch A1 (b3060b) and P4 (b3060);
begin drafting both reframed abstracts + section skeletons. Then P2/P1/P3 roll behind on b3060, A2 behind A1 on
b3060b. <strong>Honest total to n≥5 with the positive artifacts: ~1.5–2 weeks</strong> including builds, reruns, and slack for
box flakiness. Critical path is <strong>P2</strong> (it answers Point 1).</p>

<h2 id="live-log">Live log</h2>

<ul>
  <li><strong>2026-07-09 15:00</strong> — Plan posted. Launched <strong>A1</strong> (Cheetah VBN width sweep, seed 51 → toward n=5) on b3060b and
<strong>P4</strong> (WalkerRun full-vs-stripped, seeds 70/71 → pins the world-model removable/load-bearing margin) on b3060.
Both 4 arms up, 0 nan at launch. Next: build the <strong>P2</strong> MPPI-disable flag; extend A1 to further seeds/tasks;
begin the Paper A VSB section and the Paper 3 wall-mechanism section. <em>(This log is updated in place as runs land.)</em></li>
  <li><strong>2026-07-09 15:30</strong> — GPU packing: b3060b doubled to <strong>8 jobs</strong> (added Walker VBN s51 alongside Cheetah s51,
2/GPU, mem-fraction 0.35), 100% util both boxes.</li>
  <li><strong>2026-07-09 16:20 — CODE/EXP AUDIT (post-weekly review).</strong> Four faults found and fixed:
<strong>(F1, data-integrity)</strong> the <code class="language-plaintext highlighter-rouge">run_arm.sh</code> jsonl tag lacked the <em>task</em> name (<code class="language-plaintext highlighter-rouge">wmabl_&lt;ablate&gt;_s&lt;seed&gt;</code>), so the
Walker two-axis (s62/63) appended into the <em>Hopper</em> s62/63 jsonl files — the ledgered Hop numbers were harvested
<em>before</em> contamination (benchmark CSVs, which are task-named, remain the durable source), but this explains the
garbage Walker π-vs-MPPI read, and a planned Cheetah batch on s70/71 would have corrupted the live Walker P4 data.
<strong>Fixed:</strong> tag now <code class="language-plaintext highlighter-rouge">wmabl_&lt;TASK&gt;_&lt;ablate&gt;_s&lt;seed&gt;</code> (backup <code class="language-plaintext highlighter-rouge">.bak_tagfix</code>).
<strong>(F2, ops)</strong> heredoc-through-compound-ssh silently failed twice — the Cheetah sufficiency batch <em>never launched</em>,
and the earlier status report mis-attributed the 4-proc count to “compute saturation” instead of a failed launch.
<strong>Fixed:</strong> printf-style drivers; Cheetah full-vs-stripped s70/71 now actually running (b3060 packed to 8 jobs,
task-qualified tags).
<strong>(F3, claim precision)</strong> Part 14’s “PPO escapes the wall” overstated: the additive-reward curve climbs steadily
to 135 at 20M (not plateaued) but is well below even the standing component’s ~500 ceiling — the finding is
<em>learnable signal vs flat zero</em>, not task-solved. Part 14 edited; <code class="language-plaintext highlighter-rouge">HOP_SPEED=1.0</code> margin-coupling footnoted
(margin = speed/2, so that variant is threshold+margin, not threshold-only).
<strong>(F4, paper caveat)</strong> VBN arms compare against van2 baselines run under earlier patch stacks; all env-gates
(VBN/VAC/URC) verified present and default-off (byte-identical when unset) — to be stated in the paper’s setup.
Current fleet: b3060b 8 jobs (Cheetah+Walker VBN s51), b3060 8 jobs (Walker s70/71 + Cheetah s70/71
full-vs-stripped), 0 nan.</li>
  <li><strong>2026-07-10 04:15 — A1 Cheetah s51 done (marker-gated harvest).</strong> True 5M finals <strong>535/582/617/723</strong> (the earlier
pre-completion read 594/572/636/742 is superseded — harvest-at-markers lesson re-learned). Corrected n=2 curve
<strong>516/572/628/738 vs vanilla 855</strong>: <em>strictly monotone</em>, the earlier “16/32 near-tie” was a mid-fluctuation
artifact. Cheetah VBN <strong>s52 launched</strong> on the freed GPUs (→ n=3).</li>
  <li><strong>2026-07-10 08:50 — P4 harvest (+ a b3060 incident).</strong> All 8 b3060 jobs were killed ~08:20 by a host-level event
(no reboot; ssh flapping). Walker died at 4.90M/5M, Cheetah at ~4.55M — harvested at last eval, truncation stated.
<strong>Walker load-bearing margin, n=4: −7.5%</strong> (full 708.2 vs stripped 654.9; ranges non-overlapping) — the historical
−23% is confirmed a seed/version outlier. <strong>Cheetah (truncated, n=2): −19.2%</strong> with wide seed spread (−28%/−9%);
needs full-5M seeds for a paper number.</li>
  <li><strong>2026-07-10 08:55 — P2 pre-build discovery (changes the Point-1 experiment).</strong> Reading the collection loop before
patching it: <strong>our TD-MPC2 implementation already collects data with π+noise — MPPI never touches collection</strong>;
the planner appears only in eval and in an optional MPC-distillation loss. So “MPPI as structured explorer” is
falsified <em>by construction</em> in our stack — every TD-MPC2 result we’ve reported (including the Hopper 6/6-by-1M win)
used policy-only collection. P2 is redefined: if the MPC-distill loss is default-on, ablate <em>it</em> (planning shaping
the policy via imitation); if default-off, the attribution falls to the off-policy TD core itself and <strong>P1
(SAC-core isolation) becomes the decisive experiment</strong>. Also a framing caveat for Part 12 / Paper 3: canonical
TD-MPC2 <em>does</em> collect with the planner; our deviation is itself evidence (planner-collection unnecessary on Hop)
but must be stated.</li>
  <li><strong>2026-07-10 10:45 — fleet incident, P1 leg 1, and the SAC-rescue arm.</strong> (i) <em>Incident:</em> all jobs on both boxes
were killed ~08:00-08:30 (no reboot, no OOM record; external cause unknown; the box-local keep-busy cron that had
double-booked GPUs overnight is now disabled). Everything harvested-honest and relaunched: Walker+Cheetah VBN s52
on b3060b, Cheetah sufficiency s72/73 full-5M on b3060. (ii) <strong>P1 leg 1 (SAC baseline, n=3 @5M): SAC-default never
reaches 200 on HopperHop</strong> (76/23/101) — its auto-tuned entropy coefficient collapses to ~0.003 and the agent
stands forever; stripped-TD-MPC2 on the same stack is 8/8 ≥200. With the planner-free-training discovery, the
attribution sharpens to: <strong>the TD value/actor core itself is the edge.</strong> (iii) <em>Honesty check in flight:</em> our SAC
is a custom v1 with target-entropy −0.5·|A| (half of canonical) — a <strong>rescued-SAC arm</strong> (α-floor 0.05,
canonical −1.0·|A| target) is now running (n=3); if rescue works, the story is “entropy-collapse under conjunctive
reward,” a knob-level failure — not “SAC cannot hop.” Either way it pins the mechanism.</li>
  <li><strong>2026-07-10 14:20 — P1 COMPLETE: the entropy needle (Point 1 answered).</strong> Three SAC arms (n=3 each, 5M, same
stack): auto-α <em>collapses</em> to ~0.003 and lands in the <strong>stand-trap</strong> (76/23/101 — SAC’s best config, standing but
never hopping); a fixed α-floor of 0.05 (canonical target-entropy) lands in the <strong>noise-trap</strong> (≈0 — persistent
objective-stochasticity swamps the narrow contact-critical stability basin); a fixed 0.01 floor splits between the
two traps (1/0/51). <strong>No entropy configuration threads HopperHop’s conjunctive reward at 5M, while the planner-free
TD-MPC2 core crosses 200 by 1–2M (8/8).</strong> The discriminating axis: SAC bakes stochasticity into the <em>objective</em>;
TD-MPC2 optimizes a <em>deterministic</em> actor objective against a Q-ensemble and injects exploration only into the
<em>data</em>. Scope stated honestly: this is a ≥4–8× sample-efficiency gap, not a capability wall (external SAC hops by
~8M); custom SAC v1. Next: the <strong>Lean+ decomposition</strong> asks which TD-MPC2-side ingredient (UTD, Q-ensemble,
SimNorm latent, noise anneal) carries the speed — and the <strong>H3 margin-controlled PPO variant</strong> (building now)
closes the last reward-design caveat.</li>
  <li><strong>2026-07-10 16:45 — reimplementation-validity audit (user-raised): V1 parity + V2 planner-collection test.</strong>
The user asked the right question: our TD-MPC2 is a from-scratch JAX reimplementation that collects data with
π+noise, where canonical TD-MPC2 collects with the planner — <em>have we ever checked it against the original?</em>
<strong>V1 (done):</strong> we pulled the official per-task results from the TD-MPC2 repo. On hopper-hop our variant matches the
canonical level (official 449 mean, seeds 373–594 @4M vs ours ~420±113, mppi ~571) — and the official <strong>SAC</strong>
reference (0/246/105 @4M, 1/3 seeds ever ≥200) sits right on top of our custom SAC v1 (76/23/101), so the P1
“SAC fails on Hop” result is not an implementation artifact. Where our variant <em>is</em> weaker (Walker −17%,
Acrobot −23%, Cheetah −5%, Hop ≈0%), the deficit ordering tracks our measured WM-load-bearing ordering — exactly
what you’d predict if the missing planner-collection matters most where accurate rollouts matter. <strong>V2 (running):</strong>
an <code class="language-plaintext highlighter-rouge">MPPI_COLLECT=1</code> gate now runs {full, stripped} × planner-collection on HopperHop (n=2 each, 2.5M,
512 MPPI samples = the canonical count) — if the stripped model still trains to full <em>under planner-collection</em>,
the Part-12 removability claim holds beyond the implementation deviation; if it collapses, we rescope Part 12 to
policy-collection variants. Wording in Papers A/3 and Part 12 will say “our TD-MPC2 variant (policy-collection)”
until V2 lands.</li>
  <li><strong>2026-07-11 06:30 — overnight batch: the campaign’s crux results all landed.</strong>
(i) <strong>P1 closed</strong> — full SAC entropy grid (auto-α / 0.01 / 0.05, n=3 each) fails on Hop at 5M while the planner-free
TD core is 8/8; validated externally (official SAC reference matches ours). (ii) <strong>H3 margin-controlled variant</strong>:
PPO still walls (2.8/3.6 @20M) with the shaping margin held — the conjunction is the wall, de-confounded. (iii)
<strong>Reimplementation audit published</strong> (Parts 16–17: validity audit + the Handbook). (iv) <strong>V2 — the scoping verdict:
Hop removability SURVIVES canonical-style planner-collection</strong> (full 465.0 vs stripped 465.8 @2.5M, n=2) — Part-12’s
critique holds beyond the deviation; the stripped arm planning over an untrained dynamics net is the strongest
execution-simple evidence yet. (v) <strong>Sufficiency + VSB tables reach paper grade</strong>: Cheetah suff n=4 −23.8%; task
ordering Hop 0 (n=8) &lt; Walker −7.5% (n=4) &lt; Cheetah −23.8% (n=4) &lt; Acrobot −44%; Cheetah VBN n=3 517/576/624/726
vs 855 (strictly monotone per seed); Walker VBN n=3 622/647/669/701 vs 727 (most-compressible signature). In
flight: <strong>V2W</strong> (Walker planner-collection contrast — pre-registered: stripped should degrade where the WM is
load-bearing; ~noon) and <strong>Acrobot VBN s52</strong> (→ n=3 on the least-compressible task).</li>
  <li><strong>2026-07-11 18:15 — day-2 batch: the dissociation confirmed, the grid completed, the next bet designed.</strong>
(i) <strong>V2W confirmed the pre-registered prediction</strong>: under planner-collection the stripped model degrades on
WalkerRun (−16.1%, 722 vs 605, non-overlapping) — the mirror image of Hop’s ±0%. The collection-mode ×
world-model <strong>double dissociation is complete</strong>, and planner-collection turns out to roughly <em>double</em> Walker
sample-efficiency (722 @2.5M ≈ policy-collection @5M), retroactively explaining the V1 official-vs-ours deficits.
(ii) <strong>V2X</strong> (seed-52 extension of the dissociation table to n=3) runs overnight. (iii) <strong>The 3-task
value-sufficiency grid is n=3 complete</strong>: Cheetah 517/576/624/726 vs 855 (smooth-monotone), Walker
622/647/669/701 vs 727 (flat-high — most compressible), Acrobot 258/267/271/428 vs 511 (step-at-128 — least
compressible; tight-width ordering is seed noise, s53 → n=4 tonight). Paper A’s positive-instrument figure is
data-complete. (iv) <strong>Lean+ designed and pre-registered</strong> (ledger 0af60bf): not another robust-loss bet — our
value loss is already two-hot CE — but <em>target-EMA smoothing as a replacement for the world model’s anchoring
role</em>, tested on the stripped model’s seed-fragile Cheetah; kill numbers stated; builds when V2X frees the box.</li>
  <li><strong>2026-07-12 04:30 — overnight batch: V2X softens the Walker claim honestly; Acrobot VBN reaches n=4.</strong>
(i) <strong>V2X (dissociation at n=3)</strong>: Hop’s stripped≈full is rock-solid (+1.4%, three tight seeds), but Walker’s
s52 <em>full</em> arm collapsed to 455 (vs 758/686 on s50/51) while the stripped arms stayed tight (601/610/600) —
the full-model arm is bimodal under planner-collection. On medians the dissociation stands (−12.5% Walker vs
≈0 Hop); we softened the claim to median-based and launched a seed-53 resolving pair rather than over-claiming.
(ii) <strong>Acrobot VBN n=4</strong>: 261/271/282/397 vs vanilla 511 — the step-at-128 persists but narrows (84%→78%),
and s53 is the second consecutive seed where D=128 is not dominant (304 ≈ D=64’s 316). Updated claim: tight
widths flat at 51–55%; D=128 alone recovers a large fraction, with wide seed variance on the step size.
(iii) In flight: <strong>Lean+</strong> (target-EMA-as-WM-anchor on stripped Cheetah, 6 arms, verdict ~evening), the V2W
seed-53 resolving pair (~morning), and Cheetah/Walker VBN seed-53 (→ n=4 on all three tasks).</li>
  <li><strong>2026-07-12 12:40 — midday batch: the dissociation resolves at n=4, and Lean+ returns an informative null.</strong>
(i) <strong>V2W seed-53 settled the Walker question</strong> (ledger 377e319, Part-16 update 3): full 744.7 vs stripped 558.3 —
3 of 4 full seeds cluster 686–758, and live eval-trajectory watching revealed the real phenomenon: the full arm’s
evals swing ~250 points within a run while the stripped arm’s move ~30. The dissociation is confirmed at n=4
(medians 715.5 vs 600.5, −15.4%) with a variance-aware framing: the WM buys a higher but noisier performance
regime on Walker. (ii) <strong>Lean+ verdict — null, as pre-registered kill criteria demanded honesty</strong>: target-EMA
smoothing on the stripped model (596.9, n=3) does not beat the control (607.1) and misses the ≥620 gate; it does
halve seed variance. Conclusion: the world model’s dense-task contribution is predictive structure, not mere
target stabilization — the lightweight-TD-MPC2 recipe stays “strip only where removable.” (iii) <strong>Refills</strong>:
V2W s54 (Walker n=5), V2H s53 (Hop n=4), and V2C s50/51 (Cheetah joins the dissociation table; pre-registered
prediction: stripped degrades ≥15% under planner-collection, kill if &lt;8%). All 8 GPUs busy.</li>
  <li><strong>2026-07-12 22:30 — THE VSB GRID IS n=4 COMPLETE. Paper A’s central figure is data-final.</strong> Walker seed-53
landed on the curve (610.7/618.2/648.9/674.9), closing the third task. The figure at n=4: <strong>Cheetah</strong>
544/588/630/727 vs 855 (64→85%, strictly monotone — a smooth information gradient where every doubling of the
value-bottleneck width buys more); <strong>Walker</strong> 619/640/664/694 vs 727 (85→96%, flat-high — the most compressible
task, D=16 already retains 85%); <strong>Acrobot</strong> 261/271/282/397 vs 511 (51→78%, tight widths flat, only D=128
recovers substantially — the least compressible). Three qualitatively distinct fingerprints, ordered exactly like
the sufficiency table (Walker −7.5% &lt; Cheetah −23.8% &lt; Acrobot −44%) — the instrument and the ablation agree.
Also today: the GWM line was reviewed pre-box-retirement and stays closed (Part-18 lab notebook, with the one
banked SOLD-Distinct follow-up). In flight overnight: n=5 seeds on all Cheetah and Walker widths; the V2W s54
(Walker dissociation n=5), V2H s53 (Hop n=4), and pre-registered V2C Cheetah planner-collection pairs on b3060.</li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[A working plan (and running log) for the next two days: fold the value-sufficiency curve, the bisim/reweighting/bottleneck nulls, the Hopper conjunctive-reward result, and the planning-vs-world-model dissection into our two existing papers — the redundancy-criterion paper (A) and the beating-PPO anatomy paper (3) — rather than spinning a fourth. It records the narrative upgrade for each paper, resolves the sharpest open question (if the world model is removable, what makes TD-MPC2 near-SOTA on HopperHop?), commits to a positive artifact per paper so these are not pure-null results, and lays out the exact experiments, GPU schedule, and time estimate. Updated in place as runs land.]]></summary></entry></feed>