petstore-docs/qa-reports/phase2-pilot-rc5-release-manifest.md
2026-08-02 03:19:46 +08:00

143 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 宠小它 Phase 2 Pilot RC5 Release Manifest
> RC ID`phase2-pilot-rc5`
> 冻结日期2026-08-02
> 状态:**Ready for Release未部署**
> 适用范围35 家独立宠物洗护单店真实试点
> 样本目标:约 200 次完整服务后进行 Phase 2 / 商业化决策
RC5 是当前唯一推荐候选:它继承 RC4 的全局 CORS 单一策略并收口微信、身份、session、邀请和上传异常分支的敏感日志边界。真实生产配置、备份恢复、八个迁移、TLS、live smoke、三角色验收和首份真实指标基线未形成证据前不得把状态改为 `Released`
## 1. 前序 RC 取代说明
- `phase2-pilot-rc1`:因试点指标口径与 cohort 问题被 RC2 取代。
- `phase2-pilot-rc2`:因公开微信网页 OAuth demo 会产生伪造身份,被 RC3 取代。
- `phase2-pilot-rc3`:因 17 个 Controller 保留危险的第二套 `@CrossOrigin` 策略,被 RC4 取代。
- `phase2-pilot-rc4`CORS 与业务主链可用,但异常分支仍可能记录完整微信响应、原始手机号、带凭据 URI 的异常消息或完整异常,被 RC5 取代。
RC5 的业务 API、数据库和客户端无兼容变化。它只把微信出站诊断收口为 HTTP 状态码、微信错误码和异常类型,并为相邻敏感边界增加源码契约门禁;既有 tag 与清单保持不动,只用于审计。
## 2. 冻结提交与回滚点
| 仓库 | RC5 commit / ref | 前一候选回滚点RC4 | 冻结状态 |
|---|---|---|---|
| backend | `2a3cfa0ac45891ad8be6adf5028e1c89e792d0d1` | `752fcaa38d849deaafcbbad1d70cb785d2f4000b` | `main == origin/main`clean |
| admin | `078ae0f9d18e6598a1af13fa8bf2b5b97c25a410` | 同 commit | `main == origin/main`clean |
| frontend | `a595ea8fa17dd0dbdfb607abea93e8c0d24b13a8` | 同 commit | `main == origin/main`clean |
| docs | `refs/tags/phase2-pilot-rc5`(本清单所在 commit | `669023d71c4e52e047533f50dd6e2dbedd723cc6` | tag 推送后解析并复核 clean |
部署前必须在四仓分别解析 `phase2-pilot-rc5` 并与本表一致;任何源码变化、产物 hash 变化或 tag 不一致都必须建立新 RC不得移动已有 tag 或覆盖本记录。
## 3. RC 产品范围
本 RC 收口以下真实试点业务内核:
1. 预约客户与服务执行人身份拆分;
2. 同店 `StoreCustomer` 客户主档及低敏事实时间线;
3. 不可变、幂等、低敏 `BusinessEvent``AuditLog`
4. 服务时长快照、门店容量和连续时段占用;
5. 基于事实的门店行动工作台;
6. 报告 `unknown / unsent / sent` 显式发送确认;
7. 微信核验老板入驻、显式开通和一次性员工邀请;
8. `FollowUpTask` 领取/改期/终结状态机与真实预约归因;
9. 三角色验收、cohort-safe 指标字典和只读聚合查询 v2
10. 单一微信小程序登录契约,旧网页 OAuth fail-closed 下线;
11. 生产配置、readiness、31 项数据库不变量、只读 smoke 与回滚模板;
12. 全局 CORS 单一策略和 allow/deny 双分支;
13. 微信与相邻身份边界的低敏异常日志契约。
明确排除支付、库存、储值、复杂会员、多门店组织、订单系统、泛 AI、PC 扫码登录、公众号网页授权,以及未授权的任何生产写入。
## 4. 本地验证证据
验证环境macOS `26.5.2` / arm64、OpenJDK `21.0.10`、Maven `3.9.14`、Node.js `v22.22.2`、npm `10.9.7`、Python `3.9.6`;指标查询既有隔离验证为 MySQL `8.0.46`
| 门禁 | 结果 |
|---|---|
| backend `mvn test` | **PASS**226 tests0 failure / 0 error / 0 skipped |
| backend package / `bash -n deploy/*.sh` | **PASS** |
| `SensitiveLoggingContractTest` | **PASS**2 项契约;微信日志无请求/响应原文、手机号、token、secret、一次性 code 或 URL相邻边界不记录外部错误文案、异常消息或完整异常 |
| `CorsBoundaryContractTest` | **PASS**:非白名单 403、白名单精确回显、允许凭据、OPTIONS 不进业务代码、Controller 局部 CORS 为 0 |
| production smoke 合成执行 | **PASS**:输入反例通过;受控无网络 `curl` stub 跑通 7/7不替代真实 live smoke |
| admin `npm run build` | **PASS**1671 modules仅既有 >500 kB chunk warning |
| frontend H5 / 微信小程序 build | **PASS**`verify-mp-app-json` PASS |
| pilot metrics v2 | **PASS**:查询 hash 未变化;契约及既有隔离 MySQL 门店/窗口/cohort/反例验证继续有效 |
| ontology validate | **PASS**289 条Action 75、Entity 29、Event 33、Relation 102、Rule 50 |
| ontology drift | **PASS**68/68 HTTP、16/16 JPA三类漂移均为 0 |
| 四仓 `git diff --check` | **PASS** |
| 四仓工作树、远端与 tag | 清单提交及 tag 推送后再次复核 |
本地仍未运行最终 production profile 的 JPA `validate`、生产库 31 项不变量或真实域名 live smoke这些保留为生产 No-Go 门禁。
## 5. 本地构建产物与 SHA-256
目录 hash 在目标目录中执行:`LC_ALL=C find . -type f -print0 | LC_ALL=C sort -z | xargs -0 shasum -a 256 | shasum -a 256`。
| 产物 | 大小 | SHA-256 | 可部署性 |
|---|---:|---|---|
| `backend/target/petstore-backend-1.0.0.jar` | 50,995,415 bytes | `4c1e02f754e2aa4dfbe6585bf7e0d044fd3c5eb209d8aa4534db1cb315de16ec` | 候选 JAR仍须真实配置与生产只读预检 |
| `backend/db/queries/pilot_metrics.sql` | source | `d2de4684722811028474001ed7e56bbf56297733509e1a71850d7ab404587210` | 仅限只读账号/副本;执行前显式填写门店集合与窗口 |
| admin `dist`27 files | 1,536 KiB | `181005e11373ef9bbdba50bce35eb40b5a159c6acd8f89196749d1c12a0b4f8c` | **不可部署**:含 `.invalid` 占位域名,仅证明可编译 |
| H5 `dist/build/h5`65 files | 852 KiB | `1f810d55d25fa86906dfb5c2a8765d24af1258ac23d91e75858495e3c121d34a` | **不可部署**:含 `.invalid` 占位域名,仅证明可编译 |
| 微信小程序 `dist/build/mp-weixin`142 files | 820 KiB | `b06ef5bdfd70c59ff91cc405ac99c0b15625c926f8f49dc9e561def9b1300587` | **不可上传**:含 `.invalid` 占位域名,仅证明可编译 |
正式 Admin/H5/小程序必须以权限受控的真实域名配置重新执行 release preflight 与 build并把新 hash 追加到生产发布记录。
## 6. 数据库迁移冻结
迁移顺序与 RC4 完全一致;执行前必须逐个核对:
| 顺序 | 文件 | SHA-256 |
|---:|---|---|
| 1 | `20260801_split_service_identity.sql` | `05fa560cb59a746681057187ffaccc1db4980de8e99bbcb0c42dd6ce25a759ac` |
| 2 | `20260801_create_store_customer.sql` | `5eabfc4689d5acc9400e70fc3cbdcd0549b8e9a8763176bef7ec3715f94002dd` |
| 3 | `20260801_create_business_event.sql` | `d0a3ebe3ac2f3bd0c4c125832df4895dec66d5cc95077b4292b10055b876c184` |
| 4 | `20260801_create_booking_capacity.sql` | `25e9c8817c48a2c4854d034981f765dfe4b6ebb90f95a8f45a54513106c4ad51` |
| 5 | `20260801_create_report_send_status.sql` | `321284bc44774c69de4b584f3eb3a8f235653be6c0a5e75e3557a697f78381a2` |
| 6 | `20260802_create_store_onboarding.sql` | `40d45f382a03c35e9e9696e65553488713cdaadf90094d824f406561f196039c` |
| 7 | `20260802_create_store_customer_timeline.sql` | `5185a03f9a983823c75aae6661b0e68d51c75e226d117039b22f81f383ac7c2d` |
| 8 | `20260802_create_follow_up_task.sql` | `a1ff5176b2775745ee1fb044a15d25d1cc52dba9fef72ffb45727f430db22c09` |
八迁移后,以最终 production 配置运行 `deploy/release-preflight.sh`静态配置、JPA schema validate 和 31 项只读数据库不变量必须全部成功。
## 7. 生产 Go/No-Go
- [ ] Petstore 专用 API/Admin/报告域名与 TLS 就绪,不复用或修改其他产品域名;
- [ ] 历史暴露的 DB 密码、微信 AppSecret 和 session secret 已轮换,最终配置通过三端 preflight
- [ ] `CORS_ALLOWED_ORIGINS` 仅含正式 Admin/报告 H5 origin局部 `@CrossOrigin` 为 0
- [ ] 全量备份记录大小/hash并在隔离库完成恢复演练
- [ ] 八迁移按顺序执行,每步 hash 一致且反例为 0
- [ ] production JPA `validate` 与 31 项数据库不变量通过;
- [ ] 正式三端产物重新构建并记录 hash微信合法域名一致
- [ ] Petstore 独立 systemd/Nginx 就绪,`nginx -t` 通过diff 未改 Gitea/GitLab
- [ ] liveness、readiness 和 7/7 live smoke 通过;真实 allowed origin 精确回显blocked origin 403
- [ ] 日志抽查只含低敏错误码/异常类型不含手机号、凭据、token、query URL 或私密媒体地址;
- [ ] 老板、员工、宠主三角色主链、权限和异常反例签署 PASS
- [ ] 真实微信 AppID/AppSecret、手机号 code、`wx.login` code 完成真机核验;
- [ ] 外部监控、告警联系人、值班窗口和回滚执行人已真实测试;
- [ ] Gitea/GitLab 既有入口健康,服务器端口和证书未受影响;
- [ ] 35 个真实门店 ID、指标窗口、快照时间、四仓 commit、低敏结果与 hash 已留档,四项可靠性反例为 0。
任一项未完成,结论都是 `No-Go / Ready for Release`,不得标记已上线。
## 8. 试点验收与 Phase 2 决策
- 三角色验收:[`试点三角色端到端验收清单-2026-08-02.md`](../试点三角色端到端验收清单-2026-08-02.md)
- 门店开通:[`试点门店开通清单-2026-08-01.md`](../试点门店开通清单-2026-08-01.md)
- 指标与决策带:[`试点指标采集与Phase2决策方案-2026-08-02.md`](../试点指标采集与Phase2决策方案-2026-08-02.md)
- 微信敏感日志边界:[`架构决策-微信出站调用敏感日志边界-2026-08-02.md`](../架构决策-微信出站调用敏感日志边界-2026-08-02.md)
- CORS 单一策略:[`架构决策-全局CORS单一策略-2026-08-02.md`](../架构决策-全局CORS单一策略-2026-08-02.md)
- 发布与回滚:[`生产发布与回滚Runbook-2026-08-01.md`](../生产发布与回滚Runbook-2026-08-01.md)
- 被取代候选:[`rc1`](./phase2-pilot-rc1-release-manifest.md)、[`rc2`](./phase2-pilot-rc2-release-manifest.md)、[`rc3`](./phase2-pilot-rc3-release-manifest.md)、[`rc4`](./phase2-pilot-rc4-release-manifest.md)
样本闸门为 35 家门店、观察 48 周、合计至少 200 次完整服务且每家至少 25 次。达到闸门后只能形成 `Continue`、`Iterate Core` 或 `Stop/Redesign`;在此之前不扩展支付、库存、储值、复杂会员、多门店组织、订单系统或泛 AI。
## 9. 已知风险与回滚边界
- Admin 主 bundle 的 >500 kB warning 是已知性能债,不阻断小流量试点,但正式包需观察首次加载和弱网体验。
- CORS 与敏感日志本地契约不覆盖真实 Nginx/CDN/JVM 日志配置;必须在 live smoke 与受控日志抽查中复核。
- 指标 v2 的生产版本、数据量和执行计划仍须用只读账号在发布窗口复核,不得在主库高峰期首次运行。
- 常规故障只回退应用/静态版本和小程序平台版本,不删除列/表/索引,不自动恢复旧备份。
- 灾难性整库恢复必须另获业务负责人、DBA 与隐私负责人书面授权;本 RC 不授权该操作。
- 本地验证没有使用生产凭据、真实微信账号、真实门店数据也没有连接或修改生产服务器、Gitea、GitLab、Nginx、证书或业务数据库。