一键导入
resetting-errored-daily-jobs
Use when a FP Digest or The Rundown job has status=errored and the consumer has stopped retrying it automatically.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Use when a FP Digest or The Rundown job has status=errored and the consumer has stopped retrying it automatically.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Use when FP Digest or The Rundown is stuck, missing, delayed, retrying, or marked errored, and you need to inspect current job state, interpret failure counters, or recover manually.
Use when debugging The Rundown writer and collection path, especially opencode timeouts, reused collection artifacts, empty script output, or delayed daily episodes.
Monitors and validates the my-podcasts production pipeline. Use when checking service health, queue backlog, feed endpoints, R2 artifacts, or end-to-end delivery status.
Builds and deploys my-podcasts Cloudflare workers and validates routes. Use when shipping email-ingest or podcast-serve worker updates.
| name | resetting-errored-daily-jobs |
| description | Use when a FP Digest or The Rundown job has status=errored and the consumer has stopped retrying it automatically. |
When a daily job exhausts its retry budget (~12 hours of failures), the consumer marks it status='errored' and stops picking it up. Use the jobs CLI to inspect and reset it back to pending.
jobs reset clears stale writer artifacts (script.txt, summary.txt, covered.json) by default so the writer reruns cleanly on the next consumer pickup. Collection is preserved.
# All errored jobs (both feeds)
uv run python -m pipeline jobs list
# Filter to one feed
uv run python -m pipeline jobs list --feed fp-digest
uv run python -m pipeline jobs list --feed the-rundown
# Also check pending jobs (for jobs still retrying)
uv run python -m pipeline jobs list --status pending
Output columns: feed job-id date status failures=N error=<last_error>
By date (most common):
uv run python -m pipeline jobs reset --feed fp-digest --date 2026-03-17
uv run python -m pipeline jobs reset --feed the-rundown --date 2026-03-17
By job UUID (if you have it from step 1):
uv run python -m pipeline jobs reset --feed fp-digest --job-id <uuid>
reset removes stale writer artifacts by default. Use --keep-artifacts only if you want the writer to skip regeneration (e.g. you manually fixed script.txt).
# Watch the consumer pick it up
journalctl -u my-podcasts-consumer -f
# Check job status again after a minute
uv run python -m pipeline jobs list --status pending
uv run python -m pipeline jobs list --status completed
# Verify episode appeared
uv run python -c "
import sqlite3
conn = sqlite3.connect('/persist/my-podcasts/state.sqlite3')
conn.row_factory = sqlite3.Row
rows = conn.execute(\"SELECT title, feed_slug, pub_date FROM episodes WHERE feed_slug IN ('fp-digest','the-rundown') ORDER BY created_at DESC LIMIT 4\").fetchall()
for r in rows: print(dict(r))
"
If the job re-errors quickly, check last_error in the list output — it usually identifies whether the failure is in the writer, TTS, or publish stage.
Only restart if the service is inactive or failed. A reset job will be picked up on the next consumer loop without a restart.
sudo systemctl status my-podcasts-consumer --no-pager
sudo systemctl restart my-podcasts-consumer # only if needed
.opencode/skills/monitoring-my-podcasts-pipeline/SKILL.md.opencode/skills/operating-daily-podcast-jobs/SKILL.md