github-router 0.3.285 → 0.3.289

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/README.md +8 -5
  2. package/dist/{attribution-settings-B8M2fvhz.js → attribution-settings-Cmz2jt7P.js} +44 -17
  3. package/dist/attribution-settings-Cmz2jt7P.js.map +1 -0
  4. package/dist/{auth-VUL2Zxvw.js → auth-DG4vh8-F.js} +3 -3
  5. package/dist/{auth-VUL2Zxvw.js.map → auth-DG4vh8-F.js.map} +1 -1
  6. package/dist/browser-ext/manifest.json +1 -1
  7. package/dist/{check-usage-CcLdFPGr.js → check-usage-BqN7mBYv.js} +4 -4
  8. package/dist/{check-usage-CcLdFPGr.js.map → check-usage-BqN7mBYv.js.map} +1 -1
  9. package/dist/{claude-e-JIQGhR.js → claude-C-9xFI4b.js} +23 -17
  10. package/dist/claude-C-9xFI4b.js.map +1 -0
  11. package/dist/{codex-DSnVZ9oK.js → codex-DRW0yb8x.js} +5 -5
  12. package/dist/{codex-DSnVZ9oK.js.map → codex-DRW0yb8x.js.map} +1 -1
  13. package/dist/{debug-CtzYWxpJ.js → debug-B5TjPTTH.js} +2 -2
  14. package/dist/{debug-CtzYWxpJ.js.map → debug-B5TjPTTH.js.map} +1 -1
  15. package/dist/engine-iEqGdx6T.js +2 -0
  16. package/dist/{gate-discovery-BCFwLm0q.js → gate-discovery-Cz6kwIVG.js} +5 -5
  17. package/dist/{gate-discovery-BCFwLm0q.js.map → gate-discovery-Cz6kwIVG.js.map} +1 -1
  18. package/dist/{get-copilot-usage-B-EDAqQb.js → get-copilot-usage-BjA0nyGR.js} +2 -2
  19. package/dist/{get-copilot-usage-B-EDAqQb.js.map → get-copilot-usage-BjA0nyGR.js.map} +1 -1
  20. package/dist/{internal-artifact-open-Dj5Nlq0L.js → internal-artifact-open-BskmUpnb.js} +2 -2
  21. package/dist/{internal-artifact-open-Dj5Nlq0L.js.map → internal-artifact-open-BskmUpnb.js.map} +1 -1
  22. package/dist/{internal-first-mate-guard-DOgFVki5.js → internal-first-mate-guard-5XEHMaqy.js} +3 -3
  23. package/dist/{internal-first-mate-guard-DOgFVki5.js.map → internal-first-mate-guard-5XEHMaqy.js.map} +1 -1
  24. package/dist/{internal-first-mate-guard-B7p4NttK.js → internal-first-mate-guard-DHDQ6hFz.js} +1 -1
  25. package/dist/{internal-plan-review-DRFHET_B.js → internal-plan-review-BUuMx4ku.js} +3 -3
  26. package/dist/{internal-plan-review-DRFHET_B.js.map → internal-plan-review-BUuMx4ku.js.map} +1 -1
  27. package/dist/{internal-prompt-submit-f1LR2P2G.js → internal-prompt-submit-CQQ15xdO.js} +4 -4
  28. package/dist/{internal-prompt-submit-f1LR2P2G.js.map → internal-prompt-submit-CQQ15xdO.js.map} +1 -1
  29. package/dist/{internal-session-bind-DhZhxJ3T.js → internal-session-bind-D04W2yWI.js} +2 -2
  30. package/dist/{internal-session-bind-DhZhxJ3T.js.map → internal-session-bind-D04W2yWI.js.map} +1 -1
  31. package/dist/{internal-stop-hook-Cf-7w3RH.js → internal-stop-hook-Dvkppwo7.js} +5 -5
  32. package/dist/{internal-stop-hook-Cf-7w3RH.js.map → internal-stop-hook-Dvkppwo7.js.map} +1 -1
  33. package/dist/{internal-stop-review-BBsLcbPG.js → internal-stop-review-CdByyJLc.js} +2 -2
  34. package/dist/{internal-stop-review-BBsLcbPG.js.map → internal-stop-review-CdByyJLc.js.map} +1 -1
  35. package/dist/{internal-worker-guard-CKgYFiFO.js → internal-worker-guard-BIPN6Rv9.js} +2 -2
  36. package/dist/{internal-worker-guard-CKgYFiFO.js.map → internal-worker-guard-BIPN6Rv9.js.map} +1 -1
  37. package/dist/{internal-workspace-header-OYgHEnFt.js → internal-workspace-header-BKqejstG.js} +2 -2
  38. package/dist/{internal-workspace-header-OYgHEnFt.js.map → internal-workspace-header-BKqejstG.js.map} +1 -1
  39. package/dist/lifecycle-BTodQvn4.js +2 -0
  40. package/dist/lifecycle-C7JYNz-F.js +2 -0
  41. package/dist/{lifecycle-B7CHqKlF.js → lifecycle-DbM29FLK.js} +2 -2
  42. package/dist/{lifecycle-B7CHqKlF.js.map → lifecycle-DbM29FLK.js.map} +1 -1
  43. package/dist/{lifecycle-D-rL81tT.js → lifecycle-SXaWssN9.js} +2 -2
  44. package/dist/{lifecycle-D-rL81tT.js.map → lifecycle-SXaWssN9.js.map} +1 -1
  45. package/dist/main.js +17 -17
  46. package/dist/{mcp-workspace-header-ucs2SDST.js → mcp-workspace-header-DRCCWlOi.js} +2 -2
  47. package/dist/{mcp-workspace-header-ucs2SDST.js.map → mcp-workspace-header-DRCCWlOi.js.map} +1 -1
  48. package/dist/{models-C16mBK2M.js → models-Dz8d_SnI.js} +3 -3
  49. package/dist/{models-C16mBK2M.js.map → models-Dz8d_SnI.js.map} +1 -1
  50. package/dist/{orchestration-CtM6FYNx.js → orchestration-BrJwZxMN.js} +2 -2
  51. package/dist/{orchestration-CtM6FYNx.js.map → orchestration-BrJwZxMN.js.map} +1 -1
  52. package/dist/paths-CTr59UC6.js +2 -0
  53. package/dist/{paths-wLC0InjX.js → paths-D7_SAaIQ.js} +4 -4
  54. package/dist/{paths-wLC0InjX.js.map → paths-D7_SAaIQ.js.map} +1 -1
  55. package/dist/{peer-mcp-personas-V6stFvpq.js → peer-mcp-personas-Bd56EmiO.js} +533 -55
  56. package/dist/peer-mcp-personas-Bd56EmiO.js.map +1 -0
  57. package/dist/{plan-review-hook-Lf9ISdF6.js → plan-review-hook-CVZsG9MZ.js} +3 -3
  58. package/dist/{plan-review-hook-Lf9ISdF6.js.map → plan-review-hook-CVZsG9MZ.js.map} +1 -1
  59. package/dist/{prompt-submit-hook-BlijaOn7.js → prompt-submit-hook-BW92FX2D.js} +3 -3
  60. package/dist/{prompt-submit-hook-BlijaOn7.js.map → prompt-submit-hook-BW92FX2D.js.map} +1 -1
  61. package/dist/{provision-BpL6gZIt.js → provision-B53wbHwa.js} +4 -4
  62. package/dist/{provision-BpL6gZIt.js.map → provision-B53wbHwa.js.map} +1 -1
  63. package/dist/{self-invocation-CKMjcA5F.js → self-invocation-CP_SOkrr.js} +2 -2
  64. package/dist/{self-invocation-CKMjcA5F.js.map → self-invocation-CP_SOkrr.js.map} +1 -1
  65. package/dist/{serve-CXUf7RtJ.js → serve-aZCEYFe5.js} +37 -24
  66. package/dist/serve-aZCEYFe5.js.map +1 -0
  67. package/dist/{server-setup-Bppjt9xO.js → server-setup-DlztZAGT.js} +258 -99
  68. package/dist/server-setup-DlztZAGT.js.map +1 -0
  69. package/dist/{start-C1-jrHfU.js → start-DwNiXv5N.js} +3 -3
  70. package/dist/{start-C1-jrHfU.js.map → start-DwNiXv5N.js.map} +1 -1
  71. package/dist/{stop-gate-hook-DgJ6sW8N.js → stop-gate-hook-DriRc9xN.js} +3 -3
  72. package/dist/{stop-gate-hook-DgJ6sW8N.js.map → stop-gate-hook-DriRc9xN.js.map} +1 -1
  73. package/dist/{stop-gate-policy-DG5yYWGn.js → stop-gate-policy-DMPanpoR.js} +2 -2
  74. package/dist/{stop-gate-policy-DG5yYWGn.js.map → stop-gate-policy-DMPanpoR.js.map} +1 -1
  75. package/dist/{token-CnlB0884.js → token-BGCjZwtj.js} +2 -2
  76. package/dist/token-BGCjZwtj.js.map +1 -0
  77. package/dist/{worker-dispatch-zW8Zi69V.js → worker-dispatch-BCTMyNE-.js} +2 -2
  78. package/dist/{worker-dispatch-zW8Zi69V.js.map → worker-dispatch-BCTMyNE-.js.map} +1 -1
  79. package/package.json +2 -1
  80. package/dist/attribution-settings-B8M2fvhz.js.map +0 -1
  81. package/dist/claude-e-JIQGhR.js.map +0 -1
  82. package/dist/engine-DMveEa9x.js +0 -2
  83. package/dist/lifecycle-CbmHMMSD.js +0 -2
  84. package/dist/lifecycle-DTcZwa7U.js +0 -2
  85. package/dist/paths-CV9K7Xqm.js +0 -2
  86. package/dist/peer-mcp-personas-V6stFvpq.js.map +0 -1
  87. package/dist/serve-CXUf7RtJ.js.map +0 -1
  88. package/dist/server-setup-Bppjt9xO.js.map +0 -1
  89. package/dist/token-CnlB0884.js.map +0 -1
package/README.md CHANGED
@@ -98,15 +98,18 @@ Each persona is exposed both as a Claude Code subagent (callable via the `Task`
98
98
 
99
99
  ### Native subagents
100
100
 
101
- The launcher also registers focused native subagents that run in their own contexts. `implementer`, `reviewer`, `brainstorm`, and `scribe` are always present. Each uses its preferred model when the live catalog provides one with tool calls, otherwise it inherits the lead model; `scout` is present only when its cheap-tier model chain resolves, so repository lookup does not silently run at the lead's model rate.
101
+ The launcher also registers focused native subagents that run in their own contexts. `implementer`, `reviewer`, `brainstorm`, and `scribe` are always present. Each uses its preferred model when the live catalog provides one with tool calls, otherwise it inherits the lead model; `scout`, `implementer-fast`, `reviewer-fast`, and `general-purpose-fast` are present only when their cheap-tier model chains resolve, so the work they exist to make cheaper does not silently run at the lead's model rate.
102
102
 
103
103
  | Subagent | Use for | Preferred model chain | Tools |
104
104
  |---|---|---|---|
105
- | `implementer` | Well-scoped coding changes | gpt-5.6-sol → gpt-5.5 | Full inherited toolset |
106
- | `reviewer` | Assessing an existing diff, plan, document, or failure | gpt-5.6-solgpt-5.5 | Full inherited toolset |
107
- | `brainstorm` | Divergent approaches before selecting one | gemini-3.1-pro-preview → OpenAI frontier | Read-only allowlist |
108
- | `scout` | Low-cost repository exploration | gemini-3.6-flash gpt-5.4-mini | Read-only allowlist |
105
+ | `implementer` | Coding changes needing judgment or with ambiguous scope | gpt-5.6-sol → gpt-5.5 | Full inherited toolset |
106
+ | `implementer-fast` | Well-specified, mechanical coding changes | gpt-5.6-terragemini-3.1-pro-preview | Full inherited toolset |
107
+ | `reviewer` | Assessing an existing diff, plan, document, or failure | gemini-3.1-pro-preview → gemini-3.7-flash → OpenAI frontier | Full inherited toolset |
108
+ | `reviewer-fast` | Lower-stakes assessment on a cheaper cross-lab model | gemini-3.7-flash | Full inherited toolset |
109
+ | `brainstorm` | Divergent approaches before selecting one | gemini-3.1-pro-preview → gemini-3.7-flash → OpenAI frontier | Read-only allowlist |
110
+ | `scout` | Low-cost repository exploration | gpt-5.6-luna → gemini-3.7-flash | Read-only allowlist |
109
111
  | `scribe` | Documentation that trails the code | gpt-5.6-terra → OpenAI frontier | Full inherited toolset |
112
+ | `general-purpose-fast` | Work no specialist fits | gpt-5.6-luna | Full inherited toolset |
110
113
 
111
114
  For codex-side write capability (a `codex-implementer` persona that can mutate files via Codex's tool-use sandbox), pass `--codex-cli`. Requires `codex` CLI 0.129+ on `PATH`; falls back to HTTP-only with a warning if codex is missing or older. Pass `--codex-mcp-only` to also pass `--strict-mcp-config` to Claude Code so only the proxy's MCP servers are loaded (hides any MCP servers in your existing `~/.claude/mcp.json`).
112
115
 
@@ -1,9 +1,9 @@
1
- import { Lt as CONDENSED_OPERATING_SEQUENCE, Rt as DEFINITION_OF_GREATNESS, c as personasFor, i as buildAgentPrompt, n as MCP_GROUPS, rn as withOneMSuffix, t as GROUP_META } from "./peer-mcp-personas-V6stFvpq.js";
2
- import { a as isUnderClaudeConfigMirror, d as writeRuntimeFileSecure, t as PATHS } from "./paths-wLC0InjX.js";
3
- import "./self-invocation-CKMjcA5F.js";
4
- import { a as STRIPPED_AUTH_ROUTING_ENV_KEYS, n as buildCodexProviderConfigFlags } from "./provision-BpL6gZIt.js";
5
- import { n as buildWorkspaceHeaderHelperCommand } from "./mcp-workspace-header-ucs2SDST.js";
6
- import { a as dispatcherAgentName, c as dispatcherTools, n as activeDispatchModes, o as dispatcherDescription, s as dispatcherPrompt } from "./worker-dispatch-zW8Zi69V.js";
1
+ import { Ht as DEFINITION_OF_GREATNESS, Vt as CONDENSED_OPERATING_SEQUENCE, c as personasFor, i as buildAgentPrompt, n as MCP_GROUPS, sn as withOneMSuffix, t as GROUP_META } from "./peer-mcp-personas-Bd56EmiO.js";
2
+ import { a as isUnderClaudeConfigMirror, d as writeRuntimeFileSecure, t as PATHS } from "./paths-D7_SAaIQ.js";
3
+ import "./self-invocation-CP_SOkrr.js";
4
+ import { a as STRIPPED_AUTH_ROUTING_ENV_KEYS, n as buildCodexProviderConfigFlags } from "./provision-B53wbHwa.js";
5
+ import { n as buildWorkspaceHeaderHelperCommand } from "./mcp-workspace-header-DRCCWlOi.js";
6
+ import { a as dispatcherAgentName, c as dispatcherTools, n as activeDispatchModes, o as dispatcherDescription, s as dispatcherPrompt } from "./worker-dispatch-BCTMyNE-.js";
7
7
  import consola from "consola";
8
8
  import path from "node:path";
9
9
  import { randomBytes } from "node:crypto";
@@ -280,7 +280,8 @@ function buildPeerAgentDefinitions(opts) {
280
280
  const out = {};
281
281
  const personas = personasFor({
282
282
  codexCli: opts.codexCli,
283
- geminiAvailable: opts.geminiAvailable
283
+ geminiAvailable: opts.geminiAvailable,
284
+ geminiModel: opts.geminiModel
284
285
  });
285
286
  const peersKey = peersKeyOf(opts.groupKeys);
286
287
  const peersMcp = opts.serverUrl ? { mcpServers: { [peersKey]: httpEntryFor(opts.serverUrl, "peers", opts.nonce, opts.workspaceHeaderCmd) } } : {};
@@ -301,6 +302,7 @@ function buildPeerAgentDefinitions(opts) {
301
302
  };
302
303
  const nativeModel = nonEmptyModel(opts.nativeSubagentModel);
303
304
  const reviewerModel = nonEmptyModel(opts.reviewerModel);
305
+ const reviewerFastModel = nonEmptyModel(opts.reviewerFastModel);
304
306
  const brainstormModel = nonEmptyModel(opts.brainstormModel);
305
307
  const scoutModel = nonEmptyModel(opts.scoutModel);
306
308
  const scribeModel = nonEmptyModel(opts.scribeModel);
@@ -314,11 +316,17 @@ function buildPeerAgentDefinitions(opts) {
314
316
  prompt: "You are a bounded implementation subagent for well-scoped coding tasks. Implement the requested change surgically, matching the surrounding code style and minimizing unrelated churn. " + fileToolSteer("builds") + " Verify with the project's build or tests where applicable. Do the work yourself — do not spawn further subagents. Report exactly what changed and any risks.",
315
317
  ...modelField
316
318
  };
319
+ const reviewerPrompt = "You are a feedback subagent. Your job is to tell the caller what is actually true about the artifact you are given — code, a plan, a document, a failure report — and what is wrong with it. Verify against the ACTUAL code by reading it; never assume. Do whatever the assessment requires: reproduce a failure end to end as close to how a real user hits it as you can, form hypotheses and test them against the code and runtime, and isolate the true root cause rather than a symptom. Where the change warrants it, author tests that try to BREAK the implementation (edge cases, error paths, and the acceptance criteria as executable checks), run them, and report which pass and which fail; do NOT modify production code just to make tests pass. " + fileToolSteer("builds") + " Do the work yourself — do not spawn further subagents. Report severity-ranked findings with `file:line` citations, the evidence behind each, and end with a clear go/no-go.";
317
320
  out.reviewer = {
318
321
  description: reviewerModel ? `Feedback subagent running ${reviewerModel}, a DIFFERENT lab from both the lead and the implementer, so its blind spots are decorrelated from whoever produced the work. Use proactively when something already exists and you want it assessed: a diff, a plan, a document, a failing test. Unlike the stateless peer critics, it reads the repo and can RUN things, so prefer it whenever the assessment needs execution or repo context (reproduce a failure, run the suite, bisect); prefer a peer critic when you already hold the artifact and want a fresh-context opinion on it. It can also REVIEW SCREENSHOTS and other images: just point it at the file and it will look at them. Model is overridable at spawn.` : `Feedback subagent (native tools, runs on the lead's model in its own context). Use proactively when something already exists and you want it assessed: a diff, a plan, a document, a failing test. Unlike the stateless peer critics, it reads the repo and can RUN things, so prefer it whenever the assessment needs execution or repo context; prefer a peer critic when you already hold the artifact and want a fresh-context opinion on it. Model is overridable at spawn.`,
319
- prompt: "You are a feedback subagent. Your job is to tell the caller what is actually true about the artifact you are given — code, a plan, a document, a failure report — and what is wrong with it. Verify against the ACTUAL code by reading it; never assume. Do whatever the assessment requires: reproduce a failure end to end as close to how a real user hits it as you can, form hypotheses and test them against the code and runtime, and isolate the true root cause rather than a symptom. Where the change warrants it, author tests that try to BREAK the implementation (edge cases, error paths, and the acceptance criteria as executable checks), run them, and report which pass and which fail; do NOT modify production code just to make tests pass. " + fileToolSteer("builds") + " Do the work yourself — do not spawn further subagents. Report severity-ranked findings with `file:line` citations, the evidence behind each, and end with a clear go/no-go.",
322
+ prompt: reviewerPrompt,
320
323
  ...reviewerModel ? { model: withOneMSuffix(reviewerModel) } : {}
321
324
  };
325
+ if (reviewerFastModel) out["reviewer-fast"] = {
326
+ description: `Cheaper feedback subagent running ${reviewerFastModel} (1M context, typically faster than the pro-tier reviewer and cross-lab from the OpenAI-backed implementer). Use for lower-stakes assessments that still need repository access or execution; escalate higher-stakes review to reviewer. Full toolset, so it can read the repo and run builds, tests, and reproductions in its own context. Model is overridable at spawn.`,
327
+ prompt: reviewerPrompt,
328
+ model: withOneMSuffix(reviewerFastModel)
329
+ };
322
330
  out.brainstorm = {
323
331
  description: brainstormModel ? `Divergent-options subagent running ${brainstormModel} (third lab, for approaches the lead would not generate). Use proactively BEFORE an approach is chosen. Pass the decision, the constraints, what you have already ruled out, and the cost of being wrong; pass your current leading approach too if you have one, and it will try to beat it rather than restate it. Read-only; it proposes, then hands off to implementer. Model is overridable at spawn.` : `Divergent-options subagent (runs on the lead's model in its own context). Use proactively BEFORE an approach is chosen. Pass the decision, the constraints, what you have already ruled out, and the cost of being wrong; pass your current leading approach too if you have one, and it will try to beat it rather than restate it. Read-only; it proposes, then hands off to implementer. Model is overridable at spawn.`,
324
332
  prompt: "You are a divergent-options subagent: the lead's sounding board while an approach is still open. Your job is to surface the option the lead would not have reached on its own. If the caller states its current leading approach, your job is to try to beat it, and you close with one verdict: `replace`, `retain`, or `insufficient evidence`. `replace` requires naming a concrete alternative that dominates it and the evidence that decides between them. `retain` is a real answer and a useful one: say it plainly when the approach survives a genuine attempt to beat it. Manufactured disagreement is as useless as agreement; do neither. If the caller states no leading approach, generate independently and let the lead compare. Return 3 to 5 approaches that differ in MECHANISM, not in phrasing. For each: how it works, what it costs, what would have to be true for it to be the right answer, and the failure mode that would kill it. Near-duplicate options are the failure mode to avoid — if only one real approach exists, say so plainly and explain why the alternatives are dead, because one honest option beats four padded ones. Screen EVERY candidate against this repository and this environment before you rank them, then verify the one you are about to recommend can actually run here: read the code path it depends on, the guard that would refuse it, the artifact it assumes exists. A recommendation that cannot execute is worse than no recommendation. If checking kills your front-runner, rerank and say so. Ground every option in what the repository actually contains, and prefer reusing what is already there over inventing something new. " + readOnlyToolSteer() + " Do the work yourself — do not spawn further subagents.",
@@ -673,6 +681,7 @@ async function writePeerMcpRuntimeFiles(serverUrl, opts) {
673
681
  const mcpConfig = buildPeerMcpConfig(serverUrl, {
674
682
  codexCli: opts.codexCli,
675
683
  geminiAvailable: opts.geminiAvailable,
684
+ geminiModel: opts.geminiModel,
676
685
  groupKeys: opts.groupKeys,
677
686
  nonce,
678
687
  codexHome,
@@ -681,11 +690,13 @@ async function writePeerMcpRuntimeFiles(serverUrl, opts) {
681
690
  const agents = buildPeerAgentDefinitions({
682
691
  codexCli: opts.codexCli,
683
692
  geminiAvailable: opts.geminiAvailable,
693
+ geminiModel: opts.geminiModel,
684
694
  groupKeys: opts.groupKeys,
685
695
  workerToolsAvailable: opts.workerToolsAvailable,
686
696
  browseAvailable: opts.browseAvailable,
687
697
  nativeSubagentModel: opts.nativeSubagentModel,
688
698
  reviewerModel: opts.reviewerModel,
699
+ reviewerFastModel: opts.reviewerFastModel,
689
700
  brainstormModel: opts.brainstormModel,
690
701
  scoutModel: opts.scoutModel,
691
702
  scribeModel: opts.scribeModel,
@@ -709,7 +720,8 @@ async function writePeerMcpRuntimeFiles(serverUrl, opts) {
709
720
  });
710
721
  const personas = personasFor({
711
722
  codexCli: opts.codexCli,
712
- geminiAvailable: opts.geminiAvailable
723
+ geminiAvailable: opts.geminiAvailable,
724
+ geminiModel: opts.geminiModel
713
725
  });
714
726
  const cleanup = async () => {
715
727
  await Promise.allSettled([
@@ -1763,21 +1775,36 @@ function joinClauses(parts) {
1763
1775
  }
1764
1776
  /** The "Reach for X when Y" list, omitting any agent this launch did not emit.
1765
1777
  *
1766
- * On a budget lead the coding clauses swap order so the cheap tier leads and
1767
- * the frontier tier is named as the complexity escalation. Choosing a lighter
1768
- * lead is a decision to spend less while holding quality, and a roster that
1769
- * names the expensive `implementer` first works against exactly that. This is
1770
- * ORDERING AND WORDING ONLY: no agent's model changes, and `implementer` stays
1771
- * named so work beyond the fast tier still has somewhere to go. */
1778
+ * On a budget lead the coding AND review clauses swap order so the cheap tier
1779
+ * leads and the frontier tier is named as the complexity escalation. Choosing a
1780
+ * lighter lead is a decision to spend less while holding quality, and a roster
1781
+ * that names the expensive `implementer` / `reviewer` first works against
1782
+ * exactly that. This is ORDERING AND WORDING ONLY: no agent's model changes,
1783
+ * and both frontier tiers stay named so work beyond the fast tier still has
1784
+ * somewhere to go.
1785
+ *
1786
+ * Review gets the same treatment as implementation because the cost gap is the
1787
+ * same shape: `reviewer` runs the pro tier (200/1200 per 1M) against
1788
+ * `reviewer-fast`'s flash tier (75/375), and measured 2026-08-13 the flash
1789
+ * model was also the FASTER of the two on every axis (tool-call p50 ~1.2s vs
1790
+ * ~2.8s, TTFT ~1.9s vs ~3.7s, decode ~326 vs ~165 tok/s). So on a budget lead
1791
+ * there is no quality-for-cost trade being hidden by leading with the cheap
1792
+ * tier; reserve `reviewer` for the higher-stakes assessment it is there for. */
1772
1793
  function buildNativeReachClauses(opts) {
1773
1794
  const clauses = [];
1774
1795
  const implementerFast = opts.implementerFastAvailable !== false;
1796
+ const reviewerFast = opts.reviewerFastAvailable !== false;
1775
1797
  if (opts.budgetLead === true && implementerFast) clauses.push("`implementer-fast` first for coding changes, since it is the cheaper and faster tier and this session is running a lighter lead", "`implementer` when the change needs judgment, its scope is ambiguous, or its complexity is beyond what the fast tier can carry");
1776
1798
  else {
1777
1799
  clauses.push("`implementer` for coding changes that need judgment or have ambiguous scope");
1778
1800
  if (implementerFast) clauses.push("`implementer-fast` for well-specified, mechanical coding changes");
1779
1801
  }
1780
- clauses.push("`reviewer` when something exists and you want it assessed (including reproducing and root-causing a failure)", "`brainstorm` when you do not yet know which approach to take");
1802
+ if (opts.budgetLead === true && reviewerFast) clauses.push("`reviewer-fast` first when something exists and you want it assessed, since it is the cheaper and faster review tier", "`reviewer` when the assessment is higher-stakes or needs deeper reproduction and root-causing than the fast tier can carry");
1803
+ else {
1804
+ clauses.push("`reviewer` when something exists and you want it assessed (including reproducing and root-causing a failure)");
1805
+ if (reviewerFast) clauses.push("`reviewer-fast` for lower-stakes assessments");
1806
+ }
1807
+ clauses.push("`brainstorm` when you do not yet know which approach to take");
1781
1808
  if (opts.scoutAvailable !== false) clauses.push("`scout` to find or understand something in the repo");
1782
1809
  clauses.push("`scribe` for docs and ADRs that trail the code");
1783
1810
  if (opts.generalPurposeFastAvailable !== false) clauses.push(opts.budgetLead === true ? "`general-purpose-fast` for work no specialist fits, in preference to carrying it inline yourself" : "`general-purpose-fast` for work no specialist fits");
@@ -2359,4 +2386,4 @@ async function injectAttributionSuppressionIntoSettingsFile(settingsPath) {
2359
2386
  //#endregion
2360
2387
  export { injectPeerMcpIntoMirror as _, appendPeerAwarenessToMirroredClaudeMd as a, workersKeyOf as b, prependArtifactPanelDirectiveToMirroredClaudeMd as c, SEAMLESS_BUILTIN_TOOLS as d, configureServeDefaultPermissionMode as f, BUILTIN_SUBAGENT_DEFINITIONS as g, sanitizeServeSettingsEnv as h, OPERATING_DEFAULTS_DIGEST as i, prependOperatingDefaultsToMirroredClaudeMd as l, planModeAllowRules as m, INJECTED_SKILLS as n, appendToolbeltAwarenessToMirroredClaudeMd as o, injectAllowRules as p, writeInjectedSkill as r, buildOperatingDefaultsDirective as s, injectAttributionSuppressionIntoSettingsFile as t, prependStyleDirectiveToMirroredClaudeMd as u, resolveCodexCliBackend as v, writePeerMcpRuntimeFiles as x, resolveGroupKeysFromMirror as y };
2361
2388
 
2362
- //# sourceMappingURL=attribution-settings-B8M2fvhz.js.map
2389
+ //# sourceMappingURL=attribution-settings-Cmz2jt7P.js.map