Projects
A project is your persistent configuration: which repos to clone, what budgets to enforce, and when to run. All LLM calls use Synth-managed keys. Every run is executed against a pinned snapshot of that config, so you can always trace which configuration produced which results. Project state lives atGET /smr/projects/{project_id}. Key fields:
Onboarding
The run button is disabled until onboarding iscomplete. The wizard has four steps:
| Step | What it does |
|---|---|
| 1. Project basics | Name, timezone, schedule window (at /smr/new) |
| 2. Connect GitHub | OAuth or PAT → workers use this credential to clone and push. Optional; can skip. |
| 3. Starting data & spec | Upload datasets, example traces, or other references the agents should use. Write the project spec (what agents should research). |
| 4. Budgets | Set monthly + per-run caps, timebox (max run duration); run dry-run validation |
connect_github, starting_data_spec, keys_budgets, plus artifact_storage, approvals_egress, notifications when used via API.
Check status at GET /smr/projects/{project_id}/onboarding/status. Run the dry-run check at POST /smr/projects/{project_id}/onboarding/dry_run — it validates Infisical reachability, provider key presence, and S3 write access.
Entitlements
Managed Research requires a Pro or Team plan. Check entitlement atGET /smr/projects/{project_id}/entitlements/managed_research. The frontend shows “SMR Access: Enabled” or “Upgrade to Pro” based on this.
Runs
A run is a single execution against a config snapshot. Trigger one atPOST /smr/projects/{project_id}/trigger.
Run states
queued— waiting for the orchestrator to claim itplanning— orchestrator has claimed it and is creating tasksexecuting— one or more worker tasks are in progressblocked— waiting on a pending approvalfinalizing— workers done, assembling proof bundle and summarydone— complete; all artifacts are availablefailed— terminated with an error; partial artifacts may existstopped— timebox hit, budget exhausted, or manual stop
blocked → executing is automatic once the blocking condition resolves. You can pause a project at any time; the orchestrator stops and state is preserved. Resume when ready.
Run options
When triggering, you can override:agent_kind must be one of codex, claude, or opencode.
Tasks and workers
Orchestrators and workers are coding agents that create, assign, complete, and update tasks. They work towards a set of deliverables you can review once the run is over.Artifacts
Artifacts are typed, immutable outputs produced during a run. Every artifact has a stable URI and a content digest.| Type | Contents |
|---|---|
report_md | Markdown report generated by workers — rendered first-class on the Deliverables page |
github_pr | Pull requests opened on your repo(s) — links with status in the Deliverables page |
| Result files | Arbitrary files workers attach via create_artifact — downloadable with content preview |
GET /smr/artifacts/{artifact_id}/content. List all artifacts for a run at GET /smr/projects/{project_id}/runs/{run_id}/artifacts.
Budgets
| Field | Enforced where | What happens when hit |
|---|---|---|
run_usd_cents | Data plane | Run stops with stop_reason: budget_exhausted |
monthly_usd_cents | Control plane | New runs blocked until next calendar month |
timebox_seconds when triggering a run to cap duration; when hit, the run stops with stopped. Check current spend at GET /smr/projects/{project_id}/usage — it returns MTD and last-7-days totals broken down by provider.
Approvals
When a worker wants to take a sensitive action (e.g. push a PR, write plaintext externally), it creates an approval request and the run moves toblocked.
- List:
GET /smr/projects/{project_id}/runs/{run_id}/approvals - Approve:
POST /smr/runs/{run_id}/approvals/{approval_id}/approve - Deny:
POST /smr/runs/{run_id}/approvals/{approval_id}/deny
Orchestrator health
The orchestrator heartbeats every few minutes. Iflast_heartbeat_at is more than 5 minutes stale and there’s an active run, the UI shows Unhealthy. At 30 minutes stale it turns red. Check via GET /smr/projects/{project_id}/ops_status — orchestrator.status will be running, idle, or unhealthy.