WIP-206 修复后复检报告 — 小渔

⛔ 本文档已归档(2026-09-09),现行以 docs/reports/WIP-206-audit-v4.md 为准。
复检日期: 2026-09-07 22:0x
范围: A1 根因 + WIP-224 + 051 记账 + unwrap 族逐页比对
基线: 刚 fetch 最新 main(含 WIP-224/WIP-217/WIP-220 修复)

一、总汇表

复检项判定详情
A1 根因 — security.py is_test 列PASSSELECT 已含 is_test
A1 根因 — 5 端点统一改完PASS5/5 全改用 user["is_test"] 或 _is_test() 函数
A1 根因 — 种子用户回填FAIL(P1)无一次性回填 SQL,依赖重新登录被动触发
WIP-224 — redeem-log 涉钱假数据PASS零命中
WIP-224 — workbench-settings 硬编码人名PASS零命中
WIP-224 — auth.ts mock_token_PASS仅注释说明,函数体无 fallback
051 — service_fee_records 生产列数PASS生产 12 列
051 — 台账 51 条PASS台账已补齐
unwrap — request.ts 双信封兼容PASS同时识别 {code,data} 和 {ok,data}
unwrap — 72 个 service 函数PASS (68/72)核心路径无问题
unwrap — 冗余 double-unwrapWARN (7 处)scene-cards W1-W2, products W3-W5, product-detail W6, safety W7

综合: PASS 10 项 + FAIL 1 项(P1) + WARN 1 项(P2)


二、A1 根因复检

PASS: security.py is_test 列已补

# security.py L33
"SELECT id, openid, phone, nickname, status, token_version, is_test FROM users WHERE id=$1"

PASS: 5 端点全部改完

文件原写法现写法判定
demand.py:373startswith("dev_")pool.fetchrow("SELECT is_test FROM users WHERE id=$1", ...)PASS
merchant_console.py:440startswith("dev_")pool.fetchrow("SELECT is_test FROM users WHERE id=$1", ...)PASS
kora_routes.py:46startswith("dev_")_is_test(pool, user_id) 查询 DBPASS
scenes.py:36startswith("dev_")_is_test(conn, user_id) 查询 DBPASS
emergency_contacts.py:28startswith("dev_")_is_test(pool, user_id) 查询 DBPASS

merchant_console.py L502 保留 startswith("dev_") 为微信支付鉴权(dev openid 不走真实支付),非 A1 范畴,合理。

FAIL: 种子用户回填缺失

050 迁移无 UPDATE/INSERT 回填历史用户。auth.py 有"重新登录后补标"逻辑,但依赖用户被动触发。


三、WIP-224 复检

$ grep -rn "K20260901042\|K20260831021\|古格川菜馆" .../pages/redeem-log/ --include="*.ts"
(0 matches)

$ grep -rn "K20260901042\|K20260831021\|古格川菜馆" .../pages/workbench-settings/ --include="*.ts"
(0 matches)

$ grep -rn "mock_token_\|游客小张" .../utils/auth.ts
(1 match — 仅注释说明删除,函数体无 fallback)

四、051 记账复检

NOW.md 已确认:


五、unwrap 族逐页比对

request.ts unwrap 逻辑(L20-29)

function unwrap<T>(payload: unknown): T {
  const boxed = payload as { code?: unknown; ok?: unknown; data?: unknown }
  if (('code' in boxed || 'ok' in boxed) && 'data' in boxed) {
    return boxed.data as T
  }
  return payload as T
}

同时识别 {code,data} 和 {ok,data},兼容性已修复。

全量 Service 审计(72 个函数)

Service函数数判定
user.ts11ALL PASS
order.ts14ALL PASS
message.ts8ALL PASS
merchant.ts8ALL PASS
status.ts3ALL PASS
site.ts1ALL PASS
calendar.ts2ALL PASS
admin.ts13ALL PASS
bills.ts4ALL PASS
workbench-redeem.ts6ALL PASS
redemption.ts2ALL PASS
content-b.ts24ALL PASS
scene-judge.ts2ALL PASS
feed.ts12ALL PASS
distribution.ts10ALL PASS
kora-routes.ts5ALL PASS
product.ts(旧版)5ALL PASS
demand.ts6ALL PASS
products.ts(新版)6PASS(类型声明冗余但运行时安全)
scene-cards.ts6PASS(2 处冗余 double-unwrap)
safety.ts5PASS(注释过时但功能正确)
merchant-console.ts5PASS(reviewTask 返回 {ok} 路径需关注)
api-adapters.ts6ALL PASS

WARN 列表(7 处冗余 double-unwrap)

#文件:行问题风险
W1scene-cards.ts:217-221unwrap 后再 .data低
W2scene-cards.ts:230-235unwrap 后再 .data低
W3products.ts:30-34类型声明 {code,data} 与 unwrap 后不匹配类型错误,运行时安全
W4products.ts:38返回类型含 {code?,data?} 冗余类型错误,运行时安全
W5products.ts:91-92.then(d => d.data ? d.data : d) 冗余运行时安全
W6product-detail.ts:56d && d.data ? d.data : d 冗余运行时安全
W7safety.ts:6-7注释 "unwrap 只解 {code,data}" 已过时无运行时影响

六、结论

A1 根因修复到位(PASS),WIP-224 清理到位(PASS),051 记账到位(PASS),unwrap 兼容性修复到位(PASS 68/72,WARN 7 处冗余但安全)。

唯一未修项:种子用户一次性回填 SQL 缺失(P1,依赖重新登录被动触发)。

*报告结束。署名:小渔 2026-09-07*