From research-papers
Retrieves scientific papers by URL, DOI, or title, extracts structured notes, concepts, claims, and justifications, then ingests into propstore via nested skills.
npx claudepluginhub ctoth/research-papers-plugin --plugin research-papersThis skill uses the workspace's default tool permissions.
Download a scientific paper, extract structured notes, register concepts, extract claims and justifications, and ingest everything into a propstore source branch.
Rebuilds propstore knowledge store from academic papers directory with notes.md and claims.yaml. Four-phase pipeline: per-paper finalize, concept alignment, promote, cross-paper stances, builds sidecar.
Extracts structured notes from academic papers via three escalating passes: inspectional skim with Five Cs, content grasp skipping proofs, deep re-implementation. Domain-neutral for bio, CS, ML, any field.
Extracts claims, figures, and evidence from academic paper drafts (Word, LaTeX, Markdown, Obsidian folders) plus Zotero metadata into .paper/claims.yml and figures.yml for AI writing skills.
Share bugs, ideas, or general feedback.
Download a scientific paper, extract structured notes, register concepts, extract claims and justifications, and ingest everything into a propstore source branch.
This is the per-paper propstore ingestion orchestrator. paper-reader remains a paper-artifact skill; collection-wide stance extraction belongs to ingest-collection.
This skill is a checklist, not an outcome sketch.
CRITICAL: This skill does NOT authorize creating any new scripts, automation, temp programs, or alternate workflows. If the listed commands or nested skills cannot complete a step, stop immediately and report the blocker.
$ARGUMENTS names exactly one intended paper. Preserve that paper's identity through retrieval, reading, claim extraction, and reporting.$ARGUMENTS, stop and report the mismatch instead of continuing.Invoke the paper-retriever skill directly:
/research-papers:paper-retriever $ARGUMENTS
Retrieval succeeds only when the intended paper's PDF exists at the output path. Do not treat "some related paper was found" as success.
When retrieval completes, note the output path (e.g., papers/Author_Year_ShortTitle/paper.pdf).
Use this skill's injected <path> to locate the installed paper-process skill directory, then run:
uv run "<skill-dir>/scripts/emit_nested_process_fallback.py"
Read the FULL stdout and follow it exactly instead of opening sibling SKILL.md files piecemeal.
Invoke the paper-reader skill with the path from Step 1:
/research-papers:paper-reader <path-from-step-1>
Follow all instructions through to completion (notes.md, description.md, abstract.md, citations.md, index.md update).
If you already ran the emit_nested_process_fallback.py helper in Step 1, follow the paper-reader section of that output. Otherwise, follow the paper-reader SKILL.md instructions directly.
If the original argument was a local file path (e.g., papers/somefile.pdf in the root of papers/), and the paper directory now contains paper.pdf, delete the original root-level PDF:
# Only if the source was a local file and the paper dir copy exists
rm "./papers/somefile.pdf"
This keeps the papers/ root clean — any PDF still in the root is unprocessed. Do NOT delete if the source was a URL (nothing to clean up) or if the paper directory doesn't have paper.pdf yet (something went wrong).
paper_dir="<paper-directory-path>"
source_name=$(basename "$paper_dir")
Read metadata.json to determine origin:
cat "$paper_dir/metadata.json"
Initialize the source branch:
pks source init "$source_name" \
--kind academic_paper \
--origin-type <doi|arxiv|url|file> \
--origin-value "<doi-or-url-or-path>" \
--content-file "$paper_dir/paper.pdf"
Push notes and metadata:
pks source write-notes "$source_name" --file "$paper_dir/notes.md"
pks source write-metadata "$source_name" --file "$paper_dir/metadata.json"
If pks is not available or knowledge/ doesn't exist, STOP and report: "No propstore found. Run pks init on the knowledge directory first."
/research-papers:extract-claims <paper-directory-path>
The skill writes claims.yaml and may attempt pks source add-claim. That ingestion step will fail because concepts are not registered yet — this is expected. The important output is the claims.yaml file on disk. Claim ingestion happens in Step 7 after concepts are registered.
Follow the extract-claims SKILL.md instructions through Step 3 (write claims.yaml). Steps 4-5 (validate + ingest) can be skipped here — they happen later.
/research-papers:register-concepts <paper-directory-path>
This runs propose_concepts.py pks-batch to extract concept names from claims.yaml, enriches definitions from notes.md, and calls pks source add-concepts.
Follow the register-concepts SKILL.md instructions directly.
Why this order: register-concepts runs AFTER extract-claims because it derives the concept inventory from claims.yaml. Claims use human-readable concept names; register-concepts extracts those names and registers them on the source branch.
Now that concepts are registered on the source branch, ingest claims:
source_name=$(basename "$paper_dir")
pks source add-claim "$source_name" --batch "$paper_dir/claims.yaml"
If this fails with "unknown concept reference(s)": the error lists specific missing names. Add those concepts to concepts.yaml, re-run pks source add-concepts, and retry add-claim. Iterate until add-claim succeeds — the unknown set is finite and shrinks each iteration.
/research-papers:extract-justifications <paper-directory-path>
The skill writes justifications.yaml and ingests via pks source add-justification.
Follow the extract-justifications SKILL.md instructions directly.
pks source finalize "$source_name"
If status is "blocked", fix the reported errors and re-finalize. Common issues:
Note: Stances are NOT extracted here. Cross-paper stance extraction happens at collection level via the ingest-collection skill, after all papers have claims on master. This is because stances require visibility into other papers' promoted claims.
When all steps have completed, write a summary to ./reports/paper-$SAFE_NAME.md where $SAFE_NAME is derived from the paper directory name. Include: