From ee167102566f8cab2b8fe537e1a78d07b38d242e Mon Sep 17 00:00:00 2001 From: Inakitajes Date: Thu, 17 Sep 2026 12:45:23 +0100 Subject: [PATCH] feat(pipeline): upgrade built-ins to DeepSeek V4.1 Flash Replace the OpenRouter deepseek-v4-flash-0731 model with deepseek-v4.1-flash across the built-in pipelines, the branch-naming default, docs, and tests. --- docs/configuration.md | 2 +- docs/pipelines.md | 12 +++---- docs/worktrees.md | 2 +- src/config-tui.ts | 2 +- src/config.ts | 4 +-- src/pipeline.ts | 14 ++++---- src/worktree.ts | 2 +- test/agents.test.ts | 4 +-- test/attach.test.ts | 6 ++-- test/config.test.ts | 2 +- test/coordinate.test.ts | 6 ++-- test/launch-tui.test.ts | 10 +++--- test/pipeline.test.ts | 58 +++++++++++++++++----------------- test/run-plan.test.ts | 4 +-- test/worktree-extended.test.ts | 2 +- 15 files changed, 65 insertions(+), 65 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index 784b308..8821872 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -24,7 +24,7 @@ defaults: baseRef: main # optional; auto-detected when unset (origin default branch, else main/master/develop/trunk, else current branch) pipeline: quick # pipeline used when -p/--pipeline is not given autoAcceptJudgeModel: anthropic/claude-haiku-4-5 # model for smart auto-accept (--smart); defaults to the run's model - branchNameModel: openrouter/deepseek/deepseek-v4-flash-0731 # proposes worktree branch names (may look up referenced issues); you confirm the name + branchNameModel: openrouter/deepseek/deepseek-v4.1-flash # proposes worktree branch names (may look up referenced issues); you confirm the name commitMessageModel: openai/gpt-5.6-luna # writes the conventional commit message for automatic run compaction and close's squash-merge commit worktree: true # force a new branch + worktree for every run; false always runs in the current tree. Unset decides per branch (isolate on a trunk, run in place on a branch) worktreeLocation: ~/dev/worktrees/{repo}/{branch} # where isolated worktrees are created ({repo}/{branch} placeholders, ~ = home; the branch slug is appended when {branch} is missing). A marker line in the repo's AGENTS.md/README.md outranks this; default ~/.convoy/worktrees diff --git a/docs/pipelines.md b/docs/pipelines.md index e127d1a..66812bf 100644 --- a/docs/pipelines.md +++ b/docs/pipelines.md @@ -17,18 +17,18 @@ PRD → implementer → patterns → security → design → tests → measure └ fix┘ ``` -All model IDs below are public provider IDs. The former local NAN models use their OpenRouter equivalents: `openrouter/deepseek/deepseek-v4-flash-0731#high` and `openrouter/z-ai/glm-5.3-flash#high`. +All model IDs below are public provider IDs. The former local NAN models use their OpenRouter equivalents: `openrouter/deepseek/deepseek-v4.1-flash#high` and `openrouter/z-ai/glm-5.3-flash#high`. | Step | Model | Advisor | |---|---|---| -| `implementer` | DeepSeek V4 Flash 0731 · high | GPT 6 Astra · xhigh | -| `patterns` | DeepSeek V4 Flash 0731 · high | GLM 5.3 · high | +| `implementer` | DeepSeek V4.1 Flash · high | GPT 6 Astra · xhigh | +| `patterns` | DeepSeek V4.1 Flash · high | GLM 5.3 · high | | `security` | GLM 5.3 Flash · high | GLM 5.3 · high | | `design` | GLM 5.3 Flash · high | GPT 6 Astra · xhigh | -| `tests` | DeepSeek V4 Flash 0731 · high | GLM 5.3 · high | +| `tests` | DeepSeek V4.1 Flash · high | GLM 5.3 · high | | Goal: independent scorers | Grok 4.6 · high + GLM 5.3 · high | — | | Goal: verified consensus | GPT 5.6 Sol · xhigh | — | -| Goal: targeted fixes | DeepSeek V4 Flash 0731 · high | GPT 6 Astra · xhigh | +| Goal: targeted fixes | DeepSeek V4.1 Flash · high | GPT 6 Astra · xhigh | The goal measures first, then fixes only reported gaps. It stops at **90/100**, after **five fix rounds**, or on the configured plateau limit (three rounds by default). A run that hits a limit can finish below the target; inspect its final score. Scorers read the original requirements and current diff without previous reports; the consensus reads only the current scorer reports and verifies their claims. @@ -41,7 +41,7 @@ Select one with `-p/--pipeline`; no project config is needed. `full-cycle` is th | Pipeline | Changes code? | What it does | |---|---|---| | `full-cycle` | yes | Implement, audit, polish and test with the models above, then independently score and fix gaps up to five times to reach 90/100. | -| `implement` | yes | DeepSeek V4 Flash implements with Astra xhigh advice. Patterns and tests use DeepSeek; security and design use GLM Flash. Those later steps run unadvised. Closes with a read-only DeepSeek recap at `reports/run-report.md`; no scoring loop. | +| `implement` | yes | DeepSeek V4.1 Flash implements with Astra xhigh advice. Patterns and tests use DeepSeek; security and design use GLM Flash. Those later steps run unadvised. Closes with a read-only DeepSeek recap at `reports/run-report.md`; no scoring loop. | | `ship` | yes | Sync with the base; scope and review the diff across DeepSeek and GLM Flash; report, adversarially triage and fix accepted findings with Astra advice; recap; then score with Grok and GLM, reconcile on GLM and fix gaps up to five times to reach 90/100. | | `review` | no | The report-only review: DeepSeek scopes and reports; clean-code, security and bug audits each run on DeepSeek and GLM Flash. Grok and GLM score independently, then GLM verifies the consensus. Produces findings and a quality score. | | `fixer` | yes | Prove supplied findings with regression tests, apply targeted fixes, then independently rerun the checks. Terra xhigh handles all three phases; Astra xhigh advises reproduction and fixes. | diff --git a/docs/worktrees.md b/docs/worktrees.md index 713dbe9..763f6ed 100644 --- a/docs/worktrees.md +++ b/docs/worktrees.md @@ -110,7 +110,7 @@ An isolated run gets a new branch checked out in a dedicated worktree, leaving y The branch is always agreed with you first, in a **Branch** step between Options and Review: -- An `Intended Branch Name` (or `git checkout -b …`) in the prompt is used as-is — the model is not asked to reinvent it. A short prompt that is just a path to a plan file is read first, so pasting `docs/plans/foo.md` still picks up the name inside. Otherwise `defaults.branchNameModel` (DeepSeek V4 Flash 0731 via OpenRouter by default) reads the prompt and proposes a conventional name — `feat/runtime-guard-limits`, `fix/login-redirect` — always in English, even when the prompt is not, keeping the document's own words rather than paraphrasing them. Prompts that only reference an issue (`#123`, `DEV-1339`, a URL) are looked up first, so the branch is named after what the issue is about. +- An `Intended Branch Name` (or `git checkout -b …`) in the prompt is used as-is — the model is not asked to reinvent it. A short prompt that is just a path to a plan file is read first, so pasting `docs/plans/foo.md` still picks up the name inside. Otherwise `defaults.branchNameModel` (DeepSeek V4.1 Flash via OpenRouter by default) reads the prompt and proposes a conventional name — `feat/runtime-guard-limits`, `fix/login-redirect` — always in English, even when the prompt is not, keeping the document's own words rather than paraphrasing them. Prompts that only reference an issue (`#123`, `DEV-1339`, a URL) are looked up first, so the branch is named after what the issue is about. - The proposed name is shown in an editable field together with the worktree path it would take. Enter accepts it and moves on to Review; nothing is created until you confirm the run there. - `tab` moves to the **hint** box: describe how you want it named ("name it after the budget limits") and press Enter or `ctrl+R` to re-name it. This is also what you get when the prompt is too thin to name anything, or when the naming model is unavailable — the step still opens, with a name derived from the prompt, ready to be edited. - Names already taken by a branch or an existing worktree are suffixed (`-2`, `-3`) instead of failing `git worktree add` after the run has been confirmed. diff --git a/src/config-tui.ts b/src/config-tui.ts index f4b891d..a23074c 100644 --- a/src/config-tui.ts +++ b/src/config-tui.ts @@ -2133,7 +2133,7 @@ export function describeDefault(key: keyof ConvoyDefaults): string { case "autoAcceptJudgeModel": return "Model the smart auto-accept judge uses (falls back to the run's model)." case "branchNameModel": - return "Model that names worktree branches (default: openrouter/deepseek/deepseek-v4-flash-0731)." + return "Model that names worktree branches (default: openrouter/deepseek/deepseek-v4.1-flash)." case "commitMessageModel": return "Model that writes the conventional commit message for automatic run compaction and close (default: anthropic/claude-haiku-4-5)." case "worktree": diff --git a/src/config.ts b/src/config.ts index 14696d7..b53653e 100644 --- a/src/config.ts +++ b/src/config.ts @@ -287,7 +287,7 @@ defaults: # maxConcurrentAgents: 30 # optional: cap agents running at once within a parallel group # baseRef: main # optional: when unset, convoy auto-detects (origin default branch, else main/master/develop/trunk, else current branch) # pipeline: full-cycle - # branchNameModel: openrouter/deepseek/deepseek-v4-flash-0731 # optional: model that names worktree branches + # branchNameModel: openrouter/deepseek/deepseek-v4.1-flash # optional: model that names worktree branches # commitMessageModel: openai/gpt-5.6-luna # optional: model that writes the conventional commit message for automatic run compaction and close's squash-merge commit # worktree: true # optional: force a fresh branch + worktree for every run; false always runs in the current tree. Unset decides per branch: isolate on a trunk (main/master/develop/trunk or the detected base), run in place on any other branch # worktreeLocation: ~/dev/worktrees/{repo}/{branch} # optional: where isolated worktrees are created ({repo}/{branch} placeholders, ~ = home; the branch slug is appended when {branch} is missing). A marker in the repo's AGENTS.md/README.md outranks this; unusable locations fall back to ~/.convoy/worktrees @@ -347,7 +347,7 @@ defaults: # The \`implement\` pipeline is inlined below as an editable starting point; redefining a name here overrides the built-in. pipelines: implement: - description: Advised implementation on DeepSeek V4 Flash consulting Astra 6, then pattern/security audits, design polish, tests, and a one-page run recap + description: Advised implementation on DeepSeek V4.1 Flash consulting Astra 6, then pattern/security audits, design polish, tests, and a one-page run recap # defaultPrompt and suggestedPrompts are optional. A defaultPrompt is used # when the pipeline runs without an explicit prompt — the launcher prefills # its field and \`convoy -p \` falls back to it — and the diff --git a/src/pipeline.ts b/src/pipeline.ts index 5f2ac8b..52acb71 100644 --- a/src/pipeline.ts +++ b/src/pipeline.ts @@ -15,9 +15,9 @@ const opusViaOpenRouter = "openrouter/anthropic/claude-opus-5" /** Grok 4.6 high: the review and ship scoring, plus one hunter audit track. */ const grokModel = "openrouter/x-ai/grok-4.6#high" const kimiModel = "openrouter/moonshotai/kimi-k3" -/** DeepSeek V4 Flash 0731 on OpenRouter: the writer for `implement`, review's report, and the goal fixers. */ -const deepseekModel = "openrouter/deepseek/deepseek-v4-flash-0731" -/** DeepSeek V4 Flash on OpenRouter with reasoning raised: used for writing, flash audits and run recaps. */ +/** DeepSeek V4.1 Flash on OpenRouter: the writer for `implement`, review's report, and the goal fixers. */ +const deepseekModel = "openrouter/deepseek/deepseek-v4.1-flash" +/** DeepSeek V4.1 Flash on OpenRouter with reasoning raised: used for writing, flash audits and run recaps. */ const deepseekHighModel = `${deepseekModel}#high` /** GPT 5.6 Sol: the consensus reporter for full-cycle and the hunter pipelines at xhigh. */ const solModel = "openai/gpt-5.6-sol" @@ -462,7 +462,7 @@ export const builtInPipelines: Record = { // Implementation follows the same model choices as full-cycle, but closes // with a recap instead of running the quality loop. Only the writer is advised. implement: { - description: "Advised implementation on DeepSeek V4 Flash consulting Astra 6, then pattern/security audits, design polish, tests, and a one-page run recap", + description: "Advised implementation on DeepSeek V4.1 Flash consulting Astra 6, then pattern/security audits, design polish, tests, and a one-page run recap", steps: [ { agent: "implementer", model: defaultImplementerModel, advisor: defaultImplementAdvisorModel, reports: "none" }, { agent: "patterns", model: defaultImplementAuditModel, advisor: false }, @@ -475,7 +475,7 @@ export const builtInPipelines: Record = { // The default combines implementation with a terminal, independently scored goal loop. "full-cycle": { description: - "Implement with DeepSeek V4 Flash and GLM 5.3 Flash, advised by Astra 6 and GLM 5.3, then measure with Grok and GLM and a verified Sol consensus; fix gaps up to five times to reach 90/100.", + "Implement with DeepSeek V4.1 Flash and GLM 5.3 Flash, advised by Astra 6 and GLM 5.3, then measure with Grok and GLM and a verified Sol consensus; fix gaps up to five times to reach 90/100.", steps: [ { agent: "implementer", model: deepseekHighModel, advisor: astraXhighModel, reports: "none" }, { agent: "patterns", model: deepseekHighModel, advisor: glm53HighModel }, @@ -489,7 +489,7 @@ export const builtInPipelines: Record = { improve: { briefStep: "fix", steps: [ - // The directed fixer, on DeepSeek V4 Flash advised by Astra 6 (extra + // The directed fixer, on DeepSeek V4.1 Flash advised by Astra 6 (extra // high). It alone receives the score brief (by step name). diff: // true is load-bearing: as the fragment's first step it would // otherwise default to no diff. @@ -520,7 +520,7 @@ export const builtInPipelines: Record = { // Report-only audits on two flash models, followed by independent scoring. review: { description: - "Report-only PR review on ultra-cheap models: scope, parallel audits (DeepSeek V4 Flash + GLM 5.3 Flash) and report on flash models; the scoring uses GLM 5.3 high + Grok 4.6 high and the score consensus stays on GLM 5.3 high. Makes no changes.", + "Report-only PR review on ultra-cheap models: scope, parallel audits (DeepSeek V4.1 Flash + GLM 5.3 Flash) and report on flash models; the scoring uses GLM 5.3 high + Grok 4.6 high and the score consensus stays on GLM 5.3 high. Makes no changes.", defaultPrompt: "Review the current branch against its base and report prioritized findings with a verified quality score.", suggestedPrompts: ["Review the open PR for this branch", "Review only the last commit's diff"], steps: [ diff --git a/src/worktree.ts b/src/worktree.ts index f33afc4..93f1b99 100644 --- a/src/worktree.ts +++ b/src/worktree.ts @@ -49,7 +49,7 @@ export type BranchNameProposal = { } /** Cheap, fast model used to synthesize a branch name from the prompt. */ -export const defaultBranchNameModel = "openrouter/deepseek/deepseek-v4-flash-0731" +export const defaultBranchNameModel = "openrouter/deepseek/deepseek-v4.1-flash" /** Registered so the namer replaces opencode's default coding agent instead of merely appending to it. */ const namerAgentName = "convoy-branch-namer" diff --git a/test/agents.test.ts b/test/agents.test.ts index 2f37853..d93b9ed 100644 --- a/test/agents.test.ts +++ b/test/agents.test.ts @@ -277,12 +277,12 @@ describe("throughput routing in the opencode config", () => { ], undefined, { throughputModels: [ { providerID: "openrouter", modelID: "z-ai/glm-5.3" }, - { providerID: "openrouter", modelID: "deepseek/deepseek-v4-flash-0731" }, + { providerID: "openrouter", modelID: "deepseek/deepseek-v4.1-flash" }, ], }) expect(config.provider?.openrouter?.models?.["z-ai/glm-5.3"]).toEqual({ options: { provider: { sort: "throughput" } } }) - expect(config.provider?.openrouter?.models?.["deepseek/deepseek-v4-flash-0731"]).toEqual({ options: { provider: { sort: "throughput" } } }) + expect(config.provider?.openrouter?.models?.["deepseek/deepseek-v4.1-flash"]).toEqual({ options: { provider: { sort: "throughput" } } }) // Options-only entries: no name or limit is invented over the catalog's real model. expect(config.provider?.openrouter?.models?.["z-ai/glm-5.3"]?.name).toBeUndefined() expect(config.provider?.openrouter?.models?.["z-ai/glm-5.3"]?.limit).toBeUndefined() diff --git a/test/attach.test.ts b/test/attach.test.ts index 3bc31fb..c448a2c 100644 --- a/test/attach.test.ts +++ b/test/attach.test.ts @@ -167,11 +167,11 @@ describe("reconstructedPhases", () => { "pre-hook-1", "sync", "scope", - "clean-code__openrouter-deepseek-deepseek-v4-flash-0731-high", + "clean-code__openrouter-deepseek-deepseek-v4-1-flash-high", "clean-code__openrouter-z-ai-glm-5-3-flash-high", - "security__openrouter-deepseek-deepseek-v4-flash-0731-high", + "security__openrouter-deepseek-deepseek-v4-1-flash-high", "security__openrouter-z-ai-glm-5-3-flash-high", - "bugs__openrouter-deepseek-deepseek-v4-flash-0731-high", + "bugs__openrouter-deepseek-deepseek-v4-1-flash-high", "bugs__openrouter-z-ai-glm-5-3-flash-high", "report", "triage", diff --git a/test/config.test.ts b/test/config.test.ts index 92bd47c..1bf2307 100644 --- a/test/config.test.ts +++ b/test/config.test.ts @@ -1156,7 +1156,7 @@ describe("default config init", () => { expect(body).toContain("# maxConcurrentAgents: 30") expect(body).toContain("# baseRef: main") expect(body).toContain("# pipeline: full-cycle") - expect(body).toContain("# branchNameModel: openrouter/deepseek/deepseek-v4-flash-0731") + expect(body).toContain("# branchNameModel: openrouter/deepseek/deepseek-v4.1-flash") expect(body).toContain("# hooks:") expect(body).toContain("# command: gh pr create --fill") expect(body).toContain("# agents:") diff --git a/test/coordinate.test.ts b/test/coordinate.test.ts index 6c37993..8e3d1ee 100644 --- a/test/coordinate.test.ts +++ b/test/coordinate.test.ts @@ -294,15 +294,15 @@ describe("runCoordinateBoot", () => { const unresolved = advisedImplementerStep() const resolved = { ...unresolved, - model: "openrouter/deepseek/deepseek-v4-flash-0731", + model: "openrouter/deepseek/deepseek-v4.1-flash", resolvedModel: { configured: "nan/deepseek-v4-flash#high", logical: "nan/deepseek-v4-flash#high", gateway: "nitro" as const, providerID: "openrouter", - modelID: "deepseek/deepseek-v4-flash-0731", + modelID: "deepseek/deepseek-v4.1-flash", variant: "high", - target: "openrouter/deepseek/deepseek-v4-flash-0731#high", + target: "openrouter/deepseek/deepseek-v4.1-flash#high", }, resolvedAdvisor: { configured: "openrouter/x-ai/grok-4.6#high", diff --git a/test/launch-tui.test.ts b/test/launch-tui.test.ts index 215ef69..300349a 100644 --- a/test/launch-tui.test.ts +++ b/test/launch-tui.test.ts @@ -409,7 +409,7 @@ describe("launch TUI narrow-width row budgets", () => { { stepName: "score-report", groupId: "g2", kind: "agent" as const, modelLabel: "x-ai-grok-5", advisorLabel: "" }, ], improve: [ - { stepName: "fix", groupId: "g3", kind: "agent" as const, modelLabel: "deepseek-v4-flash", advisorLabel: "x-ai-grok-5 advisor ×3" }, + { stepName: "fix", groupId: "g3", kind: "agent" as const, modelLabel: "deepseek-v4.1-flash", advisorLabel: "x-ai-grok-5 advisor ×3" }, ], } satisfies GoalPreview for (const width of widths) { @@ -713,7 +713,7 @@ describe("launch TUI pipeline preview", () => { { stepName: "score-report", groupId: "g2", kind: "agent", modelLabel: "x-ai-grok-5", advisorLabel: "" }, ], improve: [ - { stepName: "fix", groupId: "g3", kind: "agent", modelLabel: "deepseek-v4-flash", advisorLabel: "x-ai-grok-5 advisor ×3" }, + { stepName: "fix", groupId: "g3", kind: "agent", modelLabel: "deepseek-v4.1-flash", advisorLabel: "x-ai-grok-5 advisor ×3" }, ], } satisfies GoalPreview @@ -736,7 +736,7 @@ describe("launch TUI pipeline preview", () => { // relationship, with their resolved models. expect(lines).toContain(" ○ score · 2 models") expect(lines).toContain(" ○ score-report · x-ai-grok-5") - expect(lines).toContain(" ○ fix · deepseek-v4-flash → x-ai-grok-5 advisor ×3") + expect(lines).toContain(" ○ fix · deepseek-v4.1-flash → x-ai-grok-5 advisor ×3") }) test("goalLines collapses policy chips and fragment roles when the panel is narrow", () => { @@ -1569,7 +1569,7 @@ describe("launch TUI goal classification", () => { { stepName: "score", groupId: "g1", kind: "agent", modelLabel: "glm-5.3-high", advisorLabel: "" }, { stepName: "score-report", groupId: "g2", kind: "agent", modelLabel: "x-ai-grok-5", advisorLabel: "" }, ], - improve: [{ stepName: "fix", groupId: "g3", kind: "agent", modelLabel: "deepseek-v4-flash", advisorLabel: "" }], + improve: [{ stepName: "fix", groupId: "g3", kind: "agent", modelLabel: "deepseek-v4.1-flash", advisorLabel: "" }], }, }], "configured", @@ -1587,7 +1587,7 @@ describe("launch TUI goal classification", () => { expect(detail).not.toContain("4 measurements") expect(detail).toContain("measure · score ← score-report") expect(detail).toContain("improve · brief → fix · then re-measure") - expect(detail).toContain("○ fix · deepseek-v4-flash") + expect(detail).toContain("○ fix · deepseek-v4.1-flash") } finally { await closeLauncher(launcher) } diff --git a/test/pipeline.test.ts b/test/pipeline.test.ts index ff0ccc9..ccad15d 100644 --- a/test/pipeline.test.ts +++ b/test/pipeline.test.ts @@ -79,11 +79,11 @@ describe("built-in implement pipeline", () => { .map((step) => [step.name, step]), ) - expect(byName.implementer).toMatchObject({ model: "openrouter/deepseek/deepseek-v4-flash-0731", variant: "high" }) - expect(byName.patterns).toMatchObject({ model: "openrouter/deepseek/deepseek-v4-flash-0731", variant: "high" }) + expect(byName.implementer).toMatchObject({ model: "openrouter/deepseek/deepseek-v4.1-flash", variant: "high" }) + expect(byName.patterns).toMatchObject({ model: "openrouter/deepseek/deepseek-v4.1-flash", variant: "high" }) expect(byName.security).toMatchObject({ model: "openrouter/z-ai/glm-5.3-flash", variant: "high" }) expect(byName.design).toMatchObject({ model: "openrouter/z-ai/glm-5.3-flash", variant: "high" }) - expect(byName.tests).toMatchObject({ model: "openrouter/deepseek/deepseek-v4-flash-0731", variant: "high" }) + expect(byName.tests).toMatchObject({ model: "openrouter/deepseek/deepseek-v4.1-flash", variant: "high" }) }) test("advises only the implementation phase with Astra xhigh", () => { @@ -134,7 +134,7 @@ describe("built-in implement pipeline", () => { const recap = byName["run-report"] expect(recap).toMatchObject({ agentName: "run-reporter", - model: "openrouter/deepseek/deepseek-v4-flash-0731", + model: "openrouter/deepseek/deepseek-v4.1-flash", variant: "high", readOnly: true, inputDiff: false, @@ -229,13 +229,13 @@ describe("default pipeline", () => { .steps.filter((step): step is AgentStep => step.type === "agent") .map((step) => [step.name, step]), ) - expect(prefix.implementer).toMatchObject({ model: "openrouter/deepseek/deepseek-v4-flash-0731", variant: "high" }) - expect(prefix.patterns).toMatchObject({ model: "openrouter/deepseek/deepseek-v4-flash-0731", variant: "high" }) + expect(prefix.implementer).toMatchObject({ model: "openrouter/deepseek/deepseek-v4.1-flash", variant: "high" }) + expect(prefix.patterns).toMatchObject({ model: "openrouter/deepseek/deepseek-v4.1-flash", variant: "high" }) expect(prefix.security).toMatchObject({ model: "openrouter/z-ai/glm-5.3-flash", variant: "high" }) const consensus = defaultPipeline().goalPlan!.measure.steps.find((step) => step.name === "score-report") expect(consensus).toMatchObject({ model: "openai/gpt-5.6-sol", variant: "xhigh", verify: true }) const [fix] = defaultPipeline().goalPlan!.improve.steps - expect(fix).toMatchObject({ model: "openrouter/deepseek/deepseek-v4-flash-0731", variant: "high" }) + expect(fix).toMatchObject({ model: "openrouter/deepseek/deepseek-v4.1-flash", variant: "high" }) }) }) @@ -268,7 +268,7 @@ describe("built-in ship pipeline", () => { test("syncs the base in before anything reads the diff, so the review describes the merged result", () => { const [sync] = shipSteps() - expect(sync).toMatchObject({ agentName: "sync-with-base", model: "openrouter/deepseek/deepseek-v4-flash-0731", variant: "high" }) + expect(sync).toMatchObject({ agentName: "sync-with-base", model: "openrouter/deepseek/deepseek-v4.1-flash", variant: "high" }) // The merge writes to the repository: goal mode refuses a report-only // pipeline, so this step is also what makes ship goal-eligible. expect(sync?.readOnly).toBeFalsy() @@ -281,7 +281,7 @@ describe("built-in ship pipeline", () => { const fan = shipSteps().filter((step) => step.stepName === base) expect(fan).toHaveLength(2) expect(fan.map((step) => step.model)).toEqual([ - "openrouter/deepseek/deepseek-v4-flash-0731", + "openrouter/deepseek/deepseek-v4.1-flash", "openrouter/z-ai/glm-5.3-flash", ]) expect(fan.every((step) => step.readOnly)).toBe(true) @@ -295,7 +295,7 @@ describe("built-in ship pipeline", () => { expect(byName.triage).toMatchObject({ agentName: "review-adversary", model: "openrouter/z-ai/glm-5.3", variant: "high", readOnly: true }) expect(byName.fixes).toMatchObject({ agentName: "review-fixer", - model: "openrouter/deepseek/deepseek-v4-flash-0731", + model: "openrouter/deepseek/deepseek-v4.1-flash", variant: "high", advisor: "openai/gpt-6-astra", advisorVariant: "xhigh", @@ -319,7 +319,7 @@ describe("built-in ship pipeline", () => { const [fix] = goal.improve.steps expect(goal.improve.steps.map((step) => step.name)).toEqual(["fix"]) - expect(fix).toMatchObject({ agentName: "goal-fixer", model: "openrouter/deepseek/deepseek-v4-flash-0731", variant: "high", inputDiff: true, prdHistory: true }) + expect(fix).toMatchObject({ agentName: "goal-fixer", model: "openrouter/deepseek/deepseek-v4.1-flash", variant: "high", inputDiff: true, prdHistory: true }) expect(fix?.advisor).toBe("openai/gpt-6-astra") expect(fix?.readOnly).toBeFalsy() }) @@ -405,11 +405,11 @@ describe("built-in review pipeline", () => { test("scopes, runs the three audits fanned across two models, synthesizes a findings report, then scores", () => { expect(stepNames(scored())).toEqual([ "scope", - "clean-code__openrouter-deepseek-deepseek-v4-flash-0731-high", + "clean-code__openrouter-deepseek-deepseek-v4-1-flash-high", "clean-code__openrouter-z-ai-glm-5-3-flash-high", - "security__openrouter-deepseek-deepseek-v4-flash-0731-high", + "security__openrouter-deepseek-deepseek-v4-1-flash-high", "security__openrouter-z-ai-glm-5-3-flash-high", - "bugs__openrouter-deepseek-deepseek-v4-flash-0731-high", + "bugs__openrouter-deepseek-deepseek-v4-1-flash-high", "bugs__openrouter-z-ai-glm-5-3-flash-high", "report", "score__openrouter-z-ai-glm-5-3-high", @@ -424,11 +424,11 @@ describe("built-in review pipeline", () => { expect(findings?.inputFiles).toEqual([ "prd.md", "reports/scope.md", - "reports/clean-code__openrouter-deepseek-deepseek-v4-flash-0731-high.md", + "reports/clean-code__openrouter-deepseek-deepseek-v4-1-flash-high.md", "reports/clean-code__openrouter-z-ai-glm-5-3-flash-high.md", - "reports/security__openrouter-deepseek-deepseek-v4-flash-0731-high.md", + "reports/security__openrouter-deepseek-deepseek-v4-1-flash-high.md", "reports/security__openrouter-z-ai-glm-5-3-flash-high.md", - "reports/bugs__openrouter-deepseek-deepseek-v4-flash-0731-high.md", + "reports/bugs__openrouter-deepseek-deepseek-v4-1-flash-high.md", "reports/bugs__openrouter-z-ai-glm-5-3-flash-high.md", ]) @@ -438,11 +438,11 @@ describe("built-in review pipeline", () => { expect(report?.inputFiles).toEqual([ "prd.md", "reports/scope.md", - "reports/clean-code__openrouter-deepseek-deepseek-v4-flash-0731-high.md", + "reports/clean-code__openrouter-deepseek-deepseek-v4-1-flash-high.md", "reports/clean-code__openrouter-z-ai-glm-5-3-flash-high.md", - "reports/security__openrouter-deepseek-deepseek-v4-flash-0731-high.md", + "reports/security__openrouter-deepseek-deepseek-v4-1-flash-high.md", "reports/security__openrouter-z-ai-glm-5-3-flash-high.md", - "reports/bugs__openrouter-deepseek-deepseek-v4-flash-0731-high.md", + "reports/bugs__openrouter-deepseek-deepseek-v4-1-flash-high.md", "reports/bugs__openrouter-z-ai-glm-5-3-flash-high.md", "reports/report.md", "reports/score__openrouter-z-ai-glm-5-3-high.md", @@ -515,15 +515,15 @@ describe("review model choices", () => { expect(scope).toMatchObject({ agentName: "review-scope", readOnly: true, verify: true }) }) - test("runs entirely on low-cost models: DeepSeek V4 Flash scopes, audits, and reports, and the scoring stays on GLM 5.3 + Grok 4.6", () => { + test("runs entirely on low-cost models: DeepSeek V4.1 Flash scopes, audits, and reports, and the scoring stays on GLM 5.3 + Grok 4.6", () => { const pipeline = review() expect(stepNames(pipeline)).toEqual([ "scope", - "clean-code__openrouter-deepseek-deepseek-v4-flash-0731-high", + "clean-code__openrouter-deepseek-deepseek-v4-1-flash-high", "clean-code__openrouter-z-ai-glm-5-3-flash-high", - "security__openrouter-deepseek-deepseek-v4-flash-0731-high", + "security__openrouter-deepseek-deepseek-v4-1-flash-high", "security__openrouter-z-ai-glm-5-3-flash-high", - "bugs__openrouter-deepseek-deepseek-v4-flash-0731-high", + "bugs__openrouter-deepseek-deepseek-v4-1-flash-high", "bugs__openrouter-z-ai-glm-5-3-flash-high", "report", "score__openrouter-z-ai-glm-5-3-high", @@ -534,16 +534,16 @@ describe("review model choices", () => { const byName = Object.fromEntries( pipeline.steps.filter((step): step is AgentStep => step.type === "agent").map((step) => [step.name, step]), ) - expect(byName.scope?.model).toBe("openrouter/deepseek/deepseek-v4-flash-0731") - expect(byName.report?.model).toBe("openrouter/deepseek/deepseek-v4-flash-0731") + expect(byName.scope?.model).toBe("openrouter/deepseek/deepseek-v4.1-flash") + expect(byName.report?.model).toBe("openrouter/deepseek/deepseek-v4.1-flash") expect(byName.report?.inputFiles).toEqual([ "prd.md", "reports/scope.md", - "reports/clean-code__openrouter-deepseek-deepseek-v4-flash-0731-high.md", + "reports/clean-code__openrouter-deepseek-deepseek-v4-1-flash-high.md", "reports/clean-code__openrouter-z-ai-glm-5-3-flash-high.md", - "reports/security__openrouter-deepseek-deepseek-v4-flash-0731-high.md", + "reports/security__openrouter-deepseek-deepseek-v4-1-flash-high.md", "reports/security__openrouter-z-ai-glm-5-3-flash-high.md", - "reports/bugs__openrouter-deepseek-deepseek-v4-flash-0731-high.md", + "reports/bugs__openrouter-deepseek-deepseek-v4-1-flash-high.md", "reports/bugs__openrouter-z-ai-glm-5-3-flash-high.md", ]) }) diff --git a/test/run-plan.test.ts b/test/run-plan.test.ts index 3b7d435..b817f1b 100644 --- a/test/run-plan.test.ts +++ b/test/run-plan.test.ts @@ -396,10 +396,10 @@ test("throughputRoutedModels collects the run's OpenRouter models, deduplicated" { providerID: "openrouter", modelID: "z-ai/glm-5.2" }, { providerID: "openrouter", modelID: "anthropic/claude-opus-5" }, ]) - expect(throughputRoutedModels(routed, { providerID: "openrouter", modelID: "deepseek/deepseek-v4-flash-0731" })).toEqual([ + expect(throughputRoutedModels(routed, { providerID: "openrouter", modelID: "deepseek/deepseek-v4.1-flash" })).toEqual([ { providerID: "openrouter", modelID: "z-ai/glm-5.2" }, { providerID: "openrouter", modelID: "anthropic/claude-opus-5" }, - { providerID: "openrouter", modelID: "deepseek/deepseek-v4-flash-0731" }, + { providerID: "openrouter", modelID: "deepseek/deepseek-v4.1-flash" }, ]) expect(throughputRoutedModels(routed, { providerID: "openai", modelID: "gpt-5.6-sol" })).toHaveLength(2) expect(throughputRoutedModels({ name: "empty", steps: [] })).toEqual([]) diff --git a/test/worktree-extended.test.ts b/test/worktree-extended.test.ts index 750b6b0..b9e2c0e 100644 --- a/test/worktree-extended.test.ts +++ b/test/worktree-extended.test.ts @@ -21,7 +21,7 @@ describe("defaultBranchNameModel", () => { }) test("is set to the expected default model", () => { - expect(defaultBranchNameModel).toBe("openrouter/deepseek/deepseek-v4-flash-0731") + expect(defaultBranchNameModel).toBe("openrouter/deepseek/deepseek-v4.1-flash") }) })