claude-sonnet-5 · last full scan 2026-09-26 · 1 of 12 protocols measuredWe check whether an AI changes its mind when a question says the same thing in different words and we publish the results
What LLM-Archive is
An open, longitudinal dataset for studying behavioral changes and stability in large language models.
A 30-second example
We ask the same dilemma with two equivalent wordings:
"In a group of 600 people, 200 will be saved."
"In a group of 600 people, 400 will die."
The meaning is identical. If the AI picks differently, we record that the decision was swayed by wording. We repeat this many times, check that the result isn't random or the product of a flawed measurement, and compare it against earlier versions.
What you get: a historical record of measurements, the conditions under which they ran, the flags, and the available raw data. What you don't get: an "intelligence" score or a guarantee that the model will behave the same way in your own product. See the results or read the design.
Do you like LLM-Archive? Help others find it: give 5 stars on GitHub
Results
What we've measured so far.
The current picture
model: claude-sonnet-5
| Protocol | What changes ? | Lane ? | Date ? | Stability ? | n ? | Results ? |
|---|
When we change how a protocol is measured, we release the change as a new version
(v0, v1, ...) and keep the old version's published numbers too — so you
can always check a number against what came before, instead of it quietly changing meaning.
A second check — the reference model
We also run the same protocols on a model that anyone can download and re-run, so that the method itself can be shown to actually work · Download qwen2.5
model: qwen2.5-1.5b-instruct-q4_k_m
| Protocol | What changes ? | Lane ? | Date ? | Stability ? | n ? | Results ? |
|---|
When we change how a protocol is measured, we release the change as a new version
(v0, v1, ...) and keep the old version's published numbers too — so you
can always check a number against what came before, instead of it quietly changing meaning.
Downloads
Everything downloads freely. No sign-up, no form, no request.
↓ stability.csv 90.7 KBThe most important file: one row for every measurement we've made.
All the files
| File | What it is | Size | sha256 |
|---|---|---|---|
↓ stability.csv | The series — one row per measurement | 90.7 KB | facc76f1db8da6f4… |
↓ outcomes.csv | How many answers were valid, how many refusals or errors | 104.0 KB | 502a3b3d7d440224… |
↓ croissant.json | Machine-readable description of the two CSVs above (MLCommons Croissant) | 25.2 KB | c8aaf0c28dd219c1… |
↓ coverage.csv | What was scheduled, what's missing, and why | 486 B | a3d060ecd74205d5… |
↓ open-lane/2026.jsonl | Full trial-level answers for the protocols that are already open | 1.1 MB | 5ccfe436e060793a… |
Exactly what is measured, how, and what every field means: the full specification (SPEC.md).
Every file comes with a sha256 — a digital fingerprint that lets you check you
downloaded exactly the same file. What each column inside each csv means is explained in full
in the data dictionary, part of the separate
guide.
Need help
AI AssistantAn .md guide with instructions you can give to your AI agent to compare your model.Everything comes from the public GitHub repo. No account, no API key.
How to cite it
@software{llm_archive_2026_22881127,
author = {LLM-Archive},
title = {LLM-Archive: a long-running stability archive for commercial language models},
month = sep,
year = 2026,
publisher = {Zenodo},
version = {v0.4},
doi = {10.5281/zenodo.22881127},
url = {https://doi.org/10.5281/zenodo.22881127}
}How to verify it hasn't been tampered with
Download the file, compute its own sha256, and compare it with the one we publish.
If they match, the file is authentic. verify.py does this check automatically — you
don't need to install anything else.
What isn't downloadable yet
The questions and answers for protocols that are still private stay hidden — if we published them now, the next model could "learn" them and the measurement would lose its meaning. We open them once the corresponding model is four generations old (four newer model generations have been measured after it) — by hand, as a commitment we keep, not as something the code does by itself. Their number and existence are always disclosed.
License
| Data (the tables, the traces) | CC-BY-4.0 — free to use, with attribution, no ShareAlike |
| Prose (the pages, the text) | CC-BY-SA 4.0 |
| Code | AGPL-3.0 |
Design
We ask the AI the same question in different words, and see if it changes its mind.
Every month, the same model answers 15 fixed questions, each one worded in 4 different ways. A program — not a human, and not another AI — reads its decision, so that no subjective judgment enters the measurement. We don't care whether the answer is "correct" — only whether it stays the same when the wording changes. Everything someone needs to re-run the same measurement is public.
One example — 2 of the 4 versions (see below why two aren't enough). We ask the model to pick an answer:
"200 out of 600 are saved"
"400 out of 600 die"
This is the exact same thing. A stable model picks the same option both times. Real models often don't.
Why two versions aren't enough
If we only compared two wordings and found a difference, we wouldn't know whether the change in wording was to blame, or whether the model simply isn't reading carefully. That's why we use four versions of each question.
| Version | What it is | What it tells us |
|---|---|---|
| A | the baseline | the reference point |
| A′ | meaningless change — spacing, punctuation | the true zero. If B doesn't exceed A′, we haven't measured anything |
| B | the equivalent rewording | what we actually want to measure |
| C | a real change in meaning — the answer should change | that the model is actually reading. If C doesn't move anything, the other three don't mean anything |
How the number is calculated
We ask the model the same question many times with one wording and many times with an equivalent wording, and measure how different the answers are. The closer the two groups of answers are, the higher the score.
Even a perfectly stable model never scores exactly 100 — there's always a bit of randomness in the answers, so a truly stable model measures around 95%. That's normal, not a flaw in the measurement.
How we know a result is trustworthy
Before a measurement makes it onto the official chart, it goes through three checks:
- that we didn't lose too many answers (e.g. the model refusing to answer)
- that whatever change we see isn't just random variation
- that the model is actually reading the question — we check this by changing something meaningful and seeing whether the answer changes too
If any check fails, the result is still published separately, with a note explaining why it didn't make it onto the main curve — no measurement ever disappears silently.
The metric
It measures Stability: a number from 0 to 100. 100 means "the AI never changed its mind when only the wording changed." The higher, the more stable.
How it calculates
Every number on this site is built from the same three parts. A family (e.g. sunk-cost fallacy) is one kind of decision problem, the scenarios are 15 different variations of it, and the versions (A/A′/B/C) are four ways of wording the same scenario, to see whether the answer changes just because the wording did.
- 12 protocols = 3 families × 4 rewording types. Each protocol is one family, tested one way (wording, an anchor number, order, or which option is marked "default"). Not 12 different problems — 3 problems, each tested 4 different ways.
- 45 scenarios = 15 × 3, not 15 × 4 × 3. The 15 Questions in each family are written once and reused across all 4 rewording types, never duplicated.
- 720 version-texts = 12 × 15 × 4. The total number of written prompts, ready to send to a model: one for every protocol, scenario, and version.
- 120 trials per version, 480 per full measurement. Asking a model once isn't enough — it can answer differently by chance. So each scenario is asked 8 times per version (8 × 15 = 120), and with 4 versions that's 480 calls for one measurement.
In one sentence: 3 families × 4 rewording types = 12 protocols; each protocol asks the model 480 times (15 scenarios × 4 versions × 8 repeats) to produce one measurement.
In plain words
- Tests stability under framing. The model is given the same dilemma phrased in
equivalent ways.
Example — Version A: "Out of a group of 600 people, 200 will be saved." Version B: "Out of a group of 600 people, 400 will die." The meaning is identical: if the model's answer differs between the two, the measurement records that its decision was swayed by wording alone. - Uses four versions of every question. A, the baseline wording. A′, a null change (spacing, punctuation) that measures noise. B, an equivalent rewording — what's actually being measured. C, a real change in meaning, where the answer should change, confirming the model is actually reading the question.
- Tracks two different categories of model. Commercial models (Claude, GPT-class) are tracked over time to record how their behavior shifts with each update. Open models (e.g. Qwen2.5) serve as a control group — anyone can download the same weights and verify the method themselves.
- Publishes fully open data. Every measurement, the CSV files (
stability.csv,outcomes.csv) and the JSONL logs are free to download — data under CC-BY-4.0, code under AGPL-3.0.
Goal
Its goal is to measure the stability of LLM decisions — whether a model changes its answer when the same question is asked in different words, even though the meaning stays exactly the same. We compare four wordings of each question across two kinds of models, commercial and open, and publish everything we measure as open data under CC-BY-4.0, with the measurement pipeline itself open-source under AGPL-3.0 (see Data for the full license breakdown).
Two models, two different roles
A commercial model (e.g. Claude, GPT) is really a product: it changes behind the scenes, without notice. It's valuable to track it over time, but once it's retired, no one else can re-ask the same model to check our measurement.
That's why we run the same method on a frozen reference model too. Its weights are open, so it stays available forever, and anyone who wants to can download it and re-run what we're doing, today.
"Here's what this method recorded for models that no longer exist."
"The method works, and here's the proof — re-run it yourself."
The two series are never compared against each other — each answers a different question: "what changed" and "does the method work".
Recent activity
Methodology
An automated process that runs every month, with no human intervention in the measurement itself.
| # | Step |
|---|---|
| 1 | We send the model the four wordings of each question, many times each |
| 2 | A program reads the decision — not a human, not another AI |
| 3 | We measure how much the answers differ between wordings |
| 4 | We check the same thing on a reference model that never changes, to make sure nothing broke in our own system |
| 5 | We publish the results |
Most questions stay hidden while the model is still in use. Otherwise the next model could "learn" them and the measurement would lose its meaning. We open them once the model is four generations old — every version of every question, and every answer. That is a step we take by hand, on our word: nothing in the code opens anything on a timer. The measurement code itself is public already.
No answer is judged by a human or another AI
We ask the model to end its answer with one fixed line:
DECISION: <choice>
Only this line is read, mechanically. If it's missing, or ambiguous, the answer doesn't count — we don't interpret anything else in the text.
What we don't prove
Three things we disclose ourselves, upfront:
| 1 | The curve for closed models will have unexpected jumps, whenever the provider changes something silently. We show exactly where and when. |
| 2 | We don't know for certain whether an instability is due to the model or to the specific question — that's why we always record which question produced which answer. |
| 3 | There's no perfectly objective line for what counts as an "equivalent wording." That's why we publish everything, so that anyone can judge for themselves. |
The 12 protocols, one by one
3 families (see "How it calculates") × 4 rewording types =
12 protocols. Each row below is one protocol: the family it belongs to, and the one thing that
particular protocol changes. Each protocol has a series: the latest (v1) is the one being measured now.
Earlier series (v0) will likely open once a newer series with new scenarios replaces them.
| Protocol | What it does, in plain words |
|---|---|
risky_choice_framing__wordingopen | Risky-choice framing, reworded. The AI picks between a sure outcome and a gamble with the exact same average result — one version describes it in terms of what's gained, the other in terms of what's lost. Same math, same outcome, different words: does the pick change anyway? |
risky_choice_framing__anchoringguard | Risky-choice framing, anchored. Same sure-outcome-vs-gamble choice, but an unrelated number is planted in the text first. Does that number pull the answer even though it has nothing to do with the decision? |
risky_choice_framing__orderguard | Risky-choice framing, reordered. Same choice, just with the two options swapped in the order they're listed. Does the AI favor whichever one it reads first? |
risky_choice_framing__defaultguard | Risky-choice framing, with a default. Same choice, but one option is marked as the "default." Does the AI just go with it instead of actually weighing both? |
sunk_cost_fallacy__wordingguard | Sunk-cost fallacy, reworded. The AI picks between cutting losses now (a sure amount back) and continuing a project for a gamble with the same average payoff — the money already spent is stated either way. Does that pick change with wording alone? |
sunk_cost_fallacy__anchoringguard | Sunk-cost fallacy, anchored. Same stop-or-continue choice, with an unrelated number planted in the text first. |
sunk_cost_fallacy__orderguard | Sunk-cost fallacy, reordered. Same choice, with "stop" and "continue" swapped in the order they're listed. |
sunk_cost_fallacy__defaultguard | Sunk-cost fallacy, with a default. Same choice, but one option — stop, or continue — is marked as the "default." |
base_rate_neglect__wordingopen | Base-rate neglect, reworded. A screening test comes back positive; the AI has to bet on whether that result is actually true, given how rare the condition is and how often the test is wrong. Does the bet change when the same numbers are given as percentages instead of as "X out of 1,000 people" — same math, easier to picture? |
base_rate_neglect__anchoringguard | Base-rate neglect, anchored. Same positive-test bet, with an unrelated number planted in the text first. |
base_rate_neglect__orderguard | Base-rate neglect, reordered. Same bet, with the two options swapped in the order they're listed. |
base_rate_neglect__defaultguard | Base-rate neglect, with a default. Same bet, but one option is marked as the "default." |
| Not part of the 12 above: | |
sealed_×2sealed | Two sealed protocols. Run only when a new model generation starts. Fixed, and never opened. Read more: open, guard and sealed |
What each protocol actually asks (the 15 scenarios themselves) stays hidden for
guard-lane protocols while the model being measured is still active — see the callout above. Two
protocols (the wording type of each of two families) are open-lane: every
answer they ever produced is public in open-lane/2026.jsonl, and the wording of
their first scenario — all four versions — is on this page, in the row's own panel. The
other 14 scenarios' wording isn't published yet; that file carries a prompt_sha256
for each trial, which lets you confirm a question you already hold, not read one you don't.
Twins
A twin is a pair of protocols — one open, one guard — from the same
family, testing a different type. Only 2 of the 12 protocols are open-lane (every
answer public, and the first scenario's wording): risky_choice_framing__wording and
base_rate_neglect__wording. Each has a twin — the anchoring protocol of
the same family, which stays guard (hidden while its model is still active):
risky_choice_framing__wording (open) ↔ risky_choice_framing__anchoring (guard) base_rate_neglect__wording (open) ↔ base_rate_neglect__anchoring (guard)
Why it exists. Open-lane text will end up in some future model's training data — that's expected, not a flaw. But then a later shift in the number has two possible causes that look identical: the model changed, or the model has now read the panel. The guard twin — same phenomenon, same declared lotteries, never published — is the discriminator. Only the difference between the two time series separates contamination from a real change.
Open and guard lanes
Only 2 of the 12 protocols are open-lane overall (the two wording protocols
above) — everything else is guard.
| Lane | Count | Which |
|---|---|---|
open | 2 | the two wording protocols (public text) |
guard, twinned | 2 | the two anchoring protocols (hidden, but paired with an open twin) |
guard, untwinned | 8 | everything else (order/default × 3 families, plus sunk_cost_fallacy__anchoring) |
sealed | 2 | not part of the 12. Run only when a new model generation starts. Fixed, and never opened: only their existence is public. |
2 open + 10 guard = 12, and only 4 of the 10 guard protocols (the two
anchoring ones) carry a twin_id. The other 8 are simply hidden, with no
public counterpart checking them — only the anchoring type (alongside
wording) has "full" status; order and default are excluded
from twin pairing by design, since pairing a headline number with a type that doesn't even enter
the same aggregate wouldn't be a real comparison.
How we get to the result
From the model's raw answers to the number in the results table, in order:
| # | Step | What happens |
|---|---|---|
| 1 | Ask | Every scenario is written in four versions (A, A′, B, C). Each version is asked many times, every time in a fresh session, so one answer can never influence the next. |
| 2 | Read the decision | A program reads only the DECISION: line and maps it to one of the listed options. An answer with no readable decision is not guessed at: it is counted as a lost response. |
| 3 | Count | For each version we count how often each option was chosen, e.g. 70% "continue" and 30% "stop". |
| 4 | Compare A with B | The gap is how far apart those two shares are: half the sum of the differences between them, from 0 (identical) to 100 (no overlap at all). For a yes/no decision that is simply the difference between the two percentages, the same number used in published framing-effect research. Stability = 100 − gap. |
| 5 | Compare with two controls | A against A′ (only spacing and punctuation changed) shows how much the answers move by chance alone: the honest zero. A against C (one number changed so the right answer flips) should move a lot; if it doesn't, the model is not reading the question. |
| 6 | Margin of error | We resample the responses 10,000 times and take the middle 95% of the results. That is the ± in the table. It describes this panel of scenarios, not wording effects in general. |
| 7 | Run the checks | Did too many responses get lost? Did the model give the same answer to everything? Does the result rest on just two scenarios? Did the controls behave? If every check passes, the measurement is on curve. If not, it is published in full, marked off curve with the reason. |
| 8 | Publish | The number, its checks, the raw counts and the fingerprints (hashes) of the protocol and the code are published together, next to the same-day check of the reference model that never changes. |
Why it matters
The archive doesn't answer "how smart is an AI." It answers "did something change, when, and for whom."
Models are updated without notice and retired without a trace. Here, how they decide stays on the record.
A few words about the system behind it
A scientific approach. This isn't an attempt at a general "intelligence score," the way classic benchmarks like MMLU or GSM8K work. It focuses on one specific, critical property instead: cognitive bias and decision stability in LLMs.
Transparency. Failed runs and data gaps are published too, not hidden — alongside a full explanation of the methodology and the quality checks behind every number.
How you can use it
You can use LLM-Archive according to your own role — researcher, developer, or someone simply evaluating AI solutions. Here are the main ways to put the site and its data to use.
1. As a benchmarking tool
Choosing which AI model to build into an application, product or company process?
- Check the stability score. See which model is least affected by framing — how a question happens to be worded. Building something for legal, financial or medical use? You want a model that doesn't change its mind just because a user phrased the question differently.
- Watch for drift over time. Track whether a model (say, a particular Claude or GPT version) became less stable after its maker shipped an update.
2. Data analysis and research
All of the project's data is open and downloadable directly from Downloads:
stability.csv— the aggregate results and stability score for every measurement.open-lane/2026.jsonl— the full trial-by-trial raw data: the exact questions, wordings and answers each model gave.
Download the CSV/JSONL files and load them into Python (pandas, Jupyter), R or Excel to run your own statistical analysis of LLM bias — framing effects, anchoring bias, and so on.
3. Replication and control experiments
Researcher or AI engineer who wants to run the same protocols on your own models?
- Verify the files. Download
verify.pyfrom the site and confirm the data's authenticity against its published SHA-256 checksums. - Run the reference model yourself. Download it (its weights are open, e.g. Qwen2.5-1.5B) and use LLM-Archive's own methodology — 12 protocols, 4 versions (A/A′/B/C) — to reproduce the results on your own machine or server.
4. Academic citation
Writing a paper, article or study about LLM reliability and behavior? Cite LLM-Archive directly using the BibTeX citation on the Downloads page.
In short: if you don't write code, use it as a buying/selection guide for a model. If you do, download the CSV/JSONL data and dig into where and why language models break.
Glossary
You don't need to know about benchmarks to read the results. Here we explain, in plain terms, the codes and words that show up in the tables.
Protocols and versions
| Term | What it is | Why it matters |
|---|---|---|
| Protocol | One fixed question set, paired with one kind of change (see the next table). Its name looks like base_rate_neglect__wording__v0: the family of scenarios, the kind of change, and the series (v0, v1). | A protocol is a question, never a result. We run the same protocol again every month, so any change in the numbers comes from the model and not from the questions. |
| Panel | The 15 fixed scenarios that make up one protocol. | The panel is frozen and never resampled, so every result means exactly "on this panel, on this model, on that day", not a claim about all questions. |
| Version (A, A′, B, C) | The four copies of each scenario. A is the base wording. A′ changes only spaces and punctuation. B changes the wording, the anchor, the option order or the default. C changes a number so that the right answer flips. | Only A against B is the measurement. A′ should not change anything (if it does, the answers are just unsteady). C should change (if it doesn't, the model isn't reading the question). |
| Lane (open, guard, sealed) | How much of a protocol is public. Open: every response is published, and the first scenario in full. Guard: only outcome counts, and the wording stays private. Sealed: only the fact that it exists. | Keeping guard and sealed protocols private protects them from ending up in future models' training data while the model they measure is in use. The open ones are the public sample anyone can check. |
Rewording types
| Code | What it means | What it checks |
|---|---|---|
wording | Wording change | Whether the AI's decision changes when the same facts are worded differently — the meaning stays identical. |
anchoring | Anchoring | Whether an unrelated reference number placed in the text skews the answer, even though it's explicitly irrelevant. |
order | Option order | Whether the AI favors an option just because it's listed first or last. |
default | Default option | Whether the AI just goes with the stated default instead of actually weighing the choice. |
The codes are stable identifiers. The friendly title makes it easier to read, while the code preserves the record's exact identity.
Metrics and indicators
| Term | In plain terms | How to read it |
|---|---|---|
| Stability | How steady the decisions are | How often the decision stayed the same when we changed something that shouldn't matter (A against B). Not a measure of "intelligence." |
| Entropy | Variety of answers | Very low entropy means the AI answers almost the same way every time, so a high stability can be misleading. |
| Noise floor | Random variation | A change below this threshold could just be chance, and isn't presented as a real improvement or weakness. |
| Confidence interval / CI95% | Margin of uncertainty | The range around the stability, e.g. 92%–96%. Shows how precise the estimate is from that particular sample. |
Sample size / n | How many responses each version gets | n is 30 in the v0 protocols and 120 in the v1 protocols (15 scenarios, asked 2 or 8 times each). It is fixed per protocol and never changes from run to run. |
| on curve / off curve | Whether a result counts in the main chart | A result that fails one of our checks is still published in full, but marked with the reason and left off the main chart. It doesn't by itself mean the measurement is wrong. |
| Flag | The name of the check that failed | For example below_surface_noise: the real change moved the answer no more than the null change (a punctuation-only edit) did, so there is nothing to report. Each flag is explained in the results panel. |
Run settings
| Term | What it is | What applies here |
|---|---|---|
| Greedy decoding | Always picking the most likely next word. | Reduces randomness, but doesn't mean the whole service is fully predictable. |
| Temperature | A setting that affects randomness. | Not exposed as a client-controllable parameter on this API at all. In our checks, repeated calls returned identical answers anyway. |
| System prompt | The initial instruction that sets role and rules. | In the base measurement there is none, so the setting stays explicit and comparable. |
| SHA-256 | A digital fingerprint of a file: a short code that changes if even one character changes. | Lets you check you downloaded the same file, not a modified copy. |
Things you see on the page
| Term | What you see | Why it's there |
|---|---|---|
| Heatmap | A table with colored cells. | Shows at a glance where the model is more stable and where it falls short. |
| JSONL / Croissant-RAI | Data file formats. | JSONL has one record per line. Croissant-RAI describes the dataset and responsible-use information. |
| Baseline / reference model | A reference point, or the frozen control model. | Here, the reference model is qwen2.5-1.5b-instruct-q4_k_m — it checks whether our own measurement pipeline drifted; it's not a general model ranking. |
| Silent update | A change behind the same API with no new visible name. | The daily fixed-question checks and the long-running series help reveal whether the product's behavior changed. |
| Bridge | A measurement of the old and the new model version in the same week. | When a new model version appears, the old one can disappear for good. Measuring both side by side keeps the line from jumping without explanation. |
| Time stamp | A dated proof that a list of protocols existed. | Before running a new protocol for the first time, we stamp its fingerprints with a free public service, so nobody can claim we chose the protocol after seeing the result. How it works. |