⛔ 本文档已归档(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 列 | PASS | SELECT 已含 is_test |
| A1 根因 — 5 端点统一改完 | PASS | 5/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-unwrap | WARN (7 处) | scene-cards W1-W2, products W3-W5, product-detail W6, safety W7 |
综合: PASS 10 项 + FAIL 1 项(P1) + WARN 1 项(P2)
# security.py L33
"SELECT id, openid, phone, nickname, status, token_version, is_test FROM users WHERE id=$1"
| 文件 | 原写法 | 现写法 | 判定 |
|---|---|---|---|
| demand.py:373 | startswith("dev_") | pool.fetchrow("SELECT is_test FROM users WHERE id=$1", ...) | PASS |
| merchant_console.py:440 | startswith("dev_") | pool.fetchrow("SELECT is_test FROM users WHERE id=$1", ...) | PASS |
| kora_routes.py:46 | startswith("dev_") | _is_test(pool, user_id) 查询 DB | PASS |
| scenes.py:36 | startswith("dev_") | _is_test(conn, user_id) 查询 DB | PASS |
| emergency_contacts.py:28 | startswith("dev_") | _is_test(pool, user_id) 查询 DB | PASS |
merchant_console.py L502 保留 startswith("dev_") 为微信支付鉴权(dev openid 不走真实支付),非 A1 范畴,合理。
050 迁移无 UPDATE/INSERT 回填历史用户。auth.py 有"重新登录后补标"逻辑,但依赖用户被动触发。
$ 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)
NOW.md 已确认:
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 | 函数数 | 判定 |
|---|---|---|
| user.ts | 11 | ALL PASS |
| order.ts | 14 | ALL PASS |
| message.ts | 8 | ALL PASS |
| merchant.ts | 8 | ALL PASS |
| status.ts | 3 | ALL PASS |
| site.ts | 1 | ALL PASS |
| calendar.ts | 2 | ALL PASS |
| admin.ts | 13 | ALL PASS |
| bills.ts | 4 | ALL PASS |
| workbench-redeem.ts | 6 | ALL PASS |
| redemption.ts | 2 | ALL PASS |
| content-b.ts | 24 | ALL PASS |
| scene-judge.ts | 2 | ALL PASS |
| feed.ts | 12 | ALL PASS |
| distribution.ts | 10 | ALL PASS |
| kora-routes.ts | 5 | ALL PASS |
| product.ts(旧版) | 5 | ALL PASS |
| demand.ts | 6 | ALL PASS |
| products.ts(新版) | 6 | PASS(类型声明冗余但运行时安全) |
| scene-cards.ts | 6 | PASS(2 处冗余 double-unwrap) |
| safety.ts | 5 | PASS(注释过时但功能正确) |
| merchant-console.ts | 5 | PASS(reviewTask 返回 {ok} 路径需关注) |
| api-adapters.ts | 6 | ALL PASS |
| # | 文件:行 | 问题 | 风险 |
|---|---|---|---|
| W1 | scene-cards.ts:217-221 | unwrap 后再 .data | 低 |
| W2 | scene-cards.ts:230-235 | unwrap 后再 .data | 低 |
| W3 | products.ts:30-34 | 类型声明 {code,data} 与 unwrap 后不匹配 | 类型错误,运行时安全 |
| W4 | products.ts:38 | 返回类型含 {code?,data?} 冗余 | 类型错误,运行时安全 |
| W5 | products.ts:91-92 | .then(d => d.data ? d.data : d) 冗余 | 运行时安全 |
| W6 | product-detail.ts:56 | d && d.data ? d.data : d 冗余 | 运行时安全 |
| W7 | safety.ts:6-7 | 注释 "unwrap 只解 {code,data}" 已过时 | 无运行时影响 |
A1 根因修复到位(PASS),WIP-224 清理到位(PASS),051 记账到位(PASS),unwrap 兼容性修复到位(PASS 68/72,WARN 7 处冗余但安全)。
唯一未修项:种子用户一次性回填 SQL 缺失(P1,依赖重新登录被动触发)。
*报告结束。署名:小渔 2026-09-07*