Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Retrieve one specified academic paper (by title, arXiv ID, DOI, URL, or a local .md/.txt/.pdf path the caller already has) and land it on disk as source.md plus a source.meta.json carrying a line-number section index. Checks context/papers/ for an existing copy first; local files and direct PDF URLs are read directly with no search at all, while other references use alphaxiv, Semantic Scholar routing, then bioRxiv/medRxiv. Use this as the mandatory first step whenever any other paper-reading SOP
.claude/skills/yogsoth-ai-paper-fetch/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-12 | ✗→✓ | ▲ Improved | -4% | 0% |
| case-11 | ✗→✓ | ▲ Improved | -23% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 743% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 138% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -14% | 0% |
If the caller already has the paper — a local .md/.txt/.pdf path, or a direct HTTP(S) PDF URL (path ends in .pdf, ignoring query and fragment) — read it directly before considering any search route. Record source_channel as local_file, local_pdf, or direct_pdf. If the read fails, return not_found and do not fall back to alphaxiv, Semantic Scholar, bioRxiv, or medRxiv.
The pipeline's sole entry point: retrieves a paper and lands it on disk. It checks the cache first, reads already-identified sources (local files, direct PDF URLs) with no search at all, and otherwise uses the fixed fallback (alphaxiv → Semantic Scholar routing → bioRxiv/medRxiv → not_found). Decoupled from literature-engine's literature-research/literature-search/ literature-overview — this SOP holds its own retrieval calls rather than delegating.
Skipping straight to a reading SOP with the caller's own path looks like it saves a step, but 13 downstream SOPs take meta_path and read only section line ranges (star-awarding reads method + results; first-pass-skim's "headings only, never bodies" constraint holds because it is handed shallow ranges). A bare path carries no index, and a bare .pdf carries no extracted text at all.
So the thing to skip is the four-channel search, not the landing and indexing. That is what Step 1 does: no network lookup, same landing step, same output contract. Tactics keep passing paper_ref through unchanged and never learn there was a new input form.
context/papers/<timestamp>-<title-slug>/
source.md the paper, as fetched
source.meta.json metadata + line-number section indexAll landed filenames are lowercase. <title-slug> is lowercased, non-alphanumerics collapsed to hyphens, Windows-illegal characters (: * ? " < > |) stripped, truncated to 60 chars against path-length limits.
Subagent — spawned via spawn-agent skill.
Multi-step retrieval with direct-PDF handling and domain-inference judgment calls (is a Semantic-Scholar miss a bio signal or a "just not indexed anywhere" signal?) benefits from a dedicated context that can hold the whole decision tree without the noise of whatever task will consume its output next.
A paper runs 60-80k tokens. Returning it as full_text means every downstream SOP pays that cost again, and the orchestrating tactic carries it in its own window on top. Landing it once and returning a path means: re-reading the same paper across tactics costs one cache check rather than one fetch; SOPs that need only part of the paper read only that part; the orchestrator holds paths, not text.
source.meta.json records where each section is (line ranges) rather than shipping pre-cut slices. Slicing is a per-consumer concern — unit-segmentation already declares scope: full_text | abstract | intro_only, research-question-appraisal wants intro + abstract, engineering-config-grading wants method + experiments + appendix. Pre-cutting would mean this SOP has to know every downstream SOP's definition of "the part I need", and would need editing every time one is added. An index is neutral: consumers do their own offset reads against source.md.
This also makes first-pass-skim's defining constraint (skim headings and captions, never section bodies) hold by construction rather than by self-restraint — it is handed line ranges for the shallow parts only.
Directories are named <timestamp>-<title-slug>, but paper_ref may arrive as an arXiv ID, a DOI, a URL, a local file path, or a title, and matching an arXiv ID against a title-derived directory name fails. So the lookup scans context/papers/*/source.meta.json and matches on identifier or title_slug — both are recorded precisely so any form of paper_ref resolves. For a local file, identifier is its absolute path, so re-running a tactic on the same file is a cache hit rather than a second copy.
Matching tolerates case and punctuation differences in titles but is deliberately not fuzzy: a missed cache hit costs one redundant fetch, while a false hit silently reads the wrong paper for the rest of the pipeline.
literature-overview/literature-search/literature-research already have an alphaxiv-primary/SS-supplementary pattern, but none has a bioRxiv/medRxiv branch or an explicit "can't retrieve → halt" contract, and this package is deliberately decoupled from that pipeline's scope (see context/2026-08-07-15-15-paper-fetch-sop-design.md and spec §9). Do not refactor this SOP to import those skills later without revisiting that decision explicitly.
context/2026-08-07-15-15-paper-fetch-sop-design.md — the channel decision-flow rationale (why alphaxiv's coverage list is the domain signal, why an SS miss still routes to bio rather than dead-ending). The landing / index / cache design is in context/2026-08-07-23-01-sop-io-contract-simulation.md §4, option C.
<!-- BEGIN available-tables (generated) -->
Optional, no fixed order; the final leaf is always a sop.
| SOP | When to use | | --- | --- | | spawn-agent | Spawn a customized CC subagent with full MCP tool access. |
<!-- END available-tables (generated) -->
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-12 | fail→pass | 17,194 | 10,097 | -41% | 1 | 1 | 0% | 2,379 | 2,293 | -4% | 0 | 0 | — |
case-13 | pass→pass | 20,532 | 8,191 | -60% | 1 | 1 | 0% | 2,322 | 1,859 | -20% | 0 | 0 | — |
case-11 | fail→pass | 23,895 | 12,426 | -48% | 1 | 1 | 0% | 3,486 | 2,694 | -23% | 0 | 0 | — |
case-01 | fail→fail | 41,134 | 23,514 | -43% | 1 | 1 | 0% | 4,695 | 2,411 | -49% | 0 | 0 | — |
case-02 | fail→fail | 16,556 | 35,170 | +112% | 1 | 1 | 0% | 1,822 | 4,478 | +146% | 0 | 0 | — |
case-03 | fail→fail | 26,360 | 25,337 | -4% | 1 | 1 | 0% | 461 | 2,176 | +372% | 0 | 0 | — |
case-04 | fail→pass | 17,762 | 18,492 | +4% | 1 | 1 | 0% | 415 | 3,497 | +743% | 0 | 0 | — |
case-05 | fail→pass | 11,187 | 9,287 | -17% | 1 | 1 | 0% | 855 | 2,035 | +138% | 0 | 0 | — |
case-06 | fail→pass | 21,109 | 9,785 | -54% | 1 | 1 | 0% | 2,615 | 2,237 | -14% | 0 | 0 | — |
case-07 | fail→pass | 12,333 | 15,304 | +24% | 1 | 1 | 0% | 1,324 | 3,667 | +177% | 0 | 0 | — |
case-08 | fail→pass | 13,393 | 7,186 | -46% | 1 | 1 | 0% | 1,465 | 1,774 | +21% | 0 | 0 | — |
case-09 | fail→pass | 20,662 | 10,533 | -49% | 1 | 1 | 0% | 2,374 | 2,359 | -1% | 0 | 0 | — |
case-10 | pass→pass | 20,347 | 11,515 | -43% | 1 | 1 | 0% | 2,303 | 2,470 | +7% | 0 | 0 | — |
case-14 | fail→pass | 20,394 | 7,420 | -64% | 1 | 1 | 0% | 2,534 | 1,788 | -29% | 0 | 0 | — |
case-15 | fail→pass | 12,570 | 7,566 | -40% | 1 | 1 | 0% | 1,289 | 1,836 | +42% | 0 | 0 | — |
case-16 | fail→pass | 17,190 | 9,229 | -46% | 1 | 1 | 0% | 1,964 | 2,132 | +9% | 0 | 0 | — |
case-17 | fail→fail | 17,080 | 10,876 | -36% | 1 | 1 | 0% | 1,805 | 2,329 | +29% | 0 | 0 | — |
case-18 | pass→pass | 12,138 | 8,092 | -33% | 1 | 1 | 0% | 1,133 | 1,916 | +69% | 0 | 0 | — |
case-19 | fail→fail | 17,466 | 16,885 | -3% | 1 | 1 | 0% | 1,920 | 3,085 | +61% | 0 | 0 | — |
case-20 | pass→pass | 18,094 | 36,888 | +104% | 1 | 1 | 0% | 2,557 | 7,086 | +177% | 0 | 0 | — |
case-21 | fail→fail | 15,374 | 31,222 | +103% | 1 | 1 | 0% | 172 | 3,012 | +1651% | 0 | 0 | — |
case-22 | pass→pass | 14,433 | 8,892 | -38% | 1 | 1 | 0% | 1,524 | 2,108 | +38% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 18 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +50 percentage points is the difference between those two pass rates over the 18 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.