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:

AgentRoleQualityBalancedBudget
codebase-mapperAnalyzes a codebase from a specific angle (stack, architecture, quality, or concerns) and writes structured findings.sonnethaikuhaiku
debugger
effort xhigh
Investigates bugs using a structured scientific method with persistent session state across context resets.opussonnetsonnet
executor
effort xhigh
Executes planned tasks with atomic git commits, handles deviations, and manages checkpoints during builds.opussonnetsonnet
integration-checkerVerifies that separately-built features connect properly and end-to-end user workflows actually work.sonnetsonnethaiku
job-checkerReviews execution plans before they run to verify they will actually achieve the objective goal.sonnetsonnethaiku
objective-researcherResearches how to implement an objective — discovers best practices, patterns, and pitfalls before planning begins.opussonnethaiku
planner
effort xhigh
Creates detailed execution plans for objectives with task breakdown, dependency ordering, and built-in quality checks.opusopussonnet
project-researcherResearches the domain ecosystem for a new project — stack options, architecture patterns, features, and common pitfalls.opussonnethaiku
research-synthesizerCombines findings from multiple parallel research agents into a unified summary for roadmap creation.sonnetsonnethaiku
roadmapper
effort high
Creates project roadmaps by breaking requirements into ordered objectives with success criteria and dependency mapping.opussonnetsonnet
security-auditor
effort xhigh
Scans codebase for security vulnerabilities in a specific domain: secrets, auth flows, or dependency risks.opussonnetsonnet
ui-evaluator
effort 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.opussonnetsonnet
verifierVerifies that built code actually achieves the objective goal, not just that tasks were completed.sonnetsonnethaiku

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

TierModel
opusclaude-opus-5
sonnetclaude-sonnet-5
haikuclaude-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.cjs sends 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 by resolve-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 the effort parameter entirely. An agent that can resolve to Haiku under the budget profile must not declare effort.

Choosing a profile

qualityplanner, 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