$npx -y skills add Aperivue/medsci-skills --skill verify-refsAudit-only verification of manuscript references against PubMed and CrossRef. Detects fabricated or mismatched citations and writes qc/reference_audit.json. Does not modify references/ or refs.bib.
| 1 | # Verify References (Audit-Only) |
| 2 | |
| 3 | You help a medical researcher prevent reference hallucinations before submission. |
| 4 | This skill audits an existing manuscript or bibliography. It **does not write** |
| 5 | to `references/` or `manuscript/_src/refs.bib`. It does not discover new |
| 6 | literature; use `/search-lit` for discovery and `/lit-sync` for bib management. |
| 7 | |
| 8 | ## When to Use |
| 9 | |
| 10 | - Before journal submission, especially for `.docx` manuscripts inherited from |
| 11 | coauthors or external editors. |
| 12 | - After AI-assisted drafting or revision introduced or modified references. |
| 13 | - When a reviewer or collaborator flags a possibly fabricated citation. |
| 14 | - Before `/sync-submission` freezes a journal package. |
| 15 | |
| 16 | ## Inputs |
| 17 | |
| 18 | 1. Manuscript or bibliography path: `.md`, `.docx`, `.bib`, `.txt`, or `.tsv`. |
| 19 | 2. Optional project root. Default: current working directory. |
| 20 | 3. Optional flags passed to the script: |
| 21 | - `--offline`: extract and classify references without API verification. |
| 22 | - `--timeout N`: HTTP timeout seconds. |
| 23 | |
| 24 | ## Companion: pandoc citation key check |
| 25 | |
| 26 | For markdown manuscripts using pandoc `[@bibkey]` citations, validate citation |
| 27 | keys first to catch undefined/unused keys before this audit. If you also use the |
| 28 | companion `manage-refs` skill, run its `check_citation_keys.py` for this; |
| 29 | otherwise use your reference manager's citation-key check. |
| 30 | |
| 31 | Then run `verify_refs.py` against the .bib to validate each entry against |
| 32 | PubMed/CrossRef. The two checks are complementary: a citation-key check catches |
| 33 | mis-keyed cites; `verify_refs.py` catches fabricated metadata. |
| 34 | |
| 35 | ## Deterministic Script |
| 36 | |
| 37 | Run the bundled script rather than verifying citations by memory: |
| 38 | |
| 39 | ```bash |
| 40 | python "${CLAUDE_SKILL_DIR}/scripts/verify_refs.py" manuscript/manuscript.md --project-root . |
| 41 | ``` |
| 42 | |
| 43 | For hooks or quick manual runs, use the wrapper: |
| 44 | |
| 45 | ```bash |
| 46 | "${CLAUDE_SKILL_DIR}/scripts/verify_cli.sh" manuscript/manuscript.md --offline |
| 47 | ``` |
| 48 | |
| 49 | **Manual pre-submission strict run** (Phase 1A.5): |
| 50 | |
| 51 | ```bash |
| 52 | "${CLAUDE_SKILL_DIR}/scripts/verify_cli.sh" manuscript/index.qmd --strict |
| 53 | ``` |
| 54 | |
| 55 | `--strict` forbids `--offline` and exits non-zero on any UNVERIFIED row. |
| 56 | Full checkpoint protocol: `references/manual_checkpoint_guide.md`. |
| 57 | |
| 58 | The script uses DOI, PMID, CrossRef, PubMed E-utilities, and OpenAlex where |
| 59 | available. If network verification fails, it records `UNVERIFIED` rather than |
| 60 | silently passing. |
| 61 | |
| 62 | **OpenAlex tertiary index (existence recovery).** PubMed covers only biomedical |
| 63 | literature and CrossRef's conference-proceedings coverage is uneven, so |
| 64 | NeurIPS / ICLR / ACL-style citations — common in medical-AI manuscripts — fall |
| 65 | through both and would be marked `UNVERIFIED`. After the PubMed and CrossRef tiers, |
| 66 | the script consults OpenAlex (`https://api.openalex.org`, free, no API key) **only |
| 67 | when no authoritative author list was obtained yet** (so a reference already |
| 68 | resolved by PubMed/CrossRef incurs no extra call). It resolves by DOI when present, |
| 69 | otherwise by a title search guarded by a token-similarity threshold so a fabricated |
| 70 | title cannot earn a spurious `OK`. This is the free analogue of the second index |
| 71 | (e.g. Scopus) that journal submission portals run alongside CrossRef. OpenAlex |
| 72 | display names carry no structured family/given split and mix `First Last` with |
| 73 | `Last, First` forms, so OpenAlex-sourced authors support an existence check plus a |
| 74 | tolerant first-author *membership* check, but never drive the strict positional or |
| 75 | author-count MISMATCH (those stay reserved for PubMed efetch / CrossRef). An |
| 76 | OpenAlex miss is recorded as `UNVERIFIED`, never `FABRICATED`. Pass `--no-openalex` |
| 77 | to restrict verification to PubMed + CrossRef. |
| 78 | |
| 79 | ## Output Contract (v1.3.0) |
| 80 | |
| 81 | | Artifact | Path | Purpose | |
| 82 | |---|---|---| |
| 83 | | Audit JSON | `qc/reference_audit.json` | Sole output — row-level status (OK/MISMATCH/UNVERIFIED/FABRICATED), counts, `cited_authors[]`/`actual_authors[]`, `duplicate_findings[]`, submission-safe flag, full records | |
| 84 | |
| 85 | **v1.2.0 (2026-05)** adds `duplicate_findings[]` to the audit JSON. Verbatim PMID or DOI duplicates within the reference list are flagged as MAJOR findings (resolves `/peer-review` Phase 2A P7). DOI normalization strips `https://doi.org/`, `http://dx.doi.org/`, `doi:` prefixes plus trailing slashes before comparison so `https://doi.org/10.x/abc/` and `10.x/abc` collapse to one key. Both `submission_safe` and `fully_verified` now require `duplicate_findings` to be empty. |
| 86 | |
| 87 | **v1.3.0 (2026-05)** extends the author cross-check from first-author-only to the **full author list** and bumps `schema_version` to 4. For BibTeX inputs, every cited author family name is co |