Orchestration
Syntec One runs an autonomous agent pipeline on the ava dev server: a Jira ticket becomes a
Claude Code worker that does the work in the project's checkout, commits its changes, and waits for a
human Approve/Reject in Slack before anything is pushed. No code reaches the shared branch without
a person clicking Approve.
The lifecycle
Each ticket moves through Jira statuses, and each transition maps to a stage of the pipeline:
| Jira status | What's happening |
|---|---|
| Backlog | Draft. The poller ignores it. |
| To Do | The "go" signal. The poller picks it up within ~2 min. |
| In Progress | A claude -p worker is running in the project workspace. |
| In Review | The worker's changes are committed locally (unpushed); a Slack card with Approve/Reject is posted. |
| Done | Approved → the commits were pushed to origin/dev. |
Rejecting reverts the worker's unpushed commits and leaves the ticket In Review to retry or close.
Projects
Each Jira project maps to one workspace on ava:
| Jira project | Workspace | Agent may edit (owned repos) |
|---|---|---|
| SOC | core |
syntec-one-base, syntec-one-core, syntec-one-admin, syntec-one-admin-base |
| SOCRM | crm |
syntec-one-crm, syntec-one-crm-admin, syntec-one-crm-base |
The worker only ever commits changes in its project's owned repos.
Components
All of these live in the syntec-one-server-installer repo, under bin/, and run as the claude
user on ava:
agent-poll+ thesyntec-agent-pollsystemd timer — every 2 min, finds To Do tickets and dispatches a worker.agent-run <PROJECT_KEY> <ISSUE_KEY>— the worker. Runsclaude -pin the workspace, commits the changes locally, moves the ticket to In Review, and posts the Slack card.agent-approve/agent-reject— push the approved commits toorigin/dev, or revert them.slack-bot(syntec-slack-botservice) — a Socket Mode bot that handles the@mentioncommands and the Approve/Reject buttons.export-review— capture metadata a developer authored in the dev admin UI into git (see Slack commands).
Two-tier git safety
The worker has read-only Bitbucket access — it can clone and read, but it cannot push. Only
agent-approve holds the per-repo write tokens (state/git-tokens/<repo>.token), and it will
only push a project's own owned repos with that repo's token. So an agent physically cannot ship code
on its own; a human Approve is the gate.
See Agents for how a worker is run and isolated, and Slack for the
channel and @mention commands.