他人检测/对齐报告 · 交叉核验结论

⛔ 本文档已归档(2026-09-09),现行以《当前工程状态文档》为准。
核验人:波波(方案 + 验收岗)· 2026-09-07 11:55 · 基线 commit cf4120c
方法:读完 10 份他人报告 → 逐项拿当前真实工程复验(不采信纸面结论)
结论摘要:6 份报告的结论已过期或部分失实,1 份审计的基底落后 63 个提交;同时坐实 1 处我上一轮的误判

一、核验总表

报告作者/时间纸面结论我复验的结论时效
M6-final-quality-report-v2.md小渔 09-07 10:4842 项问题(3C/19M/15m/5I)基底 a1f80bf 落后 HEAD 63 个提交,至少 F-3 已被 3ace656 修复⚠️ 部分过期
2026-09-03-总体进度审计与下阶段计划.md小齐 09-03 21:30生产 44/44 迁移、109 表对齐;BLK-008 已关账(7 PASS)属实(生产现 109 表、迁移 048)✅ 准确
C端接线验收自测清单-2026-09-04.md小冈施工/小齐验收A 类 33 页接真;B 类挂起页页脚在位勿接线属实,且推翻我上一轮对 oxygen-map/wish-wall 的误判✅ 准确
2026-09-04-B端H5激活盘点与规格.md一号(小齐打回重做版)25 页中仅 1 页真接线(PointTasks)已过时:实测真接线 9 页🔴 严重过期
WIP-160-静态稿20页对位gap分析文档.md一号 09-03(返工版)19 页全部无差距、无 L2 待建结论成立;但漏了后来 WIP-165 重写引入的业态边界冲突⚠️ 已被后续变更超越
前端硬编码清理报告.md09-01(B-025)L1 21 处 + L1 电话 5 处 + L2 4 处待迁点名项基本已清:假电话 0、「最好」0、价格硬编码 0✅ 已执行
前端设计核查清单.md v1.3小齐 08-3012 项打回:10 通过 / 2 打回(E1 尾巴 + C9 新页)E1 至今未清,但判据本身有误伤🔴 长期未结
REVIEW-2026-08-31-扣子代码验收.md(1761 行/47 轮)小齐二号五轮「完工不实」→ G 系列门禁升级 → 第六轮全绿门禁机制有效,二号已退场✅ 已结
验收记录-2026-09-01夜.md波波(我自己)一号 M2/M3 通过 + P1 回归 1 处我自己的旧账✅ 已结
进度体检报告-2026-09-01.md波波(我自己)fix/feat=0.90、docs 占 43%、「能量流向演示而非生产」第一刀已执行(BLK-001/002 均结);发现二仍部分成立⚠️ 半失效

二、🔴 更正我上一轮的三处误判

我昨天给的进度快照里有三条判断,被这些报告直接推翻:

更正 1:oxygen-map / wish-wall 不是「遗漏未砍」

我上一轮说这两页「仍在 app.json 注册(WIP-124 又加回)」,定性为 M1 判据 #6 未达标。

事实:docs/C端接线验收自测清单-2026-09-04.md §三 明确列它们在 B 类挂起清单——「页脚在位,勿接线」,同批还有 status-timeline/states、local、culture、pilgrimage、membership、feedback、address/address-edit、agreement、guide-community、scene-cert/scene-certificate。

→ 这是有意保留的静态演示态,不是漏砍。M1 判据 #6「砍 34 页」已被后续产品决策覆盖(部分页面从"砍"改为"挂起做演示")。判据该改,代码不该动。

更正 2:BLK-008 早已关账,不需要我代跑

我上一轮把「代跑 scripts/verify_wip172_emergency_contacts.sh」列为我能立刻干的事。

事实:小齐 09-03 审计报告 §2.1 已记 BLK-008 | WIP-172 P0 五步 E2E | 服务器代跑 7 PASS | 已关账。且整个 BLK 登记制已于 09-04 被刘总废止。

→ 我拿的是断档前的旧账。这条作废。

更正 3:merchant-hotel「预订房间」CTA 的性质

我上一轮说这是「业态边界被突破」,暗示有人主动加了预订功能。

事实:git log -S "预订房间" 定位到 9ede1ba feat(WIP-165): 01-55 段 33 页 mock 化完成——90/90 定稿页全部纯 mock 视觉版(零接口零依赖)。

→ 它是静态稿视觉还原的产物(照着设计稿画出来的按钮),不是业务功能变更。且已核实 merchant-hotel.ts 未接真接口(点下去无真实下单),页脚「静态演示 · 数据为虚构示例」仍在位。

🔴 下面这段「住宿仅展示」的定性是错误的,已被本节末「更正 4」推翻——保留原文仅作误判留痕,请勿引用。

但仍需裁决:住宿业态按义父定档应"仅展示",页面上摆一个「预订房间」按钮即使不接真,也是对用户的错误预期引导。属文案/交互层问题,不是数据层问题。修法很轻:改成「咨询入住」或直接删按钮,不需要动后端。


🔴🔴 更正 4(09-07 12:40 追加):上面这条「住宿仅展示」是我自己的第二次误判,源头是跨项目记忆污染

核验结果:「住宿业态仅展示」这个定档在神山秘境项目里根本不存在。

污染来源:「住宿/餐饮仅展示,门票/车队/特产走线上预约预定」是渔佳小程序(yujia-wxapp)的业态两档定档,记在我的用户级长期记忆里。我把它错当成神山秘境的定档搬了过来。两个项目合规结论恰恰相反:神山秘境住宿单元素券明确可线上直售(A 档零门槛)。

那 merchant-hotel 真问题是什么:不是「不该有预订按钮」,是功能死链——

merchant-hotel.wxml:35  「预订房间」按钮 → bindtap="goBooking"
merchant-hotel.ts:17    goBooking() → navigateTo('/pages/hotel-booking/hotel-booking')   ← 不带 product_id
hotel-booking.ts:5      import { createUnifiedOrder, precheckUnified } from '../../services/order'  ← 真接口页(WIP-199)
hotel-booking.wxml:9    wx:if="{{!productId}}" → 显示「缺少商品信息 / 从商品列表选择后预订」

实测全站没有任何页面带 product_id 跳 hotel-booking(4 处入口全无参;唯一带参跳 booking 类的是 product-detail.ts:92 → order-create?product_id=)。后端 precheck/create/pay 端点真实存在(miniapp_orders.py:343/366/758)。

→ 用户点「预订房间」必然掉进永远显示「缺少商品信息」的死胡同页。 这是断链,不是合规问题。裁决选项见《决策单》§三·②。

教训(已写入长期记忆):用户级长期记忆里的其他项目事实,绝不能当作当前项目的定档。凡引用「义父定档/已拍板」作为判据前,必须在本项目 docs/ 里找到原文出处,找不到就是我自己编的。


三、小渔审计报告(42 项)逐项时效核验

核心问题:审计基底 a1f80bf(09-04 10:01)落后当前 HEAD cf4120c(09-07 10:56)63 个提交。

已被后续提交修复的(审计没看到)

审计项审计说实测现状
F-3request.ts:20-28 unwrap 只认 {code,data},不认 {ok,data}✅ 已修:request.ts:22-24 现为 `if (('code' in boxed \\'ok' in boxed) && 'data' in boxed),注释明写「B-011 起新接口 {ok:true,data}——两种包装均解包到 data」。修复提交 3ace656`(09-05 01:27,小冈)
D5 部分settlement_ledger 与 settlement_records 并存,可能有废弃表需查引用数才能定,审计未给判据

仍然成立的(我逐项复验)

审计项复验证据判定
C-1 JWT_SECRET 硬编码默认值config.py:11 原文未变;生产 .env 无此键 → 实测跑默认值,伪造 token 签名通过🔴 活跃,我已实测坐实
C-2 APP_ENV 默认 devconfig.py:17 未加 fail-closed;生产 .env 有 APP_ENV=prod ✅🟡 代码风险仍在,生产配置正确
C-3 dev_id 登录无速率限制auth.py:16 if settings.env == "dev" and req.dev_id → 生产 env=prod 已禁用此路径🟢 生产实际不可利用(审计未区分配置态与代码态)
B-1 CORS 默认 ["*"]main.py:28 allow_origins=origins or ["*"];生产 .env 无 CORS_ORIGINS → 实际为 *🔴 活跃
B-3 _require_admin 的 phone is None 前置检查admin.py:10 if user["phone"] is None: 原文仍在🟠 未修
F-4 mockPay 无环境守卫order.ts:89-91 url: /api/miniapp/packages/admin/orders/${orderId}/mock-pay 无守卫🟠 未修
F-5 uploadFile 相对路径content-b.ts:312 wx.uploadFile({ 仍未拼 API_BASE🟠 未修
F-7 guest-archive 硬编码假数据guest-archive.ts:1 自注「定稿 91 mock 演示版」,:18「拉萨来的卓玛」🟠 未修(属有意演示态,需定性质)
W-1 FeatureFlags setTimeout 伪异步FeatureFlags.ts:51 await new Promise(resolve => setTimeout(resolve, 100));:44 仍是 // TODO: GET /api/config/feature-flags🟠 未修
W-2 token 前端 30 天 vs 后端 24hauth.ts:74 expiresDays = 30;config.py:12 jwt_ttl_hours=24🟠 未修,差距实测确认

审计的数据口径问题

审计说实测说明
数据库 76 张表生产 109 张 BASE TABLE76 = 仓库 backend/sql/*.sql 里 CREATE TABLE 去重计数。口径不含:ALTER TABLE 建的、早期迁移后被 DROP 重建的、seed_content.sql 的
47 个迁移文件仓库 48 个 .sql(含 seed_content.sql,实际编号迁移 001-049)生产已落 048,staging 已落 049
小程序 120 个页面pages/ 目录 119 个;app.json 注册 118 条差 1 = 有目录未注册(死代码)
B 端 H5 23 个路由src/pages/*.tsx = 25 个与一号盘点一致(24 命名路由 + 1 兜底)

→ 审计的基础数据是静态读仓库得出,未连生产库/staging 实测。表数差 33 张这个量级,会导致「D-5 废弃表」这类结论的判断基础不稳。


四、B 端 H5 激活状态:盘点已严重过期

一号的盘点(09-04 01:3x)说「25 页中 1 页真接线」。我用修正判据实测(并做了自检):

【自检】Bills.tsx(已知真接线)命中 = 3 → ✅判据有效
状态页数清单
✅ 真接线9Login PointTasks Bills Orders Workbench Transport Redeem RedeemConfirm DemandDetail
⚠️ 未接线/诚实降级16AttributionBoard DemandHall MyDemands PackageBuilder ProductEdit Profile RedeemBoard RentalOrders RentalWorkbench SessionManage ShareCard StallShop SupplierApply SupplierProducts SupplierQuestionnaire VehiclePackage

对照盘点规格的 M1-M6 激活序列:

里程碑盘点时现状判定
M1 登录与身份未做Login.tsx ✅ 接线;App.tsx:49 已改 useState(() => isLoggedIn()) 从 token 恢复;auth.ts:55-76 已实现 expiresAt 持久化✅ 已完成
M2 工作台与财务未做Workbench.tsx ✅;Bills.tsx ✅(URL 双错已改对 /workbench/bills,且按 WIP-193 返工❻改用 params 查询串避免 GET 带 body 抛 TypeError);StallShop ❌;Profile ⚠️(只 import auth 未调接口)🟡 大部分完成
M3 订单与核销未做Orders.tsx ✅;Redeem.tsx ✅;RedeemConfirm.tsx ✅;RedeemBoard.tsx ❌🟡 3/4 完成
M4 商品与套餐未做VehiclePackage ❌;PackageBuilder ❌🔴 未动
M5 需求与营销未做DemandDetail.tsx ✅;DemandHall ❌;MyDemands ❌🟡 部分
M6 缺口等后端未做Transport 已接 C 端只读端点;SessionManage/Rental×2/Attribution/ShareCard/Supplier×4 ❌🔴 后端缺口未解

盘点 §六「已知问题」的修复情况:

#问题现状
1App.tsx 登录门刷新丢失✅ 已修(useState(() => isLoggedIn()))
2Network.ts 无 !res.ok 分支❌ 未修(Network.ts 只有 :56 一处 window.location.reload(),正是审计 w-2 批评的粗暴刷新)
3Bills 注释调用 URL 双错✅ 已修
4PointTasks flag 默认关❌ 未确认(FeatureFlags.ts:51 仍 setTimeout 伪异步,flag 走本地默认值)
5深层页无导航入口❌ 未处理
6packages admin 身份要求未确认❌ 未确认

五、E1「模拟用户五人集」:08-30 打回至今未清,但判据本身有误伤

小齐 v1.3 验收(08-30 00:50)打回项 E1 要求:游客小张 / 领队扎西 / 商户古格 / 旅行社林芝 / 员工小普,全站统一替换;禁用「卓玛/扎西次仁/小初」。

09-07 实测:

名字计数判定
扎西次仁0✅ 已清
小初0✅ 已清
卓玛7⚠️ 见下分析
小张2✅ 在用(mock/user.ts、utils/auth.ts)
扎西8✅ 在用
古格18✅ 在用
林芝0🔴 全站缺席(旅行社角色从未落地)
小普0🔴 全站缺席(平台员工角色从未落地)
阿里户外旅行社0✅ 已清(E2 达标)

「卓玛」7 处逐条定性 —— 4 处是判据误伤

位置内容性质
utils/texts.ts:876「完成「卓玛拉垭口」打卡并走完全程后…」✅ 地名(Dolma La Pass,转山线 5630m 真实垭口),必须保留
oxygen-map.ts:13「卓玛拉垭口救助点」✅ 地名
status-timeline.ts:15「卓玛拉垭口翻越 · alt 5630 · 全程最难点」✅ 地名
scene-cert.ts:9points: ['塔尔钦镇入口','曲古寺','止热寺','卓玛拉垭口']✅ 地名
redeem-log.ts:18operator: '卓玛'(核销操作员)🔴 真违规(人名,应改小普)
workbench-settings.ts:14{ icon: '卓', name: '卓玛', role: 'manager' }🔴 真违规(员工人名)
guest-archive.ts:18{ name: '拉萨来的卓玛' }🔴 真违规(客人名,且此页是审计 F-7 的硬编码假数据页)

→ 真违规 3 处,地名误伤 4 处。小齐打回时写「卓玛仍残留 7 页」,没区分人名与地名——这跟禁词判据 唯一/第一/预订 是同一类毛病:判据粒度太粗,把合法用法一并拦了。

建议:E1 判据改为「卓玛」后不接「拉垭口」才算违规;或直接改成扫描 operator:/name:/role: 等字段上下文。


六、前端硬编码清理报告(B-025):已基本执行完毕

09-01 报告点名的项,09-07 实测:

报告点名实测判定
merchant-hotel.wxml:92「城堡酒店是塔钦最好的住宿」grep「最好」= 0✅ 已清(同时消掉一个禁词命中)
sos.ts:48 救援电话 13800138000grep = 0✅ 已清
sos.ts:112 客服 4001234567grep = 0✅ 已清
trip-detail.ts:45 400-123-4567grep = 0✅ 已清
merchant-hotel.ts:47 0897-1234567grep = 0✅ 已清
profile.ts:111,115 领队电话 13888188888grep = 0✅ 已清
selection.ts:53,67,81,96 价格 200/680/380/280grep = 0✅ 已清
L1 专名(塔钦/门士/札达)剩 1 处:transport-session-manage.wxml:49 placeholder="如:塔钦→哲热普寺"✅ 合理(表单占位示例,非运营数据)
报告依赖:site_config 接口前后端都已建:services/site.ts:15 getSiteConfig() + backend/app/routers/miniapp_site.py;utils/texts.ts:1288 loadSiteTexts();home.ts:2 注「参数全部来自 config/weather-fx(site_config.weather_fx 下发后覆盖)」✅ 已落地

→ 这份报告是 10 份里执行最彻底的一份,验收标准 §六 的 5 条里 2/3/5 已达标,4(断网缓存模拟)未验。

⚠️ 但报告 §四写明「mock/ 目录下的硬编码属提审数据策略 B-023 设施,不在清理范围」——这条豁免与审计 F-7「guest-archive 硬编码假数据」直接冲突:guest-archive 的假数据在 pages/ 下而非 mock/ 下,不在豁免范围。


七、WIP-160 gap 分析:结论成立,但已被后续变更超越

一号返工版(09-03 02:40)结论:19 页全部无差距、无 L2 待建接口,且诚实记录了返工原因——「原『待建接口清单』6 条至少 5 条已建成,差集核对未做全库 grep,凭旧记忆写清单(WIP-149 同款教训再犯)」。

复验:结论成立(merchant-hotel/guge 经 WIP-158 改造后确与静态稿对齐)。

但:这份 gap 分析的对位基准是 09-03 01:55 的仓库状态,而 09-03 白天刘总派了 WIP-165「以静态稿为唯一视觉源头,C 端前端页面 wxml/wxss 从头重写」(9ede1ba 90/90 页纯 mock 视觉版)。

→ 重写之后 gap 分析的结论自动失效:静态稿成了源头,前端照着重画,「无差距」变成了同义反复(自己对自己)。而重写引入的新问题(如「预订房间」CTA、页脚治理、workbench-home 假数据)不在原 gap 清单里,是 WIP-172/175/179 在收拾的债。


八、我自己的《进度体检报告 09-01》半失效核对

我 09-01 给刘总的体检报告提了「三刀」,现在回看:

三刀执行情况
第一刀:冻结演示文档 + 清生产三断点(BLK-001→002→007)✅ 已执行:APP_ENV=prod ✅、B1 生产关窗部署 ✅、post-receive 钩子在跑 ✅
第二刀:小齐回归协调席、施工/验收分离🟡 反向发展:小齐 09-05 因额度不足整体移交小冈;二号已退场(完工不实 3 次)
第三刀:总纲回扫✅ 部分执行:dafce1e 09-04 23:34「锚定方案 v0.9.2 + 协议 v2.2.5 三层分离定案回扫」

发现二「能量流向演示而非生产」是否仍成立?

fix/feat 指标复算(09-01 那条批评的量化验证)

我 09-01 用 fix/feat 比(git log --grep 分类计数)批评「返工率高」,当时值 0.90。分三个时段复算:

时段提交数fix/featdocs 占比阶段性质
起 → 09-012080.9043%铺量期:每写 1 个新功能要补 0.9 个修复
09-01 → 09-047040.8140%爆发期:产出提速,返工率略降
09-04 → 09-07631.2266%补缝收尾期:修的多于写的,文档占 2/3

读法(不能简单说"变坏了"):


九、汇总:需要义父裁决的(基于全部报告交叉后)

#事项依据
1P0:生产补 JWT_SECRET + CORS_ORIGINS小渔 C-1 + B-1,我已实测坐实(伪造签名通过,68 组合可遍历,含 4 admin)
2小渔 42 项审计需重新对基线复跑基底落后 63 提交,F-3 已修;表数口径错(76 vs 109)→ 直接派工会派错活
3小渔是否纳入 AGENTS §9.2 登记表新 agent 已推 main 但身份未登记
4workbench-home feeds 涉钱假数据页脚已删(WIP-175)但 feeds mock 仍真渲染 → 失去免责声明,撞 mock 红线
5merchant-hotel「预订房间」CTAWIP-165 视觉还原产物,住宿按定档应"仅展示" → 改文案即可,不动后端
6E1 五人集:林芝/小普全站缺席 + 卓玛真违规 3 处08-30 打回至今 8 天未清
7判据粒度问题(E1 卓玛 + M1 禁词)同类都把地名/序数词/免责声明/合规注释判成违规,建议统一改短语级 + 排除注释
8M1/M2 ROADMAP 判据重定基线28 页判据 vs 118 页现状;M2 验收日 09-17(距今 10 天)
9B 端 H5 M4/M5/M6 是否开工M1-M3 已基本完成(9 页真接线),M4-M6 卡在后端缺口③⑥⑦(suppliers.py 不存在、租赁/归因/分享零端点)
10Network.ts 无 !res.ok 分支盘点 §六 已知问题 #2,至今未修;401 走 window.location.reload() 强刷

附:本次核验的复现命令

cd /Users/lean/dev/kailash-bobo

# 审计基底落后多少
git log --oneline a1f80bf..HEAD | wc -l          # → 63

# F-3 是否已修
grep -n "ok.*in boxed" miniprogram/miniprogram/utils/request.ts

# B 端真接线统计(判据带自检,防假阴性)
python3 - <<'PY'
import os,io,re
D="b-workbench/src/pages"
strip=lambda s:"\n".join(l for l in s.splitlines() if not l.strip().startswith(("//","*","/*")))
calls=lambda s:len(re.findall(r"request\s*[<(]",strip(s),re.S))+len(re.findall(r"\bfetch\s*\(",strip(s)))
print("自检 Bills =",calls(io.open(D+"/Bills.tsx",encoding="utf-8").read()))  # 必须 >0
for f in sorted(os.listdir(D)):
    if f.endswith(".tsx"):
        s=io.open(os.path.join(D,f),encoding="utf-8").read()
        if calls(s)>0 and re.search(r"from\s+['\"]\.\.?/(services|utils/auth)",s): print("✅",f)
PY

# E1 五人集 + 卓玛人名/地名分离
grep -rn "卓玛" miniprogram/miniprogram/ --include="*.wxml" --include="*.ts"

# 生产表数口径(审计说 76,实际 109)
ssh kailash "docker exec kailash-pg psql -U yos -d kailash -t -A -c \
  \"SELECT count(*) FROM information_schema.tables WHERE table_schema='public' AND table_type='BASE TABLE';\""