GATE D
SORTED
moved to canonical home
0
items here now
—
aggregate size
What this gate means
An item is at SORTED once its bytes have moved to their canonical home. For photos that's /RAID/photos/<year>/<month>/; for emails it's /RAID/email/<account>/; for purchase docs it might be pa.gf.cx records. Derivatives mirror to R2 (per the negatives-stay-home pattern); originals live only on the RAID.
Sub-routines · operational playbook
Photos → RAID + Immich indexing
rsync → /RAID/photos/// (Immich auto-indexes)
Photos sort by capture date, not import date. Use exiftool's
FileModifyDate rewrite mode to fix mtimes from EXIF before rsync, then rsync into year/month buckets. Immich watches the RAID photos dir and indexes automatically — search/browse via the Immich web UI.exiftool '-FileModifyDate/photos/
rsync -av --no-perms --no-owner /Volumes//photos/ /Volumes/RAID/photos/
when: Photo-heavy intakes after metadata extracted
Email → RAID maildirs
rsync → /RAID/email// in maildir format
Takeout delivers Gmail as mbox. Convert to maildir for faster random access (
mb2md or python mailbox module). One subdirectory per account. Mail clients can later mount these via IMAP gateway if needed.mb2md -s /Volumes//Takeout/Mail/All\ mail.mbox -d /Volumes/RAID/email//
when: Gmail / Workspace Mail intakes
Docs → pa.gf.cx records
OCR + retag → pa.gf.cx purchase / asset / service records
Receipts, invoices, manuals, service records get OCR'd and routed into pa.gf.cx as proper records — not dumped into a 'docs' folder. The pa.gf.cx ingest pipeline already exists (see pa_ebay_gdpr_process / pa_purchases_dashboard). Drop docs into
~/Desktop/Sort/ for pa to pick up.# AirDrop / move scanned docs into ~/Desktop/Sort//
# then trigger pa ingest as documented at pa.gf.cx/service-records
when: Personal paper digitized · receipts / asset docs from cloud archives
Derivatives → R2 mirror
~1500px JPG + 1080p MP4 + thumb + sidecar JSON
Per the derivatives-in-R2 / originals-on-RAID pattern: every photo and video gets three R2 artifacts (preview, thumb, sidecar). The RAID keeps the master. Immich's ingest pipeline produces these natively; rsync only the preview + thumb + sidecar dirs to R2, exclude originals.
rclone sync /RAID/immich/preview/ r2:photos.gf.cx/preview/ --transfers=8
rclone sync /RAID/immich/thumb/ r2:photos.gf.cx/thumb/ --transfers=8
when: After photos/videos land in their canonical RAID home
Manifest update
set target_home in migrations.yml + re-bake
Update each item's
target_home field to the canonical path it landed in, flip state to sorted, re-run ./bake.py. The dashboard now reflects the gate transition; the items-by-gate section shifts the entry from SOURCED down to SORTED.$EDITOR migrations.yml # state: sorted, target_home: /RAID/photos/...
./bake.py && git commit -am 'sort: '
when: After bytes land in canonical home
Items at this gate
No items currently at this gate.
Gate-exit checklist
Verify before moving items into ARCHIVED:
- Bytes at canonical home, not intake scratch
- Derivatives mirrored to R2 where applicable
- Indexing/cataloging service (Immich, mb2md, pa) recognizes the new files
- migrations.yml updated and re-baked
Gate D · SORTED · baked 2026-05-29 from
migrations.yml + GATE_DETAIL