citation_validation.md
832 lines · skills/citation-management/references/citation_validation.md at 5f2bc03
Most marks come from matching words in the file, so treat them as pointers.
Citation Validation Guide
Comprehensive guide to validating citation accuracy, completeness, and formatting in BibTeX files.
Raw lines 1 to 4Overview
Citation validation ensures:
- All citations are accurate and complete
- DOIs resolve correctly
- Required fields are present
- No duplicate entries
- Proper formatting and syntax
- Links are accessible
Validation should be performed:
- After extracting metadata
- Before manuscript submission
- After manual edits to BibTeX files
- Periodically for maintained bibliographies
Validation Categories
Raw lines 21 to 221. DOI Verification
Purpose: Ensure DOIs are valid and resolve correctly.
What to Check
DOI format:
Valid: 10.1038/s41586-021-03819-2
Valid: 10.1126/science.aam9317
Syntactically plausible but requires lookup: 10.1038/invalid
Invalid: doi:10.1038/... (should omit "doi:" prefix in BibTeX)DOI resolution:
- DOI should resolve via https://doi.org/
- Should redirect to actual article
- Should not return 404 or error
Metadata consistency:
- CrossRef metadata should match BibTeX
- Author names should align
- Title should match
- Year should match
How to Validate
Manual check:
- Copy DOI from BibTeX
- Visit https://doi.org/10.1038/nature12345
- Verify it redirects to correct article
- Check metadata matches
Automated check (recommended):
python scripts/validate_citations.py references.bib --check-doisProcess:
- Extract all DOIs from BibTeX file
- Query Crossref
/works/{doi}; on 404, query DataCite/dois/{doi} - If both lack a record, GET
doi.org/{doi}without following the redirect - A registration record or resolver redirect confirms registration; resolver 404 is an error
- Report timeouts, 429/5xx, and malformed responses as
doi_unverifiedwarnings
The script does not compare bibliographic fields or test the publisher landing page. Review title/authors/year manually; a registered DOI can still identify the wrong work. Retraction status also requires a separate publisher check.
Common Issues
Broken DOIs:
- Typos in DOI
- Publisher changed DOI (rare)
- A retracted article normally retains its DOI; check its publication status separately
- Solution: Find correct DOI from publisher site
Mismatched metadata:
- BibTeX has old/incorrect information
- Solution: Re-extract metadata from CrossRef
Missing DOIs:
- Older articles may not have DOIs
- Acceptable for pre-2000 publications
- Add URL or PMID instead
2. Required Fields
Purpose: Ensure all necessary information is present.
Required by Entry Type
@article:
author % REQUIRED
title % REQUIRED
journal % REQUIRED
year % REQUIRED
volume % Highly recommended
pages % Highly recommended
doi % Highly recommended for modern papers@book:
author OR editor % REQUIRED (at least one)
title % REQUIRED
publisher % REQUIRED
year % REQUIRED
isbn % Recommended@inproceedings:
author % REQUIRED
title % REQUIRED
booktitle % REQUIRED (conference/proceedings name)
year % REQUIRED
pages % Recommended@incollection (book chapter):
author % REQUIRED
title % REQUIRED (chapter title)
booktitle % REQUIRED (book title)
publisher % REQUIRED
year % REQUIRED
editor % Recommended
pages % Recommended@phdthesis:
author % REQUIRED
title % REQUIRED
school % REQUIRED
year % REQUIRED@misc (preprints, datasets, etc.):
author % REQUIRED
title % REQUIRED
year % REQUIRED
howpublished % Recommended (bioRxiv, Zenodo, etc.)
doi OR url % At least one requiredValidation Script
python scripts/validate_citations.py references.bibOutput:
Error: Entry 'Smith2024' missing required field 'journal'
Error: Entry 'Doe2023' missing required field 'year'
Warning: Entry 'Jones2022' missing recommended field 'volume'Raw lines 89 to 1643. Author Name Formatting
Purpose: Ensure consistent, correct author name formatting.
Proper Format
Recommended BibTeX format:
author = {Last1, First1 and Last2, First2 and Last3, First3}Examples:
% Correct
author = {Smith, John}
author = {Smith, John A.}
author = {Smith, John Andrew}
author = {Smith, John and Doe, Jane}
author = {Smith, John and Doe, Jane and Johnson, Mary}
% For many authors
author = {Smith, John and Doe, Jane and others}
% Incorrect
author = {John Smith} % First Last format (not recommended)
author = {Smith, J.; Doe, J.} % Semicolon separator (wrong)
author = {Smith J, Doe J} % Missing commasSpecial Cases
Suffixes (Jr., III, etc.):
author = {King, Jr., Martin Luther}Multiple surnames (hyphenated):
author = {Smith-Jones, Mary}Van, von, de, etc.:
author = {van der Waals, Johannes}
author = {de Broglie, Louis}Organizations as authors:
author = {{World Health Organization}}
% Double braces treat as single authorValidation Checks
Automated validation:
python scripts/validate_citations.py references.bibChecks for:
- Proper separator (and, not &, ; , etc.)
- Comma placement
- Empty author fields
- Malformed names
4. Data Consistency
Purpose: Ensure all fields contain valid, reasonable values.
Year Validation
Valid years:
year = {2024} % Current/recent
year = {1953} % Watson & Crick DNA structure (historical)
year = {1665} % Hooke's Micrographia (very old)Invalid years:
year = {24} % Two digits (ambiguous)
year = {202} % Typo
year = {3025} % Implausible future year
year = {0} % Obviously wrongCheck:
- Four digits
- Reasonable range (1600-current+1)
- Not all zeros
Volume/Number Validation
volume = {123} % Numeric
volume = {12} % Valid
number = {3} % Valid
number = {S1} % Supplement issue (valid)Invalid:
volume = {Vol. 123} % Should be just number
number = {Issue 3} % Should be just numberPage Range Validation
Correct format:
pages = {123--145} % En-dash (two hyphens)
pages = {e0123456} % PLOS-style article ID
pages = {123} % Single pageIncorrect format:
pages = {123-145} % Single hyphen (use --)
pages = {pp. 123-145} % Remove "pp."
pages = {123–145} % Unicode en-dash (may cause issues)URL Validation
Check:
- URLs are accessible (return 200 status)
- HTTPS when available
- No obvious typos
- Permanent links (not temporary)
Valid:
url = {https://www.nature.com/articles/nature12345}
url = {https://arxiv.org/abs/2103.14030}Questionable:
url = {http://...} % HTTP instead of HTTPS
url = {file:///...} % Local file path
url = {bit.ly/...} % URL shortener (not permanent)Raw lines 231 to 3085. Duplicate Detection
Purpose: Find and remove duplicate entries.
Types of Duplicates
Exact duplicates (same DOI):
@article{Smith2024a,
doi = {10.1038/nature12345},
...
}
@article{Smith2024b,
doi = {10.1038/nature12345}, % Same DOI!
...
}Near duplicates (similar title/authors):
@article{Smith2024,
title = {Machine Learning for Drug Discovery},
...
}
@article{Smith2024method,
title = {Machine learning for drug discovery}, % Same, different case
...
}Preprint + Published:
@misc{Smith2023arxiv,
title = {AlphaFold Results},
howpublished = {arXiv},
...
}
@article{Smith2024,
title = {AlphaFold Results}, % Same paper, now published
journal = {Nature},
...
}
% Keep published version onlyDetection Methods
By DOI (most reliable):
- Same DOI = exact duplicate
- Keep one, remove other
By title similarity:
- Normalize: lowercase, remove punctuation
- Calculate similarity (e.g., Levenshtein distance)
- Flag if >90% similar
By author-year-title:
- Same first author + year + similar title
- Likely duplicate
Automated detection:
python scripts/validate_citations.py references.bibOutput:
Warning: Possible duplicate entries:
- Smith2024a (DOI: 10.1038/nature12345)
- Smith2024b (DOI: 10.1038/nature12345)
Recommendation: Keep one entry, remove the other.Raw lines 309 to 3846. Format and Syntax
Purpose: Ensure valid BibTeX syntax.
Common Syntax Errors
Missing commas:
@article{Smith2024,
author = {Smith, John} % Missing comma!
title = {Title}
}
% Should be:
author = {Smith, John}, % Comma after each fieldUnbalanced braces:
title = {Title with {Protected} Text % Missing closing brace
% Should be:
title = {Title with {Protected} Text}Missing closing brace for entry:
@article{Smith2024,
author = {Smith, John},
title = {Title}
% Missing closing brace!
% Should end with:
}Invalid characters in keys:
@article{Smith&Doe2024, % & not allowed in key
...
}
% Use:
@article{SmithDoe2024,
...
}BibTeX Syntax Rules
Entry structure:
@TYPE{citationkey,
field1 = {value1},
field2 = {value2},
...
fieldN = {valueN}
}Citation keys:
- Alphanumeric and some punctuation (-, _, ., :)
- No spaces
- Case-sensitive
- Unique within file
Field values:
- Enclosed in {braces} or "quotes"
- Braces preferred for complex text
- Numbers can be unquoted:
year = 2024
Special characters:
{and}for grouping\for LaTeX commands- Protect capitalization:
{AlphaFold} - Accents:
{\"u},{\'e},{\aa}
Validation
python scripts/validate_citations.py references.bibThe bundled parser checks entries it can parse and duplicate keys; it is not a complete BibTeX syntax validator. Malformed entries may be skipped, and @string macros are not expanded. Compare input/output counts and compile the bibliography with the actual BibTeX/Biber toolchain before submission.
Validation Workflow
Raw lines 469 to 470Step 1: Basic Validation
Run comprehensive validation:
python scripts/validate_citations.py references.bibChecks:
- DOI registration only when
--check-doisis requested - Required fields
- Author formatting
- Data consistency
- Duplicates
- Syntax
Step 2: Review Report
Examine validation report:
{
"total_entries": 150,
"valid_entries": 140,
"errors": [
{
"entry": "Smith2024",
"error": "missing_required_field",
"field": "journal",
"severity": "high"
},
{
"entry": "Doe2023",
"error": "invalid_doi",
"doi": "10.1038/broken",
"severity": "high"
}
],
"warnings": [
{
"entry": "Jones2022",
"warning": "missing_recommended_field",
"field": "volume",
"severity": "medium"
}
],
"duplicates": [
{
"entries": ["Smith2024a", "Smith2024b"],
"reason": "same_doi",
"doi": "10.1038/nature12345"
}
]
}Raw lines 487 to 526Step 3: Fix Issues
High-priority (errors):
- Add missing required fields
- Fix broken DOIs
- Remove duplicates
- Correct syntax errors
Medium-priority (warnings):
- Add recommended fields
- Improve author formatting
- Fix page ranges
Low-priority:
- Standardize formatting
- Add URLs for accessibility
Step 4: Apply the safe corrections
validate_citations.py only reports; format_bibtex.py is what rewrites. Send the result to a new file so the original survives a bad run:
python scripts/format_bibtex.py references.bib \
--output fixed_references.bibIt can:
- Fix page range format (- to --), and expand abbreviated ranges (1123-30)
- Remove "pp." from pages
- Standardize author separators
- Strip URL prefixes from DOIs
- Normalize field order
- Rewrite citation keys to one scheme (
--rekey) - Drop duplicates by DOI or key (
--deduplicate)
It cannot:
- Add missing information
- Find correct DOIs
- Determine which duplicate to keep — it keeps the first
- Fix semantic errors
Step 5: Manual Review
Review auto-fixed file:
# Check what changed
diff references.bib fixed_references.bib
# Review specific entries that had errors
grep -A 10 "Smith2024" fixed_references.bibRaw lines 569 to 579Step 6: Re-Validate
Validate after fixes:
python scripts/validate_citations.py fixed_references.bib --verboseInspect errors, warnings, and duplicates in the JSON report. Zero high-severity errors does not mean every DOI was verified: review any doi_unverified warnings and compile the bibliography separately.
DOI Validation
- [ ] All DOIs resolve correctly
- [ ] Metadata matches between BibTeX and CrossRef
- [ ] No broken or invalid DOIs
Completeness
- [ ] All entries have required fields
- [ ] DOIs are included when assigned; absence is verified, not inferred from year
- [ ] Authors properly formatted
- [ ] Journals/conferences properly named
Consistency
- [ ] Years are 4-digit numbers
- [ ] Page ranges use -- not -
- [ ] Volume/number are numeric
- [ ] URLs are accessible
Duplicates
- [ ] No entries with same DOI
- [ ] No near-duplicate titles
- [ ] Preprints updated to published versions
Formatting
- [ ] Valid BibTeX syntax
- [ ] Balanced braces
- [ ] Proper commas
- [ ] Unique citation keys
Final Checks
- [ ] Bibliography compiles without errors
- [ ] All citations in text appear in bibliography
- [ ] All bibliography entries cited in text
- [ ] Citation style matches journal requirements
Best Practices
Raw lines 630 to 6311. Validate Early and Often
# After extraction
python scripts/extract_metadata.py --doi ... --output refs.bib
python scripts/validate_citations.py refs.bib
# After manual edits
python scripts/validate_citations.py refs.bib
# Before submission
python scripts/validate_citations.py refs.bib --check-doisRaw lines 632 to 6452. Use Automated Tools
Don't validate manually - use scripts:
- Faster
- More comprehensive
- Catches errors humans miss
- Generates reports
3. Write to a new file and diff before replacing
format_bibtex.py writes only where you tell it to: with neither --output nor --in-place it prints to stdout and leaves the input alone.
# Reformat into a separate file
python scripts/format_bibtex.py references.bib \
--output references_fixed.bib
# Review changes
diff references.bib references_fixed.bib
# If satisfied, replace
mv references_fixed.bib references.bibRaw lines 654 to 6704. Fix High-Priority First
Priority order:
- Syntax errors (prevent compilation)
- Missing required fields (incomplete citations)
- Broken DOIs (broken links)
- Duplicates (confusion, wasted space)
- Missing recommended fields
- Formatting inconsistencies
5. Document Exceptions
For entries that can't be fixed:
@article{Old1950,
author = {Smith, John},
title = {Title},
journal = {Obscure Journal},
year = {1950},
volume = {12},
pages = {34--56},
note = {No DOI found in the checked publisher record}
}Raw lines 681 to 6966. Validate Against Journal Requirements
Different journals have different requirements:
- Citation style (numbered, author-year)
- Abbreviations (journal names)
- Maximum reference count
- Format (BibTeX, EndNote, manual)
Check journal author guidelines!
Raw lines 697 to 706Common Validation Issues
Raw lines 707 to 708Issue 1: Metadata Mismatch
Problem: BibTeX says 2023, CrossRef says 2024.
Cause:
- Online-first vs print publication
- Correction/update
- Extraction error
Solution:
- Check actual article
- Use more recent/accurate date
- Update BibTeX entry
- Re-validate
Issue 2: Special Characters
Problem: LaTeX compilation fails on special characters.
Cause:
- Accented characters (é, ü, ñ)
- Chemical formulas (H₂O)
- Math symbols (α, β, ±)
Solution:
% Use LaTeX commands
author = {M{\"u}ller, Hans} % Müller
title = {Study of H\textsubscript{2}O} % H₂O
% Or use UTF-8 with proper LaTeX packagesRaw lines 724 to 740Issue 3: Incomplete Extraction (REQUIRES WEB SEARCH)
Problem: Extracted metadata missing fields (volume, pages, DOI, issue number).
Cause:
- Source API doesn't provide all metadata
- Extraction error
- Incomplete database record
- Online-first publication without final pagination
Solution — MANDATORY web search to fill gaps:
- Identify the missing fields by scanning the BibTeX entry for empty or absent
volume,pages,number,doifields.
- Search for the missing metadata using web search (parallel-web skill): ``
bash # Search by author + title to find complete citation info parallel-cli search "AUTHOR_NAME PAPER_TITLE JOURNAL volume pages DOI" \ --json --max-results 10 \ -o sources/search_citation_CITATIONKEY.json
- If DOI is known, extract from DOI resolver page: ``
bash parallel-cli extract "https://doi.org/DOI_HERE" --json \ --objective "extract volume, issue number, page range, publication date" \ -o sources/extract_doi_CITATIONKEY.json
- If DOI is unknown, search for it: ``
bash parallel-cli search "AUTHOR_NAME PAPER_TITLE JOURNAL_NAME DOI" \ --json --max-results 10 \ -o sources/search_find_doi_CITATIONKEY.json
- Try alternative metadata sources:
- CrossRef API (via DOI): Most reliable for volume/pages
- PubMed (via PMID): Good for biomedical papers
- Google Scholar: Fallback for hard-to-find papers
- Publisher website: Last resort
- Update the BibTeX entry with the found metadata and log: ``
[HH:MM:SS] METADATA ENRICHED: [CitationKey] - added volume, pages, doi ✅
- If truly unfindable (rare), add a note field: ``
bibtex note = {Complete pagination not yet assigned — online-first publication}
Verify applicable fields against the publisher record. Online-first volume/pages, DOI-less articles, and article-number journals are valid cases; log the reason for absence and use the style-appropriate locator without fabricating metadata.
Raw lines 741 to 794Issue 4: Cannot Find Duplicate
Problem: Same paper appears twice, not detected.
Cause:
- Different DOIs (should be rare)
- Different titles (abbreviated, typo)
- Different citation keys
Solution:
- Manual search for author + year
- Check for similar titles
- Remove manually
Summary
Validation ensures citation quality:
✓ Accuracy: DOIs resolve, metadata correct ✓ Completeness: All required fields present ✓ Consistency: Proper formatting throughout ✓ No duplicates: Each paper cited once ✓ Valid syntax: BibTeX compiles without errors
Always validate before final submission!
Use automated tools:
python scripts/validate_citations.py references.bibFollow workflow:
- Extract metadata
- Validate
- Fix errors
- Re-validate
- Submit