ship-a-draft wrapper
Take raw mess to a stakeholder-ready artifact by wrapping any skilldrop generator in the two passes either side of it — structured intake before, critique and machine-residue scrub after.
- Use it when
- Use when the user has notes, a transcript, or a ticket and wants a finished document rather than a first draft.
- Comes with
- The core pack
- Where you decide
- Critique (G5): a review panel decides
- Size
- 4 stages · 1 gate · up to 3 revision rounds
Installs the loop as an invokable skill, plus every skill its stages run.
Other ways to install
Every loop in its pack, with their skills:
The loop alone, without its stage skills (each stage falls back to an inline version):
In Claude Code, the core plugin includes it:
The loop
%%{init: {'theme':'base','themeVariables':{'fontFamily':'Segoe UI, Helvetica, Arial','fontSize':'15px','lineColor':'#9AA5B1'},'flowchart':{'curve':'basis','rankSpacing':70,'nodeSpacing':50,'padding':16}}}%%
flowchart LR
classDef gen fill:#E8F0FE,stroke:#4C7DF0,stroke-width:1.5px,color:#1A3A8F;
classDef review fill:#FDEAEA,stroke:#E05B5B,stroke-width:1.5px,color:#8A1F1F;
classDef gate fill:#FBE3A2,stroke:#D9971E,stroke-width:2px,color:#6B4500,font-weight:bold;
classDef ship fill:#E6F7EC,stroke:#34A853,stroke-width:2px,color:#0F6B33,font-weight:bold;
intake["intake<br/><small>brief-intake</small>"]:::gen
draft["draft<br/><small>*</small>"]:::gen
critique["critique<br/><small>doc-critique</small>"]:::review
polish["polish<br/><small>output-hygiene</small>"]:::review
G5{"G5 · review"}:::gate
DONE(["complete"]):::ship
intake --> draft
draft --> critique
critique --> G5
G5 == "SHIP IT" ==> polish
polish --> DONE
G5 -- "MAJOR REWRITE (max 3)" --> intake
Stages
| # | Stage | What it does | Skills | Gate |
|---|---|---|---|---|
| 1 | intake generate | Collect the raw input once, into the shape the chosen generator expects, tagging every field explicit / implied / inferred / missing. | brief-intake | — |
| 2 | draft generate | Run the generator the brief was shaped for. Any artifact skill is legal here — that choice is the wrapper's whole point. | any generator | — |
| 3 | critique verify | Review the draft against the same rubric the generator was held to. | doc-critique | G5 — a review panel decides SHIP IT · SHIP WITH CHANGES · MAJOR REWRITE · WRONG ARTIFACT · BLOCKED |
| 4 | polish verify | Strip what the machine left behind before the artifact leaves the building. Surface pass only — never a substitute for the critique above. | output-hygiene | — |
A wrapper, not a lifecycle loop. Its centre stage is whichever generator the user actually needs — an ADR, a design doc, a runbook, a deck, an exec summary. The wrapper contributes the two passes every generator otherwise leaves to chance: collect the input properly before, and check the argument and the surface after.
How to run this wrapper
- Pick the generator first. The brief is shaped for a target, so
draftis chosen beforeintakeruns, not after.brief-intake's own routing table maps trigger phrases to targets; use it. - Collect once. Run
brief-intake. Every field is tagged[explicit]/[implied]/[inferred]/[missing], and its "Missing for downstream" section predicts what the chosen generator will refuse to start without. Resolve those before drafting. - Draft. Run the chosen generator on the brief. It is a normal skilldrop skill with its own quality bar — this wrapper does not override it.
- Critique at G5. Run
doc-critique, which dispatches to the same rubric the generator was held to.MAJOR REWRITEreturns tointake(not todraft— a rewrite usually means the input was wrong, not the prose).WRONG ARTIFACTleaves the wrapper entirely. - Polish last. Run
output-hygieneonly once the argument is settled. It is a surface pass; running it on a draft that is about to be rewritten wastes it.
Verdicts
Defined in contracts/terminals.json. G5 emits the critique vocabulary. SHIP WITH CHANGES carries its changes forward to polish; it does not mean the changes are optional.
When a stage's skill is not installed
Name the missing skill and skilldrop as its source, do the minimal inline version of that stage, and say the stage ran degraded. Do not skip G5 — an unreviewed artifact is the failure mode this wrapper exists to prevent.
Run log (opt-in)
Only when the environment variable SKILLDROP_LOOP_LOG is set to a file path: after each gate's verdict, append one JSON line to that file. Nothing else is recorded, and nothing is sent anywhere. When the variable isn't set, or you can't read it, skip this section.
printf '%s\n' '{"ts":"2026-10-01T14:03:00Z","loop":"ship-a-draft","stage":"critique","gate":"G5","verdict":"SHIP IT","round":1}' >> "$SKILLDROP_LOOP_LOG"
Fields: ts (UTC), loop, stage, gate (null for a stage without one), verdict (the gate's exact word), and round (1 for the first attempt, counting returns under the cap). skilldrop loop-stats summarises the file: which gates pass first time, which loop back, and which end in BLOCKED.
Quality bar
- The generator is chosen before intake runs. A brief collected for no particular target is a summary, and downstream will reject it for missing fields.
polishruns after the argument is settled, never before. Scrubbing prose that is about to be rewritten is wasted work and hides the rewrite.- A
[missing]tag is resolved or stated, never silently filled. Fabricating a goal, an owner, or a decision corrupts every downstream artifact. - Every run ends by naming what was not touched.
output-hygiene's "Not touched" section is part of the deliverable, not an appendix.
Anti-patterns to avoid
- ❌ Running
polishas the whole review. Clean prose with a broken argument still fails; that is what G5 is for. - ❌ Skipping
intakebecause the input "is already structured." A Slack thread that looks organized is still untagged — nobody downstream can tell what was inferred. - ❌ Looping
critique→draftinstead ofcritique→intake. Re-drafting from the same incomplete brief reproduces the same gaps with new words. - ❌ Treating
WRONG ARTIFACTas a severeMAJOR REWRITE. It is a redirect: the user wanted a different document, and revising this one cannot get there.