alterlab-citation-verifier — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited alterlab-citation-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.
The headline existence-verification skill: given a bibliography in any common form, it proves entry-by-entry whether each reference actually exists by querying four keyless public scholarly APIs, then maps each result to the canonical AlterLab citation-hallucination taxonomy. It is the deterministic, network-grounded companion to the LLM-driven integrity_verification_agent — where that agent uses WebSearch + judgment, this skill uses authoritative API records and a reproducible Python script, so the same input always yields the same verdicts.
Verify the citations in references.bib
Check whether these DOIs resolve to the papers I cited
Audit my bibliography for fabricated / hallucinated references
Does this reference list contain any fake citations or retractions?→ Run scripts/verify_citations.py over the bibliography, read the JSON, then present a verdict table grouped by severity. Always state the offline/degraded status explicitly if the network was unavailable.
For each bibliography entry the script:
title, authors, year, venue, DOI, and arXiv ID.
SequenceMatcher ratio, defaultthreshold 0.70) and computes author-surname overlap.
update-to: retraction) or OpenAlex(is_retracted).
summary.verdict (PASS / PASS_WITH_CONDITIONS / FAIL / UNVERIFIED).
| Source | Endpoint | Used for |
|---|---|---|
| Crossref | api.crossref.org/works | DOI resolution, metadata, retraction flag |
| OpenAlex | api.openalex.org/works | DOI + title search, `is_retracted` |
| Semantic Scholar | api.semanticscholar.org/graph/v1 | DOI/arXiv resolution, title search |
| arXiv | export.arxiv.org/api/query | arXiv ID resolution, preprint title search |
All requests carry a mailto parameter (defaults to [email protected]) to stay in each API's polite pool. No API keys are required or used.
| Use this skill | Use something else |
|---|---|
| "Verify / check / audit my citations or references exist" | Writing the paper → alterlab-paper-writer |
| "Did the AI hallucinate any of these references?" | Full integrity gate inside a pipeline → alterlab-research-pipeline Stage 2.5/4.5 |
| "Do these DOIs resolve to the papers I cited?" | Grading source quality / predatory journals → alterlab-deep-research source_verification_agent |
| "Check this bibliography for retractions" | Whether a claim is supported by its source (SH) → claim_verification_protocol (Phase E) |
| Reproducible, scriptable, offline-capable existence check | Markdown dead-link audit → alterlab-link-health |
This skill answers "does the cited work exist, and does its identifier point to it?" It does not read the cited paper's full text, so it cannot by itself confirm Semantic Hallucination (does the source support the claim?) — that requires claim_verification_protocol. SH is surfaced only as an advisory flag, never asserted from API metadata alone.
Identical codes and definitions to alterlab-research-pipeline/agents/integrity_verification_agent.md (GPTZero × NeurIPS 2025; Ansari, 2026). Severity feeds the same SERIOUS / MEDIUM / MINOR scale used in the Integrity Report schema.
| Code | Name | Severity | Script trigger |
|---|---|---|---|
verified | — (exists, matches) | NONE | Title ratio >= threshold AND author overlap OK AND year consistent in >=1 authoritative source |
TF | Total Fabrication | SERIOUS | Found in no source; OR cited DOI/arXiv ID did not resolve anywhere and no close title match exists |
PAC | Partial Attribute Corruption | MEDIUM | Entry found but >=1 metadata field disagrees (year mismatch, author overlap < 50%, or title ratio < threshold) |
IH | Identifier Hijacking | SERIOUS | Cited DOI/arXiv ID resolved (method=id) but the resolved record's title is unrelated (ratio < threshold) |
PH | Placeholder Hallucination | SERIOUS | Unresolved template/placeholder ([CITATION NEEDED], \cite{}, et al., YYYY, TODO, forthcoming) — caught pre-network |
SH | Semantic Hallucination | SERIOUS | Entry resolves but does not support its claim — advisory only; requires Phase E to assert |
unverified | — (could not check) | MEDIUM | Offline, or all APIs failed for this entry. Never treated as passing. |
A RETRACTED flag is attached (and severity bumped to SERIOUS) whenever Crossref or OpenAlex marks the matched work as retracted, independent of the existence verdict.
verified, no SERIOUS/MEDIUM flags.PAC / MEDIUM issues (wrong metadata, fixable).TF / IH / PH / retraction).unverified and no concrete fabrication was found(e.g. fully offline run). This is not a pass — re-run with network access.
Accept any of: a .bib file, a .txt list of DOIs/arXiv IDs, a pasted reference list, or inline text. The script auto-detects the format; override with --format bibtex|doi|freeform if detection is wrong.
uv run python skills/core/alterlab-citation-verifier/scripts/verify_citations.py \
path/to/references.bib \
--mailto [email protected] \
--threshold 0.70 \
--out citation_report.jsonpath/to/references.bib may also be - (stdin) or inline text.--threshold tunes the fuzzy title-match ratio (0..1; default 0.70).--offline skips the network and emits unverified verdicts deliberately.--out to print the JSON report to stdout.The script auto-selects an HTTP backend: it uses requests if installed, else falls back to the Python stdlib (urllib) — so it runs with zero extra dependencies in a bare uv environment.
Parse summary.verdict and the per-entry verdict codes. Present:
verdict_counts, severity_counts).detail.TF / IH / PH: quote the cited entry and explain the evidence(e.g. "DOI 10.x resolved to an unrelated paper titled '…'").
RETRACTED flags, prominently.verdict == UNVERIFIED: state plainly that nothing was confirmed and relaythe per-entry manual_instructions.
TF / PH → the reference must be removed or replaced; it does not exist.IH → the DOI/arXiv ID is wrong; find and substitute the correct identifier.PAC → correct the specific metadata field(s) named in detail.RETRACTED → flag to the author; cite the retraction notice or drop the source.Network failures are never silently swallowed into a pass:
NetworkUnavailable; the entry becomesunverified with a populated manual_instructions field.
--offline forces every networked entry to unverified up front (placeholdersare still caught locally as PH).
UNVERIFIED (distinct from PASS) wheneverunverified entries exist without any concrete fabrication finding.
When degraded, instruct the user to re-run with connectivity, and fall back to the LLM-driven integrity_verification_agent (WebSearch) for a manual pass.
{
"tool": "alterlab-citation-verifier/verify_citations.py",
"version": "1.0.0",
"summary": {
"total": 2,
"verdict": "FAIL",
"verdict_counts": {"verified": 1, "TF": 1, "PAC": 0, "IH": 0, "PH": 0, "SH": 0, "unverified": 0},
"severity_counts": {"SERIOUS": 1, "MEDIUM": 0, "MINOR": 0},
"citation_integrity_score": 0.5,
"fabrication_risk_score": 0.5,
"retracted": 0
},
"entries": [
{"ref_id": "walters2023", "verdict": "verified", "severity": "NONE",
"title_ratio": 1.0, "author_overlap": 1.0, "matches": [{"source": "crossref"}]},
{"ref_id": "ghostpaper2021", "verdict": "TF", "severity": "SERIOUS",
"detail": "Cited DOI/arXiv identifier did not resolve in any source..."}
]
}citation_integrity_score and fabrication_risk_score (both 0..1) align with the Integrity Report schema fields of the same name, so the report can feed alterlab-research-pipeline's integrity gate directly.
config.http_backend ran but every entry isunverified, the network was down — say so; do not imply a pass.
RETRACTED flags? Surface them even on otherwise-verified entries.IH? Confirm the detail shows an id-resolved mismatch,not a loose title-search coincidence (the script enforces this distinction).
alterlab-research-pipeline/agents/integrity_verification_agent.md — canonicalFive-Type Taxonomy, compound-deception patterns, and the Lin et al. (2020) mashup case study this skill is built to catch.
alterlab-research-pipeline/references/claim_verification_protocol.md — Phase Eclaim-vs-source verification (the SH check this skill defers to).
shared/schemas/integrity_report.schema.json — the integrity-report shape whosecitation_integrity_score / fabrication_risk_score this skill mirrors.
bibliographic citations generated by ChatGPT. Scientific Reports, 13, 14045. https://doi.org/10.1038/s41598-023-41032-5
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.