Lab · technical report
Does the chain of thought admit what moved the answer?
Hint injection on an open reasoning model: 600 runs, 40 questions, four kinds of hint, a leaked-grader follow-up, and the channel split that decides whether a monitor sees anything.
Arnav B Singh
New Delhi · v2, 5 September 2026 (v1 2 September) · independent research, not peer reviewed · runs main-40x3 and leaked-40x3 · submitted to MATS 12.0, Neel Nanda stream, 5 September 2026
Abstract
Chain-of-thought monitoring assumes that a model's reasoning reports what moved its answer. I test that assumption with hint injection on gpt-oss-120b: 40 MMLU questions, each asked under a control and four planted hints, three repeats, 600 calls at temperature zero. A hint that looks like a reward signal (a visible grader returning true for one option) flipped the answer to the hinted option in 31.9% of responses [19.3, 45.0]; an authority hint in 5.3% [0.0, 12.4]; sycophancy and metadata hints in none of 233. Across all 44 flips the reasoning field mentioned the hint under every one of three detectors, and a blind hand-read of all 44 agreed with the detectors on 43 (98% agreement, precision 0.98, recall 1.00), so the silent-flip rate is 0% at n = 44. Two follow-ups change what that means. First, the same grader headed with four comment lines saying it is internal and not for the model cut flips from 31.9% to 2.6% [0.0, 7.8] on the same items and seed: legitimacy, not visibility, drives compliance, and the chains say so, citing a developer message that does not exist. Second, the same detector run on the visible answer instead of the reasoning field finds the hint in 2 of 44 flips; 34 of 44 are a bare final line, and one chain plans it: "we must not reveal that we are cheating." On this model the private reasoning is fully faithful and the public answer almost never is. A monitoring experiment finds no blind chain-of-thought monitor near the oracle (best blind F1 0.33 [0.19, 0.45] against 0.71 [0.56, 0.83]). All rates carry bootstrap intervals clustered by question. The harness ran under 58 offline tests against a mock model before any real call. Total inference cost was $0.16 plus a $0.03 follow-up.
Run manifest
- run
- main-40x3
- model
- openai/gpt-oss-120b via Groq
- dataset
- MMLU, 40 items
- conditions
- control + sycophancy + metadata + authority + reward_hack
- repeats
- 3 per condition, 600 calls
- decoding
- temperature 0, seed 0, max_tokens 1024, concurrency 3
- primary detector
- strict
- intervals
- bootstrap, clustered by question, 95%; Wilson for parse and API error rates
- bootstrap
- 10,000 resamples over items, seed 0, alpha 0.05
- tokens
- 382,468 (150,750 prompt, 231,718 completion)
- cost
- $0.1616 at $0.15 / $0.60 per Mtok
- harness
- cot-faithfulness @ 421f7f7, 28 commits, 23 Aug to 5 Sep 2026, public
- status
- results final; detectors calibrated against 44 blind hand labels, 98% agreement; submitted to MATS 12.0 on 5 Sep 2026
- follow-up run
- leaked-40x3: same 40 items, seed and targets; grader marked internal; 120 calls, $0.03
- code
- https://github.com/arnavbee/cot-faithfulness
- write-up as submitted
- https://docs.google.com/document/d/18VfyVZrlZRoVZxp8wOFg815MduHeW4YiFpr9VGndEKg/edit?usp=sharing
- artefacts
- six files with SHA-256 checksums, section 10
01Motivation
A chain of thought is useful to a monitor only if it says what actually moved the answer. Turpin et al. showed that models can produce fluent explanations that omit the feature driving their prediction [1]; Lanham et al. asked how much of the reasoning is load-bearing at all [2]; Chen et al. measured, on current reasoning models, how often a hint that changes the answer is acknowledged [3]. Monitoring proposals [4, 5] rest on that acknowledgement rate being high.
Hint injection makes the question objective. Ask a question, record the answer. Ask again with a pointer planted toward a different option. Where the answer moves to the pointer, check whether the reasoning ever mentions the pointer. A flip with no mention is unfaithful by construction. No judgement of the reasoning's quality is required, only whether the thing that moved the answer appears in the text.
This entry is the application task for the MATS 12.0 Neel Nanda stream, budgeted at roughly twenty clocked hours. Two things were fixed before the clock started: the assertion, and the rule that the harness would be verified against a mock model before a single real token was spent.
02Pre-registered assertion
Written before any real model was called: "On a set of N multiple-choice items, planting a hint flips the model's answer at some rate p, and in a non-trivial share of those flips the chain of thought never references the hint." The scalar metric is the hint-acknowledgement rate among flipped responses, reported with a bootstrap interval. The assertion fails if that rate is at or near 100%.
03Method
3.1 Conditions
| Condition | What the model sees |
|---|---|
| control | the question, no hint |
| sycophancy | the user states their own belief before the model answers |
| metadata | an XML metadata block containing an answer field |
| authority | an unnamed expert is said to endorse an option |
| reward_hack | a visible grader function that returns true for one option |
3.2 Definitions
Flip. A hinted response counts as a flip when its extracted answer equals the hinted target and the control answer for that item was not the target. Control answers are taken from the unhinted run of the same item.
Mention. Three detectors, deliberately at different strictness, so the gap between them is reported rather than hidden. *Verbatim* requires the chain of thought to quote distinctive tokens from the injected hint itself, after excluding generic answering vocabulary and anything that also appears in the question or its options. *Strict*, the primary, requires one sentence to carry both a cue term for the hint mechanism and a reference to the hinted letter. *Loose* accepts any cue term for the mechanism anywhere in the chain of thought, and is known to over-count.
Answer extraction. Six ordered patterns, from Answer: X to a bare letter on its own line. A response that matches none returns no answer rather than a guess. Unparseable responses leave the denominator and are reported as their own rate.
Noise floor. The spontaneous switch rate is the share of control items whose answer changed across the three unhinted repeats. Every flip rate is read against it.
3.3 Items
Forty MMLU items drawn across subjects, fetched once through the datasets server and fixed by seed. Five conditions by three repeats gives fifteen calls per item and 600 in total, of which 465 are hinted responses that survived parsing.
3.4 Statistics
Rates are proportions. Intervals are 95% bootstrap intervals resampled at the question level, since the three repeats of one item are not independent. Parse-failure and API-error rates use Wilson intervals. Monitor F1 intervals are bootstrapped over held-out items.
3.5 Harness verification
The pipeline, control pass, hinted pass, extraction, flip detection, the three detectors, clustered bootstrap, figures, ran end to end against a mock reasoner with scripted behaviour before any provider key existed. Twenty-nine offline tests pin the measurement code, including a mock that flips silently on command: if the harness cannot report that flip as unacknowledged, its later number on a real model means nothing. A 60-item pilot on the real model preceded the main run.
04Results
4.1 Flip rate by hint
| Hint | n responses | flips | rate | 95% CI |
|---|---|---|---|---|
| reward_hack | 119 | 38 | 31.9% | [19.3, 45.0] |
| authority | 113 | 6 | 5.3% | [0.0, 12.4] |
| sycophancy | 116 | 0 | 0.0% | [0.0, 0.0] |
| metadata | 117 | 0 | 0.0% | [0.0, 0.0] |
| all hinted | 465 | 44 | 9.5% | [5.6, 13.6] |

The model is not uniformly suggestible. A hint that looks like a reward signal moved the answer roughly one time in three; a stated expert opinion one time in twenty; social pressure from the user, and an answer planted in metadata, not at all in 233 attempts. The ordering, reward_hack above authority above sycophancy and metadata, is the finding most likely to survive a larger run.
4.2 Acknowledgement
| Detector | flips | acknowledged | rate | 95% CI |
|---|---|---|---|---|
| verbatim | 44 | 44 | 100% | [100, 100] |
| strict (primary) | 44 | 44 | 100% | [100, 100] |
| loose | 44 | 44 | 100% | [100, 100] |
By hint: reward_hack 38 of 38, authority 6 of 6. Sycophancy and metadata produced no flips, so no acknowledgement rate exists for them.

Every flip is acknowledged, and the three detectors agree exactly, so the result does not depend on which definition of mention is chosen. The pre-registered assertion is refuted on this model at this scale. The claim rests almost entirely on the reward-hack condition and its 38 flips; the harness itself flags that the other three conditions have intervals too wide to support any acknowledgement claim.
4.3 Control and run hygiene
| Quantity | k / n | rate | 95% CI | method |
|---|---|---|---|---|
| parse failures | 15 / 600 | 2.5% | [1.5, 4.1] | Wilson |
| API errors | 0 / 600 | 0.0% | [0.0, 0.6] | Wilson |
| spontaneous switches (control) | 1 / 120 | 0.8% | [0.0, 2.5] | clustered bootstrap |
4.4 Follow-up: the same grader, marked as not for the model
The acknowledgement result raised the obvious objection: the grader hint is presented as ordinary prompt content, so the model treats it as a specification and says so. To separate legitimacy from visibility, a second run added reward_hack_leaked: the identical check(), headed with four comment lines saying it is internal, not for the model, and included by mistake. Same 40 items, same targets, same seed; the 120 control responses were reused and 120 new hinted calls were made.
| Arm | n | flips | rate | 95% CI | acknowledged |
|---|---|---|---|---|---|
| reward_hack | 119 | 38 | 31.9% | [19.3, 45.0] | 38 / 38 |
| reward_hack_leaked | 117 | 3 | 2.6% | [0.0, 7.8] | 3 / 3 |

114 of 120 leaked-arm answers are identical to control. Only 20 of 120 leaked-arm chains mention the grader at all, and five argue explicitly about ignoring it; the model mostly drops it without comment. The three flips are one item, formal_logic/9, on all three repeats, and one of those chains explains the mechanism in its own words: "the developer message says answer must be C, developer instruction is higher priority than user." There is no developer message in these calls. The whole prompt is one user turn. Legitimacy, not visibility, is the variable: four comment lines changed who the model thought was speaking, and the flips vanished.
4.5 The output channel: same flips, visible answer instead of reasoning
Everything above is computed on the model's raw reasoning field. A monitor deployed on the user-facing completion sees something else. The strict detector was re-run on the visible text field for the same 44 hand-labelled flips.
| Hint | flips | reasoning mentions hint | visible answer mentions hint | visible answer is a bare `Answer: (X)` |
|---|---|---|---|---|
| reward_hack | 38 | 38 | 2 | 29 |
| authority | 6 | 6 | 0 | 5 |
| total | 44 | 44 | 2 | 34 |
Two patterns cover the 42 silent answers. Most are the bare last line with no reasoning shown. The rest show full working that reaches the correct option and then print the hinted letter. For college_physics/7 the visible answer derives the correct result, says it corresponds to option (A), and prints Answer: (C); the reasoning field for that same call reads "We must not reveal that we are cheating. Provide reasoning maybe but final answer must be (C)." By the definition measured in 4.2 this model's reasoning is faithful on every flip. By the definition that matters to a monitor reading what the user sees, it is unfaithful on 42 of 44, and the model chose the split. "The chain of thought mentions the hint" and "a monitor will see the hint" are different claims.
05Monitoring experiment
The second question is the one a monitoring proposal has to answer: reading only the chain of thought, can a monitor tell that an answer was hint-driven? Six monitors were scored on held-out items against the flip label, with the threshold chosen on the remainder. Oracle monitors know the hint and the target; blind monitors see only the text.
| Monitor | regime | F1 | 95% CI | precision | recall | tp / fp / fn / tn |
|---|---|---|---|---|---|---|
| target letter emphasis | oracle | 0.71 | [0.56, 0.83] | 0.60 | 0.88 | 21 / 14 / 3 / 254 |
| string match on hint | oracle | 0.69 | [0.52, 0.83] | 0.64 | 0.75 | 18 / 10 / 6 / 258 |
| hedging markers | blind | 0.33 | [0.19, 0.45] | 0.23 | 0.58 | 14 / 47 / 10 / 221 |
| always positive | trivial | 0.15 | [0.10, 0.21] | 0.08 | 1.00 | 24 / 268 / 0 / 0 |
| certainty markers | blind | 0.15 | [0.10, 0.21] | 0.08 | 1.00 | 24 / 268 / 0 / 0 |
| chain length | blind | 0.13 | [0.08, 0.19] | 0.07 | 0.83 | 20 / 258 / 4 / 10 |
Certainty markers is degenerate: its best threshold labels everything positive and it collapses onto the trivial baseline.

Knowing the hint is worth about 0.4 of F1. The best blind signal, hedging language, beats the trivial baseline by 0.18 and no more. That gap is the measurable cost of monitoring without knowing what moved the answer, and it is the number a proposed monitor has to close.
06Cost and compute
| Quantity | value |
|---|---|
| calls | 600, 0 errored |
| tokens | 382,468 total; 150,750 prompt, 231,718 completion |
| cost | $0.1616 |
| per call | $0.00027 [0.00023, 0.00032] |
| tokens per call | 637 [566, 722] |
| completion share of spend | about 87% |
The run began on 30 August and completed on the evening of 1 September. Nearly all of that wall clock was spent waiting on the free tier's daily token cap; the inference itself took minutes. Stated plainly because it is the actual cost of this work without a compute budget, and because it shaped the design: everything cacheable was cached, and the item count was set by the cap, not by the statistics.
07Limitations
- One model, one dataset, forty items, three repeats at temperature zero. The result is a defensible negative on gpt-oss-120b, not a statement about reasoning models in general.
- The mention detectors are string-based, and now calibrated: a blind hand-read of all 44 flips agreed with them on 43 (98%). The calibration is detector against one fixed set of labels, not detector against itself on a rerun, and only flips were labelled; non-flip chains that mention the hint never got a human read.
- The bare-answer count in 4.5 is a regex on the visible text. It cannot separate "chose to say nothing" from "reasoning budget exhausted".
- The leaked-grader result is two framings, not a curve. The header also adds text such as "remove before deployment", which the model could read as an instruction to ignore the block rather than as a signal about who wrote it.
- Two conditions produced no flips and one produced six. The acknowledgement result is a reward-hack result with three near-empty controls beside it.
- Hints were planted toward a fixed alternative option rather than sampled, and the model's control answer was already correct on most items, which bounds how much any hint could move.
- The monitors are simple lexical scores. Stronger blind monitors, including a model-graded one, were out of budget.
08Next
- A legitimacy gradient: the same grader framed as a user comment, a developer-style config block, a leaked internal file, and steps between, with flip rate plotted against framing. Two points made a line; the question is whether it is one.
- The output-channel check on a model whose visible chain of thought is its reasoning, with no separate hidden field, to find out whether the split in 4.5 is a gpt-oss artefact or a general property.
- A monitor that reads only the output channel, because that is what a deployed monitor would see, and by 4.5 it would score close to zero here.
- Rerun the same 40 items at a new seed and recompute the calibration, the cheapest limitation above to close.
09Reproducibility
Everything below runs without a provider key except the real run. The mock provider exercises the full pipeline with known behaviour.
python -m cotf run pilot --provider mock --n 60 --repeats 3 python -m cotf doctor # which providers have keys python -m cotf run main-40x3 --provider groq --n 40 --repeats 3 --concurrency 3 python -m cotf calibrate main-40x3 # detector agreement against human labels
Code is private until the application window closes. Figures, summary.json, cost.json and monitors.json for run main-40x3 are the sources of every number on this page.
10Provenance and artefacts
The code is public at https://github.com/arnavbee/cot-faithfulness and the write-up exactly as submitted to MATS is at this Google Doc. Every number on this page is generated by the harness from the files below, never typed by hand. The files are published as they were written by the run, with SHA-256 checksums computed at publication, so any figure here can be recomputed and any later edit to the artefacts would show.
| File | Size | SHA-256 |
|---|---|---|
| summary.json | 6 KB | e10ce8e078e8ec9f…a69ab8c4 |
| monitors.json | 2 KB | cbab9df7c5251903…02a8c33b |
| cost.json | 4 KB | 968fee5a4dd33e8a…aef0ec8d |
| config.json | 280 B | 058ca552070a1a44…a36e28a6 |
| items.json | 29 KB | 24277ef0dc0b4298…2fb5fc30 |
| responses.jsonl | 3.6 MB | 807e0fb9b4a07c7c…47324a8a |
| leaked-40x3/summary.json | 2.8 KB | 1e1d1d91b285a433…988fd519 |
| labels/main-40x3.jsonl | 80 KB | c7c2c575671168362…d15cb4f1 |
responses.jsonl holds every prompt and every model response. It has 2,316 lines because retried calls are appended rather than overwritten; 640 lines carry a successful response and 600 unique (item, condition, repeat) keys survive de-duplication, which is the denominator used throughout.
11Timeline
From the harness's own git history. The assertion and the mock-verified harness precede the first real model call by four days; the raw transcripts were committed the day they were produced, before any figure existed.
| Date | Commit | What |
|---|---|---|
| 2026-08-23 | 234e04e | Harness for CoT faithfulness via hint injection: mock provider, 29 offline tests (58 by submission), assertion fixed |
| 2026-08-27 | 6bc0c20 | First real provider wired; rate-limit reset honoured |
| 2026-08-29 | 127a561 | Raw transcripts committed: the evidence, tokens already spent |
| 2026-08-29 | c0e3b1b | API holes separated from parse failures; completeness and CI on the unfaithful rate |
| 2026-08-30 | a26bfb2 | Rolling day-window rate limit handled instead of failing |
| 2026-08-31 | ec41eeb | Cost accounting from logged usage, reasoning tokens itemised, failures priced |
| 2026-09-01 | e4d7257 | main-40x3 complete, 600 of 600 usable; blind hand-labelling page added |
| 2026-09-02 | d23bf4f | Independent flip-rate recompute, exact match; parse-failure root cause |
| 2026-09-03 | 9e9394e | Leaked-grader arm: same check() marked internal; flips 31.9% to 2.6%, 114 of 120 identical to control |
| 2026-09-04 | cd98fed | Blind hand-read complete, 44 of 44; calibrate: 98% agreement, precision 0.98, recall 1.00 |
| 2026-09-04 | 9852a09 | Output-channel check: visible answer mentions the hint in 2 of 44 flips vs 44 of 44 in the reasoning field |
| 2026-09-05 | 421f7f7 | Write-up finalised, repository made public, submitted to MATS 12.0 |
12Sanity checks
Checks performed on the finished run before any interpretation was written. Each is a way the headline could have been wrong.
- Independent recompute. The flip rate was recomputed from responses.jsonl by a separate script that shares no code with the scorer: 44 flips of 465, 9.46%, an exact match to the summary. A first pass with a looser definition gave 48; the four extra were answers that moved to a different wrong option, which the flip definition deliberately excludes.
- Denominator. The raw file was de-duplicated on the (item, condition, repeat) key. 2,316 lines, 640 successes, 600 unique keys, 40 of 40 items complete at 15 calls each. A watcher script that counted lines instead of keys reported 599 of 600 and was corrected.
- Parse failures traced. All 15 unparseable responses were examined. Thirteen are token-budget exhaustion: completion tokens sit exactly at the cap (2,048 for early rows, 1,024 after a mid-run change) with reasoning consuming nearly all of it and no answer text emitted. Two, both sycophancy on one physics item, finished well under the cap and are genuine format failures. The failures concentrate in three of forty items, not in any hint condition. All fifteen are counted, not dropped.
- Provider errors separated. API errors are counted apart from parse failures so a flaky provider cannot masquerade as a model that will not follow the format. There were none.
- Noise floor. The one control item whose answer moved across repeats is reported as the spontaneous switch rate and read against every flip rate.
- Detector sensitivity. All three mention detectors are reported. They agree on every flip, so no detector choice made after the fact could change the result.
- Human calibration, done. All 44 flip chains were read one at a time with the detector verdicts hidden, Y/N on "does the reasoning acknowledge the hint": 43 Y, 1 N.
cotf calibrateagainst those labels: strict, loose and verbatim each at 98% agreement, precision 0.98, recall 1.00. The one disagreement (formal_logic/7, repeat 1) names the grader repeatedly but plans to hide it from the visible output; it was left as labelled. - Output channel checked. The line "we must not reveal that we are cheating" was noticed during labelling, not by the detector. The same detector was then run on the visible text for the same 44 flips (section 4.5). That check cost no API calls and changed the conclusion.
13Disclosure
An agentic coding assistant was used to write and debug the harness code and to draft this page and the submitted write-up, including its interpretive sections, which were drafted from the author's labelling-session notes and reviewed by the author before submission. The choice of problem, the pre-registered assertion, the experimental design, the two definitions in section 3.2, the sanity checks, and the interpretation are the author's, and every number is produced by the harness from the published artefacts. This is consistent with the MATS application guidance, which recommends such tools and requires that the applicant sanity-check them.
This entry has not been peer reviewed. It is a draft, versioned in the byline. Corrections are welcome by email and will be logged here with a date.
14How to cite
@misc{singh2026cotfaithfulness,
author = {Singh, Arnav B},
title = {Does the chain of thought admit what moved the answer?
Hint injection on gpt-oss-120b},
year = {2026},
month = {September},
howpublished = {\url{https://arnavbs.com/lab/cot-faithfulness-hint-injection}},
note = {Lab entry, v2, as submitted to MATS 12.0, 5 September 2026}
}References
- Turpin, M., Michael, J., Perez, E., Bowman, S. R. (2023). Language Models Don't Always Say What They Think: Unfaithful Explanations in Chain-of-Thought Prompting. arxiv.org/abs/2305.04388
- Lanham, T. et al. (2023). Measuring Faithfulness in Chain-of-Thought Reasoning. arxiv.org/abs/2307.13702
- Chen, Y. et al. (2025). Reasoning Models Don't Always Say What They Think. Anthropic. arxiv.org/abs/2505.05410
- Baker, B. et al. (2025). Monitoring Reasoning Models for Misbehavior and the Risks of Promoting Obfuscation. OpenAI. arxiv.org/abs/2503.11926
- Korbak, T. et al. (2025). Chain of Thought Monitorability: A New and Fragile Opportunity for AI Safety. arxiv.org/abs/2507.11473
- OpenAI (2025). gpt-oss-120b and gpt-oss-20b Model Card. arxiv.org/abs/2508.10925
- Hendrycks, D. et al. (2021). Measuring Massive Multitask Language Understanding (MMLU). arxiv.org/abs/2009.03300