Skip to main content
GSD Core assigns a model tier to each of its specialized agents based on the active model profile. Rather than running every agent on the most expensive model, profiles let you allocate compute intentionally — Opus for the agents where reasoning quality drives the outcome, Sonnet for workhorses, and Haiku for fast scanners and mappers. Dynamic routing and effort control let you push that further: start cheap and escalate only when an agent fails its quality gate.

Built-in profiles

Set model_profile in config.json or switch profiles instantly with /gsd-config --profile <name>.
Uses Opus for all decision-making agents and Sonnet for verification. Best for quota-rich environments and critical architecture work where output quality is the top priority.

Agent tier assignments

The table below shows how the five most-used agents resolve under each profile. The tier names (Opus, Sonnet, Haiku) are resolved to runtime-native model IDs when runtime is set in config.json.
Agentqualitybalancedbudgetadaptiveinherit
gsd-plannerOpusOpusSonnetOpusInherit
gsd-executorOpusSonnetSonnetSonnetInherit
gsd-phase-researcherOpusSonnetHaikuSonnetInherit
gsd-verifierSonnetSonnetHaikuSonnetInherit
gsd-codebase-mapperSonnetHaikuHaikuHaikuInherit
The full catalog covers all 33 shipped agents with explicit per-profile tier assignments. These five represent the most frequently invoked agents during a standard phase lifecycle.

Per-agent overrides

Override individual agents without changing the profile for everything else. This is useful when you want one agent to use a more powerful model than the profile assigns.
{
  "model_profile": "balanced",
  "model_overrides": {
    "gsd-executor": "opus",
    "gsd-codebase-mapper": "haiku"
  }
}
Valid override values: opus, sonnet, haiku, inherit, or a fully-qualified model ID such as "openai/o3" or "google/gemini-2.5-pro".

Per-phase-type model assignment

The models block lets you tune at the phase level without knowing individual agent names. Specify a tier for each phase type and GSD applies it to all agents in that category.
{
  "model_profile": "balanced",
  "models": {
    "planning": "opus",
    "research": "sonnet",
    "execution": "opus",
    "verification": "sonnet"
  }
}
Phase typeAgents included
planninggsd-planner, gsd-roadmapper, gsd-pattern-mapper
researchgsd-phase-researcher, gsd-project-researcher, gsd-codebase-mapper, gsd-ui-researcher
executiongsd-executor, gsd-debugger, gsd-doc-writer
verificationgsd-verifier, gsd-plan-checker, gsd-nyquist-auditor, gsd-ui-checker
Resolution precedence (highest to lowest):
  1. model_overrides[<agent>] — per-agent exception, wins over everything
  2. dynamic_routing.tier_models[<tier>] — when dynamic routing is enabled
  3. models[<phase_type>] — coarse phase-level tier
  4. model_profile — global profile tier per agent
  5. Runtime default

Dynamic routing with failure-tier escalation

Dynamic routing lets agents start on a cheaper tier and escalate automatically when the orchestrator detects a soft failure (plan-check FLAG, verification inconclusive). Enable it with dynamic_routing.enabled: true.
{
  "dynamic_routing": {
    "enabled": true,
    "tier_models": {
      "light":    "haiku",
      "standard": "sonnet",
      "heavy":    "opus"
    },
    "escalate_on_failure": true,
    "max_escalations": 1
  }
}
Each agent is pre-assigned to one of three default tiers based on its role:
TierExamplesUse case
lightgsd-codebase-mapper, gsd-nyquist-auditor, gsd-plan-checkerFast mappers, scanners, low-stakes audits
standardgsd-executor, gsd-verifier, gsd-phase-researcherDefault workhorse agents
heavygsd-planner, gsd-roadmapper, gsd-debuggerDeep reasoning — these agents are already at the top tier
KeyTypeDefaultDescription
dynamic_routing.enabledbooleanfalseMaster switch. true activates the dynamic resolver.
dynamic_routing.tier_models.lighttier alias(none)Model for the light tier, typically haiku.
dynamic_routing.tier_models.standardtier alias(none)Model for the standard tier, typically sonnet.
dynamic_routing.tier_models.heavytier alias(none)Model for the heavy tier, typically opus.
dynamic_routing.escalate_on_failurebooleantrueWhen false, every attempt uses the default tier regardless of failure.
dynamic_routing.max_escalationsinteger1Hard cap on retry escalations per agent invocation.

Effort control

Control the reasoning effort of each agent invocation independently of model tier. The universal effort ladder is:
minimal < low < medium < high < xhigh < max
Effort is rendered per-runtime: output_config.effort for Claude, model_reasoning_effort for Codex. Cross-provider clamping applies: max is Anthropic-only and clamps to xhigh on Codex; minimal is Codex-only and clamps to low on Claude.
{
  "effort": {
    "default": "high",
    "routing_tier_defaults": {
      "light":    "low",
      "standard": "high",
      "heavy":    "xhigh"
    },
    "agent_overrides": {
      "gsd-planner": "max"
    }
  }
}
KeyDefaultDescription
effort.default"high"Global fallback effort level when no tier or agent override matches.
effort.routing_tier_defaults.light"low"Effort for light-tier agents.
effort.routing_tier_defaults.standard"high"Effort for standard-tier agents.
effort.routing_tier_defaults.heavy"xhigh"Effort for heavy-tier agents.
effort.agent_overrides.<agent-id>(none)Per-agent effort override; beats all tier defaults.
Effort precedence (highest to lowest):
  1. Invocation override (e.g. --effort flag on resolve-execution)
  2. effort.agent_overrides[<agent-id>]
  3. effort.routing_tier_defaults[<light|standard|heavy>]
  4. effort.default
  5. "high" (universal default)

Model policy presets

Model policy presets let you pick a provider family and a budget level, and have GSD materialize the concrete (opus, sonnet, haiku) tier mappings for you — no need to spell out every model ID by hand. Use a preset when you want a known-good mapping for a given vendor; fall back to generic when you want full control over individual model IDs.
{
  "model_policy": {
    "provider": "anthropic",
    "budget": "high"
  }
}
KeyTypeValuesDescription
model_policy.providerenumopenai, anthropic, anthropic-fable, google, qwen, genericDeclares the model provider. Known providers unlock catalog-backed presets. generic treats all model IDs as opaque strings — no prefix inference, no reasoning-effort defaults.
model_policy.budgetenumhigh, medium, lowSelects a budget tier when using a known provider. GSD materializes the matching catalog preset into explicit tier mappings at resolve time. Ignored when provider is generic.
model_policy.high / medium / lowstringmodel IDTier model IDs for generic provider only.

Anthropic presets

GSD ships two Anthropic-family presets so you can decide whether to stay on the standard Opus 4.8 lineup or opt into Claude Fable 5 for top-tier routing. Both presets share the Sonnet 4.6 and Haiku 4.5 fallback tiers; they only differ at the high end.
ProviderBudgethighmediumlow
anthropichighclaude-opus-4-8claude-opus-4-8claude-sonnet-4-6
anthropicmediumclaude-opus-4-8claude-sonnet-4-6claude-haiku-4-5
anthropiclowclaude-haiku-4-5claude-haiku-4-5claude-haiku-4-5
anthropic-fablehighclaude-fable-5claude-fable-5claude-sonnet-4-6
anthropic-fablemediumclaude-opus-4-8claude-sonnet-4-6claude-haiku-4-5
anthropic-fablelowclaude-haiku-4-5claude-haiku-4-5claude-haiku-4-5
Use anthropic-fable when you want Claude Fable 5 — an Opus-tier model with a 1M-token context window, 128K max output, and adaptive thinking at the xhigh effort level — to handle high-budget Opus and Sonnet routing. The medium and low budgets fall back to the same Opus 4.8 / Sonnet 4.6 / Haiku 4.5 mix as the standard anthropic preset, so opting in only affects the top tier.
Claude Fable 5 is available through Anthropic direct, Anthropic on Vertex AI, Amazon Bedrock, and OpenRouter. Make sure your selected runtime can reach at least one of those providers before switching to the anthropic-fable preset.
If you set context_window: 1000000 to use Claude Fable 5’s full 1M-token window, GSD also enables adaptive context enrichment (deeper SUMMARY.md and anti-pattern reads).

Profile philosophy

ProfilePhilosophyWhen to use
qualityOpus for all decision-making, Sonnet for verificationQuota available; critical architecture work
balancedOpus for planning only, Sonnet for everything elseNormal development (recommended default)
budgetSonnet for code-writing, Haiku for research/verificationHigh-volume work, less critical phases
inheritAll agents follow the session modelNon-Anthropic providers, OpenRouter, local models