fix(ci): surface scheduled seed failures as a tracked issue - #92
Conversation
The weekly `Seed popular repos` workflow is the only cron-driven job in the repository, and a failed scheduled run left no signal outside Actions history and a notification email — the exact way a scheduled job rots unnoticed. Scheduled runs now reconcile a single open tracking issue labelled `scheduled-job-failure`: a failure opens it (or comments on the existing one) with a link to the failing run, and the next successful scheduled run closes it. Manual dispatches are excluded because an operator is already watching, and cancelled or skipped runs are not health signals. Only the new `alert` job holds `issues: write`; the seed job stays `contents: read`. The Turso-era row-read circuit breaker that previously blocked this work no longer applies: D1 is authoritative and the recent scheduled seed runs are green. Closes #33 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Live verification (2026-08-15)The alert path was executed in Actions under the real Run: https://github.com/Codevetter/starboard/actions/runs/31887458085
Final state of #93 before cleanup: This also settles the one thing static review could not: the repository's default workflow token permission is Incidental finding, not a defect in this PR: Cleanup: test issue #93 deleted, harness branch deleted, no harness file in this PR's diff. The |
Problem
Seed popular reposis the only cron-driven workflow in the repository. When ascheduled run failed, the only signal was Actions history and a notification
email — the exact way a scheduled job rots unnoticed. That is the remaining,
in-repo half of #33 ("keep seed/enrich/embed workflows green").
The other half of #33 was blocked on the Turso row-read circuit breaker. That
blocker no longer applies: Turso is retired, D1 is authoritative, and the six
most recent scheduled seed runs (2026-08-09 → 2026-08-14) all completed
successfully.
Change
A follow-on
alertjob runs after every scheduled seed and reconciles asingle open tracking issue labelled
scheduled-job-failure:the failing run and the job's step order;
workflow_dispatch→ no action, because an operator is already watching.Assignment is best-effort so an alert is never lost to a non-assignable handle.
The
alertjob holds the onlyissues: writegrant;seedstayscontents: read.Verification
mocked
gh(failure/no issue, failure/existing issue, success/existing issue,success/no issue) — each produced the intended call.
bash -nandshellcheckclean on the extracted script; the workflow parsesas valid YAML with the expected
ifexpression.pnpm docs:check,pnpm lint,pnpm quality:hygienepass. The one lintwarning is pre-existing on
main(verified by stashing).No production deploy, migration, or schedule change is included. The alerting
path first exercises itself on the next scheduled Sunday run.
Closes #33
🤖 Generated with Claude Code