← All craftbooks

Curate an Album

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

Turn a thousand camera-roll photos into the forty that tell the story: cull the near-duplicates, keep the keepers for honest reasons, caption what matters, and leave an album manifest the family will actually revisit. Locks the occasion and the selection criteria FIRST, then curates the manifest one moment at a time, then writes the album's short story. Use for curating an album, photo culling, 'make an album from the weekend', picking the keepers, and turning imports into albums.

Steps

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

  1. Scope the albumarchivistentry

    occasion, size, and the selection criteria locked

    Show working prompt
    Define the album before picking a photo. Step 1: read photos/index.json from the workspace — the imported photos with their timestamps — and read any caption notes alongside them (photos/*.txt) describing what the camera saw. Step 2: confirm the occasion and size with the owner — what the album is about, roughly how many photos it should hold, and anything that must be in or out. Step 3: lock the selection criteria — near-duplicates and bursts resolve to the single best frame; every pick carries a caption and an honest reason it made the cut; the picks in order tell the occasion's story, start to end. Step 4: write an acceptance-criteria checklist ('album within the agreed size', 'every pick exists in the photo index — nothing invented', 'each duplicate cluster contributes at most one frame', 'every pick has a caption and a reason', 'the sequence reads as the story of the occasion'). Call write_task_note with the photo count + target size + checklist and write notes/scope.md.
  2. Curate the manifestcurator

    cluster the bursts, pick the best frames, write the manifest

    Show working prompt
    Curate the album manifest. Step 1: walk the index in time order and group the near-duplicates — bursts and retakes shot seconds apart are one moment, not five photos. Step 2: from each moment worth keeping, choose the single best frame, using the caption notes where they exist to judge what the frame actually shows. Step 3: order the picks so the album tells the occasion start to end. Step 4: write the album manifest into albums/ named for the occasion — a JSON array, one record per pick with file, caption, and reason, the file spelled exactly as the index spells it. Call write_task_note with the pick count and the moments you cut.
  3. Write the album's storycopywriter

    the arc, the cuts worth mentioning, what to do next

    Show working prompt
    Write the album's short story for whoever opens it. Step 1: the arc — what the occasion was and how the picks carry it, in a paragraph. Step 2: the cuts worth mentioning — the burst that became one frame, the beloved-but-blurry shot that did not make it — so the family knows the culling was care, not loss. Step 3: anything the owner should re-shoot, print, or ask about. Keep it warm and short. Write report.md and call write_task_note with the album path and the pick count.
  4. Evaluatereviewer

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

    Show working prompt
    Open the album manifest in albums/, report.md, and photos/index.json and verify every criterion from notes/scope.md: the album is within the agreed size, every pick's file appears in the photo index exactly (spot-check several — no invented or misspelled files), no duplicate cluster contributes more than one frame (check the picks' timestamps), every record carries a nonempty caption and reason, and the order tells the story. Write PASS/FAIL per criterion; on any failure, name the gap and loop back to select.
    
    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: "select" })` 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