{
 "capture": {
  "ompVersion": "17.3.3",
  "capturedAt": "2026-08-14T08:49:12.353745+00:00",
  "terminal": "Ghostty",
  "fontSize": 11,
  "cols": 132,
  "rows": 32,
  "isolation": "temporary PI_CODING_AGENT_DIR; only local modelRoles and cycleOrder copied; provider keys and auth state excluded",
  "exampleSource": "one real local set of role assignments, captured without credentials",
  "overlay": {
   "modelRoles.default": "openai-codex/gpt-5.6-sol:medium",
   "modelRoles.smol": "openai-codex/gpt-5.6-luna:high",
   "modelRoles.slow": "openai-codex/gpt-5.6-sol:high",
   "modelRoles.vision": "anthropic/claude-opus-5:medium",
   "modelRoles.plan": "openai-codex/gpt-5.6-sol:high",
   "modelRoles.designer": "anthropic/claude-opus-5:high",
   "modelRoles.commit": "openai-codex/gpt-5.6-luna:high",
   "modelRoles.tiny": "openai-codex/gpt-5.6-luna:high",
   "modelRoles.task": "openai-codex/gpt-5.6-terra:high",
   "modelRoles.advisor": "openai-codex/gpt-5.6-sol:high",
   "cycleOrder": [
    "smol",
    "slow",
    "default"
   ],
   "retry.fallbackChains": "{\"default\":[\"anthropic/claude-opus-5:medium\",\"openai-codex/gpt-5.6-terra:high\"],\"smol\":[\"google-antigravity/gemini-3.7-flash:high\"],\"slow\":[\"anthropic/claude-opus-5:medium\",\"openai-codex/gpt-5.6-terra:high\"],\"openai-codex/*\":[\"anthropic/claude-opus-5:medium\"]}",
   "advisor.enabled": true,
   "prewalk.enabled": true
  }
 },
 "views": [
  {
   "view": "all-models",
   "viewLabel": "All models",
   "caption": "Every model you can use, one per row, with its context window and price per million tokens.",
   "png": "all-models.png",
   "webp": "all-models.webp",
   "assetVersion": "7a25e18f70",
   "width": 1748,
   "height": 1008,
   "cols": 132,
   "rows": 32,
   "cellH": 0.028802,
   "cellW": 0.007381,
   "gridLeft": 0.012586,
   "splitCol": 29,
   "rowTop": {
    "0": 0.052067,
    "1": 0.080869,
    "2": 0.109671,
    "3": 0.138473,
    "4": 0.167275,
    "5": 0.196077,
    "6": 0.224878,
    "7": 0.25368,
    "8": 0.282482,
    "9": 0.311284,
    "10": 0.340086,
    "11": 0.368888,
    "12": 0.397689,
    "13": 0.426491,
    "14": 0.455293,
    "15": 0.484095,
    "16": 0.512897,
    "17": 0.541699,
    "18": 0.570501,
    "19": 0.599302,
    "20": 0.628104,
    "21": 0.656906,
    "22": 0.685708,
    "23": 0.71451,
    "24": 0.743312,
    "25": 0.772113,
    "26": 0.800915,
    "27": 0.829717,
    "28": 0.858519,
    "29": 0.887321,
    "30": 0.916123,
    "31": 0.944924
   },
   "droppedRows": [],
   "regions": [
    {
     "id": "rail",
     "row": 1,
     "rows": 28,
     "col": 1.0,
     "cells": 27.0,
     "label": "Provider list",
     "gloss": "Every provider OMP knows about. A filled dot means it found a key or a login for that one; a hollow dot means it did not, so those models stay hidden. The number is how many of that provider's models you can actually use. The two rows at the top switch the right-hand side between your roles and the full model list."
    },
    {
     "id": "filter",
     "row": 2,
     "rows": 1,
     "col": 30.2,
     "cells": 100.6,
     "label": "Search",
     "gloss": "Start typing; there is no search mode to enter first. The model list narrows as you type and the provider counts follow it. Matching is loose, so `opus` finds `claude-opus-5`."
    },
    {
     "id": "catalog",
     "row": 4,
     "rows": 22,
     "col": 30.2,
     "cells": 100.6,
     "label": "Model rows",
     "gloss": "One row per model you can use, showing `provider/model`, how much text it holds at once, and the price per million tokens in and out. Models you have no key or login for are not listed at all."
    },
    {
     "id": "detail",
     "row": 27,
     "rows": 2,
     "col": 30.2,
     "cells": 100.6,
     "label": "Highlighted model",
     "gloss": "Everything known about the model your cursor is on: how much text it holds, how much it can write back, price, what it can handle such as images or tools, and which roles already use it."
    },
    {
     "id": "bar",
     "row": 30,
     "rows": 1,
     "col": 1.0,
     "cells": 129.8,
     "label": "Key hints",
     "gloss": "The bottom line always shows which keys work right now, and it changes as you move around the screen. There is no save step; every change is written as you make it."
    }
   ]
  },
  {
   "view": "roles",
   "viewLabel": "Roles",
   "caption": "The ten roles, the backup models under each one, and the Ctrl+P list along the bottom.",
   "png": "roles.png",
   "webp": "roles.webp",
   "assetVersion": "31792f3b69",
   "width": 1748,
   "height": 1008,
   "cols": 132,
   "rows": 32,
   "cellH": 0.028802,
   "cellW": 0.007381,
   "gridLeft": 0.012586,
   "splitCol": 29,
   "rowTop": {
    "0": 0.052067,
    "1": 0.080869,
    "2": 0.109671,
    "3": 0.138473,
    "4": 0.167275,
    "5": 0.196077,
    "6": 0.224878,
    "7": 0.25368,
    "8": 0.282482,
    "9": 0.311284,
    "10": 0.340086,
    "11": 0.368888,
    "12": 0.397689,
    "13": 0.426491,
    "14": 0.455293,
    "15": 0.484095,
    "16": 0.512897,
    "17": 0.541699,
    "18": 0.570501,
    "19": 0.599302,
    "20": 0.628104,
    "21": 0.656906,
    "22": 0.685708,
    "23": 0.71451,
    "24": 0.743312,
    "25": 0.772113,
    "26": 0.800915,
    "27": 0.829717,
    "28": 0.858519,
    "29": 0.887321,
    "30": 0.916123,
    "31": 0.944924
   },
   "droppedRows": [],
   "regions": [
    {
     "id": "rail",
     "row": 1,
     "rows": 28,
     "col": 1.0,
     "cells": 27.0,
     "label": "Provider list",
     "gloss": "Every provider OMP knows about. A filled dot means it found a key or a login for that one; a hollow dot means it did not, so those models stay hidden. The number is how many of that provider's models you can actually use. The two rows at the top switch the right-hand side between your roles and the full model list."
    },
    {
     "id": "roletable",
     "row": 3,
     "rows": 16,
     "col": 30.2,
     "cells": 100.6,
     "label": "Role table",
     "gloss": "The ten roles, each with the model it holds and how hard that model thinks. The indented rows underneath a role are its backup models, tried in order; the ↻ badge counts them. Clear a role and the choice goes back to OMP."
    },
    {
     "id": "patterns",
     "row": 20,
     "rows": 3,
     "col": 30.2,
     "cells": 100.6,
     "label": "Whole-provider backups",
     "gloss": "One backup list that covers a provider instead of a single role. A key like `anthropic/*` applies to every Anthropic model at once, so you do not repeat the same chain ten times."
    },
    {
     "id": "cycle",
     "row": 28,
     "rows": 1,
     "col": 30.2,
     "cells": 100.6,
     "label": "Ctrl+P cycle",
     "gloss": "The short list Ctrl+P walks through while you are working, saved as `cycleOrder`. It starts as smol, default, slow. Press `c` on a role to add or remove it."
    },
    {
     "id": "bar",
     "row": 30,
     "rows": 1,
     "col": 1.0,
     "cells": 129.8,
     "label": "Key hints",
     "gloss": "The bottom line always shows which keys work right now, and it changes as you move around the screen. There is no save step; every change is written as you make it."
    }
   ]
  },
  {
   "view": "role-actions",
   "viewLabel": "Role focused",
   "caption": "Move onto a role and the bottom line becomes the things you can do to that role.",
   "png": "role-actions.png",
   "webp": "role-actions.webp",
   "assetVersion": "d40c9d8ae0",
   "width": 1748,
   "height": 1008,
   "cols": 132,
   "rows": 32,
   "cellH": 0.028802,
   "cellW": 0.007381,
   "gridLeft": 0.012586,
   "splitCol": 29,
   "rowTop": {
    "0": 0.052067,
    "1": 0.080869,
    "2": 0.109671,
    "3": 0.138473,
    "4": 0.167275,
    "5": 0.196077,
    "6": 0.224878,
    "7": 0.25368,
    "8": 0.282482,
    "9": 0.311284,
    "10": 0.340086,
    "11": 0.368888,
    "12": 0.397689,
    "13": 0.426491,
    "14": 0.455293,
    "15": 0.484095,
    "16": 0.512897,
    "17": 0.541699,
    "18": 0.570501,
    "19": 0.599302,
    "20": 0.628104,
    "21": 0.656906,
    "22": 0.685708,
    "23": 0.71451,
    "24": 0.743312,
    "25": 0.772113,
    "26": 0.800915,
    "27": 0.829717,
    "28": 0.858519,
    "29": 0.887321,
    "30": 0.916123,
    "31": 0.944924
   },
   "droppedRows": [],
   "regions": [
    {
     "id": "rail",
     "row": 1,
     "rows": 28,
     "col": 1.0,
     "cells": 27.0,
     "label": "Provider list",
     "gloss": "Every provider OMP knows about. A filled dot means it found a key or a login for that one; a hollow dot means it did not, so those models stay hidden. The number is how many of that provider's models you can actually use. The two rows at the top switch the right-hand side between your roles and the full model list."
    },
    {
     "id": "roletable",
     "row": 3,
     "rows": 16,
     "col": 30.2,
     "cells": 100.6,
     "label": "Role table",
     "gloss": "The ten roles, each with the model it holds and how hard that model thinks. The indented rows underneath a role are its backup models, tried in order; the ↻ badge counts them. Clear a role and the choice goes back to OMP."
    },
    {
     "id": "patterns",
     "row": 20,
     "rows": 3,
     "col": 30.2,
     "cells": 100.6,
     "label": "Whole-provider backups",
     "gloss": "One backup list that covers a provider instead of a single role. A key like `anthropic/*` applies to every Anthropic model at once, so you do not repeat the same chain ten times."
    },
    {
     "id": "cycle",
     "row": 28,
     "rows": 1,
     "col": 30.2,
     "cells": 100.6,
     "label": "Ctrl+P cycle",
     "gloss": "The short list Ctrl+P walks through while you are working, saved as `cycleOrder`. It starts as smol, default, slow. Press `c` on a role to add or remove it."
    },
    {
     "id": "bar",
     "row": 30,
     "rows": 1,
     "col": 1.0,
     "cells": 129.8,
     "label": "Role keys",
     "gloss": "With the cursor on a role row, the bottom line becomes the things you can do to that role: choose its model, add a backup, clear it, set thinking depth, put it in the Ctrl+P cycle, or create a new role."
    }
   ]
  },
  {
   "view": "thinking",
   "viewLabel": "Per-role thinking",
   "caption": "Press `t` to set how hard this one role thinks, without touching the others.",
   "png": "thinking.png",
   "webp": "thinking.webp",
   "assetVersion": "0de6b1e758",
   "width": 1748,
   "height": 1008,
   "cols": 132,
   "rows": 32,
   "cellH": 0.028802,
   "cellW": 0.007381,
   "gridLeft": 0.012586,
   "splitCol": 29,
   "rowTop": {
    "0": 0.052067,
    "1": 0.080869,
    "2": 0.109671,
    "3": 0.138473,
    "4": 0.167275,
    "5": 0.196077,
    "6": 0.224878,
    "7": 0.25368,
    "8": 0.282482,
    "9": 0.311284,
    "10": 0.340086,
    "11": 0.368888,
    "12": 0.397689,
    "13": 0.426491,
    "14": 0.455293,
    "15": 0.484095,
    "16": 0.512897,
    "17": 0.541699,
    "18": 0.570501,
    "19": 0.599302,
    "20": 0.628104,
    "21": 0.656906,
    "22": 0.685708,
    "23": 0.71451,
    "24": 0.743312,
    "25": 0.772113,
    "26": 0.800915,
    "27": 0.829717,
    "28": 0.858519,
    "29": 0.887321,
    "30": 0.916123,
    "31": 0.944924
   },
   "droppedRows": [],
   "regions": [
    {
     "id": "rail",
     "row": 1,
     "rows": 28,
     "col": 1.0,
     "cells": 27.0,
     "label": "Provider list",
     "gloss": "Every provider OMP knows about. A filled dot means it found a key or a login for that one; a hollow dot means it did not, so those models stay hidden. The number is how many of that provider's models you can actually use. The two rows at the top switch the right-hand side between your roles and the full model list."
    },
    {
     "id": "roletable",
     "row": 3,
     "rows": 16,
     "col": 30.2,
     "cells": 100.6,
     "label": "Role table",
     "gloss": "The ten roles, each with the model it holds and how hard that model thinks. The indented rows underneath a role are its backup models, tried in order; the ↻ badge counts them. Clear a role and the choice goes back to OMP."
    },
    {
     "id": "patterns",
     "row": 20,
     "rows": 3,
     "col": 30.2,
     "cells": 100.6,
     "label": "Whole-provider backups",
     "gloss": "One backup list that covers a provider instead of a single role. A key like `anthropic/*` applies to every Anthropic model at once, so you do not repeat the same chain ten times."
    },
    {
     "id": "cycle",
     "row": 28,
     "rows": 1,
     "col": 30.2,
     "cells": 100.6,
     "label": "Ctrl+P cycle",
     "gloss": "The short list Ctrl+P walks through while you are working, saved as `cycleOrder`. It starts as smol, default, slow. Press `c` on a role to add or remove it."
    },
    {
     "id": "bar",
     "row": 30,
     "rows": 1,
     "col": 1.0,
     "cells": 129.8,
     "label": "Thinking strip",
     "gloss": "How hard this one role thinks, saved as a `:level` on the end of its model name. `inherit` follows the global `defaultThinkingLevel`; `auto` lets a small model read each turn and decide for you."
    }
   ]
  },
  {
   "view": "search",
   "viewLabel": "Search",
   "caption": "Type to narrow the list. The provider counts on the left follow along.",
   "png": "search.png",
   "webp": "search.webp",
   "assetVersion": "e7359cc42f",
   "width": 1748,
   "height": 1008,
   "cols": 132,
   "rows": 32,
   "cellH": 0.028802,
   "cellW": 0.007381,
   "gridLeft": 0.012586,
   "splitCol": 29,
   "rowTop": {
    "0": 0.052067,
    "1": 0.080869,
    "2": 0.109671,
    "3": 0.138473,
    "4": 0.167275,
    "5": 0.196077,
    "6": 0.224878,
    "7": 0.25368,
    "8": 0.282482,
    "9": 0.311284,
    "10": 0.340086,
    "11": 0.368888,
    "12": 0.397689,
    "13": 0.426491,
    "14": 0.455293,
    "15": 0.484095,
    "16": 0.512897,
    "17": 0.541699,
    "18": 0.570501,
    "19": 0.599302,
    "20": 0.628104,
    "21": 0.656906,
    "22": 0.685708,
    "23": 0.71451,
    "24": 0.743312,
    "25": 0.772113,
    "26": 0.800915,
    "27": 0.829717,
    "28": 0.858519,
    "29": 0.887321,
    "30": 0.916123,
    "31": 0.944924
   },
   "droppedRows": [],
   "regions": [
    {
     "id": "rail",
     "row": 1,
     "rows": 28,
     "col": 1.0,
     "cells": 27.0,
     "label": "Provider list",
     "gloss": "Every provider OMP knows about. A filled dot means it found a key or a login for that one; a hollow dot means it did not, so those models stay hidden. The number is how many of that provider's models you can actually use. The two rows at the top switch the right-hand side between your roles and the full model list."
    },
    {
     "id": "filter",
     "row": 2,
     "rows": 1,
     "col": 30.2,
     "cells": 100.6,
     "label": "Search",
     "gloss": "Start typing; there is no search mode to enter first. The model list narrows as you type and the provider counts follow it. Matching is loose, so `opus` finds `claude-opus-5`."
    },
    {
     "id": "catalog",
     "row": 4,
     "rows": 22,
     "col": 30.2,
     "cells": 100.6,
     "label": "Model rows",
     "gloss": "One row per model you can use, showing `provider/model`, how much text it holds at once, and the price per million tokens in and out. Models you have no key or login for are not listed at all."
    },
    {
     "id": "detail",
     "row": 27,
     "rows": 1,
     "col": 30.2,
     "cells": 100.6,
     "label": "Highlighted model",
     "gloss": "Everything known about the model your cursor is on: how much text it holds, how much it can write back, price, what it can handle such as images or tools, and which roles already use it."
    },
    {
     "id": "bar",
     "row": 30,
     "rows": 1,
     "col": 1.0,
     "cells": 129.8,
     "label": "Key hints",
     "gloss": "The bottom line always shows which keys work right now, and it changes as you move around the screen. There is no save step; every change is written as you make it."
    }
   ]
  },
  {
   "view": "assign",
   "viewLabel": "Assign to roles",
   "caption": "Press Enter and the bottom line offers every role the highlighted model can fill.",
   "png": "assign.png",
   "webp": "assign.webp",
   "assetVersion": "3a8ce363da",
   "width": 1748,
   "height": 1008,
   "cols": 132,
   "rows": 32,
   "cellH": 0.028802,
   "cellW": 0.007381,
   "gridLeft": 0.012586,
   "splitCol": 29,
   "rowTop": {
    "0": 0.052067,
    "1": 0.080869,
    "2": 0.109671,
    "3": 0.138473,
    "4": 0.167275,
    "5": 0.196077,
    "6": 0.224878,
    "7": 0.25368,
    "8": 0.282482,
    "9": 0.311284,
    "10": 0.340086,
    "11": 0.368888,
    "12": 0.397689,
    "13": 0.426491,
    "14": 0.455293,
    "15": 0.484095,
    "16": 0.512897,
    "17": 0.541699,
    "18": 0.570501,
    "19": 0.599302,
    "20": 0.628104,
    "21": 0.656906,
    "22": 0.685708,
    "23": 0.71451,
    "24": 0.743312,
    "25": 0.772113,
    "26": 0.800915,
    "27": 0.829717,
    "28": 0.858519,
    "29": 0.887321,
    "30": 0.916123,
    "31": 0.944924
   },
   "droppedRows": [],
   "regions": [
    {
     "id": "rail",
     "row": 1,
     "rows": 28,
     "col": 1.0,
     "cells": 27.0,
     "label": "Provider list",
     "gloss": "Every provider OMP knows about. A filled dot means it found a key or a login for that one; a hollow dot means it did not, so those models stay hidden. The number is how many of that provider's models you can actually use. The two rows at the top switch the right-hand side between your roles and the full model list."
    },
    {
     "id": "filter",
     "row": 2,
     "rows": 1,
     "col": 30.2,
     "cells": 100.6,
     "label": "Search",
     "gloss": "Start typing; there is no search mode to enter first. The model list narrows as you type and the provider counts follow it. Matching is loose, so `opus` finds `claude-opus-5`."
    },
    {
     "id": "catalog",
     "row": 4,
     "rows": 22,
     "col": 30.2,
     "cells": 100.6,
     "label": "Model rows",
     "gloss": "One row per model you can use, showing `provider/model`, how much text it holds at once, and the price per million tokens in and out. Models you have no key or login for are not listed at all."
    },
    {
     "id": "detail",
     "row": 27,
     "rows": 1,
     "col": 30.2,
     "cells": 100.6,
     "label": "Highlighted model",
     "gloss": "Everything known about the model your cursor is on: how much text it holds, how much it can write back, price, what it can handle such as images or tools, and which roles already use it."
    },
    {
     "id": "bar",
     "row": 30,
     "rows": 1,
     "col": 1.0,
     "cells": 129.8,
     "label": "Role strip",
     "gloss": "One key per role. Pressing it points that role at the highlighted model. Dimmed roles have nothing set yet, and the last item adds the model as a backup instead of replacing what is there."
    }
   ]
  }
 ],
 "roles": [
  {
   "id": "default",
   "label": "DEFAULT",
   "model": "openai-codex/gpt-5.6-sol",
   "thinking": "◑ medium",
   "chain": [
    "anthropic/claude-opus-5:medium",
    "openai-codex/gpt-5.6-terra:high"
   ],
   "chainLength": 3,
   "summary": "The model that runs the session. Any turn no other role claims goes here, and `*` or `@default` in config means this one. If you set nothing else, set this.",
   "wiring": {
    "flag": "--model gpt-5.6-sol",
    "env": null,
    "configKey": "modelRoles.default"
   }
  },
  {
   "id": "smol",
   "label": "SMOL",
   "model": "openai-codex/gpt-5.6-luna",
   "thinking": "◒ high",
   "chain": [
    "google-antigravity/gemini-3.7-flash:high"
   ],
   "chainLength": 1,
   "summary": "The fast, cheap model for light work. Prewalk hands over to it once the mechanical edits start, and `TINY` falls back to it when unset.",
   "wiring": {
    "flag": "--smol gpt-5.6-luna",
    "env": "PI_SMOL_MODEL",
    "configKey": "modelRoles.smol"
   }
  },
  {
   "id": "slow",
   "label": "SLOW",
   "model": "openai-codex/gpt-5.6-sol",
   "thinking": "◒ high",
   "chain": [
    "anthropic/claude-opus-5:medium",
    "openai-codex/gpt-5.6-terra:high"
   ],
   "chainLength": 2,
   "summary": "The slower, more careful model for hard analysis. Reach it with `--slow` on the command line or `@slow` in config.",
   "wiring": {
    "flag": "--slow gpt-5.6-sol",
    "env": "PI_SLOW_MODEL",
    "configKey": "modelRoles.slow"
   }
  },
  {
   "id": "vision",
   "label": "VISION",
   "model": "anthropic/claude-opus-5",
   "thinking": "◑ medium",
   "chain": [],
   "chainLength": 0,
   "summary": "A model that can look at images, for turns that include a screenshot or a picture. It has no flag and no environment variable, so this screen is where you set it.",
   "wiring": {
    "flag": null,
    "env": null,
    "configKey": "modelRoles.vision"
   }
  },
  {
   "id": "plan",
   "label": "PLAN",
   "model": "openai-codex/gpt-5.6-sol",
   "thinking": "◒ high",
   "chain": [],
   "chainLength": 0,
   "summary": "The model that plans an approach before anything is implemented. Set it for one run with `--plan` or `PI_PLAN_MODEL`.",
   "wiring": {
    "flag": "--plan gpt-5.6-sol",
    "env": "PI_PLAN_MODEL",
    "configKey": "modelRoles.plan"
   }
  },
  {
   "id": "designer",
   "label": "DESIGNER",
   "model": "anthropic/claude-opus-5",
   "thinking": "◒ high",
   "chain": [],
   "chainLength": 0,
   "summary": "The model for design and interface work. No flag and no environment variable; agents reach it by writing `@designer`.",
   "wiring": {
    "flag": null,
    "env": null,
    "configKey": "modelRoles.designer"
   }
  },
  {
   "id": "commit",
   "label": "COMMIT",
   "model": "openai-codex/gpt-5.6-luna",
   "thinking": "◒ high",
   "chain": [],
   "chainLength": 0,
   "summary": "The model that writes commit messages. Assign it here; it has no flag and no environment variable.",
   "wiring": {
    "flag": null,
    "env": null,
    "configKey": "modelRoles.commit"
   }
  },
  {
   "id": "tiny",
   "label": "TINY",
   "model": "openai-codex/gpt-5.6-luna",
   "thinking": "◒ high",
   "chain": [],
   "chainLength": 0,
   "summary": "The model for small background chores: naming sessions, memory, judging turn difficulty for `auto` thinking, and noticing unexpected stops. Left unset, that work goes to `@smol`.",
   "wiring": {
    "flag": null,
    "env": null,
    "configKey": "modelRoles.tiny"
   }
  },
  {
   "id": "task",
   "label": "TASK",
   "model": "openai-codex/gpt-5.6-terra",
   "thinking": "◒ high",
   "chain": [],
   "chainLength": 0,
   "summary": "The model subagents run on. A task checks `task.agentModelOverrides[agent]` first, then the `model` list in the agent's own file, then whatever the parent session is using. The first two can name a role with `@`.",
   "wiring": {
    "flag": null,
    "env": null,
    "configKey": "modelRoles.task"
   }
  },
  {
   "id": "advisor",
   "label": "ADVISOR",
   "model": "openai-codex/gpt-5.6-sol",
   "thinking": "◒ high",
   "chain": [],
   "chainLength": 0,
   "summary": "A second model that reads each finished turn and can speak up about it. Assign it here, then switch it on with `advisor.enabled`, `/advisor on`, or `--advisor`.",
   "wiring": {
    "flag": null,
    "env": null,
    "configKey": "modelRoles.advisor"
   }
  }
 ],
 "chainKeys": [
  {
   "key": "openai-codex/*",
   "chain": [
    "anthropic/claude-opus-5:medium"
   ]
  }
 ],
 "cycle": [
  "smol",
  "slow",
  "default"
 ],
 "catalog": [
  {
   "id": "anthropic/claude-3-7-sonnet-20250219",
   "provider": "anthropic",
   "context": "200k",
   "price": "$3/15"
  },
  {
   "id": "anthropic/claude-fable-5",
   "provider": "anthropic",
   "context": "1m",
   "price": "$10/50"
  },
  {
   "id": "anthropic/claude-haiku-4-5",
   "provider": "anthropic",
   "context": "200k",
   "price": "$1/5"
  },
  {
   "id": "anthropic/claude-haiku-4-5-20251001",
   "provider": "anthropic",
   "context": "200k",
   "price": "$1/5"
  },
  {
   "id": "anthropic/claude-mythos-5",
   "provider": "anthropic",
   "context": "1m",
   "price": "$10/50"
  },
  {
   "id": "anthropic/claude-opus-4-0",
   "provider": "anthropic",
   "context": "200k",
   "price": "$15/75"
  },
  {
   "id": "anthropic/claude-opus-4-1",
   "provider": "anthropic",
   "context": "200k",
   "price": "$15/75"
  },
  {
   "id": "anthropic/claude-opus-4-1-20250805",
   "provider": "anthropic",
   "context": "200k",
   "price": "$15/75"
  },
  {
   "id": "anthropic/claude-opus-4-20250514",
   "provider": "anthropic",
   "context": "200k",
   "price": "$15/75"
  },
  {
   "id": "anthropic/claude-opus-4-5",
   "provider": "anthropic",
   "context": "200k",
   "price": "$5/25"
  },
  {
   "id": "anthropic/claude-opus-4-5-20251101",
   "provider": "anthropic",
   "context": "200k",
   "price": "$5/25"
  },
  {
   "id": "anthropic/claude-opus-4-6",
   "provider": "anthropic",
   "context": "1m",
   "price": "$5/25"
  },
  {
   "id": "anthropic/claude-opus-4-7",
   "provider": "anthropic",
   "context": "1m",
   "price": "$5/25"
  },
  {
   "id": "anthropic/claude-opus-4-8",
   "provider": "anthropic",
   "context": "1m",
   "price": "$5/25"
  },
  {
   "id": "anthropic/claude-opus-5",
   "provider": "anthropic",
   "context": "1m",
   "price": "$5/25"
  },
  {
   "id": "anthropic/claude-sonnet-4-0",
   "provider": "anthropic",
   "context": "200k",
   "price": "$3/15"
  },
  {
   "id": "anthropic/claude-sonnet-4-20250514",
   "provider": "anthropic",
   "context": "200k",
   "price": "$3/15"
  },
  {
   "id": "anthropic/claude-sonnet-4-5",
   "provider": "anthropic",
   "context": "1m",
   "price": "$3/15"
  },
  {
   "id": "anthropic/claude-sonnet-4-5-20250929",
   "provider": "anthropic",
   "context": "1m",
   "price": "$3/15"
  },
  {
   "id": "anthropic/claude-sonnet-4-6",
   "provider": "anthropic",
   "context": "1m",
   "price": "$3/15"
  },
  {
   "id": "anthropic/claude-sonnet-5",
   "provider": "anthropic",
   "context": "1m",
   "price": "$2/10"
  },
  {
   "id": "google/gemini-1.5-flash",
   "provider": "google",
   "context": "1m",
   "price": "$0.07/0.3"
  },
  {
   "id": "google/gemini-1.5-flash-8b",
   "provider": "google",
   "context": "1m",
   "price": "$0.04/0.15"
  },
  {
   "id": "google/gemini-2.0-flash",
   "provider": "google",
   "context": "1m",
   "price": "$0.1/0.4"
  },
  {
   "id": "google/gemini-2.0-flash-lite",
   "provider": "google",
   "context": "1m",
   "price": "$0.07/0.3"
  },
  {
   "id": "google/gemini-2.5-flash",
   "provider": "google",
   "context": "1m",
   "price": "$0.3/2.5"
  },
  {
   "id": "google/gemini-2.5-flash-lite",
   "provider": "google",
   "context": "1m",
   "price": "$0.1/0.4"
  },
  {
   "id": "google/gemini-2.5-flash-lite-preview-06-17",
   "provider": "google",
   "context": "1m",
   "price": "$0.1/0.4"
  },
  {
   "id": "google/gemini-2.5-flash-lite-preview-09-2025",
   "provider": "google",
   "context": "1m",
   "price": "$0.1/0.4"
  },
  {
   "id": "google/gemini-2.5-flash-preview-04-17",
   "provider": "google",
   "context": "1m",
   "price": "$0.15/0.6"
  },
  {
   "id": "google/gemini-2.5-flash-preview-05-20",
   "provider": "google",
   "context": "1m",
   "price": "$0.15/0.6"
  },
  {
   "id": "google/gemini-2.5-flash-preview-09-2025",
   "provider": "google",
   "context": "1m",
   "price": "$0.3/2.5"
  },
  {
   "id": "google/gemini-3-flash-preview",
   "provider": "google",
   "context": "1m",
   "price": "$0.5/3"
  },
  {
   "id": "google/gemini-3.1-flash-lite",
   "provider": "google",
   "context": "1m",
   "price": "$0.25/1.5"
  },
  {
   "id": "google/gemini-3.1-flash-lite-image",
   "provider": "google",
   "context": "66k",
   "price": "$0.25/30"
  },
  {
   "id": "google/gemini-3.1-flash-lite-preview",
   "provider": "google",
   "context": "1m",
   "price": "$0.25/1.5"
  },
  {
   "id": "google/gemini-3.1-flash-live-preview",
   "provider": "google",
   "context": "131k",
   "price": "$0.75/4.5"
  },
  {
   "id": "google/gemini-3.5-flash",
   "provider": "google",
   "context": "1m",
   "price": "$1.5/9"
  },
  {
   "id": "google/gemini-3.5-flash-lite",
   "provider": "google",
   "context": "1m",
   "price": "$0.3/2.5"
  },
  {
   "id": "google/gemini-3.6-flash",
   "provider": "google",
   "context": "1m",
   "price": "$1.5/7.5"
  },
  {
   "id": "google/gemini-3.7-flash",
   "provider": "google",
   "context": "1m",
   "price": "$0.75/3.75"
  },
  {
   "id": "google/gemini-live-2.5-flash",
   "provider": "google",
   "context": "128k",
   "price": "$0.5/2"
  },
  {
   "id": "google/gemini-live-2.5-flash-preview-native-audio",
   "provider": "google",
   "context": "131k",
   "price": "$0.5/2"
  }
 ],
 "providers": [
  {
   "id": "aiand",
   "configured": false,
   "count": null
  },
  {
   "id": "aimlapi",
   "configured": false,
   "count": null
  },
  {
   "id": "alibaba-coding-plan",
   "configured": false,
   "count": null
  },
  {
   "id": "alibaba-token-plan",
   "configured": false,
   "count": null
  },
  {
   "id": "amazon-bedrock",
   "configured": false,
   "count": null
  },
  {
   "id": "anthropic",
   "configured": true,
   "count": 26
  },
  {
   "id": "azure",
   "configured": false,
   "count": null
  },
  {
   "id": "baseten",
   "configured": false,
   "count": null
  },
  {
   "id": "bedrock-mantle",
   "configured": false,
   "count": null
  },
  {
   "id": "cerebras",
   "configured": false,
   "count": null
  },
  {
   "id": "cloudflare-ai-gateway",
   "configured": false,
   "count": null
  },
  {
   "id": "coreweave",
   "configured": false,
   "count": null
  },
  {
   "id": "cursor",
   "configured": false,
   "count": null
  },
  {
   "id": "deepseek",
   "configured": false,
   "count": null
  },
  {
   "id": "devin",
   "configured": false,
   "count": null
  },
  {
   "id": "firepass",
   "configured": false,
   "count": null
  },
  {
   "id": "fireworks",
   "configured": false,
   "count": null
  },
  {
   "id": "github-copilot",
   "configured": false,
   "count": null
  },
  {
   "id": "gitlab-duo",
   "configured": false,
   "count": null
  },
  {
   "id": "google",
   "configured": true,
   "count": 43
  },
  {
   "id": "llama.cpp",
   "configured": true,
   "count": 0
  },
  {
   "id": "lm-studio",
   "configured": true,
   "count": 0
  },
  {
   "id": "ollama",
   "configured": true,
   "count": 0
  },
  {
   "id": "openai",
   "configured": true,
   "count": 54
  }
 ],
 "hints": [
  {
   "id": "Enter assign roles",
   "views": [
    "all-models",
    "search"
   ],
   "gloss": "Opens the role strip for the highlighted model, where one key per role assigns it."
  },
  {
   "id": "Enter pick",
   "views": [
    "role-actions"
   ],
   "gloss": "Puts the highlighted model on the role you are standing on, writing `modelRoles.<role>`."
  },
  {
   "id": "Esc close",
   "views": [
    "all-models",
    "roles",
    "search"
   ],
   "gloss": "Closes the screen. Everything you changed is already saved."
  },
  {
   "id": "[/] reorder",
   "views": [
    "role-actions"
   ],
   "gloss": "Moves a backup up or down inside its list. The order is the order OMP tries them in."
  },
  {
   "id": "c cycle",
   "views": [
    "role-actions"
   ],
   "gloss": "Adds this role to the Ctrl+P list, or takes it out. The list is saved as `cycleOrder`."
  },
  {
   "id": "f fallback",
   "views": [
    "role-actions"
   ],
   "gloss": "Adds a backup model under this role. Backups live in `retry.fallbackChains` and are tried in order."
  },
  {
   "id": "n new",
   "views": [
    "role-actions"
   ],
   "gloss": "Creates a role of your own alongside the ten built in. Letters, digits, hyphen and underscore; afterwards you refer to it as `@name`."
  },
  {
   "id": "t thinking",
   "views": [
    "role-actions"
   ],
   "gloss": "Opens the thinking strip for this role. The level is saved on the end of the model name, as in `openai-codex/gpt-5.6-sol:high`."
  },
  {
   "id": "type to search",
   "views": [
    "all-models",
    "search"
   ],
   "gloss": "Filters the model list as you type. There is no search mode to enter, and matching is loose."
  },
  {
   "id": "x clear",
   "views": [
    "role-actions"
   ],
   "gloss": "Empties the row. A cleared role goes back to letting OMP choose a model for it."
  },
  {
   "id": "← providers",
   "views": [
    "search"
   ],
   "gloss": "Moves back left to the provider list."
  },
  {
   "id": "↑/↓ models",
   "views": [
    "search"
   ],
   "gloss": "Moves through the model list. The bar underneath describes whichever model is highlighted."
  },
  {
   "id": "↑/↓ providers",
   "views": [
    "all-models",
    "roles"
   ],
   "gloss": "Moves up and down the provider list. The number beside a provider is how many of its models you can use with the keys you have."
  },
  {
   "id": "↑/↓ rows",
   "views": [
    "role-actions"
   ],
   "gloss": "Moves through the role rows and the backup rows nested under them."
  },
  {
   "id": "→ models",
   "views": [
    "all-models"
   ],
   "gloss": "Moves right, out of the provider list and into that provider's models."
  },
  {
   "id": "→ roles",
   "views": [
    "roles"
   ],
   "gloss": "Moves right into the role rows, where models get assigned."
  }
 ],
 "chips": [
  {
   "id": "inherit",
   "gloss": "No level of its own, so this role follows `defaultThinkingLevel`, which ships as `high`."
  },
  {
   "id": "off",
   "gloss": "No thinking budget at all, on models where thinking is optional. The fastest and cheapest choice."
  },
  {
   "id": "auto",
   "gloss": "A small model reads each turn first and picks the depth for you: `providers.autoThinkingModel`, or the `TINY` role when it is an online model. It stops at `providers.autoThinkingMaxEffort`, so only asking for ultrathink reaches the top."
  },
  {
   "id": "low",
   "gloss": "A small thinking budget, saved as `:low` on the end of the model name."
  },
  {
   "id": "medium",
   "gloss": "A middling thinking budget, saved as `:medium`."
  },
  {
   "id": "high",
   "gloss": "The depth OMP ships with, saved as `:high`."
  },
  {
   "id": "max",
   "gloss": "The deepest setting, on models that offer one. `auto` never picks this by itself."
  }
 ],
 "settings": [
  {
   "path": "modelRoleStorage",
   "label": "Model Role Storage",
   "description": "Where model selector role assignments are saved",
   "default": "global",
   "values": [
    "global",
    "project"
   ],
   "tab": "model",
   "group": "Prompt"
  },
  {
   "path": "defaultThinkingLevel",
   "label": "Thinking Level",
   "description": "Reasoning depth for thinking-capable models",
   "default": "high",
   "values": [
    "minimal",
    "low",
    "medium",
    "high",
    "xhigh",
    "max",
    "auto"
   ],
   "tab": "model",
   "group": "Thinking"
  },
  {
   "path": "retry.fallbackChains",
   "label": "Retry Fallback Chains",
   "description": "JSON object mapping model roles, model selectors (\"provider/model-id\"), or provider wildcards (\"provider/*\") to ordered fallback selectors, e.g. {\"default\":[\"openai/gpt-4o-mini\"],\"google-antigravity/*\":[\"google/*\",\"google-vertex/*\"]}. Model-oriented keys apply whenever that model/provider is active, regardless of role; a \"provider/*\" entry keeps the failing model's id and swaps the provider. An id-prefixed wildcard (\"openrouter/google/*\") re-prefixes the failing model's bare id (google-antigravity/gemini-x -> openrouter/google/gemini-x) and, used as a key, matches only that provider's ids under the prefix.",
   "default": {},
   "values": null,
   "tab": "model",
   "group": "Retry & Fallback"
  },
  {
   "path": "retry.modelFallback",
   "label": "Retry Model Fallback",
   "description": "Allow retry recovery to switch to configured fallback models",
   "default": true,
   "values": null,
   "tab": "model",
   "group": "Retry & Fallback"
  },
  {
   "path": "retry.fallbackRevertPolicy",
   "label": "Fallback Revert Policy",
   "description": "When to return to the primary model after a fallback",
   "default": "cooldown-expiry",
   "values": [
    "cooldown-expiry",
    "never"
   ],
   "tab": "model",
   "group": "Retry & Fallback"
  },
  {
   "path": "retry.usageAwareFallback",
   "label": "Usage-Aware Fallback",
   "description": "Use reliable coding-plan quota reports to prefer same-provider accounts, then configured fallback models, before a hard usage limit. Ordinary configured API keys are excluded.",
   "default": false,
   "values": null,
   "tab": "model",
   "group": "Retry & Fallback"
  },
  {
   "path": "retry.usageReservePct",
   "label": "Reserve Margin",
   "description": "Treat a coding-plan model as near its limit below this remaining percentage. Unknown or unmapped usage keeps the primary model.",
   "default": 10,
   "values": null,
   "tab": "model",
   "group": "Retry & Fallback"
  },
  {
   "path": "retry.usageReservePolicy",
   "label": "Reserve Policy",
   "description": "What to do when every same-provider coding-plan account is inside the reserve margin.",
   "default": "confirm",
   "values": [
    "confirm",
    "auto",
    "fail-closed"
   ],
   "tab": "model",
   "group": "Retry & Fallback"
  },
  {
   "path": "prewalk.enabled",
   "label": "Enable Prewalk",
   "description": "Start on the active model, then switch to a fast/cheap model (default the 'smol' role) at the first edit/write after the plan nudge's todo list exists — the strong model plans, commits the todos, and starts the implementation before handing off. Overridable per session with --prewalk / --no-prewalk.",
   "default": false,
   "values": null,
   "tab": "model",
   "group": "Prewalk"
  },
  {
   "path": "advisor.enabled",
   "label": "Enable Advisor",
   "description": "Pair a second model (assigned to the 'advisor' role) that passively reviews each turn and injects notes.",
   "default": false,
   "values": null,
   "tab": "model",
   "group": "Advisor"
  },
  {
   "path": "advisor.syncBacklog",
   "label": "Advisor Sync Backlog",
   "description": "Pause the main agent for up to 30 seconds if the advisor falls behind by this many turns. Off disables catch-up delays.",
   "default": "off",
   "values": [
    "off",
    "1",
    "3",
    "5"
   ],
   "tab": "model",
   "group": "Advisor"
  },
  {
   "path": "advisor.immuneTurns",
   "label": "Advisor Immune Turns",
   "description": "After an advisor concern or blocker interrupts, route further concerns/blockers non-interruptingly for this many primary turns.",
   "default": 3,
   "values": null,
   "tab": "model",
   "group": "Advisor"
  },
  {
   "path": "providers.autoThinkingModel",
   "label": "Auto Thinking Model",
   "description": "Difficulty classifier for the `auto` thinking level: online (the TINY role from /models, else smol) by default, or a local on-device model",
   "default": "online",
   "values": [
    "online",
    "qwen3-1.7b",
    "llama3.2:3b",
    "gemma-3-1b",
    "qwen2.5-1.5b",
    "lfm2-1.2b"
   ],
   "tab": "model",
   "group": "Thinking"
  },
  {
   "path": "providers.autoThinkingMaxEffort",
   "label": "Auto Thinking Ceiling",
   "description": "Highest effort the `auto` classifier may resolve. `xhigh` keeps the classifier one tier below the top, so only an explicit `ultrathink` reaches `max`; `max` lets a turn the classifier judges exceptional bill the top tier on models that expose it.",
   "default": "xhigh",
   "values": [
    "xhigh",
    "max"
   ],
   "tab": "model",
   "group": "Thinking"
  },
  {
   "path": "providers.tinyModel",
   "label": "Tiny Model",
   "description": "Session-title model: online (the TINY role from /models, else @smol) by default, or a local on-device model",
   "default": "online",
   "values": [
    "online",
    "lfm2-350m",
    "qwen3-0.6b",
    "gemma-270m",
    "qwen2.5-0.5b",
    "lfm2-700m"
   ],
   "tab": "providers",
   "group": "Tiny Model"
  },
  {
   "path": "task.prewalk",
   "label": "Generic Task Prewalk",
   "description": "Arm prewalk for the bundled generic `task` subagent: it starts on its resolved model, plans and begins the implementation, then hands off to the 'smol' role at its first edit/write. Per-agent overrides (task.agentPrewalk, configured from the /agents hub) and user agent `prewalk` frontmatter apply regardless of this toggle.",
   "default": false,
   "values": null,
   "tab": "tasks",
   "group": "Subagents"
  },
  {
   "path": "task.showResolvedModelBadge",
   "label": "Show Resolved Model Badge",
   "description": "Display the actual model ID used by each subagent in the task widget status line",
   "default": false,
   "values": null,
   "tab": "appearance",
   "group": "Display"
  },
  {
   "path": "images.describeForTextModels",
   "label": "Describe Images for Text Models",
   "description": "When an image is attached to a model without vision support, save it under local:// and inject a description from a vision-capable model instead of dropping it",
   "default": true,
   "values": null,
   "tab": "model",
   "group": "Vision"
  },
  {
   "path": "inspect_image.mode",
   "label": "Inspect Image",
   "description": "Controls the inspect_image tool, which delegates image understanding to a vision-capable model. 'auto' exposes it only when the active model lacks native image input; 'on' always exposes it; 'off' never does.",
   "default": "auto",
   "values": [
    "auto",
    "on",
    "off"
   ],
   "tab": "tools",
   "group": "Available Tools"
  }
 ],
 "resolution": [
  {
   "id": "flags",
   "title": "Run flags",
   "detail": "`--model`, `--smol`, `--slow`, and `--plan` set a role for one run only. Those four are the only roles with a flag, and `PI_SMOL_MODEL`, `PI_SLOW_MODEL`, and `PI_PLAN_MODEL` do the same from the environment.",
   "source": "omp --help, settings.md environment table"
  },
  {
   "id": "session",
   "title": "Opening model",
   "detail": "With no flag, the session works down a list until something matches: a provider and model given on the command line, the first model scoped to this directory when you are not resuming, your saved default, a known default for a provider you can reach, then simply the first available model.",
   "source": "models.md findInitialModel"
  },
  {
   "id": "roles",
   "title": "Role names",
   "detail": "A name like `@smol` is looked up in `settings.modelRoles`, and `*` means `@default`. A role may point at another role, and any role value may end in a thinking level: `:minimal`, `:low`, `:medium`, `:high`, `:xhigh`, `:max`.",
   "source": "models.md role aliases and settings"
  },
  {
   "id": "subagents",
   "title": "Subagents",
   "detail": "A subagent uses `task.agentModelOverrides[agent]` if it is set, then the `model` list in the agent's own file, then the model the parent session is running. The first two may name a role with `@`.",
   "source": "task-agent-discovery.md model precedence"
  },
  {
   "id": "fallbacks",
   "title": "Backup models",
   "detail": "`retry.fallbackChains` lists backups for a role, for one exact model, or for a whole provider with `provider/*`. `retry.modelFallback` turns switching on or off, and `retry.fallbackRevertPolicy` decides when the original model comes back (default `cooldown-expiry`).",
   "source": "settings schema, retry group"
  },
  {
   "id": "usage",
   "title": "Quota-aware switching",
   "detail": "With `retry.usageAwareFallback` on, OMP reads how much of your coding-plan quota is left and moves to another account on the same provider before touching the configured backups. `retry.usageReservePct` (10) is how close to the limit counts as nearly out, and `retry.usageReservePolicy` (`confirm`) decides what happens when every account is that close. Pay-as-you-go API keys are not affected.",
   "source": "settings schema, retry group"
  },
  {
   "id": "promotion",
   "title": "Running out of context",
   "detail": "When a conversation outgrows the model's context window, OMP tries a roomier model before compacting the history: if the model names a `contextPromotionTarget`, the retry goes there. Your saved roles are left alone.",
   "source": "models.md context promotion"
  },
  {
   "id": "availability",
   "title": "What you can select",
   "detail": "Only models you can actually run appear: free ones, plus any provider where a key or login resolved. Keys are looked for in this order: `--api-key`, the key in `models.yml`, a stored OAuth login, a key obtained by logging in, an environment variable, another stored key, then the registry fallback.",
   "source": "models.md availability and auth order"
  }
 ],
 "workflows": [
  {
   "id": "prewalk",
   "title": "Prewalk",
   "summary": "Plan on the expensive model, then hand the typing to a cheap one.",
   "steps": [
    "The turn starts on whichever model is active.",
    "That model plans, commits a todo list, and begins the work.",
    "At the first edit or write after that todo list exists, the session swaps models.",
    "It swaps to the `SMOL` role unless `--prewalk-into` names something else."
   ],
   "keys": [
    {
     "key": "--prewalk",
     "effect": "Turn it on for one run."
    },
    {
     "key": "--no-prewalk",
     "effect": "Turn it off even when `prewalk.enabled` is set."
    },
    {
     "key": "--prewalk-into",
     "effect": "Choose the model that takes over."
    }
   ],
   "settings": [
    "prewalk.enabled",
    "task.prewalk"
   ]
  },
  {
   "id": "plan-yolo",
   "title": "Plan-yolo",
   "summary": "Plan with editing disabled, approve it automatically, then build on a second model.",
   "steps": [
    "Start in plan mode, where nothing can be written to disk.",
    "The plan approves itself the first time the model asks.",
    "The session switches to `--plan-yolo-into`, the `SMOL` role by default, and implements it."
   ],
   "keys": [
    {
     "key": "--plan-yolo",
     "effect": "Force the flow for one run."
    },
    {
     "key": "--plan-yolo-into",
     "effect": "Choose the model that implements the plan."
    }
   ],
   "settings": [
    "plan.enabled",
    "plan.defaultOnStartup"
   ]
  },
  {
   "id": "advisor",
   "title": "Advisor",
   "summary": "A second model reads every finished turn and can interrupt when something looks wrong.",
   "steps": [
    "Assign the `ADVISOR` role, then turn the advisor on.",
    "After each turn the advisor is sent only what is new, not the whole conversation.",
    "It can interrupt with a concern or a blocker. Once it has interrupted, the next few turns are left alone.",
    "Subagents are not advised unless you opt them in one at a time."
   ],
   "keys": [
    {
     "key": "--advisor",
     "effect": "Start the session with the advisor on."
    },
    {
     "key": "/advisor on",
     "effect": "Turn it on partway through."
    }
   ],
   "settings": [
    "advisor.enabled",
    "advisor.syncBacklog",
    "advisor.immuneTurns"
   ]
  },
  {
   "id": "cycle",
   "title": "Cycle bar",
   "summary": "The short list of roles Ctrl+P rotates between while you work.",
   "steps": [
    "`cycleOrder` starts as smol, default, slow.",
    "Ctrl+P moves to the next role on the list without restarting the session.",
    "Press `c` on a role in the selector to add it or take it out.",
    "A project config replaces the whole list rather than adding to it."
   ],
   "keys": [
    {
     "key": "Ctrl+P",
     "effect": "Move to the next role on the list."
    },
    {
     "key": "c",
     "effect": "Add or remove the role your cursor is on."
    }
   ],
   "settings": [
    "cycleOrder",
    "modelRoleStorage"
   ]
  },
  {
   "id": "thinking",
   "title": "Thinking depth",
   "summary": "How hard each model thinks, set per role instead of once for everything.",
   "steps": [
    "`defaultThinkingLevel` ships as `high` and covers every role you have not set.",
    "The strip offers inherit, off, auto, low, medium, high, and max.",
    "`auto` has a small model judge the turn first: `providers.autoThinkingModel`, or the `TINY` role when that is an online model.",
    "`providers.autoThinkingMaxEffort` (`xhigh`) caps what `auto` may pick, so only asking for ultrathink reaches the top tier."
   ],
   "keys": [
    {
     "key": "t",
     "effect": "Open the thinking strip for the role your cursor is on."
    }
   ],
   "settings": [
    "defaultThinkingLevel",
    "providers.autoThinkingModel",
    "providers.autoThinkingMaxEffort"
   ]
  },
  {
   "id": "background",
   "title": "Background work",
   "summary": "Small chores such as naming the session run somewhere cheaper than your main model.",
   "steps": [
    "The `TINY` role does this work when you assign it.",
    "Left unset, the work goes to `@smol`.",
    "`providers.tinyModel` can point it at a model running on your own machine instead of an online one.",
    "`providers.tinyModelDevice` and `providers.tinyModelDtype` control how that local model runs."
   ],
   "keys": [],
   "settings": [
    "providers.tinyModel",
    "providers.tinyModelDevice",
    "providers.tinyModelDtype"
   ]
  }
 ],
 "aliases": [
  {
   "surface": "Role alias",
   "example": "fable: \"@slow\"",
   "note": "Looked up in `settings.modelRoles`. In YAML, quote anything that starts with `@`."
  },
  {
   "surface": "The default alias",
   "example": "\"*\"",
   "note": "`*` means `@default`, the model running the session."
  },
  {
   "surface": "Thinking level",
   "example": "openai-codex/gpt-5.6-sol:high",
   "note": "Added to the end of a role value or a model name. Levels: minimal, low, medium, high, xhigh, max."
  },
  {
   "surface": "Command-line flags",
   "example": "omp --model gpt-5.6-sol --smol gpt-5.6-luna --slow gpt-5.6-sol --plan gpt-5.6-sol",
   "note": "The four roles that have a flag, shown with the models this setup uses. The other six are set in `/model` or in config."
  },
  {
   "surface": "Environment variables",
   "example": "PI_SMOL_MODEL=openai-codex/gpt-5.6-luna:high",
   "note": "Also `PI_SLOW_MODEL` and `PI_PLAN_MODEL`. The other seven roles have none."
  },
  {
   "surface": "Roles of your own",
   "example": "modelTags: { reviewer: {} }",
   "note": "Adds roles beyond the ten built in. Pressing `n` in the selector does the same thing."
  },
  {
   "surface": "Where roles are saved",
   "example": "modelRoleStorage: project",
   "note": "`global` by default. `project` writes `modelRoles` into `<cwd>/.omp/config.yml`, so it applies only inside that project."
  },
  {
   "surface": "Backup list",
   "example": "retry.fallbackChains: { default: [\"anthropic/claude-opus-5:medium\", \"openai-codex/gpt-5.6-terra:high\"] }",
   "note": "The key is a role, one exact model, or a provider wildcard. The models are tried in the order written."
  },
  {
   "surface": "Models for one directory",
   "example": "enabledModels: [{ path: ~/work, models: [anthropic/claude-opus-5] }]",
   "note": "Limits which models are offered inside that directory tree. A project's array replaces the global one rather than adding to it."
  }
 ],
 "intro": {
  "lede": "Claude Code and Codex give you one model per session. Oh My Pi gives each kind of work its own model, and the /model screen is where you set them.",
  "captureNote": "The models, thinking levels, and cycle in the screenshots are one real setup, shown as an example rather than a recommendation. The fallback chains are examples built from those same models. Defaults for the settings named on this page come from the OMP schema."
 },
 "basics": [
  {
   "title": "If you are coming from Claude Code or Codex",
   "detail": "There you pick one model and it does everything. Here the work is split into ten named jobs, called roles, and each role holds its own model. Fill in `DEFAULT` and you have the same single-model setup you are used to."
  },
  {
   "title": "A role is a job, not a model",
   "detail": "There is no one model setting. Each role names a kind of work: `DEFAULT` for ordinary turns, `SMOL` for cheap work, `PLAN` for planning, and seven more. Anything no other role claims runs on `DEFAULT`."
  },
  {
   "title": "Thinking depth is set per role",
   "detail": "How long a model reasons before answering is part of the role's value, so `gpt-5.6-sol:high` makes one role think harder and leaves the rest alone. Roles with no level follow `defaultThinkingLevel`."
  },
  {
   "title": "A failed call can retry elsewhere",
   "detail": "Each role can list backup models in `retry.fallbackChains`. If a call is refused, errors out, or hits a rate limit, OMP tries the next model on that list instead of ending the turn."
  },
  {
   "title": "Ctrl+P switches models mid-chat",
   "detail": "`cycleOrder` is a short list of roles that Ctrl+P steps through. You can move from a cheap model to a strong one in the middle of a conversation, with no restart and nothing lost."
  },
  {
   "title": "The screen only edits your config",
   "detail": "It writes three settings and nothing else: `modelRoles`, `cycleOrder`, and `retry.fallbackChains`. Anything you do here you could also type into the config file by hand."
  }
 ],
 "glossary": [
  {
   "term": "Role",
   "gloss": "A named job such as `DEFAULT` or `SMOL`. Each role holds one model. Ten come built in, and you can add your own."
  },
  {
   "term": "Model",
   "gloss": "One specific model from one provider, written `provider/model`, as in `anthropic/claude-opus-5`."
  },
  {
   "term": "Provider",
   "gloss": "The service a model comes from. You need a key or a login for each provider whose models you want to use."
  },
  {
   "term": "Selector",
   "gloss": "The screen this page is about. Type `/model` in a session to open it."
  },
  {
   "term": "Context window",
   "gloss": "How much text a model can hold in mind at once. Run past it and older parts of the conversation have to be summarised away."
  },
  {
   "term": "Token",
   "gloss": "The unit models read, write, and bill in. A token is roughly three quarters of a word, and prices here are per million of them."
  },
  {
   "term": "Thinking level",
   "gloss": "How long a model reasons before it answers. Deeper is usually better, always slower, and usually more expensive."
  },
  {
   "term": "Backup list",
   "gloss": "Called a fallback chain in the settings. The ordered models OMP tries when a call is refused, errors out, or is rate limited."
  },
  {
   "term": "Cycle",
   "gloss": "The short list of roles Ctrl+P rotates between without restarting the session."
  },
  {
   "term": "Alias",
   "gloss": "An `@name` standing for whatever model a role currently holds, such as `@smol`. `*` is shorthand for `@default`."
  },
  {
   "term": "Subagent",
   "gloss": "A helper session OMP starts to handle a delegated task. The `TASK` role decides which model it runs on."
  }
 ]
}
