From research-papers
Enriches claims.yaml from paper notes: fixes page numbers, aligns concepts with local inventory, converts LaTeX to SymPy, adds variable bindings, conditions, notes, uncertainty, and missing claims.
npx claudepluginhub ctoth/research-papers-plugin --plugin research-papersThis skill uses the workspace's default tool permissions.
Improve an existing `claims.yaml` with real data from the paper. This skill assumes a paper-local `concepts.yaml` exists or that you will keep concept names consistent until `register-concepts` runs.
Extracts propositional claims from research paper notes.md into claims.yaml using propstore schema. Supports parameter and equation claims; uses concepts.yaml for canonical concept names.
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.
Generates, validates, reviews, queries, and compares .knows.yaml research-paper sidecars; fetches from knows.academy for token-efficient academic search, synthesis, authoring, and peer review.
Share bugs, ideas, or general feedback.
Improve an existing claims.yaml with real data from the paper. This skill assumes a paper-local concepts.yaml exists or that you will keep concept names consistent until register-concepts runs.
paper_dir="$ARGUMENTS"
ls "$paper_dir"/notes.md 2>/dev/null || echo "MISSING: notes.md"
ls "$paper_dir"/claims.yaml 2>/dev/null || echo "MISSING: claims.yaml"
Both must exist. If claims.yaml is missing, generate it first:
uv run scripts/generate_claims.py "$paper_dir"
This command uses a scripts/... path relative to this skill's directory. It extracts parameters from tables, equations from $$...$$ blocks, and observations from the Testable Properties section. The output has placeholder page numbers (0) and raw concept names — that is what this skill fixes.
Read these files:
<paper_dir>/claims.yaml — the mechanical extraction to enrich<paper_dir>/notes.md — the full paper notes with equations, parameters, contextIf available, also read:
<paper_dir>/paper.pdf or page images in <paper_dir>/pngs/ — for verifying page numbers<paper_dir>/concepts.yaml — for aligning concept references with the paper's source-local inventoryWalk through every claim in the file. For each one, improve these fields:
Replace page: 0 with the actual page number. Cross-reference:
If the exact page cannot be determined, add provenance.section with the section name and leave page as 0.
The generator produces lowercase underscore names like fundamental_frequency. Check against the paper-local concept inventory:
ls "$paper_dir"/concepts.yaml 2>/dev/null
For each concept name:
local_name exists in concepts.yaml, use that exact nameproposed_name exists, convert the claim to the corresponding local_nameregister-concepts to absorb laterFor equation claims, the generator copies LaTeX into both expression and sympy. Replace sympy with a valid SymPy-parseable expression:
\frac{a}{b} → SymPy a/be^{x} → SymPy exp(x)\sqrt{x} → SymPy sqrt(x)\sum_{i=0}^{N} → SymPy Sum(f(i), (i, 0, N))T_p → SymPy T_pThe sympy field encodes as Eq(lhs, rhs) — dependent variable on left, expression on right. Use paper-local concept names (not letter symbols) as variable names for dimensional consistency verification.
How to build a sympy field:
Eq(lhs, rhs)Examples:
| Expression | sympy |
|---|---|
F = m * a | Eq(force, mass * acceleration) |
E = 0.5 * m * v^2 | Eq(energy, 0.5 * mass * velocity**2) |
v = f * lambda | Eq(velocity, frequency * wavelength) |
Common mistakes:
Eq() wrapperFor equation claims, populate variable mappings:
variables:
- symbol: "S"
concept: "similarity_score"
role: "dependent"
- symbol: "q_i"
concept: "query_embedding"
role: "independent"
Roles: dependent, independent, parameter, constant.
Add CEL expressions where the paper specifies conditions:
conditions:
- "dataset == 'ActivityNet'"
- "model == 'GPT-4o'"
Vocabulary constraint: Every string literal compared against a category concept should match the paper-local inventory where one exists. If the paper uses a new value, add a note in concepts.yaml or keep the condition but flag it for later concept enrichment.
Add when methodological context matters:
uncertainty: 0.29
uncertainty_type: sd # sd, se, ci95, or range
Add if the paper reports how many observations a parameter estimate is based on.
Ensure measurement-type claims have:
target_concept, measure (jnd_absolute, preference_rating, accuracy, f1_score, etc.)value and unitevaluation_population if specifiedmethodology descriptionAfter enriching existing claims, check if notes contain uncaptured information:
Add new claims with sequential IDs continuing from the highest existing ID.
Write enriched claims back to <paper_dir>/claims.yaml.
pks claim validate-file "$paper_dir"/claims.yaml
If validation fails, fix and re-validate. Do not consider enrichment complete until validation passes.
If this paper already has a source branch, push the enriched claims back into it:
source_name=$(basename "$paper_dir")
pks source add-claim "$source_name" --batch "$paper_dir/claims.yaml"
If this fails because the source branch does not exist yet, stop and use paper-process or initialize the source branch first.
uv run plugins/research-papers/scripts/stamp_provenance.py \
"<paper_dir>/claims.yaml" \
--agent "<your model name>" --skill enrich-claims
This records which model enriched claims, when, and which plugin version was used. Plugin version is autodetected.
paper: paper directory namepage: integer; use 0 only as last resortsection: section name or numbertable: table identifier (e.g., "Table 2")figure: figure identifierquote_fragment: brief supporting quote (1-2 sentences max)Claims enriched: papers/[dirname]/claims.yaml
Validation: PASS (0 errors, N warnings)
Claims: N total (P parameter, E equation, O observation, M model, X measurement, K mechanism, C comparison, L limitation)
Page numbers resolved: X of Y
Concepts aligned to inventory: X of Y
SymPy expressions added: X of Y
Conditions added: X claims
Notes added: X claims
New claims added: X