Every session starts with one question: what’s the budget?
A Claude Code hook opens each session by asking how much to spend and how much to delegate to cheaper models, then makes Mullet’s jobs follow the answer.
After the bill, I wanted spending to be a decision I make at the start of a session, not something I find out about afterwards. So every Claude Code session I open now starts with one question.
The question
Mullet 2.2.0 adds a SessionStart hook called session-strategy. It’s opt-in:
mullet setup-claude --hooks session-strategy
When a session starts, the hook gives Claude a handful of local facts: how much of the daily and weekly envelope is left, how much of Claude’s own week is used, which preset is active and whether night mode is on. It also gives Claude a recommendation, and asks me two things in one short question: a budget in dollars for the session, and a delegation strategy.
Claude then records my answer:
mullet strategy set --budget 3 --delegation ladder
mullet strategy # what is set, when, and when it expires
mullet strategy clear
The three strategies
| Choice | What it means |
|---|---|
ladder |
Cheap and free models first, Claude last |
claude-only |
Claude Code alone, no cheaper workers |
off |
Nothing is delegated |
What follows from the answer
While the answer is fresh, Mullet acts on it. mullet job plan uses the budget as the job’s spending cap when I haven’t passed --max-spend. A claude-only choice plans a job with one Claude Code worker and no ladder. off makes job plan refuse, and turns delegation off the way MULLET_DELEGATION=off always did: the MCP delegation tools refuse and the delegation hooks go quiet.
Flags on the command line still win, and the daily and weekly envelope still applies when the job runs, so a generous answer can’t get past it. The answer lasts 12 hours by default, long enough for a working day and short enough that yesterday’s choice doesn’t linger.
How it recommends
The recommendation follows a few plain rules, in code you can read. If there is no room left under the envelope, it suggests claude-only, or off if Claude’s own week is also running high. Otherwise it suggests ladder, with a budget equal to the default job cap or the room left under the envelope, whichever is smaller. If a strategy is already fresh, the hook tells Claude not to ask again.
Turning it off
If you’d rather not be asked, set this in your config and the hook goes silent:
session:
ask_at_start: false
strategy_ttl_hours: 12 # how long an answer stays in force
What it doesn’t do
The budget is a cap on each job. Nothing adds up the spend of several jobs inside one session. The daily and weekly envelope is what limits the total, which is why the question comes alongside it and doesn’t replace it.
The code is at https://github.com/tomgould/mullet-public.
More on Mullet
-
Safe by default: a local AI server and a cheap model with a shell
A hardening pass on Mullet: a local server that a web page could not be stopped from calling, tools that fetched any address, and cheap models with…
-
Mullet is free for your company
Mullet’s licence used to say one developer, one running instance. It now allows free production use for any purpose, including inside a company…
-
We checked the bill, and our ledger was wrong by half
Mullet’s ledger said about $38 for a weekend of jobs. The providers billed about $50. How I found the gap, why one OpenRouter model was recorded at…