署名:扣子一号 · 2026-09-14 · 契约先行(config-governance-v1 冻结)
定位:328(品牌配置页,一号)+ 329(版本管理页,二号)同单协作。本文件只覆盖一号 328 侧闭环与断点暴露,329 侧由二号自定义。
fetchBrand→GET /api/miniapp/config/site,saveBrand→PUT /api/miniapp/config/site/brand,业务代码无任何 mock/fixture,saveBrand 内置 URL/必填校验(brand.ts validateBrand)。POST /admin/config/publish、POST /admin/config/rollback 只写 site_config_versions 版本表,未联动写 C 端读源 site_config.brand。而 C 端 GET /config/site 读的是 site_config.brand(miniapp_site.py)。⇒ 治理发布/回滚后 C 端显示不生效,「c 端显示生效」「按契约回退核对」两环在纯治理路径上无法成立。| 端点 | 前端(admin-console/src) | 后端(323,小冈 R11 入库) |
|---|---|---|
GET /admin/config/versions | 二号 ConfigVersion | ✅ 已在 |
POST /admin/config/publish | 二号 ConfigVersion | ✅ 已在(仅写版本表) |
POST /admin/config/rollback | 二号 ConfigVersion | ✅ 已在(仅写版本表) |
GET /admin/config/current | 二号 ConfigVersion | ✅ 已在 |
GET /api/miniapp/config/site | 一号 328 fetchBrand | ✅ 已在(读 site_config.brand 打平) |
PUT /api/miniapp/config/site/brand | 一号 328 saveBrand | ✅ 已在 |
| # | 环节 | 前端实现 | 后端实证 | 结论 |
|---|---|---|---|---|
| 1 | 页面读取品牌回填 | fetchBrand GET /config/site,取顶层 5 字段 | 生产 GET 实测 5 字段在顶层 | ✅ |
| 2 | 页面保存品牌 | saveBrand PUT /config/site/brand body {value:{...}} | 端点已挂载(假 token 返回非 404,L3 待机位真 token) | ✅(L3 待跑) |
| 3 | 保存前校验 | validateBrand:必填+logoUrl 协议校验,11 条非法样例 fixture 全 PASS | — | ✅ |
| 4 | 改品牌→C 端生效 | 直写 site.brand,C 端读同源 | — | ✅ 最短闭环 |
| 5 | 治理发布→C 端生效 | 依赖 publish 联动 site.brand | publish 未写 site.brand | 🔴 断点 |
| 6 | 治理回退→C 端核对 | 依赖 rollback 还原 site.brand | rollback 未写 site.brand | 🔴 断点 |
site_config.brand。这样「治理发布→C 端生效→回退核对」闭合成真闭环。属后端改动(backend 域)。staging-l3.sh(staging 100.64.1.230:8089 绑 localhost,需 Tailscale 机位以员工 token 代跑,覆盖 1-5 步含断点验证)。miniapp_config_governance.py:新增 _sync_brand(pool, snap),INSERT ... ON CONFLICT (key) DO UPDATE 原子 upsert site_config(key=''brand'')。publish L126 await _sync_brand(pool, req.snapshot);rollback L143 await _sync_brand(pool, snap)——两动作均原子回写 c 端读源。{ok,data}、rollback 入参 toVersion(修正早期误写 versionId)、登录取 data.token、snapshot 6 字段含 themePrimary;/tmp/mock332.py(内存态,publish/rollback 均联动写 site.brand)对脚本跑全链路:结果 8/8 全绿:版本 v1→v2 +1 ✅;c端 brandName/slogan 生效 ✅;versions.current=2 ✅;rollback 生成 v3 ✅;c端还原基线品牌名 ✅。
100.64.1.230:8089 HTTP=000、PG:5432 closed、无 ssh 二进制、无 docker;生产治理端点 404(生产人工部署铁律,未上线)。```bash
bash docs/delivery/evidence/c1/332/staging-l3.sh
# 默认 http://100.64.1.230:8089,冒烟账号已内置;输出末行 [smoke] N/N
```
[smoke] WIP-332 运行时 L3 结果: 8/8 全绿判定 — PASS=8 FAIL=0。/tmp/mock332.py(内存态 mock,publish/rollback 均联动 _sync_brand 写 site.brand,SETDB=统一契约)对最终版脚本全链路复跑: TEST_PHONE=<staging员工号> TEST_PASSWORD=<pwd> bash docs/delivery/evidence/c1/332/staging-l3.sh
或传入 BASE_URL 指定 staging。默认内置冒烟员工号 13020000001。