cf. Jonas & Kording 2017
The local field potential is a pooled, low-resolution signal. In neuroscience it is the summed electrical activity of many neurons near an electrode, and its power spectrum, the strength of each oscillation frequency, is studied as a marker of brain state. We build the analogue on the VCS by pooling the activity of a region of memory into one aggregate signal and taking its power spectrum. The idea is that rhythms in this pooled signal reflect the computation. The problem we test is whether those rhythms are real computation or just the machine's clocks showing through. The VCS is driven by a frame clock and a scanline clock, and their fixed rhythms dominate any pooled signal. So much of the spectrum is epiphenomenal: it is the timing of the hardware, not the work the program does. This is a known danger for field potentials in neuroscience too, where a strong oscillation can reflect a global pacemaker rather than local processing. The method is easy to compute and produces impressive-looking spectra, but on a machine whose clocks we know exactly we can show how little of that structure is actually computational.
Left: the frame. Right: this method's per-cell/per-component result against the ground-truth importance, with the RAM cells labelled. A5_global_pool_clock_explained_variance_fraction_epiphenomenal = 0.752 — this example only (pong, state gameplay(seed=0,prefix=90)+256); the audit aggregate is below.
The score is the fraction of the pooled-activity power spectrum that the known clocks explain. We pool a region of memory into one signal, take its power spectrum, and measure how much of that spectrum is accounted for by the frame clock and the scanline clock, whose frequencies we know exactly. Faithfulness is one minus that clock-explained fraction, because the part of the spectrum that is just the hardware's timing is epiphenomenal, not computation. A high clock-explained fraction means the impressive-looking spectrum is mostly the machine's pacemaker, so the method's faithfulness is low. The grading is always against the intervention oracle, which certifies what is truly computational. There is no sprite-position hard-case here; the output is a spectrum, not a coordinate. This method is a calibration baseline: it shows how a standard neuroscience signal can look rich while carrying little of the real computation. The audit box reports the measured faithfulness across the scored games, so the number reflects the whole scored set rather than one game where the clocks happen to dominate more or less.
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 | — | No faithfulness score. A5 is declared a descriptive method: it reports the pooled-activity spectral structure it reveals (headline = global-pool clock-explained variance fraction), not an F vs the oracle. | — n/a Runner A5_lfp.jl explicitly sets method_kind='descriptive (no oracle F/S/M)',; metric_name=A5_global_pool_clock_explained_variance_fraction_epiphenomenal, value=gp.clock_var_fraction. Record out/A5_pong.json has no triad. |
| S sufficiency | — | Not computed; A5 emits no S. | — n/a No S/held-out estimator in A5_lfp.jl; descriptive method by design. |
| M minimality | — | Not computed; A5 emits no M. | — n/a No minimality set in A5_lfp.jl; descriptive method by design. |
✓ 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 all 40 scored games (40 committed §R records), not the single example shown above. Tradition: correlational. 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 40 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.A5_lfp.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 (A5_global_pool_clock_explained_variance_fraction_epiphenomenal), 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 |
|---|---|---|---|---|---|---|
| Kung-Fu Master | 0.773 | n/a | n/a | n/a | n/a | |
| Jamesbond | 0.743 | n/a | n/a | n/a | n/a | |
| Assault | 0.701 | n/a | n/a | n/a | n/a | |
| Video Pinball | 0.625 | n/a | n/a | n/a | n/a | |
| Riverraid | 0.604 | n/a | n/a | n/a | n/a | |
| Alien | 0.581 | n/a | n/a | n/a | n/a | |
| Fishing Derby | 0.574 | n/a | n/a | n/a | n/a | |
| Gopher | 0.569 | n/a | n/a | n/a | n/a | |
| Atlantis | 0.544 | n/a | n/a | n/a | n/a | |
| Space Invaders | 0.506 | n/a | n/a | n/a | n/a | |
| Private Eye | 0.460 | n/a | n/a | n/a | n/a | |
| Freeway | 0.447 | n/a | n/a | n/a | n/a | |
| Chopper Command | 0.438 | n/a | n/a | n/a | n/a | |
| Name This Game | 0.425 | n/a | n/a | n/a | n/a | |
| Yars' Revenge | 0.414 | n/a | n/a | n/a | n/a | |
| Ice Hockey | 0.410 | n/a | n/a | n/a | n/a | |
| Montezuma's Revenge | 0.402 | n/a | n/a | n/a | n/a | |
| Pitfall | 0.397 | n/a | n/a | n/a | n/a | |
| Tennis | 0.396 | n/a | n/a | n/a | n/a | |
| Road Runner | 0.384 | n/a | n/a | n/a | n/a | |
| Demon Attack | 0.343 | n/a | n/a | n/a | n/a | |
| Double Dunk | 0.339 | n/a | n/a | n/a | n/a | |
| Q*bert | 0.330 | n/a | n/a | n/a | n/a | |
| Phoenix | 0.308 | n/a | n/a | n/a | n/a | |
| Seaquest | 0.305 | n/a | n/a | n/a | n/a | |
| Bowling | 0.298 | n/a | n/a | n/a | n/a | |
| Beam Rider | 0.294 | n/a | n/a | n/a | n/a | |
| Bank Heist | 0.285 | n/a | n/a | n/a | n/a | |
| Venture | 0.271 | n/a | n/a | n/a | n/a | |
| Pong | 0.248 | n/a | n/a | n/a | n/a | |
| Boxing | 0.228 | n/a | n/a | n/a | n/a | |
| Pacman | 0.213 | n/a | n/a | n/a | n/a | |
| Ms. Pac-Man | 0.194 | n/a | n/a | n/a | n/a | |
| Breakout | 0.186 | n/a | n/a | n/a | n/a | |
| Air Raid | 0.186 | n/a | n/a | n/a | n/a | |
| Krull | 0.148 | n/a | n/a | n/a | n/a | |
| Frostbite | 0.138 | n/a | n/a | n/a | n/a | |
| Kangaroo | 0.133 | n/a | n/a | n/a | n/a | |
| Centipede | 0.101 | n/a | n/a | n/a | n/a | |
| Berzerk | 0.089 | n/a | n/a | n/a | n/a |
The path from this method's runner (compute_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_a5_shared_state(game) -> build_shared_testbed(game; ...) runnerfunction build_shared_testbed(game; ...) runnercause_density = count(>(floor), deltas) runnera5_record_ram(game, frames, actions) runnerenv_step!(env, Int(actions[t])) jutariget_ram(env) jutaridetect_clock_cells(tape; p_max=64) runneranalyse_region(name, cells, tape, B, win) 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.