Getting Your Linear API Key
Create a new key
Click Create key, give it a descriptive name like “Symphony Orchestrator”, and copy the generated token.
Configuring the API Key
Symphony reads the Linear API key from thetracker.api_key field in WORKFLOW.md. By default, it references the LINEAR_API_KEY environment variable:
The
$LINEAR_API_KEY syntax tells Symphony to read from the environment variable. You can also hard-code a token (not recommended) or use a different variable name.Alternative: Direct Token
Alternative: Custom Environment Variable
Finding Your Project Slug
Theproject_slug identifies which Linear project Symphony should poll for issues.
Copy the project URL
Right-click the project name in the sidebar and select Copy link.The URL format is:For example:
State Management
Symphony maps Linear workflow states to agent lifecycle actions. You define two state lists:Active States
Issues in active states are candidates for agent work. Symphony polls Linear for issues in these states.lib/symphony_elixir/config.ex:9:
["Todo", "In Progress"]
Terminal States
Issues moving to terminal states trigger workspace cleanup and agent shutdown.lib/symphony_elixir/config.ex:10:
["Closed", "Cancelled", "Canceled", "Duplicate", "Done"]
Note the inclusion of both
"Cancelled" and "Canceled" to handle regional spelling differences.Custom Linear States
Symphony’s referenceWORKFLOW.md uses custom states that don’t exist in default Linear projects:
- Rework: Agent addresses reviewer feedback
- Human Review: PR is ready and waiting for human approval
- Merging: Human approved; agent executes merge
elixir/README.md:43:
Creating Custom States
Add custom states
Create new states for your workflow:
- Human Review (between In Progress and Done)
- Rework (parallel to In Progress)
- Merging (between Human Review and Done)
Assignee Filtering
Optionally filter issues by assignee. This is useful when multiple Symphony instances run against the same project.Filter to issues assigned to a specific user.Use Use a Linear user ID for a specific person:
"me" to match the API token owner:lib/symphony_elixir/linear/client.ex:449-450:
assignee: me is configured, Symphony makes a GraphQL viewer query on startup to resolve the user ID.
Without
assignee filtering, Symphony considers all issues in the project that match the configured states.GraphQL Endpoint
Symphony uses Linear’s public GraphQL API:Issue Polling
Symphony polls Linear at regular intervals:lib/symphony_elixir/config.ex:25:
Issue Data Retrieved
Fromlib/symphony_elixir/linear/client.ex:12-55, Symphony fetches:
Key Fields
- inverseRelations: Captures “blocks” relationships for dependency tracking
- branchName: Git branch associated with the issue
- assignee: Used for assignee filtering
- labels: Available in prompt templates for routing logic
Validation
Symphony validates Linear configuration on startup: Fromlib/symphony_elixir/config.ex:367-370:
Required Fields
Missing configuration halts startup with explicit error messages:Testing the Connection
Verify your Linear setup:{:error, :missing_linear_api_token}, check your environment variable.
If you see {:error, :missing_linear_project_slug}, verify your WORKFLOW.md.
Complete Example
- Authenticates with the
LINEAR_API_KEYenvironment variable - Polls the
symphony-0c79b11b75eaproject - Only picks up issues assigned to the API token owner
- Checks Linear every 5 seconds
- Manages 5 active states and 4 terminal states