Symphony Orchestrator is a custom multi-agent orchestration framework built from the ground up according to OpenAI's open-source specifications. It provides a lightweight, deterministic execution layer that bridges project management systems (Jira) with automated development environments and VCS platforms (Bitbucket).
By using intelligent, multi-stage agents, Symphony parses repository execution contracts, manages isolated sandboxes, executes code modifications, and handles PR workflows autonomously.
- Specification-Driven Orchestration: Implements OpenAI's architectural concepts to translate repository contracts into deterministic agent actions.
- Jira Backlog Tracking Client: Synchronizes with Jira Cloud APIs via JQL to identify, filter, and dispatch candidate issues tagged for AI execution.
- Bitbucket VCS Integration: Authenticates via scoped API tokens to clone repositories, isolate workspaces per ticket, check out feature branches, and submit Pull Requests.
- Isolated Workspace Management: Creates clean, isolated execution sandboxes (
/tmp/symphony_workspaces/<TICKET-ID>) for safe agent code generation and testing. - Multi-Stage Agent Pipeline: Features a modular pipeline architecture (
symphony.agent) to analyze codebase context, generate targeted patches, and verify changes before committing. - Core Domain Normalization: Converts raw external vendor payloads (Jira/Bitbucket) into a unified, stable internal domain model.
- Structured Agent Routing: Agents can emit structured JSON results that drive workflow routing, artifact extraction, and blocked-queue handling.
An agent definition in agents.yaml may include a structured property with a non-empty filename (for example structured: "planner-result.json").
When structured is set:
- The agent writes its result to that JSON file in the workspace using the schema contract from
agent-output-schema.json. - The orchestrator reads the file after agent completion.
- If
status == "success", each item inoutputsis written to the workspace (textor base64binary) and the workflow advances to the next phase. - If
status == "blocked", the issue is moved to the orchestrator blocked queue and does not advance to the next phase.
Phase-level Jira transitions for structured outcomes are configured in WORKFLOW.md under each phase:
phases:
plan:
agent: planner
transitions:
success: "In Progress"
blocked: "Clarification Needed"transitions.success and transitions.blocked are optional. If omitted, no Jira transition is attempted for that outcome.
- Backend Framework: Python 3.14+ / FastAPI (Uvicorn)
- Data Validation & Settings: Pydantic v2 & Pydantic Settings
- Integrations & Operations: PyYAML, Requests, Git, Python-dotenv
- Python 3.14+
gitCLI installed on the host system- An active Jira Cloud workspace and Bitbucket repository
-
Clone the repository:
git clone git@github.com:melvinngugi/symphony-orchestrator.git cd symphony-orchestrator -
Set up a virtual environment:
python -m venv .venv source .venv/bin/activate -
Install dependencies:
pip install -r requirements.txt
-
Environment Configuration: Create a .env file in the project root with your credentials:
#Jira Configuration JIRA_HOST="https://your-domain.atlassian.net" JIRA_USER_EMAIL="your-email@example.com" JIRA_API_TOKEN="your-atlassian-api-token" JIRA_PROJECT_KEY="your-key" # Bitbucket Configuration BITBUCKET_WORKSPACE="your-workspace" BITBUCKET_REPO_SLUG="your-repo" BITBUCKET_USER_EMAIL="your-email@domain.com" BITBUCKET_API_TOKEN="your-bitbucket-scoped-api-token"
Start the FastAPI application and background orchestrator daemon:
python -m app.mainThe orchestrator will continuously poll Jira for candidate issues (e.g., tickets with the AI label in To Do), set up an isolated Bitbucket workspace, and trigger the agent pipeline.
Build the image:
podman build -t symphony-orchestrator:uv .Run the container:
podman run --rm -p 8000:8000 --env-file .env symphony-orchestrator:uvHealth check:
curl http://localhost:8000/healthIf you need workspace persistence for orchestration artifacts, mount the local workspace directory:
podman run --rm -p 8000:8000 --env-file .env \
-v "$(pwd)/workspaces:/app/workspaces" \
symphony-orchestrator:uvThis project uses GitHub Actions for automated testing and container image publishing to the GitHub Container Registry (GHCR).
- Push to
main: Builds and pushes the image with the commit SHA and thelatesttag. - Version Tags (
v*): Builds and pushes the image with the specific version tag (e.g.,v1.0.0). - Manual: Can be triggered manually via the "Actions" tab in GitHub.
- Pull Requests: Triggers a validation build and runs tests, but does not push to the registry.
- Image Path:
ghcr.io/<owner>/symphony-orchestrator - Authentication: Authentication is handled automatically in the CI pipeline using
GITHUB_TOKEN. - Quality Gate: Every publish job is gated by
pytest. If tests fail, the image will not be pushed.
Ensure that runtime secrets (Jira, Bitbucket, etc.) are injected into the container environment at deployment time. The published images do not contain these credentials.