/admin is the control panel for your AI-Implement orchestrator. It is enabled when either ADMIN_ACCESS_CODE or a sign-in provider is configured — with neither, the UI is disabled and all /admin and /api/* routes return 503, with a response body naming the missing configuration. Every panel below is also reachable programmatically through the JSON API at the bottom of this page.
The sidebar organizes panels into groups:
- Work — Overview, Issues, Pipelines, Pull requests, Blockers, Reports, Knowledge Graph Pipelines
- Configure — Projects, Pipelines & steps, Models & providers, Triggers & channels, Policies & risk
- Platform — Runners, Sessions, Deployments, Reaper, Access, Secrets, Settings
- Developer — Webhooks, Audit log, Customizations, Updates
Some are placeholders for planned functionality and have no section below:
- Triggers & channels
- Policies & risk
- Webhooks
- Updates.
- Deployments — release a new version of the orchestrator itself: whether an update is available against the running build, the last deploy’s outcome, and a self-deploy that pauses new dispatch until in-flight work drains.
- Access — control who may sign in to the orchestrator and at what role: manage the allowlist of emails and domains, set admin-versus-user roles, choose which panels ordinary users may open, and review recent access changes.
Work
Overview
The main dashboard. Shows real-time orchestrator health:- Running jobs (with duration)
- Failed jobs in the last 24 hours
- Capacity utilization across all projects
- Projects at concurrency cap
- Stale workflow templates in target repos
- A 24-hour dispatch trend chart
Issues
The AI-Implement inbox. Shows every issue matched by the configured project mappings, its current state (started / completed / cancelled), and whether each is ready for implementation or still has planning pending. A second table breaks down in-progress counts by project mapping for real-time visibility into which scopes are currently working.Pipelines (jobs)
The dispatch log under its real internal name (jobs in the sidebar).
Shows dispatch entries (timestamped) across all teams with full execution history:
- Issue ID
- Repo
- Team (the
teamKeyshown in the row) - Runner mode (GitHub Actions or Fly Machines)
- Session image
- Combined planning-and-implementation statuses
- Pull-request links
- Dispatch number (for re-dispatches)
Pull requests
Lists every bot-opened pull request the orchestrator is tracking, with the following information:- Issue link
- Repo
- Current job status (
running/completed/failed/review_failed/timed_out) - Iteration count (the dispatch number)
- Time since last dispatch
- Direct links to GitHub
Blockers
Surfaces issues that are currently not being picked up despite being eligible. KPI cards show:- Total blocked issues
- Teams affected (distinct teams with at least one blocked issue)
- Count blocked by concurrency cap
- Count blocked by dedup window
- Issue identifier
- Project mapping
- Blocking reason
- Detail (further context on the blocking reason)
- Direct link back to the ticket
Reports
Fleet-wide outcome analytics across every tracked repository, over a window you choose — the last 7, 30, or 90 days, defaulting to 30. Each card settles a different fleet-level question:- Fleet by repo — how repositories compare on throughput, completions, failures, merges, and cost, a row apiece.
- Outcomes — how cleanly work lands: how often it is approved on the first dispatch versus eventually, and how often merged work needed a human edit afterward (the escape rate).
- Planning A/B — whether planning pays for itself, setting issues that went through planning against those that did not on the same outcome and cost measures.
- Runaways — which issues are consuming dispatches without landing: those with three or more dispatches, or three or more consecutive failures.
The figure takes no account of how a run authenticated, so a subscription-authenticated run that bills nothing per run still reports a cost here.
Knowledge Graph Pipelines
Everything about refreshing the orchestrator’s knowledge graph, in one place. Admins only — this panel cannot be granted to users, because it starts refreshes. The Knowledge graph card shows:- The refresh stage (checking, running, landing, staging, serving, reverted, failed, degraded, or stale)
- The served graph stamp, and whether the knowledge-graph sidecar is answering
- The last refresh outcome, or the last dry-run’s verdict with its per-part table
- Refresh graph now, Dry-run refresh, and Accept new baseline & refresh
- The Backend, Materialize, and Fly machine settings for the next refresh, explained below
Refresh settings
The rows under the refresh buttons control where and how the next refresh runs. Each shows its current value and where that value came from. Backend sets where the next refresh runs — on GitHub Actions (the knowledge-graph source repo’s), or on Fly machines (a kept machine reused between runs). The global runner mode overrides this setting:ghaforces GitHub Actionsflyforces Flylocalforces local Dockerdefaultuses this setting
FLY_SESSIONS_TOKEN and the sessions app both set), otherwise GitHub Actions.
A deployment with no Fly configuration therefore refreshes on GitHub Actions with no action needed, and the backend reads Fly not configured.
The next run: line names the effective backend and why it was chosen, such as:
KG settingrunner mode gha overrides the KG settingFly not configured
- a project mapping for the knowledge-graph source repo
- that repo’s synced
claude-implement.ymlworkflow - available Actions minutes
- rdflib re-serializes every snapshot part into one combined graph — about 99 MB peak memory at 31k triples.
- direct copies the snapshot parts and serves them unchanged, with no re-serialization — about 29 MB peak.
- CPU kind — shared or performance
- CPUs
- Memory (MB)
- Idle (hours) — how long the machine may sit unused before it is destroyed
The same runs also appear on the Pipelines panel, which stays the complete dispatch log.
Configure
Projects (team/repo mappings)
The Projects panel is where you connect ticketing scopes (Linear teams or Jira JQL clauses) to GitHub repositories and control exactly how AI-Implement dispatches runs for each scope.See Configure project mappings for the full field reference and defaults.
Create a new project mapping
1
Open the stepper
Click Configure → Projects → + New project. The stepper walks through the configuration one step at a time.
2
Fill in Ticketing System and Source
Pick Linear or Jira as the ticketing system, fill in the provider-specific config (Linear team key, or Jira JQL + repo-field value), then enter the target repo’s GitHub Owner, Repository Name, and Default Branch.Once the owner and repository are filled in, Check installation confirms the GitHub App can reach that repo. It reports one of these outcomes:
Default Branch is required and must match the repo’s actual primary branch (commonly
main, master, or development).- The App is installed and can access the repository.
- The App is not installed on that owner, with a link to install it.
- The App is installed but the repository is not among its selected repositories, with a link to add it.
3
Step through the remaining configuration
Runner, Provider, Capacity, and Secrets steps follow, then a final Review step confirms your settings before you create the project. For a first run, defaults are reasonable.The Capacity step exposes these optional fields:
Leave any field blank to use the default. Setting these tighter than the defaults is the recommended way to control cost and reliability per project.The project’s Reviewers list is not in this stepper. Set it from the project’s Edit dialog — see
reviewers.4
Create the project
Click Create project. The new mapping appears in the Projects table automatically — if it does not, reload the page.
Pipelines & steps
Shows the pipeline YAML definitions (the built-insrc/pipeline/*.yml plus any custom/pipelines/*.yml overrides) as collapsible details, each listing the steps that run and their module IDs.
A second table lists every step module with:
- Built-in path
- Custom override path (if present)
- Status (
built-in/override/additive)
Models & providers
Beyond the read-only per-project summary below, this page hosts the orchestrator’s agent-configuration controls:- Orchestrator stage defaults — the per-stage agent, provider, model, account profile, and elapsed time limit that opted-in projects inherit. See Agent settings per stage.
- Account profiles — the stored credentials runs authenticate with, and the projects each one may serve. See Use Codex with OpenAI.
For a legacy project, the model ids live in its target repo’s
WORKFLOW.md and PLANNING.md front matter. For an opted-in project, the model comes from the stage defaults or the project’s own override — see Agent settings per stage.- Projects (total)
- Anthropic (count of projects using the Anthropic provider)
- Bedrock (count of projects using the Bedrock provider)
- Bedrock regions (count of distinct regions in use)
- Team (the
teamKey) - Repo
- Provider badge (
anthropicorbedrock) - Bedrock region (or a “missing” badge if required and unset)
- Planning status
- Runner mode
Platform
Runners
High-level runner-infrastructure dashboard. KPI cards show:- Current runner-mode override (
default/gha/fly/local/shadow) - Live Fly session count
- Capacity utilization (in-progress runs vs. total cap across mappings)
- 24-hour reaper destructions
Runner mode
The toggle offers four options:default, gha, fly, and shadow.
local is a valid runner mode too, but the toggle doesn’t expose it — set it through the environment or the API instead.
If the
RUNNER_MODE environment variable is set on the orchestrator process, it takes precedence over this database value and the UI flags that an env-var lock is active.If you change runner mode via the UI or API while RUNNER_MODE is set in the environment, the new value is persisted to the database but has no effect until the env var is removed and the orchestrator is restarted.Live Fly sessions
A table of the most recent eight, linking into the Sessions panel for the full list.Per-project execution mode
A table shows each mapping’s:- Configured execution mode
- Effective mode (after applying any global override)
- Capacity-utilization meter
Parked issues
Issues the dispatch breaker has parked. This section renders at the top of the panel, above the runner-mode controls, and stays hidden while nothing is parked. An issue is parked once enough consecutive dispatches fail for the same issue and phase, and is skipped on every poll from then on. Planning and implementation are counted separately, so an issue can be parked in one while the other keeps running, and a successful dispatch resets the count — only an unbroken run of failures parks anything. A failure classified as transient — an outage upstream of the ticket rather than the ticket’s own problem — does not count at all, so an unlucky run against a flaky provider cannot park an issue. Transient failures are:- provider overload
- rate limiting
- transport errors
- git server errors
- Issue identifier
- Repo
- Phase (planning or implementation)
- Consecutive failure count
- Last conclusion
- How long ago it was parked
- An Unpark action
Sessions
Lists every Fly Machine session currently instarted, starting, or created state.
Each row shows:
- Machine ID and name
- Current state
- Uptime duration
- Associated issue identifier (linked to the ticketing system), where available
- Target repo, where available
- Removes the in-progress marker from the associated issue (the
AI-Workinglabel on Linear, orImplementingstatus on Jira) - Clears it from the deduplication window, so the orchestrator can pick it up again on the next poll
Reaper
The reconciliation-sweep dashboard. A summary card shows the 24-hour total of machines and jobs the reaper destroyed, broken down by rule:orphanstale-terminal-jobmax-age-exceededissue-terminal
- Timestamp
- Rule matched
- Machine ID
- Tenant
- Associated issue
- Age at destruction (in seconds)
dry-runordestroyedbadge (indicating whether the action was a no-op or executed)
Secrets
The Secrets panel itself is a placeholder — a consolidated browse-and-rotate view is not built yet. Secrets are managed in two places today:- Global secrets on the Settings panel
- Per-project secrets from each project’s row on the Projects panel.
Per-team secrets
Each project mapping has its own per-team secrets at/api/mappings/:teamKey/secrets.
Secrets are stored as Fly app secrets with the team key as a prefix (e.g. a secret named MY_TOKEN for project ENG is stored as ENG_MY_TOKEN).
Global secrets
Global secrets are Fly app secrets that do not belong to any specific project mapping. They are listed, created, and deleted from/api/global-secrets.
Settings
The settings panel manages orchestrator-level configuration:flySessionsApp— the Fly.io app name used for Fly Machine sessions.flySessionsRegion— the default region for new Fly Machine sessions.- Linear Pickup Label — the label the orchestrator polls Linear for, default
AI-Implement, stored in the orchestrator database and effective at the next poll with no restart.
FLY_SESSIONS_APP and FLY_SESSIONS_REGION. When an env override is active, the UI shows the runtime value alongside the database value and flags that the env var is winning.
LINEAR_PICKUP_LABEL seeds the pickup label once at first boot, then goes inert, the same as KG_BASE_REPO.
It is not a runtime override the way FLY_SESSIONS_APP is, so editing the environment variable after first boot changes nothing.
Change the pickup label only for a planned migration, since issues on the old label stop dispatching at the next poll, as Triggers and status indicators explains.
GET /api/settings returns linearPickupLabel as { value, effective, default }, and POST /api/settings accepts linearPickupLabel as a string, or null to reset it to the default.
Changes to settings that differ from the running process take effect after a restart. The pickup label is the exception: it takes effect at the next poll.
Orchestrator Agent Defaults
The Orchestrator Agent Defaults card carries Defaults mode, which turns stage agent configuration on or off for the whole orchestrator:legacy— stage defaults are off. This does not opt projects out.configured— stage defaults are available for projects to opt in to.
Retry Policy
The Retry Policy card sets the orchestrator’s global retry and backoff policy, and the post-push reviewer turn cap. A blank field uses its default.- Request Retries — re-spawns of one Claude invocation on a transient failure. Default 2.
- Stage Retries — re-runs of a whole implement/review stage. Default 1.
- Push Retries — retries of a failed push. Default 2.
- Backoff Initial (ms) — the first retry’s backoff delay, in milliseconds. Default 30000.
- Backoff Max (ms) — the largest backoff delay, in milliseconds. Default 300000.
- Backoff Jitter — the fraction of each delay subtracted as jitter. Default 0.2.
- Review Max Turns — the post-push reviewer turn cap, from 5 to 200. Default 30.
Developer
Audit log
Shows the dispatch-deduplication ledger — every issue currently in the dedup window. Each row includes:- Issue identifier and title
- When the issue was dispatched
- A delete button to remove it from the dedup window
- The issue is completed or cancelled. The orchestrator notices on its next poll, which is how an entry normally clears once the issue’s pull request merges and the issue closes.
- No configured tracker returns the issue anymore, because it was deleted or moved out of scope.
- The dispatch attempt fails before a run starts.
- A run fails or times out while the issue is within its retry budget. Once the budget is used up, the entry stays and the issue is left for a person to investigate.
- A session is destroyed from the Sessions panel.
- The reaper ends a session that ran past the maximum session age, or whose issue was already completed or cancelled.
- An operator removes the entry with its delete button, or with the
clear_dispatch_dedupMCP tool.
The roadmap calls for richer audit-log content here over time; the current implementation is focused on the dedup window.
Customizations
Lists every file under thecustom/ directory in the orchestrator’s working tree that overrides a built-in.
The table shows each file’s:
- Path
- Category (
pipeline/step/provider/other) - Status (
override/additive/—for theothercategory) - Upstream counterpart path it shadows
- File size
- Last-modified time
A CI workflow (
protect-custom.yml) flags upstream PRs that modify files under custom/ outside the allowed paths (custom/README.md and .gitkeep files). The check is currently advisory — it won’t hard-block a merge but will surface a warning in CI. The team has it tracked to restore as a hard fail.See Add custom pipeline steps for the resolution rules.Admin API reference
Operator-facing/api/* endpoints require a signed-in session, which lasts 24 hours. A request carries it in the cookie the browser sets at sign-in, or in an Authorization: Bearer header when you are scripting.
The session-machine endpoints at the end of this section are the exception — they authenticate by a per-session nonce instead.
Authentication
In the browser, sign in with single sign-on or the access code — the session lands in a cookie and nothing else is needed. For scripting, mint a token with the access code and pass it as a bearer header. This works only where an access code is configured: with single sign-on alone the orchestrator refuses access-code sign-in, so there is no bearer flow.1
Obtain a bearer token
POST your access code to The response contains a
/api/auth:token field. Store it for subsequent requests.2
Pass the token on subsequent requests
Include the token as a
Bearer header:Endpoint reference
Authentication
The
/api/auth/* sign-in endpoints above are reachable without a session — they are how you get one, and they stay open even when no access code is configured. Every other operator-facing endpoint on this page returns 401 Unauthorized when the session cookie or bearer token is missing or expired.Project mappings
Jira field helpers
Issues, jobs, and pull requests
Reports
Sessions, reaper, and deduplication
Dispatch breaker
Runner mode and settings
Secrets
Orchestrator status
Session-machine endpoints
The/api/* endpoints below are called by Fly Machine and local Docker runner sessions, not by operators, and — unlike the rest of /api/* — do not require an operator session. Each authenticates with a per-session nonce instead, issued when the session starts and rejected once it expires.
These are internal to the orchestrator and its runner sessions. They are listed here so monitoring and ingress rules account for them correctly — not as an interface to build against. Their paths, payloads, and authentication may change without notice, and nothing outside a runner session should call them.
Runner callback endpoints
The endpoints below are called by runners (GitHub Actions workflow jobs, Fly Machine sessions, or local Docker containers running an issue), not by operators. Some sit outside the/api/* namespace and some inside it, but all are authenticated by a runner token rather than by an operator session.
All of them respond
501 Not Implemented when the orchestrator has no RUNNER_TOKEN_SECRET configured, since none can validate tokens without it.
Operators do not normally call these directly. They’re documented here so that monitoring tools, ingress configurations, and debugging sessions can account for runner-side traffic correctly.