linkml-reference-validator 0.3.1rc1__tar.gz → 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/PKG-INFO +23 -1
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/README.md +22 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/concepts/content-types.md +1 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/how-to/fetch-full-text-and-pdfs.md +107 -3
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/how-to/repair-validation-errors.md +31 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/how-to/use-local-files-and-urls.md +85 -3
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/how-to/validate-urls.md +16 -1
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/reference/cli.md +35 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/troubleshooting.md +28 -3
- linkml_reference_validator-0.4.0/skills/linkml-reference-validator/SKILL.md +67 -0
- linkml_reference_validator-0.4.0/skills/linkml-reference-validator/references/configuration.md +99 -0
- linkml_reference_validator-0.4.0/skills/linkml-reference-validator/references/guardrails.md +102 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/cache.py +45 -1
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/cli/cache.py +59 -1
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/cli/lookup.py +1 -1
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/acquire.py +8 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/extract/__init__.py +3 -1
- linkml_reference_validator-0.4.0/src/linkml_reference_validator/etl/extract/drawio.py +341 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/extract/pdf.py +35 -2
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/extract/svg.py +523 -38
- linkml_reference_validator-0.4.0/src/linkml_reference_validator/etl/extract/svg_geometry.py +407 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/fulltext/__init__.py +11 -5
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/fulltext/base.py +20 -8
- linkml_reference_validator-0.4.0/src/linkml_reference_validator/etl/fulltext/bioc.py +161 -0
- linkml_reference_validator-0.4.0/src/linkml_reference_validator/etl/fulltext/bookshelf.py +242 -0
- linkml_reference_validator-0.4.0/src/linkml_reference_validator/etl/fulltext/epmc.py +197 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/fulltext/pmc.py +1 -10
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/identifiers.py +13 -1
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/reference_fetcher.py +97 -22
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/rules.py +65 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/sources/file.py +23 -15
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/sources/pmid.py +45 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/sources/url.py +33 -3
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/matching.py +5 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/models.py +24 -4
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/validation/fuzzy_text_utils.py +100 -23
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/validation/supporting_text_validator.py +6 -2
- linkml_reference_validator-0.4.0/tests/fixtures/bookshelf/esummary_20301710.xml +48 -0
- linkml_reference_validator-0.4.0/tests/fixtures/bookshelf/gene_NBK1116/men1.nxml +347 -0
- linkml_reference_validator-0.4.0/tests/fixtures/bookshelf/pubmed_20301710.xml +4 -0
- linkml_reference_validator-0.4.0/tests/test_bookshelf_provider.py +457 -0
- linkml_reference_validator-0.4.0/tests/test_bot_challenge.py +227 -0
- linkml_reference_validator-0.4.0/tests/test_drawio.py +327 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_extractors.py +64 -0
- linkml_reference_validator-0.4.0/tests/test_fulltext_providers.py +903 -0
- linkml_reference_validator-0.4.0/tests/test_meaning_changes.py +137 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_reference_fetcher.py +46 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_rules.py +1 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_sources.py +27 -0
- linkml_reference_validator-0.4.0/tests/test_svg_edges.py +596 -0
- linkml_reference_validator-0.4.0/tests/test_url_fragment_cache.py +257 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_validation_config.py +3 -1
- linkml_reference_validator-0.3.1rc1/tests/test_fulltext_providers.py +0 -356
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.claude/.mcp.json +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.claude/settings.json +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.copier-answers.yml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.devcontainer/devcontainer.json +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.devcontainer/post_create.sh +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.editorconfig +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.github/actions/claude-code-action/action.yml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.github/actions/claude-issue-summarize-action/action.yml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.github/actions/claude-issue-triage-action/action.yml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.github/ai-controllers.json +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.github/copilot-instructions.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.github/copilot-setup-steps.yml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.github/dependabot.yml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.github/workflows/claude-code-review.yml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.github/workflows/claude-issue-summarize.yml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.github/workflows/claude-issue-triage.yml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.github/workflows/claude-ontology-review.yml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.github/workflows/claude.yml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.github/workflows/deploy-docs.yaml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.github/workflows/dragon-ai.yml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.github/workflows/main.yaml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.github/workflows/pypi-publish.yaml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.gitignore +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.goosehints +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.pre-commit-config.yaml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/.yamllint.yaml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/AGENTS.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/BUG_GEO_ACCESSION_TO_UID.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/BUG_ZENODO_DOI_AND_URL_HANDLING.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/CLAUDE.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/CLI-ISSUES.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/CODE_OF_CONDUCT.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/CONTRIBUTING.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/FEATURE_REQUEST_REPAIR.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/LICENSE +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/REVIEW2.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/REVIEW3.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/ai.just +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/benchmarks/repeated_quotes.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/copilot-instructions.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/about.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/assets/zotero-find-full-text.png +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/concepts/editorial-conventions.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/concepts/how-it-works.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/elements/.gitkeep +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/how-to/add-reference-source.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/how-to/export-cache-to-zotero.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/how-to/skip-unsupported-references.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/how-to/validate-clinical-trials.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/how-to/validate-dois.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/how-to/validate-entrez.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/how-to/validate-obo-files.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/how-to/validate-titles.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/index.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/notebooks/01_getting_started.ipynb +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/notebooks/02_advanced_usage.ipynb +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/notebooks/03_python_api.ipynb +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/notebooks/04_obo_validation.ipynb +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/notebooks/05_geo_validation.ipynb +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/quickstart.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/reference/cache-format.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/reference/splitting.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/setup-guide.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/superpowers/plans/2026-06-12-modular-pdf-fulltext-fetching.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/superpowers/plans/2026-08-05-private-library-full-text.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/superpowers/specs/2026-06-12-modular-pdf-fulltext-fetching-design.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/superpowers/specs/2026-08-05-private-library-full-text-design.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/templates-linkml/README.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/todo.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/tutorials/complete-workflow.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/examples/README.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/justfile +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/mkdocs.yml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/mypy.ini +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/notebooks/01_getting_started.ipynb +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/notebooks/02_advanced_usage.ipynb +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/notebooks/03_python_api.ipynb +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/notebooks/README.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/project/README.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/project.justfile +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/pyproject.toml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/pytest.ini +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/__init__.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/_version.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/cli/__init__.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/cli/repair.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/cli/shared.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/cli/validate.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/__init__.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/csl_export.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/extract/base.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/extract/html.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/extract/xml.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/fulltext/epmc_preprint.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/fulltext/json_api.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/fulltext/loader.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/fulltext/openalex.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/fulltext/unpaywall.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/fulltext/zotero.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/sources/__init__.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/sources/base.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/sources/clinicaltrials.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/sources/doi.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/sources/entrez.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/sources/json_api.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/sources/loader.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/sources/ppr.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/sources/utils.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/etl/text_extractor.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/field_detection.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/plugins/REVIEW.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/plugins/__init__.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/plugins/reference_validation_plugin.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/validation/__init__.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/src/linkml_reference_validator/validation/repairer.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/__init__.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/conftest.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/data/test_data_deep_nesting_invalid.yaml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/data/test_data_deep_nesting_valid.yaml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/data/test_data_invalid.yaml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/data/test_data_valid.yaml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/data/test_schema.yaml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/data/test_schema_deep_nesting.yaml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/fixtures/GEO_GSE12345.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/fixtures/PMC_TEST001.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/fixtures/PMC_TEST001.txt +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/fixtures/PMC_TEST002.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/fixtures/PMC_TEST002.txt +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/fixtures/PMID_TEST001.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/fixtures/PMID_TEST001.txt +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/fixtures/PMID_TEST002.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/fixtures/PMID_TEST002.txt +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/fixtures/PMID_TEST003.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/fixtures/PMID_TEST003.txt +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/fixtures/clinicaltrials_NCT00000001.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/fixtures/fulltext_html/README.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/fixtures/fulltext_html/dspace-32894695.html +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/fixtures/fulltext_html/iris-19049553.html +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/fixtures/fulltext_html/plos-0000308.html +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/fixtures/jats/PMC5593426.xml +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/fixtures/jats/README.md +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/fixtures/sample.obo +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_absent_abstract_recovery.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_acquire.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_cache_author_recovery.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_cache_validation.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_cli.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_cli_cache_enrich.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_cli_cache_export.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_cli_cache_reference.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_cli_lookup.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_cli_repair.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_clinicaltrials_cache.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_clinicaltrials_integration.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_deep_nesting.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_doi_preprint.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_e2e_integration.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_empty_snippets.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_epmc_preprint_provider.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_extractor_fidelity.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_field_detection.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_frontmatter_and_doi_case.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_fulltext_loader.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_fuzzy_suggestions.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_geo_integration.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_html_fulltext_acceptance.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_identifiers.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_jats_tables.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_json_api_source.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_ligature_normalization.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_models.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_no_cache_downgrade.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_normalized_content_cache.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_open_access_policy.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_optional_linkml_dependency.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_pdf_url_title.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_plugin_integration.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_pmc_fulltext.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_pmid_network.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_ppr_source.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_real_validation.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_repair.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_serve_stale_html_optin.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_source_utils.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_split_supporting_text.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_supporting_text_validator.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_svg_extractor.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_text_extractor.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_title_validation.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_trust_cached_entries.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_unknown_slot_traversal.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_url_html_sanitize.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_url_html_to_text.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_url_source_cache_version.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_validation_counts.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/tests/test_zotero_provider.py +0 -0
- {linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: linkml_reference_validator
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: Validation of supporting text from references and publications
|
|
5
5
|
Author-email: Chris Mungall <cjmungall@lbl.gov>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -58,6 +58,28 @@ linkml-validate -s schema.yaml data.yaml \
|
|
|
58
58
|
|
|
59
59
|
---
|
|
60
60
|
|
|
61
|
+
## Agent skill
|
|
62
|
+
|
|
63
|
+
Install the [linkml-reference-validator workflow skill](skills/linkml-reference-validator/SKILL.md) with the
|
|
64
|
+
[skills CLI](https://skills.sh/) (requires Node.js). Preview available skills first:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
npx skills add linkml/linkml-reference-validator --list
|
|
68
|
+
npx skills add linkml/linkml-reference-validator --skill linkml-reference-validator
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Installation defaults to the current project. Use `-a codex` or
|
|
72
|
+
`-a claude-code` to select an agent; add `-g` for your user-wide skills directory:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
npx skills add linkml/linkml-reference-validator --skill linkml-reference-validator -a codex -g
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
The skill helps agents configure reference QC, interpret failures and coverage,
|
|
79
|
+
and set up repository hooks and CI using bundled reference guides. Install the
|
|
80
|
+
runtime separately as described above; installing the skill does not activate
|
|
81
|
+
hooks or configure CI, credentials, or data sources.
|
|
82
|
+
|
|
61
83
|
## Why Use This Tool?
|
|
62
84
|
|
|
63
85
|
Scientific data often includes claims supported by quotes from publications. But how do you know the quotes are accurate?
|
|
@@ -37,6 +37,28 @@ linkml-validate -s schema.yaml data.yaml \
|
|
|
37
37
|
|
|
38
38
|
---
|
|
39
39
|
|
|
40
|
+
## Agent skill
|
|
41
|
+
|
|
42
|
+
Install the [linkml-reference-validator workflow skill](skills/linkml-reference-validator/SKILL.md) with the
|
|
43
|
+
[skills CLI](https://skills.sh/) (requires Node.js). Preview available skills first:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npx skills add linkml/linkml-reference-validator --list
|
|
47
|
+
npx skills add linkml/linkml-reference-validator --skill linkml-reference-validator
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Installation defaults to the current project. Use `-a codex` or
|
|
51
|
+
`-a claude-code` to select an agent; add `-g` for your user-wide skills directory:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
npx skills add linkml/linkml-reference-validator --skill linkml-reference-validator -a codex -g
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
The skill helps agents configure reference QC, interpret failures and coverage,
|
|
58
|
+
and set up repository hooks and CI using bundled reference guides. Install the
|
|
59
|
+
runtime separately as described above; installing the skill does not activate
|
|
60
|
+
hooks or configure CI, credentials, or data sources.
|
|
61
|
+
|
|
40
62
|
## Why Use This Tool?
|
|
41
63
|
|
|
42
64
|
Scientific data often includes claims supported by quotes from publications. But how do you know the quotes are accurate?
|
|
@@ -12,6 +12,7 @@ When fetching references, the validator tracks what type of content was retrieve
|
|
|
12
12
|
| `summary` | GEO, BioProject, BioSample, ClinicalTrials | Database summary/description field |
|
|
13
13
|
| `local_file` | file: | Content read from local filesystem |
|
|
14
14
|
| `local_svg` | file: (`.svg`) | Text an SVG figure renders, a blank line between labels; a quote must fall within one label |
|
|
15
|
+
| `local_drawio` | file: (`.drawio`) | Labels a drawio diagram draws, read like `local_svg` |
|
|
15
16
|
| `url` | url: | Content fetched from web URL |
|
|
16
17
|
| `unavailable` | Any | No content could be retrieved |
|
|
17
18
|
|
|
@@ -21,17 +21,34 @@ The validator tries providers in order until one returns usable full text.
|
|
|
21
21
|
The default order is:
|
|
22
22
|
|
|
23
23
|
```
|
|
24
|
-
pmc → epmc_preprint → unpaywall → openalex
|
|
24
|
+
pmc → bookshelf → epmc_preprint → unpaywall → openalex
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
- **`pmc`** — PubMed Central open-access subset (XML/HTML full text for many
|
|
28
28
|
biomedical articles).
|
|
29
|
+
- **`bookshelf`** — NCBI Bookshelf chapters, such as GeneReviews, read from a
|
|
30
|
+
local copy of NCBI's archive (see [NCBI Bookshelf](#ncbi-bookshelf-genereviews)
|
|
31
|
+
below). Does nothing until `bookshelf_archive_dir` is set.
|
|
29
32
|
- **`epmc_preprint`** — Europe PMC preprint body text via the `fulltextRepo`
|
|
30
33
|
PDF route (see [Preprints](#preprints) below).
|
|
31
34
|
- **`unpaywall`** — Unpaywall open-access lookup by DOI (often a publisher or
|
|
32
35
|
repository PDF).
|
|
33
36
|
- **`openalex`** — OpenAlex open-access location (PDF/HTML).
|
|
34
37
|
|
|
38
|
+
Two more built-in providers are available but not in the default chain; add
|
|
39
|
+
them to `full_text_providers` to use them:
|
|
40
|
+
|
|
41
|
+
- **`bioc`** — PMC Open Access articles as BioC passages, from NCBI's BioNLP
|
|
42
|
+
BioC API, by PMID. The reference list and the competing-interest,
|
|
43
|
+
author-contribution and funding statements are left out, so a snippet quoting
|
|
44
|
+
a cited paper cannot validate against the paper citing it.
|
|
45
|
+
- **`epmc`** — Europe PMC's `fullTextXML` for open-access articles, by PMID.
|
|
46
|
+
This is the same JATS that `pmc` reads, served by Europe PMC rather than
|
|
47
|
+
NCBI, so after `pmc` it rarely finds anything new. It is useful as a second
|
|
48
|
+
route when NCBI is down or rate-limiting, or in place of `pmc` to avoid
|
|
49
|
+
depending on Entrez. Not to be confused with `epmc_preprint`, which handles
|
|
50
|
+
preprints only.
|
|
51
|
+
|
|
35
52
|
Providers are skipped silently if they have nothing for a given reference, so
|
|
36
53
|
the chain degrades gracefully: a miss in `pmc` simply moves on to `unpaywall`,
|
|
37
54
|
and so on. If no provider yields full text, the reference keeps whatever
|
|
@@ -45,7 +62,8 @@ your config YAML or on the `ReferenceValidationConfig` object):
|
|
|
45
62
|
| Key | Default | Description |
|
|
46
63
|
|-----|---------|-------------|
|
|
47
64
|
| `fetch_full_text` | `true` | Attempt to obtain full text via the provider chain when a metadata source does not already return full text. |
|
|
48
|
-
| `full_text_providers` | `[pmc, epmc_preprint, unpaywall, openalex]` | Ordered list of provider names to try until one yields usable full text. |
|
|
65
|
+
| `full_text_providers` | `[pmc, bookshelf, epmc_preprint, unpaywall, openalex]` | Ordered list of provider names to try until one yields usable full text. `bioc` and `epmc` are also built in but must be added explicitly. |
|
|
66
|
+
| `bookshelf_archive_dir` | `null` | Directory of unpacked NCBI Bookshelf books, read by the `bookshelf` provider. |
|
|
49
67
|
| `private_cache_dir` | `~/.cache/linkml-reference-validator/private` | Separate research cache for closed/user-library full text; never read by validation. |
|
|
50
68
|
| `pdf_backend` | `pypdf` | Name of the PDF text-extraction backend. |
|
|
51
69
|
| `download_pdfs` | `true` | If true, persist downloaded PDFs to the files cache directory. |
|
|
@@ -66,6 +84,7 @@ email: you@example.org
|
|
|
66
84
|
fetch_full_text: true
|
|
67
85
|
full_text_providers:
|
|
68
86
|
- pmc
|
|
87
|
+
- bookshelf
|
|
69
88
|
- epmc_preprint
|
|
70
89
|
- unpaywall
|
|
71
90
|
- openalex
|
|
@@ -73,6 +92,91 @@ pdf_backend: pypdf
|
|
|
73
92
|
download_pdfs: true
|
|
74
93
|
```
|
|
75
94
|
|
|
95
|
+
## NCBI Bookshelf (GeneReviews)
|
|
96
|
+
|
|
97
|
+
A PMID can point to a chapter on NCBI Bookshelf rather than a journal article.
|
|
98
|
+
Every [GeneReviews](https://www.ncbi.nlm.nih.gov/books/NBK1116/) entry is one
|
|
99
|
+
of these. Such a chapter has no PMC copy, so without help the reference keeps
|
|
100
|
+
only its PubMed summary, and a quote from the chapter body fails as
|
|
101
|
+
abstract-only.
|
|
102
|
+
|
|
103
|
+
The archive described below is for **caching** a chapter, not for validating
|
|
104
|
+
against it. Validate quotes against the cached document. Once a chapter has
|
|
105
|
+
been fetched, its full text is in the reference cache (`PMID_31536184.md`),
|
|
106
|
+
and every later validation reads that file. There's no archive and no network
|
|
107
|
+
call. So the large download is a one-time step on the machine that builds the
|
|
108
|
+
cache, not something every run or every collaborator needs. See
|
|
109
|
+
[Validate against the cache, not the archive](#validate-against-the-cache-not-the-archive).
|
|
110
|
+
|
|
111
|
+
Bookshelf's web pages can't be fetched by a script: NCBI answers with a
|
|
112
|
+
reCAPTCHA page. Instead, the `bookshelf` provider reads chapters from NCBI's
|
|
113
|
+
[litarch archive](https://ftp.ncbi.nlm.nih.gov/pub/litarch/), which you
|
|
114
|
+
download once per book:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
linkml-reference-validator cache bookshelf-download NBK1116 --archive-dir bookshelf
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
GeneReviews (`NBK1116`) is a 640 MB download. Only the chapter XML is kept,
|
|
121
|
+
about 200 MB. Then point the config at the same directory:
|
|
122
|
+
|
|
123
|
+
```yaml
|
|
124
|
+
bookshelf_archive_dir: bookshelf
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
The PubMed record names the chapter, so no extra lookup is needed:
|
|
128
|
+
`PMID:31536184` is `gene/glutaric-a1`, read from
|
|
129
|
+
`bookshelf/gene_NBK1116/glutaric-a1.nxml`. The cached entry records
|
|
130
|
+
`full_text_provider: bookshelf`, and `full_text_url` holds the chapter's
|
|
131
|
+
Bookshelf page.
|
|
132
|
+
|
|
133
|
+
A chapter is used only when its own `<license>` is `open-access`. GeneReviews
|
|
134
|
+
allows copying for noncommercial research with credit and no modification. A
|
|
135
|
+
cache holds a verbatim copy, and its `full_text_url` links back to the
|
|
136
|
+
chapter, so the text goes into the public cache like PMC full text does.
|
|
137
|
+
|
|
138
|
+
To refresh a book, run the download again: it replaces the book's folder. Do
|
|
139
|
+
this to pick up new or revised chapters.
|
|
140
|
+
|
|
141
|
+
**References cached before the archive was set up** keep their abstract. The
|
|
142
|
+
chain recorded that it couldn't read the chapter (`full_text_declined`, or
|
|
143
|
+
`full_text_attempted` on a cache from an older version), and it doesn't retry
|
|
144
|
+
on its own. Re-fetch them:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
linkml-reference-validator cache reference PMID:31536184 --force
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Validate against the cache, not the archive
|
|
151
|
+
|
|
152
|
+
The archive is only read when a chapter is **fetched**. That happens the first
|
|
153
|
+
time a reference is seen, and on an explicit `--force`. Validation reads the
|
|
154
|
+
cached document like any other cached reference. In practice:
|
|
155
|
+
|
|
156
|
+
1. On one machine, download the book, set `bookshelf_archive_dir`, and cache
|
|
157
|
+
the chapters you cite (`cache reference PMID:...`, or a validation run).
|
|
158
|
+
2. Commit the reference cache: the `PMID_*.md` files, which hold the chapter
|
|
159
|
+
text. Don't commit the archive.
|
|
160
|
+
3. Everywhere else, including CI and collaborators, validate as usual. No
|
|
161
|
+
archive is needed, `bookshelf_archive_dir` can stay unset, and nothing is
|
|
162
|
+
downloaded from NCBI.
|
|
163
|
+
|
|
164
|
+
What happens when the archive is missing:
|
|
165
|
+
|
|
166
|
+
- **A cached chapter is never lost to a refresh that can't reach it.** If a
|
|
167
|
+
newer version of this tool marks the entry stale and re-fetches it, the
|
|
168
|
+
refresh gets only the abstract. The cached chapter is then kept and still
|
|
169
|
+
used, with a warning, and the entry stays stale until a run with the
|
|
170
|
+
archive refreshes it. For a committed cache you'd rather not re-fetch at
|
|
171
|
+
all, set `trust_cached_entries: true`.
|
|
172
|
+
- **`--force` is the exception.** It replaces the entry with whatever the
|
|
173
|
+
fetch returns, so forcing a Bookshelf reference without the archive swaps
|
|
174
|
+
the chapter for its abstract (it warns as it does). Only force these
|
|
175
|
+
references where the archive is available.
|
|
176
|
+
- **A reference that was never cached** still needs the archive once.
|
|
177
|
+
Without it, the reference is cached with its abstract only.
|
|
178
|
+
`full_text_declined: bookshelf_archive_not_configured` records why.
|
|
179
|
+
|
|
76
180
|
## Private manuscripts in Zotero
|
|
77
181
|
|
|
78
182
|
The opt-in **`zotero`** provider can find non-open manuscripts that are already
|
|
@@ -270,7 +374,7 @@ the text came from. These provenance fields are written alongside the content:
|
|
|
270
374
|
|
|
271
375
|
| Field | Description |
|
|
272
376
|
|-------|-------------|
|
|
273
|
-
| `full_text_provider` | Name of the provider that supplied the full text (e.g. `pmc`, `epmc_preprint`, `unpaywall`, or a custom name). |
|
|
377
|
+
| `full_text_provider` | Name of the provider that supplied the full text (e.g. `pmc`, `bioc`, `epmc`, `epmc_preprint`, `unpaywall`, or a custom name). |
|
|
274
378
|
| `oa_status` | Open-access status reported by the provider (e.g. `gold`, `green`, `bronze`). |
|
|
275
379
|
| `license` | License of the open-access copy, when known. |
|
|
276
380
|
| `local_pdf_path` | Path (relative to the cache directory) to the downloaded PDF, when one was persisted. |
|
|
@@ -28,6 +28,21 @@ Validation uses an explicit ligature table instead of broad Unicode NFKC
|
|
|
28
28
|
normalization so this change does not equate scientific notation such as `H₂O`
|
|
29
29
|
with `H2O`, `10⁶` with `106`, or the micro sign `µ` with Greek `μ`.
|
|
30
30
|
|
|
31
|
+
### Unmapped PDF glyphs do not match
|
|
32
|
+
|
|
33
|
+
Some PDFs draw a glyph without saying which character it is, so text extraction
|
|
34
|
+
gets no character at all. This is common for `fi`/`fl` ligatures, and sometimes
|
|
35
|
+
happens for digits or minus signs. PDF extraction writes U+FFFD (`�`) in its
|
|
36
|
+
place and logs a warning with the count, so cached text reads `in�ammation`.
|
|
37
|
+
Validation does not guess the missing character: a quote containing
|
|
38
|
+
`inflammation` will not match that text. Check the cached file for `�` and
|
|
39
|
+
quote around the damaged word or supply better full text.
|
|
40
|
+
|
|
41
|
+
Matching treats `�` like punctuation, so the damaged word splits in two: the
|
|
42
|
+
cached text above reads as `in ammation`. A quote that starts or ends inside
|
|
43
|
+
the damaged word still matches, so `ammation of the gut` matches
|
|
44
|
+
`in�ammation of the gut`.
|
|
45
|
+
|
|
31
46
|
## Quick Start
|
|
32
47
|
|
|
33
48
|
### Repair a Single Quote
|
|
@@ -121,6 +136,22 @@ Suggested fix (85%): "Haemophilus influenzae type b" → "H. influenzae type b"
|
|
|
121
136
|
|
|
122
137
|
Use with caution - verify the suggestion preserves the intended meaning.
|
|
123
138
|
|
|
139
|
+
A correction that would change what the quote claims is reported, but never
|
|
140
|
+
offered or applied as the fix:
|
|
141
|
+
|
|
142
|
+
- **It drops a word of the quote,** such as "no" or "in mice".
|
|
143
|
+
- **It swaps a word for one that differs only in a prefix,** such as
|
|
144
|
+
"unaffected" for "affected", "hyperphosphorylated" for
|
|
145
|
+
"hypophosphorylated", or "intracellular" for "extracellular". This holds
|
|
146
|
+
even when the quote also has a typo ("unaffectd").
|
|
147
|
+
- **It adds a negation** the quote doesn't have, such as "not", "never",
|
|
148
|
+
"without" or "failed to".
|
|
149
|
+
|
|
150
|
+
Words of three letters or fewer must match exactly, so "in" is never
|
|
151
|
+
corrected to "on". These checks err towards caution, so some real typos go
|
|
152
|
+
unfixed and need fixing by hand: a typo in a word's first few letters can look
|
|
153
|
+
like a changed prefix ("ctivation" reads as "activation" without its "a").
|
|
154
|
+
|
|
124
155
|
### 4. Removal Recommendation (Very Low Confidence)
|
|
125
156
|
|
|
126
157
|
Flags text that appears fabricated or hallucinated:
|
|
@@ -141,14 +141,95 @@ linkml-reference-validator validate text \
|
|
|
141
141
|
`-webkit-text-security`, a `unicode-bidi` override, `<bdo>`, or a bidi
|
|
142
142
|
control character in the text.
|
|
143
143
|
|
|
144
|
+
**Edges.** A connector between two labelled nodes also gives an edge line,
|
|
145
|
+
`"<source> <edge label> <target>"`, so a relational quote such as
|
|
146
|
+
`"PTEN inhibits AKT"` can be checked. The connector is an element (usually a
|
|
147
|
+
`<g>` holding the line and its label) whose `data-source` and `data-target`
|
|
148
|
+
attributes name the two nodes' ids:
|
|
149
|
+
|
|
150
|
+
```xml
|
|
151
|
+
<defs><marker id="arrow"><path d="M0 0 L10 5 L0 10 z"/></marker></defs>
|
|
152
|
+
<g id="pten"><rect x="0" y="0" width="60" height="30"/><text x="10" y="20">PTEN</text></g>
|
|
153
|
+
<g id="akt"><rect x="200" y="0" width="60" height="30"/><text x="210" y="20">AKT</text></g>
|
|
154
|
+
<g data-source="pten" data-target="akt">
|
|
155
|
+
<path d="M60 15 L200 15" stroke="black" marker-end="url(#arrow)"/>
|
|
156
|
+
<text x="110" y="10">inhibits</text>
|
|
157
|
+
</g>
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
The attributes are not drawn, so they are only believed when the drawing
|
|
161
|
+
agrees: the connector's stroked path must join the two nodes' shapes, one end
|
|
162
|
+
on each (transforms applied, with a little slack for an arrowhead), and the
|
|
163
|
+
connector, its label and both nodes and their labels must all be visible.
|
|
164
|
+
|
|
165
|
+
Arrowheads drawn as markers give the direction:
|
|
166
|
+
|
|
167
|
+
- **One arrowhead** (a `marker-start` or `marker-end`, set on the path or
|
|
168
|
+
inherited) points at the node at that end, and the line reads from the other
|
|
169
|
+
node to it. This holds even when it's the reverse of `data-source` →
|
|
170
|
+
`data-target`: the drawing wins, as in drawio.
|
|
171
|
+
- **Arrowheads at both ends** make the line quotable both ways.
|
|
172
|
+
- **No arrowhead** (a plain line, or a marker that draws nothing) reads in the
|
|
173
|
+
attributes' order, `data-source` first. This is a known limitation: nothing
|
|
174
|
+
drawn gives that order, so swapping the two attributes reverses the line
|
|
175
|
+
for the same picture.
|
|
176
|
+
- **An arrowhead drawn as a separate shape** gives no edge line: which way
|
|
177
|
+
such a shape points can't be read, and the attributes' order could
|
|
178
|
+
contradict it. This is any other `<polygon>`, `<polyline>`, `<path>` or
|
|
179
|
+
`<line>` in the connector, wherever it sits; any `<use>` or `<image>`; and a
|
|
180
|
+
`<rect>`, `<circle>` or `<ellipse>` at an end of the line or on a node. A
|
|
181
|
+
`<rect>`, `<circle>` or `<ellipse>` in mid-line, such as a label's
|
|
182
|
+
background, is not taken for an arrowhead.
|
|
183
|
+
- **Arrowheads at a bent line's inner vertices** (`marker-mid`, or the
|
|
184
|
+
`marker` shorthand) give no edge line, since each may point either way.
|
|
185
|
+
|
|
186
|
+
A marker counts as an arrowhead when it names a `<marker>` in the figure that
|
|
187
|
+
draws something: a shape that paints, at a size above zero. When that can't be
|
|
188
|
+
told from the markup (a `var()` value, or a `<use>`, text or image inside the
|
|
189
|
+
marker), the connector gives no edge line, since neither direction is safe. The
|
|
190
|
+
marker's `orient` is not read: a marker drawn at a fixed angle is taken to
|
|
191
|
+
point along the path. A node is the shapes it draws inside the
|
|
192
|
+
element its id names; its text, and shapes that are hidden or paint nothing,
|
|
193
|
+
do not count towards its box. Geometry the extractor cannot place from
|
|
194
|
+
attributes gives no edge line either: CSS `transform` or other CSS geometry,
|
|
195
|
+
`clip-path`, `mask` or `filter`, or an animation that moves shapes. A node drawn only through `<use>`, inside a
|
|
196
|
+
nested `<svg>`, or sized in `%` or `em` gives no edge line.
|
|
197
|
+
|
|
144
198
|
Known limits: a label drawn as several `<text>` elements, one per line, is
|
|
145
199
|
read as several labels, so quote its lines with `...` between them. Text
|
|
146
200
|
clipped by `clip-path` or `mask`, placed outside the
|
|
147
201
|
`viewBox`, scaled to nothing, covered by another shape, drawn in the
|
|
148
202
|
background colour, or cut short by CSS `text-overflow` or `-webkit-line-clamp`
|
|
149
203
|
is still read. Text converted to outlines is not text and
|
|
150
|
-
cannot be quoted.
|
|
151
|
-
|
|
204
|
+
cannot be quoted.
|
|
205
|
+
|
|
206
|
+
## Diagrams as References (drawio)
|
|
207
|
+
|
|
208
|
+
A `file:` reference can also point at a native drawio diagram, `.drawio` or
|
|
209
|
+
`.drawio.xml`, compressed or not. It is read the same way as an SVG: one label
|
|
210
|
+
per drawn cell, quotes held to one label, and an edge line
|
|
211
|
+
`"<source> <edge label> <target>"` for each drawn edge between two labelled
|
|
212
|
+
cells. In drawio an edge's source and target are what it is drawn between, so
|
|
213
|
+
no geometry check is needed; its line and both cells' labels must still be
|
|
214
|
+
visible. The arrows give the direction, as for SVG: an edge drawn pointing
|
|
215
|
+
back at its source reads target first, one with arrows at both ends reads both
|
|
216
|
+
ways, and one with no arrow reads source first. Only markers that point count
|
|
217
|
+
as arrows: arrowheads (`classic`, `block`, `open`, `async` and their thin or
|
|
218
|
+
double forms) and the inhibition T-bar `baseDash`. An oval, diamond, dash or
|
|
219
|
+
ER symbol at an end is not an arrow. A marker drawio doesn't list as either
|
|
220
|
+
gives no edge line. Every page of the file is read.
|
|
221
|
+
|
|
222
|
+
A `.drawio.svg` file (drawio's editable SVG export) is read as an SVG: its
|
|
223
|
+
labels are quotable, but it carries no `data-source`/`data-target`, so it
|
|
224
|
+
gives no edge lines. Point at the `.drawio` source to quote its edges.
|
|
225
|
+
|
|
226
|
+
Not read: cells marked invisible, in a hidden layer, or inside a collapsed
|
|
227
|
+
group; labels switched off (`noLabel`) or drawn with zero `opacity`,
|
|
228
|
+
`textOpacity` or `fontSize`, or with no `fontColor`; layer and page names,
|
|
229
|
+
tooltips, styles and other attributes. HTML labels follow the same visibility
|
|
230
|
+
rules as SVG `<foreignObject>` labels. A label computed from placeholders
|
|
231
|
+
(`placeholders="1"`), or HTML that cannot be read statically, makes the
|
|
232
|
+
reference `unavailable`.
|
|
152
233
|
|
|
153
234
|
## Using in Data Files
|
|
154
235
|
|
|
@@ -190,7 +271,8 @@ Both file and URL references work in LinkML data files:
|
|
|
190
271
|
|
|
191
272
|
## Limitations
|
|
192
273
|
|
|
193
|
-
- **Local files are read as text**, apart from `.svg`
|
|
274
|
+
- **Local files are read as text**, apart from `.svg`, `.drawio` and `.drawio.xml` figures
|
|
275
|
+
(see above).
|
|
194
276
|
An `.html` file is matched against its raw markup.
|
|
195
277
|
- **Local PDF files**: Not yet supported as `file:` references. PDFs fetched by `url:` are supported.
|
|
196
278
|
- **Authentication**: URLs requiring login are not supported
|
|
@@ -227,7 +227,22 @@ Ensure the cached content contains the text you're referencing.
|
|
|
227
227
|
- Use `linkml-reference-validator cache reference url:https://... --force` to update cached content when pages change
|
|
228
228
|
- Periodically review cached URLs to ensure they're still accessible
|
|
229
229
|
|
|
230
|
-
### 4.
|
|
230
|
+
### 4. Cite Pages With Fragments
|
|
231
|
+
|
|
232
|
+
A fragment such as `#page=54` is never sent to the server, so it isn't part of
|
|
233
|
+
the cache key. `url:https://example.com/report.pdf#page=54` and
|
|
234
|
+
`...report.pdf#page=55` share one cache file, `url_https___example.com_report.pdf.md`,
|
|
235
|
+
and the document is fetched and extracted once. Each reference still carries
|
|
236
|
+
its own page-anchored URL, and quotes are matched against the whole document,
|
|
237
|
+
not the cited page. Query strings (`?v=2`) do stay part of the key.
|
|
238
|
+
|
|
239
|
+
Caches written before this change hold one file per fragment, such as
|
|
240
|
+
`url_https___example.com_report.pdf#page_54.md`. These are still read, until
|
|
241
|
+
the reference is next fetched (for example with `cache reference ... --force`);
|
|
242
|
+
the fresh entry goes to the shared file, after which the per-fragment files can
|
|
243
|
+
be deleted.
|
|
244
|
+
|
|
245
|
+
### 5. Mix Reference Types
|
|
231
246
|
|
|
232
247
|
URL references work alongside PMIDs and DOIs:
|
|
233
248
|
|
{linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/reference/cli.md
RENAMED
|
@@ -689,6 +689,7 @@ linkml-reference-validator cache COMMAND [ARGS]...
|
|
|
689
689
|
|
|
690
690
|
- `reference` - Cache a reference for offline use
|
|
691
691
|
- `lookup` - Show the cache path for a reference (or print file contents)
|
|
692
|
+
- `bookshelf-download` - Download an NCBI Bookshelf book for chapter full text
|
|
692
693
|
|
|
693
694
|
---
|
|
694
695
|
|
|
@@ -883,6 +884,40 @@ the research cache private.
|
|
|
883
884
|
|
|
884
885
|
---
|
|
885
886
|
|
|
887
|
+
## cache bookshelf-download
|
|
888
|
+
|
|
889
|
+
Download one NCBI Bookshelf book from NCBI's litarch archive and unpack its
|
|
890
|
+
chapter XML, so the `bookshelf` full-text provider can read chapters such as
|
|
891
|
+
GeneReviews entries. See
|
|
892
|
+
[Fetch full text](../how-to/fetch-full-text-and-pdfs.md#ncbi-bookshelf-genereviews).
|
|
893
|
+
|
|
894
|
+
```bash
|
|
895
|
+
linkml-reference-validator cache bookshelf-download ACCESSION [OPTIONS]
|
|
896
|
+
```
|
|
897
|
+
|
|
898
|
+
**Arguments:**
|
|
899
|
+
|
|
900
|
+
- `ACCESSION` - The book's NBK accession, e.g. `NBK1116` for GeneReviews
|
|
901
|
+
|
|
902
|
+
**Options:**
|
|
903
|
+
|
|
904
|
+
- `--archive-dir PATH` - Where to unpack the book (default: `bookshelf_archive_dir` from the config)
|
|
905
|
+
- `--mirror URL` - Base URL of the litarch archive (default: `https://ftp.ncbi.nlm.nih.gov/pub/litarch`)
|
|
906
|
+
- `--config PATH` - Validation configuration file
|
|
907
|
+
- `--verbose, -v` - Enable detailed logging
|
|
908
|
+
|
|
909
|
+
```bash
|
|
910
|
+
linkml-reference-validator cache bookshelf-download NBK1116 --archive-dir bookshelf
|
|
911
|
+
```
|
|
912
|
+
|
|
913
|
+
Running it again replaces the book's folder with the current release.
|
|
914
|
+
|
|
915
|
+
The archive is only needed on the machine that caches chapters. Validation
|
|
916
|
+
reads the cached reference (`PMID_*.md`), so a committed cache validates
|
|
917
|
+
without the archive or any NCBI call.
|
|
918
|
+
|
|
919
|
+
---
|
|
920
|
+
|
|
886
921
|
## Reference ID Formats
|
|
887
922
|
|
|
888
923
|
### PubMed (PMID)
|
{linkml_reference_validator-0.3.1rc1 → linkml_reference_validator-0.4.0}/docs/troubleshooting.md
RENAMED
|
@@ -446,6 +446,28 @@ reference_title: "Role of JAK1"
|
|
|
446
446
|
actual_title: "Role of JAK1 in Cell Signaling"
|
|
447
447
|
```
|
|
448
448
|
|
|
449
|
+
### Title mismatch against "Checking your browser - reCAPTCHA"
|
|
450
|
+
|
|
451
|
+
**Symptom** (older versions):
|
|
452
|
+
```
|
|
453
|
+
Title mismatch: expected 'MELAS - GeneReviews® - NCBI Bookshelf'
|
|
454
|
+
but got 'Checking your browser - reCAPTCHA'
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
**Cause:** the host (NCBI does this for Bookshelf and PMC pages) answered a
|
|
458
|
+
`url:` fetch with a bot check instead of the document. It sends the check with
|
|
459
|
+
HTTP 200, so older versions took it for the document and cached it.
|
|
460
|
+
|
|
461
|
+
The `url:` source now treats a page with a known challenge title as a failed
|
|
462
|
+
fetch: a cached entry is used instead, and nothing is written. A challenge page
|
|
463
|
+
cached by an older version is ignored, as if absent, and replaced by the next
|
|
464
|
+
good fetch.
|
|
465
|
+
|
|
466
|
+
**Solution:** upgrade, and leave the curated title alone; it is probably
|
|
467
|
+
correct. While the host keeps challenging, a reference with no good cached
|
|
468
|
+
entry reports `Could not fetch reference` rather than a title mismatch.
|
|
469
|
+
Retrying during the block gets the challenge again.
|
|
470
|
+
|
|
449
471
|
## Schema Issues
|
|
450
472
|
|
|
451
473
|
### No reference or supporting_text fields found
|
|
@@ -815,8 +837,9 @@ permission. An unrecognised or missing status is **not** assumed open: an
|
|
|
815
837
|
unknown licence is not a grant.
|
|
816
838
|
|
|
817
839
|
This governs files found by asking an OA *index* (OpenAlex, Unpaywall). It does
|
|
818
|
-
not govern the `pmc` and `epmc_preprint` providers, which ask an
|
|
819
|
-
API
|
|
840
|
+
not govern the `pmc`, `bioc`, `epmc` and `epmc_preprint` providers, which ask an
|
|
841
|
+
archive's own API (PMC, its BioC rendering, or Europe PMC) for a document it
|
|
842
|
+
serves for machine retrieval — a stronger warrant than an
|
|
820
843
|
index's summary of a third-party host. The same green deposit can therefore be
|
|
821
844
|
declined from OpenAlex and admitted from PMC.
|
|
822
845
|
|
|
@@ -915,7 +938,7 @@ the old entry is still served and is not rewritten, so a later run retries.
|
|
|
915
938
|
Other sources are unaffected. With `trust_cached_entries` set, old entries are
|
|
916
939
|
served as they are and are not refreshed.
|
|
917
940
|
|
|
918
|
-
`file:` references to `.svg` figures carry their own stamp,
|
|
941
|
+
`file:` references to `.svg` and `.drawio` figures carry their own stamp,
|
|
919
942
|
`svg_extraction_version`. Version 1 reads a figure as the text it renders
|
|
920
943
|
(issue #104); before it, the file was cached as raw markup, so a quote could
|
|
921
944
|
match a `<desc>`, an attribute value or hidden text. Such an entry is re-read
|
|
@@ -926,6 +949,8 @@ read: not when the file has moved, not when the new read finds no rendered
|
|
|
926
949
|
text, and not with `trust_cached_entries`. The file is the source, and its raw
|
|
927
950
|
markup is not evidence. Version 2 separates a figure's labels, so a quote is
|
|
928
951
|
matched within one label; version 1 entries are re-read once for it.
|
|
952
|
+
Version 3 adds edge lines for connectors the drawing confirms; older entries
|
|
953
|
+
are re-read once to gain them.
|
|
929
954
|
|
|
930
955
|
**A quote that verified against a `url:` page can fail after that refresh.**
|
|
931
956
|
Sanitizing removes `<noscript>` and `<template>` elements with their text.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: linkml-reference-validator
|
|
3
|
+
description: Set up, configure, and troubleshoot LinkML Reference Validator (LRV) as deterministic reference QC in repository hooks and CI. Use when interpreting quote or title failures, diagnosing unchecked evidence and cache coverage, or configuring schema extraction, sources, and matching policy.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Work with reference QC
|
|
7
|
+
|
|
8
|
+
LRV performs deterministic quote and title checks against retrieved source
|
|
9
|
+
content. Run those checks through repository automation. The agent's role is to
|
|
10
|
+
integrate the checker, explain findings, and make evidence-based corrections.
|
|
11
|
+
Maintainers define required coverage and exception policy; curators decide
|
|
12
|
+
whether the evidence supports the scientific claim. A matching quote settles
|
|
13
|
+
neither its relevance nor the truth of the claim.
|
|
14
|
+
|
|
15
|
+
A passing automated check needs no agent reenactment. Apply scientific review
|
|
16
|
+
when curating or reviewing evidence, rather than rereading every source on each
|
|
17
|
+
QC run.
|
|
18
|
+
|
|
19
|
+
## Establish the validation context
|
|
20
|
+
|
|
21
|
+
Read the project's guidance, validation recipe or wrapper, schema, explicit
|
|
22
|
+
config, dependency lock, and existing hook/CI output. Identify the affected
|
|
23
|
+
files, target class, source cache, and whether this check is blocking or
|
|
24
|
+
advisory. Use the existing project command: a wrapper may encode policy absent
|
|
25
|
+
from a bare CLI invocation. Reproduce a finding on the affected file with the
|
|
26
|
+
same inputs before changing data; avoid repeated whole-corpus retrieval.
|
|
27
|
+
|
|
28
|
+
- For a new gate or hook/CI changes, read [Guardrail setup](references/guardrails.md).
|
|
29
|
+
- For extraction, retrieval, cache, or matching changes, read
|
|
30
|
+
[Configuration and targeted diagnosis](references/configuration.md).
|
|
31
|
+
|
|
32
|
+
Installing this skill supplies instructions; it does not activate a hook,
|
|
33
|
+
install LRV, or establish a required CI check.
|
|
34
|
+
|
|
35
|
+
## Interpret the result before repairing it
|
|
36
|
+
|
|
37
|
+
| Finding | Agent's next step |
|
|
38
|
+
| --- | --- |
|
|
39
|
+
| Quote matched | Report source matching as passed. During evidence review, assess the attached claim, population, and direction of effect separately. |
|
|
40
|
+
| Quote did not match | Compare the exact input with the retrieved content. Distinguish paraphrase, wrong citation, normalization, and missing full text. |
|
|
41
|
+
| Title mismatch | Check identifier and source metadata together; changing the title to fit the wrong paper hides the real error. |
|
|
42
|
+
| Source unavailable or prefix skipped | Report evidence as unchecked. Diagnose retrieval or source configuration; do not label the quote fabricated. |
|
|
43
|
+
| Zero comparisons or unexpectedly low coverage | Inspect schema annotations, target class, missing evidence, file selection, and skip policy. Exit 0 does not establish coverage. |
|
|
44
|
+
| Crash or invocation error | Repair the execution/configuration problem before drawing conclusions about the evidence. |
|
|
45
|
+
|
|
46
|
+
An abstract-only record cannot establish that a quotation is absent from the
|
|
47
|
+
full paper. Keep matched, failed, skipped, and unavailable evidence distinct;
|
|
48
|
+
read coverage diagnostics alongside the exit status. Advisory output from a
|
|
49
|
+
hook is not completion of the repository's required checks.
|
|
50
|
+
|
|
51
|
+
## Correct the cause and close the loop
|
|
52
|
+
|
|
53
|
+
When fixing evidence, inspect the source and the intended claim together.
|
|
54
|
+
Transcribe a supported quote accurately; never invent wording or swap citations
|
|
55
|
+
solely to obtain a pass. Preserve the source cache as evidence rather than
|
|
56
|
+
editing it to match the submitted quote. Review any automated repair suggestion
|
|
57
|
+
against the paper and schema before applying it.
|
|
58
|
+
|
|
59
|
+
For configuration work, explain which records become checked or unchecked and
|
|
60
|
+
demonstrate the intended behavior with representative passing and failing
|
|
61
|
+
examples. Preserve established policy during routine repairs: adding a skipped
|
|
62
|
+
prefix or lowering retrieval severity changes the QC contract.
|
|
63
|
+
|
|
64
|
+
Rerun the affected check after corrections and the required repository checks
|
|
65
|
+
before delivery. Report the file/field, reference ID, diagnosis, correction,
|
|
66
|
+
command and outcome, source coverage, and any evidence still unchecked. Surface
|
|
67
|
+
unresolved scientific interpretation or policy choices to the human curator.
|