Claude Code and Codex
Choose the coding agent that works on your tasks, and tune its model, permissions, effort and timeouts.
SI Fabrik runs one of two agent runtimes for each project, set with runner.kind. Both get the same prompt, the same tracker tools and the same sandbox.
| Claude Code | Codex | |
|---|---|---|
runner.kind | claude_code (default) | codex |
| Protocol | claude -p with stream-json input and output | codex app-server (JSON-RPC) |
| Session | One long-lived process per attempt; continuation turns reuse it | One app-server session per attempt |
| Permissions | claude.permission_mode (default bypassPermissions) | Approvals accepted for the session; policies passed through |
| Credential in a sandbox | Anthropic API key, claude setup-token token, or a gateway key | OpenAI API key, or a gateway key |
| In the agent image | Yes | Yes |
Claude Code#
SI Fabrik starts Claude Code in print mode with a stream-json protocol:
claude -p --input-format stream-json --output-format stream-json --verbose \
--permission-mode bypassPermissions \
--mcp-config '{"mcpServers":{"symphony":{...},"browser":{...}}}' \
--append-system-prompt '…'Each turn writes one user message, and the turn completes on the result event. Print mode never blocks on a question, and MCP elicitations are declined.
runner:
kind: claude_code
claude:
command: claude
model: claude-opus-5-5 # --model
permission_mode: bypassPermissions
effort: high # --effort: low | medium | high | xhigh | max
max_budget_usd: 5 # --max-budget-usd, per session
allowed_tools: [] # --allowedTools
disallowed_tools: [WebFetch] # --disallowedTools
append_system_prompt: |
Prefer small, focused commits.
extra_args: []Permission modes#
| Mode | Meaning |
|---|---|
bypassPermissions | No prompts at all. High-trust: keep a sandbox on. The agent image runs as a non-root user, so bypass is allowed inside the container. |
acceptEdits | File edits are accepted; other actions follow Claude Code's rules. |
default | Claude Code's default rules. |
plan | Plan mode. |
Nobody is there to answer a permission prompt, so with the stricter modes the agent can't do anything those rules don't already allow.
Codex#
runner:
kind: codex
codex:
command: codex app-server
model: gpt-5.5-codex
approval_policy: never
thread_sandbox: workspace-write
# turn_sandbox_policy: …- Command and file-change approvals are accepted for the session (
acceptForSession).approval_policy,thread_sandboxandturn_sandbox_policyare passed to Codex unchanged. - A request for user input (
item/tool/requestUserInput) fails the turn withturn_input_required. - A dynamic tool call returns
success: falseand the session continues. - When Codex runs on the host with a gateway, it gets an isolated per-project
CODEX_HOME, so a personal~/.codexlogin can't take over from the gateway key.
Timeouts (both runners)#
Following the Symphony spec, the timeouts live under codex: but apply to both runners:
| Key | Default | Effect |
|---|---|---|
codex.turn_timeout_ms | 1 hour | Silence timeout: the turn fails after this long without any agent output. |
codex.stall_timeout_ms | 5 minutes | A run with no activity for this long is stopped and retried (stalled). 0 turns it off. |
codex.read_timeout_ms | 5 seconds | Protocol read timeout. |
The wizard writes turn_timeout_ms: 3600000 and stall_timeout_ms: 600000.
Models#
Leave claude.model (or codex.model) empty to use the runner's default, or the gateway's mapping. The wizard and the Workflow form offer Claude Opus 5.5, Sonnet 5.5 and Haiku 5.5 (claude-opus-5-5, claude-sonnet-5-5, claude-haiku-5-5), or the models your gateway lists.
Change the runner#
Switch Runner in Workflow → Settings → Agents, or edit runner.kind, and save. The project reloads the workflow right away.