Models and effort are chosen per runtime, from what it offers
A runtime configuration and a role could each name a model in free text; the role's replaced the
configuration's, but only when the role required one runtime kind, since a model is named by its
runtime (ADR 0006, ADR 0019). Nothing else could be set, so every run thought as hard as its
runtime's default: Codex at low reasoning effort, whatever the work. And nothing showed what a
runtime offers, so a misspelt model surfaced only when a run failed on it. We decided that a
runtime configuration and a role each set a model and an effort, a role per runtime kind, and that
Mission Control learns what each runtime offers from the sessions it opens. A role holds settings
per kind (codex: gpt-6.1-sol, high; claude-code: opus, high), so it keeps them whichever
configuration serves it; requiring a kind stays a choice of its own. Each of the role's settings
replaces the configuration's, and either may be left to the one below it, down to the runtime's own
default. At the start of a session Mission Control sets the model, then the effort, through the
session's ACP config options of category model and thought_level, matched as models are (the
id, else one name, else one part). Every session's options are recorded on the configuration it ran
on: the models, and the efforts each model offers, which the web app and the CLI show as choices.
Considered Options
- The model and effort as one id, as Codex's older model list writes them (
gpt-6.1-sol[high]): rejected; it is one runtime's notation, Claude Code's bracket means a context window, and both bridges now offer effort as an option of its own. - One model per role that requires a kind: what we had. Rejected; a role served by either kind could not choose for both, and requiring a kind only to name a model narrowed who could serve it.
- Starting a session only to read a runtime's options when a configuration is saved: deferred; it starts a container, signs in and spends a session for a list the first run reads anyway. Until a configuration has run, its fields take free text, matched at the session's start.
- More settings per kind (fast mode, approval mode): deferred; the mode is Mission Control's to set (a contained Codex runs with full access), and nothing asks for fast mode yet.
- Leaving an unmatched effort to the runtime's default: rejected; a run that silently thinks less than asked is worse than one that fails naming what is offered, as a model already does.
Consequences
- The effort follows the model. The runtime lists efforts for the model the session is on, so Mission Control sets the effort after the model, and a model without an effort setting fails a run that asks for one.
- What is offered is learned, not known. A configuration shows choices after its first session; the role editor shows, per kind, what the organization's configurations of that kind have offered. A value no longer offered stays shown as it is, and fails the next run that uses it.
- Revisions from before keep their meaning: a role revision with a kind and a model restores as that kind's model.
- Supersedes the part of ADR 0019 where a role's model needs a required kind.