From c82ba13caed7006d9e5e42f74ca31ef061485536 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Wed, 11 Nov 2026 16:36:34 -0800 Subject: [PATCH 1/2] feat(models): route XS writers to Claude Sonnet 5.5 high Co-Authored-By: Claude Opus 5.5 --- README.md | 4 ++-- quest/m0/routing-evidence/writer-ab.md | 6 ++---- quest/m1/model-check.md | 9 ++++++++- src/cli/models.ts | 9 +++++---- test/cli.test.ts | 4 ++-- 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 91c5a2b3..f4a905fa 100644 --- a/README.md +++ b/README.md @@ -1266,7 +1266,7 @@ the same for every repository unless its `AGENTS.md` names others: | Size | Writer | Fallback | |---|---|---| -| XS | Claude Code `claude-haiku-5-5` xhigh | Codex `gpt-6.1-sol` low | +| XS | Claude Code `claude-sonnet-5-5` high | Codex `gpt-6.1-sol` low | | S | Claude Code `claude-opus-5-5` low | Codex `gpt-6.1-sol` medium | | M | Claude Code `claude-opus-5-5` medium | Codex `gpt-6.1-sol` high | | L | Claude Code `claude-opus-5-5` high | Codex `gpt-6.1-sol` xhigh | @@ -1288,7 +1288,7 @@ XS, and `quest models` prints the entry to run: ```console $ quest models XS -claude claude-haiku-5-5 xhigh +claude claude-sonnet-5-5 high codex gpt-6.1-sol low $ quest models XS --writer claude-opus-5-5 diff --git a/quest/m0/routing-evidence/writer-ab.md b/quest/m0/routing-evidence/writer-ab.md index 90c09553..b03cc42f 100644 --- a/quest/m0/routing-evidence/writer-ab.md +++ b/quest/m0/routing-evidence/writer-ab.md @@ -4,7 +4,7 @@ `quest unblocked --json` routes each S quest to Opus low or medium, and each M quest to Opus medium or high, 50/50. The split is stable per quest, -and the review table stays fixed while it runs. Each `Implementer:` line +and the review efforts in `src/cli/models.ts` stay fixed while it runs. Each `Implementer:` line records its arm, iterates stay on the PR's arm, and `quest usage` reports cost, rounds, findings, hand-backs, and later culprits per arm. @@ -19,7 +19,7 @@ Decided 2026-11-11 (user, /quest-plan, - Rejected: XS Haiku xhigh against Opus low, since XS PRs rarely draw findings and the signal would be weak - Escapes are too rare to separate the arms, about 2% of PRs. Compare - first-round findings from the fixed review table, rounds, hand-backs, + first-round findings under the fixed review efforts, rounds, hand-backs, and cost, and report escapes alongside. Agent's choices, for the implementer to revisit: @@ -39,8 +39,6 @@ Agent's choices, for the implementer to revisit: ## Required -- [Review table](/quest/m0/routing-evidence/review-table.md) - the review - efforts held fixed while the arms run - [Review tallies](/quest/m0/routing-evidence/review-tallies.md) - counts the findings the arms are compared on - [usage through token-max](/quest/m0/routing-evidence/usage-token-max.md) - diff --git a/quest/m1/model-check.md b/quest/m1/model-check.md index 958fbd61..2fe21dfd 100644 --- a/quest/m1/model-check.md +++ b/quest/m1/model-check.md @@ -86,13 +86,20 @@ checkpoints and outages to count by hand: cell with again: - Haiku 5.5: high 30, $0.0034; xhigh 34.6, $0.0053. - Sonnet 5.5: medium 30.7, $0.012; below the frontier at every effort, - so rejected for XS though Anthropic's + so rejected for XS then, though Anthropic's [model guide](https://claude.dev/blog/which-claude-model-should-you-build-with/) favors it for scoped coding. - Opus 5.5: low 34.7, $0.015; medium 48, $0.037; high 51.7, $0.052; xhigh 57.3, $0.092; max 58.9, $0.15. - gpt-6.1-sol: low 34.8, $0.0094; medium 46.3, $0.021; high 50.3, $0.034; xhigh 52.5, $0.045. + - Changed again (maintainer, 2026-11-11): XS writes on Sonnet high + instead of Haiku xhigh, since two Haiku XS agents in a row on + [moq-dev/quest#643](https://github.com/moq-dev/quest/pull/643) died + refilling context right after compaction: Haiku 5.5 bills 5x past 100k + input, so its auto-compact window is capped there, barely above an + agent's 40-60k fixed load. Sonnet 5.5's price is flat over its 1M + window. Tally the XS Sonnet high cell fresh. - Fable 5.2: medium 56, $3.8; max 64.6, $26.5. Rejected for XL, which stays on Opus xhigh, on the frontier; zero-data-retention organizations may also be refused Fable. diff --git a/src/cli/models.ts b/src/cli/models.ts index 0c21b95d..cea0c08b 100644 --- a/src/cli/models.ts +++ b/src/cli/models.ts @@ -18,16 +18,17 @@ export const DEFAULT_SIZE: Size = "M"; const sol = (effort: string): Model => ({ harness: "codex", model: "gpt-6.1-sol", effort }); const opus = (effort: string): Model => ({ harness: "claude", model: "claude-opus-5-5", effort }); -const haiku = (effort: string): Model => ({ harness: "claude", model: "claude-haiku-5-5", effort }); +const sonnet = (effort: string): Model => ({ harness: "claude", model: "claude-sonnet-5-5", effort }); /** * Each size's writers, ranked: a spawn starts the quest on the first that can * run, falling through only while nothing is written, since the model that - * writes a PR runs all its iterates. XS runs Haiku at xhigh, which scores about - * as Opus low does for a third of its subscription cost per task. + * writes a PR runs all its iterates. XS runs Sonnet rather than the cheaper + * Haiku, whose surcharge past 100k input tokens forces a compaction window + * barely above an agent's fixed load of prompt, context, and skill. */ export const WRITERS: Record = { - XS: [haiku("xhigh"), sol("low")], + XS: [sonnet("high"), sol("low")], S: [opus("low"), sol("medium")], M: [opus("medium"), sol("high")], L: [opus("high"), sol("xhigh")], diff --git a/test/cli.test.ts b/test/cli.test.ts index d00af519..1be00ef2 100644 --- a/test/cli.test.ts +++ b/test/cli.test.ts @@ -186,7 +186,7 @@ test("models ranks a size's writers, or the one entry that runs a PR's writer", const tree = Tree.baseline(); expect(tree.run("models", "XS")).toEqual({ code: 0, - stdout: "claude\tclaude-haiku-5-5\txhigh\ncodex\tgpt-6.1-sol\tlow\n", + stdout: "claude\tclaude-sonnet-5-5\thigh\ncodex\tgpt-6.1-sol\tlow\n", stderr: "", }); expect(JSON.parse(tree.run("models", "XL", "--json").stdout)).toEqual([ @@ -196,7 +196,7 @@ test("models ranks a size's writers, or the one entry that runs a PR's writer", expect(writer("M", "gpt-6.1-sol")).toBe("codex\tgpt-6.1-sol\thigh\n"); // A writer its size does not list runs at the nearest size that lists it. expect(writer("XS", "claude-opus-5-5")).toBe("claude\tclaude-opus-5-5\tlow\n"); - expect(writer("L", "claude-haiku-5-5")).toBe("claude\tclaude-haiku-5-5\txhigh\n"); + expect(writer("L", "claude-sonnet-5-5")).toBe("claude\tclaude-sonnet-5-5\thigh\n"); expect(writer("XL", "gpt-6.1-sol")).toBe("codex\tgpt-6.1-sol\txhigh\n"); const unknown = tree.run("models", "S", "--writer", "unknown"); expect(unknown.code).toBe(2); From e80bee797079f1dee6b7f4d8d3a3e69cbe9c33bf Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Wed, 11 Nov 2026 16:48:24 -0800 Subject: [PATCH 2/2] docs(models): place the XS change after the Nov 9 entries; name the cap as a setting Co-Authored-By: Claude Opus 5.5 --- quest/m1/model-check.md | 19 ++++++++++++------- src/cli/models.ts | 5 +++-- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/quest/m1/model-check.md b/quest/m1/model-check.md index 2fe21dfd..0b0b1ec5 100644 --- a/quest/m1/model-check.md +++ b/quest/m1/model-check.md @@ -93,19 +93,24 @@ checkpoints and outages to count by hand: xhigh 57.3, $0.092; max 58.9, $0.15. - gpt-6.1-sol: low 34.8, $0.0094; medium 46.3, $0.021; high 50.3, $0.034; xhigh 52.5, $0.045. - - Changed again (maintainer, 2026-11-11): XS writes on Sonnet high - instead of Haiku xhigh, since two Haiku XS agents in a row on - [moq-dev/quest#643](https://github.com/moq-dev/quest/pull/643) died - refilling context right after compaction: Haiku 5.5 bills 5x past 100k - input, so its auto-compact window is capped there, barely above an - agent's 40-60k fixed load. Sonnet 5.5's price is flat over its 1M - window. Tally the XS Sonnet high cell fresh. - Fable 5.2: medium 56, $3.8; max 64.6, $26.5. Rejected for XL, which stays on Opus xhigh, on the frontier; zero-data-retention organizations may also be refused Fable. - S looks lopsided: Opus low scores well below its Sol medium fallback (34.7 against 46.3) for $0.006 less a task. Check its tallies before moving it. + - Changed again (maintainer, 2026-11-11): XS writes on Sonnet high + instead of Haiku xhigh, since two Haiku XS agents in a row on + [moq-dev/quest#643](https://github.com/moq-dev/quest/pull/643) died + refilling context right after compaction: Haiku 5.5 bills 5x past 100k + input, so the maintainer caps its auto-compact window there, barely above an + agent's 40-60k fixed load. Sonnet 5.5's price is flat over its 1M + window. mypriors has no Sonnet high row, so tally this cell rather than + compare it there. Anthropic's + [cost guide](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence) + puts Sonnet 5.5 high level with Opus 5.5 low (87.6% against 87.4%) at + about the same cost per solved task, and medium about 7 points below + high on its SWE-bench Pro subset. - Compare both tables' models (in `src/cli/models.ts`) with each vendor's current models: the newest model of each tier the tables pin. Bump any that are stale, and check that both CLIs accept the new ids and the pinned efforts. `--deep` and its strongest-model diff --git a/src/cli/models.ts b/src/cli/models.ts index cea0c08b..3b1f240c 100644 --- a/src/cli/models.ts +++ b/src/cli/models.ts @@ -24,8 +24,9 @@ const sonnet = (effort: string): Model => ({ harness: "claude", model: "claude-s * Each size's writers, ranked: a spawn starts the quest on the first that can * run, falling through only while nothing is written, since the model that * writes a PR runs all its iterates. XS runs Sonnet rather than the cheaper - * Haiku, whose surcharge past 100k input tokens forces a compaction window - * barely above an agent's fixed load of prompt, context, and skill. + * Haiku, whose surcharge past 100k input tokens leads users to cap its + * compaction window there, barely above an agent's fixed load of prompt, + * context, and skill. */ export const WRITERS: Record = { XS: [sonnet("high"), sol("low")],