SafetyCard Request a review

Symphony

Turns project work into isolated autonomous Codex implementation runs

github.com/openai/symphony · 2026-10-05 · be10a1b

Defense-in-depth score

1.3 / 10

Symphony polls a tracker and runs one fully autonomous Codex agent per ticket with no human approval anywhere: the shipped workflow auto-accepts approval requests, enables network inside the sandbox, and gives the agent a raw Linear API tool using your personal key. Codex's sandbox keeps writes inside each ticket's workspace, but commands can read your whole disk and environment and send data anywhere, and setup and cleanup hooks run on the host. The dominant risk is prompt injection through ticket text or PR comments leading to credential leaks and irreversible pushes or tracker changes. The project calls itself an engineering preview for trusted environments, and that is the only safe way to run it.

Safest setup

Symphony is built to run unattended, and its shipped workflow accepts approval requests automatically, turns network on in the sandbox and hands every command your full environment, so the defaults offer little protection. Its built-in settings are stricter, and the safest setup returns to them, narrows the identities it holds and puts a container around the whole process.

SetupHowWhat it gives you
Dedicated, narrow accountsGive Symphony its own Linear member and API key limited to the team it works on, and a Git credential for its one repositoryLinear and your Git host refuse anything outside those accounts, whatever the agent asks for C1
A trimmed environmentStart Symphony from a shell holding only LINEAR_API_KEY and what the task needs, and remove shell_environment_policy.inherit=all from the command under codex:Agent commands and hooks reach only the credentials you chose for this run C1
Escalations stop the runRemove approval_policy: never so the built-in default reject policy appliesA request to go beyond the sandbox parks the ticket as blocked for you to look at C2
Network off in the sandboxSet networkAccess: false in turn_sandbox_policy, as the built-in default doesSandboxed commands cannot send data out or fetch packages the model picks C4
Only chosen ticketsSet required_labels or assignee under tracker: so only tickets you marked start a runAgents start only on work you picked, not on any ticket someone files C5
Turn and agent limitsKeep the default max_turns: 20, lower max_concurrent_agents, and set a spending limit with your model providerEach invocation ends after a fixed number of turns, and total spend has a ceiling you set C10
Its own container or VMRun Symphony and its workspaces in a container or VM holding no other credentials, with network limited to the tracker, Git host and model providerAn outer boundary around host-side hooks and full-disk reads, away from your home directory C4
A log outside the run--logs-root <path> on a volume you back up or forward off the machineA lifecycle record of every run that outlasts log rotation and the host C9

Approving with confidence

  • Require a human review on the Git host before anything merges; the Human Review ticket state is a prompt convention the agent can move past.

Handling data

  • The log file keeps raw Codex stream lines at debug level with no secret filtering; store it like the credentials the run holds.

Key gaps (6)

  1. The agent acts with the operator's full Linear account and can reach the operator's environment and home-directory credentials with network on, with no authorization layer in code. C1 · Identity & least privilege
  2. No approval gate covers shell commands or tracker mutations; under the shipped workflow approval requests are accepted automatically. C2 · Approval gates
  3. Sandboxed commands can read the whole disk and the operator's full environment with unrestricted network in the shipped workflow, and workspace hooks run on the host. C4 · Code-execution isolation
  4. Prompt injection via ticket text or PR comments can lead to both data exfiltration and irreversible actions with no human involved. C5 · Untrusted input blast radius
  5. The shipped workflow auto-trusts the workspace repository's tool configuration, which then configures host-side hook commands. C6 · Memory, context & configuration integrity
  6. Model-chosen package installs run unattended with network on, as the operator with the full environment. C7 · Third-party extensions

Criteria

C1 Identity & least privilege

0.00 / 1.00

Symphony acts with the operator's own authority. The Linear tool it gives the agent sends any GraphQL query or mutation using the operator's personal Linear API key, so the agent can read or change anything that user can in the whole Linear workspace; the only limit is the prompt telling it to stay on its ticket. The shipped workflow also tells Codex to pass the operator's full environment to every command, and the default sandbox policy can read the whole disk, so cloud, Git and SSH credentials are within reach. The one narrowing step is that the Linear key itself is removed from the Codex process environment.

C2 Approval gates

0.05 / 1.00

Symphony is built to run without a human in the loop. With the shipped workflow (approval policy 'never') any approval request Codex raises is answered 'accept for session' automatically, including MCP tool-call approvals; with the built-in default policy, escalations are instead rejected and the ticket is parked as blocked, but no human is ever shown the exact action to approve. Shell commands, pushes, PR comments and every tracker mutation run with no gate. The 'Human Review' and 'Merging' ticket states are a workflow convention in the prompt, and the agent holds a tool that can change ticket state itself.

C3 Tool & action scoping

0.05 / 1.00

The agent's tools are general-purpose: Codex's shell plus a Linear tool that forwards any GraphQL document and variables unchanged, checking only that a query string is present. Nothing restricts which issues, projects or operations the tracker tool touches, and the shipped workflow enables shell, file writes, network and the tracker tool all at once. The reach of shell commands is narrowed only by the Codex sandbox, which limits writes to the workspace but allows reading the whole disk.

C4 Code-execution isolation

0.33 / 1.00

Codex runs each agent inside its own OS sandbox, configured by Symphony to 'workspace-write' so commands can only write inside the per-issue workspace; the sandbox itself is implemented in Codex, outside this repository. The shipped workflow turns network access on inside that sandbox, passes the operator's full environment to commands, and the default policy gives read access to the entire filesystem, so home-directory and environment credentials are reachable from inside. Workspace hooks (clone, dependency fetch, cleanup tasks) run directly on the host with Symphony's full environment and no sandbox. The sandbox mode and policy are plain workflow settings passed through without warning.

C5 Untrusted input blast radius

0.00 / 1.00

Ticket titles and descriptions are rendered straight into the agent's prompt, and the workflow tells the agent to treat every PR review comment, human or bot, as blocking work, alongside repository files, command output and anything it fetches over the network. Nothing marks or limits these sources. In the same unattended session the agent can read the operator's files and credentials, send data anywhere over the network, push code, comment, and change any ticket in the workspace. A successful prompt injection therefore leads to data leaks and irreversible actions with no human involved.

C6 Memory, context & configuration integrity

0.05 / 1.00

The agent's working memory is a single 'Codex Workpad' comment on each ticket that it writes freely and every later run, retry or rework reads back as its plan; other people and agents can see and edit those comments too. Per-issue workspaces persist between runs. The shipped setup hook automatically marks the cloned repository's mise configuration as trusted, so repository-controlled tool configuration is honored by later host-side commands without an operator decision, and Codex loads the repository's own instruction and skill files. None of these paths is validated or versioned by Symphony.

C7 Third-party extensions

0.00 / 1.00

Symphony itself loads no plugins, but the agent it runs can install and execute any package from the internet: the shipped workflow gives the sandbox network access and approves everything automatically, and the setup hook fetches dependencies on the host. When Codex asks whether to allow an MCP tool call, Symphony answers 'approve' on its own under the shipped policy. Nothing pins, verifies or confines what gets installed; it runs as the operator's user with the full environment.

C8 Secrets & sensitive-data protection

0.20 / 1.00

Tracker keys come from environment variables and are kept host-side: Symphony removes them from the Codex process environment and executes tracker calls itself, so the key never enters the prompt. That is the only protection. Every other credential in the operator's environment is passed to Codex commands under the shipped workflow, hooks receive everything including the tracker key, nothing is masked or filtered, and the disk log handler records all log levels, including raw Codex stream lines at debug level. There is no telemetry.

C9 Audit & traceability

0.30 / 1.00

Symphony writes a rotating log file outside the workspace with lifecycle events: dispatch, session start and end, retries, hook runs and failures, tagged with issue and session identifiers. Individual commands, file changes and tracker tool calls (including mutations Symphony executes on the agent's behalf) are kept only as the latest event in memory for the dashboard and are not written to its log. Codex may keep its own session transcript, but that is outside this repository. The log rotates after 50 MB and nothing is tamper-evident.

C10 Limits & kill switch

0.33 / 1.00

Each agent invocation runs at most 20 Codex turns, a turn is abandoned after an hour without output, stalled runs are restarted after five minutes, hooks time out after 60 seconds, and at most 10 agents run at once. But when an invocation ends with the ticket still active, Symphony schedules a continuation a second later, so there is no cap on total turns, time or spend per ticket, and no token or cost budget at all. The agent can keep itself running by leaving its ticket active or by filing new tickets that start new runs. Moving a ticket to a terminal state stops its agent and closes the Codex process pipe.