Symphony is an orchestrator that watches a Linear project, creates isolated workspaces per issue, and runs Codex agents to implement work automatically.
This repository already includes the official Elixir reference implementation (elixir/) plus local
helper scripts so you can run quickly.
Warning This is an experimental reference implementation. Use it in trusted environments only.
- Poll Linear issues from one configured project.
- Start Codex app-server agents for active issues.
- Keep issue work running in isolated workspaces.
- Stop/cleanup work when issue reaches terminal states.
- Install runtime and build once:
cd /home/lightningxxl/.openclaw/workspace/projects/custom-symphony
./scripts/option2-setup.sh- Start service:
./scripts/option2-run.shIf everything is healthy, you will see a SYMPHONY STATUS dashboard in terminal.
For real project work, prefer running Symphony against the target repo's own
WORKFLOW.md instead of editing symphony/elixir/WORKFLOW.md.
For Claworld, use:
export LINEAR_API_KEY='your-linear-token'
export LINEAR_PROJECT_SLUG_ID='b6cad86a7c54'
cd /home/lightningxxl/.openclaw/workspace/projects/custom-symphony
./scripts/run-claworld.shFor Claworld, treat ./scripts/run-claworld.sh as the only supported launcher.
It resolves a canonical local mirror, optionally refreshes its remote-tracking refs with a
non-destructive git fetch, exports an explicit CLAWORLD_CANONICAL_SOURCE_REF, and then hands
control to Symphony. Do not run
./scripts/option2-run.sh /home/lightningxxl/.openclaw/workspace/projects/claworld/WORKFLOW.md directly unless you are
also setting the Claworld-specific bootstrap env vars yourself.
Default assumptions in scripts/run-claworld.sh:
- Claworld repo:
/home/lightningxxl/.openclaw/workspace/projects/claworld - Claworld canonical source ref:
origin/HEADwhen available, otherwiseorigin/main, then localHEAD - Symphony workspaces:
/home/lightningxxl/.openclaw/workspace/projects/claworld-workspaces - OpenClaw reference repo:
/home/lightningxxl/.openclaw/workspace - Feishu reference repo:
$PROJECTS_ROOT/clawdbot-feishu (if present)or$PROJECTS_ROOT/clawbot-feishu (fallback if present)
Override them with env vars when needed:
CLAWORLD_ROOT=/abs/path/to/claworld \
SYMPHONY_WORKSPACE_ROOT=/abs/path/to/workspaces \
OPENCLAW_REF_ROOT=/abs/path/to/openclaw \
CLAWDBOT_FEISHU_REF_ROOT=/abs/path/to/clawdbot-feishu \
./scripts/run-claworld.shOptional Git bootstrap overrides:
CLAWORLD_CANONICAL_SOURCE_REPO=/abs/path/to/canonical/claworld \
CLAWORLD_CANONICAL_SOURCE_REF=origin/main \
CLAWORLD_PUSH_REPO_URL=git@github.com:Lightningxxl/claworld.git \
CLAWORLD_REFRESH_CANONICAL_SOURCE_ON_START=1 \
CLAWORLD_ALLOW_STALE_CANONICAL_SOURCE_ON_START=0 \
./scripts/run-claworld.shLegacy aliases still work for compatibility:
CLAWORLD_SOURCE_REPO_URLCLAWORLD_SOURCE_REFCLAWORLD_SYNC_REMOTE_ON_STARTCLAWORLD_ALLOW_STALE_SOURCE_ON_START
This is the preferred harness-engineering setup because:
- the target repo owns its own repo map, workflow, and validation rules
- Symphony stays focused on orchestration, workspace lifecycle, and Linear polling
- project-specific context and acceptance harnesses evolve with the project instead of drifting inside the Symphony repo
Treat elixir/WORKFLOW.md as a reference workflow for Symphony itself, not as the
authoritative Claworld runtime contract. For Claworld development, the source of truth is:
scripts/run-claworld.shfor launcher/bootstrap policy/home/lightningxxl/.openclaw/workspace/projects/claworld/WORKFLOW.mdfor project-owned workspace/bootstrap rules/home/lightningxxl/.openclaw/workspace/projects/claworld/docs/SYMPHONY_HARNESS.mdfor harness expectations
The practical consequence is:
/home/lightningxxl/.openclaw/workspace/projects/claworldacts as the canonical local mirror- launcher startup refreshes that mirror from
originonce before scheduling begins - Claworld workspaces are bootstrapped from an explicit canonical source repo and canonical source ref
- Claworld retries should reuse the existing workspace instead of auto-pulling remote state
- any remote sync should happen once at launcher time via
git fetch, not as an implicitgit pullbefore every retry
Recommended approach:
- Put token in env var.
- Keep
WORKFLOW.mdasapi_key: $LINEAR_API_KEY. - Keep the active Linear project binding as
project_slug: $LINEAR_PROJECT_SLUG_ID.
Example:
export LINEAR_API_KEY='your_new_token'
export LINEAR_PROJECT_SLUG_ID='b6cad86a7c54'
./scripts/option2-run.shIf your token was shared in chat or committed, rotate it in Linear immediately.
elixir/WORKFLOW.md has two parts:
- YAML front matter: runtime configuration.
- Markdown body: prompt template sent to each agent.
tracker.kind- Task source type. In this repo the production path is
linear.
- Task source type. In this repo the production path is
tracker.api_key- Linear personal API token (or
$LINEAR_API_KEY).
- Linear personal API token (or
tracker.project_slug- Linear project identifier (slugId used by this implementation, often
referenced as
$LINEAR_PROJECT_SLUG_ID).
- Linear project identifier (slugId used by this implementation, often
referenced as
tracker.active_states- Issue states that should keep being processed.
tracker.terminal_states- Issue states that should stop and cleanup.
polling.interval_ms- Poll interval for fetching candidate issues.
workspace.root- Root folder where issue-specific workspaces are created.
hooks.after_create- Commands run right after creating workspace.
hooks.before_remove- Commands run before removing workspace.
agent.max_concurrent_agents- Max parallel issues processed.
agent.max_turns- Max continuous Codex turns per scheduling cycle.
codex.command- Command used to start Codex app-server.
codex.approval_policy,thread_sandbox,turn_sandbox_policy- Agent execution safety/permission controls.
scripts/option2-setup.sh- Runs:
mise trust,mise install,mix setup,mix build.
- Runs:
scripts/option2-run.sh- Runs built Symphony with required confirmation flag:
--i-understand-that-this-will-be-running-without-the-usual-guardrails- Optional arg: custom workflow file path.
Examples:
./scripts/option2-run.sh
./scripts/option2-run.sh /absolute/path/to/WORKFLOW.md- Orchestrator polls Linear project.
- Finds active issues.
- Creates workspace for an issue.
- Executes
hooks.after_create. - Launches Codex app-server and sends workflow prompt.
- Agent iterates on issue until done, blocked, or state changes.
- On terminal state, process is stopped and workspace cleanup runs.
- If token is in env mode:
export LINEAR_API_KEY='...' - If token is hardcoded in workflow: ensure
tracker.api_keyis non-empty.
- If project is in env mode:
export LINEAR_PROJECT_SLUG_ID='...' - Verify
tracker.project_slugis correct. - Verify issue states in Linear match
active_states.
Run:
cd /home/lightningxxl/.openclaw/workspace/projects/custom-symphony/elixir
mise trust- Confirm project really has issues in active states.
- Confirm token has permission to read that project.
Use the run script (./scripts/option2-run.sh), which already includes the required acknowledgement flag.
elixir/: official reference implementation (runtime, scheduler, tracker adapter).scripts/: local helper scripts for setup/run..codex/: optional Codex skills used by workflow.SPEC.md: architecture and behavior spec.
- Root overview:
README.md(this file) - Elixir implementation details:
elixir/README.md - System spec:
SPEC.md
Apache-2.0. See LICENSE.