Skip to main content
Status: Durable lifecycle SSE is available in the production partner preview. Exact browser approval events remain pending production activation. Cancellation-reconciliation code is deployed, but final-status behavior remains pending a separate live canary.
The key must carry runs:read, and the run must belong to its tenant. Last-Event-ID is optional. When supplied, it must be a non-negative safe integer; the stream resumes strictly after that task_run_events.sequence.

Framing

Every projected event uses standard SSE id, event, and data fields:
  • id equals the event’s numeric sequence.
  • The stream sends comment heartbeats after ten seconds without a projected event.
  • Disconnecting cancels the polling loop.
  • A completed, failed, or cancelled run closes the stream.
  • Once the reconciliation final-status canary clears, reconciliation is non-terminal: the run remains running, and the stream stays open through reconciliation and recovery.
  • The TypeScript client rejects a missing/mismatched SSE id, non-increasing sequences, events after a terminal event, and EOF before a terminal event.

Durable event vocabulary

Reconciliation without a new event type

The migration and compatible Workers are deployed, but this final-status path remains pending a separate live canary. Once that gate clears, internal reconcile_required states project through the existing v1 shapes. The run stays running, and the stream emits this exact run.progress message:
Do not retry or resubmit the run while you see that message. Reconciliation is not a terminal event, so the stream remains open. If Praxa resolves the uncertainty, it emits another run.progress event with this exact message:
If Praxa cannot verify whether a committing action happened, it emits a terminal run.failed event:
Ordinary failed, partial, and expired outcomes continue to use failure.code: "run_failed". An accepted cancellation request can follow any of these paths. It does not prove rollback or guarantee an immediate run.cancelled event.

Approval events fail closed (pending activation)

Praxa emits approval.required only when it can derive a customer-safe exact presentation from immutable browse_session_act executor input. The event contains an approvalId, the exact action_digest, and a summary made from the recorded instruction or steps followed by the target host. The same fields can appear as RunResource.pendingApproval. Render that summary without truncation or re-derivation. After the person chooses, send approve or deny with the event’s exact digest to POST /v1/runs/:id/approve. Praxa re-derives the presentation and compares the digest before recording the decision. If the presentation or digest is absent, stale, unsupported, or mismatched, Praxa emits no unsafe approval projection and accepts no decision. The versioned AiPlatformRunEventV1 schema also includes output, tool, and usage events. The current durable-task projector does not emit those event types. No event exposes prompts, reasoning content, raw tool arguments, provider cost, margin, lease state, or executor credentials.

TypeScript

Last modified on August 14, 2026