csag-extraction — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited csag-extraction (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Convert a manuscript into a CSAG `PaperExtraction` instance that is:
assets/csag.yaml)EvidenceLink, chains via InferenceStep)assets/csag.yaml — authoritative schemaassets/csag_qa_templates.yaml — QA template catalogreferences/CSAG_PLAYBOOK.md — detailed extraction guide + edge cases| Task | Action |
|---|---|
| Extract paper | Build one PaperExtraction per manuscript, not per search hit. |
| Ground claims | Attach important assertions, evidence, and links to TextSpans. |
| Validate schema | Run scripts/validate_paper_extraction.py before finalizing. |
| Review quality | Run scripts/csag_quality_report.py --strict and resolve issues. |
1) Every Assertion MUST have ≥1 Context (schema-enforced). 2) Support/refute polarity ONLY in `EvidenceLink`. 3) Contradictions/qualification ONLY in `AssertionRelation`. 4) Reasoning chains ONLY as `InferenceStep`. 5) Ground important objects to TextSpans. 6) Every Assertion MUST have normalization_status:
raw / partially_normalized / fully_normalizedThe extraction scope is the full manuscript: title, abstract, introduction, methods, results, discussion, conclusion, and supplementary material when available. If retrieval was driven by topic terms (organisms, genes, methods), do not restrict extracted assertions or evidence to sentences that mention those terms — the retrieval scope is not the extraction scope.
When a model is used to assist extraction, prefer a two-step workflow:
polarity, inferences, critiques, gaps, artifacts, datasets, and exact source quotes.
PaperExtraction: deterministic IDs,reference fields, enum normalization, offset lookup from exact_text, and validator repair for mechanical schema-shape issues.
Do not rely on a model to perform all final bookkeeping in one pass. The most common failures are missing IDs, dangling references, scalar values where lists are required, field aliases such as evidence_id instead of evidence_item, wrong enum labels, and missing artifact/dataset metadata.
Use the validator as a feedback loop:
uv run python skills/csag-extraction/scripts/validate_paper_extraction.py \
work/STEM/paper_extraction.json \
--source-markdown work/STEM/STEM.md \
--article-json work/STEM/STEM.article.json \
--report-out work/STEM/paper_extraction.validation.jsonFor mechanical cleanup before curation, write a repaired candidate and inspect the repair_actions in the validation report:
uv run python skills/csag-extraction/scripts/validate_paper_extraction.py \
work/STEM/paper_extraction.raw.json \
--source-markdown work/STEM/STEM.md \
--article-json work/STEM/STEM.article.json \
--repair-out work/STEM/paper_extraction.repaired.json \
--report-out work/STEM/paper_extraction.validation.jsonRepairs are intentionally narrow. They can normalize deterministic schema shape, but they do not certify scientific correctness.
PaperExtraction metadata (id/title/doi/pmid if available).doi and pmid from the staged source, OCR/article outputs, TEI/XML, or local metadata whenever recoverable.doi_status / pmid_status entries in extraction_activities.parameters with resolved or unresolved.contexts (≥1)normalization_statuscriticality (core, major, supporting, background) when the importance of the claim can be judgedfalsification_criteria for any core or major assertion (what observation would weaken or refute the claim)polarity, strength, rationale.Study and Experiment objects.Condition objects (dose/time/genotype/treatment regime).InferenceSteps for explicit/implicit reasoning chains.StudyCritique and KnowledgeGap objects.paper_extraction.json and validation reports.paper_extraction.json conforming to assets/csag.yaml.scripts/validate_paper_extraction.py.scripts/csag_quality_report.py.assets/csag_qa_templates.yaml.Unless the source is a short note/editorial with genuinely limited content, target:
If a category is not present in the paper, state that in notes for the paper/assertion rather than silently omitting it.
Confirm all checks:
doi / pmid are resolved when recoverable, or explicit doi_status / pmid_status parameters are present in extraction_activities.artifacts are present when figure/table captions are present in the source.datasets are present when data-availability text, accessions, or repository links are present in the source.scripts/validate_paper_extraction.py).scripts/csag_quality_report.py). Treat it as the default CSAG knowledge-artifact evaluation after paper_extraction.json is generated: inspect completeness, missing_or_weak, and field_quality as well as issues.issues list is resolved before stopping; warnings in missing_or_weak are fixed or justified in notes.For higher-stakes use, run validation with --profile promoted_claim or --profile benchmark_key. These profiles additionally require:
limitation or speculationpmid:<id> for PaperExtraction.id when PMID is known; fall back to doi:<doi> or csag:doc/<slug> otherwise.TextSpan.document_id to the same identifier used for PaperExtraction.id.pmc:<id> and mark PMID resolution as pending in notes.PaperExtraction per source manuscript; do not mix spans across manuscripts.extraction_activities with tool_name, tool_version, model_name (when applicable), and explicit doi_status / pmid_status parameters when those identifiers cannot be resolved from the source.Before finalizing the extraction, run:
uv run python skills/csag-extraction/scripts/validate_paper_extraction.py \
ABS_PATH/paper_extraction.json \
--source-markdown ABS_PATH/STEM.md \
--article-json ABS_PATH/STEM.article.json \
--report-out ABS_PATH/paper_extraction.validation.jsonUse --profile promoted_claim for curated claims and --profile benchmark_key for scoring keys. Do not stop until the validator returns OK.
Then run the quality report and review how complete the artifact is, what is missing or weak, and the field-level information quality:
uv run python skills/csag-extraction/scripts/csag_quality_report.py \
ABS_PATH/paper_extraction.json \
--source-markdown ABS_PATH/STEM.md \
--article-json ABS_PATH/STEM.article.json \
--report-out ABS_PATH/paper_extraction.quality.json \
--strictBefore finalizing a PaperExtraction, answer these (internally or as qa_items):
Map answers to CSAG objects:
assertionscriticalityfalsification_criteriaevidence_linksinferencescritiquesknowledge_gapsqa_items (from assets/csag_qa_templates.yaml)raw: free-text only; triple fields may be empty.partially_normalized: some of {subject,predicate,object} filled OR ambiguous mappings.fully_normalized: subject+predicate+object present; refer to Entity IDs; predicate is CURIE/URI (RO/SIO preferred).Use assets/csag_qa_templates.yaml to instantiate QAItem + Answer objects. Answers must cite supporting_assertions and/or supporting_evidence_links.
For edge cases and scoring guidance, see references/CSAG_PLAYBOOK.md.
uv run python skills/csag-extraction/scripts/validate_paper_extraction.py \
work/paper/paper_extraction.json \
--source-markdown work/paper/paper.md \
--article-json work/paper/paper.article.json \
--report-out work/paper/paper_extraction.validation.jsonContext to every Assertion; this is not optional.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.