🗄 已归档快照(2026-09-13 文档时效治理):本文件为历史阶段设计快照,最新口径以 docs/contracts/api-v1.3-matrix.md、docs/plans/2026-09-14-白标化内核抽取-两实例对比.md 及 TASKS 现行为准。设计思路仍可参考,数据与结论已过时。
波波(方案 + 验收岗)· 2026-09-07 12:35 · 基线 commit cf4120c
授权范围:义父 12:25「10 项问题可以授权给你处理,哪个必须我决策就给我详细描述一下」
| # | 事项 | 谁拍 | 状态 |
|---|---|---|---|
| 1 | 生产补 JWT_SECRET + CORS_ORIGINS | 波波可执行 | ✅ 已完成并验证(见 §一) |
| 3 | 小渔纳入 AGENTS §9.2 登记表 | 波波可执行 | 🟢 已备好改法,等一次 push(见 §五) |
| 7 | 判据粒度修订(E1 卓玛 + M1 禁词) | 波波可执行 | 🟢 已备好新判据,等一次 push(见 §五) |
| 2 | 小渔 42 项审计重新对基线复跑 | 义父决策(额度) | 见 §二·A |
| 6 | E1 五人集清偿 | 义父决策(派谁) | 见 §二·B |
| 10 | Network.ts 无 !res.ok 分支 | 义父决策(派谁) | 见 §二·C |
| 4 | workbench-home 假数据 | 🔴 义父决策(合规红线) | 见 §三·① |
| 5 | merchant-hotel「预订房间」 | 🔴 义父决策(我上轮定性错了) | 见 §三·② |
| 8 | ROADMAP M1/M2 判据重定基线 | 🔴 义父决策(里程碑) | 见 §三·③ |
| 9 | B 端 H5 M4-M6 是否开工 | 🔴 义父决策(资源+业务) | 见 §三·④ |
必须你亲自拍的只有 4 项(#4 #5 #8 #9)+ 3 项要你说一句话(#2 #6 #10)。其余 3 项我已处理或已备好。
授权到手即执行,全程密钥在服务器端生成、不回显、不入 git(AGENTS §2 铁律 6)。
动作:
/srv/kailash/.env → .env.bak.20260907-1230(权限 600 保留)openssl rand -hex 32 服务器端生成,长度校验 = 64 字符 ✅,确认不含 dev-secret-change-me ✅)JWT_SECRET=<64位随机hex>CORS_ORIGINS=https://doc.kailashi.cn,https://kailashi.cn,https://www.kailashi.cn,https://kailash.media,https://www.kailash.media,https://doc.kailash.mediaserver_name 全清单实测(kailash.media.conf + doc.kailashi.cn.conf + api.kailashi.cn)docker compose up -d --no-deps --no-build app(没用 docker restart——铁律:restart 不注入 env_file)验证(四项全绿):
| 验证 | 修复前 | 修复后 |
|---|---|---|
① 默认密钥伪造 token 打内网 :8088 | 401「凭证已失效」= 签名通过 🔴 | 401「无效凭证」= 签名被拒 ✅ |
② 同一 token 打公网 api.kailashi.cn | — | 401「无效凭证」✅ |
③ CORS 白名单 Origin doc.kailashi.cn | * | access-control-allow-origin: https://doc.kailashi.cn ✅ |
④ CORS 非白名单 evil.example.com | *(放行) | 无 allow-origin 头 = 已拒绝 ✅ |
⑤ /health | ok | {"ok":true,"app":"shenshan","version":"0.1.0"} ✅ |
| ⑥ 冒烟 | 26/26(staging) | 25/26(生产容器内跑 staging 脚本) |
⚠️ 那 1 项 FAIL 与本次改动无关:func:notify_batch_redeem_progress(N4) 报 merchant_id=7 不在 merchants 表——是小冈 09-07 已登记「属 backend 域(闸门仅 aren/xiaoqi)→ 派阿仁」的参数化项,脚本硬编码了 staging 的商户 ID,在生产库里不存在。非回归。
影响面(需你知悉,不需处理):34 名用户下次请求即 token 失效 → 小程序 checkLoginValid() 走 catch → clearToken() → 重新微信登录,无死循环风险(已核 auth.ts:114-127)。B 端 H5 侧 auth.ts 有 expiresAt 持久化,会跳登录页重登。
残留代码风险(未动,属小齐/阿仁域):config.py:11/17 仍是 os.getenv("JWT_SECRET","dev-secret-change-me")、APP_ENV 默认 dev,无 fail-closed。即:配置对了但代码没兜底,将来谁重建容器忘了带 env_file 就又裸奔。修法 = 生产环境缺键直接 raise。这是 #2 审计里 C-1/C-2 的根,建议一并派。
事实:审计基底 a1f80bf(09-04 10:01)落后 HEAD 63 个提交,且基础数据全部来自静态读仓库、未连库实测:
| 审计口径 | 实测 | 偏差后果 |
|---|---|---|
| 数据库 76 张表 | 生产 109 张 | 「D-5 废弃表」结论基础不稳 |
| 47 个迁移文件 | 编号迁移 001-049(生产落 048,staging 落 049) | — |
| 小程序 120 页 | pages/ 119,app.json 注册 118 | 差 1 = 死代码目录 |
| B 端 23 路由 | src/pages/*.tsx 25 | — |
F-3 request.ts 不认 {ok,data} | 已被 3ace656(09-05,小冈)修复 | 照单派工会派出一个已完成的活 |
我已替你做完的部分:42 项里逐项复验,仍成立 10 项(B-3 / F-4 mockPay 无守卫 / F-5 uploadFile 相对路径 / F-7 / W-1 FeatureFlags 伪异步 / W-2 token 30天vs24h …),C-1/B-1 已由我修掉,C-3 在生产 APP_ENV=prod 下实际不可利用(审计未区分代码态与配置态)。
要你拍的:是「让小渔自己对 cf4120c 重跑一遍」(消耗它的额度,产出干净的 42 项),还是「就用我这份 10 项复验结果直接派工」(零额度消耗,但缺 F/M/I 级的完整清单)。
我的建议:用我的 10 项直接派。理由:小渔重跑一次成本不小,而真正活跃的高危项(C-1/B-1)已经修完;剩下的 F-4/F-5/W-1/W-2 都是明确的小改动,写工单比再审计一遍快。
事实(08-30 小齐打回,至今 8 天未清):
| 名字 | 全站计数 | 判定 |
|---|---|---|
| 扎西次仁 / 小初 | 0 / 0 | ✅ 已清 |
| 小张 2 / 扎西 8 / 古格 18 | — | ✅ 在用 |
| 林芝(旅行社) | 0 | 🔴 角色从未落地 |
| 小普(平台员工) | 0 | 🔴 角色从未落地 |
| 卓玛 | 7 | 3 处真违规 + 4 处地名误伤(见下) |
卓玛 7 处分离:
texts.ts:876、oxygen-map.ts:13、status-timeline.ts:15、scene-cert.ts:9 —— 全是「卓玛拉垭口」(Dolma La Pass,转山线 5630m 真实垭口,全程最难点)。小齐打回时写「卓玛仍残留 7 页」没区分人名与地名redeem-log.ts:18 operator:'卓玛'(核销操作员)、workbench-settings.ts:14 {name:'卓玛',role:'manager'}(员工)、guest-archive.ts:18 '拉萨来的卓玛'(客人)要你拍的:这是施工活(改 .ts),按 §9.2 归阿仁/小冈,我不能自己改。
operator 归平台员工角色),林芝/小普两个角色是否要新增示范内容另议 → 改动量 3 行,最轻我的建议:先做 A(3 行改完即清 E1 打回项),B 拆成独立工单——因为「旅行社」角色本身撞合规红线(三价体系 §14.3:借证是双向处罚 + 连带责任),C 端要不要出现旅行社角色是产品决策不是文案决策。
Network.ts 无 !res.ok 分支 —— 派谁事实:一号 B 端盘点 §六 已知问题 #2,至今未修。b-workbench/src/utils/Network.ts 全文只有 :56 一处 window.location.reload(),即 401 直接强刷页面(正是小渔审计 w-2 批评的粗暴处理)。同批 #1(App.tsx 登录门刷新丢失)、#3(Bills URL 双错)已修,#5(深层页无导航入口)、#6(packages admin 身份要求)未处理。
要你拍的:这是 B 端域(一号的活)。一号现在还有额度吗? 09-04 之后 B 端提交很少,近 3 天全站只有 63 个提交。如果一号停了,这条要么派小冈(他 09-05 接手了 C 端接线),要么并入 #9 的 B 端开工决策一起做。
我的建议:并入 #9 一起拍——单独修 Network.ts 意义不大,它只是 B 端 M4-M6 是否开工的一个子项。
workbench-home:真接口取了数据,但一个字段都没往界面上画,界面全是硬编码假数字,且免责声明已被删这一项比我上轮报的更严重。上轮我说「feeds 涉钱假数据」,实际是整页假。
事实链(全部实测):
workbench-home.ts:1 import { getConsoleOverview } from '../../services/merchant-console'
workbench-home.ts:46 onShow() { this.loadOverview() }
workbench-home.ts:52 const overview = await getConsoleOverview() ← 真调后端
workbench-home.ts:54 setData({ merchantName, pendingPayments, pendingTasks, todayDelegations })
但:
merchantName 在 wxml 出现 0 次
pendingPayments 在 wxml 出现 0 次
pendingTasks 在 wxml 出现 0 次
todayDelegations 在 wxml 出现 0 次
wxml 里实际渲染的是硬编码:
| 行 | 内容 | 性质 |
|---|---|---|
wxml:5 | <text class="mh-name">古格川菜馆</text> | 假商户名 |
wxml:9 | <text class="m-num">12</text> 今日核销 | 假数字 |
wxml:10 | <text class="m-num">3</text> 待核销 | 假数字 |
wxml:11 | <text class="m-num">2</text> 待确认收款 | 涉钱假数字 |
wxml:21 | wx:for="{{feeds}}" | 涉钱假数据真渲染 |
ts:21 | '核销凭证 K20260901042' / '高原暖锅套餐 · 服务费 ¥2.99' | 涉钱 |
ts:22 | '收到新的预订需求' / '3 人 · 09 月 05 日午餐' | 假订单 |
ts:23 | '服务费账单已出账' / '2026-09 账期 · 固定月付档位' | 涉钱 |
而 wxml 里的「静态演示 · 数据为虚构示例」页脚,已被 WIP-175 删掉了(实测 grep = 0 命中)。
入口是通的,商户真能看到:profile.ts:61(我的页导航「商户工作台」)、preview-index.ts:40/140;app.json:32 已注册。
后端真实返回的字段(merchant_console.py:47-52):
return {"ok": True, "data": {
"merchant_id": mid, "merchant_name": staff.get("merchant_name"),
"pending_payments": pending_pays, "pending_tasks": pending_tasks,
"today_delegations": today_orders,
}}
→ merchant_name / pending_payments / pending_tasks / today_delegations 四个字段后端都有真值,前端取了、setData 了、就是不渲染。
→ 但「今日核销」后端没有对应字段(grep today_redeem|今日核销|redeemed = 0 命中),这个数要展示就得后端补。
为什么必须你决策:这撞的是你自己定的 mock 红线——「涉钱涉气象假数据 = 禁」。而且它是 B 端商户看的钱账页,不是 C 端演示页。三条路代价差很大:
| 选项 | 做法 | 代价 | 风险 |
|---|---|---|---|
| A(最快) | wxml 改绑真字段({{merchantName}} 等 4 个)+ 删掉 feeds 整块(后端无动态流接口)+「今日核销」暂不显示或改文案 | 前端 1 个文件,约 10 行 | 界面会瘦一圈(少一个「今日动态」卡片),但零假数据 |
| B(最全) | A + 后端 merchant_console.py 补 today_redeemed 字段 + 新增 GET /merchant-console/feeds 动态流接口 | 前端 10 行 + 后端 2 个接口 + 迁移可能要索引 | 后端属小齐/阿仁域,要排期;feeds 涉及核销/账单/订单三表聚合 |
| C(兜底) | 页脚「静态演示 · 数据为虚构示例」加回去,整页维持演示态 | 1 行 | 与 WIP-175 的治理方向相反(小齐刚把 9 页页脚清零),且商户端挂"数据为虚构"很难看 |
我的建议:A。理由:① 4 个真字段后端现成,改完立即消灭「商户名/待收款/待办」三类假数据;② feeds 后端根本没有接口,留着只能是假的,删掉是唯一诚实解;③「今日核销」缺字段就先不显示,符合 ROADMAP 的诚实降级原则(「数字缺失走 0 空态不模拟」是 M2 判据 2 的原文);④ C 会让 WIP-175 的治理成果倒退。
⚠️ 顺带一条同源问题:ts:24 注释写「以下字段为 M5 真实数据渲染预留;当前 wxml 冻结,暂不渲染(静态演示态)」——也就是说有人明确知道 wxml 没渲染,还留着注释当挡箭牌,但同时 WIP-175 又把页脚删了。两件事撞一起 = 既无真数据也无免责声明。
merchant-hotel「预订房间」:我上轮的定性是错的,而且错在跨项目记忆污染——必须更正我上轮(以及更早)说:「住宿业态按义父定档应『仅展示』,页面上摆一个『预订房间』按钮即使不接真,也是对用户的错误预期引导。」
实测核验结果:这个「定档」在神山秘境项目里不存在。
docs/ 搜「住宿 + 仅展示/只展示/不下单/禁预订/不接真」→ 0 命中小程序静态演示页面需求文档.md:484「零价格零预订」——约束的是攻略内容页(种草文章),不是商户名片页B-011-backend-feed-demand-list.md:120「仅展示信息,所有费用与商户直结」——是 offline_direct_flag=true 时的注脚文案蓝图,属商户可配置属性,不是全局禁令docs/三价体系与组包责任边界.md:337「单元素券(住宿 / 温泉 / 门票 / 餐饮 / 车队) → 落点一(C 端)→ ✅ 保留。平台按平台经营者定位,履行第 11 条核验登记」:342「平台自营(酒店 / 温泉 / 门票)→ 落点一 → ✅ 以单元素券形式售卖,不打包」:640「单元素券(住宿/餐饮/门票/背夫/马帮,各一张券)→ ✅ 可跑,第 2 档,属在线旅游经营服务,不需许可」:111「A 档 单元素券(一间房 / 一张温泉票 / 一趟车)→ ❌仅一项 ❌单价 ❌无 → 商品预售,非包价 → ✅ 平台自营可直售」「住宿仅展示」是渔佳/长岛项目的业态两档定档(住宿/餐饮仅展示,门票/车队/特产走线上预约),我把它错搬到神山秘境了。神山秘境的合规结论恰恰相反:住宿单元素券是明确可做、可线上直售的(A 档,不需旅行社证)。
那 merchant-hotel 现在到底什么问题?——不是「不该有预订按钮」,是这页自身处于矛盾态:
| 事实 | 证据 |
|---|---|
| 页脚挂「静态演示 · 数据为虚构示例」 | merchant-hotel.wxml:30 ✅ 在位 |
| 但「预订房间」按钮跳的是真接口页 | merchant-hotel.ts:17 goBooking() → navigateTo('/pages/hotel-booking/hotel-booking') |
hotel-booking 不是演示页,是 WIP-199 正经做的统一下单流 | hotel-booking.ts:5 import { createUnifiedOrder, precheckUnified } from '../../services/order';:48-57 precheck → create 真实调用 |
| 后端端点真实存在 | miniapp_orders.py:343 @router.post("/precheck")、:366 @router.post("")、:758 /{id}/pay |
但 goBooking 不带 product_id | merchant-hotel.ts:17 URL 无参数 |
| → 跳过去必然落空态 | hotel-booking.wxml:9 wx:if="{{!productId}}" → 显示「缺少商品信息 / 从商品列表选择后预订」 |
全站没有任何页面带参跳 hotel-booking | 实测:唯一带参跳 booking 类的是 product-detail.ts:92 → order-create?product_id=;hotel-booking 的 4 处入口全是无参 |
| 页面还挂着价格 | wxml:8 ¥180-380/晚、wxml:19 {{item.avail ? '¥'+item.price : ''}} |
所以真问题是:用户点「预订房间」→ 跳到一个永远显示「缺少商品信息」的死胡同页。这不是合规问题,是功能断链。而 hotel-booking 本身是好的(同构页 ticket-booking、order-create 都已接线,order-create 有带参入口)。
为什么必须你决策:因为修法取决于你要不要现在就把住宿单元素券卖起来。
| 选项 | 做法 | 含义 |
|---|---|---|
| A(接通,推荐) | merchant-hotel 的房间列表带上 product_id,goBooking 改成 navigateTo('/pages/hotel-booking/hotel-booking?product_id='+id);同时摘掉页脚「静态演示」(因为开始接真了) | 住宿单元素券正式开卖(合规上 A 档零门槛,三价体系 §13.11/§14 已背书)。注意 pay 端点注释写「prod 未接微信支付返回 501」→ 下单能成、支付走线下结算文案(texts.ts:497 okNote: '订单已生成,请与商户线下确认结算。'),与「钱不落平台」原则一致 |
| B(断开) | merchant-hotel 删「预订房间」按钮,只留「联系商户」(onContact 已实现,弹微信号复制) | 住宿维持纯名片展示,交易全在线下。改动 1 行 |
| C(先挂起) | 按钮改文案为「咨询入住」+ 保持跳空态页,或干脆 wx.showToast('即将上线') | 最省,但留着一个点不动的按钮,体验差 |
我的建议:B 先做(1 行,立即消除死链),A 作为独立业务决策另排。
理由:A 虽然是合规的(我已核实住宿单元素券属 A 档零门槛),但它等于开一条新的交易线——涉及商品录入、product_id 从哪来、商户怎么上架房间产品、pay 走 501 还是接微信支付。这是 M3「交易+履约闭环」的范畴(验收日 10-08),不该在 M2 期间偷偷开。而现在这个死链是立刻就该堵的漏洞。
⚠️ 附带要你知悉:merchant-hotel 页面有价格(¥180-380/晚)但页脚挂「数据为虚构示例」——如果这价格是真的,页脚就是错的;如果是假的,那这页就不能给真商户用。这个矛盾同 #4 一样,是 WIP-165「静态稿为唯一视觉源头全量重写」留下的系统性尾巴。
事实:M1 判据已被产品决策事实性推翻,M2 判据有两条达不成。
M1(验收日 09-03,早已过期)8 条判据的问题:
| # | 原判据 | 现状 | 判定 |
|---|---|---|---|
| 1 | app.json 注册 = 28 页 | 118 页 | 🔴 判据失效(WIP-124/126/165/199 持续加页) |
| 2 | tabBar iconPath 引本地 png ≥3KB | tabBar 是 custom:true + custom-tab-bar/ 组件 | 🔴 判据写法本身错(自定义 tabBar 无 iconPath 字段) |
| 6 | 砍 34 页,pages/ 不得存在 wish-wall / oxygen-map 等 | oxygen-map/wish-wall 仍在,但属 C端接线验收自测清单-2026-09-04.md §三的 B 类有意挂起(「页脚在位,勿接线」,同批 11 页) | 🟡 判据该改,代码不该动 |
| 8 | 20 禁词 grep 用户面 0 命中 | 排除 wxss + 排除注释后仍 11 处命中 | 🔴 见下 |
M1 判据 8 的 11 处命中逐条定性(这次我用了正确判据:排除 .wxss、排除注释行):
| 位置 | 命中词 | 上下文 | 性质 |
|---|---|---|---|
admin-content.ts:11 | 第一 | title:'第一次转山装备清单' | ✅ 序数词误伤 |
supplier-transport.wxml:29 | 预订 | <text class="stat-label">已预订</text> | ✅ 状态标签(订单状态,非营销词) |
preview-index.ts:154 | 预订 | {name:'住宿预订', path:...} | ⚠️ 导航名(preview-index 是开发预览页) |
preview-index.ts:157 | 预订 | {name:'组合预订'} | ⚠️ 同上 |
profile.ts:75 | 预订 | {name:'住宿预订'} | 🔴 用户面(我的页导航列表,真会显示) |
profile.ts:78 | 预订 | {name:'组合预订'} | 🔴 用户面 |
agreement.wxml:16 | 唯一 | 高海拔风险免责声明 | ✅ 法律文本误伤 |
merchant-hotel.wxml:35 | 预订 | 「预订房间」按钮 | ⚠️ 见 §三·② |
→ 真违规只有 2 处(profile.ts:75/78 用户面导航名),其余 9 处全是判据粒度问题。上轮我报「100% 命中 139 处」已核实全是 width:100%(wxss),排除后归零。
M2(验收日 09-17)6 条判据实测达成度:
| # | 判据 | 实测 | 判定 |
|---|---|---|---|
| 1 | B-011 P0 10 接口前端均有调用 + 失败态降级 | services/ 层封装 10/10 命中 | ✅ 达成 |
| 2 | 首页 Hero 信息真实化(天气5块+信任条4数字+令牌条+推荐横滑全接真,无假数字) | home.ts 调 services ✅,未见信任数字硬编码 | 🟡 大体达成,需逐块验 |
| 3 | 种草瀑布推广角标 + 详情页唯一 CTA=contact-card | commercial_flag 已出现 ✅ | 🟡 需验角标渲染 |
| 4 | local 页彻底删评分/价格/距离 + 商户卡挂「线下直结」角标 + 底部「平台不参与交易」注脚 | ¥=0、评分=0、距离=0 ✅ 但「线下直结」角标 = ❌ 缺、「不参与交易」注脚 = ❌ 缺 | 🔴 未达成(合规组件缺失) |
| 5 | 禁词 0 命中 + 12 页六态 typecheck pass | 禁词真违规 2 处(见上) | 🟡 差 2 处 |
| 6 | 主理人徽章 L2 门槛 ≥30 单真实 SQL | 🔒 小齐主验(涉 SQL/身份) | ⚪ 不在我权限 |
为什么必须你决策:改验收标准 = 改里程碑,这是 ROADMAP 级别的事,且 M2 只剩 10 天。三个层面:
B-011 蓝图 :120 明确要求的字段(offline_direct_flag / platform_no_involvement_note),且它是平台经营者定位的合规护身符(三价体系 §11 条核验登记义务的 C 端体现)。10 天内补两个组件是可行的.wxss(CSS 值不是文案)// * <!--)第一/唯一 加白名单:后接「次/趟/届/章」等量词、或位于 agreement/免责声明上下文 → 放行预订 加白名单:已预订/待预订/预订单 等订单状态词 → 放行;但用户面导航名与按钮文案仍拦100% 只拦文案不拦样式(已被排除 wxss 覆盖)要你拍的:M1 关账方式(事实超越 / 补验 / 重定判据再验一次)+ M2 是否维持 09-17 验收日(判据 4 缺两个组件,判据 5 差 2 处文案)。
事实:M1-M3 已基本完成,但 M4-M6 不是「前端没做」,是「后端零端点」。
B 端 25 页实测激活状态(判据带自检,防假阴性):
【自检】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 登录与身份 | ✅ 已完成(Login 接线、App.tsx:49 从 token 恢复、auth.ts:55-76 expiresAt 持久化) | — |
| M2 工作台与财务 | 🟡 大部分完成(Workbench✅ Bills✅ URL 双错已修;StallShop❌ Profile⚠️只 import 未调) | — |
| M3 订单与核销 | 🟡 3/4(Orders✅ Redeem✅ RedeemConfirm✅;RedeemBoard❌) | — |
| M4 商品与套餐 | 🔴 未动(VehiclePackage❌ PackageBuilder❌ ProductEdit❌) | 后端缺口 |
| M5 需求与营销 | 🟡 部分(DemandDetail✅;DemandHall❌ MyDemands❌) | 后端缺口 |
| M6 等后端 | 🔴(Transport 已接 C 端只读端点;SessionManage/Rental×2/Attribution/ShareCard/Supplier×4 ❌) | 后端零端点 |
后端缺口实测(backend/app/routers/ 目录,现有 53 个路由文件):
suppliers 路由文件数: 0 ← SupplierApply/SupplierProducts/SupplierQuestionnaire 三页等着
rental 路由文件数: 0 ← RentalOrders/RentalWorkbench 两页等着
attribution 路由文件数: 0 ← AttributionBoard 等着
share-card 路由文件数: 0 ← ShareCard 等着
session 路由文件数: 0 ← SessionManage 等着
全后端 grep supplier 的 @router/prefix → 0 命中。
为什么必须你决策:这不是排期问题,是要不要新开 5 个后端域的问题。
| 域 | 涉及页面 | 业务含义 | 我的风险提示 |
|---|---|---|---|
| suppliers(供应商) | 3 页 | 供应商入驻申请 + 商品 + 问卷 | ⚠️ 撞合规红线:三价体系 §14.3「借证是双向处罚 + 连带责任」,供应商入驻审核 = 平台核验登记义务(§11 条)。没想清楚核验流程就开这个域,等于给自己挖坑 |
| rental(租赁) | 2 页 | 租赁订单 + 租赁工作台 | ⚠️ 撞硬边界:三价体系 §15.3「>9 座暂无法办理租赁备案(广州交通局答复原文)→ 只能走包车客运三件套」;「自驾租车绕开包车资质这条路不存在」。转山团队运输普遍用中巴 → 这个域的业务前提可能根本不成立 |
| attribution(归因) | 1 页 | 分销归因看板 | ⚠️ 撞 GMV 零挂钩:归因看板天然要算「谁带来多少成交额」,而你的铁律是「任何与交易额挂钩字段 = 共同经营表征 = 旅行社证风险」。这个域要做就得设计成按单固定额/年费,不能按 GMV 抽成 |
| share-card(分享卡) | 1 页 | 分享裂变卡片 | 🟢 风险低,但属增长功能,M2/M3 期间是否值得投入要权衡 |
| session(场次) | 1 页 | 场次管理 | 🟡 需先定场次业务模型 |
要你拍的:
packages.py/miniapp_products.py 后端已存在,是 5 个域里唯一有现成后端可接的;M5/M6 等合规评估我的建议:B + C 的组合——立即开工 M4(后端现成,PackageBuilder/VehiclePackage/ProductEdit 三页能接真);同时我出 suppliers/rental/attribution 三域的合规前置评估(尤其 rental 的业务前提是否成立、attribution 怎么绕开 GMV 挂钩),评估完再决定 M5/M6。
理由:近 3 天全站只有 63 个提交、fix/feat=1.22、docs 占 66%,团队已在补缝收尾期,没有余量开 5 个新后端域;而 M4 是唯一能靠现有后端立即推进的。
我原以为 WIP-165 全量重写(9ede1ba,90/90 页纯 mock 视觉版)之后,「.ts 接真 / wxml 还是假的 / 页脚已删」是一批页面的三不管态。所以跑了全站回扫,判据:
凡.ts里setData写入的业务字段名,必须在同名.wxml里以{{字段名}}出现;否则 = 假数据嫌疑
第一轮命中 38 页 → 收紧(排除 loading/submitting/orderId 等本就不该渲染的内部状态)→ 11 页 → 逐页人工核验后,真违规只有 1 页。
| 页面 | 命中字段 | 核验结论 |
|---|---|---|
🔴 workbench-home | merchantName pendingPayments pendingTasks todayDelegations | 真违规(= #4,见 §三·①) |
⚪ guide-detail | pilgrimageCount score wechatId | 假阳性::53/69 用 .replace('{n}') 把值塞进模板串再渲染(tripsTpl),我的正则抓不到间接渲染 |
⚪ guide-home | pilgrimageCount wechatId | 假阳性:同上(lapsBadge 走 .replace) |
⚪ orders/product-detail/route-detail/play-scene/redemption-code | allOrders/productId/routeId/key/qrPayload | 假阳性:路由参数与中间变量,本就只做跳转/生成二维码用 |
⚪ share-code | shareTemplate | 假阳性:传给 canvas 的模板对象 |
⚪ sos | locating | 假阳性:定位中状态位 |
⚪ tibetan-calendar | month/year | 假阳性:传给日历组件的属性,非文本插值 |
另跑反向判据(已接真 + wxml 存在硬编码中文数字)命中 3 页,逐条也全部无罪:
| 页面 | 硬编码内容 | 核验结论 |
|---|---|---|
profile.wxml:19 | 9月6日出发 · 3 人同行 | ✅ 永不渲染:外层 wx:if="{{hasTrip}}",而 profile.ts:13/154 hasTrip 恒为 false(诚实降级,行程功能未接)。属安全的死代码 |
health-check.wxml:9 | 第 2 天 · 海拔约 5,210 m | ✅ 事实性静态内容(转山线真实海拔),不是虚构业务数据 |
share-code.wxml:21 | 客人扫码后 7 天内下单即建立归因关系 | ✅ 规则说明文案,不是假数据 |
所以 §三·① 的 #4 是孤例,不需要开专项回扫工单。这对你决策有意义:修 workbench-home 一个文件(约 10 行)就把这条彻底清掉,不用排大工程。
⚠️ 但留一条观察:profile.ts:154 把 hasTrip 硬写 false(且 catch 分支和成功分支都写 false),说明行程卡片这个功能是有意关掉的。如果将来要开,得先接 trip-detail 的真数据源,否则一开就是假行程。这条不是问题,是待启用的开关,记在这里备查。
实证(不是我猜的):
git log --format='%an <%ae>' --all | sort -u
→ 小渔 <xiaoyu@kailash.media> ← 规范署名,符合 §9.2 格式
→ 渔佳新媒体 <yujiaxinmeiti@yujia.media> ← 另一个署名,不属本项目
f9ac4c0 小渔 <xiaoyu@kailash.media> docs(AUDIT): 代码质量综合审计报告 v2…
报告头写「工作区: /Users/yujiaxinmeiti/Desktop/kailash-worktrees/xiaoyu-real-gz5gz9/」——已推 main 但身份未登记,属 §9.7 接入规范的登记缺口。
改法:§9.2 表格追加一行
| 小渔 | 小渔 | xiaoyu@kailash.media | **审计/质量检测**:代码质量审计(2026-09-07 接入,只查问题不改代码) |
⚠️ 注意职责域要写「审计」而非「验收」——§9.2 现有「方案制定+验收检测」是小齐/波波的岗,小渔自述「审计性质:只查问题,不修复代码」,与验收岗不同(验收要判 PASS/FAIL 并关账)。写成第三个岗位类型更准确。
两份报告犯的是同一类毛病:判据是词级的,没区分语义角色。
| 判据 | 误伤 | 实测代价 |
|---|---|---|
| E1「卓玛」禁用 | 地名「卓玛拉垭口」(Dolma La Pass,5630m 真实垭口) | 7 处命中里 4 处是地名,真违规只 3 处 |
| M1 禁词「100%」 | CSS width:100% | 139 处命中全是样式,排除 wxss 后归零 |
| M1 禁词「第一」 | 序数词「第一次转山」 | 1 处误伤 |
| M1 禁词「唯一」 | 法律免责声明(agreement.wxml:16) | 1 处误伤 |
| M1 禁词「预订」 | 订单状态词「已预订」 | 2 处误伤 + 2 处开发预览页 |
修订方案(写进 docs/前端设计核查清单.md 与 ROADMAP 判据附注):
operator: / name: / role: / nickname: 等字段值里的禁用名,不拦自然语句。具体规则:「卓玛」后紧跟「拉垭口/拉山口/垭口」→ 判地名放行.wxss / .json 不参与(样式值与配置不是用户面文案)// * /* <!-- 开头的注释行不参与(合规注释、法条引用会被误伤)第一次/第一趟/第一站(序数)、已预订/待预订/预订单(订单状态)、唯一标识/唯一联系(技术/合规用语)、100% 仅在非样式上下文拦最低价/全网最低/顶级/最好/秒杀/特价/拼团/众筹/抽奖/返利/返现/担保交易/货到付款/无效退款 —— 这些是《广告法》绝对化用语与金融违规词,无白名单改法:改 docs/前端设计核查清单.md(v1.3 → v1.4)+ ROADMAP M1 判据 8 附注 + AGENTS 验收纪律追加一条。
这两项我不单独 push——等你对 #2/#6/#8/#9 拍完,我把 §五的两项 + 派工登记(#6/#10)+ ROADMAP 判据修订(#8)合成一次 docs commit(带 [no-deploy] 跳过 staging 部署,因为纯文档),减少冲突面。
cd /Users/lean/dev/kailash-bobo
# §三·① workbench-home:真数据取了但 wxml 未渲染
grep -n "getConsoleOverview\|setData" miniprogram/miniprogram/pages/workbench-home/workbench-home.ts
for v in merchantName pendingPayments pendingTasks todayDelegations; do
echo -n "$v: "; grep -c "$v" miniprogram/miniprogram/pages/workbench-home/workbench-home.wxml; done
grep -n "古格\|feeds\|静态演示" miniprogram/miniprogram/pages/workbench-home/workbench-home.wxml
# §三·② hotel-booking 是真接口页 + goBooking 不带参 = 死链
grep -n "createUnifiedOrder\|precheckUnified" miniprogram/miniprogram/pages/hotel-booking/hotel-booking.ts
grep -n "goBooking" miniprogram/miniprogram/pages/merchant-hotel/merchant-hotel.ts
grep -rn "hotel-booking" miniprogram/miniprogram/pages/ --include="*.ts" | grep -v "pages/hotel-booking/"
grep -n "productId" miniprogram/miniprogram/pages/hotel-booking/hotel-booking.wxml # 无参→空态
# §三·② 神山无「住宿仅展示」定档;反面:住宿单元素券明确可售
grep -rn "住宿" docs/ --include="*.md" | grep -E "仅展示|只展示|禁.*预订|不接真"
sed -n '337p;342p;640p;111p' docs/三价体系与组包责任边界.md
# §三·③ M2 判据 4 缺两个合规组件
grep -c "线下直结\|不参与交易" miniprogram/miniprogram/pages/local/local.wxml # → 0
# §三·④ B 端后端 5 域零端点
for k in suppliers rental attribution share-card session; do
echo -n "$k: "; ls backend/app/routers/ | grep -ci "$k"; done
# §一 P0 修复验证(服务器端)
ssh kailash "python3 /tmp/probe_jwt.py | tail -5"
ssh kailash "curl -s -i -X OPTIONS http://100.64.1.230:8088/api/miniapp/auth/login \
-H 'Origin: https://evil.example.com' -H 'Access-Control-Request-Method: POST' \
| grep -i access-control-allow-origin || echo '(无头=已拒绝)'"