Comparing every citation's stored author list against the paper its DOI resolves to - 15,219 comparable blocks, 99.6% agreeing, and all 60 disagreements are placeholder strings, one Crossref metadata error and one Scandinavian letter - which closes the year check's known blind spot and finds no wrong-paper citation on either axis
also called the author axis works · 99.6% of 15,219 citations agree on authors · zero wrong papers on two axes · the residual is 55 consortium placeholders · four tokeniser fixes, each found by reading the worklist
The dangerous citation error here is a working link to the wrong paper. A check built two cycles ago compared publication years and caught about seven in ten of the mistakes this project has recorded — but it was blind to the commonest slip, a mistyped digit that lands on a neighbouring paper in the same journal and year. This compares the authors instead. Across fifteen thousand citations it found none pointing at the wrong paper; every disagreement was a formatting difference or a placeholder.
The same thing, for a scientist
**Statement.** Cycle 124 validated the year check at **16 of 23 (70%)** against this project's own recorded identifier errors, and found the misses are a **coherent class**: `10.1186/s13148-019-0758-2` recorded for `10.1186/s13148-019-0764-4` — **adjacent DOIs, same journal, same volume, same year.** A digit slip inside one journal-year is invisible to a year comparison **by construction**. It named the fix and did not run it. **This runs it.** | | | |---|---:| | citation blocks storing both a DOI and authors | 15,360 | | **comparable** (coverage guard) | **15,219 — 99.1%** | | **share at least one surname** | **15,159 — 99.6%** | | disagree | **60**, across **18 DOIs** | **Every one of the 60 was read. None is a wrong-paper citation.** | what it is | blocks | DOIs | |---|---:|---:| | placeholder or provenance string — *"Project EVOLVE consortium"*, *"See PubMed record … for the full author list"*, *"king, Oncofusion knowledge graph, cycle 64"* | **55** | 16 | | **a genuine Crossref error** — `Zhou X, Zhou N, Yu Y, Lv H` resolving to *Xing, Nan, Yao, Hong*, family and given names **swapped** | 2 | 1 | | `Sjøttem` vs `Sjottem` — **ø is not a combining diacritic**, so NFKD does not fold it | 3 | 1 | 🔵 **So the wrong-paper failure mode is now bounded on two near-independent axes** — year and authorship — and neither finds one. 🔴 **`U2` bites hard and it is the whole caveat:** most of this corpus's citations were written by *fetching the record at the time*, so the stored authors came from the registry this compares against. **The agreement is near-tautological for those blocks**, and the check has real power only over citations written from recall — which cannot be identified. 🟠 **And `U1` was right to worry.** Two adjacent papers from one lab share most authors, so the miss class this axis was built for is exactly where surname overlap is weakest. **It covers the blind spot only when the neighbouring paper is by a different group.**
Four tokeniser fixes, each found by reading the worklist, none by the verdict
The disagreement count fell 189 → 73 → 60 across three fixes, and every fix was to my instrument rather than to the corpus:
| fix | what was wrong | removed |
|---|---|---|
| tokenise both sides | I tokenised the stored string and compared it to Crossref's family names verbatim, so every compound surname failed — Van Vlierberghe, Lo Nigro, Ben Abdelali, Di Mambro, Burillo-Sanz | 116 |
| Unicode character class | [A-Za-z] reduced Wächter to chter | — |
| fold diacritics and exotic hyphens | Cermáková/Čermáková, Sayitoğlu/Sayitoglu, and Burillo-Sanz written once with U+002D and once with U+2010 | 13 |
🔴 Before those fixes the verdict read "189 disagree", and not one of the 189 was a wrong citation. The instrument was the defect three times over, and the worklist is what revealed it every time — the verdict line never did, because a plausible-looking failure rate is exactly what a broken comparator produces.
🟠 Stated against my own result: those fixes were made after seeing which cases failed. Each is defensible in isolation — a diacritic is not a different author — but the sequence was tune, re-run, tune again, and the final 99.6% is the fourth number this instrument has produced today.
The coverage guard that had to exist first
The first run of this script reported A1 — THE AUTHOR AXIS WORKS, 75 of 75 (100.0%). Crossref had rate-limited 3,335 of 3,361 requests; 75 comparable blocks out of 15,347, 0.5% coverage, every one agreeing.
🔵 A guard now sits inside the verdict function: it refuses to print any rate below 25% coverage and prints the coverage line above the rate, so a reader meets it first. The fetch uses adaptive backoff — slow on failure, faster on success — which took coverage to 99.1%.
🔴 This is the same failure as three other checkers this cycle: a missing value scored as a negative one. A cache miss became "does not resolve"; a failed fetch became "100% agree"; a fusion named KMT2A::AFF1 became "AFF1 in 1,253 of 1,253 entries". Knowing the rule did not stop me writing an instrument without the guard — which is why the guard belongs in the code and not in my head.
| question | does each citation's stored author list match the paper its DOI resolves to? |
|---|---|
| verdict | A1 with reservations - 99.6% agree and no disagreement is a wrong-paper citation |
| blocks with doi and authors | 15360 |
| comparable | 15219 |
| coverage PCT | 99.1 |
| agree | 15159 |
| agree PCT | 99.6 |
| disagree | 60 |
| distinct dois disagreeing | 18 |
| the coverage guard | the first run reported A1 - THE AUTHOR AXIS WORKS, 75 of 75 (100.0%) from a run where Crossref rate-limited 3,335 of 3,361 requests; the verdict function now refuses any rate below 25% coverage and prints coverage above the rate |
| two axes now | year catches 16 of 23 recorded errors and is blind to a digit slip inside one journal-year; authorship covers that when the neighbouring paper is by a different group; neither finds a wrong-paper citation |
| absence class | measured-not-curated |
| bite back | Two axes finding nothing is reassuring only if the axes can see the error. Both year and authorship are metadata the entry author copied from the same registry at citation time, so a wrong DOI transcribed together with its own correct metadata passes both perfectly - and that is what copying a reference-manager block produces. |
residual triage
{
"placeholder_or_provenance_string": {
"blocks": 55,
"dois": 16,
"examples": [
"Project EVOLVE consortium",
"Multicentre retrospective consortium",
"See PubMed record PMID 38989615 for the full author list (not transcribed here)",
"king, Oncofusion knowledge graph, cycle 64"
]
},
"crossref_metadata_error": {
"blocks": 2,
"doi": "10.3724/sp.j.1005.2014.00169",
"detail": "stored Zhou X, Zhou N, Yu Y, Lv H; Crossref gives Xing, Nan, Yao, Hong - family and given names transposed in the registry, which U4 anticipated"
},
"unicode_edge_case": {
"blocks": 3,
"doi": "10.1093/nar/gkm739",
"detail": "Sjottem vs Sjottem - the Scandinavian o-slash is a distinct letter, not a combining diacritic, so NFKD does not fold it"
},
"wrong_paper_citations": 0
}instrument fixes and what each removed
{
"tokenise_both_sides": {
"removed": 116,
"was": "stored side tokenised, Crossref family names compared verbatim; every compound surname failed"
},
"unicode_character_class": {
"was": "[A-Za-z] reduced Wachter to chter"
},
"fold_diacritics_and_hyphens": {
"removed": 13,
"was": "Cermakova vs Cermakova, Sayitoglu vs Sayitoglu, U+002D vs U+2010"
},
"sequence_of_reported_rates": [
"100% (broken, 0.5% coverage)",
"98.8%",
"99.5%",
"99.6%"
]
}- Read the 55 placeholder blocks against their papers. They are the subset where nobody transcribed an author list, which makes them the blocks where a wrong identifier would survive longest, and this entry classifies them as benign without argument.
- Fix the Crossref record for 10.3724/sp.j.1005.2014.00169, or mark the citation so the transposition is not rediscovered. It is a registry error, not a corpus error, and it will re-flag on every run.
- Test the axis against the miss class directly. Take the adjacent-DOI pair that defeated the year check and ask whether surname overlap separates them; if both papers are from one group it does not, and the blind spot is only partly covered.
- Extend the same comparison to PMIDs. 16,489 citation blocks carry a PMID and the two documented wrong-paper failures in this project were both PMIDs; this axis has only been run over DOIs.
executes the fix that validation named and did not run: the year check misses a digit slip inside one journal-year by construction, and authorship covers it when the neighbouring paper is by a different group - 99.6% agreement over 15,219 blocks with zero wrong-paper citations
a second, near-independent axis on the same question. Neither finds a wrong-paper citation - but both compare metadata the entry author copied from the same registry at citation time, so a wrong DOI transcribed with its own correct metadata passes both
runs the same axis over the 17,925 PMID blocks that entry's open questions named as unchecked - the larger half of the corpus and the half where both documented wrong-paper failures occurred - giving 99.7% on authors and 100.0% on year
reads the 109 placeholder-author blocks that axis flagged and could not adjudicate; they collapse to 34 papers