← All craftbooks

Newsletter Issue

Documents and decksevalv1.0.0released 2026-06-05workflow: build-loop

Produce a single polished, email-client-safe newsletter issue — intro, a few curated stories with links, a featured section, and a CTA — that renders correctly across email clients. Outlines the issue's theme and section lineup FIRST, writes scannable, personable copy with working links, then builds the email-safe HTML using inline styles and table layout so it survives Gmail/Outlook. Use for recurring email newsletters, product updates, and curated digests sent to subscribers.

Steps

Entry step: outline. Each step names the specialist role it wants; the full working prompt is expandable.

  1. Outline the issueplannerentry

    theme, section lineup, story picks, and the one CTA

    Show working prompt
    Plan the issue before writing. Step 1: name this issue's theme/hook and the audience. Step 2: lay out the section lineup in order — subject line + preheader, a short personal intro, 3-5 curated stories (each: title, link, 1-2 line take), a featured/deep-dive block, and a single clear CTA. Step 3: pick the actual stories/links to include and note the angle for each; cut anything off-theme. Step 4: decide the one primary action you want readers to take. Step 5: write an acceptance-criteria checklist ('has a subject line + preheader', 'intro is short and personable', '3-5 stories each with a working link and a one-line take', 'exactly one primary CTA', 'scannable in under two minutes'). Write the lineup + checklist via write_task_note AND to notes/outline.md. No copy or HTML yet.
  2. Write the copycopywriter

    scannable, personable copy with links and one CTA

    Show working prompt
    Write the newsletter copy from the outline in a warm, scannable voice. Step 1: write a subject line (under ~50 chars, curiosity or value) and a preheader that complements it. Step 2: write a short, personable intro (2-4 sentences) tied to the theme. Step 3: for each curated story write a punchy title and a 1-2 line take that gives the reader a reason to click, with the link. Step 4: write the featured/deep-dive block — a few sentences with a clear payoff. Step 5: write the one CTA with action-oriented button copy. Keep paragraphs short, use the second person, and make it skimmable. Do not invent links — use the ones from the outline. Write the section-by-section copy via write_task_note AND to notes/write.md.
  3. Build the email HTMLdeveloper

    render index.html email-safe: inline styles, table layout, ~600px

    Show working prompt
    Build the issue as a single self-contained index.html that renders in real email clients. Step 1: use a table-based layout centered at ~600px with all CSS INLINE on elements (email clients strip <style> and ignore fl/grid) — no external stylesheets, no web fonts, web-safe font stacks only. Step 2: lay out the sections per the outline order (preheader text first, hidden but present; intro; story list; featured block; CTA button) with the approved copy verbatim. Step 3: render the CTA as a bulletproof button (a padded, background-colored anchor styled as a table cell) and make every story link a real working <a href>. Step 4: keep images optional and provide alt text; ensure it degrades gracefully with images off. Step 5: include a footer with an (illustrative) unsubscribe link. On a loop-back, fix ONLY the named gaps. Write the path via write_task_note.
  4. Evaluatereviewer

    Grade the deliverable against every acceptance criterion. All pass → finish; any fail → loop back and fix the gap.

    Show working prompt
    QA the newsletter against the locked criteria. Step 1: open/render index.html. Step 2: confirm email-safety: table layout, inline styles only (no reliance on <style>/flex/grid), centered ~600px, web-safe fonts. Step 3: check EACH acceptance criterion: subject line + preheader present, short personable intro, 3-5 stories each with a working <a href> link and a one-line take, exactly one primary CTA rendered as a tappable button, footer with unsubscribe. Step 4: confirm it is scannable in under two minutes and links are real (from the outline, not invented). Write PASS/FAIL per criterion with the offending section on any FAIL.
    
    Then route — this is the whole point of the loop:
    
    - **Every criterion PASSES →** call `advance_task_step({ ref, stepId: "evaluate", next: "finish" })`.
    - **Any criterion FAILS →** write the specific gaps to notes, then call `advance_task_step({ ref, stepId: "evaluate", next: "build" })` to loop back. The builder fixes exactly those gaps.
    
    Never route to `finish` while any criterion is unmet. The build phase's completion gate already blocked a grossly-incomplete deliverable; your job is the judgment an automated check cannot make (does it actually work, read well, look right). After ~3 unproductive loops, stop and report DONE_WITH_CONCERNS so the user can step in.
  5. Finishdeveloper

    All acceptance criteria met. Stamp a short summary and report DONE.

    Show working prompt
    Every acceptance criterion passed. Write a one-paragraph DONE summary to task notes via `write_task_note`: what was built, the deliverable path(s), and a one-line confirmation that each criterion is met. Then report DONE.

Triggers

Phrases that suggest this craftbook to a crew.

Source

View this craftbook on GitHub · MIT license