diff --git a/docs/Sprint执行计划.md b/docs/Sprint执行计划.md index a9b3b77..a379f96 100644 --- a/docs/Sprint执行计划.md +++ b/docs/Sprint执行计划.md @@ -48,19 +48,19 @@ | `T-P1-25b` 四档熔断 | ✅(阈值待重算) | 60/80/90/100% 四档降级 + critical 豁免 + Redis 手动 override + Prometheus 指标;**"被拒请求配额净扣减 = 0"有集成断言**;⚠️ `LLM_DAILY_BUDGET_CENTS=100000` 仍是旧价占位,8-17 后按实测重算 | | `T-P1-13` 双令牌会话 | ✅ | refresh 一次性轮换(FOR UPDATE 行锁)+ 服务端撤销 + 重放检测告警;dev-token 向后兼容 | | `T-P1-10` 埋点通道(服务端) | ✅ | `POST /events/batch` fail-close 整批校验 + PII 剔除;事件字典校验待 `TD-23` 定稿后收紧 | -| `T-P1-27` 直传预签名 | ✅(联调待 COS) | 场景/类型/大小三重校验 + 可审计 key 布局;SDK 隔离在 Protocol 后,16 单测零网络;真实桶联调归《前置开通清单》§2 | +| `T-P1-27` 直传预签名 | ✅(联调待 COS)→ **E2 变更后由本地存储替代** | 原三重校验 + 可审计 key 布局保留;现行路径 `POST /storage/upload` 后端中转 + 签名下载 + temp 2h 清理(celery beat),COS 链路降为回迁保留 | | `T-P1-12` 华为账号登录(代码) | ✅(联调待 AGC) | OIDC JWKS 验签(kid 轮换、alg 锁定、audience 空配置拒绝)+ UnionID 映射;自造密钥全测,19 单测 | -| `T-P1-12b/12c` 短信登录(代码) | ✅(发送待签名审核) | 验证码哈希存储/一次性/5 次作废 + 三重频控(脚本化刷量 11 次断言拦截)+ 掩码纪律;fake/tencent 双通道可切 | +| `T-P1-12b/12c` 邮箱登录(代码) | ✅(发送待 SMTP 授权码) | **2026-08-15 需求变更:短信→邮箱(E1)并已交付**——`email_login.py` 验证码哈希存储/一次性/5 次作废 + 三重频控(脚本化刷量 11 次断言拦截)+ 掩码纪律;fake/smtp 双通道可切(QQ/163 授权码),旧短信通道代码已移除 | ### 1.2 本 Sprint 待补(BE) | 任务 | 内容 | 验收标准 | | --- | --- | --- | -| `T-P1-04` 🔴 | 腾讯云基础设施开通(VPC/CVM/PG/Redis/COS 四桶/CDN/CLS) | 四桶权限与生命周期策略生效;**临时桶 2 小时清理实测**(`CR-02`) | +| `T-P1-04` 🔴 | ~~腾讯云基础设施开通~~ **已按《前置开通清单》v2 降级路线收缩**:腾讯云全家桶暂缓,仅剩华为 AGC(§1)+ 发信邮箱授权码(§2) | 华为调试证书可拉起授权页;测试邮箱能收到验证码 | | `T-P1-05` | 密钥改由 SSM/KMS 注入 | 镜像与代码中无任何密钥;`APP_ENV=prod` 时占位密钥直接拒绝启动(已实现,需接 SSM) | -| `T-P1-27` | 图片直传预签名 URL + 临时桶生命周期 | 图片不经应用服务器;2 小时自动清理 | +| `T-P1-27` | ~~图片直传预签名~~ **已按 E2 变更为本地磁盘并交付**:`POST /storage/upload` 后端中转 + HMAC 签名下载 URL + temp 目录 2 小时清理(celery beat);COS 预签名链路保留为回迁路径 | 上传下载闭环;2 小时自动清理可观察 | | `T-P1-11`/`12`/`13` | 用户模型、华为账号登录、双令牌会话 | UnionID 映射唯一;登出后旧令牌立即失效 | -| `T-P1-12b`/`12c` 🔴 | 短信登录 + 三重频控防刷 | **断开华为依赖后本通道仍可登录**;脚本化刷量测试证明拦截有效 | +| `T-P1-12b`/`12c` 🔴 | ~~短信登录~~ 邮箱登录(E1 变更,代码已交付)+ 三重频控防刷 | **断开华为依赖后本通道仍可登录**;脚本化刷量测试证明拦截有效;待 SMTP 授权码落位后真实发信验证 | | `T-P1-25b` | 日成本熔断补齐四档降级与后台开关 | 注入成本可复现四档;**被拒请求配额净扣减 = 0**;在途任务放行 | | `T-P1-09`/`10` | 三张看板 + 埋点事件字典 | 能回答架构 §15 的三个问题 | @@ -249,9 +249,13 @@ --- -**文档版本**:v1.1 +**文档版本**:v1.2 **创建日期**:2026-08-13 -**最后更新**:2026-08-14 +**最后更新**:2026-08-16 **状态**:待评审 +**2026-08-16 变更**(对应《前置开通清单》v2 个人开发者降级路线):`T-P1-12b/12c` +短信登录→邮箱验证码登录(E1,代码已交付,待 SMTP 授权码);`T-P1-27` COS 直传→ +本地磁盘存储(E2,已交付:multipart 上传 + HMAC 签名下载 + temp 2h 清理挂 celery beat); +`T-P1-04` 腾讯云全家桶收缩为华为 AGC + 发信邮箱两件事。 **关联文档**:《开发任务拆解》(任务定义与依赖)、《需求规格说明》(验收指标唯一事实源)、 《技术架构文档》(token 预算与成本模型)、《技术选型与调研报告》(`TD-00`~`TD-33`) diff --git a/docs/开发任务拆解.md b/docs/开发任务拆解.md index f4263e7..2a9bf46 100644 --- a/docs/开发任务拆解.md +++ b/docs/开发任务拆解.md @@ -151,7 +151,7 @@ M2 知识库 M3 报告闭环 M4-a 换装/发型 │ | T-P1-01 | DEV | 仓库结构与包边界搭建 | 可运行骨架 | 目录结构符合架构 §16.1;`packages/domain` 无 IO 依赖 | NFR-MAINT-03 | | T-P1-02 | OPS | CI 流水线(ruff + mypy strict + pytest + 依赖规则检查) | CI 配置 | 违规提交被阻断 | NFR-MAINT-02/03 | | T-P1-03 | OPS | 本地开发环境(Compose:PG+pgvector、Redis、COS mock) | compose 文件 + 文档 | 新成员一条命令起环境 | — | -| T-P1-04 | OPS | 腾讯云基础设施开通与配置(VPC/CVM/PG/Redis/COS 四桶/CDN/CLS) | 环境清单 | 四桶权限与生命周期策略生效 | TD-03、CR-02 | +| T-P1-04 | OPS | ~~腾讯云基础设施开通~~ **降级路线(2026-08-15):腾讯云暂缓**,仅剩华为 AGC + 发信邮箱授权码(《前置开通清单》v2 §1/§2);PG/Redis 已在本地 WSL 运行 | 环境清单 | 华为调试证书可拉起授权页;测试邮箱能收到验证码 | TD-03、CR-02 | | T-P1-05 | DEV | 配置与密钥管理(SSM/KMS 接入) | 配置模块 | 无密钥进代码与镜像 | NFR-SEC-01 | | T-P1-06 | DEV | Alembic 迁移基线与规范 | 首个迁移 | 迁移可正向与回滚 | NFR-MAINT-06 | | T-P1-07 | DEV | 统一响应、错误码体系、异常处理中间件 | 中间件 + 错误码表 | 每个错误码有 message + hint | FR-SYS-02 | @@ -166,8 +166,8 @@ M2 知识库 M3 报告闭环 M4-a 换装/发型 │ | T-P1-11 | DEV | 用户数据模型与身份映射 | 表 + 迁移 | UnionID 映射唯一;预留 `profile_id` | FR-ACC-01、FR-ACC-12 | | T-P1-12 | DEV | 华为账号登录(服务端) | 接口 | 登录成功率 ≥ 99%(联调环境) | FR-ACC-01 | | T-P1-13 | DEV | 双令牌会话与撤销 | 接口 | 登出后旧令牌立即失效 | FR-ACC-05 | -| T-P1-12b | DEV | **短信验证码登录**(下发 + 校验 + 腾讯云 SMS 接入) | 接口 | 6 位码、5 分钟有效、一次性、失败 5 次作废;**华为侧异常时本通道仍可登录**(须有断开华为依赖的测试) | FR-ACC-04、**TD-32** | -| T-P1-12c | DEV | **短信防刷**(号码/IP/设备三重频控 + 人机校验 + 发送量告警) | 中间件 + 告警 | **脚本化刷量测试证明拦截有效**;号码在日志与后台全部掩码 | FR-ACC-14、NFR-SEC-03/05 | +| T-P1-12b | DEV | **邮箱验证码登录**(2026-08-15 变更:原短信,个人主体办不了签名;下发 + 校验 + 个人邮箱 SMTP 接入,**E1 已交付**) | 接口 | 6 位码、5 分钟有效、一次性、失败 5 次作废;**华为侧异常时本通道仍可登录**(须有断开华为依赖的测试) | FR-ACC-04、**TD-32** | +| T-P1-12c | DEV | **邮箱防刷**(邮箱/IP/设备三重频控,参数沿短信原值;人机校验 + 发送量告警后置) | 中间件 + 告警 | **脚本化刷量测试证明拦截有效**(已交付);邮箱在日志与后台全部掩码 | FR-ACC-14、NFR-SEC-03/05 | | T-P1-14 | DEV | 游客模式与数据合并 | 接口 | 合并幂等;多设备场景有确定策略;**游客配额按设备维度终身计量**(非每日),用尽引导登录而非报错 | FR-ACC-02/03 | | T-P1-16b | DEV | **清空我的照片**(保留账号) | 接口 + 页面 | COS 对象与 DB 引用同步清除;签名 URL 立即失效;二次确认 + 回执 + 审计日志 | **FR-ACC-15**、CR-02 | | T-P1-15 | DEV | 同意授权记录(含人脸单独同意) | 表 + 接口 | 记录含版本与时间,可查询 | CR-01、FR-ACC-08 | @@ -191,7 +191,7 @@ M2 知识库 M3 报告闭环 M4-a 换装/发型 │ | **T-P1-25c** | DEV | **峰谷单价按调用时刻计价** | 两套价目表 + 时段判定 | 高峰(北京时间 09:00-12:00、14:00-18:00)与空闲各一套单价;成本在**调用当时**算好落库,事后不按当前价重算;跨时段有测试 | `NFR-COST-01`、TD-04 | | T-P1-26 | DEV | **配额账本**(余额、流水、预扣三段式、周期重置、规则配置化) | 模块 + 接口 | 余额可由流水重算;失败自动退还;**表结构含 `tx_type` 字段,V2 上支付无需迁移**;服务端硬校验不可绕过;**`bl_quota_rule` 种子必须与产品方案 §3.2 一致**(含 `hairstyle` / `hd_export` / `report_basic` / `report_regen`),禁止开发期另写一套数字 | FR-BILL-01/02/04/05/06 | | T-P1-26b | DEV | 额度耗尽文案与提示 | 端侧组件 | **不出现任何价格、购买、会员、升级字样**;消耗前提示剩余量 | FR-BILL-07 | -| T-P1-27 | DEV | 图片直传(预签名 URL)与临时桶生命周期 | 接口 + 桶策略 | 图片不经应用服务器;2 小时自动清理 | FR-SYS-03、CR-02 | +| T-P1-27 | DEV | 图片上传与临时目录生命周期(2026-08-15 变更:原 COS 直传预签名,**E2 已改为本地磁盘 `meida_data/` 四目录并交付**——后端 multipart 中转 + HMAC 短期签名下载 URL;COS 链路保留为回迁路径) | 接口 + 清理任务 | temp 目录 2 小时自动清理(celery beat,CR-02);上传下载闭环 | FR-SYS-03、CR-02 | | T-P1-28 | DEV | 推送接入(Push Kit + Token 管理) | 模块 | 到达率 ≥ 90%;文案无敏感结论 | FR-TASK-04 | ### 3.4 客户端骨架 @@ -429,6 +429,7 @@ M2 知识库 M3 报告闭环 M4-a 换装/发型 │ | 日期 | 版本 | 变更 | | --- | --- | --- | +| 2026-08-16 | v1.6 | **个人开发者降级路线落地(《前置开通清单》v2 的 E1~E4)**:`T-P1-12b/12c` 短信登录→邮箱验证码登录(E1,后端已交付:`packages/identity/email_login.py`,fake/smtp 双通道,防刷参数原样沿用);`T-P1-27` COS 直传→本地磁盘存储(E2,后端已交付:multipart 上传 + HMAC 签名下载 + temp 2h 清理挂 celery beat);`T-P1-04` 腾讯云全家桶收缩。FE 登录页邮箱输入(E3)与联调验证待办 | | 2026-08-14 | v1.5 | **两批多 agent 并行开发交付回写**(任务包见 `开发任务包/`,实测详情见《Sprint 执行计划》§9):`T-P1-25b` 四档熔断(阈值待 8-17 重算)、`T-P1-26` 收尾 claim、`T-P1-10/13/27` 交付、`T-P1-12/12b/12c` 登录双通道代码先行(联调待凭证)、`T-P2-01~06` 知识库三件套交付(BGE-M3 真模型待接)、`T-P0-16` ✅(2.8ms)、`T-P0-10/12` SPIKE 初步结论。**新风险登记:RTMPose 合成图置信度 0.003(域差异),真实照片重验为 `T-P0-10` 前置;BiRefNet CPU 3.1s/张需异步化** | | 2026-08-14 | v1.4 | 交叉评审回写:`T-P1-25b` 验收补「reserve 之后熔断」集成断言与日预算按新价重算;`T-P1-26` 明确种子必须与产品方案 §3.2 一致 | | 2026-08-13 | v1.3 | **后端脚手架落地后的回写**。新增两项由真机实测暴露、原 WBS 完全未覆盖的任务:**`T-P1-24a` 思考模式按场景显式配置** —— `deepseek-v4-flash` **默认开启**思考模式,实测同一单句问答开启 13.5s、关闭 1.8s,思考 token 还按输出价计费,漏配会同时打破 `NFR-PERF-02b` 与成本模型;**`T-P1-25c` 峰谷单价按调用时刻计价** —— DeepSeek 自 2026-08-17 起高峰单价为空闲时段 2 倍,用单一均价记账会让 `ob_ai_call` 与真实账单差出近一倍,而它是 V2 定价的唯一依据。另:`T-P1-01`/`02`/`06`/`07`/`24`/`25` 已在 `meida_backend` 仓库交付并实测通过,各任务的完成状态见《Sprint 执行计划》§1.1 |