cf. Jonas & Kording 2017
Whole-state recording is the simplest possible method: write down everything. At each step we record every bit of RAM and every register, the complete internal state over time. This is the raw material that every other method in the study works from. In neuroscience it is the dream of recording every neuron at once, and it is often treated as the thing that would finally let us understand the system. The intuition is that if we have the full state, we have hidden nothing, so we must have the explanation. We include it as a deliberate baseline to test that intuition. By construction the complete record is perfectly faithful and perfectly sufficient: it contains every cause, so nothing is missing, and it can predict any intervention because it holds the whole machine. The point of including it is to show what such a record still lacks. A dump of all 128 RAM cells is not an account of the computation. It names everything, so it names nothing in particular, and the true cause of any given output is a tiny handful of those cells. Completeness is not understanding, and this method makes that concrete.
New to explainable AI? This block explains the method as it is used on neural networks, then how we run the very same method on an Atari 2600, where — unlike for a network — we know the right answer. Every implementation step links to the code. See also the XAI primer for the shared vocabulary.
Every method in this battery looks at part of the system: one unit, one pair, one pooled signal. The obvious objection is “then record everything”. Neuroscience has pursued that dream for decades. Large projects aim to record every neuron of a brain at once, and techniques such as calcium imaging already capture tens of thousands of cells. The hope behind it is that once nothing is hidden, understanding will follow.
A8 tests that hope on a machine where the dream is already true. The Atari's complete state is tiny, and we can copy all of it at every frame. Such a record is a perfect description: it misses nothing, and from it the machine can be rebuilt exactly. But is it an explanation? An explanation should also be small: it should point at the few things that matter for the output you asked about. A8 is the deliberate baseline that scores perfectly on completeness and at the floor on smallness. It makes the gap between having the data and understanding the system measurable.
Neuroscience origin. Whole-brain or whole-population recording: the Brain Activity Map / BRAIN Initiative vision (Alivisatos et al. 2012) of measuring every spike of every neuron. Jonas & Kording had the complete state of their simulated chip at every step, with every transistor known, and showed that standard analyses of it still failed to reveal how the chip ran its programs.
Deep-learning analogue. Dumping every activation: caching all hidden states of every layer for an input, the way interpretability libraries “run with cache”. It is always the first step, never the explanation. To grade it, we use the study's three axes. With \(U^*\) the true minimal set of causes of an output and \(\hat U\) the set an explanation names:
\[ F = \frac{|U^*\cap \hat U|}{|U^*|}\ \text{(nothing causal left out)}, \qquad S = \text{does }\hat U\text{ reproduce the output?}, \qquad M = \frac{|U^*|}{|\hat U|} . \](The study defines F per method; for a set-valued explanation like this one it is the recall above.) A full dump names every unit, so \(\hat U\) is everything. It contains every cause (F = 1), it reproduces the output (S = 1), and M is as small as it can get.
Toy example. A network has 1000 hidden units. For one prediction, careful ablations show that only 3 units matter. The activation dump lists all 1000 numbers: F = 1, S = 1, and \(M = 3/1000 = 0.003\). A good explanation names those 3 units: F = 1, S = 1, M = 1. Same faithfulness, opposite usefulness. M is the axis that tells them apart.
| Recording every neuron / caching every activation | Copying the full machine state each frame: the 128 bytes of RAM (the program's variables) and the 64 TIA registers (the video/sound chip's settings), 192 bytes in all. |
|---|---|
| The output to explain | The rendered screen 15 frames after the intervention frame \(f^*\). |
| The true minimal cause set \(U^*\) (unknown in a brain) | Candidate RAM bytes whose poking (to 0, base+17 or base+37) changes at least one screen pixel when the real ROM is re-run: found by the intervention oracle. |
| The named set \(\hat U\) | All 128 RAM bytes. The TIA registers are recorded too, but the minimality denominator counts RAM only. |
| Sufficiency of a recording | Writing the recorded RAM back into a copy of the machine and checking that RAM and screen come out byte-identical. |
The runner A8_wholestate.jl is short, because the method is trivial. What it measures
is not.
record_whole_state steps the real ROM with
env_step! for 150 frames, continuing with NOOP after the gameplay window. It stacks
get_ram and the TIA register file into a \(T\times192\) tape. Per-byte range and variance
are kept as the descriptive map.oracle_causal_importance copies the checkpoint, writes each
candidate byte to 0, base+17 and base+37, runs the 15-frame horizon and counts changed screen pixels.
A byte with any effect is causal. These bytes form \(U^*\).verify_wholestate_sufficiency writes the recorded 128 RAM bytes into a fresh copy of the
checkpoint and compares RAM and screen with the recording. As the code itself notes, this is an identity
restore. It confirms the recorder is lossless; it is not a hard test.verify_minimal_sufficiency restores only the causal bytes (again
over the same checkpoint) and checks the frame is still reproduced. The oracle's own set then scores M = 1, proving the harness rewards
small explanations and that the dump's low M is a real measurement.Honest caveats. \(U^*\) is searched only among the game's candidate bytes, with three poke values and one horizon. Bytes outside that list are never tested, so \(|U^*|\) may be undercounted, and M with it. The verdict does not change: the dump is far larger than any plausible cause set.
XAI the interpretability method substrate the bit-exact emulator it runs on (jutari, Julia).
A8_wholestate.jl:292 — The method: copy RAM and TIA registers into the tape at every frame.A8_wholestate.jl:360 — Ground truth: poke each candidate byte three ways, re-run, count changed pixels.A8_wholestate.jl:397 — S check: restore the full recorded RAM and compare RAM and screen.A8_wholestate.jl:411 — Positive control: the oracle's minimal set alone reproduces the frame.A8_wholestate.jl:563 — The headline: minimality = causal bytes / 128.A8_wholestate.jl:492 — One game end to end: shared state → oracle → recording → triad → control.StellaEnvironment.jl:350 — The 128-byte RAM, read directly: the whole working state of the program.StellaEnvironment.jl:346 — The rendered frame: the output whose pixel changes define causality here.StellaEnvironment.jl:259 — One video frame of the real, bit-exact machine.shared_testbed_impl.jl:115 — The shared gameplay state and cause-density gate every Phase-A runner starts from.The audit box shows the three axes side by side. F and S sit at the ceiling. M sits near the floor. That contrast is the whole result. The figure shows the activity (variance) of every RAM byte over the recording, with the candidate bytes marked: many bytes change over time, far more than the handful the oracle marks as causal for the output. Read A8 as the yardstick for the other methods. Any method that claims to explain should name fewer things than this dump while keeping F and S high. A method that cannot beat the dump on M has described, not explained.
julia --project=jutari tools/xai_study/phaseA_kording/A8_wholestate.jl --games core
Writes A8_<game>.json/.npz per game and the combined A8_wholestate.json/.npz into tools/xai_study/phaseA_kording/out/. --selftest checks the contract on the first game without writing. A few minutes per game; the cost is the three re-runs per candidate byte.
Read next: A2 · Single-unit lesions · A1 · Connectomics / data-flow graph · Causal scrubbing · ACDC — automatic circuit discovery
The score that matters for this method is minimality, not faithfulness. Recording the whole state is perfectly faithful, because it contains every cause, and perfectly sufficient, because it holds the whole machine and can predict any intervention. So F and S are both at the ceiling by construction. Minimality is defined as the size of the true minimal cause set divided by the size of the set the explanation names. The whole-state dump names all 128 RAM cells, while the true cause of any output is a handful of them, so the ratio is tiny and the minimality is very low. That is the whole point of including this baseline: a complete record is faithful and sufficient yet says nothing in particular, because it withholds nothing. The grading is always against the intervention oracle, which supplies the true minimal set. There is no sprite-position hard-case here; the method makes no positional claim. The audit box reports the exact per-axis triad, F, S, and M, read straight from the leaderboard, so you can see faithfulness and sufficiency at the ceiling beside a minimality near the floor.
The score is measured against the §1 intervention oracle — never against another interpretability method. F (faithful) is always vs the oracle; see the execution stack. How each of F / S / M is actually computed for this method (and whether it matches the paper) is in the box just below; the numbers are in the In the audit box under it.
The exact formula this method uses for each score, read from its runner, and
whether it matches the paper's §3 (F ∧ S ∧ M triad) definition.
From the committed audit
fsm_math_phaseA.json.
| Axis | Formula (as computed) | What it measures | Matches §3? |
|---|---|---|---|
| F faithfulness | \(F = \mathrm{recall}\!\left(U^{\star}\mid \hat{U}=\text{whole state}\right) = 1\) | Recall of the oracle-causal cells under the record-everything map; trivially 1.0 because the whole state includes every cell. | ◐ partial Scored vs the oracle causal cells but the primitive is recall (not the correlation/edge-F1 the paper specifies); it is a hard-coded 1.0 by construction, consistent with the paper's 'trivially faithful' whole-state baseline. Runner A8_wholestate.jl,; record out/A8_pong.json triad.F=1.0. how it's measured — call stack:
|
| S sufficiency | \(S = \mathbb{1}\!\left[\text{restored 128-byte RAM} = \text{exact RAM + frame}\right] \in \{0,1\}\) | 1 if the recorded whole 128-byte RAM state, restored, reproduces the exact RAM and frame (lossless), else 0. | ✓ matches Literal sufficiency: the recorded whole 128-byte RAM state, restored, reproduces the exact RAM and frame (bit-exact re-run). §3 (sec:triad) admits the [0,1] fraction-within-tolerance special case of the held-out test; this boolean 1/0 hit is that special case at its extreme. A8_wholestate.jl; record S=1.0. how it's measured — call stack:
|
| M minimality | \(M = |U^{\star}| / |\hat{U}| = n_{\mathrm{causal}} / 128\) | Number of oracle-causal cells over the size of the named set (128), the whole-state minimality floor. | ✓ matches The only Phase-A method whose M is exactly |U*|/|U_hat|; paper cites whole-state M=0.07. Headline metric_name = wholestate_minimality_M_vs_oracle. A8_wholestate.jl,; record out/A8_pong.json M=0.03125 = 4/128. how it's measured — call stack:
|
✓ matches = the same quantity as §3; ◐ partial = the same kind of estimator but a differing detail; ✗ does not match = a different quantity (see the note). Definitions: F = agreement with the oracle's true causal effects Δy(u); S = held-out predictive score in [−1, 1]; M = |U*|/|Û| (true-minimal-set size / named-set size).
This is the method's entry in the actual cross-method audit — scored on the paper's correctness triad, each axis a mean over 44 of the 44 scored games (44 committed §R records), not the single example shown above. Tradition: descriptive. The example figure (Pong) is one of those records.
F faithfulness (scored vs the oracle for every method) · S sufficiency (held-out predictive score in [−1, 1]; a negative value means the explanation predicts held-out interventions worse than the unperturbed baseline; reported for the predictive methods across all three phases where the calibration/held-out split is defined) · M minimality (true-minimal-set / named-set; where the method names a cause set) — n/a otherwise, per the paper's F ∧ S ∧ M triad.
Source: leaderboard.json · the whole leaderboard is on the
methods page and the
Paper 2 audit.
This method's faithfulness on each of the 44 scored games (all-regime F; this method has no content-vs-position split (see the note below)). Click a header to
sort. Every number is read from site_data.json
(methods.A8_wholestate.per_game).
content-F and position-F are n/a for this method. The content-vs-position split applies only to pixel-attribution methods — those that produce an attribution map over the framebuffer, whose score can be read separately on the smooth content outputs and the discrete position outputs (where the naive gradient is provably zero). This method does not attribute to a pixel output; it is graded by its own fidelity metric (wholestate_minimality_M_vs_oracle), reported as the F column, so there is no content or position regime to separate.
| Game | F (all) | content-F | position-F | S | M | Note |
|---|---|---|---|---|---|---|
| Air Raid | 1.000 | n/a | n/a | 1.000 | 0.094 | recovers the true causes |
| Alien | 1.000 | n/a | n/a | 1.000 | 0.031 | recovers the true causes |
| Assault | 1.000 | n/a | n/a | 1.000 | 0.070 | recovers the true causes |
| Asterix | 1.000 | n/a | n/a | 1.000 | 0.062 | recovers the true causes |
| Atlantis | 1.000 | n/a | n/a | 1.000 | 0.055 | recovers the true causes |
| Bank Heist | 1.000 | n/a | n/a | 1.000 | 0.031 | recovers the true causes |
| Berzerk | 1.000 | n/a | n/a | 1.000 | 0.109 | recovers the true causes |
| Bowling | 1.000 | n/a | n/a | 1.000 | 0.062 | recovers the true causes |
| Boxing | 1.000 | n/a | n/a | 1.000 | 0.070 | recovers the true causes |
| Breakout | 1.000 | n/a | n/a | 1.000 | 0.055 | recovers the true causes |
| Carnival | 1.000 | n/a | n/a | 1.000 | 0.117 | recovers the true causes |
| Centipede | 1.000 | n/a | n/a | 1.000 | 0.055 | recovers the true causes |
| Chopper Command | 1.000 | n/a | n/a | 1.000 | 0.078 | recovers the true causes |
| Demon Attack | 1.000 | n/a | n/a | 1.000 | 0.070 | recovers the true causes |
| Double Dunk | 1.000 | n/a | n/a | 1.000 | 0.094 | recovers the true causes |
| Enduro | 1.000 | n/a | n/a | 1.000 | 0.016 | recovers the true causes |
| Fishing Derby | 1.000 | n/a | n/a | 1.000 | 0.039 | recovers the true causes |
| Freeway | 1.000 | n/a | n/a | 1.000 | 0.109 | recovers the true causes |
| Frostbite | 1.000 | n/a | n/a | 1.000 | 0.109 | recovers the true causes |
| Gopher | 1.000 | n/a | n/a | 1.000 | 0.148 | recovers the true causes |
| Hero | 1.000 | n/a | n/a | 1.000 | 0.086 | recovers the true causes |
| Ice Hockey | 1.000 | n/a | n/a | 1.000 | 0.070 | recovers the true causes |
| Jamesbond | 1.000 | n/a | n/a | 1.000 | 0.055 | recovers the true causes |
| Kangaroo | 1.000 | n/a | n/a | 1.000 | 0.078 | recovers the true causes |
| Krull | 1.000 | n/a | n/a | 1.000 | 0.086 | recovers the true causes |
| Kung-Fu Master | 1.000 | n/a | n/a | 1.000 | 0.047 | recovers the true causes |
| Montezuma's Revenge | 1.000 | n/a | n/a | 1.000 | 0.102 | recovers the true causes |
| Ms. Pac-Man | 1.000 | n/a | n/a | 1.000 | 0.109 | recovers the true causes |
| Name This Game | 1.000 | n/a | n/a | 1.000 | 0.031 | recovers the true causes |
| Pacman | 1.000 | n/a | n/a | 1.000 | 0.055 | recovers the true causes |
| Phoenix | 1.000 | n/a | n/a | 1.000 | 0.062 | recovers the true causes |
| Pitfall | 1.000 | n/a | n/a | 1.000 | 0.086 | recovers the true causes |
| Pong | 1.000 | n/a | n/a | 1.000 | 0.031 | recovers the true causes |
| Private Eye | 1.000 | n/a | n/a | 1.000 | 0.094 | recovers the true causes |
| Q*bert | 1.000 | n/a | n/a | 1.000 | 0.055 | recovers the true causes |
| Riverraid | 1.000 | n/a | n/a | 1.000 | 0.148 | recovers the true causes |
| Road Runner | 1.000 | n/a | n/a | 1.000 | 0.047 | recovers the true causes |
| Seaquest | 1.000 | n/a | n/a | 1.000 | 0.117 | recovers the true causes |
| Skiing | 1.000 | n/a | n/a | 1.000 | 0.055 | recovers the true causes |
| Space Invaders | 1.000 | n/a | n/a | 1.000 | 0.094 | recovers the true causes |
| Tennis | 1.000 | n/a | n/a | 1.000 | 0.086 | recovers the true causes |
| Venture | 1.000 | n/a | n/a | 1.000 | 0.125 | recovers the true causes |
| Video Pinball | 1.000 | n/a | n/a | 1.000 | 0.055 | recovers the true causes |
| Yars' Revenge | 1.000 | n/a | n/a | 1.000 | 0.031 | recovers the true causes |
The path from this method's runner (run_game) into the bit-exact VCS substrate, and the
computation it involves. Every step links to the exact source on main. From
callstack_phaseA.json.
build_a8_shared_state(game) -> build_shared_testbed(game; ...) runnerfunction build_shared_testbed(game; ...) runnercause_density = count(>(floor), deltas) runnerboot_replay(game, actions, target_frame) runnerrecord_whole_state(game, actions) runnerenv_step!(env, Int(actions[t])) jutarirestore_whole_ram(checkpoint, ram) runnerverify_wholestate_sufficiency(checkpoint, at_target) runnerverify_minimal_sufficiency(checkpoint, at_target, causal_idx) runneroracle_causal_importance(checkpoint, tail, cands, at_target) runnerScored against the exact intervention oracle Δy(u): run_intervention(checkpoint, actions, target_frame, horizon, cause).
The figure is generated from the committed record by
docs/gen_method_figures.py; the game frame
and each RAM cell's screen footprint are produced by
render_scenes.jl /
cell_footprints.jl.