petstore-docs/qa-reports/phase2-pilot-rc3-release-manifest.md
2026-08-02 02:48:06 +08:00

151 lines
12 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 RC3 Release Manifest
> RC ID`phase2-pilot-rc3`
> 冻结日期2026-08-02
> 状态:**Ready for Release未部署**
> 适用范围35 家独立宠物洗护单店真实试点
> 样本目标:约 200 次完整服务后进行 Phase 2 / 商业化决策
RC3 是当前唯一推荐候选:它继承 RC2 的 cohort-safe 指标口径,并下线未实现的公开微信网页 OAuth demo。真实生产配置、备份恢复、八个迁移、TLS、live smoke、三角色验收和首份指标基线未形成证据前不得把状态改为 `Released`
## 1. 前序 RC 取代说明
- `phase2-pilot-rc1`:因指标默认覆盖全店/全历史、对象粒度混用和 24h 未成熟 cohort 被 RC2 取代。
- `phase2-pilot-rc2`:应用主链与指标均可用,但风险扫描发现公开 `/api/wechat/authorize`、`/api/wechat/callback` 仍是伪造 `demo_openid_` 的未实现网页 OAuth被 RC3 取代。
RC3 删除旧网页 OAuth 控制器、公开 allowlist 项和 `WECHAT_REDIRECT_URI`,保留唯一正式登录链路 `/api/user/wx-phone-login`。Admin/H5/小程序源码均未调用旧端点;数据库与现有 session 无迁移或兼容影响。RC1/RC2 tag 与清单保持不动,只用于审计。
## 2. 冻结提交与回滚点
| 仓库 | RC3 commit / ref | 前一稳定应用回滚点Phase 0 Pilot RC2 | 冻结状态 |
|---|---|---|---|
| backend | `339c793855717970540ba752ba999d06e17becac` | `133f61e4ad6152865a76c4e9328d96e689f53635` | `main == origin/main`clean |
| admin | `078ae0f9d18e6598a1af13fa8bf2b5b97c25a410` | `3470b124e408501ed824b993bcb34dd40e77c293` | `main == origin/main`clean |
| frontend | `a595ea8fa17dd0dbdfb607abea93e8c0d24b13a8` | `e11ce1aaaa602011718e300e4527a0d971f1339a` | `main == origin/main`clean |
| docs | `refs/tags/phase2-pilot-rc3`(本清单所在 commit | `fe92fab4dd1ced2fd9d617cfb39e75f950caa318` | tag 推送后解析并复核 clean |
部署前必须在四仓分别解析 `phase2-pilot-rc3` 并与本表一致;任何源码变化、产物 hash 变化或 tag 不一致都必须建立新 RC不得移动已有 tag 或覆盖本记录。
## 3. RC 产品范围
本 RC 收口以下完整业务内核:
1. 预约客户与服务执行人身份拆分;
2. 同店 `StoreCustomer` 客户主档;
3. 不可变、幂等、低敏 `BusinessEvent``AuditLog`
4. 服务时长快照、门店容量和连续时段占用;
5. 生产配置门禁、readiness、只读 smoke 与回滚模板;
6. 基于事实的门店行动工作台;
7. 报告 `unknown / unsent / sent` 显式发送确认;
8. 微信小程序核验老板入驻、门店开通清单和一次性员工邀请;
9. `StoreCustomer` 低敏事实时间线;
10. `FollowUpTask` 领取/改期/终结状态机与真实预约归因;
11. 三角色验收脚本、cohort-safe 试点指标字典和只读聚合查询 v2
12. 单一微信小程序登录契约,未实现的网页 OAuth fail-closed 下线。
明确排除支付、库存、储值、复杂会员、多门店组织、订单系统、泛 AI、PC 扫码登录、公众号网页授权,以及未授权的任何生产写入。
## 4. 本地验证证据
验证环境:
- macOS `26.5.2` / arm64
- OpenJDK `21.0.10`(项目按 Java 17 release 编译)
- 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**220 tests0 failure / 0 error / 0 skipped |
| backend `mvn -q -DskipTests package` | **PASS** |
| backend `bash -n deploy/*.sh` | **PASS** |
| legacy web OAuth regression contract | **PASS**:控制器不存在,公开 allowlist/配置/模板/README 均无旧路径、redirect 变量或 demo identity |
| backend 合成配置静态 preflight | **PASS**:不提供 `WECHAT_REDIRECT_URI` 仍通过静态门禁;以 stub 在数据库阶段前受控停止 |
| admin `npm run build` | **PASS**1671 modules仅既有 >500 kB chunk warning |
| frontend `npm run build:h5` | **PASS** |
| frontend `npm run build:mp-weixin` | **PASS**`verify-mp-app-json` PASS |
| admin/frontend 默认占位配置门禁 | **PASS**:按预期拒绝 `.invalid` |
| admin/frontend 合成 HTTPS 配置门禁 | **PASS**:只验证格式,未使用真实域名或秘密值 |
| pilot metrics v2 契约测试 | **PASS**:只读、默认门店 `0`、显式集合、成熟 cohort、四项反例、无直接标识输出 |
| pilot metrics v2 隔离 MySQL 执行 | **PASS**:门店/窗口隔离、同粒度转化、24h 成熟分母、事件顺序与四项反例通过RC3 查询内容与已验证 RC2 完全一致 |
| ontology validate | **PASS**288 条Action 75、Entity 29、Event 33、Relation 102、Rule 49 |
| ontology drift | **PASS**68/68 HTTP、16/16 JPAcode-only / ontology-only / entity drift 均为 0 |
| 四仓 `git diff --check` | **PASS** |
| 四仓工作树与远端 | 清单提交及 tag 推送后再次复核 |
隔离 MySQL 使用临时、无网络、无密码、纯合成最小 schema 与数据;执行结束即关闭和清理,没有连接或读取本机现有 MySQL 业务库。本地仍未运行最终 production profile 的 JPA `validate` 与生产库 31 项不变量,该项保留为生产 No-Go 门禁。
## 5. 本地构建产物与 SHA-256
目录 hash 算法:按相对路径以 `LC_ALL=C` 排序,对每个文件执行 SHA-256再对完整 hash 清单执行一次 SHA-256。
| 产物 | 大小 | SHA-256 | 可部署性 |
|---|---:|---|---|
| `backend/target/petstore-backend-1.0.0.jar` | 50,995,644 bytes | `c9dad3a9df93b84cef920aa75dbc5c7e786d91660f8f124b8872700572df9843` | 候选 JAR仍须真实配置与生产只读预检 |
| `backend/db/queries/pilot_metrics.sql` | source | `d2de4684722811028474001ed7e56bbf56297733509e1a71850d7ab404587210` | 仅限只读账号/副本;执行前显式填写门店集合与窗口 |
| admin `dist`27 files | 1,536 KiB | `4a955634c32db3d8d5cc8038572faa436462b36df02044eb3e55a39490823663` | **不可部署**:当前包含 `.invalid` 占位域名,仅证明可编译 |
| H5 `dist/build/h5`65 files | 852 KiB | `a77241af1a6b16183f03214adea070549a534cf768939202f3caa02d071aa6a5` | **不可部署**:当前包含 `.invalid` 占位域名,仅证明可编译 |
| 微信小程序 `dist/build/mp-weixin`142 files | 820 KiB | `f11b3cd95fb98f8ccec6b3556107d7e7bdc4eedf1c2e2975258bc766aa05525f` | **不可上传**:当前包含 `.invalid` 占位域名,仅证明可编译 |
正式 Admin/H5/小程序必须以权限受控的真实域名配置重新执行 release preflight 与 build并把新 hash 追加到生产发布记录。
## 6. 数据库迁移冻结
迁移只能按下列顺序执行;每一步先核对 SHA-256再执行脚本末尾反例查询。失败时停止不交换顺序、不自动 down migration、不猜测性回填。
| 顺序 | 文件 | 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` |
八迁移完成后,以正式 service user、最终 production 配置运行 `deploy/release-preflight.sh`。通过条件是静态配置门禁、JPA schema validate 和 31 项只读数据库不变量全部成功。
## 7. 生产 Go/No-Go
- [ ] Petstore 专用 API/Admin/报告域名与 TLS 就绪,不复用或修改其他产品域名;
- [ ] 权限受控的最终配置通过 backend、admin、frontend release preflight后端不再配置废弃的 `WECHAT_REDIRECT_URI`
- [ ] 生产全量备份完成,记录大小/hash并在隔离库完成恢复演练
- [ ] 八迁移依次执行,文件 hash 一致且每步末尾反例为 0
- [ ] production JPA `validate` 与 31 项只读数据库不变量通过;
- [ ] 正式 Admin/H5/小程序重新构建,记录 hash微信合法域名一致
- [ ] Petstore 独立 systemd/Nginx 配置完成,`nginx -t` 通过diff 未改 Gitea/GitLab
- [ ] liveness、readiness、只读 production smoke 通过;
- [ ] 老板、员工、宠主三角色主链及权限/异常反例全部签署 PASS
- [ ] 微信小程序真实 AppID/AppSecret、手机号 code 和 `wx.login` code 完成真机核验,旧网页 OAuth 路径不得作为替代;
- [ ] 外部监控、告警联系人、值班窗口和回滚执行人已真实测试;
- [ ] 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)
- 网页 OAuth 下线决策:[`架构决策-下线未实现微信网页OAuth-2026-08-02.md`](../架构决策-下线未实现微信网页OAuth-2026-08-02.md)
- 只读采集脚本:`backend/db/queries/pilot_metrics.sql`
- 发布与回滚步骤:[`生产发布与回滚Runbook-2026-08-01.md`](../生产发布与回滚Runbook-2026-08-01.md)
- 监控基线:[`生产监控与告警基线-2026-08-01.md`](../生产监控与告警基线-2026-08-01.md)
- 被取代候选:[`phase2-pilot-rc1-release-manifest.md`](./phase2-pilot-rc1-release-manifest.md)、[`phase2-pilot-rc2-release-manifest.md`](./phase2-pilot-rc2-release-manifest.md)
样本闸门为 35 家门店、观察 48 周、合计至少 200 次完整服务且每家至少 25 次。达到闸门后只能形成 `Continue`、`Iterate Core` 或 `Stop/Redesign` 三类结论;在此之前不扩展支付、库存、储值、复杂会员、多门店组织、订单系统或泛 AI。
## 9. 已知风险与回滚边界
- Admin 主 bundle 的 >500 kB warning 是已知性能债;不阻断小流量试点,但正式包仍应观察首次加载和弱网体验。
- readiness 会因数据库、磁盘、上传目录、FFmpeg/ffprobe 任一依赖异常而拒绝接流;服务器端必须逐项核验权限和路径。
- 指标 v2 已在 MySQL 8.0.46 隔离实例执行;生产实际版本、数据量与执行计划仍须用只读账号在发布窗口复核,不得在主库高峰期首次运行。
- 迁移均按向前兼容设计。常规故障只回退 backend/admin/H5 版本软链接及小程序平台版本,不删除列/表/索引,不自动恢复旧备份。
- 灾难性整库恢复会丢失备份时间点后的数据必须另获业务负责人、DBA 与隐私负责人书面授权;本 RC 不授权该操作。
- 本地验证没有使用生产凭据、真实微信账号、真实门店数据也没有连接或修改任何生产服务器、Gitea、GitLab、Nginx、证书或业务数据库。