
Photo Cull & Rank
Rank and cull a set of photos by objective quality — sharpness/focus, exposure, composition, eyes-open/expression for people, and duplicate-of-a-better-shot — to surface the keepers and justify the rejects. Lock the scoring CRITERIA and weights FIRST (what 'good' means for this set: a portrait shoot weights expression, a landscape weights sharpness and horizon) because an unstated rubric makes the cull arbitrary; then score every photo and produce a ranked report with keep/reject and reasons. Covers photo culling, image quality ranking, best-shot selection, photo curation, and burst/best-of selection.
Steps
Entry step: criteria. Each step names the specialist role it wants; the full working prompt is expandable.
- Scoring criteriaplannerentry
lock the quality rubric, weights, and keep threshold
Show working prompt
1) Understand the set (portraits, landscapes, product, event) and list the photos. 2) Lock the scoring RUBRIC: the dimensions (sharpness/focus, exposure, composition/framing, subject expression & eyes-open for people, noise) and a WEIGHT per dimension appropriate to the set. 3) Define the score scale (e.g. 1-5 per dimension) and the KEEP threshold (and how many keepers are wanted, if capped). 4) Decide near-duplicate handling: among similar shots, keep only the best-scoring one. 5) Write an acceptance-criteria checklist: 'every photo gets a score on every dimension', 'weights are stated and applied', 'keep/reject follows the threshold consistently', 'each reject has a concrete reason', 'among near-dupes only the best is kept'. 6) Record rubric + weights + checklist via write_task_note AND to notes/criteria.md.
- Score the photosdeveloper
evaluate every photo against the rubric
Show working prompt
1) Read criteria.md. 2) For each photo, actually LOOK at it via the vision capability (and use a sharpness/blur metric if a tool is available) and assign a 1-5 on each rubric dimension with a one-line justification grounded in what's visible (e.g. 'soft focus on eyes', 'blown highlights sky'). 3) Compute the weighted total per photo. 4) Group near-duplicates and mark the best of each group. 5) Apply the keep threshold (respecting any keeper cap) to set keep/reject. 6) Stage a table of filename → per-dimension scores → total → keep/reject → reason. write_task_note the keep/reject counts. Good looks like: defensible scores a photographer would mostly agree with.
- Write the cull reportdeveloper
produce the ranked keep/reject report
Show working prompt
1) Read the scored table. 2) Write report.md: a summary (N photos, K keepers, the rubric + weights used), a ranked KEEPERS section (best first, with their scores and a one-line strength), and a REJECTS section grouped by reason (out of focus, underexposed, weaker duplicate, etc.) each with the photo and the concrete reason. 3) Call out near-duplicate groups, showing the kept shot vs the rejected siblings. 4) Make the cull reversible — list filenames so a human can act on it. 5) On a loop-back, fix only the named issues (a misjudged score, an inconsistent threshold). 6) write_task_note the report path. The gated deliverable is report.md.
- Evaluatereviewer
Grade the deliverable against every acceptance criterion. All pass → finish; any fail → loop back and fix the gap.
Show working prompt
1) Open report.md and confirm it states the rubric + weights and a keeper/reject summary (PASS/FAIL). 2) Verify every photo is scored on every dimension and keep/reject follows the threshold consistently (PASS/FAIL). 3) Open 3-4 photos and sanity-check their scores against what you see — are obviously soft/blown shots rejected and crisp ones kept (PASS/FAIL)? 4) Confirm each reject has a concrete reason and near-dupe groups keep only the best. 5) Write PASS/FAIL per criterion. Misjudged or inconsistent culls → loop back to report (or score if the scoring is wrong). 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: "report" })` 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.
- cull my photos
- rank photos by quality
- pick the best shots
- curate a photo set
- find the keepers
Source
View this craftbook on GitHub · MIT license