SpyBara
Go Premium Account
2026
27 Mar 2026, 18:23
14 May 2026, 21:00 14 May 2026, 07:00 13 May 2026, 00:57 12 May 2026, 01:59 11 May 2026, 18:00 7 May 2026, 20:02 7 May 2026, 17:08 5 May 2026, 23:00 2 May 2026, 06:45 2 May 2026, 00:48 1 May 2026, 18:29 30 Apr 2026, 18:36 29 Apr 2026, 12:40 29 Apr 2026, 00:50 25 Apr 2026, 06:37 25 Apr 2026, 00:42 24 Apr 2026, 18:20 24 Apr 2026, 12:28 23 Apr 2026, 18:31 23 Apr 2026, 12:28 23 Apr 2026, 00:46 22 Apr 2026, 18:29 22 Apr 2026, 00:42 21 Apr 2026, 18:29 21 Apr 2026, 12:30 21 Apr 2026, 06:45 20 Apr 2026, 18:26 20 Apr 2026, 06:53 18 Apr 2026, 18:18 17 Apr 2026, 00:44 16 Apr 2026, 18:31 16 Apr 2026, 00:46 15 Apr 2026, 18:31 15 Apr 2026, 06:44 14 Apr 2026, 18:31 14 Apr 2026, 12:29 13 Apr 2026, 18:37 13 Apr 2026, 00:44 12 Apr 2026, 06:38 10 Apr 2026, 18:23 9 Apr 2026, 00:33 8 Apr 2026, 18:32 8 Apr 2026, 00:40 7 Apr 2026, 00:40 2 Apr 2026, 18:23 31 Mar 2026, 06:35 31 Mar 2026, 00:39 28 Mar 2026, 06:26 28 Mar 2026, 00:36 27 Mar 2026, 18:23 27 Mar 2026, 00:39 26 Mar 2026, 18:27 25 Mar 2026, 18:24 23 Mar 2026, 18:22 20 Mar 2026, 00:35 18 Mar 2026, 12:23 18 Mar 2026, 00:36 17 Mar 2026, 18:24 17 Mar 2026, 00:33 16 Mar 2026, 18:25 16 Mar 2026, 12:23 14 Mar 2026, 00:32 13 Mar 2026, 18:15 13 Mar 2026, 00:34 11 Mar 2026, 00:31 9 Mar 2026, 00:34 8 Mar 2026, 18:10 8 Mar 2026, 00:35 7 Mar 2026, 18:10 7 Mar 2026, 06:14 7 Mar 2026, 00:33 6 Mar 2026, 00:38 5 Mar 2026, 18:41 5 Mar 2026, 06:22 5 Mar 2026, 00:34 4 Mar 2026, 18:18 4 Mar 2026, 06:20 3 Mar 2026, 18:20 3 Mar 2026, 00:35 27 Feb 2026, 18:15 24 Feb 2026, 06:27 24 Feb 2026, 00:33 23 Feb 2026, 18:27 21 Feb 2026, 00:33 20 Feb 2026, 12:16 19 Feb 2026, 20:53 19 Feb 2026, 20:37
29 Apr 2026, 12:40
14 May 2026, 21:00 14 May 2026, 07:00 13 May 2026, 00:57 12 May 2026, 01:59 11 May 2026, 18:00 7 May 2026, 20:02 7 May 2026, 17:08 5 May 2026, 23:00 2 May 2026, 06:45 2 May 2026, 00:48 1 May 2026, 18:29 30 Apr 2026, 18:36 29 Apr 2026, 12:40 29 Apr 2026, 00:50 25 Apr 2026, 06:37 25 Apr 2026, 00:42 24 Apr 2026, 18:20 24 Apr 2026, 12:28 23 Apr 2026, 18:31 23 Apr 2026, 12:28 23 Apr 2026, 00:46 22 Apr 2026, 18:29 22 Apr 2026, 00:42 21 Apr 2026, 18:29 21 Apr 2026, 12:30 21 Apr 2026, 06:45 20 Apr 2026, 18:26 20 Apr 2026, 06:53 18 Apr 2026, 18:18 17 Apr 2026, 00:44 16 Apr 2026, 18:31 16 Apr 2026, 00:46 15 Apr 2026, 18:31 15 Apr 2026, 06:44 14 Apr 2026, 18:31 14 Apr 2026, 12:29 13 Apr 2026, 18:37 13 Apr 2026, 00:44 12 Apr 2026, 06:38 10 Apr 2026, 18:23 9 Apr 2026, 00:33 8 Apr 2026, 18:32 8 Apr 2026, 00:40 7 Apr 2026, 00:40 2 Apr 2026, 18:23 31 Mar 2026, 06:35 31 Mar 2026, 00:39 28 Mar 2026, 06:26 28 Mar 2026, 00:36 27 Mar 2026, 18:23 27 Mar 2026, 00:39 26 Mar 2026, 18:27 25 Mar 2026, 18:24 23 Mar 2026, 18:22 20 Mar 2026, 00:35 18 Mar 2026, 12:23 18 Mar 2026, 00:36 17 Mar 2026, 18:24 17 Mar 2026, 00:33 16 Mar 2026, 18:25 16 Mar 2026, 12:23 14 Mar 2026, 00:32 13 Mar 2026, 18:15 13 Mar 2026, 00:34 11 Mar 2026, 00:31 9 Mar 2026, 00:34 8 Mar 2026, 18:10 8 Mar 2026, 00:35 7 Mar 2026, 18:10 7 Mar 2026, 06:14 7 Mar 2026, 00:33 6 Mar 2026, 00:38 5 Mar 2026, 18:41 5 Mar 2026, 06:22 5 Mar 2026, 00:34 4 Mar 2026, 18:18 4 Mar 2026, 06:20 3 Mar 2026, 18:20 3 Mar 2026, 00:35 27 Feb 2026, 18:15 24 Feb 2026, 06:27 24 Feb 2026, 00:33 23 Feb 2026, 18:27 21 Feb 2026, 00:33 20 Feb 2026, 12:16 19 Feb 2026, 20:53 19 Feb 2026, 20:37
Thu 2 18:23 Tue 7 00:40 Wed 8 00:40 Wed 8 18:32 Thu 9 00:33 Fri 10 18:23 Sun 12 06:38 Mon 13 00:44 Mon 13 18:37 Tue 14 12:29 Tue 14 18:31 Wed 15 06:44 Wed 15 18:31 Thu 16 00:46 Thu 16 18:31 Fri 17 00:44 Sat 18 18:18 Mon 20 06:53 Mon 20 18:26 Tue 21 06:45 Tue 21 12:30 Tue 21 18:29 Wed 22 00:42 Wed 22 18:29 Thu 23 00:46 Thu 23 12:28 Thu 23 18:31 Fri 24 12:28 Fri 24 18:20 Sat 25 00:42 Sat 25 06:37 Wed 29 00:50 Wed 29 12:40 Thu 30 18:36

config-advanced.md +188 −28

Details

15Define profiles under `[profiles.<name>]` in `config.toml`, then run `codex --profile <name>`:15Define profiles under `[profiles.<name>]` in `config.toml`, then run `codex --profile <name>`:

16 16 

17```toml17```toml

18model = "gpt-5-codex"18model = "gpt-5.4"

19approval_policy = "on-request"19approval_policy = "on-request"

20model_catalog_json = "/Users/me/.codex/model-catalogs/default.json"20model_catalog_json = "/Users/me/.codex/model-catalogs/default.json"

21 21 


84 84 

85In addition to your user config, Codex reads project-scoped overrides from `.codex/config.toml` files inside your repo. Codex walks from the project root to your current working directory and loads every `.codex/config.toml` it finds. If multiple files define the same key, the closest file to your working directory wins.85In addition to your user config, Codex reads project-scoped overrides from `.codex/config.toml` files inside your repo. Codex walks from the project root to your current working directory and loads every `.codex/config.toml` it finds. If multiple files define the same key, the closest file to your working directory wins.

86 86 

87For security, Codex loads project-scoped config files only when the project is trusted. If the project is untrusted, Codex ignores `.codex/config.toml` files in the project.87For security, Codex loads project-scoped config files only when the project is trusted. If the project is untrusted, Codex ignores project `.codex/` layers, including `.codex/config.toml`, project-local hooks, and project-local rules. User and system layers remain separate and still load.

88 88 

89Relative paths inside a project config (for example, `model_instructions_file`) are resolved relative to the `.codex/` folder that contains the `config.toml`.89Relative paths inside a project config (for example, `model_instructions_file`) are resolved relative to the `.codex/` folder that contains the `config.toml`.

90 90 

91## Hooks (experimental)91## Hooks (experimental)

92 92 

93Codex can also load lifecycle hooks from `hooks.json` files that sit next to93Codex can also load lifecycle hooks from either `hooks.json` files or inline

94active config layers.94`[hooks]` tables in `config.toml` files that sit next to active config layers.

95 95 

96In practice, the two most useful locations are:96In practice, the two most useful locations are:

97 97 

98- `~/.codex/hooks.json`98- `~/.codex/hooks.json`

99- `~/.codex/config.toml`

99- `<repo>/.codex/hooks.json`100- `<repo>/.codex/hooks.json`

101- `<repo>/.codex/config.toml`

102 

103Project-local hooks load only when the project `.codex/` layer is trusted.

104User-level hooks remain independent of project trust.

100 105 

101Turn hooks on with:106Turn hooks on with:

102 107 


105codex_hooks = true110codex_hooks = true

106```111```

107 112 

113Inline TOML hooks use the same event structure as `hooks.json`:

114 

115```toml

116[[hooks.PreToolUse]]

117matcher = "^Bash$"

118 

119[[hooks.PreToolUse.hooks]]

120type = "command"

121command = '/usr/bin/python3 "$(git rev-parse --show-toplevel)/.codex/hooks/pre_tool_use_policy.py"'

122timeout = 30

123statusMessage = "Checking Bash command"

124```

125 

126If a single layer contains both `hooks.json` and inline `[hooks]`, Codex loads

127both and warns. Prefer one representation per layer.

128 

108For the current event list, input fields, output behavior, and limitations, see129For the current event list, input fields, output behavior, and limitations, see

109[Hooks](https://developers.openai.com/codex/hooks).130[Hooks](https://developers.openai.com/codex/hooks).

110 131 


127 148 

128## Custom model providers149## Custom model providers

129 150 

130A model provider defines how Codex connects to a model (base URL, wire API, and optional HTTP headers).151A model provider defines how Codex connects to a model (base URL, wire API, authentication, and optional HTTP headers). Custom providers can't reuse the reserved built-in provider IDs: `openai`, `ollama`, and `lmstudio`.

131 152 

132Define additional providers and point `model_provider` at them:153Define additional providers and point `model_provider` at them:

133 154 

134```toml155```toml

135model = "gpt-5.1"156model = "gpt-5.4"

136model_provider = "proxy"157model_provider = "proxy"

137 158 

138[model_providers.proxy]159[model_providers.proxy]


140base_url = "http://proxy.example.com"161base_url = "http://proxy.example.com"

141env_key = "OPENAI_API_KEY"162env_key = "OPENAI_API_KEY"

142 163 

143[model_providers.ollama]164[model_providers.local_ollama]

144name = "Ollama"165name = "Ollama"

145base_url = "http://localhost:11434/v1"166base_url = "http://localhost:11434/v1"

146 167 


158env_http_headers = { "X-Example-Features" = "EXAMPLE_FEATURES" }179env_http_headers = { "X-Example-Features" = "EXAMPLE_FEATURES" }

159```180```

160 181 

182Use command-backed authentication when a provider needs Codex to fetch bearer tokens from an external credential helper:

183 

184```toml

185[model_providers.proxy]

186name = "OpenAI using LLM proxy"

187base_url = "https://proxy.example.com/v1"

188wire_api = "responses"

189 

190[model_providers.proxy.auth]

191command = "/usr/local/bin/fetch-codex-token"

192args = ["--audience", "codex"]

193timeout_ms = 5000

194refresh_interval_ms = 300000

195```

196 

197The auth command receives no `stdin` and must print the token to stdout. Codex trims surrounding whitespace, treats an empty token as an error, and refreshes proactively at `refresh_interval_ms`; set `refresh_interval_ms = 0` to refresh only after an authentication retry. Don't combine `[model_providers.<id>.auth]` with `env_key`, `experimental_bearer_token`, or `requires_openai_auth`.

198 

161## OSS mode (local providers)199## OSS mode (local providers)

162 200 

163Codex can run against a local "open source" provider (for example, Ollama or LM Studio) when you pass `--oss`. If you pass `--oss` without specifying a provider, Codex uses `oss_provider` as the default.201Codex can run against a local "open source" provider (for example, Ollama or LM Studio) when you pass `--oss`. If you pass `--oss` without specifying a provider, Codex uses `oss_provider` as the default.


176env_key = "AZURE_OPENAI_API_KEY"214env_key = "AZURE_OPENAI_API_KEY"

177query_params = { api-version = "2025-04-01-preview" }215query_params = { api-version = "2025-04-01-preview" }

178wire_api = "responses"216wire_api = "responses"

179 

180[model_providers.openai]

181request_max_retries = 4217request_max_retries = 4

182stream_max_retries = 10218stream_max_retries = 10

183stream_idle_timeout_ms = 300000219stream_idle_timeout_ms = 300000

184```220```

185 221 

222To change the base URL for the built-in OpenAI provider, use `openai_base_url`; don't create `[model_providers.openai]`, because you can't override built-in provider IDs.

223 

186## ChatGPT customers using data residency224## ChatGPT customers using data residency

187 225 

188Projects created with [data residency](https://help.openai.com/en/articles/9903489-data-residency-and-inference-residency-for-chatgpt) enabled can create a model provider to update the base_url with the [correct prefix](https://platform.openai.com/docs/guides/your-data#which-models-and-features-are-eligible-for-data-residency).226Projects created with [data residency](https://help.openai.com/en/articles/9903489-data-residency-and-inference-residency-for-chatgpt) enabled can create a model provider to update the base_url with the [correct prefix](https://platform.openai.com/docs/guides/your-data#which-models-and-features-are-eligible-for-data-residency).


213 251 

214You can also use a granular approval policy (`approval_policy = { granular = { ... } }`) to allow or auto-reject individual prompt categories. This is useful when you want normal interactive approvals for some cases but want others, such as `request_permissions` or skill-script prompts, to fail closed automatically.252You can also use a granular approval policy (`approval_policy = { granular = { ... } }`) to allow or auto-reject individual prompt categories. This is useful when you want normal interactive approvals for some cases but want others, such as `request_permissions` or skill-script prompts, to fail closed automatically.

215 253 

216```254Set `approvals_reviewer = "auto_review"` to route eligible interactive approval

255requests through automatic review. This changes the reviewer, not the sandbox

256boundary.

257 

258Use `[auto_review].policy` for local reviewer policy instructions. Managed

259`guardian_policy_config` takes precedence.

260 

261```toml

217approval_policy = "untrusted" # Other options: on-request, never, or { granular = { ... } }262approval_policy = "untrusted" # Other options: on-request, never, or { granular = { ... } }

263approvals_reviewer = "user" # Or "auto_review" for automatic review

218sandbox_mode = "workspace-write"264sandbox_mode = "workspace-write"

219allow_login_shell = false # Optional hardening: disallow login shells for shell tools265allow_login_shell = false # Optional hardening: disallow login shells for shell tools

220 266 


232exclude_slash_tmp = false # Allow /tmp278exclude_slash_tmp = false # Allow /tmp

233writable_roots = ["/Users/YOU/.pyenv/shims"]279writable_roots = ["/Users/YOU/.pyenv/shims"]

234network_access = false # Opt in to outbound network280network_access = false # Opt in to outbound network

281 

282[auto_review]

283policy = """

284Use your organization's automatic review policy.

285"""

235```286```

236 287 

237Need the complete key list (including profile-scoped overrides and requirements constraints)? See [Configuration Reference](https://developers.openai.com/codex/config-reference) and [Managed configuration](https://developers.openai.com/codex/enterprise/managed-configuration).288Need the complete key list (including profile-scoped overrides and requirements constraints)? See [Configuration Reference](https://developers.openai.com/codex/config-reference) and [Managed configuration](https://developers.openai.com/codex/enterprise/managed-configuration).


353 404 

354#### Metrics catalog405#### Metrics catalog

355 406 

356Each metric includes the required fields plus the default context fields above. Every metric is prefixed by `codex.`.407Each metric includes the required fields plus the default context fields above. Metric names below omit the `codex.` prefix.

408Most metric names are centralized in `codex-rs/otel/src/metrics/names.rs`; feature-specific metrics emitted outside that file are included here too.

357If a metric includes the `tool` field, it reflects the internal tool used (for example, `apply_patch` or `shell`) and doesn't contain the actual shell command or patch `codex` is trying to apply.409If a metric includes the `tool` field, it reflects the internal tool used (for example, `apply_patch` or `shell`) and doesn't contain the actual shell command or patch `codex` is trying to apply.

358 410 

411#### Runtime and model transport

412 

413| Metric | Type | Fields | Description |

414| --- | --- | --- | --- |

415| `api_request` | counter | `status`, `success` | API request count by HTTP status and success/failure. |

416| `api_request.duration_ms` | histogram | `status`, `success` | API request duration in milliseconds. |

417| `sse_event` | counter | `kind`, `success` | SSE event count by event kind and success/failure. |

418| `sse_event.duration_ms` | histogram | `kind`, `success` | SSE event processing duration in milliseconds. |

419| `websocket.request` | counter | `success` | WebSocket request count by success/failure. |

420| `websocket.request.duration_ms` | histogram | `success` | WebSocket request duration in milliseconds. |

421| `websocket.event` | counter | `kind`, `success` | WebSocket message/event count by type and success/failure. |

422| `websocket.event.duration_ms` | histogram | `kind`, `success` | WebSocket message/event processing duration in milliseconds. |

423| `responses_api_overhead.duration_ms` | histogram | | Responses API overhead timing from websocket responses. |

424| `responses_api_inference_time.duration_ms` | histogram | | Responses API inference timing from websocket responses. |

425| `responses_api_engine_iapi_ttft.duration_ms` | histogram | | Responses API engine IAPI time-to-first-token timing. |

426| `responses_api_engine_service_ttft.duration_ms` | histogram | | Responses API engine service time-to-first-token timing. |

427| `responses_api_engine_iapi_tbt.duration_ms` | histogram | | Responses API engine IAPI time-between-token timing. |

428| `responses_api_engine_service_tbt.duration_ms` | histogram | | Responses API engine service time-between-token timing. |

429| `transport.fallback_to_http` | counter | `from_wire_api` | WebSocket-to-HTTP fallback count. |

430| `remote_models.fetch_update.duration_ms` | histogram | | Time to fetch remote model definitions. |

431| `remote_models.load_cache.duration_ms` | histogram | | Time to load the remote model cache. |

432| `startup_prewarm.duration_ms` | histogram | `status` | Startup prewarm duration by outcome. |

433| `startup_prewarm.age_at_first_turn_ms` | histogram | `status` | Startup prewarm age when the first real turn resolves it. |

434| `cloud_requirements.fetch.duration_ms` | histogram | | Workspace-managed cloud requirements fetch duration. |

435| `cloud_requirements.fetch_attempt` | counter | See note | Workspace-managed cloud requirements fetch attempts. |

436| `cloud_requirements.fetch_final` | counter | See note | Final workspace-managed cloud requirements fetch outcome. |

437| `cloud_requirements.load` | counter | `trigger`, `outcome` | Workspace-managed cloud requirements load outcome. |

438 

439The `cloud_requirements.fetch_attempt` metric includes `trigger`, `attempt`, `outcome`, and `status_code` fields. The `cloud_requirements.fetch_final` metric includes `trigger`, `outcome`, `reason`, `attempt_count`, and `status_code` fields.

440 

441#### Turn and tool activity

442 

443| Metric | Type | Fields | Description |

444| --- | --- | --- | --- |

445| `turn.e2e_duration_ms` | histogram | | End-to-end time for a full turn. |

446| `turn.ttft.duration_ms` | histogram | | Time to first token for a turn. |

447| `turn.ttfm.duration_ms` | histogram | | Time to first model output item for a turn. |

448| `turn.network_proxy` | counter | `active`, `tmp_mem_enabled` | Whether the managed network proxy was active for the turn. |

449| `turn.memory` | counter | `read_allowed`, `feature_enabled`, `config_use_memories`, `has_citations` | Per-turn memory read availability and memory citation usage. |

450| `turn.tool.call` | histogram | `tmp_mem_enabled` | Number of tool calls in the turn. |

451| `turn.token_usage` | histogram | `token_type`, `tmp_mem_enabled` | Per-turn token usage by token type (`total`, `input`, `cached_input`, `output`, or `reasoning_output`). |

452| `tool.call` | counter | `tool`, `success` | Tool invocation count by tool name and success/failure. |

453| `tool.call.duration_ms` | histogram | `tool`, `success` | Tool execution duration in milliseconds by tool name and outcome. |

454| `tool.unified_exec` | counter | `tty` | Unified exec tool calls by TTY mode. |

455| `approval.requested` | counter | `tool`, `approved` | Tool approval request result (`approved`, `approved_with_amendment`, `approved_for_session`, `denied`, `abort`). |

456| `mcp.call` | counter | See note | MCP tool invocation result. |

457| `mcp.call.duration_ms` | histogram | See note | MCP tool invocation duration. |

458| `mcp.tools.list.duration_ms` | histogram | `cache` | MCP tool-list duration, including cache hit/miss state. |

459| `mcp.tools.fetch_uncached.duration_ms` | histogram | | Duration of uncached MCP tool fetches. |

460| `mcp.tools.cache_write.duration_ms` | histogram | | Duration of Codex Apps MCP tool-cache writes. |

461| `hooks.run` | counter | `hook_name`, `source`, `status` | Hook run count by hook name, source, and status. |

462| `hooks.run.duration_ms` | histogram | `hook_name`, `source`, `status` | Hook run duration in milliseconds. |

463 

464The `mcp.call` and `mcp.call.duration_ms` metrics include `status`; normal tool-call emissions also include `tool`, plus `connector_id` and `connector_name` when available. Blocked Codex Apps MCP calls may emit `mcp.call` with only `status`.

465 

466#### Threads, tasks, and features

467 

359| Metric | Type | Fields | Description |468| Metric | Type | Fields | Description |

360| --- | --- | --- | --- |469| --- | --- | --- | --- |

361| `feature.state` | counter | `feature`, `value` | Feature values that differ from defaults (emit one row per non-default). |470| `feature.state` | counter | `feature`, `value` | Feature values that differ from defaults (emit one row per non-default). |

362| `thread.started` | counter | `is_git` | New thread created. |471| `status_line` | counter | | Session started with a configured status line. |

363| `thread.fork` | counter | | New thread created by forking an existing thread. |472| `model_warning` | counter | | Warning sent to the model. |

473| `thread.started` | counter | `is_git` | New thread created, tagged by whether the working directory is in a Git repo. |

474| `conversation.turn.count` | counter | | User/assistant turns per thread, recorded at the end of the thread. |

475| `thread.fork` | counter | `source` | New thread created by forking an existing thread. |

364| `thread.rename` | counter | | Thread renamed. |476| `thread.rename` | counter | | Thread renamed. |

477| `thread.side` | counter | `source` | Side conversation created. |

478| `thread.skills.enabled_total` | histogram | | Number of skills enabled for a new thread. |

479| `thread.skills.kept_total` | histogram | | Number of enabled skills kept after prompt rendering. |

480| `thread.skills.truncated` | histogram | | Whether skill rendering truncated the enabled skills list (`1` or `0`). |

365| `task.compact` | counter | `type` | Number of compactions per type (`remote` or `local`), including manual and auto. |481| `task.compact` | counter | `type` | Number of compactions per type (`remote` or `local`), including manual and auto. |

366| `task.user_shell` | counter | | Number of user shell actions (`!` in the TUI for example). |

367| `task.review` | counter | | Number of reviews triggered. |482| `task.review` | counter | | Number of reviews triggered. |

368| `task.undo` | counter | | Number of undo actions triggered. |483| `task.undo` | counter | | Number of undo actions triggered. |

369| `approval.requested` | counter | `tool`, `approved` | Tool approval request result (`approved`, `approved_with_amendment`, `approved_for_session`, `denied`, `abort`). |484| `task.user_shell` | counter | | Number of user shell actions (`!` in the TUI for example). |

370| `conversation.turn.count` | counter | | User/assistant turns per thread, recorded at the end of the thread. |485| `shell_snapshot` | counter | See note | Whether taking a shell snapshot succeeded. |

371| `turn.e2e_duration_ms` | histogram | | End-to-end time for a full turn. |

372| `mcp.call` | counter | `status` | MCP tool invocation result (`ok` or error string). |

373| `model_warning` | counter | | Warning sent to the model. |

374| `tool.call` | counter | `tool`, `success` | Tool invocation result (`success`: `true` or `false`). |

375| `tool.call.duration_ms` | histogram | `tool`, `success` | Tool execution time. |

376| `remote_models.fetch_update.duration_ms` | histogram | | Time to fetch remote model definitions. |

377| `remote_models.load_cache.duration_ms` | histogram | | Time to load the remote model cache. |

378| `shell_snapshot` | counter | `success` | Whether taking a shell snapshot succeeded. |

379| `shell_snapshot.duration_ms` | histogram | `success` | Time to take a shell snapshot. |486| `shell_snapshot.duration_ms` | histogram | `success` | Time to take a shell snapshot. |

380| `db.init` | counter | `status` | State DB initialization outcomes (`opened`, `created`, `open_error`, `init_error`). |487| `skill.injected` | counter | `status`, `skill` | Skill injection outcomes by skill. |

488| `plugins.startup_sync` | counter | `transport`, `status` | Curated plugin startup sync attempts. |

489| `plugins.startup_sync.final` | counter | `transport`, `status` | Final curated plugin startup sync outcome. |

490| `multi_agent.spawn` | counter | `role` | Agent spawns by role. |

491| `multi_agent.resume` | counter | | Agent resumes. |

492| `multi_agent.nickname_pool_reset` | counter | | Agent nickname pool resets. |

493 

494The `shell_snapshot` metric includes `success` and, on failures, `failure_reason`.

495 

496#### Memory and local state

497 

498| Metric | Type | Fields | Description |

499| --- | --- | --- | --- |

500| `memory.phase1` | counter | `status` | Memory phase 1 job counts by status. |

501| `memory.phase1.e2e_ms` | histogram | | End-to-end duration for memory phase 1. |

502| `memory.phase1.output` | counter | | Memory phase 1 outputs written. |

503| `memory.phase1.token_usage` | histogram | `token_type` | Memory phase 1 token usage by token type. |

504| `memory.phase2` | counter | `status` | Memory phase 2 job counts by status. |

505| `memory.phase2.e2e_ms` | histogram | | End-to-end duration for memory phase 2. |

506| `memory.phase2.input` | counter | | Memory phase 2 input count. |

507| `memory.phase2.token_usage` | histogram | `token_type` | Memory phase 2 token usage by token type. |

508| `memories.usage` | counter | `kind`, `tool`, `success` | Memory usage by kind, tool, and success/failure. |

509| `external_agent_config.detect` | counter | See note | External agent config detections by migration item type. |

510| `external_agent_config.import` | counter | See note | External agent config imports by migration item type. |

381| `db.backfill` | counter | `status` | Initial state DB backfill results (`upserted`, `failed`). |511| `db.backfill` | counter | `status` | Initial state DB backfill results (`upserted`, `failed`). |

382| `db.backfill.duration_ms` | histogram | `status` | Duration of the initial state DB backfill, tagged with `success`, `failed`, or `partial_failure`. |512| `db.backfill.duration_ms` | histogram | `status` | Duration of the initial state DB backfill. |

383| `db.error` | counter | `stage` | Errors during state DB operations (for example, `extract_metadata_from_rollout`, `backfill_sessions`, `apply_rollout_items`). |513| `db.error` | counter | `stage` | Errors during state DB operations. |

384| `db.compare_error` | counter | `stage`, `reason` | State DB discrepancies detected during reconciliation. |514 

515The `external_agent_config.detect` and `external_agent_config.import` metrics include `migration_type`; skills migrations also include `skills_count`.

516 

517#### Windows sandbox

518 

519| Metric | Type | Fields | Description |

520| --- | --- | --- | --- |

521| `windows_sandbox.setup_success` | counter | `originator`, `mode` | Windows sandbox setup successes. |

522| `windows_sandbox.setup_failure` | counter | `originator`, `mode` | Windows sandbox setup failures. |

523| `windows_sandbox.setup_duration_ms` | histogram | `result`, `originator`, `mode` | Windows sandbox setup duration. |

524| `windows_sandbox.elevated_setup_success` | counter | | Elevated Windows sandbox setup successes. |

525| `windows_sandbox.elevated_setup_failure` | counter | See note | Elevated Windows sandbox setup failures. |

526| `windows_sandbox.elevated_setup_canceled` | counter | See note | Canceled elevated Windows sandbox setup attempts. |

527| `windows_sandbox.elevated_setup_duration_ms` | histogram | `result` | Elevated Windows sandbox setup duration. |

528| `windows_sandbox.elevated_prompt_shown` | counter | | Elevated sandbox setup prompt shown. |

529| `windows_sandbox.elevated_prompt_accept` | counter | | Elevated sandbox setup prompt accepted. |

530| `windows_sandbox.elevated_prompt_use_legacy` | counter | | User chose legacy sandbox from the elevated prompt. |

531| `windows_sandbox.elevated_prompt_quit` | counter | | User quit from the elevated prompt. |

532| `windows_sandbox.fallback_prompt_shown` | counter | | Fallback sandbox prompt shown. |

533| `windows_sandbox.fallback_retry_elevated` | counter | | User retried elevated setup from the fallback prompt. |

534| `windows_sandbox.fallback_use_legacy` | counter | | User chose legacy sandbox from the fallback prompt. |

535| `windows_sandbox.fallback_prompt_quit` | counter | | User quit from the fallback prompt. |

536| `windows_sandbox.legacy_setup_preflight_failed` | counter | See note | Legacy Windows sandbox setup preflight failure. |

537| `windows_sandbox.setup_elevated_sandbox_command` | counter | | Elevated sandbox setup command invoked. |

538| `windows_sandbox.createprocessasuserw_failed` | counter | `error_code`, `path_kind`, `exe`, `level` | Windows `CreateProcessAsUserW` failures. |

539 

540The elevated setup failure metrics include `code` and `message` when Windows setup failure details are available, and may include `originator` when emitted from the shared setup path. The `windows_sandbox.legacy_setup_preflight_failed` metric includes `originator` when emitted from the shared setup path, but fallback-prompt preflight failures may not include any fields.

385 541 

386### Feedback controls542### Feedback controls

387 543 


459- `notify` runs an external program (good for webhooks, desktop notifiers, CI hooks).615- `notify` runs an external program (good for webhooks, desktop notifiers, CI hooks).

460- `tui.notifications` is built in to the TUI and can optionally filter by event type (for example, `agent-turn-complete` and `approval-requested`).616- `tui.notifications` is built in to the TUI and can optionally filter by event type (for example, `agent-turn-complete` and `approval-requested`).

461- `tui.notification_method` controls how the TUI emits terminal notifications (`auto`, `osc9`, or `bel`).617- `tui.notification_method` controls how the TUI emits terminal notifications (`auto`, `osc9`, or `bel`).

618- `tui.notification_condition` controls whether TUI notifications fire only when

619 the terminal is `unfocused` or `always`.

462 620 

463In `auto` mode, Codex prefers OSC 9 notifications (a terminal escape sequence some terminals interpret as a desktop notification) and falls back to BEL (`\x07`) otherwise.621In `auto` mode, Codex prefers OSC 9 notifications (a terminal escape sequence some terminals interpret as a desktop notification) and falls back to BEL (`\x07`) otherwise.

464 622 


505 663 

506- `tui.notifications`: enable/disable notifications (or restrict to specific types)664- `tui.notifications`: enable/disable notifications (or restrict to specific types)

507- `tui.notification_method`: choose `auto`, `osc9`, or `bel` for terminal notifications665- `tui.notification_method`: choose `auto`, `osc9`, or `bel` for terminal notifications

666- `tui.notification_condition`: choose `unfocused` or `always` for when

667 notifications fire

508- `tui.animations`: enable/disable ASCII animations and shimmer effects668- `tui.animations`: enable/disable ASCII animations and shimmer effects

509- `tui.alternate_screen`: control alternate screen usage (set to `never` to keep terminal scrollback)669- `tui.alternate_screen`: control alternate screen usage (set to `never` to keep terminal scrollback)

510- `tui.show_tooltips`: show or hide onboarding tooltips on the welcome screen670- `tui.show_tooltips`: show or hide onboarding tooltips on the welcome screen