From research-papers
Cross-references paper directory against collection: identifies cited papers already collected, new leads, bidirectional links in notes.md. Use --all or single path.
npx claudepluginhub ctoth/research-papers-plugin --plugin research-papersThis skill uses the workspace's default tool permissions.
---
Manages project-scoped literature reviews in Obsidian: organizes papers in Sources/Papers, synthesizes insights in Knowledge notes like Literature Overview and Research Gaps, drafts in Writing, maps to literature.canvas.
Verifies every citation in LaTeX manuscripts by fetching arXiv papers and sources to detect ghost papers, wrong metadata, inverted claims, and dead links. Suggests bib fixes and prose rewrites.
Generates compact comparison matrix for research papers from manual lists, Zotero collections, or Obsidian clusters, output to .research/literature_matrix.md for method/data/limitations triage.
Share bugs, ideas, or general feedback.
Cross-reference a paper (or all papers) against the collection, ensuring every citation link is bidirectional and accurate.
This is a notes-layer skill. It updates paper notes and collection cross-references only; it does not initialize or mutate propstore source branches.
Parse $ARGUMENTS:
--all: list all paper directories and process each one sequentially (Step 1 onward, looping)if [[ "$ARGUMENTS" == "--all" ]]; then
ls -d papers/*/ | grep -v "papers/pngs" | sort
# Process each directory through Steps 1-5
else
paper_dir="$ARGUMENTS"
fi
ls "$paper_dir"/notes.md "$paper_dir"/citations.md 2>/dev/null
Required files:
notes.md — must exist (contains the cross-references section we'll update)citations.md — must exist (contains the reference list we cross-reference from)If either is missing, report and skip this paper:
SKIP: papers/[dirname]/ — missing [notes.md|citations.md], run paper-reader first
Also check: Does notes.md already have a ## Collection Cross-References section?
Check which papers cited by this one are already in the collection.
Read citations.md — focus on both the full Reference List and the Key Citations for Follow-up section. Extract author last names and years for the key citations.
For each key citation, grep papers/index.md for the author's last name:
grep -i "AuthorName" ./papers/index.md
If found, the matching line contains the directory name. For more detail, read papers/<dirname>/description.md.
In notes.md, write or update the ## Collection Cross-References section:
## Collection Cross-References
### Already in Collection
- [[AuthorA_Year_ShortTitle]] — cited for [reason from citations.md context]
### New Leads (Not Yet in Collection)
- AuthorB (Year) — "Paper title" — relevant for [reason]
### Supersedes or Recontextualizes
- [If this paper extends/corrects/supersedes an existing collection paper, note it here]
- [Only genuine relationships — not every citation]
### Conceptual Links (not citation-based)
- [[PaperC_Year_Title]] — [specific topical connection: what claim/finding/method links these papers]
If the "Supersedes or Recontextualizes" section is non-empty, append a see-also note to each affected paper's notes.md:
echo "" >> ./papers/AffectedPaper_Dir/notes.md
echo "---" >> ./papers/AffectedPaper_Dir/notes.md
echo "" >> ./papers/AffectedPaper_Dir/notes.md
echo "**See also:** [[NewPaper_Dir]] - [relationship description]" >> ./papers/AffectedPaper_Dir/notes.md
Check first whether a see-also note already exists (to avoid duplicates):
grep -c "NewPaper_Dir" ./papers/AffectedPaper_Dir/notes.md
Find papers in the collection that reference this paper.
From the paper's notes.md, extract the first author's last name and year. Build a grep pattern:
# Search all collection markdown files for references to this paper
# Exclude the paper's own directory to avoid self-matches
grep -rl "AuthorLastName.*Year" ./papers/ --include="*.md" | grep -v "papers/AuthorLastName_Year_ShortTitle/"
Also try the directory name pattern:
grep -rl "AuthorLastName_Year" ./papers/ --include="*.md" | grep -v "papers/AuthorLastName_Year_ShortTitle/"
If any collection papers cite this one, add or update a "Cited By" subsection in the Collection Cross-References:
### Cited By (in Collection)
- [[CitingPaper_Year_ShortTitle]] — cites this for [aspect, determined in Step 4]
If no papers cite this one, either omit the section or write:
### Cited By (in Collection)
- (none found)
Steps 2–3 find explicit citation links. This step finds conceptual connections: collection papers that address the same problems, whose findings interact with this paper's claims, or whose methods complement or contradict this paper — regardless of whether any citation relationship exists.
This is what makes the collection a knowledge graph, not just a citation graph. This step is not optional. Citation-based cross-referencing alone misses the most valuable connections: papers from different research traditions that converge on the same empirical observation, or later papers that provide mechanisms for earlier observations.
Read this paper's notes.md and extract the 3–6 most important claims, methods, or findings. These are the search axes.
What to extract — be specific about the phenomenon, not just the topic:
For each claim/topic, think about what kinds of papers would connect:
Same phenomenon, different framework:
Mechanism for observation (or observation for mechanism):
Data that grounds or challenges claims:
Cross-level connections:
Use targeted grep searches across papers/*/notes.md:
# Search for papers discussing the same phenomenon
grep -rl "relevant_term" ./papers/ --include="notes.md" | grep -v "papers/ThisPaper/"
Read matching sections (not full files) to assess connection strength.
For each match, classify as:
Only surface Strong and Moderate connections. Weak connections create noise.
Add a ### Conceptual Links (not citation-based) subsection to the Collection Cross-References:
### Conceptual Links (not citation-based)
- [[PaperA_Year_Title]] — [specific connection: what claim/finding/method connects these papers and how they relate — convergence, tension, mechanism↔observation, etc.]
- [[PaperB_Year_Title]] — [specific connection]
Each entry must state the specific relationship, not just "related to duration modeling." Good: "Hertz's 'stable transition phenomenon' (CV transitions hold at ~65ms while steady states stretch) is exactly what AP predicts for a high-stiffness gesture — different formalisms, same empirical convergence." Bad: "Also about formant transitions."
Group entries by theme when there are 3+ connections (use bold subheadings like **Duration modeling:**).
For Strong connections, check if the connected paper's notes.md already mentions this paper:
### Conceptual Links (not citation-based) section (create the subsection if needed)For Moderate connections, only annotate this paper (not the connected paper) — the connected paper's own reconciliation pass will pick it up if the connection is genuinely bidirectional.
For each paper found in Step 3, read its notes.md (specifically the Collection Cross-References, Related Work, and Open Questions sections). Check for and fix:
Leads can appear in two places depending on whether the citing paper has been reconciled before:
### New Leads (Not Yet in Collection) — inside a ## Collection Cross-References section (reconciled papers)## Related Work Worth Reading — a flat list at the end of notes.md (unreconciled papers, the paper-reader default)Search both sections for an entry matching this paper (by author name and year).
If found in ### New Leads (Not Yet in Collection):
### Now in Collection (previously listed as leads) (create subsection if needed)If found in ## Related Work Worth Reading:
→ NOW IN COLLECTION: [[Author_Year_ShortTitle]] to the entry### Now in Collection (previously listed as leads) in the ## Collection Cross-References section (create section and subsection if needed)In both cases, write the "Now in Collection" entry with:
Example:
### Now in Collection (previously listed as leads)
- [[Groth_2010_AnatomyNanopublication]] — Defines nanopublication model (concept→triple→statement→annotation→nanopublication) with RDF Named Graph serialization. Structurally analogous to the micropublication model but focused on Semantic Web interoperability rather than argumentation structure.
If the citing paper describes this paper inaccurately (wrong method, wrong finding, wrong scope):
If the citing paper has open questions (## Open Questions) that this paper addresses:
[Addressed by Author_Year_ShortTitle — finding summary]If the new paper's findings conflict with or nuance the citing paper's conclusions:
Output a summary:
Reconciled: papers/[dirname]/
Forward: N already in collection, M new leads, K supersedes
Reverse: J collection papers cite this one
Conceptual: S topic-based connections surfaced (T strong, U moderate)
Updated:
- papers/CitingPaper1/ — moved lead to "Now in Collection", corrected description
- papers/CitingPaper2/ — added to "Already in Collection"
- papers/AffectedPaper/ — added see-also backward annotation
- papers/ConnectedPaper/ — added conceptual link (bidirectional)
Tensions found:
- [brief description of any finding conflicts, or "none"]
For --all mode, output a final summary after all papers are processed:
Reconciliation complete: X papers processed
- Y papers had citing papers in collection
- Z leads marked as fulfilled
- S conceptual links surfaced
- W tensions documented
- V papers skipped (missing notes.md or citations.md)
After reconciliation, every cross-reference in the collection should be bidirectional and accurate:
If Paper A cites Paper B, and both are in the collection:
If Paper A was listed as a "New Lead" in Paper B, and A is now in the collection:
If Paper A supersedes/extends Paper B:
If Papers A and B have conflicting findings:
If Papers A and B address the same problem or their findings substantively interact (even without citation):
When invoked with --all, process papers in alphabetical order. For each paper:
--all twice should produce the same result (no duplicate annotations)Before every write operation, check if the content already exists:
grep -c "PaperDirName" notes.mdgrep -c "PaperDirName" affected_notes.mdpapers/index.md entries (that's paper-reader's job)