The pose engine (HSMR) runs on ultra, so nothing was consuming the m3ultra queue
ingest.py shipped to. ingest.py now delivers to a local queue/ dir by default;
--remote-queue [user@host:/path] restores the m3ultra rsync path for when a real
throughput need appears (ponytail marker + PLAN Ground-rule-1 deviation noted).
CAPTURE.md updated. Verified: inbox drop -> local queue/, ledger row, selfcheck green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
docs/CAPTURE.md — one-page filming protocol (landscape, feet in frame, T-pose
bookends, 5-30s takes, AirDrop to capture/inbox/).
ingest.py — scans capture/inbox/, probes each clip (ffprobe, display-orientation
aware so phone rotation tags are respected), rejects portrait/malformed to
capture/rejected/ with a reason, normalizes the rest to 30fps h264 (audio
stripped), renames YYYYMMDD_<name>.mp4, rsyncs to the m3ultra pose queue, and
logs every disposition to capture/LEDGER.tsv. Failed ships keep the normalized
file in capture/staged/ so a re-run retries without re-encoding.
--selfcheck exercises probe+validate on synthesized landscape/portrait clips.
Verified end-to-end: inbox drop -> one command -> clip in m3ultra queue, portrait
rejected with clear error, ledger rows written.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>