# Phase 0 门店开通与员工邀请验收记录

> 日期：2026-08-02  
> 状态：Code Complete / Ready for Release，待生产迁移与微信真机验收  
> 生产数据库与服务器：本批未触碰

## 1. 自动验证

| 检查 | 结果 |
|------|------|
| Backend tests | PASS（193 tests，0 failure/error/skip） |
| Backend package | PASS |
| Admin production build | PASS |
| H5 build | PASS |
| mp-weixin build + app-json verification | PASS |
| Ontology validation/drift | PASS（258 条；65/65 HTTP、15/15 JPA、0 drift） |
| Release shell syntax | PASS（`backend/deploy/*.sh`） |

## 2. 自动化覆盖

- token 原文与数据库 hash 分离、手机号脱敏；
- 邀请手机号不匹配不创建账号；
- 接受成功创建 staff、消费邀请、写低敏 AuditLog；
- 开通必填项缺失不能完成，单人门店可完成；
- 已完成开通的门店不能再清空名称、电话或地址；
- 老板微信核验注册不产生可登录密码，并同时写入 `store_registered` BusinessEvent 与 AuditLog；
- Audit metadata 拒绝 token/手机号；
- 门店/角色/删除状态变化会立即让旧 session 失效；
- Nginx Petstore 专用 access log 只记录 `$uri`，不记录携带报告/邀请 token 的 query；
- 第六个迁移包含 token hash、状态机与六项回执不变量。

## 3. 三角色真机验收（发布前必做）

### Boss

- [ ] 新微信手机号创建门店，无手填手机号/明文密码；自动登录后进入开通清单。
- [ ] 缺地址时不能完成；补齐资料、确认容量和服务后可完成；单人门店无需先邀请员工。
- [ ] 创建 3/7/14/30 天邀请，创建后只显示一次原始口令；可分享小程序卡片。
- [ ] 邀请列表只有脱敏手机号；pending 可撤销，accepted 不能撤销。

### Staff

- [ ] 从卡片进入看到正确门店、姓名、脱敏手机号与有效期。
- [ ] 不匹配微信手机号被拒绝且不创建账号；匹配手机号成功加入并直接获得 staff session。
- [ ] 邀请重复打开幂等登录同一 staff；过期/撤销邀请有明确提示。
- [ ] 被老板删除后，已有页面下一次受保护请求立即 401 并要求重新登录。

### Customer / 权限反例

- [ ] customer 不能查看/创建/撤销门店邀请，也不能完成开通。
- [ ] 已有 customer 手机号接受员工邀请明确返回账号冲突，不静默改变角色。
- [ ] legacy 永久邀请码查询/注册、直接创建员工、旧老板/门店注册入口均返回明确停用码且无写入。

## 4. 发布门禁

- [ ] 按固定顺序执行第六个迁移 `20260802_create_store_onboarding.sql`，六项验证均为 0。
- [ ] 以最终生产配置运行 JPA `validate` + 24 项只读不变量预检。
- [ ] 微信体验版双微信账号完成 Boss → 分享 → Staff 接受全链路；证据不包含完整手机号或 token。
- [ ] 旧版本回滚已确认忽略新增表/列；不执行 down migration。
