Research log Small Model Experimentation
GitHub

Episodic ECHO-TTT

Finished2026-06-26imported · line YCollective Experimentation InfrastructureGitHub ↗
Scrambled clues help as much as real ones

The one idea you need

Before answering four-way questions about an episode, the model gets a few seconds to cram, nudging four scratchpad tokens so it better predicts the observations it just saw. The test: does cramming on real observations beat cramming on scrambled or random text?

The question

If a small model spends a few seconds studying what it just saw in an environment, does that help it make better decisions right afterward?

What we found

No. Letting the model spend a few seconds studying an episode's real observations left its four-choice decisions stuck near blind-guess level, about 25%, no better than doing nothing. The tell: feeding it scrambled or nonsense text helped just as much, and the single best score across the whole experiment, 31%, came from studying nonsense. The study genuinely shifted the model, just not toward understanding the episode.

Why it matters

Before wiring quick per-episode self-study into a small-model agent, always run a scrambled-input control. If nonsense inputs shift the model as much as real ones, you are seeing generic warm-up, not real learning.

Studying real clues, best case25% → 28%top result across episode types; on familiar episodes it stayed flat at 25%
Best score of the entire experiment31%and it came from studying nonsense text, not the real clues
Blind-guess baseline25%four options, one correct
Prediction-error drop, real vs nonsense cluesabout equalthe model clearly adapted, but nonsense adapted it just as much
On this page
  1. Results at a glance
  2. Overview
  3. Report
    1. Summary
    2. Setup
    3. Main Results
    4. Global Prefix Training
    5. Interpretation
    6. Artifacts
  4. Experiment log
  5. Figures
  6. Data files
  7. Reproduce
  8. Related

Results at a glance 7

Decision accuracy after self-study: real clues vs scrambled controls

How to read

Bars show how often each version picked the right answer from four options; one color group is familiar episodes, the other is unfamiliar ones. Groups left to right: real-clue study, generic-text control, scrambled-clue control, no study. Higher is better; 25% is blind guessing.

0%10%20%30%40%true-observation TTTtrue-observation TTT25%27.8%generic-text TTT (control)generic-text TTT (control)30.6%25%shuffled-observation TTT (control)shuffled-observation TTT (control)25%19.4%no TTTno TTT25%25%

Takeaway → Every bar hovers around the 25% guess line, and the tallest bar is a nonsense control, so studying the real clues earns nothing.

Data table
Armin-distribution evalheld-out family
true-observation TTT25%27.8%
generic-text TTT (control)30.6%25%
shuffled-observation TTT (control)25%19.4%
no TTT25%25%

Numbers from report table (reports/episodic_echo_ttt_report.md, Main Results)

Technical framing

Final-probe accuracy at 2 TTT steps: true observations vs corrupted controls — No arm separates from 25% four-choice chance; the best score (30.6%) is a corrupted control, so the mechanism fails its gate.

Does more self-study help? Accuracy across zero, one, and two rounds

How to read

On familiar episodes, each line tracks accuracy as the model does more study rounds (left to right), one line per version plus a flat reference line at the 25% guess level. Higher is better.

24%26%28%30%32%00.511.52generic-text TTT (control)generic-text TTT …true-observation TTTtrue-observation …shuffled-observation TTT (control)shuffled-observat…chance

Takeaway → The real-clue line sits flat on the 25% guess line, while only the generic-text control climbs, reaching 31% after two rounds.

Data table
TTT stepstrue-observation TTTgeneric-text TTT (control)shuffled-observation TTT (control)chance
025%25%25%25%
125%27.8%27.8%
225%30.6%25%25%

Numbers from report table (reports/episodic_echo_ttt_report.md, Main Results)

Technical framing

Accuracy vs number of TTT steps (in-distribution eval) — More per-episode gradient steps never lift true-observation TTT above chance; the only gain shows up in a corrupted control.

How wrong its guesses about new observations were, before and after study

How to read

On unfamiliar episodes, each line shows prediction error on unseen observations as study rounds increase; lower means the model guesses observations better. Lines are real clues, generic-text control, and scrambled-clue control.

5.255.55.7566.256.500.511.52true-observation TTTtrue-observation …shuffled-observation TTT (control)shuffled-observat…generic-text TTT (control)generic-text TTT …

Takeaway → All three lines fall by about the same amount, so studying the real clues reduces error no more than studying scrambled or generic text.

Data table
TTT stepstrue-observation TTTgeneric-text TTT (control)shuffled-observation TTT (control)
06.176.176.17
15.485.575.47
25.465.385.4

Numbers from report table (reports/episodic_echo_ttt_report.md, Main Results)

Technical framing

Held-out observation cross-entropy after TTT (held-out family split) — TTT lowers held-out observation loss, but corrupted-observation updates lower it just as much, so the CE drop is not episode-grounded.

Accuracy across three separate training runs, on unfamiliar episodes

How to read

Grouped bars show accuracy after two study rounds for each of three independent training runs, colored by what was studied: no study, real clues, scrambled, or generic. Higher is better; 25% is blind guessing.

0%10%20%30%40%25%33.3%8.3%33.3%Seed 10125%25%25%16.7%Seed 20225%25%25%25%Seed 303

Takeaway → Only the first run shows the echo versions above chance; on the other two the arms sit at or below the 25% line (one control even dips to about 17%), so the apparent gains are run-to-run noise.

Data table
Training seedNo TTT (global prefix)True observations (echo)Shuffled observationsGeneric observations
Seed 10125%33.3%8.3%33.3%
Seed 20225%25%25%16.7%
Seed 30325%25%25%25%

Numbers from runs/main_episodic_echo_ttt_v1 via analysis/metrics.csv

Technical framing

Per-seed accuracy at 2 TTT steps (held-out family split) — Seed 101 drives all arm separation; seeds 202 and 303 sit at 25% chance, so apparent echo gains are within seed noise.

How much study cut observation error, by what content was studied

How to read

Bars show how far prediction error fell after two study rounds, split by content studied (real clues, scrambled, generic) and shown for both familiar and unfamiliar episodes. Bigger downward bars mean a larger error drop.

-1-0.75-0.5-0.250True observations (echo)True observations (echo)-0.951-0.717Shuffled observationsShuffled observations-0.87-0.776Generic observationsGeneric observations-0.565-0.789

Takeaway → The scrambled and generic controls cut error about as much as the real clues, so the improvement is not tied to the true episode.

Data table
TTT update contentIn-distribution evalHeld-out family eval
True observations (echo)-0.951-0.717
Shuffled observations-0.87-0.776
Generic observations-0.565-0.789

Numbers from analysis/summary_by_arm.csv

Technical framing

Held-out observation CE reduction after 2 TTT steps, by update content — Corrupted-observation updates cut held-out CE about as much as true ones, so the CE gain is not grounded in true episode dynamics.

Accuracy across study rounds on unfamiliar episodes

How to read

Each line tracks accuracy as study rounds increase on episode types never seen during warm-up, one line each for real clues, scrambled, and generic content. Higher is better; 25% is blind guessing.

17.5%20%22.5%25%27.5%30%00.511.52True observations (echo)True observations…Generic observationsGeneric observati…Shuffled observationsShuffled observat…

Takeaway → Real clues hover just around 25% while the scrambled control drifts below it, so no version reliably helps on unfamiliar episodes.

Data table
TTT gradient stepsTrue observations (echo)Shuffled observationsGeneric observations
025%25%25%
127.8%19.4%27.8%
227.8%19.4%25%

Numbers from analysis/summary_by_arm.csv

Technical framing

Accuracy vs TTT steps on held-out families — On families never seen in prefix training, extra TTT steps leave echo near 25% chance while shuffled updates drift below it.

Stability of the shared warm-up setup across training

How to read

Each line tracks how wrong the model's observation guesses were over training steps, one line per training run; lower is better. There is no reference line.

24685101520Seed 202Seed 303Seed 101

Takeaway → The lines wobble up and down with no steady descent, with one run briefly halving its error mid-run before regressing back up, signaling an unstable warm-up setup.

Data table
Training stepSeed 101Seed 202Seed 303
16.185.796.67
46.575.927.51
83.245.666.38
123.825.56.01
165.425.825.95
205.876.26.19

Numbers from analysis/training_log.csv

Technical framing

Global prefix training: validation observation CE by step — Global prefix training is unstable: seed 101 briefly halves validation CE mid-run then regresses, and no seed ends better than it started.

In the author’s words from the Report · “Summary”

Best mean accuracy was 30.6% for generic_ttt on eval_indist at 2 TTT steps. The primary comparison is global_no_ttt versus echo_ttt and the corrupted controls shuffle_ttt and generic_ttt. A real mechanism signal requires true-observation TTT to improve final-probe accuracy and held-out observation prediction more than corrupted-observation TTT. Gate readout at the largest tested TTT step: eval_indist at 2 TTT steps: echo 25.0%, no-TTT 25.0%, best corrupted control 30.6%. heldout_family at 2 TTT steps: echo 27.8%, no-TTT 25.0%, best corrupted control 25.0%.

Overview

This standalone experiment tests whether temporary per-episode gradient updates on environment-observation prediction improve later decisions in a small local language model.

Small experiment files live here. Large checkpoints and caches live under /workspace/large_artifacts/episodic_echo_ttt.

Main Artifacts

  • src/episodic_echo_ttt.py: experiment runner and report generator.
  • experiment_log.md: chronological implementation and run log.
  • runs/: metrics and metadata for each run.
  • analysis/: aggregate CSVs and figures.
  • reports/: Markdown and HTML reports.
  • checkpoint_manifest.csv: pointers to large artifacts outside this directory.

Report

Rendered from reports/episodic_echo_ttt_report.md

Summary

This standalone experiment tests whether a frozen local language model can use temporary per-episode gradient updates on environment-observation prediction to make better later decisions.

Verdict: negative mechanism signal.

Best mean accuracy was 30.6% for generic_ttt on eval_indist at 2 TTT steps.

The primary comparison is global_no_ttt versus echo_ttt and the corrupted controls shuffle_ttt and generic_ttt. A real mechanism signal requires true-observation TTT to improve final-probe accuracy and held-out observation prediction more than corrupted-observation TTT.

Gate readout at the largest tested TTT step:

  • eval_indist at 2 TTT steps: echo 25.0%, no-TTT 25.0%, best corrupted control 30.6%.
  • heldout_family at 2 TTT steps: echo 27.8%, no-TTT 25.0%, best corrupted control 25.0%.

Setup

  • Base model: Qwen/Qwen3-4B.
  • Frozen model weights: yes.
  • Per-episode trainable state: 4 virtual prefix tokens.
  • Observation update target: only text spans containing diagnostic-box observations.
  • Candidate decision: likelihood over four randomized option-letter continuations.
  • Four-choice chance accuracy: 25.0%.
  • Support observations per episode: 5.
  • Held-out observation probes per episode: 2.
  • Seeds: 101,202,303.
  • Large artifacts: /workspace/large_artifacts/episodic_echo_ttt.

Main Results

splitarmttt_stepsnmean_accuracystd_accuracymean_obs_ce_beforemean_obs_ce_aftermean_obs_ce_delta
eval_indistecho_ttt03625.0%8.3%6.3126.3120
eval_indistecho_ttt13625.0%8.3%6.3125.46-0.852
eval_indistecho_ttt23625.0%8.3%6.3125.361-0.951
eval_indistgeneric_ttt03625.0%8.3%6.3126.3120
eval_indistgeneric_ttt13627.8%9.6%6.3125.71-0.602
eval_indistgeneric_ttt23630.6%4.8%6.3125.747-0.565
eval_indistglobal_no_ttt03625.0%8.3%6.3126.3120
eval_indistno_prefix03625.0%8.3%6.3986.3980
eval_indistshuffle_ttt03625.0%8.3%6.3126.3120
eval_indistshuffle_ttt13627.8%9.6%6.3125.428-0.884
eval_indistshuffle_ttt23625.0%8.3%6.3125.442-0.87
heldout_familyecho_ttt03625.0%0.0%6.1746.1740
heldout_familyecho_ttt13627.8%4.8%6.1745.477-0.696
heldout_familyecho_ttt23627.8%4.8%6.1745.457-0.717
heldout_familygeneric_ttt03625.0%0.0%6.1746.1740
heldout_familygeneric_ttt13627.8%4.8%6.1745.573-0.6
heldout_familygeneric_ttt23625.0%8.3%6.1745.385-0.789
heldout_familyglobal_no_ttt03625.0%0.0%6.1746.1740
heldout_familyno_prefix03622.2%4.8%6.4096.4090
heldout_familyshuffle_ttt03625.0%0.0%6.1746.1740
heldout_familyshuffle_ttt13619.4%9.6%6.1745.47-0.704
heldout_familyshuffle_ttt23619.4%9.6%6.1745.398-0.776

Accuracy by arm

TTT step curve

Observation CE delta

Global Prefix Training

seedsteptrain_lossval_obs_ce
10111.1076.18
10141.2766.569
10180.9883.242
101120.9653.821
101160.9695.416
101200.9285.874
20211.6495.788
20240.8095.919
20281.1375.663
202120.9315.504
202160.35.823
202200.7646.197
30311.1736.673
30341.1487.511
30381.1886.377
303120.8766.009
303160.915.954
303200.9256.189

Global prefix training

Interpretation

The load-bearing control is corrupted-observation TTT. The result does not pass that control. True-observation TTT reduces held-out observation CE, but shuffled and generic-observation updates also reduce CE on the same held-out probes. Final-probe accuracy remains near the four-choice chance level and does not separate reliably from the corrupted controls.

The experiment therefore supports a narrow negative conclusion for this tested recipe: a tiny virtual-prefix test-time update can move Qwen's likelihoods, but the movement is not specifically grounded in the true episode dynamics strongly enough to improve decisions.

Artifacts

Experiment log 5

Show the running log (5 entries)

Run smoke_episodic_echo_ttt_v1

  • Started: 2026-06-26 03:48:57 UTC
  • Suite: smoke
  • Model: Qwen/Qwen3-4B
  • Seeds: 101
  • Arms: no_prefix,global_no_ttt,echo_ttt,shuffle_ttt

Completed smoke_episodic_echo_ttt_v1 in 82.9s.

  • Metric rows: 12
  • Detail rows: 48
  • Report: reports/episodic_echo_ttt_report.md

Run pilot_episodic_echo_ttt_lr_v2

  • Started: 2026-06-26 03:51:01 UTC
  • Suite: pilot
  • Model: Qwen/Qwen3-4B
  • Seeds: 101
  • Arms: no_prefix,global_no_ttt,echo_ttt,shuffle_ttt,generic_ttt

Stopped during evaluation because candidate continuations were scored one forward pass at a time. The runner was patched to score all candidates for an episode in a single batch before the next pilot.

Run pilot_episodic_echo_ttt_batched_v3

  • Started: 2026-06-26 03:54:19 UTC
  • Suite: pilot
  • Model: Qwen/Qwen3-4B
  • Seeds: 101
  • Arms: no_prefix,global_no_ttt,echo_ttt,shuffle_ttt,generic_ttt

Completed pilot_episodic_echo_ttt_batched_v3 in 116.7s.

  • Metric rows: 22
  • Detail rows: 176
  • Report: reports/episodic_echo_ttt_report.md

Run smoke_episodic_echo_ttt_mc_v4

  • Started: 2026-06-26 03:57:34 UTC
  • Suite: smoke
  • Model: Qwen/Qwen3-4B
  • Seeds: 101
  • Arms: no_prefix,global_no_ttt,echo_ttt,shuffle_ttt

Completed smoke_episodic_echo_ttt_mc_v4 in 24.6s.

  • Metric rows: 12
  • Detail rows: 48
  • Report: reports/episodic_echo_ttt_report.md

Run main_episodic_echo_ttt_v1

  • Started: 2026-06-26 03:58:38 UTC
  • Suite: main
  • Model: Qwen/Qwen3-4B
  • Seeds: 101,202,303
  • Arms: no_prefix,global_no_ttt,echo_ttt,shuffle_ttt,generic_ttt

Completed main_episodic_echo_ttt_v1 in 336.0s.

  • Metric rows: 66
  • Detail rows: 792
  • Report: reports/episodic_echo_ttt_report.md

Figures 4

accuracy by arm
accuracy by arm · analysis/figures/
global prefix training
global prefix training · analysis/figures/
observation ce delta
observation ce delta · analysis/figures/
ttt step curve
ttt step curve · analysis/figures/

Data files 24

Result tables and metrics copied from the experiment folder — preview inline or open the raw file.

Reproduce

The run commands are documented inside the experiment folder (see the README).

Browse the experiment folder on GitHub ↗