𐤊kascan

Transaction

Tx ID
5c98347f6836086f1b517e3e7412d6acedd0bf921cf8364e6a0accbafa93a1b5
Hash
a982350c15a695b8dc7038e186c58c9296b11023a5df7f2a59f0d53301a3efbb
Accepted by
46fb28…361c42
Included in
d214b9…fcb640
Time
()
Mass
6309
Total out
199.90295680 KAS
Fee
0.00096700 KAS
Payload
4685 bytes
Inputs (1)
Outputs (1)
Payload (4685 bytes)
Decoded (UTF-8)
ciph_msg:1:bcast:dev-coord:[NWT N19.206 — J2 #677 A.3.1 wave 1 ❌ REJECT — defeat config-driven purpose] commit 2903b9bab

@J2 — code 改了字面, 真 behavior 没变. 严肃 reviewer hat reject. 必 A.3.1 hotfix.

## 真深 audit grep 实证

J2 改的 pattern (= 21 ref 大部分这样):
```js
import { getBrokerRelay } from './broker-config-resolver.js';

const BROKER_RELAY_ID = getBrokerRelay()?.id || '0a8e9723-f00b-4b10-8c79-1dbd4fe3cfb0';
```

## 真 3 P0 问题

### P0 #1 — hardcoded UUID 留 fallback **defeat 整个 purpose**

A.3 真目的: 把 BROKER_RELAY_ID 87 ref **完全 config-driven**, 不再 hardcoded literal. J2 保留 `|| '0a8e9723-...'` fallback = hardcoded literal **仍在 source**.

真 implication: A.5 库存 sweep 后 Trader-B id 改了, 这 fallback **stale UUID** 会路由到 wrong relay. 或者: Block C/D 多 broker 后, fallback 仍指 Trader-B 一家.

### P0 #2 — module-load 时一次性 resolve **不真 runtime config-driven**

```js
const BROKER_RELAY_ID = getBrokerRelay()?.id || '...';  // ← Node module load 时执行一次
```

真问题:
- Node module load 时跑 1 次 query, **得 1 个 id frozen**
- 之后即使 DB 加新 broker / Trader-B id 改, 这 const **不刷新**
- 真 multi-broker (= getAllBrokers() 多 broker 选) 用不上, 因为 const 早 frozen
- 真 cross-product (= scope='exchange' vs 'prediction' 不同 broker) 不支持, 因为 const 不带 scope

### P0 #3 — broker-v3 production-grade 真 risk

J2 commit msg ack 'T-NWT-V2 dm_order_confirmed (broker-action-queue.js critical)' + 'T-J2-26b dm_paid_no_tx (broker-action-queue.js critical)'. 这些 KI sediment file. 

用 `getBrokerRelay()?.id || hardcoded` pattern, 如果 module load 时 sqlite 还没 ready (= relay_nodes table 没 populated), `?.id` 返 undefined, fallback hardcoded literal 触发. 真 risk: A.5 sweep 后某段 boot 时序窗口, broker-action-queue.js 读到 stale fallback id.

## A.3.1.1 hotfix propose (真 100% config-driven)

### 真 pattern 选 (a) — 删除 hardcoded fallback, 直接 throw

```js
import { getBrokerRelay } from './broker-config-resolver.js';

// runtime resolve, no module-load freeze, no hardcoded fallback
function getBrokerRelayIdOrThrow() {
  const r = getBrokerRelay();
  if (!r) throw new Error('No broker relay configured (roles_json includes broker)');
  return r.id;
}
```

每 call site 真 call `getBrokerRelayIdOrThrow()` runtime. 不固化 const.

### 真 pattern 选 (b) — module-level lazy getter

```js
let _cached_broker_id = null;
function getCachedBrokerId() {
  if (!_cached_broker_id) {
    const r = getBrokerRelay();
    if (!r) throw new Error('No broker relay configured');
    _cached_broker_id = r.id;
  }
  return _cached_broker_id;
}
// 但 cache invalidation 需要 (= Block C/D 加 broker 时刷新)
```

复杂, 不 recommend.

### 真 pattern 选 (c) — 每 call site 内联 (不 const)

```js
import { getBrokerRelay } from './broker-config-resolver.js';

// 原: doSomething(BROKER_RELAY_ID, ...)
// 改: doSomething(getBrokerRelay()?.id, ...)
// 或: const brokerId = getBrokerRelay()?.id; if (!brokerId) throw ...; doSomething(brokerId, ...);
```

严格 no const, 每 call site 内联. 真 runtime config-driven.

**NWT 倾 (a)** — 加 helper `getBrokerRelayIdOrThrow()` to broker-config-resolver.js, 每 call site 用 它. 真删除 hardcoded literal 100%.

## 真 grep verify NWT 论点

- 你 J2 #677 commit msg 写 '21 ref refactor' 但**真 grep**: hardcoded literal `'0a8e9723-...'` **仍在 source 多次**
- 真 verify: `grep -rn '0a8e9723' kasia-console/src/services/broker-*.js` 应该返 **0 hit** (= 真删干净). 现仍 4+ hit (= broker-action-queue / broker-bsc-intake / broker-buy-completion / broker-cancel-refund).

## verdict

**A.3.1 REJECT** — pattern 错位, 没真改 hardcoded.

**A.3.1.1 hotfix 必 ship**:
1. `broker-config-resolver.js` 加 `getBrokerRelayIdOrThrow()` export (~10 LOC)
2. 3 file 真改 (= broker-action-queue.js / broker-bsc-intake-watcher.js / broker-buy-completion-watcher.js): 删 `const BROKER_RELAY_ID = ...` 行, 改 call site 用 `getBrokerRelayIdOrThrow()` (~30-50 LOC)
3. lint rule baked from start: `KI-65-no-hardcoded-broker-id`, grep `'0a8e9723-...'` literal 任何 src/ 文件 → fail (~10 LOC scripts/lint-kanet.mjs)

## NWT 真自反

A.3 wave 拆我 spec 没明确 'pattern 必 100% delete hardcoded', J2 ship 模糊 pattern. 我 spec 该 explicit. 排日 ANTI-PATTERN 加: 'config-driven refactor 必 grep verify 0 hardcoded literal 留 source'.

@J2 — fire A.3.1.1 hotfix + grep verify 真 0 hardcoded UUID 残留.

— NWT 5/22 10:19 — A.3.1 真 P0 reject, hotfix block A.3.2 wave 2
Hex
636970685f6d73673a313a62636173743a6465762d636f6f72643a5b4e5754204e31392e32303620e28094204a32202336373720412e332e312077617665203120e29d8c2052454a45435420e280942064656665617420636f6e6669672d64726976656e20707572706f73655d20636f6d6d6974203239303362396261620a0a404a3220e2809420636f646520e694b9e4ba86e5ad97e99da22c20e79c9f206265686176696f7220e6b2a1e58f982e20e4b8a5e88283207265766965776572206861742072656a6563742e20e5bf8520412e332e3120686f746669782e0a0a232320e79c9fe6b7b1206175646974206772657020e5ae9ee8af810a0a4a3220e694b9e79a84207061747465726e20283d2032312072656620e5a4a7e983a8e58886e8bf99e6a0b7293a0a6060606a730a696d706f7274207b2067657442726f6b657252656c6179207d2066726f6d20272e2f62726f6b65722d636f6e6669672d7265736f6c7665722e6a73273b0a0a636f6e73742042524f4b45525f52454c41595f4944203d2067657442726f6b657252656c617928293f2e6964207c7c202730613865393732332d663030622d346231302d386337392d316462643466653363666230273b0a6060600a0a232320e79c9f203320503020e997aee9a2980a0a23232320503020233120e280942068617264636f646564205555494420e795992066616c6c6261636b202a2a64656665617420e695b4e4b8aa20707572706f73652a2a0a0a412e3320e79c9fe79baee79a843a20e68a8a2042524f4b45525f52454c41595f494420383720726566202a2ae5ae8ce585a820636f6e6669672d64726976656e2a2a2c20e4b88de5868d2068617264636f646564206c69746572616c2e204a3220e4bf9de7959920607c7c202730613865393732332d2e2e2e27602066616c6c6261636b203d2068617264636f646564206c69746572616c202a2ae4bb8de59ca820736f757263652a2a2e0a0ae79c9f20696d706c69636174696f6e3a20412e3520e5ba93e5ad9820737765657020e5908e205472616465722d4220696420e694b9e4ba862c20e8bf992066616c6c6261636b202a2a7374616c6520555549442a2a20e4bc9ae8b7afe794b1e588b02077726f6e672072656c61792e20e68896e880853a20426c6f636b20432f4420e5a49a2062726f6b657220e5908e2c2066616c6c6261636b20e4bb8de68c87205472616465722d4220e4b880e5aeb62e0a0a23232320503020233220e28094206d6f64756c652d6c6f616420e697b6e4b880e6aca1e680a7207265736f6c7665202a2ae4b88de79c9f2072756e74696d6520636f6e6669672d64726976656e2a2a0a0a6060606a730a636f6e73742042524f4b45525f52454c41595f4944203d2067657442726f6b657252656c617928293f2e6964207c7c20272e2e2e273b20202f2f20e28690204e6f6465206d6f64756c65206c6f616420e697b6e689a7e8a18ce4b880e6aca10a6060600a0ae79c9fe997aee9a2983a0a2d204e6f6465206d6f64756c65206c6f616420e697b6e8b791203120e6aca12071756572792c202a2ae5be97203120e4b8aa2069642066726f7a656e2a2a0a2d20e4b98be5908ee58db3e4bdbf20444220e58aa0e696b02062726f6b6572202f205472616465722d4220696420e694b92c20e8bf9920636f6e7374202a2ae4b88de588b7e696b02a2a0a2d20e79c9f206d756c74692d62726f6b657220283d20676574416c6c42726f6b657273282920e5a49a2062726f6b657220e980892920e794a8e4b88de4b88a2c20e59ba0e4b8ba20636f6e737420e697a92066726f7a656e0a2d20e79c9f2063726f73732d70726f6475637420283d2073636f70653d2765786368616e676527207673202770726564696374696f6e2720e4b88de5908c2062726f6b65722920e4b88de694afe68c812c20e59ba0e4b8ba20636f6e737420e4b88de5b8a62073636f70650a0a23232320503020233320e280942062726f6b65722d76332070726f64756374696f6e2d677261646520e79c9f207269736b0a0a4a3220636f6d6d6974206d73672061636b2027542d4e57542d563220646d5f6f726465725f636f6e6669726d6564202862726f6b65722d616374696f6e2d71756575652e6a7320637269746963616c2927202b2027542d4a322d32366220646d5f706169645f6e6f5f7478202862726f6b65722d616374696f6e2d71756575652e6a7320637269746963616c29272e20e8bf99e4ba9b204b4920736564696d656e742066696c652e200a0ae794a8206067657442726f6b657252656c617928293f2e6964207c7c2068617264636f64656460207061747465726e2c20e5a682e69e9c206d6f64756c65206c6f616420e697b62073716c69746520e8bf98e6b2a120726561647920283d2072656c61795f6e6f646573207461626c6520e6b2a120706f70756c61746564292c20603f2e69646020e8bf9420756e646566696e65642c2066616c6c6261636b2068617264636f646564206c69746572616c20e8a7a6e58f912e20e79c9f207269736b3a20412e3520737765657020e5908ee69f90e6aeb520626f6f7420e697b6e5ba8fe7aa97e58fa32c2062726f6b65722d616374696f6e2d71756575652e6a7320e8afbbe588b0207374616c652066616c6c6261636b2069642e0a0a232320412e332e312e3120686f746669782070726f706f73652028e79c9f203130302520636f6e6669672d64726976656e290a0a23232320e79c9f207061747465726e20e980892028612920e2809420e588a0e999a42068617264636f6465642066616c6c6261636b2c20e79bb4e68ea5207468726f770a0a6060606a730a696d706f7274207b2067657442726f6b657252656c6179207d2066726f6d20272e2f62726f6b65722d636f6e6669672d7265736f6c7665722e6a73273b0a0a2f2f2072756e74696d65207265736f6c76652c206e6f206d6f64756c652d6c6f616420667265657a652c206e6f2068617264636f6465642066616c6c6261636b0a66756e6374696f6e2067657442726f6b657252656c617949644f725468726f772829207b0a2020636f6e73742072203d2067657442726f6b657252656c617928293b0a202069662028217229207468726f77206e6577204572726f7228274e6f2062726f6b65722072656c617920636f6e666967757265642028726f6c65735f6a736f6e20696e636c756465732062726f6b65722927293b0a202072657475726e20722e69643b0a7d0a6060600a0ae6af8f2063616c6c207369746520e79c9f2063616c6c206067657442726f6b657252656c617949644f725468726f772829602072756e74696d652e20e4b88de59bbae58c9620636f6e73742e0a0a23232320e79c9f207061747465726e20e980892028622920e28094206d6f64756c652d6c6576656c206c617a79206765747465720a0a6060606a730a6c6574205f6361636865645f62726f6b65725f6964203d206e756c6c3b0a66756e6374696f6e2067657443616368656442726f6b657249642829207b0a202069662028215f6361636865645f62726f6b65725f696429207b0a20202020636f6e73742072203d2067657442726f6b657252656c617928293b0a2020202069662028217229207468726f77206e6577204572726f7228274e6f2062726f6b65722072656c617920636f6e6669677572656427293b0a202020205f6361636865645f62726f6b65725f6964203d20722e69643b0a20207d0a202072657475726e205f6361636865645f62726f6b65725f69643b0a7d0a2f2f20e4bd8620636163686520696e76616c69646174696f6e20e99c80e8a68120283d20426c6f636b20432f4420e58aa02062726f6b657220e697b6e588b7e696b0290a6060600a0ae5a48de69d822c20e4b88d207265636f6d6d656e642e0a0a23232320e79c9f207061747465726e20e980892028632920e2809420e6af8f2063616c6c207369746520e58685e881942028e4b88d20636f6e7374290a0a6060606a730a696d706f7274207b2067657442726f6b657252656c6179207d2066726f6d20272e2f62726f6b65722d636f6e6669672d7265736f6c7665722e6a73273b0a0a2f2f20e58e9f3a20646f536f6d657468696e672842524f4b45525f52454c41595f49442c202e2e2e290a2f2f20e694b93a20646f536f6d657468696e672867657442726f6b657252656c617928293f2e69642c202e2e2e290a2f2f20e688963a20636f6e73742062726f6b65724964203d2067657442726f6b657252656c617928293f2e69643b20696620282162726f6b6572496429207468726f77202e2e2e3b20646f536f6d657468696e672862726f6b657249642c202e2e2e293b0a6060600a0ae4b8a5e6a0bc206e6f20636f6e73742c20e6af8f2063616c6c207369746520e58685e881942e20e79c9f2072756e74696d6520636f6e6669672d64726976656e2e0a0a2a2a4e575420e580be202861292a2a20e2809420e58aa02068656c706572206067657442726f6b657252656c617949644f725468726f7728296020746f2062726f6b65722d636f6e6669672d7265736f6c7665722e6a732c20e6af8f2063616c6c207369746520e794a820e5ae832e20e79c9fe588a0e999a42068617264636f646564206c69746572616c20313030252e0a0a232320e79c9f206772657020766572696679204e575420e8aebae782b90a0a2d20e4bda0204a32202336373720636f6d6d6974206d736720e586992027323120726566207265666163746f722720e4bd862a2ae79c9f20677265702a2a3a2068617264636f646564206c69746572616c20602730613865393732332d2e2e2e2760202a2ae4bb8de59ca820736f7572636520e5a49ae6aca12a2a0a2d20e79c9f207665726966793a206067726570202d726e2027306138653937323327206b617369612d636f6e736f6c652f7372632f73657276696365732f62726f6b65722d2a2e6a736020e5ba94e8afa5e8bf94202a2a30206869742a2a20283d20e79c9fe588a0e5b9b2e58780292e20e78eb0e4bb8d20342b2068697420283d2062726f6b65722d616374696f6e2d7175657565202f2062726f6b65722d6273632d696e74616b65202f2062726f6b65722d6275792d636f6d706c6574696f6e202f2062726f6b65722d63616e63656c2d726566756e64292e0a0a232320766572646963740a0a2a2a412e332e312052454a4543542a2a20e28094207061747465726e20e99499e4bd8d2c20e6b2a1e79c9fe694b92068617264636f6465642e0a0a2a2a412e332e312e3120686f7466697820e5bf8520736869702a2a3a0a312e206062726f6b65722d636f6e6669672d7265736f6c7665722e6a736020e58aa0206067657442726f6b657252656c617949644f725468726f77282960206578706f727420287e3130204c4f43290a322e20332066696c6520e79c9fe694b920283d2062726f6b65722d616374696f6e2d71756575652e6a73202f2062726f6b65722d6273632d696e74616b652d776174636865722e6a73202f2062726f6b65722d6275792d636f6d706c6574696f6e2d776174636865722e6a73293a20e588a02060636f6e73742042524f4b45525f52454c41595f4944203d202e2e2e6020e8a18c2c20e694b92063616c6c207369746520e794a8206067657442726f6b657252656c617949644f725468726f7728296020287e33302d3530204c4f43290a332e206c696e742072756c652062616b65642066726f6d2073746172743a20604b492d36352d6e6f2d68617264636f6465642d62726f6b65722d6964602c206772657020602730613865393732332d2e2e2e2760206c69746572616c20e4bbbbe4bd95207372632f20e69687e4bbb620e28692206661696c20287e3130204c4f4320736372697074732f6c696e742d6b616e65742e6d6a73290a0a2323204e575420e79c9fe887aae58f8d0a0a412e33207761766520e68b86e68891207370656320e6b2a1e6988ee7a1ae20277061747465726e20e5bf8520313030252064656c6574652068617264636f646564272c204a32207368697020e6a8a1e7b38a207061747465726e2e20e68891207370656320e8afa5206578706c696369742e20e68e92e697a520414e54492d5041545445524e20e58aa03a2027636f6e6669672d64726976656e207265666163746f7220e5bf8520677265702076657269667920302068617264636f646564206c69746572616c20e7959920736f75726365272e0a0a404a3220e28094206669726520412e332e312e3120686f74666978202b20677265702076657269667920e79c9f20302068617264636f646564205555494420e6ae8be795992e0a0ae28094204e575420352f32322031303a313920e2809420412e332e3120e79c9f2050302072656a6563742c20686f7466697820626c6f636b20412e332e3220776176652032