One human answer,
delivered exactly once.

Handoff is an open protocol for the moment a program needs a person. A request for a human decision is stated as typed data, reaches someone, comes back exactly once, and leaves a receipt.

Open protocol·Apache-2.0·26/26 Level 1 conformance·verified against the deployed service
handoff.omegas.dev · recorded 2026-08-01
# the agent asks: a typed request, not free text POST /v1/requests 201 req_01KYXQ8TGWSVT1JFEN2594DKAY # the agent tries to answer itself POST /v1/requests/…/answer 403 requester_may_not_answer # a person decides POST /v1/requests/…/answer 200 {"decision":"retry_once"} single_use # the answer is spent when it is used POST /v1/effects 200 first_redemption: true POST /v1/effects (retry) 200 first_redemption: false POST /v1/effects (new key) 409 authorization_spent
Recorded from the live service: a request, a refused self-answer, a human decision, and a single-use authorization that spends exactly once. The identifiers are real.

Ask, decide, redeem.

1

Ask

Your agent states the decision as typed fields against a declared schema, with the required authority named on the request itself.

2

Decide

The request reaches a person. A machine principal can never answer it; the server refuses by principal type, not by role or configuration.

3

Redeem

The answer authorizes exactly one effect. A retry converges on the original outcome; a second spend is refused.

Every clause is load-bearing.

One human answer

A specific person acted, and the record says who. Clearance is asserted by a human, never inferred from a side effect.

Exactly once

An answer is consumed when it is used. A stored yes cannot be spent a second time by a retry, a replay, or a duplicate delivery.

As typed data

The answer is a value against a declared schema, not free text a prompt has to interpret. Unknown field types are rejected rather than degraded into a text box.

Authorizing one effect

The answer is bound to the specific thing it was shown against. It does not generalize to the next call, the next run, or a similar-looking request.

The decision has a receipt.

Every settled request mints a receipt naming who decided, what was granted, and when. Receipts land on a hash chain, so the record of human decisions is append-only and checkable. This one is real; it settled the exchange above.

Receiptrcpt_01KYXQBB4MK7Y5HA4FW1105S1X
Request
req_01KYXQ8TGWSVT1JFEN2594DKAY
Decided by
usr_01K3M7QW8ZC4YRXB2N6VD9FTHE · human · 2026-08-01T03:54:39Z
Grants
{"decision":"retry_once"} · single_use
Redeemed
first_redemption: true · a retry converged · a new key was refused
chain sha256:b8bc2613… · height 26 · prev sha256:4a8e5f8c…

Stated plainly.

Verified live

  • 26/26 Level 1 conformance cases pass against the deployed service
  • A requester principal cannot answer its own request
  • The same effect key converges; a second spend is refused
  • Every receipt lands on a hash chain

In the repository

  • Protocol v0.1, frozen: 21 invariants, OpenAPI 3.1, signing test vectors
  • A Rust reference server, the target of the conformance suite
  • TypeScript and Python SDKs with zero runtime dependencies

Not claimed

  • It does not resume your program. Your code asks, waits however it prefers, and receives an answer
  • Self-hosting does not come with reach. Sender reputation and carrier relationships do not ship in a container

The spec, the server, the suite.

Apache-2.0. One repository holds the frozen v0.1 protocol, the Rust reference server, the 26-case Level 1 conformance suite, and both SDKs.

Handoff on GitHubAPI basehttps://handoff.omegas.dev/v1