Wait for ownership proof and human review
A human may take minutes or hours to respond. Extrovert keeps the underlying activation reservation, review, and unhandled events independently of one tool request. The observer watches that state; it does not act on the person’s behalf.
Use a quiet watch
Section titled “Use a quiet watch”For a running CLI, these commands renew short requests without asking the model to reconsider every empty response:
extrovert verify --wait-seconds 1800extrovert review watch --wait-seconds 1800 --jsonThe default overall watch budget is 30 minutes; the maximum is 24 hours
(86400 seconds). verify resumes a saved signup and completes the credential
exchange after valid proof. review watch only observes; it returns feedback
requiring judgment, an explicit empty pending queue, or the observer deadline.
Omit a review filter for the normal shared composer queue.
In the TypeScript SDK, client.reviews.events.watch() provides the same quiet
review observation. Its timeoutSeconds option controls the overall budget and
signal supports caller cancellation. A single bounded wait() remains available.
SDK guide.
Keep the agent’s turn active while waiting. If its execution tool returns a running process handle, collect that process’s eventual result. A background CLI does not independently wake a stopped chat or decide how to rewrite a draft.
Optional MCP Tasks
Section titled “Optional MCP Tasks”Clients that negotiate MCP Tasks can request task execution for
check_activation and wait_for_review_event. Extrovert returns a durable
handle that the client can inspect, retrieve, or cancel. Clients without Tasks
support retain the ordinary tools and their bounded waits. Do not assume that a
particular host supports Tasks merely because it supports MCP.
Both modes use the same source workflow. A task’s completed status means its
observation is available:
- Activation: the reservation is no longer pending.
provenstill requires explicit verification;expiredis not successful setup. - Review: actionable events exist, or
pending_reviewsis explicitly zero. Read the actual review/submission before reporting that an email was sent.
Reading a task result never acknowledges feedback. A completed task keeps its
original snapshot; start a new observer for subsequent feedback. Reuse a
client_id only when retrying creation of that same observation.
The REST API also exposes create/get/cancel to other clients. Handles last one hour by default, configurable from 60 seconds to 24 hours. Up to 100 unexpired handles, including completed ones, are retained per credential family. Every access rechecks current authentication, scopes, resources, and the original capability profile. A refreshed token for the same connection can resume its handle; a different connection or replacement key cannot.
Timeouts and recovery
Section titled “Timeouts and recovery”The 55-second limit belongs to one fallback request, not the entire human-review window. Runtime code can renew these waits under one longer observation budget. Expiry or cancellation of an observer never cancels a draft, sends mail, consumes ownership proof, or extends an activation reservation.
After interruption, use the same authorized connection and recover the original task or workflow. Handle each authenticated event, revise the same review when needed, acknowledge only completed handling, and watch again. Never cancel and recreate a draft just to apply feedback.
After human approval, check the actual outcome: approval, accepted delivery, confirmed sending, and recipient receipt are different states. Hosts need their own supported notification or persistent-worker mechanism to resume after a chat closes. Full Review Loop contract.