Repository navigation
macOS Codex Desktop 26.707.91948 still overrides custom profile with never/user #33552
Description
What version of the Codex App are you using (From “About Codex” dialog)?
Codex Desktop 26.707.91948 (build 5440)
Bundled Codex CLI: 0.144.5
What subscription do you have?
Not included in this public report.
What platform is your computer?
Darwin 25.5.0 arm64 arm
macOS 26.5.2 (25F84)
What issue are you seeing?
After fully quitting and restarting Codex Desktop, a completely fresh conversation still overrides the separately configured approval policy and approval reviewer when using a named custom permission profile.
The configuration contains:
approval_policy = "on-request"
approvals_reviewer = "auto_review"
default_permissions = "<named custom profile>"The first turn of the fresh Desktop conversation recorded:
originator = Codex Desktop
source = vscode
cli_version = 0.144.5
approval_policy = never
approvals_reviewer = user
permission_profile.type = managed
sandbox_policy.type = workspace-write
The managed permission profile itself was applied, including its configured additional writable roots. However, the independent approval settings were changed from on-request/auto_review to never/user.
The bundled codex doctor --json loads the same configuration successfully:
config.load.status = ok
config.load.summary = config loaded
sandbox.helpers.approval policy = OnRequest
filesystem sandbox = restricted
network sandbox = enabled
Because the fresh thread runs with approval_policy = never, escalation requests are unavailable and auto-review cannot run.
What steps can reproduce the bug?
- Configure
approval_policy = "on-request",approvals_reviewer = "auto_review", and a valid named customdefault_permissionsprofile. - Fully quit Codex Desktop with Cmd-Q.
- Reopen Codex Desktop
26.707.91948. - Create a completely new conversation.
- Ask the first turn to report the task-injected runtime values for
approval_policy,approvals_reviewer,permission_profile.type, andsandbox_policy.typewithout readingconfig.toml. - Inspect the first turn context.
The new conversation receives never/user/managed/workspace-write instead of the configured on-request/auto_review approval settings.
What is the expected behavior?
A named permission profile should control filesystem and network permissions without replacing the independently configured approval policy and reviewer.
The fresh thread should start with:
approval_policy = on-request
approvals_reviewer = auto_review
permission_profile.type = managed
sandbox_policy.type = workspace-write
Additional information
This is the macOS Codex Desktop counterpart to #33084. That issue was closed after the reporter confirmed the VS Code case appeared fixed in 26.707.91948, but the Desktop reproduction above still occurs on that exact version after a full restart.
Related broader Desktop report: #32338.
Activity
github-actions commentedon Jul 16, 2026
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
liby commentedon Aug 3, 2026
Still reproducible in Codex Desktop
26.803.81509(6415, bundled CLI0.147.0-alpha.6.6). The evidence now covers three distinct paths that can converge on a task running withnever/userinstead of the configured approval settings.1. Fresh conversation, no profile switch — observed runtime reproduction
This is the path reported in the original issue. After fully restarting Desktop, I create a new user conversation and do not select Full Access or change profiles before the first turn.
approval_policy = "on-request",approvals_reviewer = "auto_review", with the named custom permission profile./doctoralso reportsOnRequest.approval policy: never,approval reviewer: user, and managedworkspace-writepermissions.never/user.This case does not require a prior Full Access selection.
2. Full Access -> named profile — request-builder trace
Separately, in Desktop
26.727.51351(6119), I traced a request-construction path that can produce the same bad combination after a profile change:{ permissions, approvalPolicy, approvalsReviewer }fromagentMode.:danger-full-access/never/user.never/uservalues in the request.thread/startorturn/startcan send<named-profile>/never/user.This is a separate path from the fresh-conversation reproduction above; it explains a Full Access -> named-profile transition, not why a brand-new conversation with no transition starts incorrectly.
3. Existing conversation reset gap — request/protocol trace
There is also a distinct reset problem for an existing conversation:
thread/start, omitted approval fields can fall back to effective config.nullapproval fields are no-ops, so switching away from Full Access can retain the thread's previousnever/uservalues.This likely needs an explicit reset-to-effective-config operation; omitting the fields or sending
nullcannot restore the configured values on an existing thread.Expected behavior
:danger-full-access/never/user.These paths share the same visible failure mode, but they should not be treated as one reproduction: case 1 is the current no-switch runtime reproduction, while cases 2 and 3 are the separately traced transition/reset paths.
tejones36 commentedon Sep 5, 2026
Still reproducible on macOS in Desktop 26.901.41123: fresh named-profile task starts with
never; dropdown also disagrees with active settingsAdding a current-version reproduction and a more specific saved-state/request-builder trace to this existing issue.
Environment
uname -mprs:Darwin 25.6.0 arm64 arm.Observed sequence and reproduction conditions
The user-level
~/.codex/config.tomlcontains:The named profile additionally permits three cache directories and enables network access. Those filesystem/network details are omitted here for brevity. The full local profile was applied to the initial task.
The system
/etc/codex/requirements.tomlcontains only:There is no system restriction requiring
approval_policy = "never", and no~/.codex/requirements.tomlexists.A new task was created with
daily-work. Full access was never selected in this task. Inspection nevertheless found these existing host-level values insideelectron-persisted-atom-statein~/.codex/.codex-global-state.json:{ "agent-mode-by-host-id": { "local": "full-access" }, "permission-selection-by-host-id:local": { "kind": "agent-mode", "agentMode": "full-access" } }The origin of those persisted values was not established. They are a reproduction precondition found during diagnosis, not evidence of a Full access selection in the affected task.
The first turn explicitly requested the following, despite the configured
on-requestpolicy. These are selected fields from the actual desktop log at2026-09-05T20:18:46.576Z:Subsequent turn-start records retained
resolvedApprovalPolicy=never.An authorized attempt to contact another task using
mcp__codex_app__send_message_to_threadfailed with:No message was sent and no approval could be presented.
The user then selected Ask for approval in the permission dropdown. The user reported that the visible label immediately snapped back to
daily-work.The backend did change: a successful
thread/settings/updatewas logged at20:32:20.402Z. The following turn at20:37:19.498Zresolved:The corresponding persisted turn context showed
:workspace, network access false, and none ofdaily-work's extra cache write roots. Saved host mode/selection becameauto.The dropdown symptom was reported by the user; the backend settings above were independently checked in local logs and the persisted turn record. This establishes that the change took effect in the backend even though the displayed label reportedly reverted. Reapplying
daily-workafterward has not been tested.Installed-code trace and isolated reproduction
Read-only inspection of the installed
app.asar, memberwebview/assets/app-initial-236e1501144c.js, found this path:iroretrieves the saved host agent mode, andrropreserves an explicitfull-accessvalue.Mg("full-access", ...)callsJbt(), which suppliesapprovalPolicy: "never".Cnobuilds the settings from that mode, then overwritesactivePermissionProfilewith the named profile without replacingapprovalPolicy.Fjtserializes both fields into the request.An isolated harness using the extracted installed
Mg,Jbt,Ag,Rbt, andFjtfunctions, plus the profile-override assignments fromCno, produced:{"savedMode":"full-access","configuredApproval":"on-request","result":{"approvalPolicy":"never","permissions":"daily-work"}} {"savedMode":"auto","configuredApproval":"on-request","result":{"approvalPolicy":"on-request","permissions":"daily-work"}}This reproduces the request-building combination without changing the live app. It is consistent with the observed first-turn request and gives a concrete way that host-level saved mode can affect a brand-new named-profile task. It is not an upstream source patch or a complete end-to-end UI reproduction.
Expected behavior
on-request/usershould use those settings, without silently inheritingneverfrom an unrelated saved host mode.:workspace/on-request/user, it should not still displaydaily-work.on-requestpolicy.The dropdown aspect appears related to #29586 and #32338; this report adds a macOS/current-build case with a verified transition from
daily-work/neverto:workspace/on-request.Only sanitized diagnostic excerpts are included. No full logs, conversation contents, private task identifiers, or personal filesystem paths are attached. Investigation did not modify configuration or the application bundle.
fix: install Codex requirements as /etc/codex/requirements.toml
liby commentedon Sep 24, 2026
Still reproducible on macOS in Codex Desktop
26.917.62051(build10789, bundled CLI0.155.0-alpha.16.3). This build also shows where the approval settings are overridden.I had been pinning the approval settings with a requirements file delivered through the user-domain
com.openai.codex/requirements_toml_base64preference. Since #46032, that preference is honored only when forced, so the pin stopped applying and the underlying behavior became visible again.Fresh task with no mode or profile switch
With
approval_policy = "on-request",approvals_reviewer = "auto_review", and a named custom profile asdefault_permissions, I fully quit Desktop, reopened it, and started a new task on the default profile. The first turn-start log entry contained:The persisted turn context recorded
approvals_reviewer = user. The saved host selection at the time was{"kind":"agent-mode","agentMode":"auto"}.Installed-bundle trace
In the installed bundle (
webview/assets/app-shared-70a4f71efb70.jsandapp-initial-37097744327a.js; the minified names below are specific to this build):zL(agentMode, runtimeWorkspaceRoots, config), then replaces onlyactivePermissionProfilewith the named default profile.zL("auto")returnsLL(runtimeWorkspaceRoots), whose reviewer parameter defaults to"user".zL("full-access")returnsZMe(), which isnever/user.custombranch readsapprovals_reviewerfrom the config, through$Me(config).A fresh task on a named profile therefore gets
on-request/userwhen the saved mode isauto, andnever/userwhen it isfull-access, whateverconfig.tomlsays. That would also explain the fresh-conversationnever/usercase in my earlier comment if the saved mode wasfull-accessthen, although I did not capture the saved mode at the time.Control
After installing the same requirements as
/etc/codex/requirements.toml(allowed_approvals_reviewers = ["auto_review"]), the same steps producedrequestApprovalsReviewer=auto_reviewin the log andapprovals_reviewer = auto_reviewin the turn context.Expected: a new task on a named profile should take
approval_policyandapprovals_reviewerfrom the effective config, or omit them so the app server resolves them, instead of inheriting them from the saved agent mode.fix: install Codex requirements as /etc/codex/requirements.toml