Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Audit-style editing pass for `output/DRAFT.md`: remove template boilerplate, improve coherence, and enforce citation anchoring. **Trigger**: polish draft, de-template, coherence pass, remove boilerplate, 润色, 去套话, 去重复, 统一术语. **Use when**: a first-pass draft exists but reads like scaffolding (repetition/ellipsis/template phrases) or needs a coherence pass before global review/LaTeX.
.claude/skills/willoscar-draft-polisher/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 51% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 59% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 179% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 232% | 0% |
| case-20 | ✗→✓ | ▲ Improved | 123% | 0% |
Goal: turn a first-pass draft into readable survey prose without breaking the evidence contract.
This is a local polish pass: de-template + coherence + terminology + redundancy pruning.
Note: if the main issue is structural redundancy from section accumulation, push the change upstream to sections/ and use paragraph-curator before merge. draft-polisher should not be the primary place where you decide which paragraphs to keep.
Mission: remove generator voice and make prose read like one author wrote it.
Do:
Avoid:
Mission: prevent polishing from inflating claims beyond evidence.
Do:
Avoid:
textYou are the style and coherence editor for a technical survey. Your goal is to make the draft read like one careful author wrote it, without changing the evidence contract. Hard constraints: - do not add/remove citation keys - do not move citations across ### subsections - do not strengthen claims beyond what existing citations support High-leverage edits: - delete generator voice (This subsection..., Next we move..., We now turn...) - replace navigation with argument bridges (content-bearing handoffs) - collapse repeated disclaimers into one methodology paragraph in front matter - keep quantitative statements well-scoped (task/metric/constraint in the same sentence) Working style: - rewrite sentences so they carry content, not process - vary rhythm, but avoid “template stems” repeating across H3s
output/DRAFT.mdoutline/outline.ymloutline/subsection_briefs.jsonloutline/evidence_drafts.jsonlcitations/ref.biboutput/DRAFT.md (in-place refinement)output/citation_anchors.prepolish.jsonl (baseline, generated on first run by the script)1) Citation keys are immutable
[@BibKey] keys.citations/ref.bib exists, do not introduce any key that is not defined there.2) Citation anchoring is immutable
### subsections.3) No evidence inflation
outline/evidence_drafts.jsonl and keep claims aligned to snippets.4) Citation shape normalization
[@a] [@b]).[@a; @a]).5) Quantitative claim hygiene
6) No pipeline voice
Best-of-2 micro-polish (recommended):
Role split:
Targets:
outline/outline.yml (if present) to avoid heading drift during edits.outline/subsection_briefs.jsonl to keep each H3’s scope/RQ consistent while improving flow.This subsection ..., In this subsection ...Next, we move from ..., We now turn to ..., In the next section ...From <X> to <Y>, ...citation-injector was used, smooth any budget-injection sentences so they read paper-like:e.g., ... clause tied to the subsection’s lens (no new facts).Key takeaway: across many H3s).Taken together, ...); vary synthesis phrasing and keep it content-bearing.Rewrite recipe for subsection openers (paper voice, no new facts):
This subsection surveys/argues... / In this subsection, we...A central tension is ...; ...; we contrast ...For builders, the crux is ...; ...Seen through the lens of ..., ...Role split:
Targets:
Role split:
Targets:
uv run python .codex/skills/draft-polisher/scripts/run.py --helpuv run python .codex/skills/draft-polisher/scripts/run.py --workspace <workspace>--workspace <dir>: workspace root--unit-id <U###>: unit id (optional; for logs)--inputs <semicolon-separated>: override inputs (rare; prefer defaults)--outputs <semicolon-separated>: override outputs (rare; prefer defaults)--checkpoint <C#>: checkpoint id (optional; for logs)output/citation_anchors.prepolish.jsonl):uv run python .codex/skills/draft-polisher/scripts/run.py --workspace <workspace>output/citation_anchors.prepolish.jsonl, then rerun the polisher.TODO/TBD/FIXME/(placeholder).… or ... truncation.Fix:
### subsection; if restructuring is intentional, delete output/citation_anchors.prepolish.jsonl and regenerate a new baseline.Fix:
DECISIONS.md (typically Approve C2) before doing prose-level edits.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-04 | fail→pass | 14,742 | 5,859 | -60% | 1 | 1 | 0% | 2,304 | 3,482 | +51% | 0 | 0 | — |
case-19 | pass→pass | 5,688 | 2,003 | -65% | 1 | 1 | 0% | 830 | 2,899 | +249% | 0 | 0 | — |
case-01 | fail→fail | 4,625 | 5,106 | +10% | 1 | 1 | 0% | 268 | 2,821 | +953% | 0 | 0 | — |
case-02 | fail→fail | 5,029 | 6,664 | +33% | 1 | 1 | 0% | 292 | 2,980 | +921% | 0 | 0 | — |
case-03 | fail→fail | 4,090 | 4,962 | +21% | 1 | 1 | 0% | 262 | 2,805 | +971% | 0 | 0 | — |
case-05 | fail→pass | 12,961 | 4,352 | -66% | 1 | 1 | 0% | 2,026 | 3,221 | +59% | 0 | 0 | — |
case-06 | fail→pass | 9,394 | 6,693 | -29% | 1 | 1 | 0% | 1,319 | 3,675 | +179% | 0 | 0 | — |
case-07 | pass→pass | 8,536 | 3,206 | -62% | 1 | 1 | 0% | 1,501 | 3,079 | +105% | 0 | 0 | — |
case-08 | pass→pass | 9,922 | 3,364 | -66% | 1 | 1 | 0% | 1,592 | 3,101 | +95% | 0 | 0 | — |
case-09 | fail→pass | 6,974 | 4,310 | -38% | 1 | 1 | 0% | 979 | 3,255 | +232% | 0 | 0 | — |
case-10 | pass→pass | 12,720 | 3,154 | -75% | 1 | 1 | 0% | 1,942 | 2,972 | +53% | 0 | 0 | — |
case-11 | pass→pass | 12,084 | 4,249 | -65% | 1 | 1 | 0% | 1,805 | 3,168 | +76% | 0 | 0 | — |
case-12 | pass→pass | 13,289 | 8,515 | -36% | 1 | 1 | 0% | 1,894 | 3,865 | +104% | 0 | 0 | — |
case-13 | fail→fail | 12,805 | 4,293 | -66% | 1 | 1 | 0% | 1,811 | 3,122 | +72% | 0 | 0 | — |
case-14 | pass→pass | 13,442 | 6,142 | -54% | 1 | 1 | 0% | 1,830 | 3,426 | +87% | 0 | 0 | — |
case-15 | pass→pass | 12,500 | 5,686 | -55% | 1 | 1 | 0% | 1,883 | 3,417 | +81% | 0 | 0 | — |
case-16 | pass→pass | 9,614 | 6,872 | -29% | 1 | 1 | 0% | 1,352 | 3,504 | +159% | 0 | 0 | — |
case-17 | pass→pass | 13,485 | 5,104 | -62% | 1 | 1 | 0% | 2,005 | 3,339 | +67% | 0 | 0 | — |
case-18 | fail→fail | 11,237 | 3,289 | -71% | 1 | 1 | 0% | 1,681 | 3,042 | +81% | 0 | 0 | — |
case-20 | fail→pass | 8,820 | 1,931 | -78% | 1 | 1 | 0% | 1,258 | 2,801 | +123% | 0 | 0 | — |
case-21 | pass→pass | 6,742 | 2,557 | -62% | 1 | 1 | 0% | 1,017 | 2,961 | +191% | 0 | 0 | — |
case-22 | pass→pass | 5,607 | 1,663 | -70% | 1 | 1 | 0% | 798 | 2,795 | +250% | 0 | 0 | — |
case-23 | pass→pass | 5,703 | 2,341 | -59% | 1 | 1 | 0% | 869 | 2,897 | +233% | 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 20 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 +22 percentage points is the difference between those two pass rates over the 20 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.