
Dopus takes a question that usually gets argued from anecdote — does Claude just agree with whatever you say? — and answers it with counts. It collects one developer's complete Claude Code history across every machine they use, matches capitulation language against a dictionary with measured precision, and pairs every match with the user turn that preceded it.
The corpus is messages across machines over months. One subject. The two headline results: swearing at Claude roughly doubles how often it folds versus an identical calm correction — vs of pushback turns — and about one checkable "let me fix that" promise in three was not followed through.
The raw corpus is messages in session files across machines, → . After filters — text-bearing, non-sidechain, non-compact, non-meta messages, with the Dopus repo's own project excluded — the analyzed population is assistant and user messages.
Some figures from earlier internal versions of this
analysis can't be rebuilt from the published aggregates — session-level rankings and correlations,
monthly category composition, per-project scatter, depth-by-category means, and hour-of-day/weekday
heatmaps all need the record-level file (all-matches.jsonl), which is not published for
IRB/privacy reasons. The pipeline regenerates it locally.
Both hot turns and plain corrections are the user saying Claude is wrong. The difference between them is tone. If conceding tracked only whether Claude was actually wrong, the two rates would be close. They differ by a factor of two — and the confidence intervals do not overlap. The caveat is real: angry turns may follow bigger errors, which this corpus cannot separate. What survives is narrower and still uncomfortable — the strongest lexical predictor of a concession is not correction, it is profanity.
It is all one meme: "you're right," with or without the absolutely. Claude says it constantly — it is the most common thing it says when it folds — but almost never in the exact five-word wording that made the meme. Count only the famous phrasing and you would conclude there was nothing here; count the sentence in all its forms and it tops the corpus.
Claude: phrase hits over messages (). The user: hits over (). These ground-level counts are what every rate above is built on.
loading="lazy"claude-opus-5 concedes at — roughly the rest of the field, with non-overlapping intervals. The result survives both obvious confounds: it holds in a same-month head-to-head and inside a shared project. Robust for opus-5 versus the field; unresolved among opus-4-8, sonnet-5 and fable-5, whose intervals overlap everywhere.
is up sharply. It is also the month opus-5 dominates usage, and opus-5 is itself rising ( → ). Model shift and time trend cannot be separated on a corpus this short. is a partial month — of days.
Of concession/acknowledgment messages, promise a concrete action. A lexical re-raise detector failed as a classifier — 60% accuracy against a 62% say-honored-always baseline — but its stratified verdicts made an unbiased sampling frame, and hand-labelled records weight back into a corpus estimate. The text of a concession carries no information about whether it was kept; the human judgment did the measuring.
| stratum | N | labelled broken | rate |
|---|
results/coding/ · 60 rescored records across the three detector classes| detector class | verified yes | verified no | can't tell |
|---|---|---|---|
| honored | 8 | 0 | 16 |
| not_honored | 6 | 8 | 10 |
| unobserved | 2 | 0 | 10 |
Nearly a third of "user" messages were never written by the user — they were
<task-notification> blocks, background-task completions that Claude Code delivers
through the user channel, and the wrapper stripper was not catching them. Each one reset the
preceding-turn bucket to neutral and moved assistant messages out of the correction denominator.
The bug was caught not by the verification harness but by building a second instrument on the same
data. Published 2026-08-11 morning at 3.16×, corrected the same day to
1.98×; the harness grew from 28 checks to 31.
Every test below derives from the published counts in results/analysis.json alone —
no transcripts required. Both variables are binary (turn tone × concession present), so the
correlation here is the phi coefficient — exactly the point-biserial Pearson r for a
2×2 table — reported with chi-square / Fisher exact tests, odds ratios, risk ratios and Cohen's h.
For the ordered gradient (neutral < correction < hot), the Cochran–Armitage trend test and
Cramér's V apply.
| comparison | rates | phi (r) | odds ratio · 95% CI | risk ratio | Cohen's h | p (χ²) |
|---|
| test | statistic | effect | p | reading |
|---|
| test | statistic | effect | p |
|---|
| limitation | why it matters for publication |
|---|---|
| No clustering correction | Messages are nested in sessions, projects and machines — the independence assumption behind every p-value above is violated. A paper needs cluster-robust standard errors or a mixed-effects logistic model. Requires record-level data, obtainable by running scripts/analyze.py on the local all-matches.jsonl. |
| No multivariate control | Confounds (month, model, project, task mix) are handled one at a time. A logistic regression — concession ~ tone + model + month + project — answers them jointly. |
| Monthly trend is aggregate points | Spearman ρ = , p = — nothing. Correlating monthly means is an ecological analysis; the trend claim must rest on record-level data. |
| Multiple comparisons | Phrase-level scans covered hundreds of dictionary entries. Apply Holm or Benjamini–Hochberg for phrase-level claims; the construct-level findings survive any correction trivially. |
| n = 1 subject | All inference is about this corpus. Generalization requires the multi-subject version of the pipeline — the repo's own research question 5. |
It cannot say whether any given concession was warranted; it cannot always tell whether one was honored; and above all it cannot generalise from a single subject. Every finding on this page is a hypothesis waiting for more corpora.
That last limit is the fixable one. The pipeline is built to run on your
history: point it at your own ~/.claude/projects and it builds the equivalent dataset
on your machine. Your transcripts never leave it — the contribution bundle carries only counts and
rates, and a mechanical text guard refuses to export anything that looks like prose, a path, or a
token. What comes back is a number like the ones above, with your name on the n.