# Phase 1 FollowUpTask 与真实再次预约交付证据

> 日期：2026-08-02  
> 范围：Backend + Admin + Docs/Ontology  
> 状态：Code Complete / Local Gates Passed / Production Not Migrated

## 1. 交付结果

- `ReportLead` 收口为宠主同意与来源事实；新增 `FollowUpTask` 作为门店可执行回访对象。
- 状态机支持领取、未接通/稍后联系改期、无意向/无效联系方式关闭，以及退订取消。
- Admin `/leads` 已切换为任务池；同店员工可实际联系、读取真实号源并代客创建预约。
- `rebooked` 只由真实 Appointment 保存成功触发；容量、客户归属或状态校验失败时不闭环。
- 工作台到期回访改读 FollowUpTask；报告漏斗的回访后预约改读 `rebook_created`。
- 客户事实时间线新增回访创建/领取/改期/完成/取消/再次预约的低敏投影。

## 2. 自动化证据

| Gate | 结果 |
|------|------|
| Backend full test | PASS：217 tests，0 failures，0 errors，0 skipped |
| Admin production build | PASS：Vue type-check + Vite，1671 modules transformed |
| Ontology validation | PASS：290 entries，引用完整 |
| Endpoint drift | PASS：70/70 HTTP，code-only=0，ontology-only=0 |
| Entity drift | PASS：16/16 JPA，missing=0，extra=0 |
| Diff whitespace | PASS：backend/admin/docs `git diff --check` |

关键新增覆盖：`FollowUpTaskMigrationTest`、`FollowUpTaskServiceTest`、`AdminFollowUpTaskControllerTest`，以及 Appointment/BusinessEvent/Workbench/Timeline 的回归用例。反例包含跨店 404、他人领取冲突、未领取关闭拒绝、退订不虚增联系次数、跨店预约拒绝、容量不足不触碰任务。

## 3. Data Model Review

结论：PASS（代码与迁移层面）。

- `t_follow_up_task` 使用随机 `task_id` 对外、自增 ID 内部关联、`@Version` 与悲观锁处理竞争。
- 生产迁移只回填可靠的历史 `pending` 留资；不猜测其他历史结果。
- 31 项生产只读预检中新增五项，覆盖客户 canonical 范围、状态/领取/回执、开放唯一性、真实 Appointment 与 BusinessEvent 引用。
- 迁移为向前兼容新增表；常规应用回滚不得删除表或覆盖已产生任务/事件。

## 4. Privacy Review

结论：PASS（静态契约与自动化层面）。

- 完整手机号仅在本店已认证 boss/staff 的开放回访任务中返回，目的限定为实际联系；终态任务只返回脱敏手机号。
- Workbench、CustomerTimeline、BusinessEvent、AuditLog 不保存或返回完整手机号。
- 事件 metadata 白名单不含手机号、token、openid/unionid、IP、备注、媒体 URL 或原始请求。
- 跨店任务使用 404，降低可枚举性；customer 无任务接口权限。

## 5. 尚未完成的外部证据

- 未在生产或真实试点库执行第八个迁移 `20260802_create_follow_up_task.sql`。
- 未以最终 production 环境运行 schema validate + 31 项只读预检。
- 未完成 boss/staff/customer 三角色真实环境 smoke，尤其是双员工抢领、退订与无号源再次预约。
- 未在 3～5 家试点门店验证任务领取习惯、接通率、再次预约率和约 200 单完整服务样本。

上述项目进入试点 RC 门禁，不因本地自动化通过而标记为上线完成。
