verification-engine — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited verification-engine (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
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.
Orchestration Log: When this skill is activated, append a log entry tooutputs/orchestration_log.md: ``### Skill Activation: Verification Engine **Timestamp:** [current date/time] **Actor:** AI Agent (verification-engine) **Input:** [brief description of the verification request] **Output:** [brief description of results — e.g., "Verified 42 citations: 35 VERIFIED, 5 PLAUSIBLE, 2 MISMATCH"]``
A citation is only as good as its accuracy. This engine systematically checks whether the papers you cite actually say what you claim they say. It fetches real source material — abstracts at minimum, full text when available — and compares each attribution claim against the actual content.
This addresses the dominant failure mode of LLM-generated academic writing: citation hallucination and misattribution. Even when citations point to real papers (no fabricated DOIs), the attributed claims may not match what the source actually says.
paper.tex)Scan the .tex file for all citation commands and extract the surrounding context:
\citep{key} → parenthetical: "... as shown previously (Author, Year)."
\citet{key} → textual: "Author (Year) demonstrated that ..."
\citeauthor{key} → author name reference
\citeyear{key} → year referenceFor each citation occurrence, extract:
sentence if needed for meaning. This is the "attributed claim."
draft.md)Same logic, but scan for (Author, Year) and Author (Year) patterns instead of LaTeX citation commands.
Multiple citations of the same paper should be grouped. One paper may be cited 5 times with 5 different claims — each claim needs independent verification.
Output: A list of {key, claim, section, claim_type, priority} tuples.
For each citation key, look up the entry in references.bib:
title, author, year, doi, journal, noteOutput: Enriched list with DOI and metadata for each citation.
For each unique referenced paper (not each citation — deduplicate by BibTeX key):
This is the baseline. Fast, reliable, works for any paper with a DOI or indexed title.
Strategy (try in order, stop at first success):
academic_search_semantic_scholar MCP tool):max_results: 3 (to find best match)academic_search_openalex MCP tool):academic_search_crossref MCP tool):What you get: Title confirmation, abstract (50-300 words), TLDR (1-2 sentences), citation count, open access status, and PDF URL if available.
For open-access papers, go beyond the abstract:
openAccessPdf.url fieldopen_access.oa_url field10.48550/arxiv. or BibTeX key suggests arXiv,construct the PDF URL: https://arxiv.org/pdf/{arxiv_id}
WebFetch with the PDF URL to get content, OR/tmp/verify_papers/{bib_key}.pdf and use the Read tool(supports PDFs up to 100 pages)
When to use Tier B:
For large-scale verification (100+ papers) or complex documents with tables/figures:
llamacloud-mcp server to plugin.json for high-fidelityPDF parsing with table extraction and semantic chunking
semtools for parse and search commands over localPDF collections
entire reference corpus
Not implemented in v5.1.0 — documented here as the upgrade path.
For each {claim, source_content} pair, perform the comparison:
| Status | Criteria | Evidence Required |
|---|---|---|
| VERIFIED | Claim directly supported by source | Quote or close paraphrase found in abstract/text |
| PLAUSIBLE | Abstract consistent, claim reasonable | Topic match, no contradiction, but specific claim not explicit |
| MISMATCH | Claim contradicts or misrepresents source | Source says something different from what's attributed |
| UNVERIFIABLE | Couldn't access source content | No abstract found, paywalled, API returned nothing |
| NOT FOUND | Paper doesn't appear to exist | DOI doesn't resolve, title search returns nothing |
For each citation claim:
→ Abstract states: "Without retrieval, GPT-4o generates citations that are 78-90% fabricated" → Direct match
→ Abstract is about LLM-based autonomous agents → Topic matches, general claim
→ Abstract states: "14% increase in productivity" → Wrong number
Process citations in order of priority tier (see Prioritization Strategy below). After completing each tier, save intermediate results to verification_report.md so the user can act on critical findings immediately.
Save to verification_report.md with this structure:
# Citation Verification Report
**Paper:** [paper title]
**Date:** [YYYY-MM-DD]
**Total unique sources:** [N]
**Total citation instances:** [N]
## Summary
| Status | Count | % |
|--------|-------|---|
| VERIFIED | [n] | [%] |
| PLAUSIBLE | [n] | [%] |
| MISMATCH | [n] | [%] |
| UNVERIFIABLE | [n] | [%] |
| NOT FOUND | [n] | [%] |
**Source material depth:**
- Full text retrieved: [n] papers (Tier B)
- Abstract only: [n] papers (Tier A)
- No content: [n] papers
## Priority Issues
### MISMATCH — Requires Immediate Attention
#### 1. [bib_key] — [Author (Year)]
- **Section:** [where cited]
- **Claim:** "[exact sentence from paper]"
- **Source says:** "[relevant quote from abstract/text]"
- **Issue:** [what's wrong — wrong number, reversed finding, etc.]
- **Recommendation:** [how to fix]
[repeat for each mismatch]
### NOT FOUND — BibTeX Entry May Be Wrong
#### 1. [bib_key] — [Author (Year)]
- **DOI:** [doi or "none"]
- **Title searched:** "[title]"
- **Result:** [what happened — DOI doesn't resolve, no results, etc.]
- **Recommendation:** [verify manually, check DOI, etc.]
## Detailed Findings
### Section: [Section Name]
| # | Source | Claim Type | Status | Note |
|---|--------|-----------|--------|------|
| 1 | Author (Year) | Specific finding | VERIFIED | Abstract confirms |
| 2 | Author2 (Year) | General attribution | PLAUSIBLE | Topic match |
| 3 | Author3 (Year) | Specific statistic | MISMATCH | See Priority Issues |
[repeat for each section]
## Manual Review Queue
Papers that require human verification (paywalled, no abstract):
| # | Source | DOI | Why Unverifiable | Claim to Check |
|---|--------|-----|-----------------|----------------|
| 1 | Author (Year) | 10.xxx | Paywalled | "[claim]" |
## BibTeX Corrections Applied
- [bib_key]: [what was corrected — DOI added, author name fixed, etc.]
## Methodology Note
This verification used [Tier A / Tier A+B] retrieval:
- Abstracts fetched via Semantic Scholar, OpenAlex, CrossRef APIs
- Full text retrieved for [n] open-access papers
- Claims compared against source content by Claude [model version]
- Limitations: Abstract-level verification catches ~80-90% of misattributions
but cannot verify claims that only appear in the body of paywalled papersThese citations carry the paper's core arguments. A mismatch here is a structural problem.
Typical count: 10-20 citations. Target: Verify within first pass.
These ground the paper's approach. Mismatches here undermine credibility.
Typical count: 8-15 citations.
Lower risk but still worth checking for a polished paper.
Typical count: remaining 20-30 citations.
After each tier, present:
VERIFICATION PROGRESS
Tier 1 (Load-bearing): [15/15] Complete
VERIFIED: 11 | PLAUSIBLE: 2 | MISMATCH: 1 | UNVERIFIABLE: 1
>> 1 mismatch found — see verification_report.md
Tier 2 (Method/Theory): [0/12] Queued
Tier 3 (Background): [0/28] Queued
Continue to Tier 2? [proceeding unless you redirect]LlamaParse Integration (Tier C retrieval): Add to plugin.json under mcpServers:
"llamaparse": {
"command": "npx",
"args": ["-y", "@llamaindex/llamacloud-mcp"],
"env": { "LLAMA_CLOUD_API_KEY": "${LLAMA_CLOUD_API_KEY}" }
}This enables high-fidelity PDF parsing with table extraction for complex papers.
SemTools CLI Integration:
pip install semtools
sem parse /tmp/verify_papers/*.pdf --output /tmp/verify_cache/
sem search "citation hallucination rate" /tmp/verify_cache/Enables CLI-level parse and search over local PDF collections.
Automated Re-Verification: After fixing mismatches and recompiling, re-run verification on changed citations only (diff-based verification).
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.