Skip to content

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 + the syntec-agent-poll systemd timer — every 2 min, finds To Do tickets and dispatches a worker.
  • agent-run <PROJECT_KEY> <ISSUE_KEY> — the worker. Runs claude -p in 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 to origin/dev, or revert them.
  • slack-bot (syntec-slack-bot service) — a Socket Mode bot that handles the @mention commands 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.