# 宠小它 Phase 2 Pilot RC5 Release Manifest > RC ID:`phase2-pilot-rc5` > 冻结日期:2026-08-02 > 状态:**Ready for Release(未部署)** > 适用范围:3~5 家独立宠物洗护单店真实试点 > 样本目标:约 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 tests,0 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 既有入口健康,服务器端口和证书未受影响; - [ ] 3~5 个真实门店 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) 样本闸门为 3~5 家门店、观察 4~8 周、合计至少 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、证书或业务数据库。