petstore-docs/qa-reports/phase2-pilot-rc6-release-manifest.md
2026-08-02 03:30:34 +08:00

117 lines
8.8 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 RC6 Release Manifest
> RC ID`phase2-pilot-rc6`
> 冻结日期2026-08-02
> 状态:**Ready for Release未部署**
> 适用范围35 家独立宠物洗护单店真实试点
> 样本目标:约 200 次完整服务后进行 Phase 2 / 商业化决策
RC6 是当前唯一推荐候选:它继承 RC5 的 CORS 与敏感日志边界,并把 Session token 过期契约改为严格 fail-closed。真实生产配置、备份恢复、八个迁移、TLS、live smoke、三角色验收和首份真实指标基线未形成证据前不得把状态改为 `Released`
## 1. 前序 RC 取代说明
- RC1RC4 分别因指标 cohort、伪微信网页 OAuth 和重复 CORS 策略被后续候选取代,保留审计记录。
- `phase2-pilot-rc5` 已收口敏感日志,但签名正确且缺失、非数字或非正 `exp` 的 token 仍可能绕过过期判断,非正 TTL 还会静默回退为 7 天;被 RC6 取代。
RC6 要求 `exp` 是严格晚于当前时间的 Unix 秒,非正 TTL 拒绝构造production TTL 只允许 3002592000 秒。正常签发 token 均已有合法 `exp`本次没有数据库、API 或客户端迁移。
## 2. 冻结提交与回滚点
| 仓库 | RC6 commit / ref | 前一候选回滚点RC5 | 冻结状态 |
|---|---|---|---|
| backend | `d99b6d6e6de184d122322170de476ba4c16d5ac3` | `2a3cfa0ac45891ad8be6adf5028e1c89e792d0d1` | `main == origin/main`clean |
| admin | `078ae0f9d18e6598a1af13fa8bf2b5b97c25a410` | 同 commit | `main == origin/main`clean |
| frontend | `a595ea8fa17dd0dbdfb607abea93e8c0d24b13a8` | 同 commit | `main == origin/main`clean |
| docs | `refs/tags/phase2-pilot-rc6`(本清单所在 commit | `0fe2245a6fef29fac7074643d27af22183a3d07e` | tag 推送后解析并复核 clean |
部署前必须在四仓解析 `phase2-pilot-rc6` 并与本表一致;源码、产物 hash 或 tag 有任何变化都必须建立新 RC不得移动已有 tag。
## 3. RC 产品范围
本候选包含:身份拆分、同店 `StoreCustomer`、不可变 `BusinessEvent/AuditLog`、服务时长与容量排班、行动工作台、报告发送确认、微信核验入驻与一次性员工邀请、客户低敏时间线、`FollowUpTask` 回访及再次预约归因、三角色验收、cohort-safe 指标查询、生产 preflight/readiness/smoke/回滚、全局 CORS、敏感日志和严格 Session 过期边界。
明确排除支付、库存、储值、复杂会员、多门店组织、订单系统、泛 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**229 tests0 failure / 0 error / 0 skipped |
| backend package / `bash -n deploy/*.sh` | **PASS** |
| Session 签名反例 | **PASS**:使用真实 HMAC 构造签名正确的缺失 exp、exp=0、当前秒和非数字 exp全部拒绝 |
| Session TTL 服务边界 | **PASS**0 与负数拒绝构造 |
| production TTL Java 门禁 | **PASS**:短于 300 秒、长于 2592000 秒均拒绝 |
| production TTL shell 门禁 | **PASS**非整数拒绝、越界拒绝、604800 通过;合成执行以 `/usr/bin/true` 截止在数据库启动前,未连接外部服务 |
| 敏感日志 / CORS 契约 | **PASS**2 项日志契约、4 项真实 Filter 契约 |
| 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 验证继续有效 |
| 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 JAR | 50,995,589 bytes | `c989bb75a0ab6c32f96ffec24b04060cffc303b6923edb0cc6ba1355601460a9` | 候选;仍须真实配置与生产只读预检 |
| `pilot_metrics.sql` | source | `d2de4684722811028474001ed7e56bbf56297733509e1a71850d7ab404587210` | 仅限只读账号/副本 |
| admin `dist`27 files | 1,536 KiB | `181005e11373ef9bbdba50bce35eb40b5a159c6acd8f89196749d1c12a0b4f8c` | **不可部署**:含 `.invalid` 占位域名 |
| H565 files | 852 KiB | `1f810d55d25fa86906dfb5c2a8765d24af1258ac23d91e75858495e3c121d34a` | **不可部署**:含 `.invalid` 占位域名 |
| 微信小程序142 files | 820 KiB | `b06ef5bdfd70c59ff91cc405ac99c0b15625c926f8f49dc9e561def9b1300587` | **不可上传**:含 `.invalid` 占位域名 |
正式三端产物必须以权限受控的真实域名配置重新 preflight/build并把新 hash 写入生产发布记录。
## 6. 数据库迁移冻结
八个迁移的内容与 hash 未变化,必须按以下顺序执行:
| 顺序 | 文件 | 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 已轮换;
- [ ] 最终配置通过三端 preflightSession TTL 为 3002592000 秒;
- [ ] CORS 仅含正式 Web originController 局部 `@CrossOrigin` 为 0
- [ ] 全量备份及隔离恢复演练完成;
- [ ] 八迁移逐项 hash 一致、反例为 0JPA validate 和 31 项不变量通过;
- [ ] 正式三端产物及 hash 已归档;
- [ ] 独立 systemd/Nginx 就绪,未修改 Gitea/GitLab
- [ ] liveness、readiness、7/7 live smoke 和 CORS allow/deny 通过;
- [ ] 日志抽查不含手机号、凭据、token、query URL 或私密媒体地址;
- [ ] 老板、员工、宠主三角色及真实微信真机验收签署 PASS
- [ ] 外部监控、值班、回滚执行人和 Gitea/GitLab 健康检查完成;
- [ ] 35 家门店进入观察,累计至少 200 次完整服务且每店至少 25 次,低敏指标与四项可靠性反例留档。
任一项未完成,结论都是 `No-Go / Ready for Release`,不得标记已上线。
## 8. 试点与已知边界
- Session 决策:[`架构决策-SessionToken严格过期边界-2026-08-02.md`](../架构决策-SessionToken严格过期边界-2026-08-02.md)
- 三角色验收:[`试点三角色端到端验收清单-2026-08-02.md`](../试点三角色端到端验收清单-2026-08-02.md)
- 指标方案:[`试点指标采集与Phase2决策方案-2026-08-02.md`](../试点指标采集与Phase2决策方案-2026-08-02.md)
- 发布 Runbook[`生产发布与回滚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)、[`rc5`](./phase2-pilot-rc5-release-manifest.md)
当前无服务端逐 token logout 吊销表;试点通过客户端清理 token 退出,账号删除、角色/门店变化仍由每次请求的活跃账号检查立即失效。样本闸门达到后只能形成 `Continue`、`Iterate Core` 或 `Stop/Redesign`,不得提前扩展排除项。