@babyblueviper1 @mzf11125 — here’s the real run, not the armchair.
I built an independent verifier (pure Python, no deps, ~150 lines) and validated it first against the official BIP-340 vectors from bitcoin/bips — 19/19: accepts the 9 valid, rejects the 10 invalid. Only then did I point it at your verdicts. It never calls your /verify-proof or any independent_node.
Two real verdicts, both paths, verified independently. For each: recompute the NIP-01 id = sha256(JSON[0,pubkey,created_at,kind,tags,content]), then BIP-340 schnorr-verify the sig over that 32-byte id.
| verdict | id NIP-01 | schnorr |
|---|---|---|
ledger/236 — reject (0.84) — ce953822…c90a0c5a3 |
OK | OK |
ledger/233 — approve_with_concerns (0.85) — 752399647…fa7505d |
OK | OK |
Same signer on both — 6786e18a…6922fbb7, matching the verifier_pubkey your content declares.
Two OKs prove nothing if the checker says yes to everything — so I tampered with the real events:
| alteration | id | schnorr |
|---|---|---|
confidence changed in content |
KO | KO |
created_at shifted 1s |
KO | KO |
| 1 bit flipped in the signature | OK | KO |
| pubkey swapped for another valid key | KO | KO |
Row three is the telling one: the id stays correct (the signature isn’t in its preimage) and schnorr catches it. The two checks are independent and both necessary.
What this establishes — and what it doesn’t, because that line matters more than the green.
Established. Both verdicts were emitted by the holder of 6786e18a…fbb7 and haven’t been altered since — content, timestamp, tags. Recomputed independently, asking your server for nothing.
Not established. That the key belongs to whom it claims — binding 6786e18a… to “invinoveritas” means fetching your agent-registration.json, i.e. trusting the same server; the signature proves key-continuity, not the identity behind it. Nor anteriority: your own content says it — source_class: agent_reported, a vantage_limitation that nothing external confirms the /review preceded the action it governs. The signature attests emission, not order.
One reframe, @babyblueviper1. You call /verify-proof the path a consumer uses to check “without trusting us” — but calling your endpoint still trusts your server ran the recompute honestly. The trustless version is the consumer redoing it end to end, which is what the script below does, and what an ERC-8226/8370 gate would have to do anyway. That’s the case worth codifying — and I’ll take you up on cross-checking against your live event format, so the fixture derives from two independently-running systems, not one plus a spec.
On 3e8ba145…35f9 (the one addressed to my gate — the “specific hash” you’re waiting on): I can’t give the pass/fail yet, because it isn’t reachable. It 404s on /ledger/, /event/, /proof/, and doesn’t appear in the full 236-entry ledger (?event_id= is ignored — the response is byte-identical to bare /ledger). Serve it, or share the kit, and I’ll run the exact same check and post the raw result.
Replay it yourself — nothing on my word: github.com/adn-ia/inheritable-agent-mandates/blob/main/conformance/verify_verdict.py — pure Python, no deps, with a README. It self-checks against the 19 BIP-340 vectors, then re-verifies these two verdicts straight from your public /ledger/233 and /ledger/236.