Every surface in PropFlow that calls an LLM, and which model actually drives it. Built because "the default model" meant four different things depending on where you stood.
origin/main
agent-smith origin/main @ 0ce1685
Runtime live process + launchd inspection, mini + mac
Fable 5 is reserved for one thing: Agent Smith's deep-think tier (MODEL_HIGH — PRs, final logic, in-depth plans). Nothing else in the estate should be on Fable. Everything that was — the nightly fan-out, the global interactive default — moves to Opus 5.
Corollary for the API tiers: MODEL_MEDIUM and MODEL_HIGH must stay concrete model ids. They reach the Messages API directly, and the API 404s on the Claude Code literal default — that is a CLI-only concept. No auto-tracking API alias exists either (claude-opus-latest, opus, claude-opus all 404), so a future Opus bump is a deliberate one-line change. On the CLI side (pf, mpf, start) default works and does auto-track — use it there.
Read the Effective column, not the default. Several surfaces are overridden at runtime by an env var or a launchd plist, and in at least one case the override disagrees with the recorded intent — see Drift & open questions.
How a human-driven session picks its model. All of this lives in the dotclaude repo, synced across both machines.
| Surface | Effective model | Where it's set |
|---|---|---|
pf / mpf / yolo-claude |
Opus 5 via literal default |
PF_DEFAULT_MODEL~/.claude/shell/aliases.sh:14 |
start workspace restore |
Opus 5 for new records; an existing record keeps its own pinned model | DEFAULT_MODELscripts/session-start.py:36, scripts/session-set.py:56 |
plain claude, --resume, --bg |
Fable 5 claude-fable-5[1m] |
global settings pin~/.claude/settings.json:133 — see drift #2 |
| 24 long-lived tmux sessions | Opus 4.8 until relaunched | pinned at process start by the old pf; 20 on mini, 4 on mac |
Why the literal string default rather than claude-opus-5[1m]: it tracks the recommended model automatically, it overrides the settings.json pin, and it has no brackets — which matters, because the tmux/ssh command strings and the session-set scraper regex (--model\s+([\w.-]+)) both mangle a bracketed id.
Smith sizes the model per task via three tiers (src/agent_smith/activities/model_tier.py): quick → LOW, investigate → MEDIUM, heavy → HIGH. Defaults are in src/agent_smith/config.py; every one is env-overridable.
| Tier / surface | Drives | Default | Effective now |
|---|---|---|---|
MODEL_LOW |
Conversation + every classifier (intent, loop-closer, marketing) | Sonnet 5config.py:873 |
same |
MODEL_MEDIUM |
Investigation, debugging + the LinkedIn / marketing composers | Opus 5config.py:874 |
Opus 4.8 until deploy |
MODEL_HIGH |
The hardest work — PRs, final logic, in-depth planning. The only Fable surface in the estate. | Fable 5config.py:875 |
same |
SMITH_HOOK_MODEL |
Smith's own hooks | Haiku 4.5config.py:833 |
same |
| Nightly fan-out workers | The autonomy program's per-task workers | Opus 5task_fanout.py:43 |
Opus 5live 2026-07-25 |
| Surface | Model | Where |
|---|---|---|
| LinkedIn composer | Follows MODEL_MEDIUMwas a pinned Sonnet 4.6 · pending deploy | LINKEDIN_COMPOSER_MODEL · linkedin/composer.py:27 |
| Marketing refine | Follows MODEL_MEDIUMwas a pinned Sonnet 4.6 · pending deploy | MARKETING_REFINE_MODEL · activities/marketing_refine.py:71 |
| Bot | Model | Notes |
|---|---|---|
| propflowai PR review | Opus 5 | All five size tiers. Effort + turn budget scale: tiny 30 / medium 60 / large 100 / huge 150 / mega 300..github/workflows/claude-code-review.yml:214–225 |
propflowai @claude mention |
Opus 5 | .github/workflows/claude.yml:175,224 |
| propflowai type-sync | Sonnet 4.6 | Mechanical codegen sync.claude-type-sync.yml:144 |
| agent-smith PR review + mention | Opus 4.8 | Lags propflowai by a release — see drift #3.agent-smith/.github/workflows/{claude-code-review,claude}.yml |
| Codex second reviewer | gpt-5.6-sol | Deliberately non-Anthropic — an outside opinion on the same diff..claude/skills/codex-review/codex-review.sh:32 |
Two constants drive nearly everything, both in src/lib/platform/ai/client.ts. Reach for the named constant, never a literal model id.
| Surface | Model | Where |
|---|---|---|
AGENT_MODEL |
Sonnet 4.6 | Clara's conversation loop, all channels. Overridable by CLAUDE_MODEL.client.ts:183 |
FAST_MODEL |
Haiku 4.5 | Email classify, spam, offer/signal/tour extraction. Hard-pinned, no env.client.ts:184 |
| Maestro precheck | Haiku 4.5 | Follows FAST_MODEL · MAESTRO_PRECHECK_MODELdomain/maestro/models.ts:32 |
| Maestro reasoning | Sonnet 4.6 | Follows AGENT_MODEL · MAESTRO_REASONING_MODELdomain/maestro/models.ts:42 |
| ElevenLabs voice agents (×8) | Sonnet 4.6 | Set per-agent in config, synced to ElevenLabs.config/elevenlabs-agents.json |
| PM-commitment extraction | Haiku 4.5 | Local const, bypasses FAST_MODEL.agents/clara/lib/email/extract-pm-commitments.ts:49 |
| Maintenance manual parser | Haiku 4.5 | data/maintenance-manuals.json:58 |
Evals pin models deliberately — a moving judge makes scores incomparable across runs.
| Suite | Subject | Judge |
|---|---|---|
| Gauntlet — main + leasing | Sonnet 4.6 | Sonnet 4.6 |
| Gauntlet — renewals | Sonnet 4.6 | Haiku 4.5 |
| promptfoo domain suites | Sonnet 4.6 and/or Haiku 4.5 per config | |
| Tenant simulator | Sonnet 4.6 default, per-run overridable | |
The code default said claude-fable-5, but the worker's launchd plist set SMITH_FANOUT_WORKER_MODEL=claude-haiku-4-5 — a large capability drop for overnight autonomous work, invisible unless you read the plist. Caught by diffing config defaults against the live worker process.
Now claude-opus-5 on both sides: the plist was repointed and the worker reloaded (a kickstart is not enough — launchd caches the plist, so it takes bootout + bootstrap), and the code default follows in the model-tiering change. Once that deploys, the plist override is redundant and should be deleted so the code is the single source.
~/.claude/settings.json pins claude-fable-5[1m]. The last deliberate setting on record was "model": "opus"; the Fable pin entered in a commit about an unrelated tmux alias, which is the signature of Claude Code rewriting settings.json after a /model switch and the change getting swept into the next commit.
Consequence: pf/mpf now give Opus 5, but plain claude, --resume and background sessions still inherit Fable 5. This is the last Fable surface outside the deep-think tier, and the last thing between the estate and an Opus 5 default. Still open — it needs the "model" key removed from settings.json so the session falls through to the recommended default.
propflowai reviews on Opus 5; agent-smith reviews on Opus 4.8. Same bot, same job, different model — so a Smith PR gets a weaker review than an identical propflowai PR. One-line bump in two workflow files.
AGENT_MODEL defaults to Sonnet 4.6 but honours CLAUDE_MODEL. Whether that env var is set in Vercel production was not checked in this audit — everything above is read from source and from local runtime. If it's set, Clara's live model differs from what this table says.
claude-opus-5[1m]) into a shell string or a scraped command line — brackets get glob-expanded and regex-truncated. Use default or an unbracketed alias.default over a version pin for interactive tooling. Every pin in this audit was stale — 4.7, 4.8, Fable — and none was stale on purpose.AGENT_MODEL / FAST_MODEL, never a literal id. Two files here already drifted by hardcoding Haiku.