← All craftbooks

Holiday Card Run

Home and everyday lifeevalv1.0.0released 2026-06-05workflow: build-loop

Make the December run a pleasure instead of a panic: sweep the address list while there is still time to fix it, settle the card message, and produce the print-ready card and the address sheet in one sitting. Locks the roster sweep and the message criteria FIRST, then builds the card, then the address sheet, then reports the gaps that still need a human. Use for holiday cards, the annual card run, 'time for the holiday cards', address list cleanup before card season, and the December mailing.

Steps

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

  1. Sweep the rosterletter-writerentry

    who's in, stale or missing addresses, message criteria

    Show working prompt
    Sweep the list before designing anything. Step 1: read correspondents.json from the workspace — who gets a card this run, and check every address: present, missing, or suspect (a move noted, an old date, a gap). Step 2: confirm the list with the owner — who is in, who is out this year, and anyone new. Step 3: settle the message criteria — the greeting's warmth and register, anything it must say or avoid, and that one message has to work for every household on the list. Step 4: write an acceptance-criteria checklist ('every household is in or out on purpose', 'stale and missing addresses are flagged by name', 'the card message is settled and fits everyone it goes to', 'card and address sheet are print-ready — proper page setup, nothing screen-only'). Call write_task_note with the list count + flagged addresses + checklist and write notes/scope.md.
  2. Build the carddesigner

    print-ready card front and inside message

    Show working prompt
    Build the card as one print-ready HTML file at cards/card.html. Step 1: the front — the settled greeting, designed to print well on a home printer: strong type, honest margins, colors that survive paper. Step 2: the inside — the message, with room left for a handwritten line. Step 3: style it for paper — an @page rule with the card's size and margins, print styles that drop any screen-only chrome, and page breaks exactly where the fold logic wants them. Step 4: proof the text letter by letter — a typo prints twenty times. Call write_task_note with the card file path and the settled message in one line.
  3. Build the address sheetarchivist

    print-ready address sheet, roster fixes recorded

    Show working prompt
    Produce the address side of the run. Step 1: build cards/addresses.html — a print-ready address or label sheet with one block per household from the locked list, using each household's own label from the roster. Step 2: state the run count plainly on the sheet — how many households it covers. Step 3: where the owner has confirmed a correction for a flagged address, fix it on the sheet and record the update through the project's correspondence capabilities. Step 4: leave clearly-marked gaps for addresses still missing so the sheet never quietly drops a household. Call write_task_note with the covered count and the still-missing count.
  4. Write the run summaryletter-writer

    what went to print, gaps that need a human

    Show working prompt
    Write the run summary. Step 1: state what is ready — the card, the address sheet, and how many households the run covers. Step 2: list the stale and missing addresses by name with the concrete next step for each (who to ask, where to look). Step 3: note anything the owner still does by hand — signing, stamps, the mail date that makes the season. Step 4: keep it under a page. Write report.md and call write_task_note with the covered and outstanding counts.
  5. Evaluatereviewer

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

    Show working prompt
    Open cards/card.html, cards/addresses.html, and report.md and verify every criterion from notes/scope.md: the card is complete, print-styled, and carries the settled message; the address sheet covers every in-list household or marks the gap plainly — cross-check the names against correspondents.json, a household the sheet quietly dropped is the classic failure; the run count claim matches the sheet; and the report names every stale or missing address with a next step. Write PASS/FAIL per criterion; on any failure, name the gap and loop back to card.
    
    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: "card" })` 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.
  6. 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