Unknown outcome or definitive rejection
Every run state mutation requires a positive current expected_run_version. Do not reuse a version from before another action. See the Integration API reference for the supported external request shapes.
Attempt IDs
When a ready node has no currentAttemptId, generate a new UUID for the first attempt. Use the currentAttemptId returned by the server for subsequent mutations to that attempt. Do not invent an attempt ID from a null field. For a manually reported resumable blocker, only the same principal, performer, and session may resume the blocked attempt; call start_step with that same attempt ID. A new agent session must not impersonate the old session to resume it. A handoff_step call ends the current performer attempt and queues the step under a new ID reserved for the run’s responsible human. The responsible human starts that queued attempt. An unrelated agent cannot claim it.Checks and candidate changes
Before reporting CI evidence, readGET /v1/runs/{runId}/checks. Use its current runVersion, accepted plan revision, candidate reference, implementation attempt, and verification attempt. If Verify is ready and verificationAttemptId is null, generate one UUID for the first checker report; then use the returned current attempt on later reports.
Each check binds to the current accepted Plan, candidate, Implement attempt, and Verify attempt. A pass is the only status that can satisfy the gate. fail fails Verify; blocked and not-applicable do not satisfy it. Failed or blocked check outcomes require authorized rework; they cannot be resumed as a manually reported blocker.
Rework preserves attempt history. It can keep the current accepted Plan or explicitly revise it. Revising Plan increments the Plan revision and returns to Plan. Rework at Implement invalidates the current candidate and all dependent verification and review evidence. Reports for the previous candidate remain visible but cannot pass the new gate. Rerun checks and review against the new candidate.