When Claude hits a weekly limit, your agent fleet still needs a third CLI
Claude and Codex both went dark. Here is the tertiary Gemini path I wired, with honest qa_reviewer stamps.
TL;DR
- A tertiary path is a boring ordered list: Claude, then Codex, then Gemini. Skip any provider whose ConfiguredCheck fails. Record which one actually ran.
- Gemini OAuth files under ~/.gemini looked fine. A headless call then failed with IneligibleTierError. The fix was GEMINI_API_KEY and Gemini CLI auth type gemini-api-key.
- The allowlist now accepts the engine that ran: codex for primary scheduled QA, claude for secondary, gemini for tertiary, think-heal for the same-day rescue path.
- A spoofed reviewer still gets 422. Say only: PONG returned PONG. That is the minimum proof the tertiary path is real.
This morning Claude returned a weekly limit. Codex failed next. The blog queue was empty. The heal report said RED: no post live today.
The 5090 rig and the vault scheduled tasks did not care. They still needed a path that could run without waiting for a quota reset. Here is what I shipped as the tertiary option, and what broke on the way there.
The real failure mode is not "no model." It is "no configured chain."
Most agent runners hardcode one CLI. When that CLI is out, the run ledger fills with short fail rows and the content uptime checker goes RED. Adding a second CLI helps. It does not help enough if both share the same class of outage (account spend, ChatGPT auth flake, provider incident).
A tertiary path is not clever architecture. It is a boring ordered list:
- Claude
- Codex
- Gemini
Skip any provider whose ConfiguredCheck fails. Record which one actually ran. Stop when one returns a real artifact.
Free Gemini OAuth is dead for headless agents
I already had Gemini CLI installed. The oauth cache under ~/.gemini looked fine. ConfiguredCheck returned true because the files existed.
A real headless call then failed with IneligibleTierError: Code Assist free tier for individuals is no longer supported on that client. The files lied. The runner thought Gemini was ready. It was not.
The fix was not Antigravity IDE. That is a desktop shell, not a scheduled stdin runner. The fix was an API key:
- Store
GEMINI_API_KEYin~/.claude/secrets/gemini_api_key.txt - Load it into the process env before ConfiguredCheck
- Set Gemini CLI auth type to
gemini-api-key(notoauth-personal) - Prefer a flash model for agent gates so a 503 high-demand spike can retry without burning a long Opus-class call
After that, Say only: PONG returned PONG. That is the minimum proof the tertiary path is real.
Honest provenance beats a green publish
The blog publisher used to require qa_reviewer: codex and the public API only allowed codex and think-heal. If Gemini reviewed a draft and we stamped codex to ship, the ledger would lie.
I will not do that. The allowlist now accepts the engine that ran:
codexfor primary scheduled QAclaudefor secondarygeminifor tertiarythink-healfor the same-day rescue path that wrote this post
The vault auto-publisher posts the draft's real qa_reviewer. The bmdpat /api/blog gate matches that allowlist. A spoofed reviewer still gets 422.
Local hardware is the other half of the story
While the cloud CLIs were dark, Ollama still had llama3.1:8b and a large Gemma build on this machine. That is not a drop-in replacement for a coding agent with vault write tools. It is a reminder that owned GPUs keep evaluating and serving when account quotas do not.
The 5090 Reports wedge stays the same: run real jobs on hardware you control, publish the artifact trail, and keep the agent fleet from depending on a single vendor session.
What to wire if you copy this
- One provider registry with ConfiguredCheck per CLI
- One chain function tests can force: Claude off, Codex off, Gemini on
- Blog QA Phase 3 that stamps
qa_reviewer: gemini - Server allowlist that accepts that stamp without inventing a new secret path
- LiteLLM stays optional dogfood on port 4000. Do not route production scheduled agents through it until keys and a migration plan exist.
Accompanying prompt
What the prompt does: turns a Claude/Codex outage into a checklist for a working tertiary Gemini CLI path with honest publish provenance.
Copy/paste this prompt:
Copy-ready prompt
Paste the exact block into your coding agent.
No article chrome, no footnotes, no formatting drift.
This prompt and every other one we publish live in the free prompt library.
Copy the block above.
Local models and cloud CLIs both need budgets. I built AgentGuard so a runaway agent stops instead of grinding tokens all night. Install with pip install agentguard47.
FAQ
Why is a third CLI required?
Most agent runners hardcode one CLI. A second CLI does not help enough if both share the same class of outage. Skip any provider whose ConfiguredCheck fails and stop when one returns a real artifact.
Why did Gemini OAuth fail for headless agents?
ConfiguredCheck returned true because oauth cache files existed. A real headless call failed with IneligibleTierError: Code Assist free tier for individuals is no longer supported on that client.
How do you stamp QA provenance honestly?
The vault auto-publisher posts the draft's real qa_reviewer. The public API allowlist accepts codex, claude, gemini, and think-heal. A spoofed reviewer still gets 422.
Get the Local AI Field Kit
Four copy-ready tools now, then one evidence-backed Local AI Lab Note on Friday when there is something worth sharing.
Try the free agent run check firstGet the requested artifact now, then at most one evidence-backed Local AI Lab Note on Friday when there is something worth sharing. One-click unsubscribe. No sponsored placements. Privacy.
Patrick Hughes
I build BMD and publish measured AI runs, failure reports, and reusable checks. Nashville, Tennessee.
More writing
- 8 min
I built a self-improving code model on one RTX 5090. Here is what actually worked.
Six pieces, one consumer GPU, no cloud. The honest results: some parts worked, some were flat, and one idea changed everything.
- 6 min
Build Local LLM Eval Data From Real Failures
I show how I turn failed local coding runs into replayable eval rows with the prompt, model output, tests, route, and verifier result intact.
- 5 min
A green security check read zero repositories
On 2026-10-06, a green security scan skipped five repos, twenty-one service jobs failed, and an automated repair loop saved my daily post.
- 5 min
The Merge Trap Opened Without Me While Leads Hit Zero
On 2026-10-04, two PRs broke a strict merge trap without my hands. Meanwhile, 1,835 human visitors generated zero paid installs and one bot lead.
- 5 min
PR 1887 merged clean after I claimed none could
I wrote that no agent pull request could merge in bmdpat. On 2026-09-30, PR #1887 merged clean with 173 lines. Here is how my sweep caught my mistake.