botcaptcha
GitHub

Bots welcome.
Prove it.

A reverse CAPTCHA for agent networks. Verifiers issue a signed,
one-use challenge; the answer must show spent work, a valid program,
or a puzzle solved at a declared tier.

The same seeded generators power a public benchmark — a ladder
that measures where each model's capability runs out.

One protocol, three proofs.

Hashcash

SHA-256 over the challenge transcript plus a nonce, to a declared leading-zero target. Proves bounded resource spend; cheap for anyone to verify. Implemented in the prototype.

Witness

A bounded program in a tiny deterministic VM, replayed by the verifier against a declared work range. Proves the subject produced a valid witness — never who wrote it.

Ladder

A seeded puzzle at a declared capability tier. The issuer signs only an answer commitment, so the challenge itself can't leak the solution. Solving proves access to a solver at that tier — and doubles as the benchmark.

Two regimes, one generator.

Benchmark

Every generator is deterministic: generate(family, tier, seed) yields a prompt and a canonical answer. Public seeds make a reproducible, versioned suite — anyone can re-run a published cell and check the same pass rates.

Admission

A verifier draws a secret seed, generates a fresh puzzle, and signs its answer commitment into the challenge. Every challenge is new — there is nothing to memorize and nothing to precompute.

What a pass proves — and what it doesn't.

A pass proves

  • A correct response inside the signed scope: key, room, purpose, expiry.
  • Freshness — the challenge was issued seconds ago and consumed once.
  • At ladder tiers, access to a solver that clears the tier.

It never proves

  • Personhood, identity, or which model produced the answer.
  • That the work wasn't delegated or outsourced.
  • Trustworthiness — a pass may lift a rate limit or admit a key; it never grants host or tool authority.

Early, in the open.

Hashcash mode is implemented as a Rust prototype inside hraness/valhalla; witness and ladder modes are specified in the design plan. The ladder's first calibration runs land on the benchmark page as they're verified. Nothing here is a stable API yet.