
Year in Review
Build the year-in-review that makes someone cry the good way: every month represented or its gap acknowledged, the people balanced, the closing image chosen on purpose — the annual ritual the whole photo archive exists for. Locks the year and the coverage criteria FIRST, then curates the selection month by month, then narrates the year's thread. Use for year-in-review albums, annual photo retrospectives, 'the year in photos', December album rituals, and closing out the year's archive.
Steps
Entry step: scope. Each step names the specialist role it wants; the full working prompt is expandable.
- Scope the yeararchivistentry
the year's months mapped, coverage criteria locked
Show working prompt
Define the year before picking a photo. Step 1: read photos/index.json from the workspace and establish the year under review — the span the index covers — month by month: how many photos each month holds and where the thin months are. Step 2: read the caption notes alongside the photos (photos/*.txt) and confirm with the owner who and what mattered this year — the people who should be present, the events that anchor it. Step 3: lock the coverage criteria — every month is represented by at least one pick or its gap is named honestly in the review; the people balance out across the year rather than one face filling every page; the opening and closing images are chosen on purpose, not by timestamp. Step 4: write an acceptance-criteria checklist ('every month represented or its gap acknowledged in the review', 'every pick exists in the photo index', 'people balanced across the selection', 'opener and closer chosen with stated reasons', 'the review names the year's thread'). Call write_task_note with the per-month counts + checklist and write notes/scope.md. - Curate the yearcurator
month-by-month picks, cast balanced, opener and closer chosen
Show working prompt
Curate the year's selection. Step 1: walk the index month by month and shortlist the frames that carry each month — the caption notes tell you what the camera saw. Step 2: balance the cast — if one person dominates the shortlist, trade near-equal frames toward the people who are missing. Step 3: choose the opener and the closer deliberately — the image that starts the year's story and the one that ends it — and note why. Step 4: write the selection manifest into albums/ named for the year (year-<yyyy>.json) — a JSON array, one record per pick with file, month, and caption, the file spelled exactly as the index spells it. Call write_task_note with the pick count per month and the opener/closer choices.
- Narrate the yearcopywriter
month sections, gaps named kindly, the year's thread
Show working prompt
Write the year's review to sit beside the album. Step 1: open with the year's thread — the sentence the whole album argues. Step 2: a short section per month — what the month held, carried by its picks' captions; where a month is thin or empty, say so plainly and kindly, because the gap is part of the year too. Step 3: close on the closing image — why it ends the year. Step 4: keep it the kind of thing someone reads aloud at the table in December. Write report.md and call write_task_note with the report path and the year's thread.
- Evaluatereviewer
Grade the deliverable against every acceptance criterion. All pass → finish; any fail → loop back and fix the gap.
Show working prompt
Open the year manifest in albums/, report.md, and photos/index.json and verify every criterion from notes/scope.md: every month of the year is represented in the manifest or its gap named in the review (check the thin months especially), every pick's file appears in the photo index exactly, the cast is balanced rather than one face throughout, the opener and closer are identified with reasons, and the review carries a month-by-month shape with the year's thread stated. Write PASS/FAIL per criterion; on any failure, name the gap and loop back to curate. 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: "curate" })` 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. - 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.
- year in review album
- the year in photos
- build the annual album
- december photo ritual
- year in review
Source
View this craftbook on GitHub · MIT license