Skip to content

Unified autonomous steering — Reference

Reference for the coordinator-owned steering path. Every correction signal is persisted, surfaced, decided by the coordinator, and then executed according to that decision.

For the implementation flow, see the deep dive. For operator behavior, see the experience guide.

Routes

Method & pathBodyReturnsNotes
POST /api/runs/{coordinatorRunId}/steerkind, optional target_child_run_id, instructionSteering directive viewHuman steering entry point. pause is not supported.
POST /api/runs/{coordinatorRunId}/assembly/reviewapproved, request_changes, declined, feedback, optional target filesAssembly review decisionHuman review still posts to the review gate, but correction feedback is routed through unified steering.

The separate Assembly Gate route was removed; correction feedback uses unified steering through the coordinator.

Steering signal fields

SteeringSignal is the internal normalized contract (apps/Agentweaver.Api/Coordinator/SteeringSignal.cs:29).

FieldValues / typeMeaning
CoordinatorRunIdstringCoordinator run that owns the decision.
Sourcehuman-review, rai, rubberduck, build-test, agent, coordinator, stepWhere the feedback came from.
TargetScope{ kind, subtaskIds?, childRunId? }Run, work-plan, or subtask target.
FeedbackstringReasoning context for the coordinator; not parsed for hidden routing.
Severityadvisory, request-changes, blockingHow strong the signal is.
Verbstop, send, redirect, amend, dispatch-freshDelivery verb.
TreeHashstring or nullAggregate tree hash the feedback was produced against.
TargetFilesstring array or nullExplicit hints only; never inferred from prose.
CreatedBystringUser, agent, or gate id.

Decision directions

DecisionMeaningEffect
in_place_steerA: context-preserving correctionResume the same child run/session/worktree with revision feedback.
dispatch_freshB: conscious fresh dispatchReset selected subtasks and launch fresh child runs. Always preceded by coordinator.steering_decision.
proceedC: proceed or terminalContinue to review or record a terminal/blocked result.
advisoryD: no-opSurface the signal and take no corrective action.

The in_place_steer vs dispatch_fresh choice hinges on a resumability probe. The in-api default (DefaultResumabilityProbe) treats a target as resumable when a target subtask still references a ChildRunId inside its retention window. At the assembly gate under pod-per-run, PodPerRunResumabilityProbe additionally treats subtasks that reached assemble_ready / completed as non-resumable (their AgentHost pod was released on suspend), so the decision resolves to dispatch_fresh — a fresh pod on the committed worktree branch — instead of resuming a reaped pod (apps/Agentweaver.Api/Coordinator/CoordinatorSteeringDecider.cs:706, issue #220). In pod-per-run + single-agent squads with no eligible rotation author, the first rejection therefore routes straight to human review rather than looping full-plan replans.

Events

EventWhen it firesPayload
coordinator.steering_receivedA signal from any source is persisted and queued.directiveId, source, severity, verb, targetScope, feedback, treeHash
coordinator.steering_decisionThe coordinator records its A/B/C/D decision before executing the effect.directiveId, decision, rationale, subtaskIds, attempt
coordinator.steeringLegacy directive lifecycle event for human steering.directiveId, kind, targetChildRunId, status, instruction

The web timeline renders dispatch_fresh as fresh dispatch, in_place_steer / in-place as steered in place, and advisory as advisory noted (apps/web/src/components/LifecycleEventCard.tsx:260).

Failure and recovery semantics

CaseObservable resultRecovery behavior
Transient in-place revision commit failureThe child stays on the same run/worktree while commit is retried.AgentTurnExecutor retries CommitChanges up to 3 attempts before surfacing failure.
Persistent child executor failure during in-place revisionChild run terminalizes with run.failed reason child_executor_failed:{executor} and the corresponding workflow.step is failed.The coordinator preserves the steering instruction and emits a visible dispatch_fresh steering decision for failed targets.
Crash before revision launch or before first confirmed effectThe steering directive remains outstanding; it is not marked applied.Recovery re-drives unconfirmed targets. Confirmed child effects are skipped so successful children are not re-injected.
Successful in-place revisionSame child run/worktree re-enters assembly after reaching assemble_ready or completed.The directive is marked applied only when every target is assembly-eligible and every target child has a confirmed SteeringRevisionExecution marker.

child_executor_failed:{executor} is terminal for coordinator child runs. It replaces the previous uninformative watch_stream_completed_without_terminal_event path for child executor throws, so operators see the executor that failed and the timeline gets a failed workflow.step.

Budgets

BoundDefaultSource
Per-subtask recovery attempts3CoordinatorSteeringService.MaxRecoveryAttempts
Per-plan steering iterations6CoordinatorSteeringDecider.DefaultMaxPlanSteeringIterations

When a budget is exhausted, the decider chooses proceed and records the rationale. Assembly may surface this as assembly_blocked with reason steering_budget_exhausted.

Status and persistence

State / recordPurpose
SteeringDirectiveStores the signal, status, chosen action, attempt, source/severity/scope, and tree hash.
assembly_steering work-plan statusDecision-in-progress lease for assembly-originated feedback.
SteeringRevisionExecutionAttempt-specific marker proving an in-place revision effect ran.
RecoveryAttempts on subtaskPer-subtask loop bound.
SteeringIterations on work planPer-plan loop bound.

A human redirect/amend/send sent to POST /api/runs/{id}/steer while the coordinator is parked at the assembly human-review gate (awaiting_review) is delivered straight into the review gate rather than the child-turn queue (#226): redirect/amend become a request-changes decision on the same path as POST /assembly/review (settling relayed), and send becomes an advisory note (settling applied). When the gate is armed on a different API replica the directive is durably persisted with the terminal status deferred for the owning pod's poller to drain, and the endpoint answers 202 Accepted. See resilient assembly review.

See also