Sample 3 of 3 — CULL FORGE

Keeper export folder — after you CULL

Command: photocull.cmd "C:\Pictures\wedding-2026" --export keepers --min-stars 4 --suffix → copies into wedding-2026_keepers next to the shoot. Originals never touched.
Exporter output — 6 files, suffix on
wedding-2026_keepers/6 keepers · SHA-256 identical
./ WED-0100-cull5G.jpg — 5 Green (was WED-0100.jpg) ✓ 2.1 MB copy
./ WED-0101-cull4.jpg — 4
./ WED-0106-cull5R.jpg — 5 Red
./ WED-0108-cull4B.jpg — 4 Blue
./ WED-0110-cull5G.png — 5 Green PNG
sub/ WED-0111-cull4.jpg — 4 (nested preserved) ✓ structure kept
✕ WED-0105 NOT exported — rejected -1
· WED-0102 (3 Yellow), WED-0103 (2), WED-0104 (1 Purple) — below --min-stars 4, not exported

Naming: <stem>-cull<stars><LabelLetter>.<ext>. Omit --suffix to keep original names.

Integrity — byte-identical

Every keeper is SHA-256 hashed against its source. The files that arrive are the files that left.

sha256(WED-0100.jpg) == sha256(keepers/WED-0100-cull5G.jpg)  # True
sha256(sub/WED-0111.jpg) == sha256(keepers/sub/WED-0111-cull4.jpg)  # True
# 6 keepers hashed — all pass (kill test check 20)

Re-run: python scripts/killtest_roundtrip.py → check 20: "every exported copy is byte-identical (SHA-256) — 12-file plan, 6 keepers hashed" PASS.

RAW siblings not exported (only their sidecars). Export is copies — your card dump stays as shot.

Console line you see
[photo-cull] keepers: 6 matched (min 4 star(s))
[photo-cull] copied 6 file(s) (0 already there) -> C:\Pictures\wedding-2026_keepers

Second run skips existing non-empty files (skipped 0 above) — safe to re-export.

← All 3 samples · Contact sheet · XMP sidecar · Home — CULL offers