# 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

For a running CLI, these commands renew short requests without asking the model
to reconsider every empty response:

```bash
extrovert verify --wait-seconds 1800
extrovert review watch --wait-seconds 1800 --json
```

The 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](https://docs.extrovert.dev/sdk/typescript/).

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

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. `proven` still requires
  explicit verification; `expired` is not successful setup.
- Review: actionable events exist, or `pending_reviews` is 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](https://docs.extrovert.dev/api/overview/) 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

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](https://docs.extrovert.dev/review-loop/agent-contract/).