ai4s-research/paper-writer
Use when the user wants a complete, publication-grade research paper on a specific topic — produces 200+ real citations, 4–8 publication-grade figures, and 7 sections of substantive prose compiled to PDF in one pass. No skeleton stage.
npx skills add https://github.com/ai4s-research/ai4s-skills --skill paper-writer
End-to-end research paper builder. Single stage, full quality from the start — there is no skeleton phase to enrich later. The agent (Claude Code / Cursor / Aider / Codex / …) does the writing using its own tools (WebFetch, WebSearch, Write, Bash). This skill has no Python runtime; it is purely a procedure + reference playbooks + a LaTeX template.
The substantive work is decomposed into reference playbooks under references/:
| Reference | Topic |
|---|---|
| references/00-incremental-execution.md | how to actually do this without losing work: batch sizes, persistence, resume — read first |
| references/01-bibliography-expansion.md | grow bibliography.bib to 200+ real entries via WebFetch/WebSearch |
| references/02-figures-publication-grade.md | TikZ / matplotlib / seaborn / multi-panel figure recipes |
| references/03-section-playbook.md | per-section structure, length, citation density |
| references/04-layout-discipline.md | tables, figures, floats, cross-refs, author + disclosure footnote |
| references/05-quality-gate.md | self-check before delivery (G1–G8 hard, S1–S4 soft) |
| references/06-experiment-provenance.md | honest provenance for every number (measured / simulated / illustrative) |
Read the relevant reference _before_ writing, not after.
The full pass does not fit in a single turn. The bibliography is built across ~20+ small WebFetch/WebSearch batches; sections are drafted one per turn; figures are generated one at a time. Read references/00-incremental-execution.md before starting — it is the only execution mode that actually completes without losing work.
results.json) and wants them formatted into a paper.literature-survey skill.experiment-suite skill.research-explorer skill.ai4s-agent skill (which invokes this skill as one stage).Confirm with the user:
results.json produced by the experiment-suite skill or compatible) or simulated. Default is simulated; in that case the disclosure footnote must flag it (see references/06-experiment-provenance.md).Always tell the user that human review by a domain expert is recommended before any scientific publication or production use.
Create a timestamped working directory and copy the template. Runs never overwrite each other.
TOPIC="<topic>"
SLUG=$(python3 -c "import re,hashlib,sys; t=sys.argv[1]; n=re.sub(r'[\\s_]+','-',re.sub(r'[^\\w\\s-]','',t.lower().strip())).strip('-')[:40].rstrip('-'); h=hashlib.sha1(t.encode()).hexdigest()[:8]; print(f'{n}-{h}')" "$TOPIC")
TS=$(date +%Y-%m-%d_%H%M%S)
RUN=output/paper-writer/$SLUG/$TS/paper
mkdir -p "$RUN/sections" "$RUN/figures"
cp -r templates/paper/. "$RUN/"
ln -sfn "$TS" "output/paper-writer/$SLUG/latest"
In commands below $RUN = output/paper-writer/<slug>/latest/paper.
The template provides only main.tex (title placeholder), an empty sections/ skeleton, an empty figures/, and compile.sh. Everything substantive is produced in Step 3 below.
Open references/00-incremental-execution.md first. Then carry out the five tracks below across many turns, persisting state to $RUN/ after every batch.
Open: references/01-bibliography-expansion.md.
First choose and record the temporal profile from that reference. AI4S and
similarly fast-moving fields default to at least 60% of references from the
current calendar year and previous two years; an explicitly recent window uses
the stricter recency-led profile. Then plan 15–25 query angles. For each angle:
WebSearch → pick candidates → WebFetch each candidate's abstract / arXiv API
URL → extract canonical title/authors/year/venue/url → append a BibTeX entry to
$RUN/bibliography.bib. **Every entry must originate from a URL fetched in
this session.** Memory entries are forbidden.
Hard stop: do not draft prose until the bibliography has ≥ 200 entries,
contains no unknown keys, and passes
check_bibliography_freshness.py for the recorded profile.
Open: references/02-figures-publication-grade.md.
Decide what the paper needs based on its claims and evidence:
real method whose mechanism needs explanation.
support them.
Generate each figure into $RUN/figures/. Save the matplotlib / TikZ source alongside the PDF so each figure is reproducible. If the experiment-suite produced a figures/manifest.json, reuse those figures by symlink or copy — don't redraw what's already produced.
Open: references/03-section-playbook.md.
Draft each section per its playbook (length, structure, citation density, equation requirements, anti-patterns). Cite real entries from the bib built in 3.1.
Order: introduction → related_work → method → experiment → results → conclusion → abstract last (you only know the paper's shape after writing the rest).
Open: references/04-layout-discipline.md.
interprets it, immediately after that paragraph in the source. Do not collect
artifacts in a fixed section or force one float placement across the paper.
choose [htbp], [tbp], or [p] from the artifact's size and narrative role.
~\cite{} and ~\ref{} (non-breaking space).numbers from 1 in first-appearance order. Never type display numbers manually.
\author{AI4S Agent} and attach a \thanks footnote that always recommends human review, and additionally flags simulated numerics when applicable.cd "$RUN"
pdflatex -interaction=nonstopmode main.tex
bibtex main
pdflatex -interaction=nonstopmode main.tex
pdflatex -interaction=nonstopmode main.tex
Open: references/05-quality-gate.md.
Run all G1–G8 hard gates and S1–S4 soft gates. If a hard gate fails, fix and re-run; do not ship a paper that fails G1–G4. If you cannot honestly clear a gate (e.g., bibliography stalled at 156 entries because the topic is niche), say so explicitly instead of padding.
Report to the user:
output/paper-writer/<slug>/latest/paper/main.pdf — final PDF.output/paper-writer/<slug>/latest/paper/ — complete LaTeX project (reproducible).references/05-quality-gate.md (pages, bib size, total \cite{}, figure count, table count, provenance, compile warnings).If a sibling skill has already run for the same topic, reuse its outputs by path:
output/literature-survey/<slug>/latest/bibliography.bib → seed $RUN/bibliography.bib (still bring it up to 200+ in 3.1 with WebFetch).output/experiment-suite/<slug>/latest/results.json → the source of the numbers cited in 3.3 / 3.5; its simulated flag controls the disclosure clause in 3.4.output/experiment-suite/<slug>/latest/figures/*.pdf (+ manifest.json) → reuse in 3.2 rather than redrawing.The slug formula in Step 2 is the contract; all four skills compute the same slug for the same topic.
import anthropic / import openai. The agent runs the procedure; the skill is just SKILL.md + references + template.\thanks + abstract disclosure paragraph + per-caption disclosure. Do not let the simulated label disappear during drafting.Take ai4s-research/paper-writer from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.