Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Write `output/DRAFT.md` (or `output/SNAPSHOT.md`) from an approved outline and evidence packs, using only verified citation keys from `citations/ref.bib`. **Trigger**: write draft, prose writer, snapshot, survey writing, 写综述, 生成草稿, section-by-section drafting.
.claude/skills/willoscar-prose-writer/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 426% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 134% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 188% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 407% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 229% | 0% |
Goal: produce a survey draft that reads like a real paper because it is driven by evidence packs, not by outline placeholders.
This skill should behave like a synthesis engine:
Mission: write each subsection as an argument (not a paper list) under citation-scope constraints.
Do:
Avoid:
This subsection...) and slide navigation (Next, we...).mechanism/architecture, data/training) into prose.survey comparisons should...) instead of literature-facing claims.Mission: prevent hollow writing by refusing to pad when evidence is thin or underspecified.
Do:
Avoid:
Mission: make the paper read as a single argument across sections.
Do:
Avoid:
Taken together, In summary, etc.).Use this as your internal framing while drafting output/DRAFT.md. It is guidance, not a sentence template.
textYou are writing a technical survey draft from evidence packs. Your job is to execute argument moves under evidence and citation constraints: - tension -> contrast -> evaluation anchor -> limitation - keep every claim attached to citations inside the sentence that needs them - synthesize across papers (>=2 citations in at least one paragraph per H3) Style: - calm, academic, content-bearing - no outline narration ("This subsection...") and no slide navigation ("Next, we...") - no pipeline jargon (workspace/unit/stage/evidence pack/quality gate) Constraints: - do not invent facts or citations - only use citation keys present in citations/ref.bib - if you cannot write a contrast or evaluation anchor without guessing, stop and route upstream
Approve C2 in DECISIONS.md.citations/ref.bib.This skill is successful only if the draft reads like an evidence-backed survey, not an outline expansion.
For each H3 subsection, ensure the prose contains all of the following moves (not necessarily as headings):
citations/ref.bib.Bad:
Many systems adopt tool schemas. [@a; @b; @c]Better:
Systems such as X [@a] and Y [@b] formalize tool schemas to reduce action ambiguity, whereas Z [@c] keeps the interface looser and shifts the burden to validation.This subsection surveys ..., In this subsection ...).Next, we move ..., We now turn to ...).Taken together, ...).For each H3, do a short preflight (kept out of the final prose):
If you cannot do this without guessing, stop and fix upstream evidence instead of writing filler.
outline/outline.ymloutline/subsection_briefs.jsonloutline/transitions.mdoutline/evidence_drafts.jsonloutline/tables_index.md, outline/tables_appendix.md, outline/timeline.md, outline/figures.mdoutline/claim_evidence_matrix.mdcitations/ref.bibDECISIONS.mdoutput/DRAFT.md and/or output/SNAPSHOT.mdparagraph_plan and uses paragraph-level citations.Before writing, load the structural and coherence inputs: outline/outline.yml (section order) and outline/transitions.md (transition map). Optionally consult outline/claim_evidence_matrix.md as an evidence index.
DECISIONS.md.Approve C2 is not ticked, write a short request block (what you plan to write + which evidence packs you will rely on), then stop.outline/subsection_briefs.jsonl and confirm every H3 has a brief and the following fields are filled and non-placeholder: scope_rule, rq, axes, clusters, paragraph_plan.outline/evidence_drafts.jsonl and confirm every H3 has an evidence pack with:blocking_missing empty,evidence_snippets non-empty,concrete_comparisons >= 3.failures_limitations or snippet provenance.paragraph_plan (survey-quality default).this run .... Do not create a dedicated “Evidence note” heading by default, and do not repeat the same evidence-mode disclaimer sentence in every H3; only mention verification needs when they are subsection-specific.scope_rule strictly to prevent silent drift; if you include an out-of-scope paper as a bridge, justify it once and keep it secondary.outline/tables_appendix.md exists, place its contents into the draft as an Appendix block (recommended: after Conclusion). Do not paste outline/tables_index.md into the paper; it is an internal index.outline/timeline.md and outline/figures.md remain optional/intermediate by default: weave them into relevant prose (or a short appendix) only if they add real reader value...., unicode ellipsis …, scaffold phrases (e.g., “enumerate 2-4 …”), or repeated boilerplate sentences, treat it as a pipeline failure signal and rewrite.These phrase families are a strong “generator voice” signal. If they appear, rewrite them into content claims (or delete) without adding new facts/citations:
survey synthesis/comparisons should ...Taken together, ... at the start of many paragraphs)Key takeaway:)…, TODO, (placeholder), or <!-- SCAFFOLD --> remains in output/DRAFT.md.citations/ref.bib).GOAL.md and scope_rule.The helper script is a gate wrapper: it blocks until approvals + prerequisites are satisfied and a real output/DRAFT.md exists (no scaffold markers). Writing itself is LLM-driven.
uv run python .codex/skills/prose-writer/scripts/run.py --helpuv run python .codex/skills/prose-writer/scripts/run.py --workspace <workspace>--help.output/DRAFT.md is written):Approve C2 in DECISIONS.md then run:uv run python .codex/skills/prose-writer/scripts/run.py --workspace <workspace>Symptom: output/DRAFT.md contains …, enumerate 2-4 ..., or repeats the same paragraph template.
Causes:
outline/subsection_briefs.jsonl is missing or generic.outline/evidence_drafts.jsonl has blocking_missing or scaffold markers.Solutions:
Symptom: subsections cite many out-of-scope papers without justification.
Solutions:
scope_rule in subsection briefs and rerun evidence packs.queries.md excludes and rerun retrieval/dedupe/mapping.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 39,593 | 5,832 | -85% | 1 | 1 | 0% | 6,235 | 3,477 | -44% | 0 | 0 | — |
case-02 | fail→fail | 3,988 | 5,537 | +39% | 1 | 1 | 0% | 298 | 3,488 | +1070% | 0 | 0 | — |
case-03 | fail→fail | 41,157 | 5,878 | -86% | 1 | 1 | 0% | 6,233 | 3,512 | -44% | 0 | 0 | — |
case-04 | fail→pass | 5,757 | 6,420 | +12% | 1 | 1 | 0% | 794 | 4,180 | +426% | 0 | 0 | — |
case-05 | fail→fail | 32,422 | 6,975 | -78% | 1 | 1 | 0% | 5,048 | 3,583 | -29% | 0 | 0 | — |
case-06 | fail→pass | 10,391 | 4,489 | -57% | 1 | 1 | 0% | 1,666 | 3,898 | +134% | 0 | 0 | — |
case-07 | fail→pass | 14,466 | 19,321 | +34% | 1 | 1 | 0% | 2,093 | 6,021 | +188% | 0 | 0 | — |
case-17 | pass→pass | 11,887 | 10,460 | -12% | 1 | 1 | 0% | 1,668 | 4,587 | +175% | 0 | 0 | — |
case-08 | fail→pass | 8,509 | 27,113 | +219% | 1 | 1 | 0% | 1,249 | 6,328 | +407% | 0 | 0 | — |
case-09 | pass→pass | 17,079 | 24,886 | +46% | 1 | 1 | 0% | 2,516 | 6,591 | +162% | 0 | 0 | — |
case-10 | pass→pass | 13,856 | 10,482 | -24% | 1 | 1 | 0% | 2,181 | 4,673 | +114% | 0 | 0 | — |
case-11 | pass→pass | 8,968 | 7,037 | -22% | 1 | 1 | 0% | 1,271 | 4,205 | +231% | 0 | 0 | — |
case-12 | pass→pass | 12,083 | 9,391 | -22% | 1 | 1 | 0% | 1,730 | 4,319 | +150% | 0 | 0 | — |
case-13 | pass→pass | 14,182 | 5,960 | -58% | 1 | 1 | 0% | 2,109 | 4,074 | +93% | 0 | 0 | — |
case-14 | fail→pass | 9,370 | 8,550 | -9% | 1 | 1 | 0% | 1,301 | 4,278 | +229% | 0 | 0 | — |
case-15 | fail→pass | 12,534 | 9,841 | -21% | 1 | 1 | 0% | 1,797 | 4,466 | +149% | 0 | 0 | — |
case-16 | fail→pass | 11,097 | 4,653 | -58% | 1 | 1 | 0% | 1,597 | 3,767 | +136% | 0 | 0 | — |
case-18 | pass→pass | 5,930 | 2,945 | -50% | 1 | 1 | 0% | 784 | 3,606 | +360% | 0 | 0 | — |
case-19 | fail→pass | 15,239 | 2,515 | -83% | 1 | 1 | 0% | 2,342 | 3,498 | +49% | 0 | 0 | — |
case-20 | fail→pass | 9,903 | 4,388 | -56% | 1 | 1 | 0% | 1,474 | 3,844 | +161% | 0 | 0 | — |
case-21 | pass→pass | 20,946 | 13,685 | -35% | 1 | 1 | 0% | 3,009 | 5,244 | +74% | 0 | 0 | — |
case-22 | fail→fail | 5,586 | 9,531 | +71% | 1 | 1 | 0% | 851 | 4,702 | +453% | 0 | 0 | — |
case-23 | pass→pass | 13,391 | 12,812 | -4% | 1 | 1 | 0% | 1,781 | 4,928 | +177% | 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. 23 cases were attempted, and 19 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 +39 percentage points is the difference between those two pass rates over the 19 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.