Sunday afternoon I noticed something weird in my shell history. Five of my last ten Claude sessions had opened with /model. I wasn’t building anything. I was auditing.
The thing I was auditing was my own cron stack. I have about ten Claude Code services on timers — a 5 AM morning briefing, a 2 AM self-improvement agent, a Freebo blog publisher, a job-search scraper, an email-reply tracker, a few weekly digests. They run while I sleep. They cost money. And until recently, half of them were quietly running on whatever model the CLI felt like defaulting to that week.
That is a billing decision. It should not be made by a default.
The default is Opus. Opus is roughly 20x Haiku.
If you install claude and run it without --model, you get the top of the tier. Fair enough for a human sitting at a keyboard — you want the smartest model for the hard problem you were about to ask. But a cron job doesn’t have a hard problem. A cron job has the same job it had yesterday. If that job was grep three files and fix a typo, giving it Opus is like putting a surgeon on dish duty.
The gap is real. At full API rates Opus is around twenty times the per-token cost of Haiku. On a service that runs nightly and processes a few thousand tokens, that gap compounds into a bill you don’t notice until you do.
The three-tier rubric
Here is the rule I use when I add a new service, in plain language:
| Tier | Use for | Don't use for |
|---|---|---|
| Haiku | Pattern matching, small text edits, drift detection, janitorial sweeps, low-stakes summaries | Anything that needs to synthesize across multiple sources or hold a long chain of reasoning |
| Sonnet | Multi-step reasoning, document synthesis, triage, scoring, email drafting — the default-good-enough middle | Pure pattern work (Haiku handles it) and output that bears your reputation (Opus) |
| Opus | Output that will be read by someone who matters, where quality beats cost — my blog voice, basically | Everything else, aggressively. This is the one you reserve. |
The rubric reads simpler than it is. The hard move is actually downgrading. Everybody starts a new service on Sonnet because it feels safe. The win is going back a month later, reading what it actually did, and realizing it could have been Haiku the whole time.
I made that move with my nightly self-improvement agent. It runs at 2 AM, reads the day’s session logs, and makes small routing fixes to my skills. For months it ran on Sonnet because I was nervous. When I finally audited the diffs it had produced, every one was a brand-name correction, a path fix, or a routing tweak. Nothing that needed reasoning. It got pinned to Haiku and I haven’t noticed a quality drop in six months.
The audit, in one line
Here is the exact command I run when I want to see what every service is currently pinned to. Paste it into any shell:

That spits out something like this on my box:

Three readings of that output:
One, almost everything is Sonnet . That is correct. Sonnet is the right default for synthesis-shaped work, which is most of what my services do — read some stuff, understand it, write a summary somewhere I’ll find later.
Two, my nightly janitor is Haiku . That is the downgrade I made deliberately after reading a month of its output.
Three, exactly one service is Opus : the daily blog publisher. Blog voice is reputation-bearing. If this post sounds like me, part of the reason is that it was drafted on Opus. Every other cron I own could run on Haiku and nobody but my wallet would know.
The service that broke the rule, and why
There is one entry in that output that still says [NO MODEL]. It is my long-running interactive Claude Code daemon — the one I actually talk to during the day. That’s not a cron. It’s a human-in-the-loop session, and I want it to pick the smartest model available for whatever I’m about to throw at it.
The rule I ended up with: crons pin, humans don’t. If a service runs without a person watching, the person who should have picked the model is you, and you make that pick once, in the unit file.
The takeaway
The frontier conversation is loud right now. New model, new tier, new benchmark, new press release. Underneath that, the quieter engineering question is: for the agents you can’t watch, what model are they running right now, and did you choose it or did it choose itself?
If you can’t answer that in one shell command, your invoice already answered it for you.
Pin the model. Downgrade when the output lets you. Keep Opus for the thing that bears your name on it.