Handoff v0 conformance fixtures

Version
r8.1a
Licence
CC0-1.0
SHA-256
6b707c7fc1c2b47abeeb0ffe4f8ff98c490211b40f0528a516f1a53ab1c52d16 (SHA256SUMS.txt)
Formats
JSON · MANIFEST.json · TEST-KEYS.json · INDEX.txt · SHA256SUMS.txt

270 test cases for Handoff v0: 256 for the base specification and 14 for the profile weio-ed25519-only/1. Every key in these files is a test key, published on purpose; never use one for a real record.

The specification that defines them: Handoff v0 specification, section 15.

Fixture format handoff-v0-fixture/1 (SPEC-v0.r81a §15). One JSON file per case. The base set has 256 cases (verify 141, canon 87, digest 7, text 3, render 5, ed25519 13); the profile extension (§15A, last part of the table below) adds 14 cases that are counted apart. Every key in these files is a TEST-ONLY key, published deliberately (TEST-KEYS.json); never use one for a real record.

Conformance (§15): a verifier MUST reproduce everything listed in the conformance paragraph of §15: for verify fixtures expect.result; expect.code among its findings of the matching level; no code in expect.absent_codes; and expect.time_bounds, expect.detect_classes, expect.required_codes, expect.finding_text and expect.error_text when present; for render fixtures the expect members present (result, cli_exit, banned_matches, time_bounds_form). reject_codes, detect_codes and error_codes list everything the reference reports; other_codes are warnings, info and status (informative). The reference runner compares those arrays exactly and in order, as a self-check of the reference; a verifier that differs there can still conform. server = REFUSE where a server must refuse the write. Three exports (V53-1, V53-3, V53-4) are given as generator rules (inputs.export_gen, §15) instead of literal bytes.

Vector Fixture Kind File Expected Code Spec § Server Case
V01V01-1verifyverify/V01-1.jsonACCEPT§10, §11.2Base record (COMMIT, CONFIRM, DELIVER, ACCEPT; all in head 1), unchanged
V02V02-1verifyverify/V02-1.jsonREJECTSIG_W_INVALID§4.8, §10.6-7Base with one hex digit of DELIVER.body.evidence[0].value changed; signatures unchanged (S_w fails at seq 2, prev_hash b
V03V03-1verifyverify/V03-1.jsonREJECTSIG_W_INVALID§4.8, §10.6As V02, and ACCEPT.prev_hash recomputed over the changed DELIVER; signatures unchanged
V04V04-1verifyverify/V04-1.jsonACCEPT§9.4, §10.11Insider rewrite: a second history with different DELIVER evidence, re-signed by K_w; no held head (ACCEPT is inherent)
V04V04-2verifyverify/V04-2.jsonDETECTHEAD_EQUIVOCATION§9.4, §10.11Insider rewrite verified against heads 0-1 held earlier (--known-heads): same n, different roots
V05V05-1verifyverify/V05-1.jsonREJECTR1_SEQ§4.6, §5.2-5.3Base with DELIVER and ACCEPT swapped (seq numbers no longer match positions)
V05V05-2verifyverify/V05-2.jsonREJECTPROOF_INCLUSION§4.6, §5.2-5.3Swapped and renumbered, both re-signed by K_w (prev_hash chain breaks)
V05V05-3verifyverify/V05-3.jsonREJECTPROOF_INCLUSION§4.6, §5.2-5.3Swapped, renumbered, prev_hash recomputed and re-signed (the G1 table refuses ACCEPT before DELIVER)
V06V06-1verifyverify/V06-1.jsonREJECTR1_SEQ§4.6, §10.7Base with the DELIVER event dropped
V06V06-2verifyverify/V06-2.jsonREJECTPROOF_INCLUSION§4.6, §10.7DELIVER dropped and ACCEPT renumbered to seq 2 and re-signed (ACCEPT.prev_hash != H(CONFIRM))
V07V07-1verifyverify/V07-1.jsonREJECTR1_SEQ§4.6, §5.2REFUSEBase with an identical copy of ACCEPT appended
V08V08-1verifyverify/V08-1.jsonREJECTR6_ILLEGAL§5.3REFUSEBase plus a second ACCEPT for the same DELIVER, correctly chained and signed (forced past the server's refusal)
V09V09-1verifyverify/V09-1.jsonREJECTPROOF_INCLUSION§4.4, §4.6R2's DELIVER (chained and signed for R2) spliced into R1 after R1's CONFIRM; identical COMMIT bodies
V10V10-1verifyverify/V10-1.jsonDETECTTIP_AHEAD_TRUNCATED§6.5, §10.10Base truncated after DELIVER (ACCEPT removed); the latest head's tip commits seq 3
V11V11-1verifyverify/V11-1.jsonACCEPT§10.10-11Earlier export of a record (COMMIT, CONFIRM, DELIVER, REJECT) anchored in head 0
V11V11-2verifyverify/V11-2.jsonACCEPT§10.10-11Later export of the same record (plus DELIVER, ACCEPT; head 1), checked against the known heads saved from V11-1
V12V12-1verifyverify/V12-1.jsonREJECTSIG_W_UNKNOWN_KEY§7.6, §10.6Base with ACCEPT re-signed by an unknown key K_x and server_key_id set to K_x
V12V12-2verifyverify/V12-2.jsonREJECTHEAD_UNKNOWN_KEY§7.6, §10.6Base with head 1 signed only by the unknown key K_x
V13V13-1verifyverify/V13-1.jsonREJECTSIG_W_INVALID§4.8Base with ACCEPT carrying DELIVER's S_w (a valid K_w signature over other bytes)
V14V14-1verifyverify/V14-1.jsonREJECTSIG_W_INVALID§2.2Base with ACCEPT's S_w malleated: S replaced by S + L
V14V14-2verifyverify/V14-2.jsonREJECTSIG_W_INVALID§2.2Base with ACCEPT's S_w R replaced by a non-canonical encoding (y = p)
V15V15-1verifyverify/V15-1.jsonREJECTCOMMIT_BAD_AGENT_KEY§2.2, §5.2.6REFUSECOMMIT whose party P agent_key is the identity point (small order), forced past the server's refusal
V16V16-1verifyverify/V16-1.jsonREJECTR4_SIG_A_MISSING§5.2.7REFUSEed25519-confirmed ACCEPT with no S_a
V16V16-2verifyverify/V16-2.jsonREJECTR4_SIG_A_INVALID§5.2.7REFUSEed25519-confirmed ACCEPT whose S_a is by a key other than the agent_key C committed
V17V17-1verifyverify/V17-1.jsonREJECTR4_SIG_A_INVALID§5.2.7Base (email_token) with an extra invalid S_a appended to ACCEPT's sigs
V18V18-1verifyverify/V18-1.jsonREJECTSIG_W_INVALID§4.2, §4.9Base with ACCEPT's auth flipped from email_token to ed25519 after signing (party_digest removed)
V19V19-1verifyverify/V19-1.jsonACCEPT§7.3, §10.9Planned rotation: head 2 announces K1, heads 3-4 dual-signed, K0 retired after head 4 (positive control)
V19V19-2verifyverify/V19-2.jsonREJECTEVENT_KEY_WINDOW§7.3, §10.9After the rotation, a DISPUTE signed by the retired K0 and first included in head 5
V20V20-1verifyverify/V20-1.jsonREJECTR4_NONCE_REUSED§5.2.7REFUSEDELIVER reusing COMMIT's token nonce (forced past the server's refusal)
V21V21-1verifyverify/V21-1.jsonREJECTR4_PARTY_DIGEST§5.2.7REFUSEACCEPT whose party_digest is another address's digest (forced past the server's refusal)
V22V22-1verifyverify/V22-1.jsonREJECTRECORD_ID_MISMATCH§4.4REFUSEDELIVER whose record_id names another record, appended to this record's chain
V23V23-1verifyverify/V23-1.jsonREJECTR4_TOKEN_EXPIRED§5.2.7REFUSECONFIRM made after its token_expires (forced past the server's refusal)
V24V24-1verifyverify/V24-1.jsonREJECTR3_ERASED_ACTOR§5.2.4, §5.7REFUSEACCEPT by C via email token after C's ERASE (forced past the server's refusal)
V26V26-1verifyverify/V26-1.jsonREJECTAUTH_METHOD§4.2Base with ACCEPT's auth.method set to share_token
V26V26-2verifyverify/V26-2.jsonREJECTFIELD_UNKNOWN§4.2Base with an extra auth.share_token member on ACCEPT
V28V28-1verifyverify/V28-1.jsonACCEPT§10.11Base checked against --known-heads holding heads 0 and 1
V29V29-1verifyverify/V29-1.jsonDETECTHEAD_ROLLBACK§9.4b, §10.11Rollback: the export ends at head 1 while --known-heads holds head 2
V30V30-1verifyverify/V30-1.jsonDETECTHEAD_EQUIVOCATION§9.4a, §10.11Split view: --known-heads holds a K_w-signed head 1 with the same n and a different root
V31V31-1verifyverify/V31-1.jsonREJECTHEAD_CONSISTENCY_UNPROVEN§6.4, §9.4c, §10.5Export whose head 2 carries a corrupted consistency proof from head 1
V31V31-2verifyverify/V31-2.jsonDETECTHEAD_FORK_SAME_SIZE§6.4, §9.4c, §10.5Export to head 1; the mirror holds a validly signed head 2 over a forked log
V32V32-1verifyverify/V32-1.jsonACCEPT§6.3, §8.2, §10.6Export whose inclusion proofs are against head 2 (positive control)
V32V32-2verifyverify/V32-2.jsonREJECTPROOF_INCLUSION§6.3, §8.2, §10.6CONFIRM's inclusion proof (valid for head 2) relabelled as being for head 1
V33V33-1verifyverify/V33-1.jsonDETECTHEAD_UNANCHORED§9.4e, §10.11--require-anchored with a mirror that holds head 0 only (the anchoring head 1 is unpublished)
V33V33-2verifyverify/V33-2.jsonACCEPT§9.4e, §10.11--require-anchored with a mirror that holds heads 0 and 1 (positive control)
V34V34-1verifyverify/V34-1.jsonREJECTHEAD_SIG_INVALID§6.8, §9.4d, §10.5Base with head 1's signature altered in its last byte
V34V34-2verifyverify/V34-2.jsonDETECTHEAD_SIZE_DECREASE§6.8, §9.4d, §10.5Export to head 1; the mirror holds a signed head 2 with a smaller tree_size
V35V35-1verifyverify/V35-1.jsonREJECTPROOF_TOO_LONG§3.5, §6.3COMMIT's inclusion path replaced by 65 nodes
V35V35-2verifyverify/V35-2.jsonREJECTPROOF_MALFORMED§3.5, §6.3COMMIT's inclusion path with a malformed node ("zz")
V36V36-d1digestdigest/V36-d1.jsonmatches=0§5.8After erasure of both parties (k_rec deleted): no candidate address, including the true ones, matches any 64-hex string
V36V36-d2digestdigest/V36-d2.jsonmatches=2§15counting rule: distinct digest values found in 64-hex windows (overlapping, lowercase only); Alice inside a longer run,
V37V37-d1digestdigest/V37-d1.jsondigest§5.8Before erasure: base record party P's address with P's k_rec gives the digest committed in COMMIT.body.parties.p
V37V37-d2digestdigest/V37-d2.jsondigest§5.8Before erasure: base record party C's address with C's k_rec gives the digest committed in COMMIT.body.parties.c
V37V37-d3digestdigest/V37-d3.jsondigest§5.8Normalisation: C's address with surrounding spaces and mixed case (NFC, strip, lowercase) gives the same digest as V37-2
V38V38-d1digestdigest/V38-d1.jsondigest§5.8The same address as party P of record r1 (Sim v38)
V38V38-d2digestdigest/V38-d2.jsondigest§5.8The same address as party P of record r2 (Sim v38): a different k_rec gives a different digest than V38-1
V39V39-1verifyverify/V39-1.jsonACCEPT§5.7, §10.13Export after both parties' ERASE events, anchored in head 2
V39V39-2verifyverify/V39-2.jsonREJECTPLAINTEXT_AFTER_ERASE§5.7, §10.13Erased export that still carries party C's plaintext
V41V41-1verifyverify/V41-1.jsonREJECTTIME_AFTER_HEAD§10.9, §11.2CONFIRM whose at is after the published_at of its first including head
V42V42-1verifyverify/V42-1.jsonREJECTR5_TIME_ORDER§5.2.5REFUSECONFIRM whose at is earlier than COMMIT's at (forced past the server's refusal)
V43V43-1verifyverify/V43-1.jsonACCEPT§11.2Backdated record: events at 2026-09-01, first included in a head published 2026-10-02
V44V44-t1texttext/V44-t1.jsonbanned_matches=0§11.3LITERAL REGEX-UNIT CHECK on stored strings (not the candidate's output; see V44-r1). CLI output for the base record (party P named "Acme Example") must not present at as proven or overclaim strength: no
V44V44-r1renderrender/V44-r1.jsonACCEPT, exit 0, banned_matches=0§11.3, §13CLI output (text and --json) of the candidate's own CLI for the base record: no banned wording (render twin of V44-t1)
V45V45-1verifyverify/V45-1.jsonREJECTREVERSE_NO_ACCEPT§5.3REFUSEREVERSE with no prior ACCEPT (forced past the server's refusal)
V46V46-1verifyverify/V46-1.jsonREJECTG1_TERMINAL§5.3REFUSEAMEND after WITHDRAW (forced past the server's refusal)
V47V47-1verifyverify/V47-1.jsonREJECTG1_WRONG_ROLE§5.3REFUSEDELIVER by C (wrong role; forced past the server's refusal)
V47V47-2verifyverify/V47-2.jsonREJECTG1_WRONG_ROLE§5.3REFUSEACCEPT by P (self-acceptance; forced past the server's refusal)
V48V48-1verifyverify/V48-1.jsonREJECTFIELD_FORM§4.1, §5.2REFUSEWITHDRAW whose actor is X (neither party)
V48V48-2verifyverify/V48-2.jsonREJECTR2_ACTOR§4.1, §5.2REFUSEWITHDRAW by W with method server (forced past the server's refusal)
V49V49-1verifyverify/V49-1.jsonREJECTG1_NOT_AGREED§5.3, §5.4REFUSEDELIVER before C confirmed the COMMIT (forced past the server's refusal)
V50V50-1verifyverify/V50-1.jsonREJECTCOMMIT_SELF_DEALING§5.3, §5.8REFUSECOMMIT where P's and C's digests are equal (k_rec reused across roles; forced past the server's refusal)
V51V51-1verifyverify/V51-1.jsonREJECTLIMIT_SIZE§3.5, §4.1REFUSEDELIVER whose canonical form exceeds 16 KiB (16 links of ~2 KB), forced past the server's refusal
V51V51-2verifyverify/V51-2.jsonREJECTLIMIT_STRING§3.5, §4.1REFUSEBase with one string (evidence kind) of 5,000 bytes
V51V51-c1canoncanon/V51-c1.jsonOK§3.5, §4.1A string of exactly 4,096 UTF-8 bytes (2,048 x U+00E9): accepted
V51V51-c2canoncanon/V51-c2.jsonERRORLIMIT_STRING§3.5, §4.1A string of 4,097 UTF-8 bytes (2,048 x U+00E9 + x): refused
V52V52-1verifyverify/V52-1.jsonREJECTLIMIT_DEPTH§3.2, §3.5Base with a plaintext member nested 10,000 arrays deep
V52V52-2verifyverify/V52-2.jsonREJECTLIMIT_DEPTH§3.2, §3.5Base with DELIVER evidence value nested 5 arrays deep (event depth > 8)
V52V52-c1canoncanon/V52-c1.jsonOK§3.2, §3.5Nesting depth 8 (8 nested objects): the event limit, accepted
V52V52-c2canoncanon/V52-c2.jsonERRORLIMIT_DEPTH§3.2, §3.5Nesting depth 9: refused
V53V53-1verifyverify/V53-1.jsonREJECTLIMIT_ITEMS§3.5, §4.8Base with its events repeated 251 times (1,004 events)
V53V53-2verifyverify/V53-2.jsonREJECTLIMIT_SIGS§3.5, §4.8Base with ACCEPT's signature list repeated 3 times (3 S_w)
V53V53-3verifyverify/V53-3.jsonREJECTLIMIT_ITEMS§3.5, §4.8Base with ACCEPT carrying 50,001 copies of its S_w (array above the 1,000-item limit)
V53V53-4verifyverify/V53-4.jsonREJECTLIMIT_SIZE§3.5, §4.8An export of 16 MiB + 1 bytes (spaces only): refused before parsing
V53V53-c1canoncanon/V53-c1.jsonOK§3.5, §4.8An object with 64 members: accepted
V53V53-c2canoncanon/V53-c2.jsonERRORLIMIT_MEMBERS§3.5, §4.8An object with 65 members: refused
V53V53-c3canoncanon/V53-c3.jsonOK§3.5, §4.8An array with 64 items: accepted
V53V53-c4canoncanon/V53-c4.jsonERRORLIMIT_ITEMS§3.5, §4.8An array with 65 items: refused
V54V54-1verifyverify/V54-1.jsonACCEPT§10.13Base with party P named with a Cyrillic A in "Acme" (mixed script; display warning)
V55V55-1verifyverify/V55-1.jsonREJECTSTR_BANNED_CHAR§3.6REFUSEBase with party P's name holding an escaped U+202E (RTL override)
V55V55-2verifyverify/V55-2.jsonREJECTSTR_BANNED_CHAR§3.6REFUSEBase with party P's name holding an escaped U+0000
V55V55-c1canoncanon/V55-c1.jsonERRORSTR_BANNED_CHAR§3.6U+202E (RTL override) in a string
V55V55-c2canoncanon/V55-c2.jsonERRORSTR_BANNED_CHAR§3.6U+200B (zero width space) in a string
V55V55-c3canoncanon/V55-c3.jsonERRORSTR_BANNED_CHAR§3.6Escaped U+0000 in a string
V56V56-1verifyverify/V56-1.jsonACCEPT§3.6Base with party P named "Caf\u00e9" in NFC (positive control)
V56V56-2verifyverify/V56-2.jsonREJECTSTR_NOT_NFC§3.6Base with party P's name rewritten in NFD (e + U+0301)
V56V56-c1canoncanon/V56-c1.jsonERRORSTR_NOT_NFC§3.6String in NFD (e + U+0301): strings must be NFC
V56V56-c2canoncanon/V56-c2.jsonOK§3.6Control: the same string in NFC
V57V57-1verifyverify/V57-1.jsonREJECTFIELD_UNKNOWN§4.3DELIVER with a plaintext note member in its body (unknown field)
V58V58-1verifyverify/V58-1.jsonACCEPT§3.3Base re-serialised with indentation and reversed key order
V58V58-c1canoncanon/V58-c1.jsonOK§3.3Whitespace and key order: the same object with extra whitespace and members out of order
V59V59-1verifyverify/V59-1.jsonREJECTJSON_DUP_KEY§3.2Base with a duplicate "type" key in ACCEPT
V59V59-c1canoncanon/V59-c1.jsonERRORJSON_DUP_KEY§3.2Duplicate keys in one object
V60V60-1verifyverify/V60-1.jsonREJECTNUM_NOT_INTEGER§3.2Base with COMMIT seq written as 1.0
V60V60-2verifyverify/V60-2.jsonREJECTNUM_NOT_INTEGER§3.2Base with COMMIT seq written as 1e2
V60V60-3verifyverify/V60-3.jsonREJECTNUM_NEG_ZERO§3.2Base with COMMIT seq written as -0
V60V60-c1canoncanon/V60-c1.jsonERRORNUM_NOT_INTEGER§3.2Number 1.0 (fraction): the profile allows integers only
V60V60-c2canoncanon/V60-c2.jsonERRORNUM_NOT_INTEGER§3.2Number 1e2 (exponent): the profile allows integers only
V60V60-c3canoncanon/V60-c3.jsonERRORNUM_NEG_ZERO§3.2Number -0
V60V60-c4canoncanon/V60-c4.jsonOK§3.2Control: the integers 100 and 0 are accepted
V61V61-1verifyverify/V61-1.jsonREJECTNUM_RANGE§3.2Base with COMMIT seq written as 9007199254740993
V61V61-c1canoncanon/V61-c1.jsonERRORNUM_RANGE§3.2Integer 9007199254740993 (above 2^53 - 1)
V61V61-c2canoncanon/V61-c2.jsonOK§3.2Integer 9007199254740991 (2^53 - 1, the largest allowed)
V61V61-c3canoncanon/V61-c3.jsonOK§3.2Integer -9007199254740991 (the smallest allowed)
V61V61-c4canoncanon/V61-c4.jsonERRORNUM_RANGE§3.2Integer 9007199254740992 (2^53, just outside the range)
V62V62-1verifyverify/V62-1.jsonREJECTJSON_NAN_INF§3.2Base with COMMIT seq written as NaN
V62V62-2verifyverify/V62-2.jsonREJECTJSON_NAN_INF§3.2Base with COMMIT seq written as Infinity
V62V62-3verifyverify/V62-3.jsonREJECTJSON_NAN_INF§3.2Base with COMMIT seq written as -Infinity
V62V62-c1canoncanon/V62-c1.jsonERRORJSON_NAN_INF§3.2NaN literal
V62V62-c2canoncanon/V62-c2.jsonERRORJSON_NAN_INF§3.2Infinity literal
V62V62-c3canoncanon/V62-c3.jsonERRORJSON_NAN_INF§3.2-Infinity literal
V63V63-1verifyverify/V63-1.jsonACCEPT§3.2-3.3Base with party P's name "Caf\u00e9" written with a \u00e9 escape
V63V63-c1canoncanon/V63-c1.jsonOK§3.2-3.3String with an escaped \u00e9: canonical form is the literal UTF-8 character
V63V63-c2canoncanon/V63-c2.jsonOK§3.2-3.3String with a literal é (UTF-8 C3 A9): same canonical bytes as the escaped form
V64V64-1verifyverify/V64-1.jsonREJECTSTR_BANNED_CHAR§3.6Base with party P's name holding an escaped U+001F
V64V64-c1canoncanon/V64-c1.jsonERRORSTR_BANNED_CHAR§3.6Escaped control character U+001F in a string (banned in the profile)
V64V64-c2canoncanon/V64-c2.jsonERRORJSON_CONTROL_CHAR§3.6Raw control byte 0x1F inside a string (not JSON)
V65V65-1verifyverify/V65-1.jsonACCEPT§3.3Base with an evidence link written with \/ escapes
V65V65-c1canoncanon/V65-c1.jsonOK§3.3Escaped solidus \/ : canonical form writes a plain /
V66V66-1verifyverify/V66-1.jsonREJECTKEY_FORM§3.2-3.3Base with the first "terms_digest" key renamed to a non-ASCII key
V66V66-c1canoncanon/V66-c1.jsonERRORKEY_FORM§3.2-3.3Non-ASCII key "é" (keys are [a-z][a-z0-9_]{0,31})
V66V66-c2canoncanon/V66-c2.jsonERRORKEY_FORM§3.2-3.3Uppercase key "A"
V67V67-1verifyverify/V67-1.jsonREJECTSTR_LONE_SURROGATE§3.2Base with party P's name holding a lone \ud800
V67V67-c1canoncanon/V67-c1.jsonERRORSTR_LONE_SURROGATE§3.2Lone high surrogate \ud800
V67V67-c2canoncanon/V67-c2.jsonERRORSTR_LONE_SURROGATE§3.2Lone low surrogate \udc00
V68V68-1verifyverify/V68-1.jsonREJECTJSON_BAD_UTF8§3.1Base with invalid UTF-8 bytes (FF FE) in party P's name
V68V68-2verifyverify/V68-2.jsonREJECTJSON_BOM§3.1Base preceded by a UTF-8 BOM
V68V68-c1canoncanon/V68-c1.jsonERRORJSON_BAD_UTF8§3.1Invalid UTF-8 bytes FF FE inside a string
V68V68-c2canoncanon/V68-c2.jsonERRORJSON_BOM§3.1A UTF-8 BOM before the JSON text
V69V69-1verifyverify/V69-1.jsonREJECTNUM_NOT_INTEGER§3.2Base with COMMIT seq written as 0.30000000000000004
V69V69-c1canoncanon/V69-c1.jsonERRORNUM_NOT_INTEGER§3.2Float 0.30000000000000004
V70V70-c1canoncanon/V70-c1.jsonERRORJSON_NULL§3.3r6: a literal null as a member value (absent != null; the profile has no null)
V70V70-c2canoncanon/V70-c2.jsonERRORJSON_NULL§3.3r6: a literal null inside an array
V70V70-c3canoncanon/V70-c3.jsonERRORJSON_NULL§3.3r6: a top-level null
V70V70-c4canoncanon/V70-c4.jsonERRORJSON_SYNTAX§3.3Trailing data after the JSON value
V70V70-c5canoncanon/V70-c5.jsonERRORKEY_FORM§3.3A 33-character key (keys are at most 32 characters)
V70V70-c6canoncanon/V70-c6.jsonOK§3.3A 32-character key: accepted
V70V70-c7canoncanon/V70-c7.jsonOK§3.3A non-BMP character (U+1F600) written as an escaped surrogate pair: canonical form is the literal 4-byte UTF-8
V70V70-c8canoncanon/V70-c8.jsonOK§3.3Key sorting: keys a, a_, a0, b given as b, a_, a0, a (UTF-16 order equals ASCII order here: a < a0 < a_ < b)
V70V70-c9canoncanon/V70-c9.jsonOK§3.3Literals true and false; an empty object and an empty array
V70V70-c10canoncanon/V70-c10.jsonOK§3.3Random profile-valid object 1 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical byt
V70V70-c11canoncanon/V70-c11.jsonOK§3.3Random profile-valid object 2 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical byt
V70V70-c12canoncanon/V70-c12.jsonOK§3.3Random profile-valid object 3 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical byt
V70V70-c13canoncanon/V70-c13.jsonOK§3.3Random profile-valid object 4 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical byt
V70V70-c14canoncanon/V70-c14.jsonOK§3.3Random profile-valid object 5 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical byt
V70V70-c15canoncanon/V70-c15.jsonOK§3.3Random profile-valid object 6 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical byt
V70V70-c16canoncanon/V70-c16.jsonOK§3.3Random profile-valid object 7 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical byt
V70V70-c17canoncanon/V70-c17.jsonOK§3.3Random profile-valid object 8 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical byt
V70V70-c18canoncanon/V70-c18.jsonOK§3.3Random profile-valid object 9 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical byt
V70V70-c19canoncanon/V70-c19.jsonOK§3.3Random profile-valid object 10 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c20canoncanon/V70-c20.jsonOK§3.3Random profile-valid object 11 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c21canoncanon/V70-c21.jsonOK§3.3Random profile-valid object 12 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c22canoncanon/V70-c22.jsonOK§3.3Random profile-valid object 13 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c23canoncanon/V70-c23.jsonOK§3.3Random profile-valid object 14 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c24canoncanon/V70-c24.jsonOK§3.3Random profile-valid object 15 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c25canoncanon/V70-c25.jsonOK§3.3Random profile-valid object 16 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c26canoncanon/V70-c26.jsonOK§3.3Random profile-valid object 17 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c27canoncanon/V70-c27.jsonOK§3.3Random profile-valid object 18 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c28canoncanon/V70-c28.jsonOK§3.3Random profile-valid object 19 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c29canoncanon/V70-c29.jsonOK§3.3Random profile-valid object 20 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c30canoncanon/V70-c30.jsonOK§3.3Random profile-valid object 21 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c31canoncanon/V70-c31.jsonOK§3.3Random profile-valid object 22 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c32canoncanon/V70-c32.jsonOK§3.3Random profile-valid object 23 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c33canoncanon/V70-c33.jsonOK§3.3Random profile-valid object 24 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c34canoncanon/V70-c34.jsonOK§3.3Random profile-valid object 25 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c35canoncanon/V70-c35.jsonOK§3.3Random profile-valid object 26 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c36canoncanon/V70-c36.jsonOK§3.3Random profile-valid object 27 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c37canoncanon/V70-c37.jsonOK§3.3Random profile-valid object 28 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c38canoncanon/V70-c38.jsonOK§3.3Random profile-valid object 29 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c39canoncanon/V70-c39.jsonOK§3.3Random profile-valid object 30 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c40canoncanon/V70-c40.jsonOK§3.3Random profile-valid object 31 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c41canoncanon/V70-c41.jsonOK§3.3Random profile-valid object 32 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c42canoncanon/V70-c42.jsonOK§3.3Random profile-valid object 33 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c43canoncanon/V70-c43.jsonOK§3.3Random profile-valid object 34 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c44canoncanon/V70-c44.jsonOK§3.3Random profile-valid object 35 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c45canoncanon/V70-c45.jsonOK§3.3Random profile-valid object 36 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c46canoncanon/V70-c46.jsonOK§3.3Random profile-valid object 37 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c47canoncanon/V70-c47.jsonOK§3.3Random profile-valid object 38 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c48canoncanon/V70-c48.jsonOK§3.3Random profile-valid object 39 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V70V70-c49canoncanon/V70-c49.jsonOK§3.3Random profile-valid object 40 of 40 (seed 20261015): random whitespace, key order and escaping; expected = canonical by
V71V71-1verifyverify/V71-1.jsonREJECTCONFIRM_WHILE_DELIVERED§5.3, §5.4REFUSECONFIRM of an AMEND while DELIVERED (A1; forced past the server's refusal)
V72V72-1verifyverify/V72-1.jsonREJECTCONFIRM_SELF§5.3, §5.4REFUSECONFIRM of the COMMIT by its own proposer P (A2; forced past the server's refusal)
V73V73-1verifyverify/V73-1.jsonREJECTCONFIRM_TERMS§5.3, §5.4REFUSECONFIRM whose terms_digest differs from the proposal's (A3; forced past the server's refusal)
V74V74-1verifyverify/V74-1.jsonREJECTDISPUTE_NO_DELIVER§5.3REFUSEDISPUTE in WITHDRAWN with no prior DELIVER (A4; forced past the server's refusal)
V74V74-2verifyverify/V74-2.jsonACCEPT§5.3Positive control: DISPUTE after WITHDRAW when a DELIVER exists (legal)
V75V75-1verifyverify/V75-1.jsonREJECTCONFIRM_REF§5.3, §5.4REFUSECONFIRM naming an AMEND superseded by a later AMEND (A5; forced past the server's refusal)
XC2XC2-1verifyverify/XC2-1.jsonERRORKEYS_ENDORSEMENT§7.2, §7.3key history in which the retired key K0 endorses the introduction of a new key K2
XC2XC2-2verifyverify/XC2-2.jsonDETECTKEY_COMPROMISED_UNWITNESSED§7.2, §7.3, §7.5key history in which the retired key K0 endorses the revocation of K1 from head 100
XC2XC2-3verifyverify/XC2-3.jsonACCEPT§7.4control: the same export and the unmodified rotation history
XE10XE10-1verifyverify/XE10-1.jsonDETECTHEAD_ROLLBACK§9.1, §10XF1-2's known head 2 with its tip proof carrying one extra member: the tip is not exactly {index, leaf, path}, so it is
XE10XE10-2verifyverify/XE10-2.jsonDETECTHEAD_ROLLBACK§9.1, §10XF1-2's known head 2 with the tip index written as JSON false (the true index is 0): not an int >= 0, so the tip is igno
XERASEXERASE-1verifyverify/XERASE-1.jsonREJECTR2_ACTOR§4.3, §5.2, §5.7ERASE written with auth.method email_token (must be server)
XF1XF1-1verifyverify/XF1-1.jsonDETECTTIP_AHEAD_TRUNCATED§6.5, §9.4, §10, §11.1export of V10's base with the ACCEPT entry removed by a recipient; honest head 1 and its tip membership proof kept: the
XF1XF1-2verifyverify/XF1-2.jsonDETECTHEAD_ROLLBACK§9.4, §10older export (seq 0-1, anchored in head 1) with a known head 2 whose tip proof for this record is seq 3
XF1XF1-3verifyverify/XF1-3.jsonDETECTHEAD_FORK_SAME_SIZE§9.4, §10control: known head 2 (same tree_size as head 1, different tip map) commits another event hash at seq 3 with a verified
XF3XF3-1verifyverify/XF3-1.jsonERRORLOCAL_CAP§3.5, §10, §142,003-byte array of 1,001 zeros (above the 1,000-item protocol limit) with a declared local cap of 1,024 bytes: the byte
XF3XF3-2verifyverify/XF3-2.jsonREJECTLIMIT_ITEMS§3.2, §3.5control: the same 2,003 bytes with a local cap of 4,096 (not exceeded): the item limit is reached by the parser
XF3XF3-3verifyverify/XF3-3.jsonERRORLOCAL_CAP§3.5, §10, §14V01-1's valid 6282-byte export with a declared local cap of 1000 bytes: ERROR LOCAL_CAP whose message says the content w
XF5XF5-1verifyverify/XF5-1.jsonACCEPT§7.4, §9.3, §10suffix export (heads 3 and 4, first inclusion at head 4) of a history that introduces K1 at head 3; the only supplied he
XF5XF5-2verifyverify/XF5-2.jsonACCEPT§7.4, §9.3, §10control: the same suffix export; known head 2 carries next_key announcing K1 (byte-identical to the introducing entry)
XF5XF5-3verifyverify/XF5-3.jsonACCEPT§6.8, §7.4, §9.3suffix export; the supplied head 2 carries a next_key that is not the introducing entry (valid_from 5, endorsement not m
XF5XF5-4verifyverify/XF5-4.jsonACCEPT§7.4no head 2 supplied at all (suffix export only): the announcement is unseen
XG1XG1-1verifyverify/XG1-1.jsonREJECTTIP_FORM§6.5, §8.3export tip member index -1
XG2XG2-1verifyverify/XG2-1.jsonERRORUSAGE§13, §15--require-anchored with no --mirror
XG5XG5-1verifyverify/XG5-1.jsonACCEPT§10, §11.2CONFIRM declared one second before the publisher-declared published_at of its first head
XG6XG6-1verifyverify/XG6-1.jsonREJECTTIME_FORM§6.6, §6.8export head 1 with a malformed published_at, a 65-node consistency path and (so) an invalid signature
XG6XG6-2verifyverify/XG6-2.jsonREJECTPROOF_MALFORMED§6.8export head 1 with a malformed consistency node and an invalid signature
XG6XG6-3verifyverify/XG6-3.jsonREJECTHEAD_FORM§6.8export head 1 whose first signature is by an unknown key and whose second is malformed
XN1XN1-1verifyverify/XN1-1.jsonREJECTCOMMIT_BAD_AGENT_KEY§2.2, §5.2COMMIT whose party P agent_key is mixed order (aB + T, T of order 2); every S_a has an even challenge, so both Ed25519 e
XN1XN1-2verifyverify/XN1-2.jsonREJECTSIG_W_INVALID§2.2, §10ACCEPT's S_w with a mixed-order R (rB + T, order 2): the cofactored equation holds, the cofactorless one does not
XN1XN1-3verifyverify/XN1-3.jsonREJECTHEAD_SIG_INVALID§2.2, §6.8head 1 signed with a mixed-order R (cofactored equation holds)
XN1XN1-4verifyverify/XN1-4.jsonERRORKEYS_BAD_KEY§2.2, §7.3, §10key history whose only K_w is mixed order (aB + T, T of order 8); every endorsement, S_w and head signature has k = 0 mo
XN1XN1-e1ed25519ed25519/XN1-e1.jsonOK§2.2positive control: standard key and signature
XN1XN1-e2ed25519ed25519/XN1-e2.jsonFAILED_TORSION_A§2.2A = aB + T (T of order 2), challenge k odd: only the cofactored equation holds
XN1XN1-e3ed25519ed25519/XN1-e3.jsonFAILED_TORSION_A§2.2A = aB + T (order 2), k even: BOTH equations hold; only the subgroup check refuses
XN1XN1-e4ed25519ed25519/XN1-e4.jsonFAILED_TORSION_A§2.2A = aB + T (order 8), k = 0 mod 8: both equations hold; subgroup check refuses
XN1XN1-e5ed25519ed25519/XN1-e5.jsonFAILED_TORSION_A§2.2A = aB + T (order 8), k = 3 mod 8: only the cofactored equation holds
XN1XN1-e6ed25519ed25519/XN1-e6.jsonFAILED_TORSION_R§2.2R = rB + T (order 2), prime-order A: only the cofactored equation holds
XN1XN1-e7ed25519ed25519/XN1-e7.jsonFAILED_TORSION_R§2.2R = rB + T (order 4), prime-order A: only the cofactored equation holds
XN1XN1-e8ed25519ed25519/XN1-e8.jsonFAILED_SMALL_ORDER_A§2.2A = the identity: small order is checked before the subgroup check
XN1XN1-e9ed25519ed25519/XN1-e9.jsonFAILED_SMALL_ORDER_A§2.2A = a point of order 8 (pure torsion): ED_SMALL_ORDER_A
XN1XN1-e10ed25519ed25519/XN1-e10.jsonFAILED_TORSION_A§2.2mixed-order A and a non-canonical R: A's checks come first
XN1XN1-e11ed25519ed25519/XN1-e11.jsonFAILED_S_NOT_REDUCED§2.2S + L (not reduced)
XN1XN1-e12ed25519ed25519/XN1-e12.jsonFAILED_BAD_SIGNATURE§2.2valid signature over another message: the equation fails
XN1XN1-e13ed25519ed25519/XN1-e13.jsonFAILED_SMALL_ORDER_R§2.2R = the identity with a prime-order A: ED_SMALL_ORDER_R
XN2XN2-t1texttext/XN2-t1.jsonbanned_matches=0§5.7, §11.2, §11.3LITERAL REGEX-UNIT CHECK on stored strings (not the candidate's output; see XN2-r1). CLI output for an export after both parties' ERASE: no claim that deletion or unlinkability is proven
XN2XN2-r1renderrender/XN2-r1.jsonACCEPT, exit 0, banned_matches=0§5.7, §11.3, §13CLI output (text and --json) of the candidate's own CLI after both parties' ERASE: no claim that deletion or unlinkabili
XN3XN3-t1texttext/XN3-t1.jsonbanned_matches=0§5.7, §11.2, §11.3LITERAL REGEX-UNIT CHECK on stored strings (not the candidate's output; see XN3-r1). CLI output for a backdated record: inclusion is stated, time only as publisher-declared
XN3XN3-r1renderrender/XN3-r1.jsonACCEPT, exit 0, banned_matches=0§11.2, §11.3, §13CLI output (text and --json) of the candidate's own CLI for a backdated record: inclusion is stated, time only as publis
XN3XN3-r2renderrender/XN3-r2.jsonACCEPT, exit 0, banned_matches=0, time_bounds_form§11.2, §13--json time_bounds of the candidate's own CLI for the backdated record with its head also supplied as a known head: ever
XN3XN3-r3renderrender/XN3-r3.jsonACCEPT, exit 0, banned_matches=0, time_bounds_form§11.2, §10, §13--json time_bounds of the candidate's own CLI for an export with no heads: each event gets the §11.2 unanchored entry {s
XN4XN4-1verifyverify/XN4-1.jsonACCEPT§6.5, §10, §17head 2's signed tip map dishonestly keeps the record's tip at seq 0 although seq 1 (CONFIRM) is in head 2's log; an expo
XN4XN4-2verifyverify/XN4-2.jsonREJECTTIP_BEHIND§6.5, §10same dishonest head 2; an export holding seq 1 with its inclusion proof in head 2
XN5XN5-1verifyverify/XN5-1.jsonERRORLOCAL_CAP§3.5, §14base export within every protocol limit, verifier declares a local cap of 4,096 export bytes
XN5XN5-2verifyverify/XN5-2.jsonREJECTLIMIT_SIZE§3.5, §14export of 16 MiB + 1 bytes with a local cap of 1 MiB: the protocol limit is checked first
XN6XN6-1verifyverify/XN6-1.jsonREJECTHEAD_CONSISTENCY_UNPROVEN§8.5, §10two genuinely consistent signed export heads with the consistency proof omitted
XN6XN6-2verifyverify/XN6-2.jsonREJECTPROOF_INCLUSION§6.5, §10export tip leaf tampered (last_seq 9): its membership proof fails; a valid known tip for the same head exists
XN6XN6-3verifyverify/XN6-3.jsonACCEPT§9.1, §10known-heads tip with a tampered leaf: ignored with a warning, no TIP_* finding
XN6XN6-4verifyverify/XN6-4.jsonERRORWITNESS_UNPROVEN§9.2, §10mirror holds heads 0 and 1, head 1's file without its consistency proof
XN6XN6-5verifyverify/XN6-5.jsonREJECTHEAD_CHAIN_GAP§8.5, §10export head chain 0, 2 (head 1 left out); inclusion proofs against head 2
XN6XN6-6verifyverify/XN6-6.jsonREJECTPLAINTEXT_MISSING§8.4, §10plaintext claims party P but carries no p member
XN7XN7-1verifyverify/XN7-1.jsonDETECTHEAD_FORK_SAME_SIZE§9.4, §10N7: known head W (n 1, size 1, root A) vs export heads H2 (n 2, size 1, root B) and H3 (n 3, size 2); dates and
XN7XN7-2verifyverify/XN7-2.jsonDETECTHEAD_FORK_SAME_SIZE§9.2, §9.4, §10as XN7-1 with W supplied as the only mirror head file
XN7XN7-3verifyverify/XN7-3.jsonDETECTHEAD_FORK_SAME_SIZE§6.5, §9.4, §10known head 2 has the same tree_size and log_root as export head 1 but a different tip_root
XN7XN7-4verifyverify/XN7-4.jsonACCEPT§9.4, §10control: known head 2 with no new events has the same tree_size, log_root and tip map as export head 1
XNULLXNULL-1verifyverify/XNULL-1.jsonREJECTJSON_NULL§3.4absent != null: export member keys written as null
XNULLXNULL-2verifyverify/XNULL-2.jsonREJECTJSON_NULL§3.4absent != null: auth.agent_key_id written as null in a signed event
XSTATEXSTATE-1verifyverify/XSTATE-1.jsonACCEPT§11.1record in state REJECTED verifies: verifier ACCEPT (VERIFIED != ACCEPTED)

#Profile extension weio-ed25519-only/1 (SPEC §15A; not part of unqualified r8, r8.1 or r8.1a conformance)

14 cases, each with the member "profile": "weio-ed25519-only/1" (verify P1-1 to P1-11, digest P1-d1 to P1-d3; ids and keys in TEST-KEYS.json, section profile). They run like any verify or digest fixture, and the runner counts them apart from the base set. The verifier half of each case is r8: a verifier cannot see the profile (§15A.0), so a conforming verifier reproduces expect.result, expect.code and the rest as for any other case. The server half is the profile's: server = REFUSE with server_code (a profile code from §15A.7, or r8's R3_ERASED_ACTOR for P1-6) and server_refused_seq (the seq of the first event the server refuses). Server expectations are not executed by the fixture runner. Salts in these fixtures are derived from a seed (TEST-ONLY); a real server draws them from a CSPRNG (§15A.2).

Group Fixture Kind File Expected Code Spec § Server Case
P1P1-1verifyverify/P1-1.jsonACCEPT§4.2, §4.3, §5.2, §5.8, §15A, §8.4, §10Profile weio-ed25519-only/1, full record COMMIT, CONFIRM, DELIVER, ACCEPT: both parties ed25519, no email, each party digest is the §5.8 HMAC over its exact identifier; the export carries the plaintext, whose email is the identifier
P1P1-2verifyverify/P1-2.jsonACCEPT§4.2, §4.3, §5.2, §5.8, §15A, §8.4, §10Profile weio-ed25519-only/1, the same record as P1-1 exported without plaintext (the default profile export): the verifier reports PLAINTEXT_UNAVAILABLE for each role
P1P1-3verifyverify/P1-3.jsonACCEPT§4.2, §4.3, §5.2, §5.8, §15A, §5.3, §5.4Profile weio-ed25519-only/1: COMMIT, CONFIRM, AMEND (P), CONFIRM (C), DELIVER, ACCEPT, every event ed25519
P1P1-4verifyverify/P1-4.jsonACCEPT§4.2, §4.3, §5.2, §5.8, §15A, §5.3, §5.6Profile weio-ed25519-only/1: COMMIT, CONFIRM, DELIVER, ACCEPT, REVERSE (P), CONFIRM (C): the record ends REVERSED, every event ed25519
P1P1-5verifyverify/P1-5.jsonACCEPT§4.2, §4.3, §5.2, §5.8, §15A, §5.7, §10Profile weio-ed25519-only/1: ACCEPTed record, then ERASE of C (server event), then P writes a DISPUTE: the erased role is reported, the other role's later event stands; the export carries P's plaintext (the identifier) and none for C
P1P1-6verifyverify/P1-6.jsonREJECTR3_ERASED_ACTOR§4.2, §4.3, §5.2, §5.8, §15A, §5.7REFUSE R3_ERASED_ACTOR (seq 5)Profile weio-ed25519-only/1: ERASE of C, then a DISPUTE written by C (ed25519, signed by C's committed key): REJECT R3_ERASED_ACTOR; a server refuses the write
P1P1-7verifyverify/P1-7.jsonREJECTPLAINTEXT_AFTER_ERASE§4.2, §4.3, §5.2, §5.8, §15A, §5.7, §8.4, §10Profile weio-ed25519-only/1: the P1-5 export with C's plaintext (identifier and k_rec, a copy taken before the ERASE) put back in: REJECT PLAINTEXT_AFTER_ERASE
P1P1-8verifyverify/P1-8.jsonACCEPT§4.2, §4.3, §5.2, §5.8, §15A, §15A.3REFUSE PROFILE_KEY_UNPROVEN (seq 0)Profile weio-ed25519-only/1, refusal example: P commits a key that P itself holds as C's agent_key, then writes C's CONFIRM and ACCEPT with it. The verifier ACCEPTs; a profile server REFUSEs the COMMIT (C never proved that key)
P1P1-9verifyverify/P1-9.jsonACCEPT§4.2, §4.3, §5.2, §5.8, §15A, §5.3, §15A.2REFUSE PROFILE_ID_EQUAL (seq 0)Profile weio-ed25519-only/1, refusal example: P and C commit the same agent_key, so both identifiers are equal; the two salts differ, so the two digests differ. The verifier ACCEPTs; a profile server REFUSEs the COMMIT before it computes any digest
P1P1-10verifyverify/P1-10.jsonACCEPT§4.2, §4.3, §5.2, §5.8, §15A, §4.2, §12, §15A.4REFUSE PROFILE_EMAIL_TOKEN (seq 1)Profile weio-ed25519-only/1, refusal example: C's CONFIRM is written with auth.method email_token (party_digest = C's digest). The verifier ACCEPTs it; a profile server REFUSEs any email_token event
P1P1-11verifyverify/P1-11.jsonREJECTPLAINTEXT_MISSING§4.2, §4.3, §5.2, §5.8, §15A, §5.7, §8.4, §10, §15A.6Profile weio-ed25519-only/1: the P1-1 record, C not erased, exported with plaintext {claimed: ["C"]} and no plaintext.c (C's plaintext is claimed and missing): REJECT PLAINTEXT_MISSING
P1P1-d1digestdigest/P1-d1.jsondigest§5.8, §15A.1, §15A.2Profile weio-ed25519-only/1: the party P digest of record P1-1 is the §5.8 HMAC over the identifier k-<key_id of P's agent_key>@registry.weio.invalid
P1P1-d2digestdigest/P1-d2.jsondigest§5.8, §15A.2Profile weio-ed25519-only/1: the identifier of record P1-9 under the P salt; P1-d2 and P1-d3 give two different digests for one identifier
P1P1-d3digestdigest/P1-d3.jsondigest§5.8, §15A.2Profile weio-ed25519-only/1: the identifier of record P1-9 under the C salt; P1-d2 and P1-d3 give two different digests for one identifier

#Vectors the spec cannot make testable as fixtures

Vector Reason
V25A write authorised only by the share token is refused by the server (§12); no wire field carries a share token as authority. V26 covers the export side.
V27Referrer-Policy: no-referrer and hashed share-token logs are web-server behaviour (§12).
V40Deletion from backups and stores after ERASE is an operations duty (§12). A verifier cannot observe it (§5.7, r7 N2); V37-d* show that a copy exported before the ERASE still links.
V57 (server half)Refusing secret-like note patterns is server-side; the wire half is V57-1.
V44 (package-text half)Scanning an implementation's own source is not wire data. The CLI-output half is render/V44-r1 (the candidate's own CLI) and text/V44-t1 (a literal regex-unit check).
V36 (scale)The vector names 10^6 candidates; V36-d1 uses 50. V36-d2 fixes the counting rule (§15).
N4 (stronger completeness)Proving that a signed tip map was derived from every log leaf needs a full-log audit, which v0 does not define (§6.5); XN4-1 documents the limit.

Back to the documents