Skip to content
Protocol v0.5 · Robinhood Chain mainnet (4663)

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.

  1. 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.

  2. 02

    Protect

    The payload is encrypted and bound to the agent, execution and checkpoint, uploaded, read back, and checked against its digest.

  3. 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.

  4. 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.

A simulated run in your browser. It shows the order of operations the SDK follows; it is not live protocol activity.
Simulated demonstration · not live protocol activityframe 1/23
  1. 01
  2. 02
  3. 03
  4. 04
  5. 05
  6. 06
  7. 07
  8. 08
  9. 09
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
Checkpoint @ step 06
not created
External swap @ step 10
not started · executed 0×
Phase
Executing
  1. Locate recovery point
  2. Retrieve and validate
  3. Reconcile actions
  4. Resumed

step 01 complete

What the SDK does, shown with made-up steps. Recovery restores the agent's recorded state; it does not undo the swap, which already happened and is reconciled instead.

Architecture

The contract and the stored artifacts are the record. Everything else is replaceable.

Anyone with an RPC endpoint and access to the artifacts can verify a checkpoint without Upoch's services, using the TypeScript SDK or the Python verifier.
  1. 1Agent runtimeYour agent code on Node.js 24. Python agents can verify checkpoints today.Yours
  2. 2Upoch SDKExecution hooks, state capture, action gate, recovery coordinatorTested on testnet
  3. 3Context storagerecordEncrypted artifacts on IPFS or Arweave, digest-checked on every readIPFS live · Filebase
  4. 4Upoch Core contractrecordCommitments, lineage, recovery policy, eventsDeployed · mainnet
  5. 5Upoch servicesAPI, indexer, verification and recovery jobs: convenience only, never the authorityHosted

Recovery

A policy-governed path back to a known-good checkpoint.

Recovery changes only Upoch's own records: the canonical head, the executor set, guardian removals, and whether the workflow resumes. It cannot move funds, call other contracts, or undo anything that already happened on-chain.
  1. 01

    Propose

    Owner or a guardian. The workflow pauses automatically.

  2. 02

    Guardian quorum

    A configurable number of distinct guardians approve.

  3. 03

    Owner approval

    If the policy requires it, with an optional fallback if the owner is unavailable.

  4. 04

    Timelock

    A configurable delay in which the owner can still cancel.

  5. 05

    Execute

    Within a bounded window; then the workflow resumes or stays paused.

Checkpoint lineage, step 4: ResumeExecution resumes from 3. The next checkpoint, 6, links to 3 and becomes the head.123456committedsuperseded (kept on-chain)failurerecover to 3resumed, head = 6

4/4 Execution resumes from 3. The next checkpoint, 6, links to 3 and becomes the head.

Illustration, not live data. The console shows the same lineage for real workflows.

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.

Passing L1 and L2 proves that an authorised key committed to these exact bytes at this time. It does not prove the bytes are correct, and Upoch says so everywhere it reports integrity.
L1Guaranteed by contract

Record integrity

Was this checkpoint recorded on-chain, linked to the head, by an authorised executor?

Enforced by the contract: invalid submissions revert.

L2Checked off-chain

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.

L3Not provided 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.

Steps and actions go through a session. Checkpoints follow the policy, and a restarted process resumes from the last verified one. The full guide is in the docs.
agent.ts
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.

Each checkpoint hash commits to the chain, the contract, the workflow, its position, its parent, and the data. Including the chain ID and contract address means a hash can't be replayed on another deployment.
WordFieldEncoding
0typehash bytes32as-is
1chainId uint256big-endian
2ledger addressleft-padded with 12 zero bytes
3workflowId uint256big-endian
4sequence uint64big-endian, left-padded
5parentHash bytes32all zeros for genesis
6stateHash bytes32keccak256(stateBytes)
7traceHash bytes32keccak256(traceBytes)
8dataURIHash bytes32keccak256(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.

Tested on testnet

Any Node.js agent

Call the SDK from your own code: checkpoints, encrypted state on IPFS, and recovery. Exercised end to end on Robinhood Chain testnet.
Verification

Python agents

Checkpoint verification and hashing with byte-for-byte parity, reading the chain and IPFS directly. The agent runtime is TypeScript.
Planned

Agent frameworks

Adapters for LangChain and other frameworks are planned. Until then, call the SDK from a framework tool.

Status details are on the ecosystem page.

Protocol metrics

Read live from the contract on Robinhood Chain mainnet.

Counted directly from the contract's on-chain records at 0x6179d9123c3c1f9e82f948101a4350cb55aa8c27, refreshed every few minutes; nothing is estimated. Early on, the counts include the team's own test workflows.

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.

Protocol specificationv0.5 · profile v1Contract protocol v0.5 (recovery outcome records, lookup by checkpoint id, relayed submission), plus the checkpoint profile.
Smart contractsDeployed · mainnetDeployed on Robinhood Chain mainnet (4663); source published and verified on Sourcify (exact match). 403 contract tests pass under Hardhat and Foundry.
TypeScript SDKTested on testnetCheckpoints, encryption, IPFS storage, action gate and recovery. On Robinhood Chain testnet: encrypted checkpoints pinned on IPFS, a rollback through the console and resumption; locally, end-to-end scenarios A to G.
Python SDKVerificationIndependent verification of checkpoints, manifests and stored data, read directly from the chain and IPFS, with parity tests against the TypeScript SDK.
Backend, indexer, analyticsHostedAPI with tenant isolation, chain indexer with reorg handling, verification jobs; hosted, with the indexer following the deployed contract.
Website and consoleLive · mainnetThe console reads the mainnet contract: workflows, checkpoints, integrity checks and wallet-signed recovery actions with MetaMask; invited organizations sign in for keys and analytics.
DeploymentsMainnetDeployed on Robinhood Chain mainnet (chain 4663) at 0x6179d9123c3c1f9e82f948101a4350cb55aa8c27.
Security reviewInternal reviewInternal security review by the development team; the full report is in the documentation. An independent audit is planned.