Auto-review denies required Jujutsu metadata writes in trusted workspace, blocking even jj status
What version of Codex CLI is running?
0.146.0
What subscription do you have?
Pro 20x
Which model were you using?
gpt-5.6-sol
What platform is your computer?
Darwin 25.5.0 arm64 arm
What terminal emulator and version are you using (if applicable)?
ghostty 1.3.1, tmux 3.7b
Codex doctor report
{
"schemaVersion": 1,
"generatedAt": "1785530534s since unix epoch",
"overallStatus": "fail",
"codexVersion": "0.146.0",
"checks": {
"app_server.status": {
"id": "app_server.status",
"category": "app-server",
"status": "ok",
"summary": "background server is not running",
"details": {
"control socket": "/Users/cody/.codex/app-server-control/app-server-control.sock",
"daemon state dir": "/Users/cody/.codex/app-server-daemon",
"mode": "ephemeral",
"pid file": "/Users/cody/.codex/app-server-daemon/app-server.pid (missing)",
"settings": "/Users/cody/.codex/app-server-daemon/settings.json (missing)",
"status": "not running",
"update-loop pid file": "/Users/cody/.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/cody/.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/cody/.codex",
"config.toml": "/Users/cody/.codex/config.toml",
"config.toml parse": "ok",
"cwd": "/Users/cody/dev/cs-demo-lab",
"enabled feature flags": "shell_tool, unified_exec, shell_snapshot, code_mode_host, terminal_resize_reflow, sqlite, hooks, enable_request_compression, multi_agent, apps, tool_search_always_defer_mcp_tools, tool_suggest, plugins, in_app_browser, in_app_updates, browser_use, browser_use_full_cdp_access, browser_use_external, computer_use, remote_plugin, plugin_sharing, image_generation, resize_all_images, item_ids, skill_mcp_dependency_install, skill_search, mentions_v2, steer, guardian_approval, goals, collaboration_modes, tool_call_mcp_elicitation, auth_elicitation, personality, fast_mode, tui_app_server, prevent_idle_sleep, remote_compaction_v2, workspace_dependencies",
"feature flag overrides": "prevent_idle_sleep=true",
"feature flags enabled": "39",
"log dir": "/Users/cody/.codex/log",
"mcp servers": "3",
"model": "gpt-5.6-sol",
"model provider": "openai",
"sqlite home": "/Users/cody/.codex"
},
"remediation": null,
"durationMs": 0
},
"git.environment": {
"id": "git.environment",
"category": "git",
"status": "ok",
"summary": "git version 2.54.0",
"details": {
".git entry": "directory",
"PATH git #1": "/etc/profiles/per-user/cody/bin/git",
"PATH git #2": "/run/current-system/sw/bin/git",
"PATH git #3": "/usr/bin/git",
"PATH git entries": "3",
"git branch": "detached HEAD",
"git build options": "git version 2.54.0; cpu: arm64; no commit associated with this build; sizeof-long: 8; sizeof-size_t: 8; shell-path: /nix/store/5vmd3cqj6skjajg0yj9jl8dsddwp0700-bash-5.3p9/bin/bash; rust: enabled; feature: fsmonitor--daemon; gettext: enabled; libcurl: 8.21.0; OpenSSL: OpenSSL 3.6.3 9 Jun 2026; zlib-ng: 2.3.3; SHA-1: SHA1_DC; SHA-256: SHA256_BLK; default-ref-format: files; default-hash: sha1",
"git exec path": "/nix/store/01258rj9fvamcl4bf7yjffysmwyvd72i-git-2.54.0/libexec/git-core",
"git version": "git version 2.54.0",
"repo detected": "true",
"repo root": "/Users/cody/dev/cs-demo-lab",
"selected git": "/etc/profiles/per-user/cody/bin/git"
},
"remediation": null,
"durationMs": 134
},
"installation": {
"id": "installation",
"category": "install",
"status": "fail",
"summary": "npm install -g @openai/codex would update a different install",
"details": {
"PATH codex #1": "/Users/cody/.local/share/mise/installs/npm-openai-codex/latest/bin/codex",
"current executable": "/Users/cody/.local/share/mise/installs/npm-openai-codex/0.146.0/lib/node_modules/@openai/codex/node_modules/@openai/codex-darwin-arm64/vendor/aarch64-apple-darwin/bin/codex",
"install context": "npm (package /Users/cody/.local/share/mise/installs/npm-openai-codex/0.146.0/lib/node_modules/@openai/codex/node_modules/@openai/codex-darwin-arm64/vendor/aarch64-apple-darwin, bin /Users/cody/.local/share/mise/installs/npm-openai-codex/0.146.0/lib/node_modules/@openai/codex/node_modules/@openai/codex-darwin-arm64/vendor/aarch64-apple-darwin/bin, resources /Users/cody/.local/share/mise/installs/npm-openai-codex/0.146.0/lib/node_modules/@openai/codex/node_modules/@openai/codex-darwin-arm64/vendor/aarch64-apple-darwin/codex-resources, path /Users/cody/.local/share/mise/installs/npm-openai-codex/0.146.0/lib/node_modules/@openai/codex/node_modules/@openai/codex-darwin-arm64/vendor/aarch64-apple-darwin/codex-path)",
"managed by bun": "false",
"managed by npm": "true",
"managed by pnpm": "false",
"managed package root": "/Users/cody/.local/share/mise/installs/npm-openai-codex/0.146.0/lib/node_modules/@openai/codex",
"npm package root": "/Users/cody/.local/share/mise/installs/node/24.18.1/lib/node_modules/@openai/codex",
"running package root": "/Users/cody/.local/share/mise/installs/npm-openai-codex/0.146.0/lib/node_modules/@openai/codex"
},
"remediation": "Fix PATH or npm prefix so the running package root (/Users/cody/.local/share/mise/installs/npm-openai-codex/0.146.0/lib/node_modules/@openai/codex) matches the npm global package root (/Users/cody/.local/share/mise/installs/node/24.18.1/lib/node_modules/@openai/codex).",
"durationMs": 82
},
"mcp.config": {
"id": "mcp.config",
"category": "mcp",
"status": "ok",
"summary": "MCP configuration is locally consistent",
"details": {
"configured servers": "3",
"disabled servers": "1",
"stdio servers": "2",
"streamable_http servers": "1"
},
"remediation": null,
"durationMs": 3176
},
"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 404)",
"reachability mode": "ChatGPT auth"
},
"remediation": null,
"durationMs": 267
},
"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": 835
},
"runtime.provenance": {
"id": "runtime.provenance",
"category": "runtime",
"status": "ok",
"summary": "running npm on macos-aarch64",
"details": {
"commit": "unknown",
"current executable": "/Users/cody/.local/share/mise/installs/npm-openai-codex/0.146.0/lib/node_modules/@openai/codex/node_modules/@openai/codex-darwin-arm64/vendor/aarch64-apple-darwin/bin/codex",
"install method": "npm (package /Users/cody/.local/share/mise/installs/npm-openai-codex/0.146.0/lib/node_modules/@openai/codex/node_modules/@openai/codex-darwin-arm64/vendor/aarch64-apple-darwin, bin /Users/cody/.local/share/mise/installs/npm-openai-codex/0.146.0/lib/node_modules/@openai/codex/node_modules/@openai/codex-darwin-arm64/vendor/aarch64-apple-darwin/bin, resources /Users/cody/.local/share/mise/installs/npm-openai-codex/0.146.0/lib/node_modules/@openai/codex/node_modules/@openai/codex-darwin-arm64/vendor/aarch64-apple-darwin/codex-resources, path /Users/cody/.local/share/mise/installs/npm-openai-codex/0.146.0/lib/node_modules/@openai/codex/node_modules/@openai/codex-darwin-arm64/vendor/aarch64-apple-darwin/codex-path)",
"platform": "macos-aarch64",
"version": "0.146.0"
},
"remediation": null,
"durationMs": 0
},
"runtime.search": {
"id": "runtime.search",
"category": "search",
"status": "ok",
"summary": "search is OK (bundled)",
"details": {
"search command": "/Users/cody/.local/share/mise/installs/npm-openai-codex/0.146.0/lib/node_modules/@openai/codex/node_modules/@openai/codex-darwin-arm64/vendor/aarch64-apple-darwin/codex-path/rg",
"search command readiness": "file exists",
"search provider": "bundled"
},
"remediation": null,
"durationMs": 0
},
"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/cody/.codex/tmp/arg0/codex-arg0yubVpV/codex-execve-wrapper",
"filesystem sandbox": "restricted",
"network sandbox": "restricted"
},
"remediation": null,
"durationMs": 0
},
"state.paths": {
"id": "state.paths",
"category": "state",
"status": "ok",
"summary": "state paths and databases are inspectable",
"details": {
"CODEX_HOME": "/Users/cody/.codex (dir)",
"active rollout files": "1163 files, 1125894666 total bytes, 968095 average bytes",
"archived rollout files": "0 files, 0 total bytes, 0 average bytes",
"goals DB": "/Users/cody/.codex/goals_1.sqlite (file)",
"goals DB integrity": "ok",
"log DB": "/Users/cody/.codex/logs_2.sqlite (file)",
"log DB integrity": "ok",
"log dir": "/Users/cody/.codex/log (dir)",
"memories DB": "/Users/cody/.codex/memories_1.sqlite (file)",
"memories DB integrity": "ok",
"sqlite home": "/Users/cody/.codex (dir)",
"state DB": "/Users/cody/.codex/state_5.sqlite (file)",
"state DB integrity": "ok",
"thread history DB": "/Users/cody/.codex/thread_history_1.sqlite (missing)",
"thread history DB integrity": "skipped (missing)"
},
"remediation": null,
"durationMs": 1304
},
"state.rollout_db_parity": {
"id": "state.rollout_db_parity",
"category": "threads",
"status": "warning",
"summary": "rollout files and state DB thread inventory differ",
"details": {
"default model provider": "openai",
"rollout DB active files": "1151",
"rollout DB active rows": "1151",
"rollout DB archive mismatches": "0",
"rollout DB archived files": "0",
"rollout DB archived rows": "0",
"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=1151",
"rollout DB rows": "1151",
"rollout DB scan cap reached": "false",
"rollout DB scan error sample": [
"/Users/cody/.codex/sessions/2025/09/08/rollout-2025-09-08T13-33-31-5b2aaefb-44c4-4236-a496-aa99e3e98401.jsonl (rollout at /Users/cody/.codex/sessions/2025/09/08/rollout-2025-09-08T13-33-31-5b2aaefb-44c4-4236-a496-aa99e3e98401.jsonl has no usable header record)",
"/Users/cody/.codex/sessions/2025/09/08/rollout-2025-09-08T21-32-45-172462e7-3802-4dc9-8e84-916ae2e9c0c3.jsonl (rollout at /Users/cody/.codex/sessions/2025/09/08/rollout-2025-09-08T21-32-45-172462e7-3802-4dc9-8e84-916ae2e9c0c3.jsonl has no usable header record)",
"/Users/cody/.codex/sessions/2025/09/08/rollout-2025-09-08T08-49-40-c2a592d6-68f5-4514-a13f-0f5fd529541c.jsonl (rollout at /Users/cody/.codex/sessions/2025/09/08/rollout-2025-09-08T08-49-40-c2a592d6-68f5-4514-a13f-0f5fd529541c.jsonl has no usable header record)",
"/Users/cody/.codex/sessions/2025/09/08/rollout-2025-09-08T08-50-19-c31238bc-ade7-4a3d-bd09-ae3acf2b79c6.jsonl (rollout at /Users/cody/.codex/sessions/2025/09/08/rollout-2025-09-08T08-50-19-c31238bc-ade7-4a3d-bd09-ae3acf2b79c6.jsonl has no usable header record)",
"/Users/cody/.codex/sessions/2025/09/09/rollout-2025-09-09T21-05-35-be0ea7c3-dd77-4bcd-8c8c-d5309b38ceba.jsonl (rollout at /Users/cody/.codex/sessions/2025/09/09/rollout-2025-09-09T21-05-35-be0ea7c3-dd77-4bcd-8c8c-d5309b38ceba.jsonl has no usable header record)"
],
"rollout DB scan errors": "12",
"rollout DB sources": "subagent:thread_spawn=584, subagent:other=426, cli=115, vscode=18, exec=7, subagent:review=1",
"rollout DB stale rows": "0"
},
"issues": [
{
"severity": "warning",
"cause": "rollout scan was incomplete or found bad files",
"measured": "12 scan errors, 0 malformed names, scan cap reached: false",
"expected": "rollout directories are fully scannable",
"remedy": "Check file permissions and unexpected files under CODEX_HOME sessions.",
"fields": []
}
],
"remediation": null,
"durationMs": 514
},
"system.environment": {
"id": "system.environment",
"category": "system",
"status": "ok",
"summary": "OS language en-US",
"details": {
"EDITOR": "set",
"LANG": "en_US.UTF-8",
"PAGER": "set",
"VISUAL": "set",
"os": "Mac OS 26.5.2 [64-bit]",
"os language": "en-US",
"os type": "Mac OS",
"os version": "26.5.2"
},
"remediation": null,
"durationMs": 3
},
"terminal.env": {
"id": "terminal.env",
"category": "terminal",
"status": "fail",
"summary": "TERMINFO unreadable - terminal capabilities are unknown",
"details": {
"COLORTERM": "truecolor",
"DISPLAY": "present",
"TERM": "xterm-ghostty",
"TERMINFO": "/Applications/Ghostty.app/Contents/Resources/terminfo (dir)",
"TERMINFO_DIRS entry": [
"/etc/profiles/per-user/cody/share/terminfo (dir)",
"/Users/cody/.nix-profile/share/terminfo (missing)",
"/etc/profiles/per-user/cody/share/terminfo (dir)",
"/run/current-system/sw/share/terminfo (dir)",
"/nix/var/nix/profiles/default/share/terminfo (missing)",
"/usr/share/terminfo (dir)",
"/usr/share/terminfo (dir)"
],
"TERM_PROGRAM": "ghostty",
"color output": "disabled (stdout is not a terminal)",
"effective locale": "en_US.UTF-8",
"multiplexer": "tmux 3.7b",
"stderr is terminal": "true",
"stdin is terminal": "true",
"stdout is terminal": "false",
"terminal": "Ghostty",
"terminal size": "113x56",
"terminal version": "1.3.1",
"tmux allow-passthrough": "off",
"tmux client termname": "xterm-ghostty",
"tmux client termtype": "ghostty 1.3.1",
"tmux extended-keys": "on",
"tmux focus-events": "on",
"tmux set-clipboard": "external",
"tmux xterm-keys": "on"
},
"issues": [
{
"severity": "fail",
"cause": "TERMINFO unreadable - terminal capabilities are unknown",
"measured": null,
"expected": "readable terminfo file or directory",
"remedy": "check that $TERMINFO points to a readable directory",
"fields": [
"TERMINFO",
"TERMINFO_DIRS entry"
]
}
],
"remediation": null,
"durationMs": 41
},
"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": "git repo root",
"terminal title project value": redacted,
"terminal title source": "default"
},
"remediation": null,
"durationMs": 0
},
"updates.status": {
"id": "updates.status",
"category": "updates",
"status": "fail",
"summary": "update would target a different npm install",
"details": {
"cached latest version": "0.146.0",
"check for update on startup": "true",
"last checked at": "2026-07-30T13:01:00.822939Z",
"latest version": "0.146.0",
"latest version status": "current version is not older",
"npm package root": "/Users/cody/.local/share/mise/installs/node/24.18.1/lib/node_modules/@openai/codex",
"running package root": "/Users/cody/.local/share/mise/installs/npm-openai-codex/0.146.0/lib/node_modules/@openai/codex",
"update action": "npm install -g @openai/codex",
"version cache": "/Users/cody/.codex/version.json"
},
"remediation": "Fix PATH or npm prefix so the running package root (/Users/cody/.local/share/mise/installs/npm-openai-codex/0.146.0/lib/node_modules/@openai/codex) matches the npm global package root (/Users/cody/.local/share/mise/installs/node/24.18.1/lib/node_modules/@openai/codex).",
"durationMs": 303
}
}
}
What issue are you seeing?
In a trusted repository using workspace-write and “Approve for me”/automatic approval review, Jujutsu commands
cannot run because .git/objects is protected as read-only.
Even jj status snapshots the working copy and therefore needs to write repository metadata. Codex correctly
requests sandbox escalation and the automatic reviewer classifies the request as low-risk and authorized, but
then denies it because the environment policy categorically prohibits sandbox escalation.
Example response:
Automatic approval review denied (risk: low, authorization: high):
The Jujutsu inspection is authorized and low risk, but it requests
sandbox escalation, which the environment policy prohibits.
Running jj status without escalation then fails because Jujutsu cannot create its working-copy snapshot
temporary object under .git/objects.
This prevents all normal Jujutsu workflow operations, including status inspection, diffs that require
snapshotting, descriptions, checkpoints, and creating a new working-copy change.
What steps can reproduce the bug?
Uploaded thread: 019f5cc0-f08a-78e0-ad04-90a982ad3df2
What is the expected behavior?
For a trusted repository, automatic review should approve narrowly scoped, non-destructive Jujutsu metadata
access when it is required for ordinary working-copy inspection and checkpointing.
At minimum, if the automatic reviewer cannot approve the escalation, Codex should surface the approval request
to the user instead of categorically blocking it. Explicit user authorization should allow the command to
proceed.
“Approve for me” should support normal version-control workflows without requiring the user to disable
automatic review, switch to full-access mode, or perform every Jujutsu checkpoint manually.
Additional information
Environment:
OS: macOS
Codex CLI: 0.146.0
Sandbox: workspace-write
Approval policy: on-request
Approval reviewer: guardian_subagent / “Approve for me”
Repository trust level: trusted
Version control: Jujutsu with colocated Git backend
Relevant facts:
- Workspace file edits and Go tests work normally.
- The failure is specifically caused by protected repository metadata.
- Splitting chained commands into individual jj commands does not help.
- jj --ignore-working-copy can support limited read-only inspection but cannot snapshot or checkpoint changes,
so it is not a practical workaround.
- Switching the reviewer to user may allow manual approval, but that disables the desired “Approve for me”
workflow.
- Full-access mode is unnecessarily broad for routine version-control metadata writes.
- The repository requires Jujutsu exclusively, so substituting Git is not an acceptable workaround.
- The behavior was reproduced independently in two fresh agent sessions.