The quality floor for DOCUMENT deliverables drafted from a repo — brochures, one-pagers, flyers, pages, decks, memos — design guidance plus one self-check run before "done". Three floors: (1) READABLE — every text/background pair ≥ 4.5:1 (WCAG AA; 3:1 for large text) on COMPOSITED colours, print text ≥ 7pt; (2) SIZED TO THE BRIEF — the RENDERED page count honours the brief's page budget (wrappers are not pages); (3) GROUNDED — every number, URL and claim cites a repo path, mocks visibly labelled, no placeholder ships. Use when: "draft a brochure / one-pager / flyer / product page / deck / memo about <repo>", "print-ready A4 / Letter", "make it two pages", "is this brochure readable / grounded", before declaring a wicked-interactive draft/edit/revision done, or as the skill a governed drafting run (wicked-crew `interactive-*`) follows. NOT for code documentation (the engineering documentarian) or a running app's accessibility audit (the product a11y action / the qe a11y engineer).
Recursos
1Instal·la
npx skillscat add mikeparcewski/wicked-garden/wicked-garden-draft Instal·la des del registre de SkillsCat.
wicked-garden-draft — the document-deliverable quality floor
A drafting worker can write a beautiful brochure that nobody can read, that prints on
four pages when two were asked for, and that ships an amber [PLACEHOLDER] box next to
an invented "live instance" — and every prompt-level instruction it was given ("never
invent facts", "honour the page count") will have been followed in spirit. That is
the 2026-09 recon outcome this skill exists to prevent. Guidance tells the author what
good looks like; the self-check re-derives it from the saved file. A deliverable is
not done until the self-check says PASS (or says UNVERIFIED and the notes disclose
exactly what could not be verified).
Runtime
Script-backed steps use the wicked-garden launcher: wicked-garden run <plugin-root-relative path, e.g. scripts/…> [args]. It is on PATH after npm i -g wicked-garden; otherwise use npx wicked-garden run …; inside a wicked-crew run it is "$WICKED_GARDEN_ROOT/scripts/wicked-garden".
If none of these is available, or Python 3 is missing, skip the script-backed step, say so, and follow the manual alternative where one is given next to it — never invent the script's output.
Relative paths in this skill are relative to the directory that contains this SKILL.md.
The contract
| # | Floor | Rule | Re-derived by |
|---|---|---|---|
| 1 | Readable | every text/background pair ≥ 4.5:1 (3:1 for large text: ≥ 24px, or ≥ 18.66px bold), judged on the colours as COMPOSITED (alpha tints, gradients, opacity); print text ≥ 7pt |
scripts/draft/contrast_check.py |
| 2 | Sized to the brief | the RENDERED page count meets the budget the brief names — "two pages" means two PDF pages, not two .page wrappers |
scripts/draft/page_count.py |
| 3 | Grounded | every number, URL, quote and capability claim cites a repo path; mocks are visibly labelled; no [PLACEHOLDER] / TODO / lorem in the deliverable |
scripts/draft/claims_scan.py |
One command runs all three (§ Self-check). Details and worked examples: refs/design-floor.md
(colour and print typography), refs/claims.md (the citation convention), refs/self-check.md
(flags, JSON shape, exit codes, the manual alternative).
1. Readable — the contrast floor
- Judge the pair, not the token.
--ink-faint: rgba(255,255,255,0.14)looks like a
palette entry; on#1a1a26it is 1.5:1 — invisible in print. Compute (or run the
check on) the composited text colour over the background it actually sits on. - On dark surfaces, alpha tints under 0.6 of white never pass. For meta text (fact
strips, footers, eyebrows, captions) use ≥ 0.7 — aim for 7:1, not 4.5:1: small thin
type never reaches full pixel coverage, so it renders dimmer than its computed ratio. - Accent colours are not body-text colours. A 62 %-lightness violet on a
#1a1a26
card is 3.7:1; lift it to ~78 % lightness for text, or keep the accent for rules,
badges and glyphs only. - Gradients: the text must pass against the darkest AND the lightest stop it can
sit over. - Print size floor: 7pt. Eyebrows at 5.5pt and monospace fact strips at 6.8pt are
what "unreadable" looked like. Body 9.5–11pt, captions/meta ≥ 7pt, and let the check
tell you (--min-font-pt, default 7;0for screen-only deliverables). - Write colours the check can read. Use hex /
rgb()/hsl();oklch(),lab(),color-mix()and friends are not evaluated — the pair comes backUNVERIFIED, not
passed. A container whose background is only an image (url(…)) gets an opaquebackground-colorfallback, or its text isUNVERIFIEDtoo.
2. Sized to the brief — the page budget
- Default = exactly what the brief asks ("two pages" → budget 2,
--exact). If the
brief names no count: a brochure/leaflet defaults to 2, a one-pager to 1, a deck to
its slide count; a web page or memo has no page budget (--no-pages). - Disclose any hard cap the format imposes (an A4 export, a slide template) in the
deliverable's notes — and when the material cannot fit the budget, cut content;
never spill. A spill page is a blank page with a header on it. - Wrappers are not pages. A
.pageblock taller than the sheet prints on two.
Budget each page's content to the sheet (A4 portrait: 297mm minus the@pagemargins),
usebreak-after: pagebetween pages, neveroverflow: hiddento hide the overflow. - Never shrink to fit.
zoom,transform: scale(…),scale:onhtml/body/a
page wrapper, or droppingfont-sizeunder the floor to make the count come out, is
the F-RECON-007 defect in a new coat: a page budget is met by cutting content, never
by scaling the page. The size floor is judged on the effective size after any
zoom/scale, so the check fails such a document — and a transform it cannot evaluate
makes the sizeUNVERIFIED, not passed. - Verify the RENDERED count: the exported PDF (
--pdf) or a headless-Chrome print
(--render). When neither is possible the count isUNVERIFIED— say so in the notes
with the structural estimate; never state a page count you did not render.
3. Grounded — claims discipline
- Every factual claim cites a repo path — versions, requirements (
Node ≥ 22),
percentages, latencies, feature lists, quotes, URLs. Putdata-source="README.md:87"
on the element or its block (invisible in print, survives instrumentation) and list
the sources for the reader in a visible Sources strip (refs/claims.md).
Cite the line you actually read — re-open the file at that line before you write the
citation; a Read with an offset does not number lines from 1. The check verifies the
cited lines carry the block's text and reportscite-offwith the nearest-match line
if they don't. - A URL claim must say what the source says.
ws.wickedagile.comdocumented as a
static product site is a "Product site", never a "live instance". Quote the source
line before you characterise a link. - Mocks and illustrations are labelled where the reader can see it — the container
carriesdata-illustrativeAND visible text ("Illustrative — not measured data"). A
label that lives only in an HTML comment is the defect, not the label. - No placeholders in the deliverable.
[PLACEHOLDER: …], TODO, TBD, lorem, "quote
goes here": a gap belongs in your reply/notes ("no customer quote exists in the repo —
section omitted"), never in the document. A number you cannot cite is removed, not
softened.
Self-check before "done" (mandatory)
Run it on the SAVED deliverable (the file on disk is what ships), fix, and re-run until
it passes:
wicked-garden run scripts/draft/self_check.py <out.html> --pages 2 --exact --render --repo <snapshot-dir>
# with the product's own export: --pdf <exported.pdf> instead of --render
# web page / memo (no page budget): --no-pages --min-font-pt 0 --mode screen| Verdict | Exit | Meaning | What you do |
|---|---|---|---|
PASS |
0 | every floor met and every pair/page evaluated | done — end your reply with the verdict line |
FAIL |
1 | a pair below the floor, text under 7pt (after any zoom/scale), pages over budget, a placeholder, an uncited number/URL, a hidden mock label, a dangling source, a cite-off (cited line doesn't carry the block's text) |
never done — fix the document (not the check, not the flags), re-run |
UNVERIFIED |
3 | no floor failed, but something could not be evaluated: the page count (no PDF and no renderer on this seat), or a colour pair (unsupported colour function, image-only background, an unevaluable transform) | done only with disclosure — copy the DISCLOSE line(s) the check prints into the deliverable's notes and your reply |
There are exactly two "done" states: PASS, or UNVERIFIED with the disclosure. FAIL
is never done. A disclosure names (a) which check is unverified, (b) why on this seat
(e.g. "no Chrome/Chromium — structural estimate 2 pages"), (c) what a reviewer must do to
verify it (e.g. "run page_count.py --pdf <export> on the product's PDF export", or
"check pair X by hand / rewrite it in hex with an opaque background"). Paste the verdict
line(s) into your reply — never paraphrase them or describe a run you did not make. If the
launcher or Python is missing, follow the manual alternative in refs/self-check.md (the
WCAG formula per token pair, a real print to count pages, and the placeholder/number grep)
and say which steps were manual.
In a governed run (wicked-crew interactive-draft, -edit, -chat)
- Outline phase: state the page budget you read from the brief (or the default
above), the deliverable's format contract, and the sources you will cite — as plain
text, no HTML yet. - Draft phase: write the file to the absolute path the task names, then run the
self-check on THAT file with the budget and the repo snapshot(s) the task names
(--pdfwhen the task gives you an export, else--render). Fix and re-run until the
verdict isPASS— orUNVERIFIEDwhen this seat has no renderer or a pair cannot be
evaluated (the check printsDISCLOSE …lines): then stop re-running, put the
disclosure into the deliverable's notes, and end the reply with the absolute path, the
verdict line, the structural page estimate, and the verification point ("verify withpage_count.py --pdfon the product's PDF export"). AFAILis never a stopping
point. The run's own deliverable floor only proves the file exists — this skill is the
quality floor. - Edit / revise phases: a revision can re-introduce a defect (a design pin that
darkens a caption). Re-run the self-check after every landed change; aFAILis
yours to fix before the turn ends. - Never add
data-widattributes yourself;data-sourceanddata-illustrativeare
fine — the service instruments its own anchors around them.