Academic Paper Download
Produce a structurally verified, identity-bound PDF and adjacent provenance
manifest. Require an explicit final output directory and keep automatic
resolution in this order: Unpaywall, Semantic Scholar OA, arXiv, then browser
handoff.
Workflow
- For a DOI or exact title, select the caller's final output directory. Never
guess a research directory. Add author/year when they help disambiguate a
title.
- For a publisher URL, first resolve or confirm its DOI. Pass only that DOI to
fetch.py; the CLI does not accept publisher URLs as inputs.
- Run the downloader and accept success only when the result contains a
verified file, SHA-256, size,
identity_status: matched, and adjacent manifest.
- If automatic OA sources are exhausted, or a publisher page requires login,
institution access, or interaction, explicitly choose a browser backend and
read references/browser-handoff.md. Prefer
the current Chrome session when it already has authorized institutional
access. Never silently switch backends after login failure.
- When the user explicitly selects CloakBrowser, also read
references/cloakbrowser-handoff.md.
Keep it outside
PaperTransport; do not use its stealth or humanize features
to solve CAPTCHA, Turnstile, paywalls, security warnings, or authentication.
- Read references/integration.md when embedding
the library or injecting a provenance-recording transport. Read
references/env.md for runtime configuration.
CLI
Resolve the installed skill directory to an absolute path. Use the path exposed
by the skill loader or npx skills list --json; do not assume the current
working directory is the skill directory:
SKILL_DIR='/absolute/path/to/academic-paper-download'
After installation, explicitly create the hash-locked CLI runtime and prove it
with the network-free smoke test. bootstrap is the only core command that
installs packages; normal commands never install or update dependencies:
python3 "$SKILL_DIR/scripts/runtime.py" bootstrap --locked --json
python3 "$SKILL_DIR/scripts/runtime.py" smoke --offline --json
The runtime lives outside the installed skill directory and works for copy,
symlink, and read-only installations. Install requirements-cloakbrowser.txt
only in a separate isolated environment when that optional backend is
explicitly selected. Its browser binary is a separate, preflight-verified
installation; the handoff script never downloads it.
Fetch by DOI:
python3 "$SKILL_DIR/scripts/runtime.py" fetch \
'10.48550/arXiv.1706.03762' \
--out ./papers --format json --pretty
Fetch by exact title:
python3 "$SKILL_DIR/scripts/runtime.py" fetch \
--title 'A precise paper title' \
--author 'First Author' --year 2024 \
--out ./papers --format json --pretty
Use fetch schema to inspect the machine contract version. Only an artifact
whose current manifest records matched identity evidence may return
skipped: true. Read
references/env.md when embedding the library or diagnosing
Python/runtime compatibility.
Result Rules
- Treat exit code
0 as complete, 1 as unresolved, 3 as invalid input,
and 4 as retryable transport failure.
- Require
pypdf parsing, at least one page, a final %%EOF, matching size,
and SHA-256 before committing the PDF and manifest.
- Before commit, require the requested DOI in document identity metadata or a
primary first-page DOI position. If no primary DOI is available, require a
strong title match and treat available author/year disagreement as a mismatch.
A title found only in first-page text also needs matching author or year evidence.
- Do not treat arbitrary reference-list DOIs as the paper's primary DOI. A
scanned/no-text PDF without defensible embedded metadata is unresolved and
requires manual verification; it is not a successful artifact.
- Never infer redistribution permission from successful access. Preserve
access_basis, license_status, and source-declared license fields.
- Never select the newest file in Downloads or accept HTML, truncated PDFs,
symbolic links, partial downloads, credentials, cookies, passwords, or
session tokens.
Provenance
scripts/paper_fetch/ selectively adapts MIT-licensed ideas and code from
Agents365-ai/paper-fetch at commit
c3baaa3d5df9a7eecb16fc2b4c8d10416f59bcb7. See
LICENSE.paper-fetch.txt for the retained license notice.
1---2name: academic-paper-download3description: Fetch and atomically save structurally and identity-verified academic-paper PDFs from legal open-access sources using a DOI or exact title, with access/license provenance and an adjacent hash manifest. Use for automatic OA retrieval or for a publisher URL that must first be resolved to a DOI and may then require an explicitly selected Chrome or optional CloakBrowser user-authorized browser handoff; supports an injectable transport for embedding in research systems.4---5
6# Academic Paper Download
7
8Produce a structurally verified, identity-bound PDF and adjacent provenance
9manifest. Require an explicit final output directory and keep automatic
10resolution in this order: Unpaywall, Semantic Scholar OA, arXiv, then browser
11handoff.
12
13## Workflow
14
151. For a DOI or exact title, select the caller's final output directory. Never
16 guess a research directory. Add author/year when they help disambiguate a
17 title.
182. For a publisher URL, first resolve or confirm its DOI. Pass only that DOI to
19 `fetch.py`; the CLI does not accept publisher URLs as inputs.
203. Run the downloader and accept success only when the result contains a
21 verified file, SHA-256, size, `identity_status: matched`, and adjacent manifest.
224. If automatic OA sources are exhausted, or a publisher page requires login,
23 institution access, or interaction, explicitly choose a browser backend and
24 read [references/browser-handoff.md](references/browser-handoff.md). Prefer
25 the current Chrome session when it already has authorized institutional
26 access. Never silently switch backends after login failure.
275. When the user explicitly selects CloakBrowser, also read
28 [references/cloakbrowser-handoff.md](references/cloakbrowser-handoff.md).
29 Keep it outside `PaperTransport`; do not use its stealth or humanize features
30 to solve CAPTCHA, Turnstile, paywalls, security warnings, or authentication.
316. Read [references/integration.md](references/integration.md) when embedding
32 the library or injecting a provenance-recording transport. Read
33 [references/env.md](references/env.md) for runtime configuration.
34
35## CLI
36
37Resolve the installed skill directory to an absolute path. Use the path exposed
38by the skill loader or `npx skills list --json`; do not assume the current
39working directory is the skill directory:
40
41```bash
42SKILL_DIR='/absolute/path/to/academic-paper-download'
43```
44
45After installation, explicitly create the hash-locked CLI runtime and prove it
46with the network-free smoke test. `bootstrap` is the only core command that
47installs packages; normal commands never install or update dependencies:
48
49```bash
50python3 "$SKILL_DIR/scripts/runtime.py" bootstrap --locked --json
51python3 "$SKILL_DIR/scripts/runtime.py" smoke --offline --json
52```
53
54The runtime lives outside the installed skill directory and works for copy,
55symlink, and read-only installations. Install `requirements-cloakbrowser.txt`
56only in a separate isolated environment when that optional backend is
57explicitly selected. Its browser binary is a separate, preflight-verified
58installation; the handoff script never downloads it.
59
60Fetch by DOI:
61
62```bash
63python3 "$SKILL_DIR/scripts/runtime.py" fetch \
64 '10.48550/arXiv.1706.03762' \
65 --out ./papers --format json --pretty
66```
67
68Fetch by exact title:
69
70```bash
71python3 "$SKILL_DIR/scripts/runtime.py" fetch \
72 --title 'A precise paper title' \
73 --author 'First Author' --year 2024 \
74 --out ./papers --format json --pretty
75```
76
77Use `fetch schema` to inspect the machine contract version. Only an artifact
78whose current manifest records matched identity evidence may return
79`skipped: true`. Read
80[references/env.md](references/env.md) when embedding the library or diagnosing
81Python/runtime compatibility.
82
83## Result Rules
84
85- Treat exit code `0` as complete, `1` as unresolved, `3` as invalid input,
86 and `4` as retryable transport failure.
87- Require `pypdf` parsing, at least one page, a final `%%EOF`, matching size,
88 and SHA-256 before committing the PDF and manifest.
89- Before commit, require the requested DOI in document identity metadata or a
90 primary first-page DOI position. If no primary DOI is available, require a
91 strong title match and treat available author/year disagreement as a mismatch.
92 A title found only in first-page text also needs matching author or year evidence.
93- Do not treat arbitrary reference-list DOIs as the paper's primary DOI. A
94 scanned/no-text PDF without defensible embedded metadata is unresolved and
95 requires manual verification; it is not a successful artifact.
96- Never infer redistribution permission from successful access. Preserve
97 `access_basis`, `license_status`, and source-declared license fields.
98- Never select the newest file in Downloads or accept HTML, truncated PDFs,
99 symbolic links, partial downloads, credentials, cookies, passwords, or
100 session tokens.
101
102## Provenance
103
104`scripts/paper_fetch/` selectively adapts MIT-licensed ideas and code from
105`Agents365-ai/paper-fetch` at commit
106`c3baaa3d5df9a7eecb16fc2b4c8d10416f59bcb7`. See
107`LICENSE.paper-fetch.txt` for the retained license notice.