Adding Custom Tracker Types
Symphony’s tracker system is abstracted to support multiple issue tracking systems. While Linear is the reference implementation, you can add support for GitHub Issues, Jira, or custom trackers.Tracker Interface
Implement these operations for a new tracker:fetch_issues_by_states(state_names)
Return issues in specified states (used for startup terminal cleanup).
Issue Normalization
Normalize tracker payloads to the Symphony issue model:Key normalization rules:
labels→ lowercase stringspriority→ integer only (lower numbers = higher priority)state→ trimmed and lowercased for comparisonblocked_by→ derived from tracker-specific relations
Configuration Schema
Extend thetracker configuration section:
WORKFLOW.md
Implementation Example
Error Handling
Handle tracker-specific errors consistently:Custom Dynamic Tools
Dynamic tools are client-side tools that Symphony provides to Codex during app-server sessions. Thelinear_graphql tool is the reference implementation.
Tool Definition
Fromlib/symphony_elixir/codex/dynamic_tool.ex:
Adding a New Tool
Tool Response Format
Return structured responses that Codex can interpret:Tool Testing
Test tools independently of the app-server:Extending the Orchestrator
The orchestrator is the core coordination layer. Common extension points:Custom Concurrency Policies
Implement per-state concurrency limits:WORKFLOW.md
SPEC.md section 8.3:
Per-state limit:
max_concurrent_agents_by_state[state]if present (state key normalized)- otherwise fallback to global limit
Custom Retry Policies
Extend retry logic with custom backoff strategies:Observability Extensions
Add custom metrics and telemetry:State Machine Extensions
Add custom orchestrator states or transitions:HTTP Server Extensions
The optional HTTP server can be extended with custom endpoints:Configuration Extensions
Add custom configuration sections:WORKFLOW.md
Best Practices
Maintain SPEC.md Alignment
Keep extensions compatible with the language-agnostic specification. Document deviations clearly.
Test in Isolation
Unit test extensions independently before integrating with the orchestrator.
Handle Errors Gracefully
Return structured errors that the orchestrator can retry or surface appropriately.
Document Configuration
Add configuration schema, defaults, and examples for any new settings.
Examples from Production
Linear GraphQL Tool
Complete implementation inlib/symphony_elixir/codex/dynamic_tool.ex:
- Handles both string and object input formats
- Validates required
queryfield - Normalizes GraphQL
errorsarray tosuccess: false - Returns structured JSON response
Memory Tracker (Testing)
In-memory tracker for testing inlib/symphony_elixir/tracker/memory.ex:
Additional Resources
- SPEC.md - Language-agnostic specification
- Tracker Integration Contract - Detailed tracker interface
- Dynamic Tools Protocol - App-server tool protocol