SpyBara
Go Premium Account
2026
19 Feb 2026, 20:37
19 May 2026, 11:58 18 May 2026, 22:01 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
18 May 2026, 22:01
19 May 2026, 11:58 18 May 2026, 22:01 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
Fri 1 18:29 Sat 2 00:48 Sat 2 06:45 Tue 5 23:00 Thu 7 17:08 Thu 7 20:02 Mon 11 18:00 Tue 12 01:59 Wed 13 00:57 Thu 14 07:00 Thu 14 21:00 Mon 18 22:01 Tue 19 11:58

After 2026-05-02 06:45 UTC, this monitor no longer uses markdownified HTML/MDX. Comparisons across that boundary can therefore show more extensive diffs.

config-advanced.md +291 −42

Details

1# Advanced Configuration1# Advanced Configuration

2 2 

3More advanced configuration options for Codex local clients

4 

5Use these options when you need more control over providers, policies, and integrations. For a quick start, see [Config basics](https://developers.openai.com/codex/config-basic).3Use these options when you need more control over providers, policies, and integrations. For a quick start, see [Config basics](https://developers.openai.com/codex/config-basic).

6 4 

5For background on project guidance, reusable capabilities, custom slash commands, subagent workflows, and integrations, see [Customization](https://developers.openai.com/codex/concepts/customization). For configuration keys, see [Configuration Reference](https://developers.openai.com/codex/config-reference).

6 

7## Profiles7## Profiles

8 8 

9Profiles let you save named sets of configuration values and switch between them from the CLI.9Profiles let you save named sets of configuration values and switch between them from the CLI.


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"

20 21 

21[profiles.deep-review]22[profiles.deep-review]

22model = "gpt-5-pro"23model = "gpt-5-pro"

23model_reasoning_effort = "high"24model_reasoning_effort = "high"

24approval_policy = "never"25approval_policy = "never"

26model_catalog_json = "/Users/me/.codex/model-catalogs/deep-review.json"

25 27 

26[profiles.lightweight]28[profiles.lightweight]

27model = "gpt-4.1"29model = "gpt-4.1"


30 32 

31To make a profile the default, add `profile = "deep-review"` at the top level of `config.toml`. Codex loads that profile unless you override it on the command line.33To make a profile the default, add `profile = "deep-review"` at the top level of `config.toml`. Codex loads that profile unless you override it on the command line.

32 34 

35Profiles can also override `model_catalog_json`. When both the top level and the selected profile set `model_catalog_json`, Codex prefers the profile value.

36 

33## One-off overrides from the CLI37## One-off overrides from the CLI

34 38 

35In addition to editing `~/.codex/config.toml`, you can override configuration for a single run from the CLI:39In addition to editing `~/.codex/config.toml`, you can override configuration for a single run from the CLI:


41 45 

42```shell46```shell

43# Dedicated flag47# Dedicated flag

44codex --model gpt-5.248codex --model gpt-5.4

45 49 

46# Generic key/value override (value is TOML, not JSON)50# Generic key/value override (value is TOML, not JSON)

47codex --config model='"gpt-5.2"'51codex --config model='"gpt-5.4"'

48codex --config sandbox_workspace_write.network_access=true52codex --config sandbox_workspace_write.network_access=true

49codex --config 'shell_environment_policy.include_only=["PATH","HOME"]'53codex --config 'shell_environment_policy.include_only=["PATH","HOME"]'

50```54```


70 74 

71For shared defaults, rules, and skills checked into repos or system paths, see [Team Config](https://developers.openai.com/codex/enterprise/admin-setup#team-config).75For shared defaults, rules, and skills checked into repos or system paths, see [Team Config](https://developers.openai.com/codex/enterprise/admin-setup#team-config).

72 76 

73If you just need to point the built-in OpenAI provider at an LLM proxy, router, or data-residency enabled project, set environment variable `OPENAI_BASE_URL` instead of defining a new provider. This overrides the default OpenAI endpoint without a `config.toml` change.77If you just need to point the built-in OpenAI provider at an LLM proxy, router, or data-residency enabled project, set `openai_base_url` in `config.toml` instead of defining a new provider. This changes the base URL for the built-in `openai` provider without requiring a separate `model_providers.<id>` entry.

74 78 

75```toml79```toml

76export OPENAI_BASE_URL="https://api.openai.com/v1"80openai_base_url = "https://us.api.openai.com/v1"

77codex

78```81```

79 82 

80## Project config files (`.codex/config.toml`)83## Project config files (`.codex/config.toml`)

81 84 

82In 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.

83 86 

84For 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 

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

90 

91Project config files can't override settings that redirect credentials, change

92provider auth, or run machine-local notification/telemetry commands.

93Codex ignores the following keys in project-local `.codex/config.toml` and

94prints a startup warning when it sees them: `openai_base_url`,

95`chatgpt_base_url`, `model_provider`, `model_providers`, `notify`, `profile`,

96`profiles`, `experimental_realtime_ws_base_url`, and `otel`. Set those keys in

97your user-level `~/.codex/config.toml` instead.

98 

99## Hooks

100 

101Codex can also load lifecycle hooks from either `hooks.json` files or inline

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

103 

104In practice, the four most useful locations are:

105 

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

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

108- `<repo>/.codex/hooks.json`

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

110 

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

112User-level hooks remain independent of project trust.

113 

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

85 115 

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

117[[hooks.PreToolUse]]

118matcher = "^Bash$"

119 

120[[hooks.PreToolUse.hooks]]

121type = "command"

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

123timeout = 30

124statusMessage = "Checking Bash command"

125```

126 

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

128both and warns. Prefer one representation per layer.

129 

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

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

87 132 

88## Agent roles (`[agents]` in `config.toml`)133## Agent roles (`[agents]` in `config.toml`)

89 134 

90For multi-agent role configuration (`[agents]` in `config.toml`), see [Multi-agents](https://developers.openai.com/codex/multi-agent).135For subagent role configuration (`[agents]` in `config.toml`), see [Subagents](https://developers.openai.com/codex/subagents).

91 136 

92## Project root detection137## Project root detection

93 138 


104 149 

105## Custom model providers150## Custom model providers

106 151 

107A model provider defines how Codex connects to a model (base URL, wire API, and optional HTTP headers).152A 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`.

108 153 

109Define additional providers and point `model_provider` at them:154Define additional providers and point `model_provider` at them:

110 155 

111```toml156```toml

112model = "gpt-5.1"157model = "gpt-5.4"

113model_provider = "proxy"158model_provider = "proxy"

114 159 

115[model_providers.proxy]160[model_providers.proxy]


117base_url = "http://proxy.example.com"162base_url = "http://proxy.example.com"

118env_key = "OPENAI_API_KEY"163env_key = "OPENAI_API_KEY"

119 164 

120[model_providers.ollama]165[model_providers.local_ollama]

121name = "Ollama"166name = "Ollama"

122base_url = "http://localhost:11434/v1"167base_url = "http://localhost:11434/v1"

123 168 


135env_http_headers = { "X-Example-Features" = "EXAMPLE_FEATURES" }180env_http_headers = { "X-Example-Features" = "EXAMPLE_FEATURES" }

136```181```

137 182 

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

184 

185```toml

186[model_providers.proxy]

187name = "OpenAI using LLM proxy"

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

189wire_api = "responses"

190 

191[model_providers.proxy.auth]

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

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

194timeout_ms = 5000

195refresh_interval_ms = 300000

196```

197 

198The 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`.

199 

200### Amazon Bedrock provider

201 

202Codex includes a built-in `amazon-bedrock` model provider. Set it directly as

203`model_provider`; unlike custom providers, this built-in provider supports only

204the nested AWS profile and region overrides.

205 

206```toml

207model_provider = "amazon-bedrock"

208model = "<bedrock-model-id>"

209 

210[model_providers.amazon-bedrock.aws]

211profile = "default"

212region = "eu-central-1"

213```

214 

215If you omit `profile`, Codex uses the standard AWS credential chain. Set

216`region` to the supported Bedrock region that should handle requests.

217 

138## OSS mode (local providers)218## OSS mode (local providers)

139 219 

140Codex 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.220Codex 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.


153env_key = "AZURE_OPENAI_API_KEY"233env_key = "AZURE_OPENAI_API_KEY"

154query_params = { api-version = "2025-04-01-preview" }234query_params = { api-version = "2025-04-01-preview" }

155wire_api = "responses"235wire_api = "responses"

156 

157[model_providers.openai]

158request_max_retries = 4236request_max_retries = 4

159stream_max_retries = 10237stream_max_retries = 10

160stream_idle_timeout_ms = 300000238stream_idle_timeout_ms = 300000

161```239```

162 240 

241To 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.

242 

163## ChatGPT customers using data residency243## ChatGPT customers using data residency

164 244 

165Projects 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).245Projects 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).


184 264 

185## Approval policies and sandbox modes265## Approval policies and sandbox modes

186 266 

187Pick approval strictness (affects when Codex pauses) and sandbox level (affects file/network access). See [Sandbox & approvals](https://developers.openai.com/codex/security) for deeper examples.267Pick approval strictness (affects when Codex pauses) and sandbox level (affects file/network access).

188 268 

189```269For operational details to keep in mind while editing `config.toml`, see [Common sandbox and approval combinations](https://developers.openai.com/codex/agent-approvals-security#common-sandbox-and-approval-combinations), [Protected paths in writable roots](https://developers.openai.com/codex/agent-approvals-security#protected-paths-in-writable-roots), and [Network access](https://developers.openai.com/codex/agent-approvals-security#network-access).

190approval_policy = "untrusted" # Other options: on-request, never270 

271You 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.

272 

273Set `approvals_reviewer = "auto_review"` to route eligible interactive approval

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

275boundary.

276 

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

278`guardian_policy_config` takes precedence.

279 

280```toml

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

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

191sandbox_mode = "workspace-write"283sandbox_mode = "workspace-write"

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

285 

286# Example granular approval policy:

287# approval_policy = { granular = {

288# sandbox_approval = true,

289# rules = true,

290# mcp_elicitations = true,

291# request_permissions = false,

292# skill_approval = false

293# } }

192 294 

193[sandbox_workspace_write]295[sandbox_workspace_write]

194exclude_tmpdir_env_var = false # Allow $TMPDIR296exclude_tmpdir_env_var = false # Allow $TMPDIR

195exclude_slash_tmp = false # Allow /tmp297exclude_slash_tmp = false # Allow /tmp

196writable_roots = ["/Users/YOU/.pyenv/shims"]298writable_roots = ["/Users/YOU/.pyenv/shims"]

197network_access = false # Opt in to outbound network299network_access = false # Opt in to outbound network

300 

301[auto_review]

302policy = """

303Use your organization's automatic review policy.

304"""

305```

306 

307### Named permission profiles

308 

309Set `default_permissions` to reuse a sandbox profile by name. Codex includes

310the built-in profiles `:read-only`, `:workspace`, and `:danger-no-sandbox`:

311 

312```toml

313default_permissions = ":workspace"

198```314```

199 315 

316For custom profiles, point `default_permissions` at a name you define under

317`[permissions.<name>]`:

318 

319```toml

320default_permissions = "workspace"

321 

322[permissions.workspace.filesystem]

323":project_roots" = { "." = "write", "**/*.env" = "none" }

324glob_scan_max_depth = 3

325 

326[permissions.workspace.network]

327enabled = true

328mode = "limited"

329 

330[permissions.workspace.network.domains]

331"api.openai.com" = "allow"

332```

333 

334Use built-in names with a leading colon. Custom names don't use a leading

335colon and must have matching `permissions` tables.

336 

337Need 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).

338 

200In workspace-write mode, some environments keep `.git/` and `.codex/`339In workspace-write mode, some environments keep `.git/` and `.codex/`

201 read-only even when the rest of the workspace is writable. This is why340 read-only even when the rest of the workspace is writable. This is why

202 commands like `git commit` may still require approval to run outside the341 commands like `git commit` may still require approval to run outside the

203sandbox. If you want Codex to skip specific commands (for example, block `git commit` outside the sandbox), use342 sandbox. If you want Codex to skip specific commands (for example, block `git

204[rules](https://developers.openai.com/codex/rules).343 commit` outside the sandbox), use

344 <a href="/codex/rules">rules</a>.

205 345 

206Disable sandboxing entirely (use only if your environment already isolates processes):346Disable sandboxing entirely (use only if your environment already isolates processes):

207 347 


279Each metric below also includes default metadata tags: `auth_mode`, `originator`, `session_source`, `model`, and `app.version`.419Each metric below also includes default metadata tags: `auth_mode`, `originator`, `session_source`, `model`, and `app.version`.

280 420 

281| Metric | Type | Fields | Description |421| Metric | Type | Fields | Description |

282| --- | --- | --- | --- |422| ------------------------------------- | --------- | ------------------- | ----------------------------------------------------------------- |

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

284| `codex.api_request.duration_ms` | histogram | `status`, `success` | API request duration in milliseconds. |424| `codex.api_request.duration_ms` | histogram | `status`, `success` | API request duration in milliseconds. |

285| `codex.sse_event` | counter | `kind`, `success` | SSE event count by event kind and success/failure. |425| `codex.sse_event` | counter | `kind`, `success` | SSE event count by event kind and success/failure. |


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

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

293 433 

294For more security and privacy guidance around telemetry, see [Security](https://developers.openai.com/codex/security#monitoring-and-telemetry).434For more security and privacy guidance around telemetry, see [Security](https://developers.openai.com/codex/agent-approvals-security#monitoring-and-telemetry).

295 435 

296### Metrics436### Metrics

297 437 


314 454 

315#### Metrics catalog455#### Metrics catalog

316 456 

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

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

318If 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.459If 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.

319 460 

461#### Runtime and model transport

462 

320| Metric | Type | Fields | Description |463| Metric | Type | Fields | Description |

321| --- | --- | --- | --- |464| ----------------------------------------------- | --------- | -------------------- | ------------------------------------------------------------ |

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

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

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

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

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

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

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

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

473| `responses_api_overhead.duration_ms` | histogram | | Responses API overhead timing from WebSocket responses. |

474| `responses_api_inference_time.duration_ms` | histogram | | Responses API inference timing from WebSocket responses. |

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

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

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

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

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

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

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

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

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

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

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

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

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

488 

489The `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.

490 

491#### Turn and tool activity

492 

493| Metric | Type | Fields | Description |

494| -------------------------------------- | --------- | ------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |

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

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

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

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

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

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

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

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

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

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

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

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

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

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

509| `mcp.tools.fetch_uncached.duration_ms` | histogram | | Duration of MCP tool fetches that miss the cache. |

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

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

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

513 

514The `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`.

515 

516#### Threads, tasks, and features

517 

518| Metric | Type | Fields | Description |

519| --------------------------------- | --------- | --------------------- | -------------------------------------------------------------------------------- |

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

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

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

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

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

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

325| `thread.rename` | counter | | Thread renamed. |526| `thread.rename` | counter | | Thread renamed. |

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

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

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

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

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

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

328| `task.review` | counter | | Number of reviews triggered. |532| `task.review` | counter | | Number of reviews triggered. |

329| `task.undo` | counter | | Number of undo actions triggered. |533| `task.undo` | counter | | Number of undo actions triggered. |

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

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

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

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

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

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

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

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

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

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

340| `shell_snapshot.duration_ms` | histogram | `success` | Time to take a shell snapshot. |536| `shell_snapshot.duration_ms` | histogram | `success` | Time to take a shell snapshot. |

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

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

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

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

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

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

543 

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

545 

546#### Memory and local state

547 

548| Metric | Type | Fields | Description |

549| ------------------------------ | --------- | ------------------------- | --------------------------------------------------------- |

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

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

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

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

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

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

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

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

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

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

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

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

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

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

345| `db.compare_error` | counter | `stage`, `reason` | State DB discrepancies detected during reconciliation. |564 

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

566 

567#### Windows sandbox

568 

569| Metric | Type | Fields | Description |

570| ------------------------------------------------ | --------- | ----------------------------------------- | ----------------------------------------------------- |

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

589 

590The 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.

346 591 

347### Feedback controls592### Feedback controls

348 593 


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

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

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

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

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

423 670 

424In `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.671In `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.

425 672 


466 713 

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

468- `tui.notification_method`: choose `auto`, `osc9`, or `bel` for terminal notifications715- `tui.notification_method`: choose `auto`, `osc9`, or `bel` for terminal notifications

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

717 notifications fire

469- `tui.animations`: enable/disable ASCII animations and shimmer effects718- `tui.animations`: enable/disable ASCII animations and shimmer effects

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

471- `tui.show_tooltips`: show or hide onboarding tooltips on the welcome screen720- `tui.show_tooltips`: show or hide onboarding tooltips on the welcome screen