docs: freeze phase2 pilot rc6
This commit is contained in:
parent
7474d9b4e7
commit
5093bfc206
116
qa-reports/phase2-pilot-rc6-release-manifest.md
Normal file
116
qa-reports/phase2-pilot-rc6-release-manifest.md
Normal file
@ -0,0 +1,116 @@
|
||||
# 宠小它 Phase 2 Pilot RC6 Release Manifest
|
||||
|
||||
> RC ID:`phase2-pilot-rc6`
|
||||
> 冻结日期:2026-08-02
|
||||
> 状态:**Ready for Release(未部署)**
|
||||
> 适用范围:3~5 家独立宠物洗护单店真实试点
|
||||
> 样本目标:约 200 次完整服务后进行 Phase 2 / 商业化决策
|
||||
|
||||
RC6 是当前唯一推荐候选:它继承 RC5 的 CORS 与敏感日志边界,并把 Session token 过期契约改为严格 fail-closed。真实生产配置、备份恢复、八个迁移、TLS、live smoke、三角色验收和首份真实指标基线未形成证据前,不得把状态改为 `Released`。
|
||||
|
||||
## 1. 前序 RC 取代说明
|
||||
|
||||
- RC1~RC4 分别因指标 cohort、伪微信网页 OAuth 和重复 CORS 策略被后续候选取代,保留审计记录。
|
||||
- `phase2-pilot-rc5` 已收口敏感日志,但签名正确且缺失、非数字或非正 `exp` 的 token 仍可能绕过过期判断,非正 TTL 还会静默回退为 7 天;被 RC6 取代。
|
||||
|
||||
RC6 要求 `exp` 是严格晚于当前时间的 Unix 秒,非正 TTL 拒绝构造,production TTL 只允许 300~2592000 秒。正常签发 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 tests,0 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` 占位域名 |
|
||||
| H5(65 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 已轮换;
|
||||
- [ ] 最终配置通过三端 preflight,Session TTL 为 300~2592000 秒;
|
||||
- [ ] CORS 仅含正式 Web origin,Controller 局部 `@CrossOrigin` 为 0;
|
||||
- [ ] 全量备份及隔离恢复演练完成;
|
||||
- [ ] 八迁移逐项 hash 一致、反例为 0;JPA validate 和 31 项不变量通过;
|
||||
- [ ] 正式三端产物及 hash 已归档;
|
||||
- [ ] 独立 systemd/Nginx 就绪,未修改 Gitea/GitLab;
|
||||
- [ ] liveness、readiness、7/7 live smoke 和 CORS allow/deny 通过;
|
||||
- [ ] 日志抽查不含手机号、凭据、token、query URL 或私密媒体地址;
|
||||
- [ ] 老板、员工、宠主三角色及真实微信真机验收签署 PASS;
|
||||
- [ ] 外部监控、值班、回滚执行人和 Gitea/GitLab 健康检查完成;
|
||||
- [ ] 3~5 家门店进入观察,累计至少 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`,不得提前扩展排除项。
|
||||
Loading…
Reference in New Issue
Block a user