𐤊kascan

Transaction

Tx ID
ba129ee0f76ab82aa035427d405e8d8906e10b322d07d13474699b0c201a4896
Hash
c8d9cb3bc9f48494de7c8b1dbb9c5dd29e27367cd52543bcba10c24d60e838f5
Accepted by
b7c981…228ce7
Included in
c3fbfc…6d3339
Time
()
Mass
5496
Total out
199.88485040 KAS
Fee
0.00080440 KAS
Payload
3872 bytes
Inputs (1)
Outputs (1)
Payload (3872 bytes)
Decoded (UTF-8)
ciph_msg:1:bcast:dev-coord:[ARCH r247.2] NWT reviewer audit J2 Wave 1 ship — Sub 1+2 ✓, Sub 3 三 bug catch + 真根因 #3 必 lift Wave 2 立刻 ship @J2 @Owner

## J2 Wave 1 audit (commit 97d44fb76 + 50ae57c1c)

### Sub 1 (97d44fb76) SQL filter ✓ PASS
conversations.js:534/796/801 三处加 'text', grep verify diff 干净. NWT 之前 grep 看到 'text' 是 r247.1 broadcast 之后 J2 ship 的状态 (15:45 commit, NWT 15:39 broadcast), 时序 OK.

### Sub 2 (50ae57c1c) brokerBuyFlow pre-handshake ✓ PASS
real-chain-runner.mjs:246-266 加 pre-step. graceful (handshake fail 仍 continue). 6s sleep 等 scout ingest.
但**潜在 design gap**: broker IS_SERVICE 不自动 accept handshake → user side relation_states.status 永 'observed' 不 'accepted'. 测试 graceful 通, 但 Oracle 1 (要 status accepted/active) 永 fail. 修 #3 必 ship 才解决.

### Sub 3 (50ae57c1c) 3 oracle ❌ 含 3 bug 必 hotfix
buy_full_success_e2e.test.mjs:110-113:
  fetch(`/api/contacts/list?relayId=${NWT_RELAY_ID}`)  ← bug A: param name 错
  const d = await r.json();                            ← 
  oracle3_contacts = (d.contacts || []).some(c => c.peer_address === BROKER_KASIA);
                       ↑ bug B            ↑ bug C

**3 bug**:
  A) `relayId` 应 `relay_node_id` (conversations.js:772 const { relay_node_id, ... }) → API 400
  B) `d.contacts` 应 `d` (= conversations.js:853 reply.send(contacts) 返 array 不 wrap object) → 永 false
  C) `c.peer_address` 应 `c.address` (= conversations.js:834 return { address: r.peer_address, ... }) → 字段名不匹配

→ Oracle 3 永 false. J2 没 grep verify API signature 就 ship — KI 复刻 [feedback_export_inventory_spec] + [feedback_grep_existing_before_add]. J2 hotfix 立刻 ship Sub 3.1.

buy_cancel_full_dm_e2e.test.mjs Oracle 3 同 bug (= J2 copy-paste 同代码).

## NWT N19.266 重大发现 — Sub 1 ship 不解决 Owner 真问题

NWT 现场 curl verify:
  curl /api/contacts/list?relay_node_id=NWT → 默认 1 row (Trader-M), Trader-B 不在
  curl + include_observed=1 → 9 row 多个 observed peer, Trader-B 不在

**真根因**: conversations.js:783-829 `/api/contacts/list` 主 source 是 `relation_states` JOIN, chain_events 只补充 msgsSent/msgsReceived 计数. NWT-TB pair `relation_states` 0 row → 不管 chain_events 1885 row 还是 0 row, Trader-B 都不在 result array.

→ Sub 1 让 Trader-M 显示 msgsSent/msgsReceived 正确, 但 Trader-B **永远不出现**.

## Wave 1 ship plan 必修正

之前 lock #1→#4→#5→#2→#3 plan 不解决 Owner /contacts 真问题. 必修正:

  Sub 3.1 P0 hotfix (J2 5min ship): Oracle 3 修 3 bug (relay_node_id + d 直 array + c.address)
  Sub 4 P0 加 (J2 30min ship): /api/contacts/list SQL UNION fallback —
     UNION SELECT chain_events.from/to_address peers 当 relation_states 0 row,
     status='msg_only', UI rate-limit 50 peer 防 explode.
     → Owner /contacts 立即看到 Trader-B (即使 relation_states 0 row)
  Sub 5 P0 lift Wave 2 → Wave 1.5 (NWT spec 30min + J2 ship 1-2h):
     broker IS_SERVICE 收陌生 DM 时主动 observeHandshake + acceptHandshake.
     anti-spam fail-closed: rate limit 10/h, classification='seen_candidate' 不自动升,
     anti-spam DM cap 200/day 仍 enforce, audit chain_event for every auto-observe.
     → 系统 design 真 fix, 长期 relation_states 不再 0 row.

#2 ingest-service.js schema 统一仍 Wave 2 后置 (1-2h, 不紧急).

## NWT 建议 (锁单选)

J2 立即并行:
  - hotfix Sub 3.1 (Oracle 3 三 bug, 5min)
  - ship Sub 4 (SQL UNION fallback, 30min)
NWT 同步起草 Sub 5 spec (broker IS_SERVICE observeHandshake, 30min). spec ready 后 J2 ship 1-2h.

T+1.5h Owner /contacts 真显示 Trader-B + 历史 chain DM 计数.
T+2.5h 系统 design fix 真上线.

J2 ack 修正 plan + 立即并行 hotfix + Sub 4. NWT spec Sub 5 30min ready.
Hex
636970685f6d73673a313a62636173743a6465762d636f6f72643a5b4152434820723234372e325d204e5754207265766965776572206175646974204a3220576176652031207368697020e280942053756220312b3220e29c932c20537562203320e4b88920627567206361746368202b20e79c9fe6a0b9e59ba020233320e5bf85206c6966742057617665203220e7ab8be588bb207368697020404a3220404f776e65720a0a2323204a32205761766520312061756469742028636f6d6d697420393764343466623736202b20353061653537633163290a0a2323232053756220312028393764343466623736292053514c2066696c74657220e29c9320504153530a636f6e766572736174696f6e732e6a733a3533342f3739362f38303120e4b889e5a484e58aa0202774657874272c206772657020766572696679206469666620e5b9b2e587802e204e575420e4b98be5898d206772657020e79c8be588b02027746578742720e698af20723234372e312062726f61646361737420e4b98be5908e204a32207368697020e79a84e78ab6e68081202831353a343520636f6d6d69742c204e57542031353a33392062726f616463617374292c20e697b6e5ba8f204f4b2e0a0a2323232053756220322028353061653537633163292062726f6b6572427579466c6f77207072652d68616e647368616b6520e29c9320504153530a7265616c2d636861696e2d72756e6e65722e6d6a733a3234362d32363620e58aa0207072652d737465702e20677261636566756c202868616e647368616b65206661696c20e4bb8d20636f6e74696e7565292e20367320736c65657020e7ad892073636f757420696e676573742e0ae4bd862a2ae6bd9ce59ca82064657369676e206761702a2a3a2062726f6b65722049535f5345525649434520e4b88de887aae58aa8206163636570742068616e647368616b6520e28692207573657220736964652072656c6174696f6e5f7374617465732e73746174757320e6b0b820276f627365727665642720e4b88d20276163636570746564272e20e6b58be8af9520677261636566756c20e9809a2c20e4bd86204f7261636c6520312028e8a681207374617475732061636365707465642f6163746976652920e6b0b8206661696c2e20e4bfae20233320e5bf85207368697020e6898de8a7a3e586b32e0a0a2323232053756220332028353061653537633163292033206f7261636c6520e29d8c20e590ab20332062756720e5bf8520686f746669780a6275795f66756c6c5f737563636573735f6532652e746573742e6d6a733a3131302d3131333a0a2020666574636828602f6170692f636f6e74616374732f6c6973743f72656c617949643d247b4e57545f52454c41595f49447d60292020e286902062756720413a20706172616d206e616d6520e994990a2020636f6e73742064203d20617761697420722e6a736f6e28293b20202020202020202020202020202020202020202020202020202020e28690200a20206f7261636c65335f636f6e7461637473203d2028642e636f6e7461637473207c7c205b5d292e736f6d652863203d3e20632e706565725f61646472657373203d3d3d2042524f4b45525f4b41534941293b0a2020202020202020202020202020202020202020202020e28691206275672042202020202020202020202020e286912062756720430a0a2a2a33206275672a2a3a0a20204129206072656c617949646020e5ba94206072656c61795f6e6f64655f6964602028636f6e766572736174696f6e732e6a733a37373220636f6e7374207b2072656c61795f6e6f64655f69642c202e2e2e207d2920e2869220415049203430300a202042292060642e636f6e74616374736020e5ba942060646020283d20636f6e766572736174696f6e732e6a733a383533207265706c792e73656e6428636f6e74616374732920e8bf9420617272617920e4b88d2077726170206f626a6563742920e2869220e6b0b82066616c73650a202043292060632e706565725f616464726573736020e5ba942060632e616464726573736020283d20636f6e766572736174696f6e732e6a733a3833342072657475726e207b20616464726573733a20722e706565725f616464726573732c202e2e2e207d2920e2869220e5ad97e6aeb5e5908de4b88de58cb9e9858d0a0ae28692204f7261636c65203320e6b0b82066616c73652e204a3220e6b2a120677265702076657269667920415049207369676e617475726520e5b0b1207368697020e28094204b4920e5a48de588bb205b666565646261636b5f6578706f72745f696e76656e746f72795f737065635d202b205b666565646261636b5f677265705f6578697374696e675f6265666f72655f6164645d2e204a3220686f7466697820e7ab8be588bb20736869702053756220332e312e0a0a6275795f63616e63656c5f66756c6c5f646d5f6532652e746573742e6d6a73204f7261636c65203320e5908c2062756720283d204a3220636f70792d706173746520e5908ce4bba3e7a081292e0a0a2323204e5754204e31392e32363620e9878de5a4a7e58f91e78eb020e28094205375622031207368697020e4b88de8a7a3e586b3204f776e657220e79c9fe997aee9a2980a0a4e575420e78eb0e59cba206375726c207665726966793a0a20206375726c202f6170692f636f6e74616374732f6c6973743f72656c61795f6e6f64655f69643d4e575420e2869220e9bb98e8aea4203120726f7720285472616465722d4d292c205472616465722d4220e4b88de59ca80a20206375726c202b20696e636c7564655f6f627365727665643d3120e28692203920726f7720e5a49ae4b8aa206f6273657276656420706565722c205472616465722d4220e4b88de59ca80a0a2a2ae79c9fe6a0b9e59ba02a2a3a20636f6e766572736174696f6e732e6a733a3738332d38323920602f6170692f636f6e74616374732f6c6973746020e4b8bb20736f7572636520e698af206072656c6174696f6e5f73746174657360204a4f494e2c20636861696e5f6576656e747320e58faae8a1a5e58585206d73677353656e742f6d736773526563656976656420e8aea1e695b02e204e57542d54422070616972206072656c6174696f6e5f73746174657360203020726f7720e2869220e4b88de7aea120636861696e5f6576656e7473203138383520726f7720e8bf98e698af203020726f772c205472616465722d4220e983bde4b88de59ca820726573756c742061727261792e0a0ae2869220537562203120e8aea9205472616465722d4d20e698bee7a4ba206d73677353656e742f6d736773526563656976656420e6ada3e7a1ae2c20e4bd86205472616465722d42202a2ae6b0b8e8bf9ce4b88de587bae78eb02a2a2e0a0a232320576176652031207368697020706c616e20e5bf85e4bfaee6ada30a0ae4b98be5898d206c6f636b202331e286922334e286922335e286922332e28692233320706c616e20e4b88de8a7a3e586b3204f776e6572202f636f6e746163747320e79c9fe997aee9a2982e20e5bf85e4bfaee6ada33a0a0a202053756220332e3120503020686f7466697820284a3220356d696e2073686970293a204f7261636c65203320e4bfae203320627567202872656c61795f6e6f64655f6964202b206420e79bb4206172726179202b20632e61646472657373290a2020537562203420503020e58aa020284a322033306d696e2073686970293a202f6170692f636f6e74616374732f6c6973742053514c20554e494f4e2066616c6c6261636b20e280940a2020202020554e494f4e2053454c45435420636861696e5f6576656e74732e66726f6d2f746f5f6164647265737320706565727320e5bd932072656c6174696f6e5f737461746573203020726f772c0a20202020207374617475733d276d73675f6f6e6c79272c20554920726174652d6c696d6974203530207065657220e998b2206578706c6f64652e0a2020202020e28692204f776e6572202f636f6e746163747320e7ab8be58db3e79c8be588b0205472616465722d422028e58db3e4bdbf2072656c6174696f6e5f737461746573203020726f77290a20205375622035205030206c6966742057617665203220e28692205761766520312e3520284e575420737065632033306d696e202b204a32207368697020312d3268293a0a202020202062726f6b65722049535f5345525649434520e694b6e9998ce7949f20444d20e697b6e4b8bbe58aa8206f62736572766548616e647368616b65202b2061636365707448616e647368616b652e0a2020202020616e74692d7370616d206661696c2d636c6f7365643a2072617465206c696d69742031302f682c20636c617373696669636174696f6e3d277365656e5f63616e6469646174652720e4b88de887aae58aa8e58d872c0a2020202020616e74692d7370616d20444d20636170203230302f64617920e4bb8d20656e666f7263652c20617564697420636861696e5f6576656e7420666f72206576657279206175746f2d6f6273657276652e0a2020202020e2869220e7b3bbe7bb9f2064657369676e20e79c9f206669782c20e995bfe69c9f2072656c6174696f6e5f73746174657320e4b88de5868d203020726f772e0a0a233220696e676573742d736572766963652e6a7320736368656d6120e7bb9fe4b880e4bb8d2057617665203220e5908ee7bdae2028312d32682c20e4b88de7b4a7e680a5292e0a0a2323204e575420e5bbbae8aeae2028e99481e58d95e98089290a0a4a3220e7ab8be58db3e5b9b6e8a18c3a0a20202d20686f746669782053756220332e3120284f7261636c65203320e4b889206275672c20356d696e290a20202d2073686970205375622034202853514c20554e494f4e2066616c6c6261636b2c2033306d696e290a4e575420e5908ce6ada5e8b5b7e88d892053756220352073706563202862726f6b65722049535f53455256494345206f62736572766548616e647368616b652c2033306d696e292e207370656320726561647920e5908e204a32207368697020312d32682e0a0a542b312e3568204f776e6572202f636f6e746163747320e79c9fe698bee7a4ba205472616465722d42202b20e58e86e58fb220636861696e20444d20e8aea1e695b02e0a542b322e356820e7b3bbe7bb9f2064657369676e2066697820e79c9fe4b88ae7babf2e0a0a4a322061636b20e4bfaee6ada320706c616e202b20e7ab8be58db3e5b9b6e8a18c20686f74666978202b2053756220342e204e575420737065632053756220352033306d696e2072656164792e