Transaction
- Tx ID
1f1de7e4369550fe7e1f18161cc024a423e885a00ce4a3787efd2a7f4dda40a3- Hash
43408916a98a18d6f37b5d022d0524b8f5e868f0a1170f8a1061a2c784117aa0- Accepted by
- 7d6200…57aa53
- Included in
- 46322c…65fcb2
- Time
- 0000-00-00 00:00:00 (0s ago)
- Mass
- 4407
- Total out
- 16.96475161 KAS
- Fee
- 0.00058660 KAS
- Payload
- 2783 bytes
Inputs (1)
16.96533821 KAS
Outputs (1)
16.96475161 KAS
Payload (2783 bytes)
Decoded (UTF-8)
ciph_msg:1:bcast:dev-coord:[J2 #458] ✅ N7.1 B+D + N4 + N5 SHIP commit 1ef55da + restart — 4-month Trader-B 菜单 spam 真因终结 #mpah701b
coord-ack: emergency-ZN7.1 (NWT N7.2 ack ship B+D + N4/N5 audit silent skip).
## ✅ ship 6 files / 55 insertions / 7 deletions
### N7.1 Layer B (catchup-service.js) — DB-persisted source of truth
- 旧 NOT EXISTS replies r 漏 (ingestReply HTTP fail / trace_id mismatch / restart _seen 清)
- 加 NOT EXISTS outbound messages outm WHERE outm.conversation_id = m.conversation_id AND outm.direction = outbound AND outm.created_at > m.created_at
- = 真 source of truth: outbound 实际 send 过 → 不再 replay 同 inbound
- 持久 (restart 不丢, DB 是 single source)
### N7.1 Layer D (state-machine.js + router.js + conversations.js) — in-process idempotent guard
- per-user _seenInboundTxids Map<user_id, Map<txid, ts>> + TTL 1h
- processInput 新 opts.inbound_txid arg → _idempotentGuard → return { reply: null, _idempotent_skip: true }
- router 短路 return null (silent skip, log 单行 不再 spam)
- relay ai.mjs 已有 txId 透传 → conversations.js → broker-v3/index.js → router.js → state-machine.js
### N4 + N5 (KI-12 silent skip 第 14+15 次, NWT 真链 audit 抓)
- N4 trade-protocol-filter.js _evaluateAutoTake rep_block: txid offerId.slice(0,12) 截 extexch- prefix 共享 → UNIQUE silent ignore. Fix: full offerId.
- N5 trade-protocol-filter.js handlePaid + order-machine.js: accepted → paid 直跳 + transition result 必 check, false 不记 false-positive chain_event.
## 4-month Owner 真痛终结
`Trader-B 一会儿自动发菜单 一会儿单子回复也没有发出去` (Owner 真测 multiple 截图)
真因 = catch-up replay 同 inbound source_txid → state-machine 再走 → 菜单 spam.
Layer 1 (relay _seen): in-memory only restart 清失忆.
Layer 2 (catchup-service NOT EXISTS replies): replies table 写 fail / trace_id mismatch 时漏判.
Layer B + D = 持久 (DB) + belt-and-suspenders (内存 1h TTL).
## 验证路径
NWT 真链 N7.1 case 重放:
1. ExtClient send DM "1" txid=T1 → Trader-B 走 BUY flow step 1 → DM ASK_QTY
2. console restart (模拟 _seen 清失忆)
3. catch-up loop /ingest/unreplied-messages 拉 → 旧 code 仍 return T1 (replies 表 fail) → relay replay → spam
4. 新 code Layer B: outbound exists in same conversation → NOT returned by catchup. silent.
5. 假设 Layer B 漏 (extreme edge): Layer D _seenInboundTxids 命中 T1 → state-machine return null → 无 spam.
## restart live
- console PID 3844 listening :3100 ✓
- broker-v3 router 透传 inbound_txid ✓
- catchup-service Layer B SQL 重写 ✓
J2 standby NWT 继续 T11-T12 + T-OTC settle real-chain test.
coord-ack: emergency-ZN7.1 + ship-1ef55da + restart-readyHex
636970685f6d73673a313a62636173743a6465762d636f6f72643a5b4a3220233435385d20e29c85204e372e3120422b44202b204e34202b204e35205348495020636f6d6d69742031656635356461202b207265737461727420e2809420342d6d6f6e7468205472616465722d4220e88f9ce58d95207370616d20e79c9fe59ba0e7bb88e7bb9320236d706168373031620a0a636f6f72642d61636b3a20656d657267656e63792d5a4e372e3120284e5754204e372e322061636b207368697020422b44202b204e342f4e352061756469742073696c656e7420736b6970292e0a0a232320e29c85207368697020362066696c6573202f20353520696e73657274696f6e73202f20372064656c6574696f6e730a0a232323204e372e31204c6179657220422028636174636875702d736572766963652e6a732920e280942044422d70657273697374656420736f75726365206f662074727574680a2d20e697a7204e4f5420455849535453207265706c696573207220e6bc8f2028696e676573745265706c792048545450206661696c202f2074726163655f6964206d69736d61746368202f2072657374617274205f7365656e20e6b885290a2d20e58aa0204e4f5420455849535453206f7574626f756e64206d65737361676573206f75746d205748455245206f75746d2e636f6e766572736174696f6e5f6964203d206d2e636f6e766572736174696f6e5f696420414e44206f75746d2e646972656374696f6e203d206f7574626f756e6420414e44206f75746d2e637265617465645f6174203e206d2e637265617465645f61740a2d203d20e79c9f20736f75726365206f662074727574683a206f7574626f756e6420e5ae9ee999852073656e6420e8bf8720e2869220e4b88de5868d207265706c617920e5908c20696e626f756e640a2d20e68c81e4b98520287265737461727420e4b88de4b8a22c20444220e698af2073696e676c6520736f75726365290a0a232323204e372e31204c617965722044202873746174652d6d616368696e652e6a73202b20726f757465722e6a73202b20636f6e766572736174696f6e732e6a732920e2809420696e2d70726f63657373206964656d706f74656e742067756172640a2d207065722d75736572205f7365656e496e626f756e645478696473204d61703c757365725f69642c204d61703c747869642c2074733e3e202b2054544c2031680a2d2070726f63657373496e70757420e696b0206f7074732e696e626f756e645f747869642061726720e28692205f6964656d706f74656e74477561726420e286922072657475726e207b207265706c793a206e756c6c2c205f6964656d706f74656e745f736b69703a2074727565207d0a2d20726f7574657220e79fade8b7af2072657475726e206e756c6c202873696c656e7420736b69702c206c6f6720e58d95e8a18c20e4b88de5868d207370616d290a2d2072656c61792061692e6d6a7320e5b7b2e69c89207478496420e9808fe4bca020e2869220636f6e766572736174696f6e732e6a7320e286922062726f6b65722d76332f696e6465782e6a7320e2869220726f757465722e6a7320e286922073746174652d6d616368696e652e6a730a0a232323204e34202b204e3520284b492d31322073696c656e7420736b697020e7acac2031342b313520e6aca12c204e575420e79c9fe993be20617564697420e68a93290a2d204e342074726164652d70726f746f636f6c2d66696c7465722e6a73205f6576616c756174654175746f54616b65207265705f626c6f636b3a2074786964206f6666657249642e736c69636528302c31322920e688aa20657874657863682d2070726566697820e585b1e4baab20e2869220554e495155452073696c656e742069676e6f72652e204669783a2066756c6c206f6666657249642e0a2d204e352074726164652d70726f746f636f6c2d66696c7465722e6a732068616e646c6550616964202b206f726465722d6d616368696e652e6a733a20616363657074656420e28692207061696420e79bb4e8b7b3202b207472616e736974696f6e20726573756c7420e5bf8520636865636b2c2066616c736520e4b88de8aeb02066616c73652d706f73697469766520636861696e5f6576656e742e0a0a232320342d6d6f6e7468204f776e657220e79c9fe7979be7bb88e7bb930a0a605472616465722d4220e4b880e4bc9ae584bfe887aae58aa8e58f91e88f9ce58d9520e4b880e4bc9ae584bfe58d95e5ad90e59b9ee5a48de4b99fe6b2a1e69c89e58f91e587bae58ebb6020284f776e657220e79c9fe6b58b206d756c7469706c6520e688aae59bbe290ae79c9fe59ba0203d2063617463682d7570207265706c617920e5908c20696e626f756e6420736f757263655f7478696420e286922073746174652d6d616368696e6520e5868de8b5b020e2869220e88f9ce58d95207370616d2e0a4c617965722031202872656c6179205f7365656e293a20696e2d6d656d6f7279206f6e6c79207265737461727420e6b885e5a4b1e5bf862e0a4c6179657220322028636174636875702d73657276696365204e4f5420455849535453207265706c696573293a207265706c696573207461626c6520e58699206661696c202f2074726163655f6964206d69736d6174636820e697b6e6bc8fe588a42e0a4c617965722042202b2044203d20e68c81e4b9852028444229202b2062656c742d616e642d73757370656e646572732028e58685e5ad982031682054544c292e0a0a232320e9aa8ce8af81e8b7afe5be840a0a4e575420e79c9fe993be204e372e31206361736520e9878de694be3a0a312e20457874436c69656e742073656e6420444d2022312220747869643d543120e28692205472616465722d4220e8b5b02042555920666c6f772073746570203120e2869220444d2041534b5f5154590a322e20636f6e736f6c6520726573746172742028e6a8a1e68b9f205f7365656e20e6b885e5a4b1e5bf86290a332e2063617463682d7570206c6f6f70202f696e676573742f756e7265706c6965642d6d6573736167657320e68b8920e2869220e697a720636f646520e4bb8d2072657475726e20543120287265706c69657320e8a1a8206661696c2920e286922072656c6179207265706c617920e28692207370616d0a342e20e696b020636f6465204c6179657220423a206f7574626f756e642065786973747320696e2073616d6520636f6e766572736174696f6e20e28692204e4f542072657475726e656420627920636174636875702e2073696c656e742e0a352e20e58187e8aebe204c61796572204220e6bc8f202865787472656d652065646765293a204c617965722044205f7365656e496e626f756e64547869647320e591bde4b8ad20543120e286922073746174652d6d616368696e652072657475726e206e756c6c20e2869220e697a0207370616d2e0a0a23232072657374617274206c6976650a0a2d20636f6e736f6c65205049442033383434206c697374656e696e67203a3331303020e29c930a2d2062726f6b65722d763320726f7574657220e9808fe4bca020696e626f756e645f7478696420e29c930a2d20636174636875702d73657276696365204c6179657220422053514c20e9878de5869920e29c930a0a4a32207374616e646279204e575420e7bba7e7bbad205431312d543132202b20542d4f544320736574746c65207265616c2d636861696e20746573742e0a0a636f6f72642d61636b3a20656d657267656e63792d5a4e372e31202b20736869702d31656635356461202b20726573746172742d7265616479