Skip to content

feat(worldmodel): additive task channels — representation repaired, control unmoved - #62

Merged
aurascoper merged 1 commit into
mainfrom
fix/additive-task-channels
Aug 2, 2026
Merged

feat(worldmodel): additive task channels — representation repaired, control unmoved#62
aurascoper merged 1 commit into
mainfrom
fix/additive-task-channels

Conversation

@aurascoper

Copy link
Copy Markdown
Owner

Node 20's structural candidate. c0 = alpha·(1 + 0.10·pos)c0 = 1.0 + pos, likewise c1/vel. _step untouched.

No tunable constant. JEPATransitionDataset z-scores every feature on train statistics, so any gain divides straight back out; the 1.0 is a DC offset for positivity that the same z-scoring removes. This restores _render_state's own stated intent — its comment already claimed these two channels carry the task factors.

Gates — registered before implementing, including G5

gate result
G1 raw probe pos 1.0000, vel 1.0000
G2 oracle ladder 100.0 / 91.5 / 73.5 / 37.0 / 34.5 — bit-identical ✅ dynamics untouched
G3 alphaPower post|pre 1.000, unchanged declared in advance as not addressed
G4 chi recoverable 0.6849
G5 (the gate node 20 lacked) below

G5 — factor recovery under the incumbent objective, 3 seeds

factor node 20 baseline after
pos 0.6065 0.9824 task
vel 0.0227 0.9740 task
chi 0.9566 0.7660 nuisance
peak_amp 0.9947 0.8859 nuisance

The encoder inverted its priorities exactly as intended — task up, nuisance down. vel went from unencoded to near-perfect.

Action recovery transformed

ax −0.1676 → +0.8309, ay −0.1199 → +0.3709, mode_bit still −0.2807 so the negative control holds. Node 18's "no recoverable action information" is fully resolved.

The frame offset also improved 16× without being targeted: node 14's A/B ratio 70.6 → 4.25.

And control did not move

before after
mpc_success 0.35 0.353 ±0.034 (random 0.361)
log-ratio +0.0886 +0.0582 (zero-action +0.0341)
planner correlation +0.0375 −0.0206
sign agreement 45.5% 49.0%
|produced| / |needed| 33% 31%

Still at chance, still worse than doing nothing. The planner remains uninformative on a representation that now contains what it needs.

Verdict

Keep the repair — it passed every gate and fixed a real, measured defect. But nodes 17–19's diagnosis is necessary but not sufficient.

This is the third defect found, fixed, and followed by no change in control: the frame offset (node 14), the benchmark's resolving power (node 15), and now the action channel (nodes 17–19). Each was real. None was binding. That pattern is itself the finding — the control failure is not one broken component.

Next suspect, with evidence

Rollout error compounds 11.3× to 17.4× from h=1 to h=8 while horizon=6:

seed 0   1-step 0.00103   h=8 0.01734   17.4x
seed 1   1-step 0.00161   h=8 0.02302   14.8x
seed 2   1-step 0.00164   h=8 0.02898   11.3x

A CEM plan feeds the predictor its own output for six steps, so the cost being minimised may be computed on a state that does not match the trajectory executed.

Test named: score the CEM against a rollout through the true env on the same episodes and plans. If control jumps, the predictor's rollout is the bottleneck; if not, the fault is in the cost or the goal latent, not the forward model.

Verified: generator and forward_eval smoke tests pass; ledger and ADR gates green.

…ontrol unmoved

Ledger node 21. Node 20's structural candidate: give pos/vel their own additive
observation channels instead of leaving them as small multiplicative modulations
on the nuisance carriers.

  c0 = alpha * (1 + 0.10*pos)  ->  c0 = 1.0 + pos
  c1 = beta  * (1 + 0.10*vel)  ->  c1 = 1.0 + vel

_step untouched. NO TUNABLE CONSTANT: JEPATransitionDataset z-scores every
feature on train statistics, so any gain divides straight back out; the 1.0 is a
DC offset for positivity that the same z-scoring removes. This restores
_render_state's own stated intent -- its comment already claimed these two
channels carry the task factors.

G1-G5 registered before implementing, INCLUDING G5, the gate node 20 lacked.

  G1  raw probe   pos 1.0000  vel 1.0000                    PASS
  G2  oracle ladder BIT-IDENTICAL 100.0/91.5/73.5/37.0/34.5 PASS
  G3  alphaPower post|pre still 1.000 -- NOT addressed, declared in advance
  G4  chi still recoverable 0.6849                          PASS
  G5  factor recovery under the incumbent objective:
        pos 0.6065 -> 0.9824      vel 0.0227 -> 0.9740      PASS
        chi 0.9566 -> 0.7660      peak_amp 0.9947 -> 0.8859

The encoder inverted its priorities exactly as intended: task up, nuisance down.

ACTION RECOVERY TRANSFORMED. ax -0.1676 -> +0.8309, ay -0.1199 -> +0.3709, with
mode_bit at -0.2807 so the negative control still holds. Node 18's "no
recoverable action information" is fully resolved. The frame offset also improved
16x without being targeted: node 14's A/B ratio 70.6 -> 4.25.

AND CONTROL DID NOT MOVE. mpc_success 0.353 +/- 0.034 against a random baseline
of 0.361; log-ratio +0.0582 against zero-action's +0.0341. Still at chance, still
worse than doing nothing. The planner remains uninformative on a representation
that now contains what it needs: correlation(needed, produced) -0.0206 (was
+0.0375), sign agreement 49.0% (45.5%), producing 0.069 of the 0.222 displacement
required -- 31%, essentially unchanged.

KEEP the repair: it passed every gate and fixed a real, measured defect. But
nodes 17-19's diagnosis is NECESSARY BUT NOT SUFFICIENT.

This is the THIRD defect found, fixed, and followed by no change in control --
the frame offset (node 14), the benchmark's resolving power (node 15), and now
the action channel (nodes 17-19). Each was real. None was binding. That pattern
is the finding: the control failure is not one broken component.

Next suspect now has evidence, not suspicion: rollout error compounds 11.3x to
17.4x from h=1 to h=8 while horizon=6, so a CEM plan is scored on a state that
may not match the trajectory executed. Test named: score the CEM against a
rollout through the TRUE env on the same episodes and plans.

Verified: generator and forward_eval smoke tests pass; ledger and ADR gates green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DJJ8y1zo7WSqEmGNW8DQap
@aurascoper
aurascoper merged commit c2d7337 into main Aug 2, 2026
2 checks passed
@aurascoper
aurascoper deleted the fix/additive-task-channels branch August 2, 2026 18:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant