Stasis and return
A true pause leaves a marked threshold. Return begins there, or it does not begin.
A pause records its owner and return boundary. Broken continuity never reroutes or restarts the Intent. ADR 28 owns this law.
Three boundaries
| Boundary | State movement | Custody | Return |
|---|---|---|---|
| Live hardware wait | RUNNING → AWAITING_HARDWARE → RUNNING |
Resident Ghoul; Orchestrator owns readiness | Same worker hop; no queue re-admission |
| Durable Gate or delegate wait | RUNNING → AWAITING_CONSENT or AWAITING_DELEGATE |
Checkpoint and exact wait owner | Fresh enqueue and worker claim |
| Terminal Run | DONE, FAILED, or CANCELLED |
Canonical ledger | None |
A Gate or DelegatedAgentNode makes its Pattern durable, but hardware
waiting stays Live: the worker remains resident without a capability lease. Eight total
transitions or three consecutive requests for one capability exhaust the bound and fail the Run.
Live and Durable
Stasis owns the distinction.
What crosses the threshold
The consent or job identity exists before GraphRunner snapshots. The worker then commits the exact
wait owner and status without terminal DONE. Consent has released the Agent lease before its
Gate, and return reads the durable verdict before requesting another grant.
A checkpoint is Run-keyed Graph history. A NodeSnapshot carries typed Graph state,
next node, and execution status; an EndSnapshot carries final state and Graph result. Live
grants, secrets, runtime dependencies, provider handles, events, and AgentJob truth stay
elsewhere. It is declared state, neither process image nor effect receipt.
Every workflow state that can request hardware carries a typed hardware_resume_budget in that
checkpoint. Its total and per-capability counters therefore survive a durable park and a replacement
GraphRunner; reconstructing a runner cannot reset them. Checkpoints written before this field decode
with zero counters and cannot prove attempts that happened before the upgrade.
Memory returns defensive copies. The Postgres adapter replaces one JSONB history document per Run, but no real Postgres consent-plus-checkpoint restart receipt proves that path.
Return makes a new claim
Either verdict may win AWAITING_CONSENT → QUEUED; the resumed hop reads stored truth, never an
enqueue payload. Delegate return accepts only the terminal AgentJob owning the current wait.
The winner allocates a fresh monotonic enqueue sequence; its queue key derives from Run and sequence. The status change and its pending delivery commit together. Publication failure leaves that exact queued hop for the startup/runtime relay; it does not recreate the wait or reuse a possibly escaped key. Duplicate verdicts and callbacks are inert.
Bridge admits one approval call per model round. Resumed rounds may chain, bounded to three.
Multiple approvals in one response create no consent row; they settle DONE with an honest
bottleneck.
A missing checkpoint fails exactly as stasis lost. An invalid document fails the claimed hop
with validator text, not a stable public code. Pinned-manifest mismatch, including
checkpoint-schema identifier drift, fails as pinned Pattern unavailable; Pattern
lifecycle owns compatibility, migration, and refusal. Process death during
RUNNING or AWAITING_HARDWARE never guesses a replay: startup recovers only an exact first-node
Consent or delegate park, otherwise contains correlated effects before failing the Run.
An exact pending or already-decided Consent survives the pre-park startup window; decided parked consent is re-fired. The equivalent exact delegated checkpoint is parked, and startup also refreshes each durable delegated wait and re-admits it only when its exact owning job is terminal. Delegated agents owns that boundary.
Truth closes first
For a worker terminal hop: commit the ledger, release context, attempt checkpoint deletion, then
publish one terminal DONE from committed status and close. Failed deletion leaves
terminal truth intact as cleanup debt; startup retries terminal checkpoint deletion in bounded
keyset pages. API cancellation orders its writer as parent abort, final child/Consent sweep, commit
CANCELLED, publish and close, then delete stasis.
Competing writers converge on one terminal event. A retained checkpoint cannot make a terminal
Run resumable. Checkpoint
ownership owns the worker path.
Every effectful station needs its own idempotency identity, completion receipt, cancellation rule, compensation or refusal path, and illegal-repeat boundary. A checkpoint cannot settle an uncertain external effect.
Topology-A local runs are Available. Graph Stasis and consent re-admission and delegated execution are Partial. Real checkpoint-plus-Consent/delegate restart proof, distributed fencing, and general periodic workflow recovery remain absent. Workers owns custody; Spellweaver routes the subsystem.