Producer Fallback: When Claude Hits the Weekly Limit, the Pipeline Still Ships
What Broke at 04:00
Two failures, one after the other:
- Dirty tree preflight. Closing a bead the night before left one uncommitted line in
.beads/interactions.jsonl.preflight_branch_normalizecorrectly refused to run on a dirtymaster. No produce step. No post for 2026-07-14. - Claude weekly limit. After the tree was cleaned and the run re-fired,
claude -p /blog-backfillexited in three seconds with:weekly limit, resets Jul 19. Land saw no post file and reportedNO-POST (rc=20).
That is the same shape as automation assurance on Intent-OS: exit codes and "the scheduled job ran" are not outcome verification. The outcome is a live URL.
Fix One: Do Not Brick the Cron on Beads Interaction Noise
.beads/interactions.jsonl is an append-only session audit log. Any bd close dirties it without committing. Treating that as "human has uncommitted feature work" is wrong; treating real content dirt the same as always is right.
preflight_branch_normalize now:
- Still
FATALon any tracked dirt that is not interactions-only. - If the only dirty path is
.beads/interactions.jsonl, auto-commit it with a mechanical message and continue.
That keeps the clean-tree invariant for posts and methodology files without letting a late-night bead close silence the morning publish.
Fix Two: Hard Voice Lint (Already on Master)
Separately, the produce path now fails closed on AI voice fingerprints:
- Em dash / en dash hard ban
- Expanded slop phrase list
- Deterministic
lint-post-voice.pyin the skill and again inblog-land.sh
Phrase checks mask fenced code and URLs so repo names do not false-positive. Historical posts are not bulk-rewritten; only the post being landed is gated. That gate is what made the recovered 2026-07-14 post ship without the em-dash density that had become the house default.
Fix Three: Grok as Producer Fallback
Claude remains the primary producer. It is not the only producer. blog-backfill-daily.sh now:
- Tries
claude -p /blog-backfill(same as before). - If Claude fails and no post exists for the target date, runs a Grok headless producer with the same contract: write the post, append
decisions.jsonl, write.blog-staging/DATE.intent.jsonwithready:trueonly after gates (including voice lint). No git. - Always runs
blog-land.shafterward (verify โ commit โ push โ dual-publish โ queue, or quarantine).
Env Knobs
| Variable | Values | Meaning |
|---|---|---|
BLOG_PRODUCER |
auto (default), claude, grok |
Which producer(s) to run |
GROK_BIN |
path | Defaults to ~/.grok/bin/grok |
BLOG_GROK_MAX_TURNS |
int | Headless turn cap (default 120) |
auto is the production setting until Claude is healthy again, and it stays useful after: a weekly limit or API blip should not equal a missed day.
What Actually Shipped for 2026-07-14
While Claude was dark, the 2026-07-14 post was produced manually under the same land contract:
- Exit 0 Is Not Success: Automation Assurance That Verifies Outcomes
- Voice lint PASS, Hugo PASS, dual-publish to
tonsofskills+field-notes, live liveness OK - Ezekiel packet re-sent with real social copy after the first send degraded (voice-gen still hits Claude)
The content thesis of that post and the ops lesson of this one are the same sentence: exit 0 is not success; verify the outcome.
Also on the Board Today
- Release bumps and README/changelog sync after the voice-lint and preflight commits landed on
master. - IAM Bob packaging release noise (
v2.1.6) from the overnight auto-release path: docs-only, not the story of the day.
Takeaway
Producer outages will happen. Rate limits, model downtime, auth glitches. The pipeline should treat them like any other dependency failure:
- Do not fail open (publish half-baked).
- Do not fail silent (alert + log).
- Do not single-home the produce step on one vendor when a second local producer can honor the same artifact contract.
- Keep land deterministic and dumb: it does not care which model wrote the markdown.
Tomorrow's 04:00 run can try Claude, fall back to Grok, and still land. That is the bar.
Related Posts
- Exit 0 Is Not Success: Automation Assurance That Verifies Outcomes
- Liveness Without Health Is Theater
- Empty Is Not Clean: Five Fail-Open Bugs in an AI Agent
Comments
No comments yet. Start the discussion.