Evidence record / pi-coding-agent

A dated record of one change, kept so the writing that cites it can be checked. Compiled from the sources listed below by the research run, not written for reading. The judgment lives in the signals and issues that cite it, below.

2026-10-13-pi-coding-agent-codemode-lets-the-model-script-tool-calls-the-tool-calls-stay-gated-its-model-calls-do-not

Codemode lets the model script tool calls: the tool calls stay gated, its model calls do not, and “only” mode hides tools without blocking them. codemode runs model-written JavaScript in a QuickJS WASM sandbox with “no Node APIs, file system, network, or timers” (codemode.md L7). Scripts reach the outside only through tools.<name>() and models. Codemode is off by default, but the MCP extension activates it whenever an enabled server has the default codemode exposure (mcp/index.ts L501-L525). autoEnableCodemode: false prevents that, and a project value overrides the user’s (mcp.md L230). The code settles four authority facts. First, every nested tool call passes validation and the extension tool_call/tool_result hooks, tagged with parentToolCallId, so a permission extension still sees bash when a script calls it. Second, scripts can call registered codemode/deferred tools plus active direct tools. Hidden tools and inactive direct tools are excluded, including MCP tools with those exposures; removing an active direct bash tool keeps it out of scripts. Third, models.classify() and models.generateImages() spend the session’s credentials outside the tool pipeline, so a hook cannot separately intercept these model operations after admitting the script, although it can reject the enclosing codemode call; the spend lands on the codemode result and the session cost (codemode.md L93). Fourth, codemode.mode: "only" hides direct tool declarations but does not gate execution: a model that names a hidden active tool still runs it (#10426, open). The v1.0.0 release notes report a GPT-5.6 request with default tools and codemode active falling from about 5,300 to 3,300 prompt tokens; that measurement was not reproduced here.

Channel: tagged-release. The “only”-mode gap is an open issue at v1.2.0 and on main.. Half: both. Date: 2026-09-29.

Operator consequence: Enabling codemode, including through enabled MCP with default exposure, permits scripts and classifier/image spend with available credentials. Keep tool policy in tool_call handlers. To enforce a codemode-only policy, explicitly allow the top-level codemode entry, deny other disallowed root calls, and inspect nested calls too; rejecting every event without parentToolCallId also blocks codemode itself. This is source-derived policy guidance, not a tested extension. A hook can reject the enclosing script but cannot separately intercept its model operations. Withhold credentials for unwanted classifier/image providers or replace the built-in with an extension constructed with models: false. autoEnableCodemode: false only prevents MCP automatic activation: it neither disables separately activated codemode nor turns off its models API. Watch #10426 and a tagged user-facing models control; only the factory option is established today.

Receipt

Finding metadata

Run: 2026-10-13-profile-refresh-2026-09-21_2026-10-13-frontier-v0

Finding ID: 2026-10-13-pi-coding-agent-codemode-lets-the-model-script-tool-calls-the-tool-calls-stay-gated-its-model-calls-do-not

Profile citations

Source links

Primary links, including exact changelog lines when available.

Versioned source: run artifact