An AI agent stops mid-payment and pays a live, verified human for permission to continue.
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Documented (README)
- !No standard license detected
git clone https://github.com/louissarvin/proctor && cp proctor/*.md ~/.claude/agents/Subagents overview
<div align="center">
# PROCTOR
**An AI agent stops mid-payment and pays a live, verified human for permission to continue.**
<br />






<br />
An AI agent hits a policy threshold and is stopped by an HTTP 402. It pays $0.42 in USDC on Hedera to open a decision. A human witness who is **not the operator** proves liveness with World ID, bound to the hash of that exact decision, and approves or refuses inside 60 seconds. The default is refuse. An attestation binding the decision hash, the liveness proof, the witness nullifier and a consensus timestamp lands on a Hedera Consensus Service topic **with no admin key**.
**The product is the evidence, not the approval.**
Built for **ETHOnline 2026**. Partners: **Hedera** (AI & Agentic Payments, Improve the Harness), **World** (Selfie Check), **Arc** (Best Agentic Economy with Circle Agent Stack).
</div>
---
## The problem, the solution, the stack
### The problem
Every AI agent framework already ships a human-approval interrupt. LangGraph has `interrupt`, Temporal has signals, OpenAI has `needsApproval`. They are free, already integrated, and they all produce the same artefact:
```
approved_by: user_44, 14:22:07
```
That row is written by the system being audited. It is editable by the party being audited. And it contains **no evidence that a human, rather than the agent's own service account, produced it**.
Since **2 August 2026**, the EU AI Act's obligations bind deployed high-risk systems. Article 12(3)(d) requires *"the identification of the natural persons involved in the verification of the results"*, and Article 14(4) requires that such systems be *"effectively overseen by natural persons"* who can *"interrupt the system"*. Both bind every high-risk deployer.
Article 14(5) goes further and requires *"at least **two natural persons**"* — but read its opening clause: *"For high-risk AI systems referred to in point 1(a) of Annex III"*, which is **remote biometric identification**. A supplier-payment agent is not that, so 14(5) does not bind this example deployer. We build to it anyway, because it is the strictest oversight bar the Act names and the evidence is identical either way. [The scope is set out in full here.](docs/regulatory-mapping.md)
A self-written, self-editable log satisfies neither.
### The solution
Proctor binds four things a self-hosted approve button cannot:
1. **The decision hash** — the witness's liveness proof is cryptographically bound to *this* decision via the World `signal`, not to "a human approved something at some point"
2. **A liveness proof issued by a party that is not the deployer** — World ID
3. **A nullifier proving the approver is not the operator** — two distinct accounts, checkable by a third party rather than asserted
4. **A consensus timestamp on a log with no admin key** — a clock the deployer did not choose, on a record nobody can rewrite, **including us**
Any third party verifies the whole record offline, against Hedera's mirror node and World's own verifier, **without trusting Proctor**.
### Why this stack
- **Hedera Consensus Service** gives an ordered, tamper-evident log at a fixed sub-cent fee, independently re-derivable through the running hash chain. A contract write costs more, has no better timestamp, and gives up the chain property.
- **x402** lets an agent pay for a resource mid-request, over HTTP, with no account and no prior relationship. The gate is a paywall the agent hits, not an integration it planned for.
- **World ID** proves liveness in seconds on a phone the witness already owns, which is the only reason a human oversight step can be measured in seconds instead of minutes. Selfie Check is the credential we designed for, and World granted the beta flag on 2026-09-09 for the duration of the event, so it is what runs. Exactly what has and has not been demonstrated end to end is [stated below](#what-is-real-vs-staged).
- **Circle** makes a sub-dollar payment to a human economically possible at all.
---
## Try it in 60 seconds
No wallet, no API keys, no feature flags. This runs the entire oversight loop:
```bash
cd backend
cp .env.example .env # DATABASE_URL is the only value you must edit
bun install
bun run db:push
bun run seed && bun run demo
bun run doctor # what is live, and what each gap costs you
bun run acceptance # exercise every claim against the running service
```
**Unconfigured, this runs the full loop and produces a record that is deliberately
NOT independently verifiable** — it is signed with a published demo key and never
reaches a topic. `bun run demo` says so in its own closing line, and `bun run doctor`
lists exactly what is missing. The difference between "it ran" and "it produced
evidence" is the entire product, so the tooling refuses to blur it.
```
1. agent proposes: EUR 41200.00 -> Meridian Logistics
2. policy : ESCALATE (amount_threshold)
3. decision : cmtmkf18b0000lxw8lqurjc31
human line : Release EUR 41,200 to Meridian Logistics?
signal : 0x5b068ce449934ca1df15f5f4…
4. dispatched to the rota, 60s deadline running
5. proof : VERIFIED
signal matched this decision, and the witness is not the operator
6. APPROVED in 28 ms
7. attestation : 722 bytes, ind=crypto
signed by : 0xB73837E8C34E2897debeAca0898Da23B52a6Eb10
The agent is released. The evidence is independently verifiable.
```
And the outcome an auditor actually cares about:
```bash
bun run demo refuse
```
```
5. witness REFUSED. No proof required: refuse is the default outcome.
6. attestation : 628 bytes, wid=null, wa=token
The agent is NOT released.
```
### Verify our live evidence log, without installing anything
```bash
bun verify/bin/verify.ts --topic 0.0.10390147
```
```
PASS 25 messages, chain intact from genesis.
No message was inserted, removed, reordered, or altered.
PASS completeness: issuance numbers dense across 1 issuer(s).
No decision was withheld from this log.
```
**Two checks, two different claims.** The first proves nothing was altered. The second
proves nothing was *withheld* — an operator who never submits a record breaks no hash.
**Zero dependencies.** `node:crypto` only. It contacts Hedera's public mirror node and nothing of ours.
---
## Verify it yourself in two minutes
Every row is a link to a file range or a public explorer. Nothing here asks you to take our word.
| Claim | Verify here |
|---|---|
| Evidence topic exists with **no admin key** | [HashScan `0.0.10390147`](https://hashscan.io/testnet/topic/0.0.10390147) |
| The running hash chain verifies offline, from genesis | `bun verify/bin/verify.ts --topic 0.0.10390147` |
| …and the implementation is dependency-free | [`verify/package.json`](verify/package.json) — empty `dependencies` |
| The Java-framing footgun is real, not folklore | [`verify/src/runningHash.ts:56-62`](verify/src/runningHash.ts) + the failing-naive test in [`verify/test/runningHash.test.ts`](verify/test/runningHash.test.ts) |
| Tampering is detected, naming the sequence number | [`docs/hashscan-links.md`](docs/hashscan-links.md) |
| The gate settles through **Blocky402** | `extra.feePayer: 0.0.7162784` in the live 402, [`docs/hashscan-links.md`](docs/hashscan-links.md) |
| The boot preflight stops a dead facilitator taking Hedera down | [`backend/src/lib/x402/server.ts:63`](backend/src/lib/x402/server.ts) |
| A proof for another decision is rejected | [`backend/src/lib/world/verify.ts:104`](backend/src/lib/world/verify.ts) |
| The operator cannot approve their own agent | [`backend/src/lib/world/verify.ts:123`](backend/src/lib/world/verify.ts) |
| Second 61 is a hard refuse, arbitrated by Postgres | [`backend/src/lib/decision/lifecycle.ts:114`](backend/src/lib/decision/lifecycle.ts) |
| Canonicalisation is RFC 8785, recursive at every depth | [`backend/src/lib/attestation/canonical.ts:37`](backend/src/lib/attestation/canonical.ts) |
| Independence is **derived**, never asserted | [`backend/src/lib/attestation/build.ts:179`](backend/src/lib/attestation/build.ts) |
| A decision withheld before submission is detected offline | [`verify/src/completeness.ts`](verify/src/completeness.ts) + `bun verify/bin/verify.ts --topic <id>` |
| Issuance numbers cannot be burned by a failed create | [`backend/src/lib/decision/issue.ts`](backend/src/lib/decision/issue.ts) — counter and create share one transaction |
| Test fixtures cannot reach the immutable evidence topic | `Org.attestable` defaults to **false**; orgs opt in |
| Every 402 carries an EIP-712 offer we cannot later reprice | decode the `payment-required` header |
| HCS-14 UAID matches a fixed test vector | [`backend/src/lib/attestation/uaid.ts:77`](backend/src/lib/attestation/uaid.ts) |
| The export cites the Act provisions it speaks to | [`backend/src/lib/evidence/export.ts:110`](backend/src/lib/evidence/export.ts) |
---
## Live proof
### The evidence log is on Hedera testnet
```
Topic: 0.0.10390147
Memo: Proctor oversight evidence log
Admin key: NONE (immutable and undeletable, by anyone, including us)
Submit key: ECDSA, operator-held
Creation tx: 0.0.10349667@1788684617.529727573
```
Per Hedera's documentation: *"if no adminKey is specified the topic is immutable."*
**Be honest about what the submit key does not buy.** We hold it, so we can still write a *false* entry. What HCS prevents is us **retroactively editing or deleting** what we already wrote, and it binds every entrWhat people ask about proctor
What is louissarvin/proctor?
+
louissarvin/proctor is subagents for the Claude AI ecosystem. An AI agent stops mid-payment and pays a live, verified human for permission to continue. It has 0 GitHub stars and its last recorded update is dated 2026-09-10.
How do I install proctor?
+
You can install proctor by cloning the repository (https://github.com/louissarvin/proctor) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.
Is louissarvin/proctor safe to use?
+
Our security agent has analyzed louissarvin/proctor and assigned a Trust Score of 62/100 (tier: OK). See the full breakdown of passed checks and flags on this page.
Who maintains louissarvin/proctor?
+
louissarvin/proctor is maintained by louissarvin. The last recorded GitHub activity is dated 2026-09-10, with 0 open issues.
Are there alternatives to proctor?
+
Yes. On ClaudeWave you can browse similar subagents at /categories/agents, sorted by popularity or recent activity.
Deploy proctor to your cloud
Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.
Maintain this repo? Add a badge to your README
Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.
[](https://claudewave.com/repo/louissarvin-proctor)<a href="https://claudewave.com/repo/louissarvin-proctor"><img src="https://claudewave.com/api/badge/louissarvin-proctor" alt="Featured on ClaudeWave: louissarvin/proctor" width="320" height="64" /></a>More Subagents
The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.
The agent that grows with you
Java 面试 & 后端通用面试指南,覆盖计算机基础、数据库、分布式、高并发、系统设计与 AI 应用开发
Build Agentic workflows, RAG pipelines, with rich AI model and tool support on one collaborative workspace. Deploy on cloud, VPC, or self-hosted, so teams move from prototype to production without rebuilding the stack.
The agent engineering platform.
Makes your AI agent think like the laziest senior dev in the room. The best code is the code you never wrote.