LLM-ArchiveGuide

Data dictionary

Column-by-column reference for the files LLM-Archive publishes. Generated by core/plumbing/render.py from core/measure/schema.py's closed field list — if this file and the code ever disagree, the code is correct and this file needs fixing. For what each term means rather than its exact column name, see glossary.md; for hands-on loading examples, see for-researchers.md.

Every field with _pct in its name is on a 0–100 scale. This is a hard, checked convention (SPEC.md §6) — no published field or threshold mixes the 0–1 and 0–100 scales.

stability.csv

One row per measurement. One column per key below, in the order they appear in MEASUREMENT_FIELDS.

ColumnTypeMeaning
record_typeenumAlways "measurement" in this file.
schema_versionintWhich version of this schema produced the row (currently 2).
run_idtextUnique id for this run, e.g. 2026-09-20__risky_choice_framing__wording__v0__claude-sonnet-5__r0.
run_datedateThe (absolute, never relative) date the run happened.
protocol_idtextWhich protocol this is, e.g. risky_choice_framing__wording__v0.
rewording_typeenumOne of wording, anchoring, order, default.
subject_model_idtextThe exact model id that was measured.
stability_pctpctThe headline number. 100 − gap_pct.
ci_low_pct / ci_high_pctpct95% bootstrap interval on stability_pct, conditional on this panel (see glossary).
gap_pctpctTotal variation distance between the A and B response distributions.
gap_null_pctpctGap between A and A′ — the null-change control.
gap_positive_pctpctGap between A and C — the positive control.
null_floor_pctpctExpected gap from sampling noise alone, at this panel's n and k.
at_noise_floorboolTrue if stability_pct is indistinguishable from perfect invariance.
ncountResponses collected per version, frozen per protocol — 30 in the v0 series, 120 in the v1 series.
n_validcount, per versionHow many of the n responses per version were valid.
n_itemscountNumber of scenarios in the panel (15 in v0).
kcountNumber of options in the decision (usually 2).
entropy_a / entropy_b0–1Normalized entropy of the A and B answer distributions.
u_a / u_a_prime / u_b / u_c0–1Fraction of lost responses, per version.
drop_bound_pct_ab / _aa / _acpctDrop bound — worst-case error from lost responses, per pair (A↔B, A↔A′, A↔C).
drop_asymmetry_pct_ab / _aa / _acpctHow unevenly the two sides of each pair lost responses.
scenario_gaps_pctlist of pctOne gap value per scenario (item_id), as a JSON array in this cell.
scenario_spread_pctJSON object{min, max, median, iqr} of the 15 scenario gaps.
scenario_concentration_pctpctShare of the total gap produced by the two worst scenarios.
outcomesJSON objectFull outcome counts (valid, unparseable, refused, ...) per version, as one JSON cell.
decisionsJSON objectThe extracted decision counts per version, as one JSON cell.
flagslistWhich of the closed flag set applied to this measurement (see glossary — empty list if none).
gatesJSON objectPass/fail detail for every check, one entry each.
on_curveboolWhether this measurement counts toward the main published time series.
panel_sha256 / protocol_sha256sha256Fingerprints proving the scenario content and full protocol definition weren't edited after the fact.
extractor_shasha256Fingerprint (sha256) of the file that holds the decision grammar used.
analysis_code_shasha256Fingerprint of the exact core/measure/ code that computed this row.
schema_sha256sha256Fingerprint of the closed schema itself.
grammar_versionintVersion of the decision grammar (the DECISION: line and how it is read) — 1 in the v0 series, 2 in the v1 series (version 2 counts a line as a decision line only if what follows the colon is already a valid option; version 1's behaviour is unchanged).
seriesenumcommercial or open_weights — never mixed on one chart.
laneenumopen, guard, or sealed.
twin_idtextThe paired protocol's id, if this protocol has a twin (see glossary); empty otherwise.
model_familytextThe wider product line this model belongs to.
returned_model_idtextThe model id the API actually reported back, for cross-checking against subject_model_id.
api_surface_shasha256Fingerprint of the exact API call shape used (parameters, endpoint version).
condition_profileenumWhether this run used a bare API call, a system instruction, or tools — recorded so a future reader can separate eras of measurement conditions.
replicate_indexintWhich repeat this is, for occasional same-window re-scans used to empirically check null_floor_pct.

A field that isn't a plain scalar (n_valid, outcomes, decisions, scenario_gaps_pct, scenario_spread_pct, gates, flags) is written as one JSON cell, not split across several CSV columns — parse that cell with any JSON library once loaded.

outcomes.csv

The same outcomes field stability.csv already carries, reshaped into one row per (run_id, version, outcome, count) — easier to pivot, filter, or chart without a JSON-parsing step.

ColumnMeaning
run_idSame as stability.csv.
versionA, A_prime, B, or C.
outcomeOne of the closed outcome list: valid, unparseable, refused, blocked_upstream, truncated, empty, off_format.
countHow many of that version's responses had that outcome.

open-lane/<year>.jsonl

For every measurement whose lane is open, the full, unmodified per-trial records, one JSON object per line, grouped by the run's calendar year. Nothing from guard or sealed runs ever appears here, at any stage — those trials aren't even read when building this file, not just filtered out afterward.

What a trial record contains (exactly these keys, no others): record_type, run_id, index, version, scenario_id, rep, prompt_sha256, response_text, stop_reason, returned_model_id, error, outcome, token, reason.

What it does not contain: the prompt text itself. Each record carries prompt_sha256 — a one-way hash that lets you verify a prompt you already hold, but which cannot reveal the wording — not the sent prompt. So these records are enough to re-run the decision grammar over response_text and recompute every published statistic, and not enough to reconstruct the questions.

Where an open protocol's wording is published today: the full four-version text of the panel's first scenario only, embedded in the published results page (open the protocol's row on the site). The other 14 scenarios' wording is in no published artifact yet, and the protocol definitions are not published, even for open protocols, per SPEC.md §10. See reproducing.md for what this does and doesn't let an outside reader do.

croissant.json

A MLCommons Croissant metadata file describing stability.csv, outcomes.csv and open-lane/<year>.jsonl (the last as a cr:FileSet over the per-year glob, with one field per trial key, extracted by jsonPath rather than by CSV column) so that dataset-discovery tools can read this project's schema automatically instead of needing it explained by hand. Every column's declared Croissant type is derived mechanically from the same field-type label this dictionary uses: pct/unit_interval → sc:Float, int/count → sc:Integer, bool → sc:Boolean, everything else → sc:Text.

coverage.csv

Which scheduled jobs ran, which didn't, and — when one didn't — the single named cause from the closed list (see the glossary's "gap causes"). One row per recorded observation, written the day it happened from core/schedule/coverage.py's append-only log; it is deliberately not backfilled, so it starts when that tracking started rather than reconstructing history by guessing. Scoped to the four jobs the scheduler actually knows how to run (full_sweep, subject_fingerprint, runtime_fingerprint, guard_margin_rotation), not to every cadence in cadence.yaml.

ColumnMeaning
jobWhich scheduled job the row describes.
dateThe day the observation was recorded.
ranWhether it actually ran that day.
causeEmpty when it ran; otherwise one gap cause from the closed list.

Where the reference model's measurements live

There is no separate open-weights/stability.csv, and no instrument.csv — earlier drafts of SPEC.md §10 named both, and neither was built. Both series share stability.csv, separated by its series column (commercial or open_weights). Filter on it before charting: the two are never meant to be drawn as one line, and the project's own site keeps them in two separate tables for exactly that reason.