turn/start failed in TUI when network.enabled = true is enabled in requirements.toml
What version of Codex CLI is running?
0.142.2
What subscription do you have?
business
Which model were you using?
gpt-5.5
What platform is your computer?
macOS
What terminal emulator and version are you using (if applicable)?
zsh
Codex doctor report
{
"schemaVersion": 1,
"generatedAt": "1782461140s since unix epoch",
"overallStatus": "ok",
"codexVersion": "0.142.2",
"checks": {
"app_server.status": {
"id": "app_server.status",
"category": "app-server",
"status": "ok",
"summary": "background server is not running",
"details": {
"control socket": "/Users/munila/.codex/app-server-control/app-server-control.sock",
"daemon state dir": "/Users/munila/.codex/app-server-daemon",
"mode": "ephemeral",
"pid file": "/Users/munila/.codex/app-server-daemon/app-server.pid (missing)",
"settings": "/Users/munila/.codex/app-server-daemon/settings.json (missing)",
"status": "not running",
"update-loop pid file": "/Users/munila/.codex/app-server-daemon/app-server-updater.pid (missing)"
},
"remediation": null,
"durationMs": 0
},
"auth.credentials": {
"id": "auth.credentials",
"category": "auth",
"status": "ok",
"summary": "auth is configured",
"details": {
"auth file": "/Users/munila/.codex/auth.json",
"auth storage mode": "File",
"stored API key": "false",
"stored ChatGPT tokens": "true",
"stored agent identity": "false",
"stored auth mode": "chatgpt"
},
"remediation": null,
"durationMs": 0
},
"config.load": {
"id": "config.load",
"category": "config",
"status": "ok",
"summary": "config loaded",
"details": {
"CODEX_HOME": "/Users/munila/.codex",
"config.toml": "/Users/munila/.codex/config.toml",
"config.toml parse": "ok",
"cwd": "/Users/munila",
"enabled feature flags": "shell_tool, unified_exec, shell_snapshot, terminal_resize_reflow, sqlite, hooks, enable_request_compression, multi_agent, apps, tool_search_always_defer_mcp_tools, tool_suggest, plugins, in_app_browser, browser_use, browser_use_full_cdp_access, browser_use_external, computer_use, plugin_sharing, image_generation, resize_all_images, skill_mcp_dependency_install, mentions_v2, steer, guardian_approval, goals, collaboration_modes, tool_call_mcp_elicitation, personality, fast_mode, tui_app_server, auto_compaction, remote_compaction_v2, workspace_dependencies",
"feature flag overrides": "none",
"feature flags enabled": "33",
"log dir": "/Users/munila/.codex/log",
"mcp servers": "1",
"model": "<default>",
"model provider": "openai",
"sqlite home": "/Users/munila/.codex"
},
"remediation": null,
"durationMs": 0
},
"git.environment": {
"id": "git.environment",
"category": "git",
"status": "ok",
"summary": "git version 2.50.1 (Apple Git-155)",
"details": {
"PATH git #1": "/usr/bin/git",
"PATH git entries": "1",
"git build options": "git version 2.50.1 (Apple Git-155); cpu: arm64; no commit associated with this build; sizeof-long: 8; sizeof-size_t: 8; shell-path: /bin/sh; feature: fsmonitor--daemon; libcurl: 8.7.1; zlib: 1.2.12; SHA-1: SHA1_DC; SHA-256: SHA256_BLK",
"git exec path": "/Library/Developer/CommandLineTools/usr/libexec/git-core",
"git version": "git version 2.50.1 (Apple Git-155)",
"repo detected": "false",
"selected git": "/usr/bin/git"
},
"remediation": null,
"durationMs": 21
},
"installation": {
"id": "installation",
"category": "install",
"status": "ok",
"summary": "installation looks consistent",
"details": {
"PATH codex #1": "/opt/homebrew/bin/codex",
"current executable": "/opt/homebrew/bin/codex",
"install context": "brew",
"managed by bun": "false",
"managed by npm": "false",
"managed package root": "not set"
},
"remediation": null,
"durationMs": 3
},
"mcp.config": {
"id": "mcp.config",
"category": "mcp",
"status": "ok",
"summary": "MCP configuration is locally consistent",
"details": {
"configured servers": "1",
"disabled servers": "0",
"stdio servers": "1"
},
"remediation": null,
"durationMs": 2
},
"network.env": {
"id": "network.env",
"category": "network",
"status": "ok",
"summary": "network-related environment looks readable",
"details": {
"proxy env vars": "none"
},
"remediation": null,
"durationMs": 0
},
"network.provider_reachability": {
"id": "network.provider_reachability",
"category": "reachability",
"status": "ok",
"summary": "active provider endpoints are reachable over HTTP",
"details": {
"ChatGPT base URL": "https://chatgpt.com/backend-api/ reachable (HTTP 403)",
"reachability mode": "ChatGPT auth"
},
"remediation": null,
"durationMs": 269
},
"network.websocket_reachability": {
"id": "network.websocket_reachability",
"category": "websocket",
"status": "ok",
"summary": "Responses WebSocket handshake succeeded",
"details": {
"DNS": "2 IPv4, 2 IPv6, first IPv4",
"auth mode": "chatgpt",
"connect timeout": "15000 ms",
"endpoint": "wss://chatgpt.com/backend-api/<redacted>",
"handshake result": "HTTP 101 Switching Protocols",
"model provider": "openai",
"models etag present": "true",
"provider name": "OpenAI",
"proxy env vars": "none",
"reasoning header": "false",
"server model present": "false",
"supports websockets": "true",
"wire API": "responses"
},
"remediation": null,
"durationMs": 1678
},
"runtime.provenance": {
"id": "runtime.provenance",
"category": "runtime",
"status": "ok",
"summary": "running brew on macos-aarch64",
"details": {
"commit": "unknown",
"current executable": "/opt/homebrew/bin/codex",
"install method": "brew",
"platform": "macos-aarch64",
"version": "0.142.2"
},
"remediation": null,
"durationMs": 0
},
"runtime.search": {
"id": "runtime.search",
"category": "search",
"status": "ok",
"summary": "search is OK (system)",
"details": {
"search command": "rg",
"search command readiness": "ripgrep 15.1.0",
"search provider": "system"
},
"remediation": null,
"durationMs": 12
},
"sandbox.helpers": {
"id": "sandbox.helpers",
"category": "sandbox",
"status": "ok",
"summary": "sandbox configuration is readable",
"details": {
"approval policy": "OnRequest",
"codex-linux-sandbox helper": "none",
"execve wrapper helper": "/Users/munila/.codex/tmp/arg0/codex-arg0y0j0qR/codex-execve-wrapper",
"filesystem sandbox": "restricted",
"network sandbox": "enabled"
},
"remediation": null,
"durationMs": 0
},
"state.paths": {
"id": "state.paths",
"category": "state",
"status": "ok",
"summary": "state paths and databases are inspectable",
"details": {
"CODEX_HOME": "/Users/munila/.codex (dir)",
"active rollout files": "67 files, 30409502 total bytes, 453873 average bytes",
"archived rollout files": "1 files, 234317 total bytes, 234317 average bytes",
"goals DB": "/Users/munila/.codex/goals_1.sqlite (file)",
"goals DB integrity": "ok",
"log DB": "/Users/munila/.codex/logs_2.sqlite (file)",
"log DB integrity": "ok",
"log dir": "/Users/munila/.codex/log (missing)",
"memories DB": "/Users/munila/.codex/memories_1.sqlite (file)",
"memories DB integrity": "ok",
"sqlite home": "/Users/munila/.codex (dir)",
"state DB": "/Users/munila/.codex/state_5.sqlite (file)",
"state DB integrity": "ok"
},
"remediation": null,
"durationMs": 967
},
"state.rollout_db_parity": {
"id": "state.rollout_db_parity",
"category": "threads",
"status": "ok",
"summary": "rollout files and state DB thread inventory agree",
"details": {
"default model provider": "openai",
"rollout DB active files": "67",
"rollout DB active rows": "67",
"rollout DB archive mismatches": "0",
"rollout DB archived files": "1",
"rollout DB archived rows": "1",
"rollout DB duplicate DB paths": "0",
"rollout DB duplicate rollout thread ids": "0",
"rollout DB malformed file names": "0",
"rollout DB missing active rows": "0",
"rollout DB missing archived rows": "0",
"rollout DB model providers": "openai=68",
"rollout DB rows": "68",
"rollout DB scan cap reached": "false",
"rollout DB scan errors": "0",
"rollout DB sources": "cli=42, vscode=24, subagent:other=2",
"rollout DB stale rows": "0"
},
"remediation": null,
"durationMs": 244
},
"system.environment": {
"id": "system.environment",
"category": "system",
"status": "ok",
"summary": "OS language en-DE",
"details": {
"EDITOR": "not set",
"LANG": "C.UTF-8",
"LC_CTYPE": "UTF-8",
"VISUAL": "not set",
"os": "Mac OS 26.5.1 [64-bit]",
"os language": "en-DE",
"os type": "Mac OS",
"os version": "26.5.1"
},
"remediation": null,
"durationMs": 1
},
"terminal.env": {
"id": "terminal.env",
"category": "terminal",
"status": "ok",
"summary": "terminal metadata was detected",
"details": {
"COLORTERM": "truecolor",
"TERM_PROGRAM": "Apple_Terminal",
"color output": "enabled",
"effective locale": "UTF-8",
"stderr is terminal": "true",
"stdin is terminal": "true",
"stdout is terminal": "true",
"terminal": "Apple Terminal",
"terminal size": "240x90",
"terminal version": "470.2"
},
"remediation": null,
"durationMs": 0
},
"terminal.title": {
"id": "terminal.title",
"category": "title",
"status": "ok",
"summary": "terminal title default",
"details": {
"terminal title activity": "true",
"terminal title items": "activity, project-name",
"terminal title project source": "cwd",
"terminal title project value": "munila",
"terminal title source": "default"
},
"remediation": null,
"durationMs": 0
},
"updates.status": {
"id": "updates.status",
"category": "updates",
"status": "ok",
"summary": "update configuration is locally consistent",
"details": {
"cached latest version": "0.142.2",
"check for update on startup": "true",
"last checked at": "2026-06-26T07:12:34.570124Z",
"latest version": "0.142.2",
"latest version status": "current version is not older",
"update action": "brew upgrade --cask codex",
"version cache": "/Users/munila/.codex/version.json"
},
"remediation": null,
"durationMs": 257
}
}
}
What issue are you seeing?
When a custom permission profile contains a network section with enabled = true, the Codex CLI is unable to start the first turn and exits with
Error: turn/start failed in TUI
The issue disappears when enabled is commented out.
What steps can reproduce the bug?
Use the following requirements.toml in /etc/codex and start codex via terminal:
default_permissions = "github_only"
[allowed_permission_profiles]
github_only = true
":read-only" = true
[permissions.github_only]
extends = ":read-only"
[permissions.github_only.network]
enabled = true
allow_local_binding = false
[permissions.github_only.network.domains]
"github.com" = "allow"
"api.github.com" = "allow"
"raw.githubusercontent.com" = "allow"
"objects.githubusercontent.com" = "allow"
"githubusercontent.com" = "allow"
What is the expected behavior?
When solving tasks, codex should access these urls without asking for permission and if it wants to use other urls it should ask for permissions
Additional information
_No response_
4 Comments
Patch branch for this: https://github.com/openai/codex/compare/main...Nicolas0315:codex/network-enabled-requirements?expand=1
What changed:
thread/startnow preserves managed permission profile metadata fromrequirements.tomlwhen the default profile comes from requirements rather than user config.requirements.tomlwithdefault_permissions = "github_only"and[permissions.github_only.network] enabled = true, then starting a turn withpermissions: "github_only".Verification:
just fmt;git diff --check; focused app-server regression test; affected existing app-server tests;cargo test -p codex-core network_proxy;cargo test -p codex-core system_requirements_define_managed_permission_profiles;cargo check -p codex-core -p codex-app-server.cyberagent-mac-m5maxover SSH: fetched7b0f248ab;git diff --check origin/main...HEAD; focused app-server regression test;cargo check -p codex-core -p codex-app-server.nicolas2025over SSH: fetched7b0f248ab;git diff --check origin/main...HEAD; focused app-server regression test;cargo check -p codex-core -p codex-app-server.nicolas-macbook-proover SSH: fetched7b0f248ab;git diff --check origin/main...HEAD; Cargo is not installed there, so this was diff-only.rtx5060tiover SSH: fetched7b0f248ab;git diff --check origin/main...HEAD; Cargo is still blocked by that machine's local linker setup (link.exerejects MSVC-style arguments withextra operand ...,TEST_EXIT=101); confirmed no lingering cargo/rustc/link processes.origin/mainmerge sanity:git merge-tree --write-tree origin/main HEADcompleted cleanly.This looks like a profile-origin propagation bug rather than a generic network toggle bug. The important invariant is that a managed profile selected from requirements.toml has to arrive at turn/start as the same profile object the config loader accepted, including its network policy.
I would preserve three separate facts in the startup envelope:
That separation matters because enabled = true is not just a boolean permission. It changes the interpretation of the domain allowlist, local binding, and the fallback path for off-list hosts. If the profile metadata is lost between config load and app-server startup, the runtime can see a valid permission name but no longer know which network policy was supposed to bind the first turn.
The regression I would add is issue-shaped: default profile comes from requirements.toml, the profile has network.enabled = true plus an allowlist, and the first turn starts without downgrading to the read-only base profile. Then add two negatives: an off-list host still follows the selected policy boundary, and a user config profile with the same name cannot silently replace the managed profile unless precedence is explicit and tested.
Boundary: architecture and regression-test feedback only; no claim about running the branch, validating implementation behavior, implementation correctness, merge readiness, security review, production readiness, partnership, customer interest, official alignment, OpenAI usage, Codex usage, conformance certification, or Neura usage.
Hi! Just checking in to see if there have been any updates on this issue.
A fix will be included in the next release that resolves managed profiles consistently per turn and adds core and app-server regressions for this exact failure.