Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Download PDFs (when available) and extract plain text to support full-text evidence, writing `papers/fulltext_index.jsonl` and `papers/fulltext/*.txt`. **Trigger**: PDF download, fulltext, extract text, papers/pdfs, 全文抽取, 下载PDF. **Use when**: `queries.md` 设置 `evidence_mode: fulltext`(或你明确需要全文证据)并希望为 paper notes/claims 提供更强 evidence。
.claude/skills/willoscar-pdf-text-extractor/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 22% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -38% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 39% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -2% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 18% | 0% |
Optionally collect full-text snippets to deepen evidence beyond abstracts.
This skill is intentionally conservative: in many survey runs, abstract/snippet mode is enough and avoids heavy downloads.
papers/core_set.csv (expects paper_id, title, and ideally pdf_url/arxiv_id/url)outline/mapping.tsv (to prioritize mapped papers)papers/fulltext_index.jsonl (one record per attempted paper)papers/pdfs/<paper_id>.pdf (cached downloads)papers/fulltext/<paper_id>.txt (extracted text)queries.md can set evidence_mode: "abstract" | "fulltext".abstract (default template): do not download; write an index that clearly records skipping.fulltext: download PDFs (when possible) and extract text to papers/fulltext/.When you cannot/should not download PDFs (restricted network, rate limits, no permission), provide PDFs manually and run in “local PDFs only” mode.
papers/pdfs/<paper_id>.pdf where <paper_id> matches papers/core_set.csv.- evidence_mode: "fulltext" in queries.md.uv run python .codex/skills/pdf-text-extractor/scripts/run.py --workspace <workspace> --local-pdfs-onlyIf PDFs are missing, the script writes a to-do list:
output/MISSING_PDFS.md (human-readable summary)papers/missing_pdfs.csv (machine-readable list)papers/core_set.csv.outline/mapping.tsv exists, prioritize mapped papers first.pdf_url (use pdf_url, else derive from arxiv_id/url when possible)papers/pdfs/<paper_id>.pdf if missingpapers/fulltext/<paper_id>.txtpapers/fulltext_index.jsonl with status + stats.txt to re-extract).papers/fulltext_index.jsonl exists and is non-empty.evidence_mode: "fulltext": at least a small but non-trivial subset has extracted text (strict mode blocks if extraction coverage is near-zero).evidence_mode: "abstract": the index covers every papers/core_set.csv paper and every record clearly reflects skip_mode_abstract (no downloads attempted). fulltext_max_papers does not truncate this zero-download index.uv run python .codex/skills/pdf-text-extractor/scripts/run.py --helpuv run python .codex/skills/pdf-text-extractor/scripts/run.py --workspace <workspace>--max-papers <n>: cap number of papers processed (can be overridden by queries.md)--max-pages <n>: extract at most N pages per PDF--min-chars <n>: minimum extracted chars to count as OK--sleep <sec>: delay between downloads--local-pdfs-only: do not download; only use papers/pdfs/<paper_id>.pdf if presentqueries.md supports: evidence_mode, fulltext_max_papers, fulltext_max_pages, fulltext_min_chars- evidence_mode: "abstract" in queries.md, then run the script (it will emit papers/fulltext_index.jsonl with skip statuses)- evidence_mode: "fulltext" in queries.md, put PDFs under papers/pdfs/, then run: uv run python .codex/skills/pdf-text-extractor/scripts/run.py --workspace <workspace> --local-pdfs-onlyuv run python .codex/skills/pdf-text-extractor/scripts/run.py --workspace <workspace> --max-papers 20 --max-pages 4 --min-chars 1200papers/pdfs/; extracted text is cached under papers/fulltext/..txt file.Fix:
evidence_mode: abstract (default) or provide local PDFs under papers/pdfs/ and rerun with --local-pdfs-only.Fix:
abstract evidence level and avoid strong fulltext claims.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 3,341 | 5,233 | +57% | 1 | 1 | 0% | 377 | 1,591 | +322% | 0 | 0 | — |
case-02 | fail→fail | 11,413 | 5,022 | -56% | 1 | 1 | 0% | 2,406 | 1,433 | -40% | 0 | 0 | — |
case-03 | fail→fail | 15,895 | 4,285 | -73% | 1 | 1 | 0% | 3,156 | 1,376 | -56% | 0 | 0 | — |
case-04 | pass→pass | 12,603 | 5,337 | -58% | 1 | 1 | 0% | 1,914 | 2,170 | +13% | 0 | 0 | — |
case-05 | fail→pass | 10,074 | 4,226 | -58% | 1 | 1 | 0% | 1,624 | 1,976 | +22% | 0 | 0 | — |
case-06 | fail→pass | 17,349 | 2,512 | -86% | 1 | 1 | 0% | 2,685 | 1,653 | -38% | 0 | 0 | — |
case-07 | fail→pass | 6,565 | 2,148 | -67% | 1 | 1 | 0% | 1,143 | 1,591 | +39% | 0 | 0 | — |
case-08 | fail→pass | 12,121 | 4,509 | -63% | 1 | 1 | 0% | 2,061 | 2,027 | -2% | 0 | 0 | — |
case-09 | pass→pass | 4,797 | 1,841 | -62% | 1 | 1 | 0% | 702 | 1,471 | +110% | 0 | 0 | — |
case-10 | pass→fail | 11,091 | 5,042 | -55% | 1 | 1 | 0% | 1,738 | 2,034 | +17% | 0 | 0 | — |
case-11 | pass→pass | 12,318 | 4,142 | -66% | 1 | 1 | 0% | 1,923 | 1,973 | +3% | 0 | 0 | — |
case-12 | pass→pass | 12,898 | 7,004 | -46% | 1 | 1 | 0% | 2,101 | 2,445 | +16% | 0 | 0 | — |
case-13 | fail→pass | 8,114 | 1,741 | -79% | 1 | 1 | 0% | 1,249 | 1,471 | +18% | 0 | 0 | — |
case-14 | pass→pass | 7,541 | 3,961 | -47% | 1 | 1 | 0% | 1,211 | 1,895 | +56% | 0 | 0 | — |
case-15 | fail→pass | 9,816 | 3,028 | -69% | 1 | 1 | 0% | 1,581 | 1,694 | +7% | 0 | 0 | — |
case-16 | pass→pass | 13,722 | 5,386 | -61% | 1 | 1 | 0% | 1,961 | 2,033 | +4% | 0 | 0 | — |
case-17 | fail→pass | 11,646 | 1,791 | -85% | 1 | 1 | 0% | 1,723 | 1,480 | -14% | 0 | 0 | — |
case-18 | fail→pass | 6,924 | 1,496 | -78% | 1 | 1 | 0% | 1,168 | 1,421 | +22% | 0 | 0 | — |
case-19 | fail→pass | 16,021 | 8,870 | -45% | 1 | 1 | 0% | 2,526 | 2,656 | +5% | 0 | 0 | — |
case-20 | pass→pass | 3,142 | 2,962 | -6% | 1 | 1 | 0% | 515 | 1,768 | +243% | 0 | 0 | — |
case-21 | pass→pass | 7,604 | 5,067 | -33% | 1 | 1 | 0% | 1,269 | 2,057 | +62% | 0 | 0 | — |
case-22 | pass→pass | 3,828 | 2,811 | -27% | 1 | 1 | 0% | 639 | 1,633 | +156% | 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 19 counted toward the lift figure. The other 3 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 +36 percentage points is the difference between those two pass rates over the 19 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
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.