iOS Codex remote: Full access selected but new threads start with workspace-write/on-request; Custom config.toml works
What version of the Codex App are you using?
- Codex App:
26.519.41501(build3044) - Bundled Codex CLI in app:
0.133.0-alpha.1 - Standalone Codex CLI / app-server daemon:
0.133.0 - Host OS: macOS
26.5(25F71),arm64 - Mobile client: ChatGPT iOS app using Codex remote connections, observed through iPhone Mirroring
What subscription do you have?
ChatGPT Pro
What platform is your computer?
macOS arm64 host connected to ChatGPT iOS through Codex remote access.
What issue are you seeing?
In the ChatGPT iOS Codex remote UI, the composer permissions picker showed Full access selected for the connected Mac host, but new iPhone-created threads still started with restricted permissions:
"approval_policy": "on-request",
"sandbox_policy": {
"type": "workspace-write",
"network_access": false,
"exclude_tmpdir_env_var": false,
"exclude_slash_tmp": false
}
This caused the mobile-started Codex thread to request command approvals even though the iPhone UI showed Full access.
Switching the same iPhone composer permissions picker from Full access to Custom (config.toml) fixed the issue immediately. The host config is:
approval_policy = "never"
sandbox_mode = "danger-full-access"
After selecting Custom (config.toml), newly created iPhone threads started with:
"approval_policy": "never",
"sandbox_policy": {
"type": "danger-full-access"
}
and commands ran without approval prompts.
Steps to reproduce
- On a macOS host, configure
~/.codex/config.tomlwith:
``toml``
approval_policy = "never"
sandbox_mode = "danger-full-access"
- Start/enable the Codex remote-control daemon for mobile remote access.
- Open ChatGPT iOS > Codex remote connection to the Mac host.
- Start a new Codex thread from iPhone.
- Open the mobile composer permissions picker.
- Select
Full access; verify the picker showsFull accesschecked. - Send a prompt that requires a shell command, for example:
``text``
Run this shell command: echo IPHONE_FULL_ACCESS_TEST. Then stop.
- Inspect the resulting host-side rollout/state.
Expected behavior
When the iPhone Codex UI shows Full access, new iPhone-created threads should start with full access:
"approval_policy": "never",
"sandbox_policy": { "type": "danger-full-access" }
No command approval prompts should be required.
Actual behavior
With iPhone Full access selected, the new iPhone-created thread started with:
"approval_policy": "on-request",
"sandbox_policy": {
"type": "workspace-write",
"network_access": false
}
This made the thread ask for approvals despite the mobile UI showing Full access.
Workaround
On iPhone, select Custom (config.toml) instead of Full access.
With the host config.toml set to approval_policy = "never" and sandbox_mode = "danger-full-access", this produced the expected full-access runtime. I verified it by creating a fresh iPhone-started thread after switching to Custom (config.toml).
That thread's rollout contained:
"approval_policy": "never",
"sandbox_policy": { "type": "danger-full-access" },
"permission_profile": { "type": "disabled" }
and the model ran:
{
"cmd": "echo IPHONE_NEW_THREAD_CUSTOM_OK",
"yield_time_ms": 1000,
"max_output_tokens": 2000
}
without any sandbox_permissions escalation request. The output was:
IPHONE_NEW_THREAD_CUSTOM_OK
Additional evidence
I also updated existing local thread rows that had stale restricted permissions, but this was not the root fix. The important mobile-side observation is:
- iPhone
Full accessselected: new iPhone thread persisted ason-request+workspace-write. - iPhone
Custom (config.toml)selected: new iPhone thread persisted asnever+danger-full-access.
This looks related to, but not identical to, #22800. That issue mentions Android mobile remote permissions falling back to Default / workspace-write; this report is specifically for iOS where the UI visibly showed Full access selected, but the created thread still used restricted permissions.
3 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
I reproduced this on a substantially newer build, and in my case it also affected an existing, actively running desktop-started task.
Environment:
26.707.41301(build5103)0.144.0-alpha.40.144.126.3.1(25D771280a), arm64The task was created locally and was already running with Full Access. Its host-side rollout records show:
After opening the same task through iOS Remote and sending a follow-up with Full Access selected, that phone-originated turn received a different runtime permission envelope:
This was not merely an incorrect UI label: the running agent began requesting approval for commands and the autonomous workflow stalled.
After disconnecting Remote and ending that restricted turn, the next desktop/Goal continuation returned to the original permissions:
The documented behavior says Remote uses the connected host's permissions and that its sandboxing settings and action approvals continue to apply:
https://learn.chatgpt.com/docs/remote-connections
The
Custom (config.toml)workaround works:However, selecting Custom only affects a fresh turn. It does not repair a restricted turn that Remote has already created.
This therefore appears to be a turn-creation/inheritance bug on the mobile Remote path, including for existing desktop-started tasks—not just newly created iPhone tasks.
I can provide the complete redacted rollout records privately if useful.
Additional reproduction shows the current iOS Remote client also persists this legacy permission state into the remote host config.
Environment: ChatGPT iOS
1.2026.224; Linux remote app-server0.149.1; client identity logged ascodex_chatgpt_ios_remote. The managed host initially had nativedefault_permissions = ":workspace"and nosandbox_mode. After boot, iOS sentconfig/batchWriteat 18:51:24, 18:53:00, and 18:53:09.450 UTC. The final RPC was followed 2.12 ms later by the~/.codex/config.tomlmtime changing, leaving:The iOS-started thread was recorded as
OnRequest+AutoReview+ legacyWorkspaceWrite, withpermission_profile=Noneandactive_permission_profile=None. A simultaneously connected macOS client performed config reads but no writes. This creates a mixed native/legacy host configuration and the mobile UI then displaysCustom (config.toml). The first write occurred during new-chat initialization, before an explicit profile-selection test, so avoiding the picker alone is not sufficient. The likely fix is for iOS Remote to send nativepermissionsprofiles for thread start/resume and not synchronize chat permission presets into hostconfig.tomlviaconfig/batchWrite.