{"alg":"Ed25519","public_key_spki_b64":"MCowBQYDK2VwAyEAe08AdUp8OikCbekxwtTzrjymgaqhnuvX8sy+UcGMA2E=","public_key_raw_hex":"7b4f00754a7c3a29026de931c2d4f3ae3ca681aaa19eebd7f2ccbe51c18c0361","verify":"sig is ed25519 over the exact canonical string. commit: `calledit.v1|commit|{id}|{claim_hash}|{committed_at}`; reveal: `calledit.v1|reveal|{id}|{claim_hash}|{committed_at}|{revealed_at}`; resolve: `calledit.v1|resolve|{id}|{claim_hash}|{committed_at}|{outcome}|{resolved_at}` (outcome ∈ correct|incorrect|partial; owner-only, one-shot, server-timestamped so it can't be backdated). claim_hash for public commits = sha256(claim_text); for sealed = sha256(reveal_secret + '\\n' + claim_text). To seal: send {sealed:true} (server mints the reveal_secret) OR send your own {reveal_secret} (>=8 chars, implies sealed). If a reveal_secret is present the server fails closed: it stores only the digest and never publishes the text."}