Skip to content

Human-in-the-loop

"What needs human action." When an agent pauses for a human decision, the run blockeds and a task appears in the Human tasks queue.

The Human tasks page — the human-in-the-loop review queue, listing tasks deadline-first with
the workflow, request summary, and age for each.

The queue

Tasks are listed deadline-first. Each row shows the workflow, the request summary (links to the detail), status (pending / escalated), the deadline (a warn pill when near or overdue), and the run. The nav badge carries the live pending count.

  • escalated — the task timed out but is still resumable; it stays in the queue rather than disappearing.
  • Near-deadline — a task approaching its deadline shows a warn pill and raises a one-time near-deadline toast so you notice before it expires.

Deciding a task

  • Fast path — the queue's Approve / Reject buttons resume immediately.
  • Richer decisions — open Details… for a task that needs content or a choice: provide (supply content), edit (amend), or select (pick from options). The detail view shows the request prompt + the redacted message thread.

Every resume is idempotent — a per-attempt Idempotency-Key makes a retry safe, and kneo-client replays rather than double-resuming. Resuming past the deadline surfaces a clear "task expired" message (human_task_expired) and refreshes the queue.

Worked example — approve a refund hold. A refund run blocks on a "confirm amount" task. It appears in the queue with a near-deadline pill. Open Details…, read the request prompt + the redacted thread, and either hit Approve (fast path) or, if it needs a value, use provide to supply the amount and resume. The run leaves blocked and the task drops off the queue; if you were a minute too late, you get "task expired" and the run stays blocked for a fresh escalation.

Bulk resume

Select several rows (per-row checkboxes or select-all) and apply one decision — Approve selected / Reject selected. The Dashboard fans out one idempotent resume per task, each independent: an expired or conflicting task doesn't sink the batch. A results banner summarizes N succeeded / M failed, grouped by reason (e.g. human_task_expired, run_state_conflict).

Note

Resuming is platform-authoritative — the platform enforces who may resume via its scope. On top of that the Dashboard authorizes it server-side by capability (0.4.0): resume requires the run.control capability (held by operator+admin in the built-in default map; reassignable via the Access map — the role is just the lookup key), and the acting operator gets a best-effort append to the local audit log (best-effort, not guaranteed — see the audit contract).