Final Research Report

Agentic Racing Research with PPO and Offline World Models

Yuv Malik, Pablo Echevarria, Matthew Lobo

STAT 4830 Project Repository and Benchmark Record

Abstract

This report documents a reinforcement-learning project that evolved through an autonomous research loop rather than a single fixed implementation. The project began with PPO control for pixel-based racing and later shifted toward an offline recurrent state-space world model when direct control improvements became bottlenecked by representation quality. Throughout the project, the research process itself was agentic: AutoResearch proposed hypotheses, executed targeted configuration changes, screened failures, and promoted only those candidates that survived observation-driven gates.

The PPO phase established a working visual control baseline after early failures such as steering collapse, off-track reward hacking, and no-progress circling were diagnosed and repaired in the training loop. The strongest early AutoResearch single-car result was `run_008`, which reached mean reward `205.46`, mean progress `0.5551`, and off-track rate `0.036` after `49,152` timesteps. A later recursive control branch promoted `g003_c03`, which combined broader brake exploration with a lower corner target speed and reached mean reward `232.58` with mean progress `0.7376`.

The world-model phase was driven by a different question: whether an RSSM could learn a reusable latent dynamics model of racing rather than merely optimize local control. Fixed-architecture experiments from `E1` through `P5` improved corridor persistence, reward faithfulness, and telemetry prediction, culminating in the stable checkpoint `P5_d4_main_telemetry_a100_bs128_e15`. The decisive improvement sequence inside that ladder was the telemetry pivot `P3 -> P4 -> P5`, which converted the project from generic visual continuation into physics-aware prediction. However, the primary unresolved failure mode remained sharp-turn future dynamics. Later data, objective, and structural ablations were therefore valuable mainly as negative evidence: they demonstrated that curated turn-heavy replay, perceptual or progress-only objective tweaks, a wider stochastic latent, and a lightweight world-motion factorization were insufficient to solve turn evolution.

The central contribution of the repository is thus a transparent benchmark record of hypothesis-driven iteration. The strongest result is not a single headline number but a reproducible chronology: PPO became operational through explicit bug repair and AutoResearch-guided reward tuning, while the world-model branch clarified that future progress most likely requires explicit pose evolution rather than additional fixed-objective training on the existing RSSM family.

1. Agentic Research Loop

The project was organized as a repeated Reasoning -> Action -> Observation cycle. In the PPO branch, the cycle was implemented by AutoResearch over candidate training programs and reward-shaping variants. In the world-model branch, the same logic appeared as a sequence of explicit intervention memos, benchmark summaries, and promotion gates. This matters methodologically: the repository is not merely a final model dump, but a record of which hypotheses survived contact with the simulator.

Formally, let the research state at iteration k be s(k), the proposed code or configuration change be a(k), and the resulting measured telemetry be o(k). The agentic loop can be summarized as

h(k) = π(s(k)),  a(k) = f(h(k)),  o(k) = Eval(a(k)),  s(k+1) = U(s(k), o(k)).

Here π denotes hypothesis generation, f denotes the concrete intervention, and U denotes promotion, rejection, or reframing after evaluation.

2. PPO Control Stack

The control branch used PPO on `96 x 96` RGB observations with continuous steering, throttle, and brake actions. The maintained local policy implementation used a tanh-squashed Gaussian actor with corrected log-probabilities, together with separate multilayer perceptrons for the policy and value heads. This separation was not a stylistic preference: it followed directly from an early failure analysis in which a shared head allowed value gradients to corrupt policy features.

PPO optimization followed the standard clipped objective,

LCLIP(θ) = Et[ min(rt(θ) Ât, clip(rt(θ), 1 - ε, 1 + ε) Ât) ],   rt(θ) = exp(log πθ(at | st) - log πθold(at | st)).

Returns were estimated with generalized advantage estimation,

Ât = δt + (γλ) δt+1 + ...,   δt = rt + γ V(st+1) - V(st).

The key project lesson from this stage is that apparently small implementation details such as action squashing, bootstrapping across terminal states, and progress computation determined whether PPO behaved as a driver or as a reward hacker. The strongest control results arose only after those low-level pathologies were resolved.

2.1 Developmental History

Stage Evidence Observation Agentic conclusion
Initial baseline `TRAINING_HISTORY.md` records the historical SB3 baseline at `500k` steps with reward `282+`. The simulator and reward scaffold were learnable in principle. Proceed to the custom torch backend instead of abandoning the task definition.
Negative result: GAE bug Early torch run: reward `-1872`, progress `0%`, off-track `100%`. Advantage bootstraps leaked across episode boundaries. Repair the off-by-one in `compute_returns_advantages()`.
Negative result: steering collapse Step `57,344` eval: speed `11.28`, steer variance `0.00000`, progress `0.00%`. A shared `log_std` caused throttle saturation and steering collapse. Introduce per-dimension log-std bounds and higher entropy.
Negative result: shared-head collapse Step `73,728` eval: speed `0.00`, steer variance `0.00000`, fail-fast triggered. Value gradients corrupted the policy representation. Split policy and value MLPs and reduce the value coefficient pressure.
Negative result: reward hacking `best_model_torch.pt`: reward `6861.91`, progress `0.00%`, off-track `100%`. Velocity aligned with track direction yielded reward on grass. Replace surrogate forward reward with actual tile progress and terminate off-track episodes.
Negative result: donut spinning Fast circular motion survived the original stuck detector. Speed-based stuck logic missed high-speed zero-progress behavior. Add no-progress termination and a yaw-rate penalty.
AutoResearch promotion `run_008`: reward `205.46`, progress `0.5551`, speed `28.32`, off-track `0.036`. The torch PPO stack became a credible single-car control baseline. Promote the run and use it as the maintained policy variant.
Recursive pivot `g002_c03` then `g003_c03` in `recursive_cap100`. Brake discovery and earlier corner setup produced the clearest late-stage gain. Promote the branch that lowered `corner_target_speed` and widened brake exploration.

2.2 PPO Benchmark Record

Artifact Reward Progress Off-track Speed Interpretation
SB3 historical baseline `282+` approximately full lap low not logged here Working reference used to validate that the simulator was learnable.
`autoresearch/results/run_008/metrics.json` `205.46` `0.5551` `0.0360` `28.32` Best early AutoResearch single-car promotion.
`autoresearch/results/run_013/metrics.json` `179.83` `0.4967` `0.2370` `28.48` Competitive but inferior to `run_008` on cleanliness.
`autoresearch/results/run_016/metrics.json` `186.50` `0.5089` `0.1163` `28.32` Later strong candidate, still below the promoted run on reward.
`recursive_cap100/g002_c03` `-77.93` `0.6662` `0.4911` `35.49` Useful braking pivot, but not yet a stable positive reward regime.
`recursive_cap100/g003_c03` `232.58` `0.7376` `0.2678` `44.52` Best documented late-stage recursive control result.
`models/v2_progress/best_model_torch.pt` `382.86` `0.9993` `0.6000` not logged here Best whole-track completion reference in `TRAINING_HISTORY.md`.

2.3 AutoResearch Pivots

Reasoning Action Observation
`g002_c03` diagnosed persistent `throttle_saturation_no_brake`. Add `reward_shaping.brake_penalty_scale = 0.01`, `apex_decel_reward_scale = 0.2`, and `apex_decel_reward_cap = 2.0`. Progress rose to `0.6662`, but reward stayed negative because the branch remained too dirty.
`g003_c03` reframed the issue as missing brake exploration and late corner setup. Change `ppo.min_log_std` from `-1.0` to `-0.75` and lower `corner_target_speed` from `8.0` to `7.0`. The branch reached reward `232.58` and progress `0.7376`, which became the best documented recursive promotion.

Listing 1. PPO update loop distilled from `train.py` and `autoresearch/train_ppo.py`.

advantages = normalize(advantages)
for _ in range(n_epochs):
    for batch in rollout_buffer:
        values, new_log_probs, entropy = policy.evaluate_actions(
            batch["obs"], batch["actions"]
        )
        ratio = exp(new_log_probs - batch["old_log_probs"])
        unclipped = batch["advantages"] * ratio
        clipped = batch["advantages"] * clamp(
            ratio, 1.0 - clip_range, 1.0 + clip_range
        )
        policy_loss = -min(unclipped, clipped).mean()
        value_loss = mse(values, batch["returns"])
        entropy_loss = -entropy.mean()
        loss = policy_loss + vf_coef * value_loss + ent_coef * entropy_loss
        optimizer.zero_grad()
        loss.backward()
        clip_grad_norm_(policy.parameters(), max_grad_norm)
        optimizer.step()

3. Multi-Agent Bridge

The move from single-car PPO to multi-agent racing was not a simple increase in the number of cars. It required a change in learning topology, data layout, reward semantics, and evaluation. In the maintained torch stack, the relevant paradigm is explicitly `shared_policy_ippo`: one trained network is reused across all cars, each car receives only its own local image observation, and PPO updates are computed from the union of all per-agent trajectories.

That design choice was pragmatic and statistically efficient. The single-agent policy already encoded useful low-level control priors for throttle, steering smoothness, and corner entry. The multi-agent problem therefore did not require a separate "brain" per vehicle. Instead, it required a way to expose one policy to a richer state distribution in which the same local controller sometimes leads, sometimes drafts, sometimes defends position, and sometimes attempts a pass.

Formally, if car i receives observation oi,t and produces action ai,t, then the policy is shared: πθ(ai,t | oi,t) for every agent i. The PPO objective is still the clipped surrogate, but now it is aggregated over all agent streams:

LMARL(θ) = 1 / M Σi=1M Et[LCLIPi,t(θ)],

where M denotes the total number of active agent streams in the rollout buffer. This is precisely how the implementation behaves: with `n_envs` environments and `num_agents` cars per environment, the rollout buffer is allocated over `n_streams = n_envs * num_agents`, and timesteps are counted per stream rather than per environment.

3.1 Architectural Transition: One Car to Many Cars

Single-agent PPO Shared-policy multi-agent PPO Why the change mattered
One observation tensor for one car. Per-step policy batch assembled from all agent-local observations. The network had to process multiple concurrent local racing situations with one parameter set.
One action vector per environment step. One action vector per car, then reassembled into the simulator action layout. The trainer needed explicit flatten/unflatten logic between policy space and environment space.
Reward measures driving competence. Reward must distinguish pace, positioning, safe proximity, and clean overtaking. Naive reuse of the single-agent reward would encourage contact-heavy shortcut behaviors.
Evaluation focuses on progress and staying on track. Evaluation must also measure rank, overtakes, contact, hook events, and front-gap behavior. Multi-agent competence is partly relational; raw reward alone is insufficient.

Listing 2. Shared-policy rollout topology distilled from `train.py`.

n_envs = env.num_envs
n_streams = n_envs * num_agents
buffer = RolloutBuffer(n_steps, n_streams, obs_shape, action_dim)

obs_policy = obs_to_policy_batch(obs)          # one row per car
raw_action, log_prob, value = policy.act(obs_policy)
env_actions = action_batch_to_env(raw_action)  # regroup by environment

buffer.add(
    obs=obs_policy,
    action=raw_action,
    reward=flatten_transition_array(rewards),
    done=flatten_transition_array(dones),
    value=value,
    log_prob=log_prob,
)

At the code level, this transition is visible in three places. First, `TorchPPOTrainer` infers a multi-agent observation/action contract from the environment and validates it before training. Second, `_collect_rollout()` converts the environment state into a batched per-agent policy tensor, queries a single policy, and then maps the resulting per-agent actions back into the simulator layout. Third, reward, `done`, and value tensors are flattened into per-agent streams so that PPO updates treat all cars as training data for one shared policy.

This is why the multi-agent section should be understood as a true architectural extension rather than a superficial wrapper. The model is still a single visual actor critic, but the training system around it becomes relational and stream-based.

3.2 What Was Preserved from the Single-Agent Stack

One of the strongest engineering decisions in the repository was to preserve the parts of the single-agent reward that were already doing useful work. The multi-agent config still keeps the control-first prior: strong progress shaping, explicit off-track termination, corner-entry discipline, steering smoothness, and no-progress failure detection. In other words, competition was added on top of competent driving rather than used as a substitute for it.

This design philosophy is explicit in the maintained multi-agent config, which bootstraps from the promoted single-agent control surface `autoresearch_run_008`, preserves `corner_target_speed = 7.0`, keeps steering-smoothness penalties active, and terminates off-track episodes early. From an ML perspective, this is the correct bias: good racing emerges more reliably when control stability is treated as a prerequisite rather than as an emergent side effect of competitive pressure.

3.3 Reward Redesign for Racing Rather Than Driving

Reward family Representative terms in code/config Intended behavioral effect
Single-agent control retained `forward_progress_scale`, `corner_target_speed`, `apex_decel_reward_scale`, `steer_smoothness_penalty`, `off_track_terminal_penalty` Keep the car on track, stable, and physically controllable before asking it to race.
Ranking and race pace `rank_reward_scale`, `relative_velocity_scale`, `relative_velocity_cap`, `overtake_bonus` Reward actually gaining race position rather than merely matching lane-following behavior.
Front-gap and spacing `front_gap_hard_distance`, `front_gap_soft_distance`, `front_speed_penalty_scale`, `side_clearance_penalty_scale`, `proximity_soft_penalty_scale` Discourage unsafe drafting, side rubbing, and closing into blocked space.
Contact severity `collision_low_penalty`, `collision_medium_penalty`, `collision_high_penalty`, `contact_penalty`, `sustained_contact_penalty` Make low-speed nudges and high-speed collisions measurably different events.
Hooking and stickiness `pre_hook_penalty`, `hook_contact_penalty`, `terminate_on_hook_contact`, `stick_penalty_per_step`, `overlap_step_penalty` Prevent wheel-hooking and exploitative "leaning" behavior from being interpreted as successful defense or overtaking.
Clean overtakes only `overtake_requires_clean_contact`, `overtake_contact_dampen`, `overtake_min_pairwise_distance` Ensure a pass is rewarded for spatial separation and rank transition, not for bumping through traffic.

The user-provided design notes are consistent with the final code: the relevant multi-agent shift is not just "add an overtake bonus." It is a move from a progress-only reward to a structured competitive objective in which rank incentives are explicitly filtered by spatial safety. In the implementation, overtake reward is tied to pairwise progress-order changes, then softened or suppressed when spacing is poor.

This matters because racing admits pathological equilibria. A naive competitive reward can teach the agent that contact is a shortcut to position change. The repo's later safety rails therefore penalize collisions by severity, escalate prolonged contact into termination, and explicitly track front-gap and side-clearance telemetry. The reward is not merely asking "did the car move forward?" but "did it improve race position in a way that still looks like driving?"

3.4 How Overtaking and Safety Were Evaluated

The evaluation protocol had to change as much as the reward. For single-agent PPO, progress, off-track rate, and steering variance were enough to tell whether the policy was useful. For multi-agent racing, those metrics become incomplete because an apparent gain in reward can come from blocking, hooking, or rubbing rather than from an actual clean pass.

The maintained evaluator therefore records competitive and safety metrics directly from per-agent `info` dictionaries. In addition to reward and progress, it tracks `mean_rank`, `mean_overtakes`, `collision_rate`, `contact_rate`, `hook_contact_rate`, `contact_termination_rate`, `mean_max_contact_steps`, `mean_front_gap`, and `min_front_gap`. This is the correct lens for multi-agent RL: we do not only ask whether the cars are faster, but whether they are interacting in a way that deserves to be called racing.

Metric Meaning Why it was necessary
`mean_rank` Average final race position across agents and episodes. Separates mere motion from competitive advancement.
`mean_overtakes` Count of logged overtake events per episode. Measures whether the policy actually changes race order.
`contact_rate` and `collision_rate` Whether the episode contained physical overlap or collision events. Detects the most obvious degeneracy: brute-force contact.
`hook_contact_rate` Frequency of hook-style contact events. Targets a particularly damaging exploit in close racing.
`contact_termination_rate` How often safety rails ended the interaction. Shows whether a “competitive” branch is actually relying on unsafe trajectories.
`mean_max_contact_steps` Average longest sustained contact streak per episode. Distinguishes brief touches from structurally bad leaning or sticking.
`mean_front_gap` and `min_front_gap` Average and minimum longitudinal spacing to the car ahead. Connects overtaking intent to actual available space.

This evaluation design also explains the shift in mentality visible in the project notes: the correct ordering was control and safety first, competition second. Without that ordering, the system can produce superficially aggressive agents that are merely learning to occupy space destructively. With it, multi-agent traversal becomes a genuine extension of the single-agent controller rather than a collapse of it.

For the broader report, the multi-agent branch therefore serves as the bridge between two research questions. It shows how direct PPO had to become relational and safety-aware before dense racing could be studied seriously, and it motivates why a richer world model later became appealing: once interaction structure matters, mere lane-following is no longer a sufficient representation of the task.

Video 1. PPO control behavior after the single-car stack became stable enough to serve as an executable baseline.
Video 2. Multi-car shared-policy evaluation, retained as evidence that the control stack scaled operationally even when race quality remained mixed.

4. World Modeling Agenda

The world-model branch asked a more structural question than the PPO branch. Instead of learning a direct control policy, the model attempted to compress racing into a latent dynamical system that could reconstruct observations, predict rewards, and carry enough physical structure to support imagination. The implementation centered on an RSSM with an image encoder, a deterministic GRU state, stochastic prior and posterior heads, a decoder, and telemetry predictors for speed, progress delta, steer, corner angle, and off-track probability.

Intuitively, the challenge was not simply to redraw a road. The model had to learn the difference between a stable world and a moving camera. A corridor can remain visually plausible while the imagined ego vehicle fails to progress through a turn in a physically meaningful way. That distinction explains why some later runs looked geometrically tidy but still failed on the curated `sharp_turn` clip.

The choice of RSSM was deliberate. For this project, the representation had to satisfy four constraints simultaneously: it had to remain tractable on modest replay budgets, it had to support long-horizon imagination from pixels, it had to expose a latent state that could later feed an actor-critic, and it had to remain debuggable enough for intervention-based iteration. An RSSM is a natural fit for that design space because it explicitly separates a deterministic memory state from a stochastic uncertainty state. The deterministic branch stabilizes medium-horizon geometry; the stochastic branch absorbs ambiguities in future motion and local observation.

The deterministic core was implemented with a GRU rather than a larger transformer-like temporal model because the project's immediate objective was controlled hallucination development, not maximal-scale world-model pretraining. A GRU provides exactly the inductive bias needed for repeated action-conditioned updates on short replay windows: it is sequential, lightweight, and easy to stabilize with LayerNorm. In a racing environment where local continuity matters and data are relatively narrow compared with internet-scale video corpora, that bias was an asset rather than a limitation.

The sequence model therefore followed the familiar latent-dynamics pattern

ht = GRU(ht-1, zt-1, at-1),  pφ(zt | ht),  qφ(zt | ht, xt).

Training optimized reconstruction, reward, KL, and auxiliary telemetry losses:

L(φ) = Lrecon + λr Lreward + λKL KL(qφ || pφ) + λtele Ltelemetry + λego Lego.

4.1 Why RSSM and Why GRU

Design choice Why it fit this project Tradeoff accepted
RSSM latent state Provided an explicit deterministic memory plus stochastic uncertainty decomposition, which is well suited to imagination from replay. The model family is expressive but still narrower than the most modern large-scale video world models.
GRU sequence model Matched the need for action-conditioned recurrent updates on moderate sequence lengths and modest compute budgets. Long-range interaction modeling is less flexible than in newer transformer-heavy architectures.
LayerNorm after GRU steps Improved stability for longer hallucination horizons and reduced hidden-state drift. Stability was improved, but not enough to solve hard-turn pose evolution by itself.
Auxiliary telemetry heads Made the latent state legible and testable against speed, steer, progress delta, and off-track signals. The model became easier to debug, but still not immediately suitable for downstream control.

From a high-level ML perspective, the GRU should be read as a strategic simplification. The project needed a recurrent memory mechanism that could absorb track continuity, action history, and ego-motion cues without introducing a second difficult scaling problem before the first one was solved. The repository's own intervention history justifies that choice: the main bottleneck was not that the temporal core was too exotic or too small in the abstract, but that pose evolution and progress modeling remained weak even after replay, horizon, and objective refinements.

In other words, the RSSM/GRU choice was not accidental minimalism. It was the right baseline for a project whose immediate goal was to establish faithful hallucination and only then move to policy learning in imagination. The architecture was simple enough to diagnose and modify, yet expressive enough to produce nontrivial gains from `E1` through `P5`.

4.2 Relation to DreamerV3 and Dreamer 4

The present implementation is best understood as closer in spirit to the classical Dreamer lineage than to a full modern Dreamer system. DreamerV3 demonstrated that world-model reinforcement learning can scale across many domains with fixed hyperparameters, and it trains an actor-critic inside latent imagination rather than treating hallucination as an endpoint. Our project adopted the world-model side of that agenda first: recurrent latent state modeling, reconstruction, reward prediction, and action-conditioned rollout analysis. It did not yet complete the full DreamerV3 loop of robust behavior learning inside the imagined latent dynamics.

The more recent Dreamer 4 agenda goes further still. Its emphasis is not merely on learning a usable recurrent latent model, but on learning agents inside a fast and accurate world model at larger scale, including stronger object-interaction fidelity and more scalable imagination training. Relative to that standard, the current repository should be seen as a pre-Dreamer4 stage: it built the hallucination and telemetry foundation, but it did not yet reach the point where latent actor-critic training could be trusted as the main learning engine.

This comparison is useful because it clarifies the roadmap. A more DreamerV3-like next version would tighten the latent actor-critic loop around the current RSSM and improve normalization, replay coverage, and imagination objectives. A more Dreamer4-like next version would likely require a broader shift toward a higher-capacity world model that is better at procedural variation, contact-rich interactions, and large-scale action conditioning, potentially moving beyond the current GRU-centered temporal core.

Listing 2. RSSM sequence logic distilled from `world_model/models.py`.

state = initial_state(batch_size, device)
prev_action = zeros(batch_size, action_dim)
for t in range(time_steps):
    deterministic = sequence_model(
        state.stochastic, prev_action, state.deterministic
    )
    prior = dynamics_model(deterministic)
    posterior = posterior_model(deterministic, encoder(images[:, t]))
    stochastic = sample(posterior)
    reward_t = reward_predictor(deterministic, stochastic)
    telemetry_t = telemetry_predictor(deterministic, stochastic)
    reconstruction_t = decoder(concat(deterministic, stochastic))
    state = RSSMState(deterministic=deterministic, stochastic=stochastic)
    prev_action = actions[:, t]

5. World-Model Developmental History

Phase Recorded result Interpretation
`E1_baseline_narrow` `hallucination_ssim = 0.9351`, `sharp_turn_ssim = 0.9429`, `total_loss = 1.183450`. Credible initial baseline, but turn geometry degraded too early to support the final story.
`E2` / diversity Logged qualitatively in `WORLD_MODEL_PROGRESS.md` as broader structural plausibility. Diverse replay improved the prior over road geometry.
`E3` / diversity plus horizon `sharp_turn_ssim = 0.9257`, `mean_ssim = 0.9470`, longer sequence training. The horizon ladder improved corridor persistence, but did not yet define the strongest physics-aware branch.
`P3_d4_main_telemetry_warmstart_fast` Reward correlation `0.7728`, speed `0.4966`, progress `0.0772`, steer `0.4068`. First unequivocal physics-aware gain after the telemetry recollection pivot.
`P4_d4_main_telemetry_horizon` `mean_ssim = 0.9665`, `sharp_turn_ssim = 0.9241`, `telemetry_loss = 0.86074`. Longer horizon strengthened general reconstruction while leaving `progress_delta` as the main weak target.
`P5_d4_main_telemetry_a100_bs128_e15` `mean_ssim = 0.9651`, `sharp_turn_ssim = 0.9159`, reward correlation `0.8387`. Best stable checkpoint under the fixed RSSM family.
`D6` broad hard-turn mix Reclassified in the logs as an over-injection failure. Curated turn-heavy data can damage the visual prior when mixed too aggressively.
`D6b` curated supplement `146` episodes, `19,579` train frames, manual share about `28.5%` of train frames. Better controlled than `D6`, but still not sufficient by itself.
`P6b_d6b_curated_quick` Epoch-1 `sharp_turn_ssim = 0.9148`; epoch-2 `0.9088`. Cleaner than `D6`, yet still not a decisive turn-modeling breakthrough.
`P8_p5_finetune_d6b` Logged qualitatively as average rather than clearly positive or negative. A small low-learning-rate fine-tune could not replace `P5` as the cleanest checkpoint.

5.1 Negative Results as Evidence

Branch Observed outcome Research lesson
`I1B-1` perceptual-only Neutral-to-worse on `sharp_turn`. Perceptual loss alone did not solve turn dynamics.
`I1B-2` progress-only General hallucinations remained decent; sharp-turn dynamics remained weak. The bottleneck was not generic decoder quality.
`I1B-3` combined-safe precursor Destabilized by `progress_delta` scaling. `progress_delta` is numerically small and easy to overweight.
`S2A_p5_ego_motion_local` Non-transformative relative to `P5`. An auxiliary ego-motion head was too weak a structural change.
`S2B_p5_stoch64_local` Weaker sharp-turn behavior and weaker general hallucination quality. More latent capacity was a blunt and negative intervention.
`S2C_p5_factorized_local` At best geometrically steadier, but still not meaningfully turning. Factorization without explicit pose evolution remained insufficient.
`2D` pose-conditioned proposal Documented as the active frontier, but not implemented as a checked-in completed run. The logs converge on pose evolution as the next serious hypothesis rather than as an accomplished result.

6. World-Model Benchmark and Ablation Record

Run Reward corr. Speed corr. Progress corr. Steer corr. Off-track acc.
`P2_d4_pilot_telemetry_smoke` `0.0086` `-0.0306` `-0.0100` `0.0265` `0.9700`
`P4_d4_main_telemetry_horizon` `0.8425` `0.6258` `0.0517` `0.6550` `1.0000`
`P5_d4_main_telemetry_a100_bs128_e15` `0.8387` `0.7750` `0.0713` `0.6478` `1.0000`

The ablation message is precise: telemetry supervision produced a large jump in reward, speed, steer, and off-track faithfulness from `P2` to `P4/P5`, but `progress_delta` remained the weakest continuous signal throughout the strongest runs.

Component Evidence Contribution to final understanding
Telemetry supervision `P2` to `P4/P5` correlations improve sharply. Essential positive contributor; retained in the mainline.
Longer horizon continuation `P4` improves overall `mean_ssim` and losses over earlier checkpoints. Useful for corridor persistence, but not sufficient for turn evolution.
Curated hard-turn replay `D6` regressed quality; `D6b` was cleaner but still non-decisive. Helpful only as a controlled supplement, not as a dominant mixture.
Perceptual-only or progress-only losses `I1B` ladder failed to unlock the sharp-turn clip. Objective-only tuning was largely exhausted.
Wider or factorized latent branches `S2B` and `S2C` remained weak or negative. Latent reorganization without pose evolution did not solve the bottleneck.

7. Intuitive Reading of the World-Model Failure Mode

The final world-model story is more subtle than "the model blurres turns." In the strongest checkpoints, the model frequently preserves the road corridor, keeps the ego car visually plausible, and predicts short-horizon reward and telemetry with genuine competence. The failure is narrower: under the `sharp_turn` probe, the model often continues to render a believable scene without advancing the camera through the turn as a driver would actually experience it.

That pattern explains the progression from data interventions to structural interventions. If the decoder were globally poor, more telemetry or more data would have been enough. Instead, the evidence points toward a representational mismatch. The model appears better at describing "what a road looks like next" than "how the agent's viewpoint moves through a turning road." This is exactly why the later logs reframe the next experiment around a pose-conditioned branch rather than another broad continuation run.

Video 3. Earlier world-model hallucination behavior, useful as a qualitative baseline before the telemetry-enabled refinement ladder.
Video 4. Later world-model behavior illustrating why clean geometry and convincing pose evolution are not the same achievement.

8. Next Steps for World Models

The original ambition of the world-model branch was not merely to produce visually pleasing hallucinations. The intended downstream milestone was latent actor-critic training inside the learned simulator. That downstream goal is already visible in the repository through `world_model_train_control.py`, which freezes the learned RSSM and trains a latent actor and critic on top of it. The fact that this diagnostic did not yet transfer well is therefore not a side note; it is the clearest indicator of what the next phase must solve.

Three critical factors now define the frontier. First, the world model must preserve pose evolution well enough that progress through turns is represented faithfully rather than cosmetically. Second, it must remain accurate under richer procedural variation: more track geometries, more interaction modes, and more diverse replay than the current relatively narrow offline datasets. Third, it must be accurate enough that imagined actor-critic optimization does not exploit model errors faster than it learns driving behavior.

Next-step factor Why it matters Dreamer-style interpretation
Pose-faithful latent dynamics The current failure mode is weak turn evolution despite decent corridor rendering. A stronger Dreamer-style model would need imagination states that preserve ego-world transformation, not just texture continuity.
Procedural coverage Future control will require robustness across more track layouts and interaction patterns than the present replay provides. More DreamerV3/Dreamer4-like scaling suggests broader replay, larger models, and stronger action-conditioned generalization.
Accurate imagination for control The latent actor-critic diagnostic already shows that plausible prediction is not enough. The next system must support policy learning in imagination rather than only post hoc hallucination evaluation.
Control-oriented objectives Reward, progress, contact, and race-position signals must remain coherent under imagined rollout. This is the bridge from the current RSSM benchmark to a full Dreamer-like agent stack.

Concretely, a near-term extension would be a more DreamerV3-like phase in which the current RSSM is upgraded from a hallucination benchmark into a real imagination training substrate. That would mean revisiting the latent actor-critic pipeline after improving pose evolution, replay diversity, and reward-faithfulness under imagined rollout. The project already has the scaffolding for this step; what it lacks is a world model accurate enough to justify trusting the imagined gradients.

A more ambitious follow-up would be a Dreamer 4-like rearchitecture aimed at richer procedural generation and stronger interaction modeling. In this report, "procedural" should be read practically: not only more track variation, but also more consistent action-conditioned world evolution across novel layouts and race situations. That level of generality is exactly what would make latent actor-critic training valuable for the next generation of the project, especially once the goal shifts from single-car hallucination toward competitive multi-agent imagination.

9. Reproducibility and Repository Map

Claim Primary evidence in repo Notes
PPO debugging chronology `TRAINING_HISTORY.md`, `train.py`, `autoresearch/train_ppo.py` Contains the bug-fix ladder and promoted control baselines.
AutoResearch single-car metrics `autoresearch/results/run_008`, `run_013`, `run_016`, `best_metrics.json` JSON files used directly for the tables in this report.
Recursive control pivots `autoresearch/results/recursive_cap100/...` `g002_c03` and `g003_c03` supply the clearest late-stage agentic promotions.
World-model chronology `WORLD_MODEL_PROGRESS.md`, `WORLD_MODEL_HANDOFF.md`, intervention memos These files establish the exact order of baselines, failures, and reframings.
World-model benchmark metrics `demo_assets/world_model_benchmark_summary.json` Supplies the reward-faithfulness table for `P2`, `P4`, and `P5`.
Demonstration media `docs/assets/video1.mp4` through `video4.mp4` Local assets are embedded directly so the report remains self-contained.

The repository should therefore be read as a benchmark record. The positive results are real but scoped. PPO control is operational and documented through a transparent promotion ladder. The world model has crossed the threshold from generic hallucination to meaningful telemetry-aware dynamics, but the evidence does not justify a claim that it yet supports robust imagination through hard turns or reliable downstream control.

This limitation is scientifically useful rather than disappointing. It sharply narrows the next hypothesis: an improved world model will likely require explicit pose evolution, not merely a larger latent or another objective tweak on the current fixed architecture.

10. References

  1. Schulman, J., et al. Proximal Policy Optimization Algorithms. 2017.
  2. Hafner, D., et al. Learning Latent Dynamics for Planning from Pixels. 2019.
  3. Hafner, D., et al. Dream to Control: Learning Behaviors by Latent Imagination. 2020.
  4. Hafner, D., et al. Mastering Atari with Discrete World Models. 2021.
  5. Hafner, D., et al. Mastering Diverse Domains through World Models. 2023.
  6. Yu, C., et al. The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games. 2022.