What Symphony does
OpenAI shipped Symphony
as an open-source agentic coding harness reference: a tracker-agnostic poll
loop that picks up issues, spawns a worker per issue in an isolated worktree,
runs the work to completion, and ends in a draft PR for human review. Hooks,
no auto-merge, brevity in the worker prompts. Solid, principled, deliberately
minimal.
What Smithy adds
Smithy keeps the Symphony shape and adds five things the reference doesn't ship:
- Cross-model worker swap by tracker state. Builder runs
Claude (`claude -p`) for Todo and In Progress. Reviewer runs Codex
(`codex exec`) for In Review. The handoff between models is a structured
RESULT.md / REVIEW.md the orchestrator parses. Cross-model review is the
load-bearing differentiator: a model marking its own work passes too easily.
- Two products from one lineage. Smithy-Full is the
experimental lab: auto-merge, self-update cascade, mediator escalation,
master-cascade speculation. Anvil (forked from Smithy + Symphony's
Elixir reference) is the surgical client-work mode: one-shot CLI, no
daemon, draft PR end state, brevity-disciplined builder, scope-cut prompts.
Both can't live in one tool; the operating modes oppose each other.
- Heartbeat + work-ledger for fire-and-forget enforcement.
Symphony assumes the orchestrator can re-poll cleanly. Smithy adds an
append-only ledger of every state transition so a crashed daemon resumes
without re-running completed work.
- Strict Linear-write isolation. Workers can read Linear
via MCP but not write. The Linear API key lives only in the orchestrator's
environment. State transitions are the orchestrator's sole authority. One
rule, audit trail for free.
- Adversarial pre-PR review pass. Anvil's defining feature:
before the draft PR opens, a separate model independently red-teams the
change for security regressions, behavioral drift from the spec, and dead
code. Self-review on a single model is wishful thinking; cross-model is
the move.
The chain of command
Linear (source of truth: what work)
↓ poll every 30s
Smithy (in-memory: what's running, ~3 workers max)
↓ spawn per-issue worker (Linear write blocked at MCP)
Worker = claude -p (builder) or codex exec (reviewer)
↓ runs in per-issue worktree
↓ writes RESULT.md or REVIEW.md and exits
Smithy parses the handoff, drives the Linear state move.
The non-obvious decision
The orchestrator stays dumb. Workers are smart. The harness can't analyze
your code, can't decide what to build, can't reason about quality. It just
spawns the right worker, watches for handoff files, and moves Linear states.
Every time the orchestrator gets clever, the system gets fragile. Symphony
got this right; Smithy preserves it.
↳ Smithy is open source as of May 2026. v2 spec is in
v2/SPEC.md in the repo. Reach out if you want a
walkthrough of how the additions land.
~ got something like this on the bench? ~
Pull the cord.
Start the conversation
→
/ smithy / built by hand / shipped to a working URL /