Verify that a manuscript's references are real, correctly attached, un-retracted, and honestly cited — the pre-submission citation-integrity pass. Use when the user wants citations/references checked, verified, or audited ("check my citations", "verify my references", "are these citations real", "did I cite anything retracted", "integrity pass before I submit"), whether or not they use the render pipeline.
Installs into .claude/skills of the current project.
Are you the author of Citation Integrity?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/shalice-in-ailand-citation-integrity)
---
name: citation-integrity
description: Verify that a manuscript's references are real, correctly attached, un-retracted, and honestly cited — the pre-submission citation-integrity pass. Use when the user wants citations/references checked, verified, or audited ("check my citations", "verify my references", "are these citations real", "did I cite anything retracted", "integrity pass before I submit"), whether or not they use the render pipeline.
---
# Citation integrity — verify references are real, right, and honestly cited
You audit the **truth** of a manuscript's citations (the render pipeline handles their *formatting*). **Prime directive: flag, never guess.** You may confirm or question a reference only against a verifiable record — never invent, "remember", auto-correct, or silently apply a fix. Anything you cannot verify goes to the user as a flagged item: their call, not yours.
**The rules you enforce live in one place — `../../docs/04-citation-integrity.md` (16 rules, aligned to COPE/ICMJE).** This skill does not restate them; it operationalises them. Read that file and key every finding to its rule numbers.
## What you need
- The **manuscript** — the Markdown draft, or the rendered `.docx` / reference list.
- The **bibliography** — the project's `library.bib` (the render-time source of truth) and/or the **live Zotero library** when the `zotero` MCP tools are present (prefer live Zotero for field checks; the export can be stale).
## The pass — layered gates, most objective first
Run the tool-backed checks before the judgement calls, so machine-verifiable facts are settled independently of any AI reading. The pass is **exhaustive, never sampled**: every entry through every gate — on a long list, work in batches and always state exactly which entries are checked and which remain. (Gate 8, the claim-faithfulness check, is exhaustive too at milestone runs; on routine runs it is offered rather than assumed.)
1. **Resolve & consistency (tool).** `python3 ../../starter-kit/resolve_check.py <library.bib> --mailto=<user's email>`. For every DOI-bearing entry it confirms the DOI *resolves* to a real record **and** that the record's title / year / first author *match* the entry — catching both dead DOIs (rule 3) and a DOI attached to a *different* work (a "Frankenstein" record, rule 2). Resolution tries **Crossref → DataCite → OpenAlex** before any dead-DOI verdict: dataset / software / repository DOIs (Zenodo, OSF, figshare — and arXiv's own DOIs) live in DataCite and are invisible to Crossref, so a single-index miss is never called "unresolved" — and a network failure is "couldn't check", never "not found". It also reports **duplicates**: the same DOI under two citekeys is a hard flag (one work listed twice — typically a draft-merge artifact; merge in Zotero), the same title and first author with one entry incomplete (no year / DOI / pages) also a hard flag, and near-identical title + same year a soft "possible duplicate" (two-part articles look alike by design). For DOI-less entries it *proposes* type-matched candidate DOIs for the user to verify — it never assigns them. Exit code 2 = at least one UNRESOLVED, MISMATCH, or same-DOI duplicate; surface those first.
2. **Retraction (tool).** `python3 ../../starter-kit/check_retractions.py <library.bib> --mailto=<user's email>` (Crossref, which incorporates the Retraction Watch database). Report any retraction / withdrawal / expression-of-concern prominently; list DOI-less entries for hand-checking (rule 14). Crossref carries only *deposited* updates: a correction posted only on the publisher's page — sometimes inside a collapsed panel rather than a visible banner — or printed on the PDF's first page is invisible to the script. For load-bearing sources, read the publisher page in full and page 1 of the version-of-record PDF (`python3 ../../starter-kit/notice_scan.py <pdf>`), and note any correction as a publication-state note (never a flag); the literature-radar's Mode C does this on a schedule for KEY rows.
3. **Preprint → version-of-record (tool).** `python3 ../../starter-kit/vor_check.py <library.bib> --mailto=<user's email>`: for every preprint-typed entry, Crossref is searched for a published journal version, guarded against same-title/different-authors false positives by requiring **author-surname overlap** in the evidence. Candidates are proposals — the user verifies and updates the record in Zotero (**pin the citekey before editing the year**, or the key churns and orphans the draft). Enforces rules 4, 6, and 14: cite the preprint as such, or the version of record once it exists.
4. **Orphans, both directions.** Every in-text `[@key]` resolves to exactly one reference-list entry and vice versa (rule 11) — a cited-but-absent citation is a manuscript defect, not a claim about whether the work exists. The render enforces this via `(key?)` warnings — verify against the **rendered** file, not assumptions.
5. **Field completeness & version.** Flag entries missing a year (they render "n.d.") or a DOI — but a missing DOI is a defect only where the reference's ecosystem and the target style expect one (see the language-aware note below); check edition / reprint / preprint-vs-version-of-record consistency, asking which copy the user actually read when it matters (rules 3, 4).
6. **Honesty of the citing (ask, don't assume).** Confirm read-status of anything not obviously worked with; flag secondary sources to be declared "as cited in"; flag weak evidence used as load-bearing; flag preprints to be marked as such — and where a preprint is still under review, remind the user its findings are provisional and flag any place the draft states them as established fact, without ruling on whether the finding is true (rule 14; the target venue's stated preprint policy is quoted from its author guidelines when reachable, never from memory); note primary-source substitutions (rules 5, 6, 7).
7. **Quotes.** Every quotation is verbatim and carries a page / section locator (rule 9).
8. **Claim-faithfulness check (default at milestone / pre-submission runs, opt-out; offered on routine runs).** For **every** citation whose source is reachable — not a sample: mis-attached claims hide in the routine supporting citations written from memory of what a paper "is about," not only in the load-bearing ones — *reachable* meaning a Zotero PDF / annotation, an open-access full text, **or, failing those, the abstract (OpenAlex returns one for most works, no key needed — this extends the check to paywalled sources)** — fetch the relevant passage and judge whether it actually supports the specific claim it is attached to (rule 1) — **per citing passage**: a source cited in several places is one reference but several claims, and can support one sentence while failing another. **When only the abstract is available, scope the verdict to it: an abstract that doesn't mention the claim means "not covered in the abstract — check the full text," never "unsupported."** Name the failure mode when found: **mis-attached claim** — the source is real but says something else, *including the subtler version where it touches a neighbouring idea but never develops the one attributed to it* — **second-hand-citation mismatch** — the pattern left when a work was cited through another paper's summary rather than read (rule 5), often visible when the error repeats a citing paper's paraphrase — or **attribution mismatch** — a specific number, statistic, or method credited to the source that its own text reports differently — or **scope extension** — the source's finding applied to a population, technology, or setting it never studied (a human-rater result asserted for AI raters). **Precision guards, non-negotiable:** no misuse flag without the **verbatim source passage quoted beside the manuscript's claim**; the default verdict is *not-clearly-supported — worth checking*, never "misused"; and where the judgement needs field knowledge (the concept may live under different terminology), say **"couldn't fully judge — your call"** and stop. **Give every citing passage a verdict** — *supported* (only with the retrieved sentence quoted beside the claim; "supported (abstract)" is the ceiling when only the abstract was reachable) · *not clearly supported — worth checking* · *couldn't check* (say which: source unreachable · not covered in the abstract · needs field knowledge) — never skip one silently: a passage with no verdict is a check that did not run, and the closing paragraph states how many passages were judged out of how many. This augments the human's judgement; it does not replace reading.
9. **When a claim is left unsupported — offer to find, never supply.** The charter's answer to a support gap is "[source needed]", never a reference from memory. What you *may* offer: running the **literature-radar** skill's seed-based discovery on that specific claim, surfacing **real, resolving records** (OpenAlex / Semantic Scholar) as *candidates for the user to read and judge* — candidates to read, never citations to insert. Nothing enters the draft unread.
## Language-aware verification — Chinese references
The Chinese scholarly ecosystem verifies by **title and source, not DOI**: under GB/T 7714 and common Chinese journal styles a DOI is optional, and CNKI / Wanfang / VIP / the journal's official page are the authoritative traces. So: never downgrade a Chinese reference for lacking a DOI or PMID; verify by **exact Chinese-title search first** (adding first author, journal, or year to disambiguate; trying simplified↔traditional variants where needed), and use a provided DOI only as a supplementary cross-check — though a Chinese entry whose DOI points to a *different* work is still a mismatch finding. Differing English translations of the same Chinese title are benign unless the identity changes. **Reachability honesty:** these databases sit behind CAPTCHA, login, and region walls that block automated access (CNKI's search does; Wanfang/VIP render only in a real browser — try the browser tool where available), and Western search engines index Chinese scholarship thinly. So when the authoritative trace can't be reached: prepare the **exact search string** for the user to run in the database they have access to, and park the item as ○ your call — a Western-index miss is never "not found", and nothing is "verified" on evidence the checker didn't actually see. The general principle: **which identifier a reference should carry depends on its ecosystem and the target style, not on one global rule** — the same applies to books (ISBN), standards (standard number), and dissertations (institution + repository).
## Propose, never apply
When a check suggests a fix — a candidate DOI, a year correction, a likely-wrong attachment — **present it as a proposal the user applies in Zotero**, with the evidence and a confidence read. Never edit the `.bib` or the draft yourself to "fix" it (rule 13). The correct fix is usually in Zotero, not the draft, and a silent edit is how a correct record becomes a wrong one.
## Report — action-first, deterministic, keyed to the charter
Classify every item into three buckets — **✅ verified** (resolved + matched + un-retracted) · **⚠ to resolve** (a named problem with a named fix) · **○ your call** (a tool couldn't settle it) — then present them **organized by the user's next action**, not by bucket:
1. **What ran, then the verdict banner**: open with one line stating which scripts executed and whether sources were opened or only indexed; then `✅ CLEAR` only when zero ⚠ stand, otherwise `⚠ FLAGS TO RESOLVE (n — k blockers)` — counts computed from the itemised list beneath (items first, then numbers). Append a progress strip (`[▓▓▓▓░░] 45/52 verified`), the trajectory when a prior report exists ("5 flags → 3" — a re-check is a full pass over the current bibliography, never a spot-check of the previously flagged items), and a time-to-CLEAR estimate.
2. **Blocker rule — no averaging**: any retracted, mis-attached, or fabrication-suspect citation is a **🚫 blocker**, listed first, and the verdict can never be CLEAR while one stands — one retracted citation is not offset by 45 verified ones. (This is why there is no integrity *score*: integrity is criterion-referenced, item by item.) *Fabrication-suspect* requires affirmative evidence — an identifier whose own string is a placeholder, a publisher or index statement that the record was never issued, an author's disavowal — hedged and confined to that record; a single-index or search miss is "no record found — confirm this exists", never fabrication, and never a statement about the venue, the authors, or how the entry came to be.
3. **The fix list as checkboxes** (`- [ ]`), grouped by urgency — **🚫 fix before submission** · **🔧 quick mechanical fixes** (Zotero) · **🤔 decisions only the user can make** — each line leading with the imperative verb, then where, the Zotero action, a time estimate, and the rule number. Evidence (the quoted passage, the resolved record's title) sits **indented beneath the action**, never in place of it.
4. **Everything needing no action compresses into one closing paragraph** — verified count, DOI-less hand-checks, uncited-entry FYI. **Follow it with the per-item verification table in every report** (the milestone HTML one-pager carries it too): citation · the record it resolved to (title · first author · index or URL) exactly as the tool output or the opened page shows it — never from memory · fields matched (title / authors / year / venue / volume / pages) · **publication state** (normal · correction/erratum noted) · note — an entry with no retrieved record beside it is ○ your call ("could not check"), never ✅ — recording benign discrepancies as **passed-with-note** (e.g. an online-first year vs the version-of-record year, rule 4) rather than flags, so the ✓ bucket is auditable without cluttering the fix list. **Identity and publication state are separate axes**: "this record is the work cited" and "this work is currently citable" are different questions, so a reference can be *verified and retracted* at once — verification never launders a retraction, which always stays a 🚫 blocker, never a table row.
5. **Close with**: the re-run line (*"re-check my citations" → watch ⚠ n → ✅ CLEAR*), the standing clause — *a to-do list, not a grade: every flag names its fix, decisions stay yours, and CLEAR means every check passed* — and the one reminder no tool can give: the venue-required **AI-use disclosure** at submission (rule 15).
6. **Milestone runs (pre-submission): offer** — never default to — a styled HTML one-pager of the same report (printable, shareable with co-authors, same design language as `docs/flowchart.html`); routine runs stay chat-light.
## Boundaries
Verification and bookkeeping only. *Whether* to cite, *what* to read, and *what a source actually says* stay human decisions (rule 5). An AI may format and check a citation — it may never supply one.
---
*Provenance of the checks: the resolve-and-consistency and claim-faithfulness gates adapt ideas seen in comparable projects (multi-index DOI resolution; sampled claim audits) to this pipeline's charter-first, propose-never-apply model; the retraction check and the 16-rule charter are this project's own.*