| name | study |
| description | Generate a paper dossier. Study one paper (or idea with a seed paper) into a fixed-template HTML page in the anu atlas (~/.anu/atlas/papers/<id>): what it claims, what it stands on and led to, the nearest work classified by closeness, code that implements it, and the bounded gap. Fans out reader/lineage/neighborhood/code agents via the Workflow tool and screens neighbors cold. Use when the user runs /study or asks to catch me up on / understand / situate a paper. The /map of an idea. |
/study: paper dossier
Produce a dossier of one paper and render it as one HTML page in the anu atlas,
the literature twin of /map. One fixed template for every paper, always the
same visual grammar: the paper (claim, method, result), nearest work by
closeness, lineage (stands on · led to), implementations, and the gap. The
page is the artifact; keep the chat output minimal.
Follow the finding-prior-art discipline throughout. Never name a paper or
claim what it says from memory. Every record comes from the scholar engine
(~/.local/share/anu/plugins/ideas/bin/scholar) or a source actually fetched.
Steps
-
Resolve the seed paper (one bash call). $ARGUMENTS is a DOI, arXiv id,
OpenAlex id, URL, title, or a path to notes naming a paper.
SCHOLAR=~/.local/share/anu/plugins/ideas/bin/scholar
SEED=$("$SCHOLAR" resolve "$ARGUMENTS" --json)
STAMP=$(date '+%Y-%m-%d %H:%M')
TS=$(date +%Y%m%d-%H%M%S)
Sanity-check the resolved title against what the user asked for. If
resolution is ambiguous or clearly wrong (a title search can miss, and bare
pre-2022 arXiv ids do not resolve), show what resolved and ask before
spending the workflow: a dossier on the wrong paper is worse than none. If
$ARGUMENTS is an idea with no obvious seed paper, use /prior-art instead,
then /study the nearest hit.
-
Run the workflow. Call the Workflow tool with:
scriptPath: ~/.local/share/anu/plugins/ideas/skills/study/workflow.js (expand ~ to the real home dir)
args: {"seed": <the SEED object, parsed from JSON>, "query": "$ARGUMENTS", "generatedAt": STAMP}
Wait for it to complete. It returns the dossier as a JSON object.
-
Persist and render (bash + Write). Key the atlas entry on the OpenAlex id
(stable), falling back to a title slug:
ID=$(printf '%s' "$SEED" | python3 -c 'import json,sys; d=json.load(sys.stdin); print((d.get("id") or "paper"))')
OUT="$HOME/.anu/atlas/papers/$ID"
mkdir -p "$OUT/history"
[ -f "$OUT/study.json" ] && mv "$OUT/study.json" "$OUT/history/$TS.json"
Write the returned dossier JSON to $OUT/study.json, then:
python3 ~/.local/share/anu/plugins/ideas/skills/study/render.py "$OUT/study.json" "$OUT/index.html"
open "$OUT/index.html"
-
Report: one short paragraph with the page path, the closeness verdict (is
the idea already done / partly / open and the single nearest paper), and the
one or two sharpest openings from the gap. Do not restate the dossier; the
page is where it lives.
Rules
- Never edit
template.html or render.py per run. The template is fixed by
design; all per-paper variation lives in study.json (same contract as /map).
- A search hit is a screen, not a verdict. The workflow screens the nearest
candidates cold (fresh context, fetch + quote) before assigning closeness.
Do not relabel its verdicts from memory.
- Frame the gap as bounded by what was searched ("nearest is X, differs in Y;
found nothing doing Z"), never a blanket "this is novel".
- Old runs accumulate in
$OUT/history/. Never delete them; they are the raw
material for diffing how a paper's neighborhood and citation graph move over time.
- If
scholar returns nothing for a phase (e.g. an arXiv preprint with no parsed
references), the page renders that section thin and says so. That is honest, not a failure.