Agents

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 CodeCodex
runner.kindclaude_code (default)codex
Protocolclaude -p with stream-json input and outputcodex app-server (JSON-RPC)
SessionOne long-lived process per attempt; continuation turns reuse itOne app-server session per attempt
Permissionsclaude.permission_mode (default bypassPermissions)Approvals accepted for the session; policies passed through
Credential in a sandboxAnthropic API key, claude setup-token token, or a gateway keyOpenAI API key, or a gateway key
In the agent imageYesYes

Claude Code#

SI Fabrik starts Claude Code in print mode with a stream-json protocol:

Shell
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.

WORKFLOW.md
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#

ModeMeaning
bypassPermissionsNo 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.
acceptEditsFile edits are accepted; other actions follow Claude Code's rules.
defaultClaude Code's default rules.
planPlan 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#

WORKFLOW.md
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_sandbox and turn_sandbox_policy are passed to Codex unchanged.
  • A request for user input (item/tool/requestUserInput) fails the turn with turn_input_required.
  • A dynamic tool call returns success: false and the session continues.
  • When Codex runs on the host with a gateway, it gets an isolated per-project CODEX_HOME, so a personal ~/.codex login 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:

KeyDefaultEffect
codex.turn_timeout_ms1 hourSilence timeout: the turn fails after this long without any agent output.
codex.stall_timeout_ms5 minutesA run with no activity for this long is stopped and retried (stalled). 0 turns it off.
codex.read_timeout_ms5 secondsProtocol 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.

See also#