Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Deterministic anti-hallucination gate for cited references. Resolves each entry in a manuscript .bib file against Crossref, OpenAlex, and arXiv; flags fabricated (identifier resolves to nothing), mismatched (title/author/year disagree), unverifiable (no identifier), unchecked (offline cache miss — never silently OK), and anachronistic (future-dated) citations. Offline-first with a persistent SQLite cache; live network resolution is opt-in. Use when verifying citation existence, auditing a refere
.claude/skills/docxology-reference-verification/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-13 | ✗→✓ | ▲ Improved | -27% | 0% |
| case-01 | ✗→✓ | ▲ Improved | -39% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -34% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -21% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -60% | 0% |
Given the references a manuscript claims to cite, prove (or disprove) that each one exists and matches its cited metadata. This is the verification side of the literature workflow; infrastructure/search/literature is the discovery side.
id → arXiv API; bare title → Crossref title search with a similarity floor.
ok, mismatch, fabricated, unverifiable,unchecked, anachronism.
allow_network=False (default), consult only theSQLite cache and report unchecked on a miss — a skipped check never launders into a clean pass.
"fabricated" is fast and stable.
bashuv run python -m infrastructure.reference.verification verify references.bib uv run python -m infrastructure.reference.verification verify references.bib --live --as-of-year 2026 --fail-on-issues uv run python -m infrastructure.reference.verification verify references.bib --json uv run python -m infrastructure.reference.verification cache-clear
pythonfrom infrastructure.reference.verification import ReferenceResolver, ResolutionCache, verify_bibfile resolver = ReferenceResolver(cache=ResolutionCache("cache.db"), allow_network=True) report = verify_bibfile("references.bib", resolver, as_of_year=2026) print(report.summary_line()) assert not report.has_blocking
resolver.py — DOI/arXiv/title resolutionverifier.py — classification + temporal integritycache.py — persistent SQLite resolution cacheinfrastructure/search/literature/SKILL.md — discovery sidedocs/prompts/manuscript-claim-verification/SKILL.md — workflow that drives this gateThe status taxonomy and cross-index/temporal-integrity ideas are an original, Apache-2.0 distillation of patterns from Imbad0202/academic-research-skills (CC-BY-NC-4.0). No ARS code is vendored.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-13 | fail→pass | 7,356 | 1,889 | -74% | 1 | 1 | 0% | 1,346 | 989 | -27% | 0 | 0 | — |
case-01 | fail→pass | 16,499 | 5,684 | -66% | 1 | 1 | 0% | 3,090 | 1,882 | -39% | 0 | 0 | — |
case-02 | fail→pass | 10,463 | 3,397 | -68% | 1 | 1 | 0% | 2,083 | 1,375 | -34% | 0 | 0 | — |
case-03 | fail→pass | 10,353 | 2,915 | -72% | 1 | 1 | 0% | 1,539 | 1,220 | -21% | 0 | 0 | — |
case-04 | fail→pass | 17,515 | 2,945 | -83% | 1 | 1 | 0% | 2,907 | 1,155 | -60% | 0 | 0 | — |
case-05 | pass→pass | 7,682 | 2,501 | -67% | 1 | 1 | 0% | 1,378 | 946 | -31% | 0 | 0 | — |
case-06 | pass→pass | 6,179 | 1,575 | -75% | 1 | 1 | 0% | 897 | 831 | -7% | 0 | 0 | — |
case-07 | pass→pass | 10,449 | 2,846 | -73% | 1 | 1 | 0% | 1,659 | 1,082 | -35% | 0 | 0 | — |
case-12 | fail→pass | 13,222 | 3,066 | -77% | 1 | 1 | 0% | 2,502 | 1,249 | -50% | 0 | 0 | — |
case-08 | pass→pass | 10,692 | 2,619 | -76% | 1 | 1 | 0% | 1,858 | 1,052 | -43% | 0 | 0 | — |
case-09 | fail→pass | 8,497 | 1,626 | -81% | 1 | 1 | 0% | 1,498 | 771 | -49% | 0 | 0 | — |
case-10 | fail→pass | 6,066 | 1,571 | -74% | 1 | 1 | 0% | 946 | 918 | -3% | 0 | 0 | — |
case-11 | fail→pass | 12,344 | 2,828 | -77% | 1 | 1 | 0% | 2,128 | 1,164 | -45% | 0 | 0 | — |
case-14 | pass→pass | 13,214 | 8,443 | -36% | 1 | 1 | 0% | 2,262 | 2,124 | -6% | 0 | 0 | — |
case-15 | pass→pass | 9,243 | 3,687 | -60% | 1 | 1 | 0% | 1,544 | 1,221 | -21% | 0 | 0 | — |
case-16 | fail→fail | 9,401 | 3,664 | -61% | 1 | 1 | 0% | 1,595 | 1,270 | -20% | 0 | 0 | — |
case-17 | fail→pass | 13,620 | 2,137 | -84% | 1 | 1 | 0% | 2,173 | 969 | -55% | 0 | 0 | — |
case-18 | pass→pass | 11,172 | 3,421 | -69% | 1 | 1 | 0% | 1,753 | 1,234 | -30% | 0 | 0 | — |
case-19 | fail→pass | 8,420 | 3,966 | -53% | 1 | 1 | 0% | 1,350 | 1,281 | -5% | 0 | 0 | — |
case-20 | fail→pass | 11,311 | 5,384 | -52% | 1 | 1 | 0% | 1,860 | 1,553 | -17% | 0 | 0 | — |
case-21 | pass→pass | 7,857 | 5,764 | -27% | 1 | 1 | 0% | 1,382 | 1,634 | +18% | 0 | 0 | — |
case-22 | fail→pass | 8,680 | 5,278 | -39% | 1 | 1 | 0% | 1,458 | 1,558 | +7% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +59 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.