Checkpoint. Verify. Recover.
Never Lose an Agent Workflow Again.
Checkpoint execution state, preserve recoverable context, and coordinate safe recovery across autonomous workflows.
Upoch restores an agent's recorded state and reconciles its external actions. It cannot reverse transactions that already happened on-chain.
The console reads the Upoch contract on Robinhood Chain mainnet. Transactions are real and cost gas.
- ContractSolidity, 403 tests under Hardhat and Foundry
- VerificationIndependent checks in TypeScript and Python
- NetworkRobinhood Chain mainnet (4663)
The checkpointing problem
Autonomous workflows fail in the middle, and the middle is where the money moves.
- 01
Long workflows fail midway
An agent that crashes at step 14 loses its plan, variables and tool results, and usually starts over. - 02
Restarting can repeat actions
A swap that was sent before the crash may or may not have executed. Retrying blindly can do it twice. - 03
Saved state is unverifiable
Without a commitment, nobody can tell whether a saved state is the one the agent had, or whether it was altered. - 04
Model output is not replayable
Re-running an old prompt does not reproduce the old answer. Recovery has to resume from recorded results.
How Upoch works
A verified recovery point at every boundary that matters.
Capture state at the boundaries that matter
- Before or after an action, every few steps, or on request, the SDK serializes the agent's state and context.
- The payload is encrypted, bound to the agent, execution and sequence, uploaded, read back and checked against its digest.
- Only hashes and the parent link go on-chain. The contract rejects anything out of order or from an unauthorised key.
Diagrams illustrate the protocol; they are not live data.
- 01
Capture
At a declared boundary (before or after an action, every few steps, or on request) the SDK serializes the agent's state and context.
- 02
Protect
The payload is encrypted and bound to the agent, execution and checkpoint, uploaded, read back, and checked against its digest.
- 03
Commit
The state hash and a canonical manifest's hash go on-chain, linked to the parent checkpoint. The contract rejects anything out of order or unauthorised.
- 04
Recover
After a failure the SDK verifies the last checkpoint, restores its state, reconciles pending actions, and resumes without repeating confirmed ones.
Recovery, step by step
A failure at step 14, a resume from the checkpoint at step 06.
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- Checkpoint @ step 06
- not created
- External swap @ step 10
- not started · executed 0×
- Phase
- Executing
- Locate recovery point
- Retrieve and validate
- Reconcile actions
- Resumed
step 01 complete
Architecture
The contract and the stored artifacts are the record. Everything else is replaceable.
- 1Agent runtimeYour agent code on Node.js 24. Python agents can verify checkpoints today.Yours
- 2Upoch SDKExecution hooks, state capture, action gate, recovery coordinatorTested on testnet
- 3Context storagerecordEncrypted artifacts on IPFS or Arweave, digest-checked on every readIPFS live · Filebase
- 4Upoch Core contractrecordCommitments, lineage, recovery policy, eventsDeployed · mainnet
- 5Upoch servicesAPI, indexer, verification and recovery jobs: convenience only, never the authorityHosted
Recovery
A policy-governed path back to a known-good checkpoint.
- 01
Propose
Owner or a guardian. The workflow pauses automatically.
- 02
Guardian quorum
A configurable number of distinct guardians approve.
- 03
Owner approval
If the policy requires it, with an optional fallback if the owner is unavailable.
- 04
Timelock
A configurable delay in which the owner can still cancel.
- 05
Execute
Within a bounded window; then the workflow resumes or stays paused.
4/4 Execution resumes from 3. The next checkpoint, 6, links to 3 and becomes the head.
Supported actions
- Move the canonical head back to an ancestor checkpoint. Later checkpoints are superseded, not deleted.
- Remove and add executor keys.
- Remove guardians (for example one that keeps proposing).
- Resume the workflow, or leave it paused for the owner.
Exactly two ways to unpause
- U1 The owner unpauses directly, only when no recovery is in progress.
- U2 A recovery that completes its full lifecycle, timelock included, resumes the workflow.
- No single guardian and no executor can unpause.
Integrity model
Three separate guarantees, never merged into one badge.
Record integrity
Was this checkpoint recorded on-chain, linked to the head, by an authorised executor?
Enforced by the contract: invalid submissions revert.
Data integrity
Is the off-chain data available, and does it hash to the committed values?
Checked off-chain by any verifier. Results are the verifier's own; never written on-chain in v0.
Execution correctness
Did the agent compute this state correctly from its inputs?
Would require validity proofs, trusted hardware attestation, or a challenge game.
SDK quickstart
Wrap the workflow you already have.
import {
EpochAgent, RpcCheckpointChain, ReplicatedStorage, IpfsStorageAdapter,
LocalAesGcmProvider, StateSerializer, FileJournal, httpProvider,
} from "./sdk/src/index.ts"; // not yet published as a package
const agent = new EpochAgent({
agentId: "rebalancer-1",
chain: new RpcCheckpointChain({
provider: httpProvider(process.env.RPC_URL!),
ledger: EPOCH_ADDRESS, // the deployed Upoch contract
workflowId: 1n, // registered with registerWorkflow
from: EXECUTOR_ADDRESS, // an executor of that workflow
}),
storage: new ReplicatedStorage([new IpfsStorageAdapter({
apiUrl: "https://rpc.filebase.io", authorization: "Bearer " + IPFS_TOKEN, gatewayUrl: "https://ipfs.filebase.io",
})]),
encryption: new LocalAesGcmProvider(KEY_32_BYTES), // development provider
serializer: new StateSerializer({ applicationVersion: "rebalancer/1", schemaVersion: 1 }),
journal: new FileJournal("./epoch-journal.jsonl"),
checkpointPolicy: { everySteps: 3, beforeExternalAction: true, afterConfirmedAction: true },
reconcilers: { swap: (op) => venue.status(op.operationId) }, // query before any retry
});
const result = await agent.executeWithAutosave(async (session) => {
const state = await session.restoreOrInitialize(() => ({ step: 0, fills: [] }));
while (state.step < 3) {
state.step++;
await session.step(state); // SAFE_BOUNDARY checkpoint every 3 steps
}
await session.action({ // PRE_ACTION and POST_ACTION checkpoints
operationId: "swap-1", // stable: a confirmed swap-1 is never re-run
operationType: "swap",
input: { amount: "100" },
run: (input) => venue.swap(input),
});
return state;
});The SDK is not yet published to a registry. This example uses the node's own account; for a real network pass a LocalKeySigner or another signer as sender. LocalAesGcmProvider is for development; Lit is not integrated yet.
Checkpoint hash
One fixed 288-byte encoding, reproducible anywhere.
| Word | Field | Encoding |
|---|---|---|
| 0 | typehash bytes32 | as-is |
| 1 | chainId uint256 | big-endian |
| 2 | ledger address | left-padded with 12 zero bytes |
| 3 | workflowId uint256 | big-endian |
| 4 | sequence uint64 | big-endian, left-padded |
| 5 | parentHash bytes32 | all zeros for genesis |
| 6 | stateHash bytes32 | keccak256(stateBytes) |
| 7 | traceHash bytes32 | keccak256(traceBytes) |
| 8 | dataURIHash bytes32 | keccak256(UTF-8 bytes of dataURI) |
Specification test vector 0
Verified ×2- typehash
- 0xbbf7fb0599dba67cbeafa1d7877623fbbf5d7cf8efad1861a72eb5b403848bf5
- chainId · workflowId · sequence
- 31337 · 1 · 0
- dataURI
- ipfs://example/checkpoint-0.json
- checkpointHash
- 0x3cb346710ba548d06822f8175c38497fbb05308ec1acf454e9ca5b6334b47205
These are real values from spec §4.3, computed independently in JavaScript and in Solidity. They are not demo data.
Integrations
Works with any agent that can call the SDK.
Any Node.js agent
Python agents
Agent frameworks
Status details are on the ecosystem page.
Protocol metrics
Read live from the contract on Robinhood Chain mainnet.
Workflows registered
1
Checkpoints committed
2
Checkpoints, last 24 hours
2
Recoveries executed
0
Limitations
What Upoch does not do.
- limit
No proof of correct execution
v0 records commitments; it does not verify computation (L3). - limit
No on-chain state reversal
Token balances, other contracts and past transactions are untouched by rollback. - limit
No availability guarantee
The contract stores hashes and a locator. Artifacts live on IPFS or Arweave; the SDK checks availability but cannot guarantee it. - limit
Owner is the root of trust
A compromised owner controls configuration and can veto recovery. Use a multisig.
The full list is in specification §11.
Project status
Where Upoch is today.
Explore
Read the details before you rely on them.
- DocumentationQuickstart, SDK reference, recovery and verification guides.
- SpecificationThe checkpoint encoding, contract invariants and limitations.
- ResearchDesign documents, decisions, threat model and open questions.
- EcosystemIntegration status, each one labelled by what has been tested.
- SecurityThreat model, audit status and vulnerability reporting.
- StatusWhat runs where today, and the evidence for each.