Model profiles
Three profiles map every agent onto a model tier. What each costs, and why budget isn’t Haiku everywhere.
Switching profile
/devflow:set-profile quality
/devflow:set-profile balanced
/devflow:set-profile budget
Or for one run only, without changing any files:
/devflow:build 4 --model budget
The assignment table
Generated from references/model-profiles.json:
| Agent | Role | Quality | Balanced | Budget |
|---|---|---|---|---|
codebase-mapper | Analyzes a codebase from a specific angle (stack, architecture, quality, or concerns) and writes structured findings. | sonnet | haiku | haiku |
debuggereffort xhigh | Investigates bugs using a structured scientific method with persistent session state across context resets. | opus | sonnet | sonnet |
executoreffort xhigh | Executes planned tasks with atomic git commits, handles deviations, and manages checkpoints during builds. | opus | sonnet | sonnet |
integration-checker | Verifies that separately-built features connect properly and end-to-end user workflows actually work. | sonnet | sonnet | haiku |
job-checker | Reviews execution plans before they run to verify they will actually achieve the objective goal. | sonnet | sonnet | haiku |
objective-researcher | Researches how to implement an objective — discovers best practices, patterns, and pitfalls before planning begins. | opus | sonnet | haiku |
plannereffort xhigh | Creates detailed execution plans for objectives with task breakdown, dependency ordering, and built-in quality checks. | opus | opus | sonnet |
project-researcher | Researches the domain ecosystem for a new project — stack options, architecture patterns, features, and common pitfalls. | opus | sonnet | haiku |
research-synthesizer | Combines findings from multiple parallel research agents into a unified summary for roadmap creation. | sonnet | sonnet | haiku |
roadmappereffort high | Creates project roadmaps by breaking requirements into ordered objectives with success criteria and dependency mapping. | opus | sonnet | sonnet |
security-auditoreffort xhigh | Scans codebase for security vulnerabilities in a specific domain: secrets, auth flows, or dependency risks. | opus | sonnet | sonnet |
ui-evaluatoreffort high | Machine-judges the visual correctness of Flutter UI states by capturing each declared surface, scoring it through the offline visual-eval engine, and writing evidence the verifier consumes. | opus | sonnet | sonnet |
verifier | Verifies that built code actually achieves the objective goal, not just that tasks were completed. | sonnet | sonnet | haiku |
The assignment is not uniform, and that is the point. Under budget, planner
still drops only to Sonnet while codebase-mapper drops to Haiku — a bad plan
costs a whole build, a slightly worse codebase map costs a re-read.
Tier → model
| Tier | Model |
|---|---|
opus | claude-opus-5 |
sonnet | claude-sonnet-5 |
haiku | claude-haiku-4-5 |
How resolution works
df-tools resolve-model planner
df-tools resolve-model df-planner # the df- prefix is accepted too
resolve-model emits a Task() model alias, not a model id. The opus tier
resolves to inherit, which means the agent keeps whatever model the session is
running — it does not pin Opus. That is deliberate: if you are driving a session on
a particular model, agents at the top tier should follow you rather than override
you.
Two maps, different consumers
model-profiles.json holds two maps and they are consumed by different code:
models{}— tier to concrete API model id. This one is live:flutter-ui-eval.cjssends it to the Messages API for the vision judge. A stale id here is a real runtime defect, not a documentation slip.agents{}— agent to tier per profile. Consumed byresolve-model.
Keep both current when models ship.
Effort is not set here
Task() takes no effort argument, so reasoning effort lives in each agent’s own
frontmatter rather than in the profile table.
---
name: executor
effort: xhigh
---
Haiku rejects effort
Haiku 4.5 rejects theeffort parameter entirely. An agent that can resolve to
Haiku under the budget profile must not declare effort.Choosing a profile
quality — planner, executor, both researchers, debugger,
security-auditor and ui-evaluator on Opus. Use it for work where being wrong is
expensive: architecture, security, anything touching money or auth.
balanced — the default. planner stays on Opus because plan quality
propagates into everything downstream; execution and verification drop to Sonnet.
budget — nothing on Opus. Research and mapping drop to Haiku. Appropriate for
prototypes, spikes and well-understood mechanical work.
Per-objective override
The intent model sets model_profile per
(kind, work) cell, so a spike automatically runs on budget even when your
project default is quality. Override it explicitly on OBJECTIVE.md:
---
work: prototype
overrides:
model_profile: balanced
---
Or via the environment for a single invocation:
DEVFLOW_MODEL_PROFILE=budget claude