ffmpeg extract audio: ... pcm_s16be ... not currently supported in container | Source video has PCM audio (Sony/Panasonic C-series MP4s). | Already mitigated: internal/scan/scan.go uses -acodec aac -b:a 128k to transcode rather than copy. |
wait active: file processing failed | iPhone video too large (>1 GB) choked Gemini's file processor. | Audio-extract path (current default) sidesteps this. If it recurs, check that ffmpeg step ran. |
RESOURCE_EXHAUSTED, daily quota | Free-tier Gemini hit. | Enable billing on the GCP project linked to the key; no code change. |
Your project has been denied access (PERMISSION_DENIED) | GCP billing flagged mid-run. | User must resolve via Cloud Console billing. Retry with kai process --limit 50 once cleared. |
auth: cannot fetch token: 400 / invalid_grant at startup (folder lookup) | Google refresh token expired (~7-day life while consent screen is in "Testing"). Binary won't re-prompt — loadOrFetchToken (internal/gdocs/gdocs.go) only runs the browser flow when the token file is missing/unparseable, and a present-but-expired token parses fine. | mv google_token.json google_token.json.expired-<date>, then re-run kai process. It opens a browser for consent (localhost-listener flow, 5-min timeout), writes a fresh token, and continues — works even from a backgrounded run. Durable fix: publish the OAuth consent screen Testing → Production. |
summary parse: decode summary... | Gemini output-token cap truncated JSON. | Already mitigated: salvage path extracts partial summary, writes entry with empty tags. |
osxphotos export ...: signal: killed | Per-video download timeout (15 min). | Retry — re-running kai process picks up only the failed row via process_log.json. |
captions_unavailable | YouTube hasn't generated auto-captions for a recent livestream yet. | Re-run after a few hours. |
State-file race (missing entries in process_log.json after concurrent runs) | Two process commands writing the same JSON. | go run ./cmd/rebuild-state — rebuilds from Google Docs as source of truth. |