Model Inventory — what runs on what

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.

Audited 2026-07-25 propflowai origin/main agent-smith origin/main @ 0ce1685 Runtime live process + launchd inspection, mini + mac

The policy

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.

1 · Interactive Claude Code (mini + mac)

How a human-driven session picks its model. All of this lives in the dotclaude repo, synced across both machines.

SurfaceEffective modelWhere 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.

2 · Agent Smith runtime

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 / surfaceDrivesDefaultEffective 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

3 · Smith-adjacent

SurfaceModelWhere
LinkedIn composerFollows MODEL_MEDIUMwas a pinned Sonnet 4.6 · pending deployLINKEDIN_COMPOSER_MODEL · linkedin/composer.py:27
Marketing refineFollows MODEL_MEDIUMwas a pinned Sonnet 4.6 · pending deployMARKETING_REFINE_MODEL · activities/marketing_refine.py:71

4 · GitHub reviewers & CI

BotModelNotes
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

5 · Product runtime — Clara & the app

Two constants drive nearly everything, both in src/lib/platform/ai/client.ts. Reach for the named constant, never a literal model id.

SurfaceModelWhere
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

6 · Evals

Evals pin models deliberately — a moving judge makes scores incomparable across runs.

SuiteSubjectJudge
Gauntlet — main + leasingSonnet 4.6Sonnet 4.6
Gauntlet — renewalsSonnet 4.6Haiku 4.5
promptfoo domain suitesSonnet 4.6 and/or Haiku 4.5 per config
Tenant simulatorSonnet 4.6 default, per-run overridable

7 · Drift & open questions

#1 — Smith's nightly fan-out was silently on Haiku 4.5 fixed 2026-07-25

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.

#2 — The global interactive default is pinned to Fable 5, and it arrived as drift

~/.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.

#3 — agent-smith's own PR reviewer is a release behind

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.

#4 — Unverified: Clara's live production model

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.

Rules of thumb

PropFlow Docs