Files
nexus/Project/fonrey/REVIEW/REVIEW_登录管理_平台管理后台_2026-05-02.md
2026-05-02 16:21:46 +08:00

449 lines
51 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Fonrey 全量 Review — 登录管理 + 平台管理后台
- **Review 范围**:登录管理模块 + 平台管理后台模块
- **Review 日期**2026-05-02
- **Review 维度**8 维度PRD质量 / PRD↔TECH一致性 / DATA_MODEL / API / UI_SYSTEM / 安全多租户 / 性能扩展 / 遗漏场景)
- **审查文档**
- PRD`PRD_MVP.md``登录管理/用户登录管理模块PRD.md` (v3.0)、`平台管理后台/平台管理后台PRD.md`
- TECH`TECH_STACK.md` (v2.5)、`登录管理技术方案.md` (v4.1)、`平台管理后台技术方案.md``API_CONTRACT.md``测试规范.md`
- DATA_MODEL`DATA_MODEL.md``DATA_MODEL_LOGIN.md``DATA_MODEL_PUBLIC.md``ENUMS.md` (v2.2)
- UI`UI_SYSTEM.md``组件清单.md``组件规范设计.md``UI_DESIGN/登录管理/登录_UI.md``UI_DESIGN/平台管理后台/平台管理后台_UI.md` 及 4 份 HTML 原型
- **严重程度图例**:🔴 Blocker影响交付需立即处理/ 🟠 Major影响质量需在迭代内处理/ 🟡 Minor建议优化
---
## 维度一PRD 质量
### 🔴 P-B-1 平台管理后台 PRD 缺失 OpenAPI 与功能编号体系
- **位置**[平台管理后台PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md) 全文 835 行
- **问题**:用户故事未编号(无 PA-001/PA-002 等可追溯标识),与 [用户登录管理模块PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.md) v3.0 已剥离实现细节后的"功能 ID + 验收标准"风格不一致。导致需求→测试用例→Bug 单的可追溯链条断裂。
- **改进方向**:按登录 PRD v3.0 风格补齐编号 (PA-001 ~ PA-NN),每条用户故事附"验收标准 (AC)"小节。
- **责任角色**PM / Product Owner
### 🟠 P-B-2 平台管理后台 PRD 仍混入实现/字段细节
- **位置**[平台管理后台PRD.md L210-L350](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md#L210-L350) 段落
- **问题**:租户创建/升级/暂停章节出现 `tenant_code``schema_name``status` CHECK 值等数据层概念;与 ADR-20260502-003 "PRD 剥离实现细节"原则违背。
- **改进方向**:按登录 PRD v3.0 模式将字段/状态描述迁出至 DATA_MODEL_PUBLIC.mdPRD 仅保留业务语义("租户进入暂停态后所有用户登录被拒绝")。
- **责任角色**PM + Backend Architect
### 🟠 P-B-3 平台管理员PlatformAdmin"权限矩阵"未量化
- **位置**[平台管理后台PRD.md L40-L60, L520-L560](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md#L40-L60) 与 [DATA_MODEL_PUBLIC.md L189-L250](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md#L189-L250) `platform_admins`
- **问题**PRD 提到 `super_admin` / `ops` / `support` 三种角色,但未列"角色 × 操作 × 资源"矩阵。技术方案与 DATA_MODEL 也未补齐。
- **改进方向**:在 PRD 增 §权限矩阵小节,列出每条平台操作(创建租户/暂停租户/查看审计日志/发布客户端版本/等)所需角色,并与 `platform_admins.role` 枚举对应。
- **责任角色**PM + 安全负责人
### 🟡 P-L-1 登录 PRD 验收标准粒度偏粗
- **位置**[用户登录管理模块PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.md) UC-LOGIN-* 段
- **问题**:部分验收标准只描述"成功"路径,未列出所有失败路径覆盖的提示文案(与 [组件规范设计.md](file:///mnt/d/Workspace/nexus/Project/fonrey/UI_SYSTEM/%E7%BB%84%E4%BB%B6%E8%A7%84%E8%8C%83%E8%AE%BE%E8%AE%A1.md) Toast/Form Error 规范脱节)。
- **改进方向**:每条 UC 补充"异常路径 ×N → 文案 / 状态码"。
- **责任角色**PM
---
## 维度二PRD ↔ TECH 一致性
### 🔴 PT-B-1 创建租户事务边界与回滚补偿未在技术方案落地
- **位置**[平台管理后台PRD.md L122-L170](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md#L122-L170) vs [平台管理后台技术方案.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88.md)
- **问题**PRD 描述"创建租户 → 建 schema → 跑 migration → 创建 Tenant Admin → 发欢迎邮件"为一体化流程但技术方案未说明django-tenants `create_tenant` 与 Django 默认事务无法包裹 `CREATE SCHEMA`migration 中途失败、欢迎邮件发送失败的补偿/回滚策略缺失。状态机仅定义 `creating`/`failed`,但谁置位 `failed`、是否清理半成品 schema 未规定。
- **改进方向**:技术方案补"租户创建 Saga"章节:步骤 1-N、每步失败的补偿动作、`failed` 后的人工/定时清理任务。同步在 PRD 注明"创建过程为异步,最终一致"。
- **责任角色**Backend Architect + Platform Ops
### 🟠 PT-B-2 客户端发版灰度策略 PRD/TECH 描述不一致
- **位置**[平台管理后台PRD.md L476-L520](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md#L476-L520) vs [平台管理后台技术方案.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88.md)
- **问题**PRD 描述"按租户/百分比灰度",但 [DATA_MODEL_PUBLIC.md client_releases L488-L505](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md#L488-L505) 仅有 `channel``rollout_percent`,无"租户白名单"字段,技术方案对此未澄清。
- **改进方向**:技术方案明确灰度策略对象(租户级 OR 百分比级或两者并存DATA_MODEL 同步增 `rollout_tenant_codes JSONB``client_release_tenants` 关联表。
- **责任角色**Backend Architect + DBA
### 🟠 PT-B-3 平台管理员 MFA 在 PRD 强约束但 TECH 未规定算法/实现
- **位置**[平台管理后台PRD.md L60](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md#L60)"super_admin 必须 MFA" vs [平台管理后台技术方案.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88.md)、[DATA_MODEL_PUBLIC.md platform_admins L189-L250](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md#L189-L250)
- **问题**:未定义 MFA 类型TOTP / SMS / WebAuthn、密钥存储位置、登录流程接入点、备份码机制。`platform_admins` 表无 `mfa_secret`/`mfa_enabled` 字段。
- **改进方向**:技术方案选定 TOTPpyotp方案DATA_MODEL 增 `mfa_enabled BOOL``mfa_secret_enc TEXT``mfa_recovery_codes_enc TEXT`PRD 注明备份码生成/重置规则。
- **责任角色**:安全负责人 + Backend Architect
### 🟠 PT-L-1 登录 PRD "首次登录强制改密" 与 TECH 实现路径未对齐
- **位置**[用户登录管理模块PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.md) "is_initial_password" + [DATA_MODEL_LOGIN.md](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md) `user_accounts.is_initial_password` + [登录管理技术方案.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88.md) v4.1
- **问题**PRD 要求"首次登录必须改密才能进入业务",但技术方案未明确:登录 API 返回时如何标记需要改密(专用 HTTP code/Header/JSON flag中间件/装饰器在哪一层拦截HTMX 前端如何重定向。
- **改进方向**:技术方案补 §"初始密码拦截器":登录响应增 `must_change_password: true` 字段;新增 `RequirePasswordChangeMiddleware`HTMX 通过 `HX-Redirect` 跳转 `/account/change-password`
- **责任角色**Backend Architect + Frontend Lead
### 🟡 PT-L-2 账户锁定阈值 PRD 与 TECH 描述存在微差
- **位置**[用户登录管理模块PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.md) §账户锁定 vs [DATA_MODEL_LOGIN.md L411-L423](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md#L411-L423)Redis 计数器说明)
- **问题**PRD 写"连续 5 次失败锁定 30 分钟"DATA_MODEL 注释也说 5 次,但 [登录管理技术方案.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88.md) 未将阈值/窗口/键名作为可配置项明示,存在硬编码风险。
- **改进方向**:技术方案显式列出 settings`LOGIN_FAIL_THRESHOLD=5``LOGIN_LOCK_DURATION_MIN=30`、Redis key `login_fail:{tenant}:{username}`
- **责任角色**Backend Architect
---
## 维度三DATA_MODEL数据模型
### 🔴 D-1 `public.platform_audit_logs.result` 大小写违反 ENUMS.md 规范
- **位置**[ENUMS.md L70-L72](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/ENUMS.md#L70-L72) vs [DATA_MODEL_PUBLIC.md L274-L275](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md#L274-L275)
- **问题**ENUMS.md 规定 `success`/`failed`lower_snake_case文件首部 L10 强制要求DDL 实际为 `CHECK (result IN ('SUCCESS','FAILED'))` DEFAULT `'SUCCESS'`。前端 enum_labels、查询过滤、报表全部错位。
- **改进方向**DDL 改为小写并执行迁移 `UPDATE platform_audit_logs SET result = lower(result)`;同步 enum_labels fixture。
- **责任角色**DBA + Backend Architect
### 🔴 D-2 `public.export_tasks.status` `done` vs ENUMS `success` 不一致
- **位置**[ENUMS.md L102-L106](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/ENUMS.md#L102-L106) vs [DATA_MODEL_PUBLIC.md L351-L353](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md#L351-L353)
- **问题**ENUMS 已迁移为 `success`(注明"原 `done`,已迁移"DDL 仍为 `CHECK (status IN ('pending','in_progress','done','failed'))``backup_records.status` 已用 `success`,与之分裂。
- **改进方向**DDL CHECK + DEFAULT 改为 `success`,迁移脚本 `UPDATE export_tasks SET status='success' WHERE status='done'`
- **责任角色**DBA
### 🟠 D-3 ENUMS.md 缺失 `tenants.suspended_reason` 的 `license_expired`
- **位置**[ENUMS.md L55-L59](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/ENUMS.md#L55-L59) vs [DATA_MODEL_PUBLIC.md L115](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md#L115)
- **问题**DDL CHECK 已包含 `license_expired`ENUMS.md 仅列 `overdue/violation/requested/other`。前端文案/报表无法对该值取值。
- **改进方向**ENUMS.md 补 `license_expired`,记录变更 ADR同步 enum_labels。
- **责任角色**ENUMS.md 维护者(架构 Atlas
### 🟠 D-4 ENUMS.md 缺失 `login_attempts.failure_reason` 的 OTP 相关值
- **位置**[ENUMS.md L168-L174](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/ENUMS.md#L168-L174) vs [DATA_MODEL_LOGIN.md L220-L224, L266-L274](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md#L220-L224)
- **问题**DDL/Model choices 含 `wrong_otp`/`otp_expired`ENUMS.md 漏写。
- **改进方向**ENUMS.md 补两个值。
- **责任角色**ENUMS.md 维护者
### 🟠 D-5 `user_accounts.phone_enc / phone_hash` 业务必填但 DB 可空
- **位置**[用户登录管理模块PRD.md L31-L33](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.md#L31-L33) vs [DATA_MODEL_LOGIN.md L80-L81](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md#L80-L81)
- **问题**PRD 规定 `username` 等于手机号且必填,但 `phone_enc TEXT NULL``phone_hash VARCHAR(64) NULL`。导入/数据修复时可能写入不一致数据,且 `phone_hash` 唯一性索引(若有)可能失效。
- **改进方向**:业务确认后将 `phone_hash` 改 NOT NULL普通员工或改用 `username``phone_hash` 计算源在应用层强约束 + 触发器保证一致性。
- **责任角色**accounts 模块负责人 + DBA
### 🟠 D-6 `client_heartbeats` 无分区策略
- **位置**[DATA_MODEL_PUBLIC.md L568-L609](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md#L568-L609)
- **问题**:心跳表为高频写表(按 PRD 推算每客户端每 5 分钟一条),无 RANGE 分区,长期会变成 TB 级单表。
- **改进方向**:按 `received_at` 月度 RANGE 分区;保留 90 天,老分区归档至冷库或删除。
- **责任角色**DBA
### 🟠 D-7 `platform_audit_logs.payload_summary` 缺全文索引
- **位置**[DATA_MODEL_PUBLIC.md L260-L290](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md#L260-L290)
- **问题**PRD 要求平台审计日志支持关键字搜索,但 `payload_summary` 仅 B-Tree 索引,无 GIN/tsvector 索引。
- **改进方向**:增 `CREATE INDEX ON platform_audit_logs USING GIN (to_tsvector('simple', payload_summary))`
- **责任角色**DBA
### 🟡 D-8 跨 schema 操作规范未沉淀到 DATA_MODEL.md 头部
- **位置**[DATA_MODEL.md](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL.md) 总纲
- **问题**django-tenants 下不可建跨 schema FK但 README 未明示该约定,新人可能误建外键。
- **改进方向**DATA_MODEL.md 增 §跨 schema 规范小节。
- **责任角色**Data Model Owner
---
## 维度四API 契约
### 🔴 A-B-1 平台管理后台核心端点未在 API_CONTRACT.md 出现
- **位置**[API_CONTRACT.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/API_CONTRACT.md) vs [平台管理后台PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md)
- **问题**:平台后台所述创建租户/暂停租户/发布客户端版本/查看审计等 API 均未在契约文档定义;前后端无对接基线。
- **改进方向**API_CONTRACT.md 增 §平台管理后台 端点章节,列出 path/method/请求/响应/错误码。
- **责任角色**Backend Architect + API 文档负责人
### 🟠 A-L-1 登录端点错误码未对齐 ENUMS `failure_reason`
- **位置**[API_CONTRACT.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/API_CONTRACT.md) login 端点 vs [ENUMS.md L168-L174](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/ENUMS.md#L168-L174)
- **问题**API 返回错误码与 `login_attempts.failure_reason` 枚举无映射表,客户端无法根据错误码呈现差异化文案。
- **改进方向**:增"错误码 ↔ failure_reason ↔ 用户文案"三列对照表。
- **责任角色**Backend Architect + 安全负责人
### 🟠 A-B-2 客户端心跳/版本检查 API 无幂等与限流约定
- **位置**[API_CONTRACT.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/API_CONTRACT.md) vs [平台管理后台PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md) §客户端版本管理
- **问题**:心跳/版本检查为高频公网入口,未规定 `Idempotency-Key`、限流阈值(每客户端 N 次/分钟)、签名校验。
- **改进方向**API_CONTRACT 补限流 + HMAC 签名(基于 client_id + secret
- **责任角色**Backend Architect + 安全
### 🟡 A-G-1 全局 API 错误响应结构未统一
- **位置**[API_CONTRACT.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/API_CONTRACT.md)
- **问题**:示例中部分接口错误体为 `{detail: "..."}`、部分为 `{code, message, errors[]}`,前端难以统一错误处理。
- **改进方向**:统一为 RFC 7807 Problem Details 或自定义 `{code, message, details}` 结构。
- **责任角色**Backend Architect
---
## 维度五UI / UI_SYSTEM
### 🟠 U-B-1 平台后台 UI 设计未引用 `组件清单.md` 中已定义组件
- **位置**[UI_DESIGN/平台管理后台/平台管理后台_UI.md](file:///mnt/d/Workspace/nexus/Project/fonrey/UI_DESIGN/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0_UI.md) + [平台管理后台_UI.html](file:///mnt/d/Workspace/nexus/Project/fonrey/UI_DESIGN/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0_UI.html) vs [组件清单.md](file:///mnt/d/Workspace/nexus/Project/fonrey/UI_SYSTEM/%E7%BB%84%E4%BB%B6%E6%B8%85%E5%8D%95.md)
- **问题**HTML 原型直接写裸 Tailwind 类,未与组件清单中的 `<button>` / `<table>` / `<modal>` 规范关联。前端实现易产生样式漂移。
- **改进方向**UI 设计文档每个区块标注引用组件 ID如 "DataTable v1"HTML 原型用占位 class 体现组件契约。
- **责任角色**Frontend Lead + UI Designer
### 🟠 U-L-1 登录 UI 缺失"账户锁定"与"密码过期"专用状态页
- **位置**[UI_DESIGN/登录管理/登录_UI.md](file:///mnt/d/Workspace/nexus/Project/fonrey/UI_DESIGN/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%99%BB%E5%BD%95_UI.md) + 3 份 HTML 原型
- **问题**PRD 描述了账户锁定、密码过期、首次登录强制改密 3 类状态,但 UI 设计仅覆盖登录、账密、重置密码 3 种页面。
- **改进方向**:补"已锁定""密码过期"状态页或在登录页定义 inline 提示规范。
- **责任角色**UI Designer + Frontend Lead
### 🟡 U-G-1 UI_SYSTEM 缺无障碍A11y规范
- **位置**[UI_SYSTEM.md](file:///mnt/d/Workspace/nexus/Project/fonrey/UI_SYSTEM/UI_SYSTEM.md)
- **问题**:未规定 ARIA、键盘导航、对比度门槛。
- **改进方向**:增 §A11y 章节WCAG 2.1 AA 基线)。
- **责任角色**UI Designer
### 🟡 U-G-2 HTML 原型与 `组件规范设计.md` 间距/色板未对齐
- **位置**[平台管理后台_UI.html](file:///mnt/d/Workspace/nexus/Project/fonrey/UI_DESIGN/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0_UI.html) vs [组件规范设计.md](file:///mnt/d/Workspace/nexus/Project/fonrey/UI_SYSTEM/%E7%BB%84%E4%BB%B6%E8%A7%84%E8%8C%83%E8%AE%BE%E8%AE%A1.md)
- **问题**:原型出现规范外的 `gray-750`、不规则间距 `p-7`
- **改进方向**:原型严格使用 design token间距 4/8/12/16/24/32
- **责任角色**UI Designer
---
## 维度六:安全 & 多租户隔离
### 🔴 S-1 Tenant Admin 初始密码可能明文邮件下发
- **位置**[平台管理后台PRD.md L122-L136](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md#L122-L136) + [DATA_MODEL_LOGIN.md L468-L469](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md#L468-L469)(示例 `Fonrey@2025`
- **问题**欢迎邮件包含初始密码明文DATA_MODEL 给出系统统一默认密码示例。一旦邮箱被截获或日志记录到邮件正文,全部新租户首批管理员凭据泄露。
- **改进方向**:禁止邮件明文密码;改用一次性安全 reset token10-30 分钟有效,单次使用),强制首次登录改密;离线场景由平台运维通过加密 PDF 单独交付。
- **责任角色**:安全负责人 + PM + accounts 模块
### 🔴 S-2 平台管理员PlatformAdmin会话与租户用户共用 Cookie/Session 边界未明示
- **位置**[平台管理后台PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md) + [登录管理技术方案.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88.md)
- **问题**:未规定平台后台域名/Cookie 域、Session 隔离机制;存在租户 schema 用户登录态与平台后台越权同会话风险。
- **改进方向**:平台后台独立子域 `admin.fonrey.com`Cookie 域分离;中间件根据 `request.tenant.schema_name == 'public'` 强校验只允许 `platform_admins` 表用户进入。
- **责任角色**:安全负责人 + Backend Architect
### 🟠 S-3 短信 OTP 速率/防刷未定量
- **位置**[用户登录管理模块PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.md) §短信验证码 + [DATA_MODEL_LOGIN.md sms_otp_records](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md)
- **问题**:未定义"同号码 X 分钟内最多 N 次"、"同 IP 每日上限"、"图形/滑块校验前置"等防刷规则。
- **改进方向**技术方案补防刷策略DATA_MODEL 增 IP 维度计数器或在 Redis 中维护。
- **责任角色**:安全负责人
### 🟠 S-4 `phone_enc` 加密密钥轮换与 `phone_hash` salt 策略缺失
- **位置**[DATA_MODEL_LOGIN.md L80-L81](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md#L80-L81) + [TECH_STACK.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/TECH_STACK.md)
- **问题**未规定加密算法AES-GCM、密钥来源KMSenv、轮换流程、`phone_hash` 是否加 pepper。
- **改进方向**:技术方案补 §字段级加密:算法/Key 来源/轮换 SOP`phone_hash` 使用 HMAC-SHA256 + 全局 pepper不入库
- **责任角色**:安全负责人 + Backend Architect
### 🟠 S-5 平台后台审计日志覆盖范围未量化
- **位置**[平台管理后台PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md) + [DATA_MODEL_PUBLIC.md platform_audit_logs](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md)
- **问题**哪些操作必须审计、保留期限、防篡改append-only / 哈希链)未规定。
- **改进方向**:列出"必审操作清单"(创建/暂停/删除租户、平台账号增删改、发版、备份恢复);表加 `prev_hash`/`row_hash` 形成哈希链或转写至追加型存储。
- **责任角色**:安全负责人
### 🟡 S-6 跨 schema 查询风险未在技术方案标注
- **位置**[DATA_MODEL.md](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL.md) + [TECH_STACK.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/TECH_STACK.md)
- **问题**django-tenants 下错误的 schema 切换会导致跨租户数据泄露。
- **改进方向**:技术方案增 §"禁止在 view 中直接 `connection.set_schema_to_public()`",必须经 service 层封装。
- **责任角色**Backend Architect
---
## 维度七:性能 & 扩展性
### 🟠 PF-1 `client_heartbeats` 写入风暴未做缓冲
- **位置**[DATA_MODEL_PUBLIC.md client_heartbeats](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md#L568-L609) + [平台管理后台技术方案.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88.md)
- **问题**:每条心跳直写 PGN×M 客户端规模下会成为 IO 瓶颈。
- **改进方向**:心跳先写 Redis Stream / Kafka再批量落表每分钟一次同时配合 D-6 分区。
- **责任角色**Backend Architect
### 🟠 PF-2 平台后台租户列表 / 审计日志列表 缺分页/索引设计
- **位置**[平台管理后台技术方案.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88.md) + [DATA_MODEL_PUBLIC.md tenants/platform_audit_logs](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md)
- **问题**:未明示 keyset pagination 或 LIMIT/OFFSET审计日志按时间倒序查询无 `(created_at DESC, id DESC)` 复合索引。
- **改进方向**:明确分页方案;增复合索引;列表 API 默认 page_size 上限。
- **责任角色**Backend Architect + DBA
### 🟡 PF-3 登录端点未规定 P95 延迟 SLO
- **位置**[用户登录管理模块PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.md) + [测试规范.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/%E6%B5%8B%E8%AF%95%E8%A7%84%E8%8C%83.md)
- **问题**:无性能 SLO如登录 P95 < 300ms
- **改进方向**PRD 增非功能需求小节,列出关键端点 SLO测试规范补压测脚本。
- **责任角色**PM + QA
---
## 维度八:遗漏场景 & 边界
### 🔴 X-1 租户删除 / 数据导出 / GDPR 类合规流程缺失
- **位置**[平台管理后台PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md)
- **问题**:仅描述 `pending_delete``deleted` 状态,未覆盖:删除前数据导出/客户签字回执;平台管理员双人复核;保留期内可撤销。
- **改进方向**:新增"租户注销 SOP"用户故事;技术方案补软删除 + 冷却期 + 双人审批流程。
- **责任角色**PM + 安全 + 合规
### 🟠 X-2 客户端版本回滚 / 灰度中止流程缺失
- **位置**[平台管理后台PRD.md L476-L520](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md#L476-L520)
- **问题**:发版有,但回滚/灰度中止缺定义。
- **改进方向**:补 UC "回滚到上一稳定版本"、"立即停灰度"两条用户故事。
- **责任角色**PM
### 🟠 X-3 备份恢复演练流程缺失
- **位置**[平台管理后台PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md) §备份 + [DATA_MODEL_PUBLIC.md backup_records](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md)
- **问题**:仅描述备份生成,缺"恢复到独立 schema 验证"演练流程;恢复操作风险(覆盖现网)未提示。
- **改进方向**:增"恢复到隔离 schema 演练"用户故事;技术方案补恢复执行规范(必须先恢复至 `restore_*` 临时 schema 校验)。
- **责任角色**PM + DBA
### 🟠 X-4 Tenant Admin 失联 / 转移流程未定义
- **位置**[用户登录管理模块PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.md) + [平台管理后台PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md)
- **问题**Tenant Admin 离职/换号场景下,由谁/如何重置或迁移管理员未定义。
- **改进方向**PRD 增"平台运维代运营重置 Tenant Admin"流程,需双人复核 + 审计。
- **责任角色**PM + 安全
### 🟡 X-5 同租户多设备登录策略未明示
- **位置**[用户登录管理模块PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.md)
- **问题**:是否允许同账号多端在线、互踢策略未定义。
- **改进方向**PRD 明示"允许并发"或"后登挤掉前登"。
- **责任角色**PM
### 🟡 X-6 跨场景同义概念差异(租户开通 → Tenant Admin 创建)
- **位置**[平台管理后台PRD.md L122-L136](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md#L122-L136) vs [DATA_MODEL_LOGIN.md L468-L469](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md#L468-L469) vs [用户登录管理模块PRD.md L31-L33](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.md#L31-L33)
- **问题**:三处对"初始 Tenant Admin"的用户名/初始密码/手机号来源描述用词不统一PRD 平台后台说"系统生成"DATA_MODEL 给出 `Fonrey@2025` 默认值,登录 PRD 说 username = `tenants.contact_phone`)。
- **改进方向**:以登录 PRD v3.0 描述为准username = contact_phone初始密码由系统生成 + 一次性 reset token其他文档同步修正。
- **责任角色**PM + Data Model Owner
---
## 汇总行动列表(按优先级)
| # | 严重 | 维度 | 问题 | 责任角色 | 建议截止 |
| --- | --- | ---------- | -------------------------------------------------------------- | ----------------------- | ---- |
| 1 | 🔴 | 安全 | S-1 禁止欢迎邮件明文初始密码,改一次性 reset token | 安全 + PM + accounts | 立即 |
| 2 | 🔴 | 安全 | S-2 平台后台独立子域/Cookie 域 + 平台账号会话隔离中间件 | 安全 + Backend Architect | 立即 |
| 3 | 🔴 | DATA_MODEL | D-1 `platform_audit_logs.result` 大写改小写 + 数据迁移 | DBA | 当周 |
| 4 | 🔴 | DATA_MODEL | D-2 `export_tasks.status` `done``success` + 迁移 | DBA | 当周 |
| 5 | 🔴 | API | A-B-1 API_CONTRACT 补齐平台后台所有端点 | Backend Architect | 当周 |
| 6 | 🔴 | PRD↔TECH | PT-B-1 创建租户 Saga + 补偿事务 | Backend Architect + Ops | 当周 |
| 7 | 🔴 | PRD质量 | P-B-1 平台后台 PRD 引入 PA-NNN 编号体系 + AC | PM | 当周 |
| 8 | 🔴 | 遗漏场景 | X-1 租户注销 SOP + 双人复核 + 冷却期 | PM + 安全 + 合规 | 下迭代 |
| 9 | 🟠 | DATA_MODEL | D-3/D-4 ENUMS.md 补 `license_expired`/`wrong_otp`/`otp_expired` | ENUMS 维护者 | 当周 |
| 10 | 🟠 | DATA_MODEL | D-5 `phone_enc/phone_hash` NOT NULL + 数据清洗 | accounts + DBA | 下迭代 |
| 11 | 🟠 | DATA_MODEL | D-6 `client_heartbeats` 月度分区 + 90 天保留 | DBA | 下迭代 |
| 12 | 🟠 | DATA_MODEL | D-7 `payload_summary` 增 GIN 全文索引 | DBA | 当周 |
| 13 | 🟠 | PRD↔TECH | PT-B-2 客户端发版灰度策略澄清 | Backend Architect | 下迭代 |
| 14 | 🟠 | PRD↔TECH | PT-B-3 平台 MFA 选型 + DATA_MODEL 字段补充 | 安全 + Architect | 下迭代 |
| 15 | 🟠 | PRD↔TECH | PT-L-1 首次登录强制改密拦截器实现路径 | Backend + Frontend | 当周 |
| 16 | 🟠 | API | A-L-1 错误码 ↔ failure_reason 对照表 | Backend + 安全 | 当周 |
| 17 | 🟠 | API | A-B-2 心跳/版本检查接口限流 + HMAC | Backend + 安全 | 下迭代 |
| 18 | 🟠 | UI | U-B-1 平台后台 UI 引用组件清单组件 ID | UI + Frontend | 下迭代 |
| 19 | 🟠 | UI | U-L-1 补"账户锁定/密码过期"状态页 | UI + Frontend | 当周 |
| 20 | 🟠 | 安全 | S-3 短信 OTP 防刷规则量化 | 安全 | 下迭代 |
| 21 | 🟠 | 安全 | S-4 字段级加密 SOP + `phone_hash` pepper | 安全 + Architect | 下迭代 |
| 22 | 🟠 | 安全 | S-5 平台审计日志哈希链 + 必审操作清单 | 安全 | 下迭代 |
| 23 | 🟠 | 性能 | PF-1 心跳 Redis Stream 缓冲 + 批量落表 | Architect | 下迭代 |
| 24 | 🟠 | 性能 | PF-2 列表分页/复合索引 | Architect + DBA | 当周 |
| 25 | 🟠 | PRD质量 | P-B-2 平台 PRD 剥离实现细节 | PM + Architect | 下迭代 |
| 26 | 🟠 | PRD质量 | P-B-3 PlatformAdmin 权限矩阵 | PM + 安全 | 当周 |
| 27 | 🟠 | 遗漏 | X-2 版本回滚 / 中止灰度 UC | PM | 下迭代 |
| 28 | 🟠 | 遗漏 | X-3 备份恢复演练流程 | PM + DBA | 下迭代 |
| 29 | 🟠 | 遗漏 | X-4 Tenant Admin 重置/迁移流程 | PM + 安全 | 下迭代 |
| 30 | 🟡 | DATA_MODEL | D-8 跨 schema 规范沉淀至 README | Data Model Owner | 下迭代 |
| 31 | 🟡 | API | A-G-1 错误响应结构统一 | Architect | 下迭代 |
| 32 | 🟡 | UI | U-G-1 / U-G-2 A11y 规范 + 设计 token 严控 | UI Designer | 下迭代 |
| 33 | 🟡 | 性能 | PF-3 关键端点 SLO + 压测脚本 | PM + QA | 下迭代 |
| 34 | 🟡 | PRD↔TECH | PT-L-2 锁定阈值 settings 可配置 | Architect | 当周 |
| 35 | 🟡 | PRD质量 | P-L-1 登录 PRD 异常路径细化 | PM | 下迭代 |
| 36 | 🟡 | 遗漏 | X-5 多设备登录策略明示 | PM | 下迭代 |
| 37 | 🟡 | 遗漏 | X-6 跨文档对"初始 Tenant Admin 创建"用词统一 | PM + Data Model Owner | 当周 |
**统计**:🔴 Blocker 8 项 / 🟠 Major 21 项 / 🟡 Minor 8 项,合计 37 项。
---
## 结论
**整体评估**
- **登录管理模块**PRD v3.0 已按 ADR-20260502-003 完成实现细节剥离,整体结构与 DATA_MODEL_LOGIN 大致对齐;主要风险集中在 (a) 手机号字段约束与 PRD 必填语义不一致 (S-1/D-5)、(b) 首次登录改密拦截缺技术方案落地 (PT-L-1)、(c) OTP 防刷规则未量化 (S-3)。
- **平台管理后台模块**:处于"PRD 形成中"阶段,存在较多 Blocker缺端点契约 (A-B-1)、缺创建租户 Saga (PT-B-1)、缺平台账号会话隔离 (S-2)、缺欢迎邮件密码安全策略 (S-1)、PRD 缺编号体系 (P-B-1)、PRD 仍混入实现细节 (P-B-2)。这些项必须在进入开发前解决,否则将引发跨团队反复对齐成本。
- **跨文档一致性**枚举命名规范lower_snake_case已被 ENUMS.md 强约束,但 DATA_MODEL_PUBLIC 的 DDL 多处未对齐D-1/D-2/D-3/D-4属于"规范已立但落地未跟",建议立即统一。
**建议下一步动作**
1. 召开 1 次跨角色 Review 会议PM + Architect + 安全 + DBA + UI + Frontend就上表 8 项 Blocker 形成处理排期。
2. 由 ENUMS.md 维护者在 1 周内发布 v2.3,吸纳 D-3/D-4并附数据迁移 SQL 草案D-1/D-2
3. 由 PM 在 1 周内完成平台管理后台 PRD 编号化与剥离实现细节的改版,进入下一轮 Review。
---
## 附录
### A. 审查范围内文档清单
- PRD`PRD_MVP.md``登录管理/用户登录管理模块PRD.md` (v3.0, 2026-05-02)、`平台管理后台/平台管理后台PRD.md` (835 行)
- TECH`TECH_STACK.md` (v2.5, 2026-04-30)、`登录管理技术方案.md` (v4.1)、`平台管理后台技术方案.md` (986 行)、`API_CONTRACT.md``测试规范.md`
- DATA_MODEL`DATA_MODEL.md``DATA_MODEL_LOGIN.md` (526 行)、`DATA_MODEL_PUBLIC.md` (1049 行)、`ENUMS.md` (v2.2, 786 行)
- UI`UI_SYSTEM/UI_SYSTEM.md``组件清单.md``组件规范设计.md``UI_DESIGN/登录管理/登录_UI.md``UI_DESIGN/平台管理后台/平台管理后台_UI.md``登录_UI.html``登录_账号密码_UI.html``登录_重置密码_UI.html``平台管理后台_UI.html`
### B. 用户原文路径校正
-`Project/fonrey/PRD/系统管理/系统管理模块PRD.md` → ✅ 实际为 `Project/fonrey/PRD/系统配置/系统配置模块PRD.md`**不在本次 Review 范围**
-`Project/fonrey/PRD/平台管理后台/平台管理后台PRD` → ✅ 实际带 `.md` 后缀
-`Project/fonrey/UI_DESIGN/登录_UI.md` → ✅ 实际位于 `Project/fonrey/UI_DESIGN/登录管理/登录_UI.md`
### C. 审查执行说明
- 本次 Review 由 4 个并行 explore agent 完成证据收集(登录 8 维度、平台 PRD+TECH、DATA_MODEL_PUBLIC+UI、跨文档枚举/字段/状态机漂移),汇总后按 8 维度去重合并。
- 报告坚持"指出问题 + 给出方向"原则,不重写设计文档内容;如某文档段落实际不完整(如 PT-B-3 MFA 字段缺失),按 Major 报告而非自行补全。
---
## 进度跟踪表PM / 架构师填写)
> **使用说明**
> - **状态**取值:`待启动` / `进行中` / `已完成` / `已验证` / `阻塞` / `搁置`(如搁置请在"备注"列填写理由及决策 ADR ID
> - **处理人**:填写实际负责人姓名/工号
> - **修订位置**:填写本次修订涉及的文档路径 + 章节/行号 + Commit/PR 链接
> - **关联 ADR**:跨模块规则变更必须创建 ADR参考 `ADR.md` 治理规则),格式 `ADR-YYYYMMDD-XXX`
> - **验证证据**:链接到对应的 PR / Commit / 测试用例 ID`TC-FON-XXXXXX`/ Migration 文件
> - **每周更新**:建议每周五由 PM 主持 Review 例会更新本表,并在 `REVIEW/` 目录追加增量 Review
### Blocker 项(🔴 必须立即处理8 项)
| # | ID | 问题摘要 | 责任角色 | 处理人 | 状态 | 计划完成日 | 实际完成日 | 修订位置 | 关联 ADR | 验证证据 | 备注 |
| --- | ------ | ------------------------------------------- | ----------------------- | ----- | ------- | ---------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ------------- | ----------------------------------------------------------- |
| 1 | S-1 | 禁止欢迎邮件明文初始密码,改一次性 reset token | 安全 + PM + accounts | Nova | **不修复(设计决策)** | 2026-05-02 | 2026-05-02 | — | — | — | PM 决策:保持现有欢迎邮件含初始密码的设计,不改为 reset token 流程。接受此安全取舍。 |
| 2 | S-2 | 平台后台独立子域 + 平台账号会话隔离中间件 | 安全 + Backend Architect | Atlas | **已完成** | 2026-05-02 | 2026-05-02 | `TECH_STACK/平台管理后台技术方案.md` v1.1 §7.0(新增"平台后台独立子域与会话隔离"专节含域名分离表、Cookie 隔离规则、PlatformAdminSessionMiddleware 代码规范、测试矩阵) | — | 技术方案 v1.1 变更历史 | — |
| 3 | D-1 | `platform_audit_logs.result` 大写改小写 + 数据迁移 | DBA | Atlas | **已完成** | 2026-05-02 | 2026-05-02 | `DATA_MODEL/DATA_MODEL_PUBLIC.md` v1.7 §2.4 CHECK 约束;附录 M.1 迁移脚本 `migration_D1_audit_logs_result_lowercase.sql` | — | DATA_MODEL v1.7 变更历史 | 迁移脚本须在 Django migration 前执行(见附录 M.1 执行顺序说明) |
| 4 | D-2 | `export_tasks.status` `done``success` + 迁移 | DBA | Atlas | **已完成** | 2026-05-02 | 2026-05-02 | `DATA_MODEL/DATA_MODEL_PUBLIC.md` v1.7 §2.5 CHECK 约束;附录 M.2 迁移脚本 `migration_D2_export_tasks_done_to_success.sql` | — | DATA_MODEL v1.7 变更历史 | 迁移脚本须在 Django migration 前执行(见附录 M.2 执行顺序说明) |
| 5 | A-B-1 | API_CONTRACT 补齐平台后台所有端点 | Backend Architect | Atlas | **已完成** | 2026-05-02 | 2026-05-02 | `TECH_STACK/API_CONTRACT.md` v1.2 §12新增"平台管理后台端点附录",涵盖认证 2 项、租户管理 6 项、授权/MFA 3 项、系统配置 3 项、客户端发布 4 项、导出任务 3 项,含请求/响应示例与错误码) | — | API_CONTRACT v1.2 变更历史 | — |
| 6 | PT-B-1 | 创建租户 Saga + 补偿事务 | Backend Architect + Ops | Atlas | **已完成** | 2026-05-02 | 2026-05-02 | `TECH_STACK/平台管理后台技术方案.md` v1.1 §6.1.1(新增"创建租户 Saga 与补偿事务"专节,含 7 步流程状态机、各步骤补偿操作、Celery chord 实现规范、幂等性与重试策略、监控告警要求) | — | 技术方案 v1.1 变更历史 | — |
| 7 | P-B-1 | 平台后台 PRD 引入 PA-NNN 编号体系 + AC | PM | Nova | **已完成** | 2026-05-02 | 2026-05-02 | `PRD/平台管理后台/平台管理后台PRD.md` v1.1 — 全部 11 条用户故事补齐 PA-001 ~ PA-011 编号每条附验收标准AC小节 | — | PRD v1.1 变更历史 | — |
| 8 | X-1 | 租户注销 SOP + 双人复核 + 冷却期 | PM + 安全 + 合规 | Nova | **已完成** | 2026-05-02 | 2026-05-02 | `PRD/平台管理后台/平台管理后台PRD.md` v1.1 — 新增 PA-011 Story E1含 AC-1 发起申请 / AC-2 数据导出前置确认 / AC-3 双人 MFA 复核 / AC-4 30 天冷静期软删除 / AC-5 硬删除;同步更新 §5.1.4、§5.4、§5.5.1 API 清单、§6 权限矩阵、§7 状态机(新增 Pending Cancellation 节点) | — | PRD v1.1 变更历史 | 技术方案 & DATA_MODEL 联动更新待 Atlas 处理Pending Cancellation 状态字段) |
### Major 项(🟠 迭代内处理21 项)
| # | ID | 问题摘要 | 责任角色 | 处理人 | 状态 | 计划完成日 | 实际完成日 | 修订位置 | 关联 ADR | 验证证据 | 备注 |
| --- | ------ | -------------------------------------- | ------------------ | ----- | --- | ----- | ----- | ---- | ------ | ---- | --- |
| 9 | D-3 | ENUMS.md 补 `license_expired` | ENUMS 维护者 | Atlas | 待启动 | | | | | | |
| 10 | D-4 | ENUMS.md 补 `wrong_otp` / `otp_expired` | ENUMS 维护者 | Atlas | 待启动 | | | | | | |
| 11 | D-5 | `phone_enc/phone_hash` NOT NULL + 数据清洗 | accounts + DBA | Atlas | 待启动 | | | | | | |
| 12 | D-6 | `client_heartbeats` 月度分区 + 90 天保留 | DBA | Atlas | 待启动 | | | | | | |
| 13 | D-7 | `payload_summary` 增 GIN 全文索引 | DBA | Atlas | 待启动 | | | | | | |
| 14 | PT-B-2 | 客户端发版灰度策略澄清(租户/百分比) | Backend Architect | Atlas | 待启动 | | | | | | |
| 15 | PT-B-3 | 平台 MFA 选型 + DATA_MODEL 字段补充 | 安全 + Architect | Atlas | 待启动 | | | | | | |
| 16 | PT-L-1 | 首次登录强制改密拦截器实现路径 | Backend + Frontend | Atlas | 待启动 | | | | | | |
| 17 | A-L-1 | 错误码 ↔ failure_reason 对照表 | Backend + 安全 | Atlas | 待启动 | | | | | | |
| 18 | A-B-2 | 心跳/版本检查接口限流 + HMAC 签名 | Backend + 安全 | Atlas | 待启动 | | | | | | |
| 19 | U-B-1 | 平台后台 UI 引用组件清单组件 ID | UI + Frontend | Iris | 待启动 | | | | | | |
| 20 | U-L-1 | 补"账户锁定/密码过期"状态页 | UI + Frontend | Iris | 待启动 | | | | | | |
| 21 | S-3 | 短信 OTP 防刷规则量化 | 安全 | Atlas | 待启动 | | | | | | |
| 22 | S-4 | 字段级加密 SOP + `phone_hash` pepper | 安全 + Architect | Atlas | 待启动 | | | | | | |
| 23 | S-5 | 平台审计日志哈希链 + 必审操作清单 | 安全 | Atlas | 待启动 | | | | | | |
| 24 | PF-1 | 心跳 Redis Stream 缓冲 + 批量落表 | Architect | Atlas | 待启动 | | | | | | |
| 25 | PF-2 | 列表分页keyset+ 复合索引 | Architect + DBA | Atlas | 待启动 | | | | | | |
| 26 | P-B-2 | 平台 PRD 剥离实现细节 | PM + Architect | Nova | 待启动 | | | | | | |
| 27 | P-B-3 | PlatformAdmin 权限矩阵 | PM + 安全 | Nova | 待启动 | | | | | | |
| 28 | X-2 | 客户端版本回滚 / 中止灰度 UC | PM | Nova | 待启动 | | | | | | |
| 29 | X-3 | 备份恢复演练流程(恢复至隔离 schema | PM + DBA | Nova | 待启动 | | | | | | |
| 30 | X-4 | Tenant Admin 重置/迁移流程 | PM + 安全 | Nova | 待启动 | | | | | | |
### Minor 项(🟡 优化建议8 项)
| # | ID | 问题摘要 | 责任角色 | 处理人 | 状态 | 计划完成日 | 实际完成日 | 修订位置 | 关联 ADR | 验证证据 | 备注 |
| --- | ------ | ------------------------------------- | --------------------- | ----- | --- | ----- | ----- | ---- | ------ | ---- | --- |
| 31 | D-8 | 跨 schema 操作规范沉淀至 DATA_MODEL.md README | Data Model Owner | Atlas | 待启动 | | | | | | |
| 32 | A-G-1 | 全局 API 错误响应结构统一 | Architect | Atlas | 待启动 | | | | | | |
| 33 | U-G-1 | UI_SYSTEM 增 A11y 规范WCAG 2.1 AA | UI Designer | Iris | 待启动 | | | | | | |
| 34 | U-G-2 | HTML 原型严控 design token | UI Designer | Iris | 待启动 | | | | | | |
| 35 | PF-3 | 关键端点 SLO + 压测脚本 | PM + QA | Nova | 待启动 | | | | | | |
| 36 | PT-L-2 | 锁定阈值 settings 可配置(去硬编码) | Architect | Atlas | 待启动 | | | | | | |
| 37 | P-L-1 | 登录 PRD 异常路径细化 | PM | Nova | 待启动 | | | | | | |
| 38 | X-5 | 多设备登录策略明示 | PM | Nova | 待启动 | | | | | | |
| 39 | X-6 | 跨文档对"初始 Tenant Admin 创建"用词统一 | PM + Data Model Owner | Nova | 待启动 | | | | | | |
### 进度统计(每周更新)
| 统计日期 | Blocker 已完成 / 总数 | Major 已完成 / 总数 | Minor 已完成 / 总数 | 阻塞项数 | 风险说明 |
|---|---|---|---|---|---|
| 2026-05-02 | 0 / 8 | 0 / 21 | 0 / 9 | 0 | 初始基线 |
| 2026-05-02更新 | 2 / 8 | 0 / 21 | 0 / 9 | 0 | P-B-1 & X-1 已完成Nova技术方案/DATA_MODEL 联动更新待 Atlas 跟进 |
| 2026-05-02Atlas 修复) | 7 / 8 | 0 / 21 | 0 / 9 | 0 | S-2 / D-1 / D-2 / A-B-1 / PT-B-1 已完成Atlas剩余 Blocker S-1 为 PM 设计决策不修复;全部 Blocker 实质性完结 |
| | | | | | |
| | | | | | |
> Minor 项实际为 9 项(编号 31-39原汇总行动列表 Minor 计为 8 项的差异在于 D-8 与 X-6 是否合并归类,本跟踪表按独立处理项展开计 9 项。
### Review 闭环规则
1. 每条 Finding 修订完成后,处理人填写"修订位置 + 验证证据",状态置 `已完成`
2. PM/架构师在每周例会复核:跨模块/跨文档变更必须先创建 ADR`ADR.md`)再改文档,并在"关联 ADR"列填写 ID。
3. QA 在所有依赖 Finding 全部 `已完成` 后,对涉及业务路径执行回归测试,状态置 `已验证`
4. 任何 Finding 在迭代结束仍未启动需在"备注"列说明原因并在下一次 Review 例会重新评估优先级。
5. 本表与 `REVIEW/` 目录后续增量 Review 报告同步:新增 Finding 追加编号40+)继续延续。