01 / Selected tool executes
Grant exec_command
Actual command on a fictional fixture
cat fictional-observatory.txtFICTIONAL OBSERVATORY The brass telescope points north.
Exit code 0 Fixture unchanged
The problem
A profile that names only allowed MCP tools leaves native shell, browser or other runtime tools outside the visible choice.
Recorded runtime check
The protected thread could use exec_command. After the app-server restarted, that same thread still could not use apply_patch. A separate control granted the patch tool and created its expected file.
Actual patched Codex app-server · scripted upstream messages · synthetic model/account fixtures · no real model inference.
A shell grant, with its full reach. exec_command is a broad shell tool. The harmless read shown here does not make it a read-only filesystem permission.
01 / Selected tool executes
exec_commandActual command on a fictional fixture
cat fictional-observatory.txtFICTIONAL OBSERVATORY The brass telescope points north.
Exit code 0 Fixture unchanged
02 / App-server restarts
The engine’s start_or_resume_thread path reloads the protected thread after the app-server stops.
exec_commandOne app-server restart; the Engine process itself was not restarted.
03 / Protected thread after resume
exec_commandapply_patchActual runtime refusal
unsupported custom tool call: apply_patch
Protected target fileAbsent before absent after
Separate fresh control thread
apply_patchSelected recorded result
Exit code 0; file added.Expected fixture bytes matched.
Different owned control fileAbsent before present after
The control is a different thread. It did not widen the protected grant. Start requests differ only in the selected tool; the patch item differs only in its owned target filename.
These are the runtime’s native tools. Gateway/MCP resource scopes and tool menus are a separate boundary.
This is a selected projection of two saved runs, not a live terminal. A deterministic local fake Responses peer supplied every assistant message and tool-call item. No real model chose either operation; no hosted inference occurred. This page only displays saved results.
e1553a5; upstream rust-v0.162.0 / c1382380gpt-6.1-sol is fixture metadata, not an inference claim or current account catalog.The denied patch follows cold resume; the accepted patch starts a fresh control thread. This checks native tool identity and resume behavior. It does not establish production deployment, settings UI, account authentication, fork/child inheritance, broad shell containment or an adversarial security audit.
Read the selected public receiptWhat this makes possible
Codex resolves exact native tool identities against a runtime catalog and enforces the selected ceiling. The recorded checks show that grant surviving an app-server restart and same-thread resume.
Source information sheet
Source and release history inspected. The 15 October controlled checks ran the actual patched Codex app-server with scripted local upstream messages and synthetic model/account fixtures. They establish a real native read, same-thread app-server resume and separate denied/granted patch outcomes; no real inference or production deployment is claimed.
Release anchor: codex-engine v0.6.28; panel-forge web-v10.20.74.
Research cut: 15 October 2026. Source areas below are from codex-engine + panel-forge. Private conversation references are retained in the research ledger and are not published here.
Discover the runtime catalog, validate exact selected names and pass an enforced registry ceiling into the patched app-server. The engine also persists its policy record for protected sessions.
The source defines ceiling inheritance for fork and child sessions as well. The execution exhibit here checks resume only; its separate positive control verifies that the excluded patch call form works when granted.
The protected thread grants exec_command, a broad shell tool. Its harmless fixture read does not make that grant a read-only filesystem permission.
After one app-server restart, the engine resumes the same saved thread and the excluded apply_patch call is unavailable.
A fresh control thread grants apply_patch and creates its expected owned file. The protected thread is not widened.
codex-engine/codex_engine/tool_policy.pycodex-engine/codex_engine/native_tools.pycodex-engine/codex_engine/thread_session.pypanel-forge/resources/js/components/settings/tabs/SystemPromptsTab.vuepanel-forge/app/Support/CodexEngine/CodexEngineToolFence.phpThe saved runtime checks use scripted local upstream messages and synthetic model/account fixtures. A real native shell read, same-thread app-server restart/resume, excluded patch and separate granted patch control establish the bounded behavior shown. No real model inference or Gateway authorization is exercised.
Dates describe the researched record, rather than today’s deployment.
codex-engine v0.6.28; panel-forge web-v10.20.74