{
    "type": "article",
    "title": "Every session starts with one question: what’s the budget?",
    "canonical": "https://www.dealmobile.co.uk/writing/every-session-starts-with-one-question",
    "path": "/writing/every-session-starts-with-one-question",
    "url": "https://www.dealmobile.co.uk/writing/every-session-starts-with-one-question",
    "markdown": "https://www.dealmobile.co.uk/writing/every-session-starts-with-one-question.md",
    "json": "https://www.dealmobile.co.uk/writing/every-session-starts-with-one-question.json",
    "summary": "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.",
    "published": "2026-10-25T17:00:00+00:00",
    "modified": "2026-10-25T19:08:26+00:00",
    "image": {
        "url": "https://www.dealmobile.co.uk/sites/default/files/content/images/posts/every-session-starts-with-one-question/hero.png",
        "alt": "The commands that record a session’s choice: mullet strategy set with a budget of 3 dollars and the ladder, then the three delegation choices. Ladder tries cheap and free models first and Claude last. Claude-only runs one Claude Code worker. Off delegates nothing."
    },
    "fields": {
        "image_light": null
    },
    "tags": [
        {
            "name": "Python",
            "url": "https://www.dealmobile.co.uk/writing/tag/python",
            "json": "https://www.dealmobile.co.uk/writing/tag/python.json"
        },
        {
            "name": "AI",
            "url": "https://www.dealmobile.co.uk/writing/tag/ai",
            "json": "https://www.dealmobile.co.uk/writing/tag/ai.json"
        },
        {
            "name": "Mullet",
            "url": "https://www.dealmobile.co.uk/writing/tag/mullet",
            "json": "https://www.dealmobile.co.uk/writing/tag/mullet.json"
        }
    ],
    "projects": [
        {
            "name": "Mullet",
            "url": "https://www.dealmobile.co.uk/projects/mullet",
            "json": "https://www.dealmobile.co.uk/projects/mullet.json"
        }
    ],
    "body": {
        "html": "<p>After <a href=\"/writing/we-checked-the-bill-and-our-ledger-was-wrong-by-half\">the bill</a>, 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.</p>\n<h2 id=\"the-question\">The question</h2>\n<p>Mullet 2.2.0 adds a <code>SessionStart</code> hook called <code>session-strategy</code>. It’s opt-in:</p>\n<pre><code class=\"language-bash\">mullet setup-claude --hooks session-strategy\n</code></pre>\n<p>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.</p>\n<p>Claude then records my answer:</p>\n<pre><code class=\"language-bash\">mullet strategy set --budget 3 --delegation ladder\nmullet strategy          # what is set, when, and when it expires\nmullet strategy clear\n</code></pre>\n<h2 id=\"the-three-strategies\">The three strategies</h2>\n<table>\n<thead>\n<tr>\n<th align=\"left\">Choice</th>\n<th align=\"left\">What it means</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td align=\"left\"><code>ladder</code></td>\n<td align=\"left\">Cheap and free models first, Claude last</td>\n</tr>\n<tr>\n<td align=\"left\"><code>claude-only</code></td>\n<td align=\"left\">Claude Code alone, no cheaper workers</td>\n</tr>\n<tr>\n<td align=\"left\"><code>off</code></td>\n<td align=\"left\">Nothing is delegated</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"what-follows-from-the-answer\">What follows from the answer</h2>\n<p>While the answer is fresh, Mullet acts on it. <code>mullet job plan</code> uses the budget as the job’s spending cap when I haven’t passed <code>--max-spend</code>. A <code>claude-only</code> choice plans a job with one Claude Code worker and no ladder. <code>off</code> makes <code>job plan</code> refuse, and turns delegation off the way <code>MULLET_DELEGATION=off</code> always did: the MCP delegation tools refuse and the delegation hooks go quiet.</p>\n<p>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.</p>\n<h2 id=\"how-it-recommends\">How it recommends</h2>\n<p>The recommendation follows a few plain rules, in code you can read. If there is no room left under the envelope, it suggests <code>claude-only</code>, or <code>off</code> if Claude’s own week is also running high. Otherwise it suggests <code>ladder</code>, 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.</p>\n<h2 id=\"turning-it-off\">Turning it off</h2>\n<p>If you’d rather not be asked, set this in your config and the hook goes silent:</p>\n<pre><code class=\"language-yaml\">session:\n  ask_at_start: false\n  strategy_ttl_hours: 12     # how long an answer stays in force\n</code></pre>\n<h2 id=\"what-it-doesnt-do\">What it doesn’t do</h2>\n<p>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.</p>\n<p>The code is at <a href=\"https://github.com/tomgould/mullet-public\">https://github.com/tomgould/mullet-public</a>.</p>"
    },
    "markdown_text": "---\ntitle: 'Every session starts with one question: what’s the budget?'\ncanonical: 'https://www.dealmobile.co.uk/writing/every-session-starts-with-one-question'\nurl: 'https://www.dealmobile.co.uk/writing/every-session-starts-with-one-question'\ntype: Post\npublished: '2026-10-25'\nsummary: '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.'\n---\n\n# Every session starts with one question: what’s the budget?\n\nPublished 2026-10-25\n\n![The commands that record a session’s choice: mullet strategy set with a budget of 3 dollars and the ladder, then the three delegation choices. Ladder tries cheap and free models first and Claude last. Claude-only runs one Claude Code worker. Off delegates nothing.](https://www.dealmobile.co.uk/sites/default/files/styles/almanac_shot_md/public/content/images/posts/every-session-starts-with-one-question/hero.png.webp?itok=83LmxKH-)\n\nAfter [the bill](https://www.dealmobile.co.uk/writing/we-checked-the-bill-and-our-ledger-was-wrong-by-half.md), 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.\n\n## The question\n\nMullet 2.2.0 adds a `SessionStart` hook called `session-strategy`. It’s opt-in:\n\n```bash\nmullet setup-claude --hooks session-strategy\n\n```\n\nWhen 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.\n\nClaude then records my answer:\n\n```bash\nmullet strategy set --budget 3 --delegation ladder\nmullet strategy          # what is set, when, and when it expires\nmullet strategy clear\n\n```\n\n## The three strategies\n\n| Choice | What it means |\n|:--|:--|\n| `ladder` | Cheap and free models first, Claude last |\n| `claude-only` | Claude Code alone, no cheaper workers |\n| `off` | Nothing is delegated |\n\n## What follows from the answer\n\nWhile 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.\n\nFlags 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.\n\n## How it recommends\n\nThe 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.\n\n## Turning it off\n\nIf you’d rather not be asked, set this in your config and the hook goes silent:\n\n```yaml\nsession:\n  ask_at_start: false\n  strategy_ttl_hours: 12     # how long an answer stays in force\n\n```\n\n## What it doesn’t do\n\nThe 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.\n\nThe code is at <https://github.com/tomgould/mullet-public>.\n\n- **Projects:** [Mullet](https://www.dealmobile.co.uk/projects/mullet.md)\n- **Tags:** [Python](https://www.dealmobile.co.uk/writing/tag/python.md), [AI](https://www.dealmobile.co.uk/writing/tag/ai.md), [Mullet](https://www.dealmobile.co.uk/writing/tag/mullet.md)\n\n---\n\nIndex of this site: [llms.txt](https://www.dealmobile.co.uk/llms.txt)\n"
}