⛔ 本文档已归档(2026-09-09),现行以《当前工程状态文档》为准。
核验人:波波(方案 + 验收岗)· 2026-09-07 11:55 · 基线 commit cf4120c
方法:读完 10 份他人报告 → 逐项拿当前真实工程复验(不采信纸面结论)
结论摘要:6 份报告的结论已过期或部分失实,1 份审计的基底落后 63 个提交;同时坐实 1 处我上一轮的误判
| 报告 | 作者/时间 | 纸面结论 | 我复验的结论 | 时效 |
|---|---|---|---|---|
M6-final-quality-report-v2.md | 小渔 09-07 10:48 | 42 项问题(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 重写引入的业态边界冲突 | ⚠️ 已被后续变更超越 |
前端硬编码清理报告.md | 09-01(B-025) | L1 21 处 + L1 电话 5 处 + L2 4 处待迁 | 点名项基本已清:假电话 0、「最好」0、价格硬编码 0 | ✅ 已执行 |
前端设计核查清单.md v1.3 | 小齐 08-30 | 12 项打回: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 均结);发现二仍部分成立 | ⚠️ 半失效 |
我昨天给的进度快照里有三条判断,被这些报告直接推翻:
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 页」已被后续产品决策覆盖(部分页面从"砍"改为"挂起做演示")。判据该改,代码不该动。
我上一轮把「代跑 scripts/verify_wip172_emergency_contacts.sh」列为我能立刻干的事。
事实:小齐 09-03 审计报告 §2.1 已记 BLK-008 | WIP-172 P0 五步 E2E | 服务器代跑 7 PASS | 已关账。且整个 BLK 登记制已于 09-04 被刘总废止。
→ 我拿的是断档前的旧账。这条作废。
merchant-hotel「预订房间」CTA 的性质我上一轮说这是「业态边界被突破」,暗示有人主动加了预订功能。
事实:git log -S "预订房间" 定位到 9ede1ba feat(WIP-165): 01-55 段 33 页 mock 化完成——90/90 定稿页全部纯 mock 视觉版(零接口零依赖)。
→ 它是静态稿视觉还原的产物(照着设计稿画出来的按钮),不是业务功能变更。且已核实 merchant-hotel.ts 未接真接口(点下去无真实下单),页脚「静态演示 · 数据为虚构示例」仍在位。
🔴 下面这段「住宿仅展示」的定性是错误的,已被本节末「更正 4」推翻——保留原文仅作误判留痕,请勿引用。
但仍需裁决:住宿业态按义父定档应"仅展示",页面上摆一个「预订房间」按钮即使不接真,也是对用户的错误预期引导。属文案/交互层问题,不是数据层问题。修法很轻:改成「咨询入住」或直接删按钮,不需要动后端。
核验结果:「住宿业态仅展示」这个定档在神山秘境项目里根本不存在。
docs/ 搜「住宿 + 仅展示/只展示/不下单/禁预订/不接真」→ 0 命中小程序静态演示页面需求文档.md:484「零价格零预订」约束的是攻略种草内容页;B-011:120「仅展示信息」是 offline_direct_flag=true 时的注脚文案蓝图(商户可配置属性,非全局禁令)docs/三价体系与组包责任边界.md:111 A 档「单元素券(一间房 / 一张温泉票 / 一趟车)→ 商品预售,非包价 → ✅ 平台自营可直售」:337「单元素券(住宿 / 温泉 / 门票 / 餐饮 / 车队)→ 落点一(C 端)→ ✅ 保留」:342「平台自营(酒店 / 温泉 / 门票)→ ✅ 以单元素券形式售卖,不打包」:640「单元素券(住宿/餐饮/门票/背夫/马帮)→ ✅ 可跑,第 2 档,不需许可」污染来源:「住宿/餐饮仅展示,门票/车队/特产走线上预约预定」是渔佳小程序(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/ 里找到原文出处,找不到就是我自己编的。
核心问题:审计基底 a1f80bf(09-04 10:01)落后当前 HEAD cf4120c(09-07 10:56)63 个提交。
| 审计项 | 审计说 | 实测现状 | ||
|---|---|---|---|---|
| F-3 | request.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 默认 dev | config.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 后端 24h | auth.ts:74 expiresDays = 30;config.py:12 jwt_ttl_hours=24 | 🟠 未修,差距实测确认 |
| 审计说 | 实测 | 说明 |
|---|---|---|
| 数据库 76 张表 | 生产 109 张 BASE TABLE | 76 = 仓库 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 废弃表」这类结论的判断基础不稳。
一号的盘点(09-04 01:3x)说「25 页中 1 页真接线」。我用修正判据实测(并做了自检):
【自检】Bills.tsx(已知真接线)命中 = 3 → ✅判据有效
| 状态 | 页数 | 清单 |
|---|---|---|
| ✅ 真接线 | 9 | Login PointTasks Bills Orders Workbench Transport Redeem RedeemConfirm DemandDetail |
| ⚠️ 未接线/诚实降级 | 16 | AttributionBoard 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 ❌ | 🔴 后端缺口未解 |
盘点 §六「已知问题」的修复情况:
| # | 问题 | 现状 |
|---|---|---|
| 1 | App.tsx 登录门刷新丢失 | ✅ 已修(useState(() => isLoggedIn())) |
| 2 | Network.ts 无 !res.ok 分支 | ❌ 未修(Network.ts 只有 :56 一处 window.location.reload(),正是审计 w-2 批评的粗暴刷新) |
| 3 | Bills 注释调用 URL 双错 | ✅ 已修 |
| 4 | PointTasks flag 默认关 | ❌ 未确认(FeatureFlags.ts:51 仍 setTimeout 伪异步,flag 走本地默认值) |
| 5 | 深层页无导航入口 | ❌ 未处理 |
| 6 | packages admin 身份要求未确认 | ❌ 未确认 |
小齐 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 达标) |
| 位置 | 内容 | 性质 |
|---|---|---|
utils/texts.ts:876 | 「完成「卓玛拉垭口」打卡并走完全程后…」 | ✅ 地名(Dolma La Pass,转山线 5630m 真实垭口),必须保留 |
oxygen-map.ts:13 | 「卓玛拉垭口救助点」 | ✅ 地名 |
status-timeline.ts:15 | 「卓玛拉垭口翻越 · alt 5630 · 全程最难点」 | ✅ 地名 |
scene-cert.ts:9 | points: ['塔尔钦镇入口','曲古寺','止热寺','卓玛拉垭口'] | ✅ 地名 |
redeem-log.ts:18 | operator: '卓玛'(核销操作员) | 🔴 真违规(人名,应改小普) |
workbench-settings.ts:14 | { icon: '卓', name: '卓玛', role: 'manager' } | 🔴 真违规(员工人名) |
guest-archive.ts:18 | { name: '拉萨来的卓玛' } | 🔴 真违规(客人名,且此页是审计 F-7 的硬编码假数据页) |
→ 真违规 3 处,地名误伤 4 处。小齐打回时写「卓玛仍残留 7 页」,没区分人名与地名——这跟禁词判据 唯一/第一/预订 是同一类毛病:判据粒度太粗,把合法用法一并拦了。
建议:E1 判据改为「卓玛」后不接「拉垭口」才算违规;或直接改成扫描 operator:/name:/role: 等字段上下文。
09-01 报告点名的项,09-07 实测:
| 报告点名 | 实测 | 判定 |
|---|---|---|
merchant-hotel.wxml:92「城堡酒店是塔钦最好的住宿」 | grep「最好」= 0 | ✅ 已清(同时消掉一个禁词命中) |
sos.ts:48 救援电话 13800138000 | grep = 0 | ✅ 已清 |
sos.ts:112 客服 4001234567 | grep = 0 | ✅ 已清 |
trip-detail.ts:45 400-123-4567 | grep = 0 | ✅ 已清 |
merchant-hotel.ts:47 0897-1234567 | grep = 0 | ✅ 已清 |
profile.ts:111,115 领队电话 13888188888 | grep = 0 | ✅ 已清 |
selection.ts:53,67,81,96 价格 200/680/380/280 | grep = 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/ 下,不在豁免范围。
一号返工版(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 给刘总的体检报告提了「三刀」,现在回看:
| 三刀 | 执行情况 |
|---|---|
| 第一刀:冻结演示文档 + 清生产三断点(BLK-001→002→007) | ✅ 已执行:APP_ENV=prod ✅、B1 生产关窗部署 ✅、post-receive 钩子在跑 ✅ |
| 第二刀:小齐回归协调席、施工/验收分离 | 🟡 反向发展:小齐 09-05 因额度不足整体移交小冈;二号已退场(完工不实 3 次) |
| 第三刀:总纲回扫 | ✅ 部分执行:dafce1e 09-04 23:34「锚定方案 v0.9.2 + 协议 v2.2.5 三层分离定案回扫」 |
发现二「能量流向演示而非生产」是否仍成立?
workbench-home 出现「页脚删了假数据没删」我 09-01 用 fix/feat 比(git log --grep 分类计数)批评「返工率高」,当时值 0.90。分三个时段复算:
| 时段 | 提交数 | fix/feat | docs 占比 | 阶段性质 |
|---|---|---|---|---|
| 起 → 09-01 | 208 | 0.90 | 43% | 铺量期:每写 1 个新功能要补 0.9 个修复 |
| 09-01 → 09-04 | 704 | 0.81 | 40% | 爆发期:产出提速,返工率略降 |
| 09-04 → 09-07 | 63 | 1.22 | 66% | 补缝收尾期:修的多于写的,文档占 2/3 |
读法(不能简单说"变坏了"):
| # | 事项 | 依据 |
|---|---|---|
| 1 | P0:生产补 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 但身份未登记 |
| 4 | workbench-home feeds 涉钱假数据 | 页脚已删(WIP-175)但 feeds mock 仍真渲染 → 失去免责声明,撞 mock 红线 |
| 5 | merchant-hotel「预订房间」CTA | WIP-165 视觉还原产物,住宿按定档应"仅展示" → 改文案即可,不动后端 |
| 6 | E1 五人集:林芝/小普全站缺席 + 卓玛真违规 3 处 | 08-30 打回至今 8 天未清 |
| 7 | 判据粒度问题(E1 卓玛 + M1 禁词)同类 | 都把地名/序数词/免责声明/合规注释判成违规,建议统一改短语级 + 排除注释 |
| 8 | M1/M2 ROADMAP 判据重定基线 | 28 页判据 vs 118 页现状;M2 验收日 09-17(距今 10 天) |
| 9 | B 端 H5 M4/M5/M6 是否开工 | M1-M3 已基本完成(9 页真接线),M4-M6 卡在后端缺口③⑥⑦(suppliers.py 不存在、租赁/归因/分享零端点) |
| 10 | Network.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';\""