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>
1.1 KiB
1.1 KiB
description
| description |
|---|
| Run one Symphony orchestrator tick. Reads WORKFLOW.md, polls the tracker, dispatches workers, reconciles state. Idempotent — safe to fire on a cron. |
Invoke the symphony skill with no arguments. The skill owns the full tick:
- Load
./WORKFLOW.md(error → log and exit; do not fall through). - Read
.symphony/state.json(create empty if missing). - Query the tracker for issues in
active_states, minus issues already inrunningor in retry-cooldown. - Reconcile: for each
runningentry, confirm viaTaskListthe worker is still alive and the issue still in an active state; otherwise release. - Dispatch up to
max_concurrent_agents - len(running)new workers via theAgenttool withsubagent_type: symphony-worker, one per issue. Pass the issue payload + rendered prompt template. Run workers in the background (run_in_background: true) so the tick returns promptly. - Persist state and exit.
This command is fired by a /schedule cron entry — the user sets up the cadence with
/schedule once; the skill enforces polling.interval_ms only as advisory metadata.