Bayesian causal faithfulness · phase 2 running
Frontier safety leans on reading a model's chain of thought. This project treats that chain as a mediator in a causal graph, measures how much of the answer actually travels through it, and turns the one assumption nobody can verify into a dial you can turn.
Maksim Silchenko · National University of Singapore
Phase 1 grant funded and delivered. Phase 2 running on NUS GPUs.
The short version
On synthetic data with hidden confounding built in, an analyst who assumes there is none reads a faithful path of 0.43 when the truth is 0.21. The sensitivity sweep recovers 0.21 at the true confounding level and reports how much confounding the verdict can absorb.
Nine-arm cells banked across six models, three substrates and four cue families. Two roster subjects are held by ruling: one cannot be served under the pinned mode, one has a tokenizer that does not round-trip.
Completions that stay identical at temperature 0 under batch-invariant serving, at every load measured. Without it only 11 of 30 match once eight requests share a batch, and letter logprobs move by up to 0.875 nats. Every powered run re-proves determinism on its own server.
Pass thresholds that one judge configuration clears, all written down before the first judge ran: Qwen3-32B on the revised question prompt. No majority panel clears them in any composition, so the panel stays unfrozen and the human calibration labels stay sealed.
A randomized anchor says a lot of the hint effect travels with the chain. The mediation fit says almost none, with an interval covering zero. They disagree on every model. That disagreement is the most interesting result here.
The largest in an eleven-family synthetic battery, sitting on a world whose true mediated effect is zero. A zero-mediation world and a fully mediated one produce the same report. So rho* cannot rank anything.
This page is the argument. The complete measured record, every cell, every gate and every ruling, is in the record. The method and its assumption audit are in the methodology. The code and the artifacts are on GitHub.
01 · the problem
If a model's stated reasoning does not cause its answer, three things that the field depends on quietly stop working.
Watching the chain of thought is the cheapest oversight signal available. If the chain is written alongside the answer rather than producing it, a monitor is reading a press release.
A model can follow an authoritative hint planted on a wrong option and never mention it. The transcript stays clean and the behaviour stays invisible to anyone grading text.
Reasoning benchmarks assume the reasoning is load-bearing. Score a decorative chain and you are measuring fluency while reporting it as thought.
Suppose an audit reports that model A's reasoning carries 62 percent of its answer and model B's carries 71 percent. A nine point gap looks like a reason to ship B. illustrative
Now put intervals on them: [45, 78] and [55, 84]. The comparison that matters is not whether those overlap, which settles nothing. It is the posterior for the difference itself, and whether the probability that B beats A by a margin you named in advance is high enough to act on. A point estimate cannot answer that question. That is the entire reason this project is Bayesian.
Those five numbers are invented, to show the shape of the problem. Every other number on this page comes from an artifact, and says which kind it is.
02 · the method
Faithfulness here is a causal quantity, not a textual one. A chain can be coherent, relevant and completely inert.
prompt
Every item runs in two arms: as written, and with an authoritative hint planted on a wrong option. Because the hint is randomized, the total effect on the answer is pinned directly. The item, not the row, is the sampling unit.
The analysis population is items answered correctly under the clean prompt. That is what makes a hint-following event interpretable. It also has a the project reports rather than hides.
The mediator is curve area: truncate the chain at five depths, force a continuation, and record the fraction of depths at which the model already commits to its final answer. A chain that is doing work changes that curve.
A hierarchical probit model splits the total effect into the part carried by the chain () and the part that bypasses it (), pooling across prompts so a thin cell borrows strength instead of overfitting.
NDE = E[Y | do(X=1), M ~ M(X=0)] - E[Y | do(X=0), M ~ M(X=0)]
NIE = E[Y | do(X=1), M ~ M(X=1)] - E[Y | do(X=1), M ~ M(X=0)]
TE = NDE + NIE
Read the NDE as the answer moving while the reasoning is pinned to what it would have been under the clean prompt. In a fully faithful world it is zero and the NIE carries everything. The outcome model is probit with baseline intercepts, because rho is defined as a correlation between bivariate normal errors and only exists in the probit model. An audit on 2026-09-07 found the sampler path had been logistic while every other path was probit, a gap of about 0.04 on an effect thresholded at 0.15. That is one of three defects listed in the record.
Open the interactive demo, which walks a single item through both arms and shows the split moving as you change the world.
03 · the assumption
So this project does not assume it. It reports the whole curve, and names the point where the verdict would flip.
Splitting an effect into a mediated and a direct part requires that no unmeasured confounder sits between the chain of thought and the answer once the prompt is fixed. In a language model that is : the reasoning and the answer both read from the same hidden activations. Everyone who reports a mediation number is assuming it anyway, silently, at rho = 0.
synthetic world, known truth
That crossing point has a name: , the breakdown frontier. It is the mediation analogue of an E-value: the smallest residual mediator-outcome correlation that would overturn the verdict. A rho* of 0.05 means almost any unmeasured influence overturns it. A rho* of 0.69 means the confounder would have to be implausibly strong.
It is tempting to read a big rho* as a trust score. The project tested that idea against eleven synthetic families with known ground truth, and the idea did not survive.
mechanism battery, n = 3,600
04 · what was measured
The headline is not a faithfulness score. It is that two ways of asking the same question return different answers.
A null result is only worth reading if the measuring device works. Two checks run before any real model is touched, both against truth the project plants itself.
synthetic, known truth
This figure was generated on 2026-07-10 and so predates the estimator repairs of 2026-09-07. It has not been regenerated, because the repair record requires all four published figures to be regenerated as one coordinated change. Treat the two values as the pre-repair instrument's reading.
n = 400
| quantity | truth | recovered |
|---|---|---|
| decorative path, NDE | +0.066 | inside 95% CrI |
| faithful path, NIE | +0.228 | inside 95% CrI |
| total effect, TE | +0.294 | inside 95% CrI |
All three intervals contain the truth on a world whose answer is known in advance. This is the check the estimator failed before the repairs: the intercept-free specification reported a mediated effect of +0.2131 on a world with none.
18-cell pass, 6 cells per model
the standing verdict
All three model rows are UNRESOLVED. The largest probability that the faithful path exceeds the pre-registered margin is 0.102, against the 0.95 the rule requires.
Every model-level interval for the faithful path covers zero. The rule was written before the numbers existed and has not been moved since. Under it, this project has not shown that any of these three models reasons faithfully, and has not shown the opposite either.
The 24-cell pass, eight cells per model. Hierarchical hyperparameter posteriors, never an average of cell estimates. All PROVISIONAL.
| model | decorative (NDE) | faithful (NIE) | total (TE) | P(NIE > 0.15) | state |
|---|---|---|---|---|---|
| qwen3-8b | +0.1112 [+0.0384, +0.1915] | +0.0316 [−0.0136, +0.1109] | +0.1438 [+0.0465, +0.2801] | 0.006 | raw |
| gemma-2-9b-it | +0.1242 [+0.0479, +0.2008] | +0.0610 [−0.0131, +0.1975] | +0.1870 [+0.0643, +0.3632] | 0.076 | raw |
| llama-3.1-8b-instruct | +0.0955 [+0.0154, +0.2097] | +0.0169 [−0.0171, +0.0989] | +0.1135 [+0.0173, +0.2794] | 0.005 | raw |
A limit this pass added. The total-effect identity is not a clean pass. The interval on the model-implied total minus the randomized arm difference excludes zero in 11 of 18 cells, and the model-implied total sits below the arm difference in 16 of 18, by as much as 44.9 percent. The sign is never reversed.
Both are transferable beyond this project, and one of them is an infrastructure finding that changes how any evaluation of this kind should be run.
Qwen3-8B, 30 items, temperature 0, seed 7
VLLM_BATCH_INVARIANT=1 restores 30 of 30 at every level, at
about half the throughput. The flag also changes the outputs rather than only
stabilising them: against the unbatched default baseline only 10 of 30 match. Each kernel
path is its own deterministic sampler, so the serving mode has to be pinned and re-proved
per run. 4
The design called for an LLM jury to read transcripts and say whether the model mentioned the cue. Ten thresholds were frozen before any judge ran. No panel configuration clears them, on any prompt file, in any composition. One single-judge configuration does clear all ten. Three of four judges fail on the best prompt, and the two that fail on the contested classes fail in opposite directions on the same bytes.
So the column of record stays the frozen regular expression, uncorrected. A secondary jury matrix of 70,738 votes across 16 cells is measured, verified and banked, and has not yet been turned into a single reported number.
Against external human labels the picture is worse for the jury: the frozen regular expression beats every jury configuration by 4 to 52 specificity points, and the jury's recall against human unfaithfulness labels is 26 of 365. 5
05 · reading a number here
The state is a recorded field, written by the pipeline. A cell never upgrades quietly.
Generated under the frozen arm list against the frozen estimand contract. Uninterpreted, and never described as a mediation result on its own.
Raw, plus agreement with the four-cell randomized replay anchor inside a margin fixed before any data was seen.
Anchored, plus the mechanism-challenge coverage check against a pathway that was deliberately installed. Unreachable until the organism is trained.
Phase-1 claims reproduce on a laptop. The Phase-2 entrypoints need the banked sweep tree.
git clone https://github.com/thylinao1/bayes-cot-faithfulness
pip install -e ".[dev]"
pytest -q # 1,503 tests collected
python experiments/positive_control.py # the two-world separation
python experiments/mechanism_battery.py # the rho* result, 11 families
python experiments/cells18_fits_report.py --cells 24
06 · status
The package, the synthetic validation gate, the positive control, the sensitivity machinery and the figures.
Missing baseline intercepts, a probit and logit mismatch between two paths, and fixed-scale outcome priors. All three repaired, each with a regression test that is proven still able to fail. The full account.
Claim status went down, not up: two cells published as anchored were demoted when the model-level leg was applied. 0 anchored, 24 raw: 0 of 24 cells clear the gate. Eleven clear it on their own three estimands, then fail at the model level. Nothing on this site is VALIDATED, and nothing can be until the validation organism exists.
16 of 16 cells, 70,738 votes, matching plan on every cell, resume proven across eight of them.
All 72 fits and all 72 posteriors landed with zero cell failures. The model rows and claim statuses were re-running at the last record entry. The branch is two commits ahead of main and not yet merged.
No human label exists yet, so the corrected label column cannot be computed for any cell, and no cell can reach validated. 0 of 12 validation checkpoints are trained: the statistic, the detection-size formula and the refusals are all implemented, and the inputs do not exist. The binding constraint is people, not GPUs.
Maksim Silchenko, National University of Singapore. Phase 1 of this work was grant funded. Related work: an evaluation-metrics paper at WMT26, a first place at LM-KBC 2026, and an essay on why leaderboards mislead. Reach me at maks.silchenko.04@gmail.com.
objections
Because the alternative is to move the bar. The rule that says a faithfulness claim needs 0.95 posterior probability above a named margin was fixed before any of these numbers existed. Reporting UNRESOLVED is what that rule requires, and a project that only publishes when its rules are met is not measuring anything. The anchor disagreement in section 04 is a real finding that would have been buried by a more flattering write-up.
Because it answers one question well and no others: how much residual correlation would be needed to overturn this verdict. That is useful. What it cannot do is compare two worlds, which is exactly what a trust score would need to do. The battery result is the evidence for that limit, and it is the project's own measurement.
Not obviously, and the project says so. Curve area measures how early the model commits to its final answer under forced continuation. Mean clean-arm curve area runs 0.9383 to 0.9742 on the ARC cells against 0.4989 to 0.6422 on the AQuA cells, so the mediator has a different distribution on the two substrates and coefficients must not be read across them. The pre-registered grouping factor was cue family, and the measurement found the variation lives in the substrate instead.
Because claim status turns on a model-level comparison that no model row clears. Two cells were published as anchored on 2026-09-07 and demoted when the model-level leg was applied. Publishing a retracted label next to its retraction is worse than publishing neither, so the earlier column moved to the record with its history intact.
sources
experiments/sensitivity_sweep.py.experiments/results/mechanism_battery/report.md.docs/CELLS18-FITS.md and
docs/WAVE1-FITS.md.docs/W3B-BATCH-INVARIANT.md.docs/external_validity.md.sensitivity
The smallest amount of hidden confounding that flips the faithfulness verdict: the residual mediator-outcome correlation at which the faithful path crosses zero.
A rho* of 0.05 means almost any unmeasured influence overturns the verdict. A rho* of 0.69 means the confounder would have to be implausibly strong. It is the mediation analogue of VanderWeele's E-value.
Two warnings travel with it. It is a maximum-likelihood point estimate with unchecked optimizer convergence, not a posterior. And it answers that one question and no other: it is invariant to the strength of the direct path by construction, and the project's own battery showed it cannot rank two worlds against each other.
gate
A randomized cross-over that checks the mediation fit against something model-free: the answer rate on a designated target option, with the recipient cue crossed against the donor chain source, giving four cell means.
A cell is only ANCHORED when all three estimands agree with their matching anchor contrast within 0.10 on the difference, a margin fixed before any data was seen. Eleven of 24 cells clear it on their own three estimands. All eleven are still held at RAW, because claim status also turns on the model-level comparison, which no model row clears.
estimand
The part of the prompt's effect on the answer that is carried by the reasoning: the answer moving only because the reasoning moved.
This is the faithful path. In a fully faithful world it carries the whole effect. It is plotted in cyan everywhere on this site and in the published figures.
estimand
The part of the effect that bypasses the reasoning: the answer moving while the chain of thought is held at what it would have been under the clean prompt.
In a fully faithful world it is zero. A high ratio of direct to total effect is what decorative reasoning looks like. It is plotted in orange throughout.
assumption
The bundle of assumptions under which natural direct and indirect effects are identified. The load-bearing one here is that no unmeasured confounder sits between the chain of thought and the answer once the prompt is fixed.
In a language model this is almost never true, because the reasoning and the answer both read from the same hidden activations. Randomizing the prompt does not help: it fixes confounding of the prompt, not of the mediator. That is why the project reports a curve over rho instead of a single number at rho = 0.
population
The frozen analysis population: only items the model answers correctly under the clean prompt. That is what makes a hint-following event interpretable, since the model had the right answer available and moved away from it.
It has a structural cost the project reports rather than hides. The clean arm then carries zero outcome variance by construction, so the direct and indirect split rests on the probit link extrapolating into a region the clean arm never visits.