| tags |
|
|||
|---|---|---|---|---|
| type | reference | |||
| status | active | |||
| area | development | |||
| aliases |
|
|||
| created | 2026-03-06 |
Symphony is a long-running orchestration service that polls an issue tracker (Linear), creates isolated per-issue workspaces, and runs coding agent sessions (Claude, Codex, etc.) for each issue. It is a scheduler/runner, not a workflow engine.
Rust workspace with layered crates matching the spec's abstraction levels:
| Crate | Spec Layer | Responsibility |
|---|---|---|
symphony-core |
Domain Model (S4) | Shared types: Issue, State, Session, Workspace |
symphony-config |
Config + Policy (S5-6) | WORKFLOW.md loader, typed config, file watcher |
symphony-tracker |
Integration (S11) | Linear GraphQL client, issue normalization |
symphony-workspace |
Execution (S9) | Per-issue directory lifecycle, hooks, safety invariants |
symphony-agent |
Execution (S10) | Agent subprocess, JSON-RPC + simple pipe modes |
symphony-orchestrator |
Coordination (S7-8) | Poll loop, dispatch, reconciliation, retry, drain |
symphony-observability |
Observability (S13) | Structured logging, HTTP server, dashboard, health, auth |
symphony-cli (root) |
CLI (S17.7) | Subcommands: start, stop, status, issues, validate, etc. |
- In-memory state: Orchestrator state is intentionally in-memory; recovery is tracker-driven
- Single authority: Only the orchestrator mutates scheduling state
- Workspace isolation: Coding agents run ONLY inside per-issue workspace directories
- Dynamic reload: WORKFLOW.md changes are detected and re-applied without restart
- Liquid-compatible templates: Strict variable/filter checking for prompt rendering
- Graceful shutdown: SIGTERM/SIGINT → drain mode → wait for workers → exit
- Stall kill: Worker abort handles tracked; stalled sessions killed + retried
- Bearer auth: Optional
SYMPHONY_API_TOKENprotects/api/v1/*; health endpoints open
This repo is an Obsidian vault. All .md files form a wikilinked knowledge graph.
- Start at
docs/Symphony Index.md— it links to everything - Check
docs/roadmap/Project Status.md— current phase, test counts, known gaps - Read the relevant
docs/crates/<name>.md— for the crate you're modifying - Check
CONTROL.md— setpoints your changes must satisfy - Check
PLANS.md— task breakdown for the current phase - Traverse
[[wikilinks]]— follow links to find related context; the graph is designed for this
Root governance: CLAUDE.md AGENTS.md PLANS.md CONTROL.md EXTENDING.md CONTRIBUTING.md
Docs index: docs/Symphony Index.md
Architecture: docs/architecture/Crate Map.md, Domain Model.md
Operations: docs/operations/Control Harness.md, Configuration Reference.md
Roadmap: docs/roadmap/Project Status.md, Production Roadmap.md
Per-crate: docs/crates/symphony-core.md, symphony-config.md, ...
Planning state: .planning/STATE.md, .planning/REQUIREMENTS.md
Examples: examples/linear-claude.md, linear-codex.md, github-claude.md
make smoke # Compile + clippy + test (gate — runs in pre-commit hook)
make check # Compile + clippy only
make test # Run all workspace tests (includes CLI integration tests)
make build # Release build
make control-audit # Smoke + format check (before PR)
make fmt # Auto-format code
make install # Install binary locally
# CLI-specific testing
cargo test --test cli_integration # Run CLI binary integration tests only
cargo test --test cli_integration -- init # Run only init-related CLI testsThe pre-commit hook at .githooks/pre-commit enforces the gate automatically. Activate:
git config core.hooksPath .githookscargo check --workspacepassescargo clippy --workspace -- -D warningspassescargo test --workspacepassescargo fmt --all -- --checkpasses
- Documentation updated per the rules in CLAUDE.md "Documentation Obligations"
CONTROL.mddeviation log updated if any setpoint was relaxeddocs/roadmap/Project Status.mdupdated if changes are significantdocs/operations/Control Harness.mdtest counts updated if tests were added
Code change → make smoke (pre-commit) → tests pass → docs updated → push
↑ |
└─── If smoke fails: fix before proceeding, never suppress ───────┘
make harness-audit— validates governance files, hooks, CI, frontmatter, deviation log freshnessmake entropy-check— reports#[allow]count, TODO/FIXME/HACK markers, doc staleness, test count drift
The development process is grounded in three substrates that provide persistent context:
| Substrate | Source | Content |
|---|---|---|
| Control Metalayer | .control/policy.yaml, .control/state.json |
Behavioral governance: what MUST be true |
| Knowledge Graph | docs/, CLAUDE.md, AGENTS.md, .planning/ |
Declarative memory: what IS known |
| Episodic Memory | docs/conversations/, ~/.claude/projects/ |
Episodic memory: what HAS happened |
On each session start, orient by reading the control state, then the knowledge graph, then recent conversation history. See [[docs/control/Consciousness Architecture|Consciousness Architecture]] for the full design and [[docs/control/Session Protocol|Session Protocol]] for the actionable protocol.
The control metalayer (CONTROL.md) is the active grounding framework for all agent work.
Before every change:
- Read
CONTROL.md→ identify affected setpoints - Implement code that satisfies those setpoints
- Run
make smoke→ verify sensors pass - Add new setpoints if adding new behavior
- Update docs:
Project Status.md,STATE.md,Control Harness.md - Log deviations if any setpoint was temporarily relaxed
PR Review Loop: After pushing changes, agents must handle PR review comments:
- Check PR for review comments (
gh api repos/.../pulls/.../comments) - Fix code, accept suggestions, or reply with justification
- Push fixes and repeat until PR is clean or max_turns exhausted
- Link PR to the issue tracker (Linear/GitHub)
- The spec (Symphony SPEC.md) is the source of truth for all behavior
- Prefer editing existing crate code over creating new crates
- Each crate has its own test module; add tests for any new logic
- Structured logging: always include
issue_id,issue_identifier,session_idin logs - State normalization: always trim + lowercase when comparing issue states
- Path safety: always validate workspace paths stay under workspace root
- See
EXTENDING.mdfor how to add new trackers or agent runners
CLAUDE.md and this file (AGENTS.md) define how agents interact with Symphony. They are loaded at the start of every Claude Code session. If you change conventions, control harness behavior, or documentation obligations — update these files so the next session inherits the knowledge. This is the meta-definition that keeps the control loop coherent across sessions.