docs/adr/0003-model-catalog-module.md
We decided to centralize model-selection data in one Model Catalog Module so the SDK, the CLI/CJS layer, and the docs do not maintain separate agent lists, profile maps, or runtime tier defaults.
Before this ADR there were four drifting sources:
get-shit-done/bin/lib/model-profiles.cjs — agent → profile alias map, phase-type map, dynamic-routing default tierssdk/src/query/config-query.ts — stale 18-agent copy of MODEL_PROFILESget-shit-done/workflows/settings-advanced.md — runtime → built-in model-id tablesdk/src/session-runner.ts — hardcoded Claude-only profile → model-id mapThis caused issue #3229: the SDK knew only 18 agents while 33 agent files existed on disk, so ~15 agents silently fell back to Sonnet with unknown_agent: true.
Create one machine-readable catalog and derive everything else from it.
The catalog owns:
opus / sonnet / haiku) and runtime capabilities (e.g. reasoning_effort support)balanced, budget, and adaptiveThe canonical file lives in a location both packages ship:
get-shit-done-cc) includes it@gsd-build/sdk) includes itBoth CJS and SDK load this exact file. Neither package keeps its own independent list.
The catalog stores a golden alias per agent. quality is defined as the golden profile exactly. Other profiles (balanced, budget, adaptive) are explicit views over the same agent registry. This keeps the highest-quality intent in one place while allowing lower-cost profiles to differ per agent where needed.
resolve-model in SDK and CJS read the same registry, so missing-agent drift disappearssettings-advanced.md runtime tier table must stay in parity with the catalog (enforced by test)sdk/src/query/helpers.ts runtime list comes from the catalog, fixing drift like the missing hermes runtimesdk/src/session-runner.ts uses the catalog's Claude runtime tier defaults instead of a private hardcoded profile mapagents/gsd-*.md file exists in the catalogquality→opus, budget→haiku, etc.), not a hardcoded sonnet