Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build and preflight submission-ready LaTeX/PDF artifacts for Light stage 11. Use when receiving a paper-writing manuscript, figure delivery, citation delivery.json/references.bib/citekey-audit.json, or a venue/template profile; when selecting pdfLaTeX/XeLaTeX/LuaLaTeX and BibTeX/Biber; when diagnosing LaTeX errors or unresolved references; when checking page limits, double-blind identity, PDF metadata, template, page box, embedded fonts, TODOs, figures, tables, labels and citations; or when prod
.claude/skills/light0305-light-typesetting/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 744% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 422% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 1057% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 109% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 190% | 0% |
Turn approved author artifacts into a reproducible PDF submission bundle. The job is not merely to make LaTeX compile: preserve provenance, select a coherent engine/backend, preflight dependencies, compile to convergence, locate the first root cause, run profile-driven desk-reject checks, and hand exact PDF/page facts to venue-matching.
Read typesetting-resource-map.md before running a real build. Read references/build_contract.md before writing or consuming machine artifacts. Use references/latex_errors.md only after the first source-located error is known. Use a venue template under templates/ only when it matches the current author kit; the bundled copy is a starting point, not current venue truth.
delivery.json, references.bib andcitekey-audit.json. Require delivery.status=DELIVERED, declared deliverable_hashes, empty citation failures and empty claim-review leftovers. Declared citation deliverables must be relative paths inside the citation delivery directory, and the build snapshot must preserve the audit, failure and claim-review sidecars under provenance. Check staged keys and compilation. Do not re-decide DOI existence, metadata conflicts, retractions or claim relevance.
the manifest to be light.figure_delivery.v1 or light.figure_build.v1 and require the embedded file hash to match a declared output hash. For empirical figure deliveries, require confirmed result-analysis evidence binding. Check presence, embedding, float/layout and compilation. Do not redo visual honesty, scientific content or publication-size generation.
references, experiments or numbers to close a page budget.
or current authoritative instructions with URL/date provenance. Never embed a universal venue limit.
UNAVAILABLE. Never call it manuscriptERROR, never call it PASS, and never mark the delivery DELIVERED.
unavailability does not enlarge it. ROUTES has no key 11; repair failures inside stage 11 and never invent a back-edge.
For a real PDF build, detect the local toolchain before claiming success:
MacTeX or TinyTeX;
latexmk; use tectonic only when its supportedbackend matches the manuscript;
pdflatex, xelatex and lualatex as selected from source/profiletriggers;
bibtex for traditional \bibliography{} and biber forbiblatex unless explicitly declared otherwise;
pdfinfo and pdffonts when page box, page count or embeddedfont facts are required.
If the compiler, engine, backend, package or PDF inspector is missing, mark the state UNAVAILABLE, explain the missing component, and ask the user whether to install/configure it or switch toolchains. Never silently install system tools, never call a missing toolchain a manuscript error, and never report a PDF as delivered unless the build actually produced and checked that PDF.
Copy templates/typesetting_input.json. Record:
manifest;
delivery.json and desired staged BibTeX filename; the deliverymust be regenerated after citation edits so hashes match the referenced files;
light.typesetting_venue_profile.v1, including source kind, URL if any,check date and rules.
If a venue rule is unknown, keep it null, 0 or absent. Do not infer it from another venue or last year's template.
powershellpython scripts/build_submission.py --spec typesetting-input.json --preflight-only
Require a provenance-preserving source/ snapshot. Check missing inputs, \input/\include, graphics, labels/refs, citation-delivery schema/status, deliverable hashes, delivered citekey audit, empty citation failure/review handoffs, live staged citekeys, figure manifest output hashes, empirical figure evidence binding, document class, required packages and local package availability. Use a new/empty output directory per iteration; the builder refuses stale run directories.
Classify:
| Evidence | State | |---|---| | missing manuscript/figure/BibTeX/key/label, stale upstream hash, open citation review, unconfirmed empirical-figure evidence or backend conflict | ERROR | | required engine/backend/package/tool absent or cannot execute | UNAVAILABLE | | no blocker | PASS |
Detect XeLaTeX for fontspec, xeCJK, ctex, unicode-math or polyglossia; LuaLaTeX for Lua triggers; otherwise pdfLaTeX. Detect traditional \bibliography as BibTeX and biblatex as Biber unless its backend= option says otherwise.
If the profile engine conflicts with a hard XeLaTeX/LuaLaTeX source trigger, or its backend differs from the source, stop with a root-cause ERROR; do not mix BibTeX and Biber. A profile may deliberately select XeLaTeX for otherwise pdfLaTeX-compatible source. Record the absolute executable path, version probe, working directory, command array and shell rendering.
powershellpython scripts/build_submission.py --spec typesetting-input.json
Prefer local latexmk; use Tectonic only when its supported backend matches. Compile from the snapshot's manuscript directory so relative inputs resolve. Save latexmk rule/run records, log/PDF SHA-256 and page count.
Use exactly four compile states:
PASS: return code zero, PDF exists, no remaining undefined cite/ref orrerun signal.
ERROR: manuscript/backend/input caused a nonzero build or no PDF.UNAVAILABLE: required local tool/resource could not launch/finish.UNRESOLVED: PDF exists but citation/reference convergence remains.ERROR and UNRESOLVED exit 1. UNAVAILABLE exits 0 for the command-gate boundary but remains undelivered.
Read compile-report.json, then the full log. Report the first file.tex:line, compiler message and plain-language cause before secondary warnings. Fix the earliest error first; recompile after one minimal repair. Never silently rewrite prose, remove data or add fabricated bibliography.
When a fix loop repeats the same signature, stop and report UNRESOLVED instead of making speculative edits.
powershellpython scripts/desk_reject_gate.py ` --tex typesetting-build/source/paper.tex ` --pdf typesetting-build/compile/paper.pdf ` --bib typesetting-build/source/references.bib ` --log typesetting-build/compile/paper.log ` --profile venue-profile.json ` --report desk-reject-findings.json
Objective profile breaches may be critical: over page limit, unanonymous author/PDF Author metadata, wrong document class, missing required package, wrong page size, or unembedded font. TODOs, acknowledgements, self-reference, links and box warnings stay warnings unless the current authoritative profile defines an objective hard rule.
Static checks cannot prove semantic anonymity, interpret ambiguous venue language or judge final visual quality. Inspect the rendered PDF and current official analyzer/instructions before submission.
Require:
build-manifest.json;compile-report.json and compile log;compliance-report.json and desk-reject findings;failure.json for failed/unavailable runs;venue-handoff.json;delivery.json.Only compile=PASS, compliance=PASS and zero compliance critical may become DELIVERED. Preserve failed reports; they prove the fail→fix transition.
Build a local readiness packet and run:
powershellpython scripts/submission_readiness.py ` --input templates/submission-readiness.example.json --as-of YYYY-MM-DD ` --out submission-readiness-report.json
The public template is intentionally UNKNOWN and must exit 1. The state chain is INVENTORIED → SOURCE_BUILDABLE → TECHNICALLY_CHECKED → VISUALLY_CHECKED → METADATA_MATCHED → VENUE_READY → USER_APPROVED. Compile exit 0 cannot skip unresolved references, compile page_count, same-PDF binding, per-page render/review, metadata anonymity, current official profile or exact article-type binding. visual.source_pdf_sha256, metadata.source_pdf_sha256, compliance.source_pdf_sha256 and any user_approval.pdf_sha256 must equal compile.pdf_sha256; visual.page_count must equal compile.page_count; each visual page row needs render_sha256, render_tool, review_status=PASS, reviewer/reviewer_id and non-future reviewed_at. The compliance row must also name the same venue and article_type as the profile. Artifact Available/Functional/Reusable/Reproduced/Replicated remain separate; the script records evidence and never awards an ACM or venue badge.
Run the compile command gate and desk_reject findings checkpoint:
powershellpython ../light-orchestrator/scripts/run_checkpoint.py ` --file .light/passport.yaml --stage 11 ` --gate "compile=python scripts/compile_driver.py --compile paper.tex --outdir build --json-out compile-report.json --quiet" ` --findings desk-reject-findings.json --ts <ISO8601> --write
On critical fail, repair stage 11 and rerun to delivered. Hand venue-matching the venue-handoff.json PDF path/hash, page count, page size, profile source and compliance report. Do not claim ROUTES[11] or create a back-edge. --quiet keeps the Windows command gate locale-neutral; the full diagnostic record remains in compile-report.json.
ACT:
ASK:
replacing the user's official template.
NEVER:
run.
tooling for the core path.
manifests, citation delivery/BibTeX/audit/failure/review artifacts and profile.
DELIVERED; deliverable hashes match stagedfiles; citation failures and claim-review leftovers are empty.
carry confirmed result-analysis evidence binding.
PDF hash; every PDF page has a render hash, render tool, reviewer/date and review PASS row; profile is current and bound to the exact article type.
compile and desk_reject; no route/back-edge was added.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-09 | pass→pass | 8,089 | 5,005 | -38% | 1 | 1 | 0% | 1,364 | 3,777 | +177% | 0 | 0 | — |
case-01 | fail→pass | 3,524 | 6,664 | +89% | 1 | 1 | 0% | 489 | 4,127 | +744% | 0 | 0 | — |
case-02 | fail→pass | 5,048 | 7,257 | +44% | 1 | 1 | 0% | 798 | 4,169 | +422% | 0 | 0 | — |
case-03 | fail→pass | 3,379 | 15,371 | +355% | 1 | 1 | 0% | 460 | 5,320 | +1057% | 0 | 0 | — |
case-04 | fail→fail | 23,297 | 2,951 | -87% | 1 | 1 | 0% | 3,799 | 3,341 | -12% | 0 | 0 | — |
case-05 | fail→fail | 26,622 | 4,622 | -83% | 1 | 1 | 0% | 4,294 | 3,226 | -25% | 0 | 0 | — |
case-06 | fail→fail | 10,736 | 4,627 | -57% | 1 | 1 | 0% | 1,643 | 3,753 | +128% | 0 | 0 | — |
case-07 | pass→pass | 8,458 | 6,031 | -29% | 1 | 1 | 0% | 1,366 | 4,006 | +193% | 0 | 0 | — |
case-08 | pass→pass | 5,573 | 4,636 | -17% | 1 | 1 | 0% | 904 | 3,699 | +309% | 0 | 0 | — |
case-10 | fail→pass | 12,493 | 4,505 | -64% | 1 | 1 | 0% | 1,821 | 3,803 | +109% | 0 | 0 | — |
case-11 | fail→pass | 19,786 | 7,614 | -62% | 1 | 1 | 0% | 1,509 | 4,374 | +190% | 0 | 0 | — |
case-12 | fail→pass | 9,763 | 3,889 | -60% | 1 | 1 | 0% | 1,609 | 3,774 | +135% | 0 | 0 | — |
case-13 | fail→pass | 9,177 | 3,688 | -60% | 1 | 1 | 0% | 1,668 | 3,775 | +126% | 0 | 0 | — |
case-14 | fail→pass | 10,736 | 4,073 | -62% | 1 | 1 | 0% | 1,863 | 3,791 | +103% | 0 | 0 | — |
case-15 | pass→pass | 9,913 | 8,899 | -10% | 1 | 1 | 0% | 1,633 | 4,686 | +187% | 0 | 0 | — |
case-16 | pass→pass | 9,235 | 4,172 | -55% | 1 | 1 | 0% | 1,590 | 3,823 | +140% | 0 | 0 | — |
case-17 | fail→pass | 7,215 | 4,761 | -34% | 1 | 1 | 0% | 1,259 | 3,948 | +214% | 0 | 0 | — |
case-18 | fail→pass | 6,736 | 2,006 | -70% | 1 | 1 | 0% | 1,129 | 3,404 | +202% | 0 | 0 | — |
case-19 | fail→pass | 8,741 | 3,759 | -57% | 1 | 1 | 0% | 1,484 | 3,821 | +157% | 0 | 0 | — |
case-20 | fail→pass | 21,971 | 3,103 | -86% | 1 | 1 | 0% | 1,224 | 3,625 | +196% | 0 | 0 | — |
case-21 | pass→pass | 7,865 | 4,274 | -46% | 1 | 1 | 0% | 1,367 | 3,787 | +177% | 0 | 0 | — |
case-22 | fail→pass | 9,475 | 3,561 | -62% | 1 | 1 | 0% | 1,664 | 3,723 | +124% | 0 | 0 | — |
case-23 | fail→pass | 9,962 | 4,354 | -56% | 1 | 1 | 0% | 1,549 | 3,722 | +140% | 0 | 0 | — |
case-24 | pass→pass | 8,608 | 4,346 | -50% | 1 | 1 | 0% | 1,413 | 3,646 | +158% | 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. 24 cases were attempted, and 22 counted toward the lift figure. The other 2 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 +58 percentage points is the difference between those two pass rates over the 22 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.