reference-verifier — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited reference-verifier (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Performs a comprehensive 4-level audit of academic references in uploaded manuscripts. Goes beyond simple existence checks to verify metadata accuracy, topical relevance, and contextual correctness of each citation.
Does this reference actually exist as a real publication?
Are the authors, title, year, journal, volume, issue, and pages correct?
Does the cited paper actually discuss the topic it is being cited for?
Is the citation used correctly? Does the source truly support, contradict, or remain neutral toward the claim made in the manuscript — matching how it is presented?
/mnt/user-data/uploads/a. The reference list (bibliography section at the end) b. The full manuscript text with in-text citations preserved — this is critical for Levels 3-4
For each in-text citation, identify:
[1], [Smith 2023], superscript number)Build a citation map: a structured list linking each reference to every place it is cited in the manuscript with its context.
Use Python with appropriate libraries:
pymupdf (fitz) or pdfplumberpython-docxpip install --break-system-packagesFor each reference, attempt to find it in databases:
#### 1a. DOI Check (if DOI present)
web_fetch on https://api.crossref.org/works/{DOI}#### 1b. PubMed Search
PubMed:search_articles to search by title keywords and first authorPubMed:get_article_metadata to get full detailsPubMed:convert_article_ids to get DOI/PMCID if missing#### 1c. CrossRef Title Search (fallback)
web_fetch on https://api.crossref.org/works?query.bibliographic={encoded_title}&rows=3#### 1d. Scholar Gateway (additional fallback)
Scholar Gateway:semanticSearch with the reference title as queryStatus assignment:
EXISTS — Found in at least one databaseNOT_FOUND — Not found in any database (possible fabrication)For references that exist, compare the manuscript's reference entry against database records:
| Field | Match criteria |
|---|---|
| Title | ≥85% fuzzy similarity |
| First author | Last name match |
| Author list | All authors present (order may vary) |
| Year | Exact match |
| Journal name | Fuzzy match (abbreviations differ) |
| Volume | Exact match |
| Pages | Start page match at minimum |
| DOI | Exact match if both present |
Use the scripts/ref_utils.py helper for fuzzy matching.
Status assignment:
METADATA_CORRECT — All fields matchMETADATA_MINOR_ERRORS — 1-2 minor discrepancies (e.g., page range off by one, journal abbreviation difference)METADATA_MAJOR_ERRORS — Significant mismatches (wrong year, wrong journal, wrong first author)For each error, record exactly which fields are wrong and what the correct values are.
For each citation, determine whether the cited paper actually covers the topic it is cited for.
#### 3a. Retrieve the cited paper's content Try in this order:
PubMed:convert_article_ids to get PMCID, then PubMed:get_full_text_articlePubMed:get_article_metadata (always has abstract)Scholar Gateway:semanticSearch with a query combining the paper's title and the topic it's cited forbioRxiv:get_preprint#### 3b. Identify the cited topic From the citation map (Step 0), determine what specific topic/claim the manuscript cites this reference for. For example:
#### 3c. Check topical coverage Analyze the retrieved content (full text or abstract) to determine:
Status assignment:
TOPIC_CONFIRMED — The cited paper clearly covers the cited topicTOPIC_PERIPHERAL — The paper mentions the topic but it is not a main focusTOPIC_NOT_FOUND — The paper does not appear to discuss the cited topic at allTOPIC_UNVERIFIABLE — Could not retrieve enough content to assess (only title available)The most critical level. Determine whether the citation is used correctly in the manuscript context.
#### 4a. Classify citation usage in the manuscript Read how the citation is used and classify the manuscript's claim:
#### 4b. Verify against source content Using the retrieved content from Level 3, check:
Status assignment:
CITATION_CORRECT — The source supports the way it is citedCITATION_MISLEADING — The source is real and relevant, but the manuscript misrepresents its findings (e.g., claims support when the source actually found the opposite)CITATION_EXAGGERATED — The source partially supports the claim but the manuscript overstates itCITATION_IMPRECISE — Minor inaccuracies in how the source is represented (e.g., slightly wrong statistic)CITATION_UNVERIFIABLE — Cannot retrieve enough content to verify contextual accuracyCITATION_METHOD_ONLY — Cited for methodology; cannot assess claim accuracyFor each non-correct status, provide a specific explanation of the discrepancy.
verified_references.bibBibTeX file containing all references that passed Level 1 (existence), with corrected metadata from Level 2. Use scripts/ref_utils.py for generation.
@article{Smith2024,
author = {Smith, John and Doe, Jane},
title = {Corrected Title From Database},
journal = {Correct Journal Name},
year = {2024},
volume = {10},
number = {2},
pages = {100--110},
doi = {10.xxxx/xxxxx},
pmid = {12345678},
}reference_audit_report.mdComprehensive markdown report organized as follows:
# Reference Audit Report
## Executive Summary
- Total references: N
- Level 1 (Existence): X verified, Y not found
- Level 2 (Metadata): X correct, Y with errors
- Level 3 (Topical): X confirmed, Y questionable
- Level 4 (Context): X correct, Y problematic
## Critical Issues (Action Required)
[References with NOT_FOUND, TOPIC_NOT_FOUND, CITATION_MISLEADING, or METADATA_MAJOR_ERRORS]
## Detailed Audit by Reference
### Reference [1]: Smith et al. (2024)
**Level 1 — Existence**: ✅ EXISTS (PMID: 12345678)
**Level 2 — Metadata**: ⚠️ MINOR ERRORS
- Year in manuscript: 2023 → Correct: 2024
- Pages in manuscript: 100-108 → Correct: 100-110
**Level 3 — Topical Relevance**:
- Cited for: NEC incidence in preterm infants
- Assessment: ✅ TOPIC_CONFIRMED — The paper's primary focus is NEC epidemiology
**Level 4 — Contextual Accuracy**:
- Citation 1: "Smith et al. reported a NEC incidence of 7% [1]"
- Usage type: QUANTITATIVE
- Assessment: ⚠️ CITATION_IMPRECISE — Source reports 6.8%, manuscript rounds to 7%
- Recommendation: Consider citing the exact figure (6.8%)
- Citation 2: "These findings support early intervention [1]"
- Usage type: SUPPORTS
- Assessment: ✅ CITATION_CORRECT — Source concludes early intervention improves outcomes
[Repeat for each reference]
## Metadata Corrections Table
| Ref # | Field | In Manuscript | Correct Value |
|-------|-------|--------------|---------------|
| [3] | Year | 2023 | 2024 |
| [7] | Pages | 45-50 | 45-52 |
## References Not Found
[Details on references that could not be verified]Write both outputs to the user's current working directory (not /mnt/user-data/outputs/ — that path only exists in the Claude.ai web sandbox and will not work in local CLI installs).
reference_audit_report.md — the markdown report shown aboveverified_references.bib — the cleaned BibTeXIf the input manuscript file is named e.g. paper.pdf, prefix the outputs with the manuscript stem: paper_audit.md and paper_refs.bib. Otherwise fall back to the generic names.
If the user asks for HTML (phrases like "as html", "html report", "open in browser"), also produce <stem>_audit.html next to the markdown. Use the first method that works:
pandoc <stem>_audit.md -o <stem>_audit.html --standalone --metadata title="Reference Audit"pip install --break-system-packages markdown): python3 -c "import markdown; h=markdown.markdown(open('<stem>_audit.md').read(),extensions=['tables','fenced_code']); print('<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title>Reference Audit</title><style>body{font-family:system-ui,sans-serif;max-width:900px;margin:2em auto;padding:0 1em;line-height:1.5}table{border-collapse:collapse}td,th{border:1px solid #ccc;padding:6px 10px}code{background:#f4f4f4;padding:2px 4px}</style></head><body>'+h+'</body></html>')" > <stem>_audit.htmlIn the chat reply, output:
paper_audit.md, paper_refs.bib")METADATA_MAJOR_ERRORS / RETRACTED)
Do not dump the full per-reference detail into chat after writing — point the user at the file.
Process all four levels for each reference sequentially. Give a progress update every 5 references.
[3-5] or [2,7,12], each reference needs its own contextual assessment.pymupdf, python-docx, pdfplumber (install as needed)scripts/ref_utils.py — fuzzy matching, BibTeX generation, report formatting~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.