Pipelines
Continuous integration runs, and asking an agent to fix a failed one
On this page(5 sections)
Read the runs and the jobs inside them, re-run or cancel one, and mark the board read. The interesting one hands a failing run to an agent rather than to you.
GET/ci/runsPipeline runs across the repos
What the forges are reporting for every workspace repo that has a remote, served from a cache and filled in on demand. Repos whose notifications are not wired up say so.
What you send
Nothing. Call it as it is.
What comes back
| Field | Type |
|---|---|
reposWhich workspace repositories are wired to… | object[] |
repoWhich workspace repository | string |
hostWhich forge it lives on | "github" | "gitlab" |
projectThe project there | string |
urlIts page on the forge | string |
hookWarningPresent when the sandbox could not… | string |
hookRecipeWhat to paste into the repository's… | string |
runsRuns across all of them, newest… | object[] |
repoWhich workspace repository it belongs to | string |
hostWhich forge is running it | "github" | "gitlab" |
projectThe project there, as that forge… | string |
runIdThe forge's own id for the… | number |
titleThe run's headline, usually the commit… | string |
authorNameWho the forge credits for setting… | string |
authorAvatarUrlTheir picture, hosted by the forge | string |
triggerWhat set it off, in the… | string |
workflowWhich workflow it is a run… | string |
branchWhich branch | string |
shaWhich commit | string |
statusHow it is going | "queued" | "running" | "success" | "failed" … (6) |
urlIts page on the forge | string |
createdAtWhen it started, in milliseconds | number |
durationSecondsHow long it took | number |
failedJobsWhat broke, by name | string[] |
failuresEvery main-line branch failing right now,… | object[] |
repoWhich workspace repository | string |
branchWhich main-line branch | string |
sinceWhen its first job failed, in… | number |
runIdThe newest run that failed on… | number |
jobsThe jobs failing on it now,… | string[] |
fixerThe one conversation working on it,… | string |
decisionThe latest thing decided about it:… | object |
kindWhat was decided | "fix-up" | "reported" | "spent" |
reasonWhy the fix agent handed it… | "turns" | "no-change" | "stopped" | "interrupted" … (7) |
conversationIdThe conversation working on it, when… | string |
atWhen that was decided, in milliseconds | number |
detailOne short sentence on why, in… | string |
curl "$SANDBOX/ci/runs" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.ci.runs();POST/ci/runs/rerunRun a pipeline again
Asks the forge to re-run one pipeline. The daemon only passes the request along.
What you send
| Field | Type | Where |
|---|---|---|
reporequiredWhich workspace repository | string | body |
runIdrequiredWhich run, by the forge's own… | number | body |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X POST "$SANDBOX/ci/runs/rerun" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"repo":"root","runId":1}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.ci.rerun({
"repo": "root",
"runId": 1
});POST/ci/runs/cancelCancel a pipeline run
Asks the forge to stop a run in progress.
What you send
| Field | Type | Where |
|---|---|---|
reporequiredWhich workspace repository | string | body |
runIdrequiredWhich run, by the forge's own… | number | body |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X POST "$SANDBOX/ci/runs/cancel" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"repo":"root","runId":1}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.ci.cancel({
"repo": "root",
"runId": 1
});POST/ci/runs/jobsThe steps inside one pipeline run
Each job in a run with its outcome, which is where you look to find out what actually broke.
What you send
| Field | Type | Where |
|---|---|---|
reporequiredWhich workspace repository | string | body |
runIdrequiredWhich run, by the forge's own… | number | body |
What comes back
| Field | Type |
|---|---|
jobsThe steps inside one run | object[] |
nameThe job's name | string |
statusHow it went | "queued" | "running" | "success" | "failed" … (6) |
stageWhich stage it belongs to, where… | string |
needsWhich jobs in this run it… | string[] |
startedAtWhen it began, in milliseconds | number |
finishedAtWhen it ended, in milliseconds | number |
durationSecondsHow long it took | number |
webUrlIts page on the forge, which… | string |
curl -X POST "$SANDBOX/ci/runs/jobs" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"repo":"root","runId":1}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.ci.jobs({
"repo": "root",
"runId": 1
});POST/ci/fixPut an agent on a broken pipeline
Opens a fresh isolated conversation already holding the failure: which job, which repo, what it said. The answer names the conversation so you can open it.
What you send
| Field | Type | Where |
|---|---|---|
reporequiredWhich workspace repository | string | body |
runIdrequiredWhich run, by the forge's own… | number | body |
pickWhich model to open the conversation… | object | body |
agentrequiredWhich provider | string | body |
modelrequiredWhich of its models | string | body |
accountWhich connected account of that provider… | string | body |
harnessWhich agentic loop runs it | "native" | "claude-code" | body |
effortHow hard that model should think,… | string | body |
thinkingWhether this model reasons before it… | boolean | body |
fastAsk for this model's work at… | boolean | body |
fallbackThe model a new chat opens… | object | body |
agentrequiredWhich provider | string | body |
modelrequiredWhich of its models | string | body |
accountWhich connected account of that provider… | string | body |
harnessWhich agentic loop runs it | "native" | "claude-code" | body |
effortHow hard that model should think,… | string | body |
thinkingWhether this model reasons before it… | boolean | body |
fastAsk for this model's work at… | boolean | body |
modeWhat to do about the attempt… | "continue" | "start-over" | body |
forceOpen the conversation even when every… | boolean | body |
What comes back
| Field | Type |
|---|---|
conversationIdThe conversation that was opened, already… | string |
curl -X POST "$SANDBOX/ci/fix" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"repo":"root","runId":1,"pick":{"agent":"…","model":"claude-sonnet-4-6","account":"work","harness":"native","effort":"…","thinking":true,"fast":true},"fallback":{"agent":"…","model":"claude-sonnet-4-6","account":"work","harness":"native","effort":"…","thinking":true,"fast":true},"mode":"continue","force":false}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.ci.fix({
"repo": "root",
"runId": 1,
"pick": {
"agent": "…",
"model": "claude-sonnet-4-6",
"account": "work",
"harness": "native",
"effort": "…",
"thinking": true,
"fast": true
},
"fallback": {
"agent": "…",
"model": "claude-sonnet-4-6",
"account": "work",
"harness": "native",
"effort": "…",
"thinking": true,
"fast": true
},
"mode": "continue",
"force": false
});