feat(symphony): tracker-agnostic orchestrator plugin
Sketch of a Claude Code port of openai/symphony — a daemon-style
orchestrator that polls an issue tracker, dispatches isolated worker
agents per issue, and reconciles state across ticks. Tracker-agnostic
by design: the project's CLAUDE.md documents how to talk to whatever
tracker is in use (GitHub Issues, Gitea, tracker CLI, Linear, etc.);
the plugin reads those instructions rather than shipping per-tracker
adapters.
Includes:
- /symphony-init for first-time setup (detects gh/gitea/tracker, writes
the tracker section into project CLAUDE.md, drops WORKFLOW.md, offers
to schedule the tick)
- /symphony-tick fired by /schedule cron entries (idempotent, silent,
never prompts)
- per-issue worker agent in isolated worktrees
- on-disk state in .symphony/state.json (survives cron cold starts)
Known divergences from the spec are documented in the plugin CLAUDE.md
(no streaming agent telemetry; no codex.* knobs; hooks run inside the
worker rather than the orchestrator).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 21:03:21 -05:00
{
"$schema" : "http://json-schema.org/draft-07/schema#" ,
"title" : "Symphony orchestrator state" ,
"type" : "object" ,
"required" : [ "running" , "retry_attempts" , "claimed" , "completed" ] ,
"properties" : {
"running" : {
"type" : "object" ,
"additionalProperties" : {
"type" : "object" ,
"required" : [ "task_id" , "worktree" , "started_at" ] ,
"properties" : {
2026-04-29 21:51:23 -05:00
"task_id" : { "type" : "string" } ,
"session_id" : { "type" : [ "string" , "null" ] , "description" : "Identifier for the orchestrator session that spawned this task. Other sessions reconcile via the heartbeat file when this session's TaskList does not include the task_id." } ,
"worktree" : { "type" : "string" } ,
"started_at" : { "type" : "string" , "format" : "date-time" } ,
feat(symphony): tracker-agnostic orchestrator plugin
Sketch of a Claude Code port of openai/symphony — a daemon-style
orchestrator that polls an issue tracker, dispatches isolated worker
agents per issue, and reconciles state across ticks. Tracker-agnostic
by design: the project's CLAUDE.md documents how to talk to whatever
tracker is in use (GitHub Issues, Gitea, tracker CLI, Linear, etc.);
the plugin reads those instructions rather than shipping per-tracker
adapters.
Includes:
- /symphony-init for first-time setup (detects gh/gitea/tracker, writes
the tracker section into project CLAUDE.md, drops WORKFLOW.md, offers
to schedule the tick)
- /symphony-tick fired by /schedule cron entries (idempotent, silent,
never prompts)
- per-issue worker agent in isolated worktrees
- on-disk state in .symphony/state.json (survives cron cold starts)
Known divergences from the spec are documented in the plugin CLAUDE.md
(no streaming agent telemetry; no codex.* knobs; hooks run inside the
worker rather than the orchestrator).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 21:03:21 -05:00
"issue_identifier" : { "type" : "string" }
}
}
} ,
"retry_attempts" : {
"type" : "object" ,
"additionalProperties" : {
"type" : "object" ,
"required" : [ "attempt" , "due_at_ms" ] ,
"properties" : {
"attempt" : { "type" : "integer" , "minimum" : 1 } ,
"due_at_ms" : { "type" : "integer" } ,
"last_error" : { "type" : [ "string" , "null" ] }
}
}
} ,
"claimed" : { "type" : "array" , "items" : { "type" : "string" } } ,
"completed" : { "type" : "array" , "items" : { "type" : "string" } } ,
"totals" : {
"type" : "object" ,
"properties" : {
"ticks" : { "type" : "integer" } ,
"dispatched" : { "type" : "integer" } ,
"completed" : { "type" : "integer" } ,
"failed" : { "type" : "integer" }
}
}
}
}