# Meeting Attendance Outlook Sync 上线清单 (2026-03-02)

## 1. 权限清单（Azure + Exchange）
- Azure App Registration 已配置并完成管理员同意（Admin Consent）。
- Microsoft Graph 应用权限：
- `Calendars.Read`（读取会议）
- `Calendars.ReadWrite`（如需创建/更新订阅或写回场景）
- `MailboxSettings.Read`（读取时区等邮箱配置）
- Exchange 应用访问范围策略已确认：
- 允许访问管理员个人邮箱范围（自动纳管）
- 若使用最小权限策略，确保会议管理员邮箱均在允许集内

## 2. 配置清单（环境与后台）
- 环境变量（.env 与模板）
- `AZURE_TENANT_ID`
- `AZURE_CLIENT_ID`
- `AZURE_CLIENT_SECRET`
- `APP_PUBLIC_BASE_URL`
- 后台配置（Outlook 同步设置）
- `reconcileCron`（对账 Cron）
- `deltaBatchSize`
- `lookaheadDays`
- `lookbackDays`
- `maxRetry`
- `retryBackoffMs`
- `renewBeforeMinutes`
- 自动邮箱纳管
- 会议管理员首次进入同步页可自动创建/启用个人邮箱配置
- 自动创建订阅失败不阻塞候选会议展示（需检查告警）

## 3. 发布前巡检
- 数据库
- 执行 Prisma 迁移：`cd backend && npm run prisma:migrate:deploy`
- 生成客户端：`cd backend && npm run prisma:generate`
- 构建
- `cd backend && npm run build`
- `cd frontend && npm run build`
- 功能冒烟（MCP）
- 打开 `/meetingattendance/integrations/outlook`
- 校验候选列表包含 `seriesMaster`
- 纳管一条会议，确认状态变为 `Managed`
- 排除一个 occurrence，确认显示 `Occurrence excluded`
- 触发一次 `Run Reconcile`，确认接口 200

## 4. 上线后巡检（T+0 / T+1）
- T+0（上线后 30 分钟内）
- 核对 `Last Sync / Last Reconcile / Last Error` 字段
- 检查 webhook/delta/reconcile 是否有失败峰值
- 抽查 1 个系列会议：seriesMaster + occurrence 状态一致
- T+1（日常）
- 检查失败重试是否收敛
- 检查候选池是否持续有数据更新
- 检查排除规则是否按预期生效

## 5. 回滚方案
- 代码回滚
- 回滚到上一个稳定版本（前后端同时回滚）
- 数据回滚策略
- 本次迁移新增字段/表为增量设计，优先“逻辑停用”而非删表
- 通过后台关闭 Outlook 同步入口与定时对账
- 运行回滚 SQL 仅在必须时执行，并先全库备份
- 业务降级
- 保留历史手动创建会议流程作为兜底
- 暂停新纳管，仅保留已纳管会议只读查看

## 6. 发布交付物
- 代码：Outlook 同步全链路（系列纳管 + 单次排除 + 分页过滤）
- 文档：meeting-attendance 模块 01~09 + 99 已更新
- 测试：`testing/reports/meeting-attendance-2026-03-02-e2e-report.md`
