Day 69 of 74 · Tuesday · Learning

A usage limit is not an outage - why three retries hit the same wallConcept

On 9-11 plan-day retried three times against a Fable usage cap and lost the morning. Retry cures blips; a cap needs a different model. The nightly wrapper got that fix on 9-13; plan-day and the weekly review have not.

Catch-up progress
69/74
Why this matters to you

PDB/logs/plan-day.log, 9-11: attempt 1 ran from 06:17 to 06:39 and died on 'You've reached your Fable limit'. Attempts 2 and 3 died in two seconds each. The wrapper then published the data-only fallback brief (today.html was never stale - that part worked). The same cap killed the JobHunt content leg that morning after 78 minutes: no 9-11 briefing was ever produced.

A retry loop assumes the failure is transient: a dropped connection, a busy server, a DNS hiccup. Wait a bit, try again, the world has probably changed. run_plan_day.sh's run_with_retry does exactly this, and it was built for ConnectionRefused (August), where it earned its keep.

A usage limit is not transient. It is a state: 'this account has spent its Fable budget for this window'. The window clears on the clock, not on your next attempt, so attempts 2 and 3 are guaranteed to hit the same wall - which is why they died in two seconds. The honest response to a cap is not retry but degrade: run the same job on a model that still has budget. Claude Code has a flag for this in headless mode: --fallback-model, 'automatic fallback to specified model(s) when the default model is overloaded or not available', accepting a comma-separated chain.

Where this stands in your fleet: JobHunt/scripts/nightly_wrapper.sh was pinned on 9-13 (--model fable --fallback-model sonnet,haiku) as the 9-11 post-mortem. PDB/scripts/run_plan_day.sh and run_weekly_review.sh pass no --model at all, which means they inherit whatever the CLI default was last set to - a /model change in an interactive session silently re-aims the morning cron. One open question the nightly pin will answer: whether a usage-limit refusal counts as 'not available' to the fallback logic. The first capped night will tell; until then D2 on the 9-13 paper asks whether to pin the other two wrappers the same way.

Worked example

See which wrappers carry a model pin, then read the 9-11 failure with timestamps.

grep -n -- '--model\|--fallback-model' \
  /Users/tom/Claude/PDB/scripts/run_plan_day.sh \
  /Users/tom/Claude/PDB/scripts/run_weekly_review.sh \
  /Users/tom/Claude/JobHunt/scripts/nightly_wrapper.sh

grep -n 'Fable limit\|attempt [0-9]/3\|attempt [0-9] failed' \
  /Users/tom/Claude/PDB/logs/plan-day.log | tail -8
▶ Do it now
  1. Run the first grep. Note that plan-day and weekly-review have no --model line: they run on whatever the interactive default was.
  2. Run the second grep and time the gap between attempt 2 starting and attempt 2 failing. Anything under ten seconds means the error is a refusal, not a timeout.
  3. Open the 9-13 Weekly Review on the device, D2, and mark it. If you mark A, Claude adds the same two flags to both wrappers; nothing else in those files changes.

Gotchas

Go deeper: Claude Code CLI reference (flags incl. --fallback-model) · The 9-11 post-mortem comment in nightly_wrapper.sh
One-card takeaway

Retry for blips, fall back for caps - and a wrapper with no --model is running on whatever you last typed at the prompt.