Routing controls which mode, harness (provider + model), and reasoning
effort a task starts with. You configure it as a table of configs on the
Routing settings page. The first message of a task is matched against your
configs and routed to the one that applies.
Configs
Each config has four columns:
| Column | What it sets |
|---|
| Trigger | The keyword that selects this config (e.g. ultra). |
| Mode | agent (start working), plan (plan first), goal (track a goal), or ask (answer read-only, no code edits). |
| Harness | The provider + model the task runs on (e.g. Codex GPT 5.5). |
| Effort | Reasoning effort: low, medium, high, xhigh (+ ultracode for Claude Code). |
The default config
Every workspace has an undeletable default config. It applies to any task
that doesn’t match another trigger. New workspaces default to agent mode,
Codex GPT 5.5, medium effort. Edit this row to change the default model and
effort for the whole workspace.
Custom configs
Add a config, give it a trigger, and pick its mode / harness / effort. Starting
a task with that trigger routes to the config — and the trigger is removed from
the message before the agent sees it. For example, a config with the trigger
ultra:
@twill /ultra fix the failing test
runs the ultra config (its harness, effort, and mode) on the request
fix the failing test.
How triggers fire per integration
Triggers fire differently depending on the integration:
| Integration | How a config is selected |
|---|
| Slack, Notion, Asana | A /trigger in the message/comment text. |
| GitHub | A /trigger in the issue/comment text, or an issue label matching the trigger. |
| Linear | An issue label matching the trigger. |
| In-app composer | Pick the mode, model, and effort directly. |
Routing applies to the first message of a task. Follow-ups continue on the
task’s existing harness.