Files
meida/docs/Sprint执行计划.md
T
xsl e511b6a66f 收尾两批并行开发的文档回写与任务包
- Sprint 执行计划 v1.1:§1.1 补第一批交付实据;T9 SPIKE 结论回写 Sprint 1 表
  (T-P0-16 通过 2.8ms;T-P0-12 有条件;T-P0-10 原型 6/6 + 真实照片重验前置);
  Sprint 2 表标注 T-P2-01~06 交付;新增 §9 两批交付记录
- 开发任务拆解 v1.5:交付回写 + 新风险登记(RTMPose 域差异、BiRefNet 异步化)
- 新增 开发任务包/:三批多 agent 并行的协作规程与 14 份任务契约
- 新增 前置开通清单-云资源与资质.md
- 清理已用毕的评审报告(文档评审 2026-08-13、项目整体评审 2026-08-14),
  README 中相应引用改为留痕表述
2026-08-14 21:07:20 +08:00

258 lines
20 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.
# 「美搭」Sprint 执行计划
> 版本:**v1.0** | 创建日期:2026-08-13 | 状态:待评审
>
> **本文与《开发任务拆解》的分工**:WBS 回答「一共有哪些任务、谁依赖谁」,本文回答**「下一步做什么、做完怎么算过、谁在这个 Sprint 里没被阻塞」**。
> 任务编号沿用 WBS 的 `T-P<阶段>-<序号>`,本文不新造编号,只做排期与状态标注。
>
> **排期原则**:Sprint 按**依赖就绪**切分,不按固定天数。一个 Sprint 的出口条件全绿才开下一个;
> 但**内容生产轨(顾问 + 自采)从 Sprint 0 起持续跑**,永不等待工程轨 —— 它是关键路径。
**状态图例**:✅ 已完成 🟡 部分完成(括号内为剩余) ⬜ 未开始 🔴 关键路径
---
## 0. 团队轨道划分
4~6 人的实际约束是:**同一时间最多四条轨并行**,且算法与内容两轨的产能不能靠 AI 加速。
| 轨道 | 角色 | 本项目里的特点 |
| --- | --- | --- |
| **BE** 后端 | 后端 + AI 辅助 | 地基与业务逻辑,可被 AI 显著加速 |
| **FE** 端侧 | 鸿蒙 ArkTS | 受 `T-P0-17` 骨架验证结论约束,不能提前铺量 |
| **ALG** 算法 | 算法 | 体型/色彩/脸型三项验证是硬门槛,**结论不达标要换方案而不是硬做** |
| **CONT** 内容 | 全职形象顾问 + 产品 | **产能决定上线时间**,见 §6 |
---
## 1. Sprint 0:地基已落地部分的验收与补齐
> **本 Sprint 的特殊性**:工程地基的骨架已经在 `meida_backend` 仓库落地并跑通了一条真实纵向切片
> (取 token → 预扣配额 → 真实调用 DeepSeek → 记成本 → 提交配额),
> 因此 Sprint 0 的重点不是「从零搭」,而是**验收既有部分 + 补齐缺口**。
### 1.1 已交付(`meida_backend`,实测通过)
| 任务 | 状态 | 实测证据 |
| --- | --- | --- |
| `T-P1-01` 仓库结构与包边界 | ✅ | `apps / packages / services` 三层;**四条 import-linter 契约全绿**,`packages/domain` 禁 framework 与 IO 由机器强制 |
| `T-P1-02` CI 流水线 | ✅ | ruff + mypy(domain/llm 为 strict) + pytest + lint-imports + detect-secrets + gitleaks + **迁移 upgrade→downgrade→upgrade 往返** 六道防线 |
| `T-P1-03` 本地开发环境 | 🟡(缺 COS mock) | `make up` 起 pgvector + Redis,端口 55432/56379 避冲突;`make install` 一条命令装齐 |
| `T-P1-06` Alembic 基线 | ✅ | `0001` 建 **8** 张表(`id_user` / `id_user_identity` / `id_consent` / `bl_quota_rule` / `bl_quota` / `bl_ledger` / `tk_task` / `ob_ai_call`)并创建 `vector` 扩展;正反向往返实测通过 |
| `T-P1-07` 统一响应与错误码 | ✅ | `code/message/data/request_id` 信封;每个错误码有文案,且**配额文案经测试断言不含价格字样** |
| `T-P1-08` 可观测性 | 🟡(缺 CLS 与看板) | structlog JSON + request_id 贯穿;**日志脱敏有专项测试**(手机号/令牌/密钥/诊断结论);Prometheus 指标就绪,OTel 留开关 |
| `T-P1-19` 任务中心 | 🟡(仅骨架任务) | `tk_task` + 状态机(非法跃迁有测试)+ 幂等键;`POST /tasks/ping`、`GET /tasks/{id}`、列表可用 |
| `T-P1-24` **LLM 网关** | ✅ | 场景路由、主备故障转移、熔断器、结构化输出重试、Prompt 版本、成本归因,共 28 个单测 |
| `T-P1-25` 成本归因表 | ✅ | `ob_ai_call` 每次调用(含失败)落一行;实测行:`tokens_in=240 / cached=128 / cost_cents=0.10744` |
| `T-P1-26` 配额账本 | ✅ | 预扣三段式 + `bl_ledger` 幂等;DeepSeek 超时**自动退还**;**任务奖励 claim 已并入**(`POST /quota/tasks/{task_key}/claim`,幂等 40910 + 封顶 40310);周期重置靠 `period_key` 自然滚动(无后台任务=设计如此,非缺口) |
| `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-12` 华为账号登录(代码) | ✅(联调待 AGC) | OIDC JWKS 验签(kid 轮换、alg 锁定、audience 空配置拒绝)+ UnionID 映射;自造密钥全测,19 单测 |
| `T-P1-12b/12c` 短信登录(代码) | ✅(发送待签名审核) | 验证码哈希存储/一次性/5 次作废 + 三重频控(脚本化刷量 11 次断言拦截)+ 掩码纪律;fake/tencent 双通道可切 |
### 1.2 本 Sprint 待补(BE)
| 任务 | 内容 | 验收标准 |
| --- | --- | --- |
| `T-P1-04` 🔴 | 腾讯云基础设施开通(VPC/CVM/PG/Redis/COS 四桶/CDN/CLS) | 四桶权限与生命周期策略生效;**临时桶 2 小时清理实测**(`CR-02`) |
| `T-P1-05` | 密钥改由 SSM/KMS 注入 | 镜像与代码中无任何密钥;`APP_ENV=prod` 时占位密钥直接拒绝启动(已实现,需接 SSM) |
| `T-P1-27` | 图片直传预签名 URL + 临时桶生命周期 | 图片不经应用服务器;2 小时自动清理 |
| `T-P1-11`/`12`/`13` | 用户模型、华为账号登录、双令牌会话 | UnionID 映射唯一;登出后旧令牌立即失效 |
| `T-P1-12b`/`12c` 🔴 | 短信登录 + 三重频控防刷 | **断开华为依赖后本通道仍可登录**;脚本化刷量测试证明拦截有效 |
| `T-P1-25b` | 日成本熔断补齐四档降级与后台开关 | 注入成本可复现四档;**被拒请求配额净扣减 = 0**;在途任务放行 |
| `T-P1-09`/`10` | 三张看板 + 埋点事件字典 | 能回答架构 §15 的三个问题 |
### 1.3 本 Sprint 新增(工程实测暴露的两项,原 WBS 未覆盖)
| 任务 | 类型 | 内容 | 为什么必须单独立项 |
| --- | --- | --- | --- |
| **`T-P1-24a`** | DEV | **思考模式按场景显式配置** | `deepseek-v4-flash` **默认开启思考模式**。实测同一个单句问答:开启 13.5s、关闭 1.8s,且思考 token 按输出价计费。漏配会同时打破 `NFR-PERF-02b`(整轮 15s)与成本模型。已实现:四个场景全部显式关闭,可按场景改配置打开,并单独记 `tokens_reasoning` |
| **`T-P1-25c`** | DEV | **峰谷单价按调用时刻计价** | DeepSeek 自 **2026-08-17 00:00** 起峰谷定价,高峰(北京时间 09:00-12:00、14:00-18:00)单价是空闲时段的 **2 倍**。报告生成多发生在白天高峰,用单一均价记账会让成本与账单差出近一倍 —— 而 `ob_ai_call` 是 V2 定价的唯一依据。已实现:两套价目表 + 按时刻选择 |
> **`T-P1-25c` 对成本模型的直接影响**:`NFR-COST` 的预算与熔断阈值是按旧单价(输入 ¥1 / 输出 ¥2 每百万 token)推算的。
> 8-17 之后空闲档为 ¥1.5/¥4.5、高峰档为 ¥3/¥9,**输出侧涨 2.25~4.5 倍**。
> 上线前必须用实测 token 分布重算一次日预算,否则熔断阈值会在错误的位置触发。
### 1.4 出口条件
1. 端到端 `make smoke` 在**接入真实 COS 与短信通道后**仍全绿
2. `make check`(lint + typecheck + imports + test + secrets)零告警
3. 腾讯云环境清单归档,四桶生命周期实测通过
4. 两条登录通道**互不依赖**,各自单独可用
---
## 2. Sprint 1:验证门槛闯关(ALG 主导,与 Sprint 0 并行)
> **这个 Sprint 的产出是结论与数据,不是功能。** 结论不达标就换方案,不要带着不达标的模块往下走 ——
> 报告的可信度是产品的根,根不稳后面全是返工。
| 任务 | 轨道 | 验证门槛(`Phase 0` 档,非上线档) | 不达标的处置 |
| --- | --- | --- | --- |
| `T-P0-10` 🔴 | ALG | 体型测算与人工标注一致率 **≥ 80%** | 换方案(引入关键点比例法或第三方)。**2026-08-14 SPIKE(`scripts/spikes/REPORT.md`):原型通过**——合成图 6/6 体型变体(H/A/V/O/X+中性)分类正确,测宽与真值偏差 ±1px;正式 ≥80% 一致率需顾问轨 ≥100 体标注。⚠️ **RTMPose 在合成剪影上置信度极低(0.003,域差异)——真实照片重验是本项的前置** |
| `T-P0-11` 🔴 | ALG | 色彩季型一致率 **≥ 75%** | 降级为「色彩倾向」而非「季型结论」 |
| `T-P0-12` | ALG | BiRefNet 抠图质检通过 **≥ 90%** | 调参或改用商业抠图 API。**SPIKE 初步:有条件通过**——管线与代理指标全绿(前景占比 0.244 / 连通域 1.0 / 羽化 ~1px);⚠️ CPU 单张 **3.1s**,同步接口不可接受,需异步化(走任务中心);≥90% 质检率必须真实素材验证 |
| `T-P0-13` | BE | 换装单次 `gpu_seconds` 与成功率基线 | 数据直接填入成本模型,**并按 §1.3 的新单价重算** |
| `T-P0-14` | BE | 发型接口可用性与耗时基线 | — |
| `T-P0-16` | ALG | RTMPose ONNX CPU 单张耗时可接受 | ~~上 GPU 或降采样~~ **✅ 2026-08-14 SPIKE 通过:rtmpose-s 全链路 2.8ms/张(P95 3.3ms),rtmpose-m 5.9ms——CPU 完全够用** |
| `T-P0-17` 🔴 | FE | 鸿蒙骨架打通登录/拍照/直传/轮询/展示 | **结论决定 FE 能否铺量**,不通则先解决工程链路 |
| `T-P0-18` | BE | AI 标识元数据经水印/COS/CDN/保存后仍存活 | 改用不可剥离的显式水印 |
| `T-P0-19` | BE | LLM 缓存命中率与成本降幅 | 已有初步实测:固定前缀命中 128/240 输入 token |
**并行的合规轨(BIZ,不占用开发产能)**:`T-P0-01` 核实备案模型清单是否覆盖 DeepSeek + 智谱两家 🔴、
`T-P0-02` 合规档案归集、`T-P0-05` 三份协议文案、`T-P0-06` PIA、`T-P0-07` 词库与制度。
> `T-P0-01` 之所以标红:**备案只含一家而线上跑两家,是上架核验的直接失败项。** 网关虽已实现主备路由,
> 但若备案未覆盖智谱,V1 就必须配成单路由 —— 这会改变故障转移的前提,越早知道越好。
**出口条件**:六项技术验证全部有明确结论(含「不达标 → 换方案」的决定),
`T-P0-01` 有书面结论,`T-P0-17` 骨架 Demo 可运行。
---
## 3. Sprint 2:知识库可运营(M2)
> **依赖**:Sprint 0 出口 + `T-P0-23` Schema 定稿 + 顾问到岗。
> **本 Sprint 的成败标志不是代码,而是「顾问能不能不找工程就把内容录进去」。**
| 任务 | 轨道 | 验收标准 |
| --- | --- | --- |
| `T-P2-01` | BE | ✅ 2026-08-14:12 类实体 CRUD + 状态机(16 组跃迁全覆盖)+ `kb_asset`(`tryon_ready` 标志 + partial 索引) |
| `T-P2-02` | BE | ✅ 2026-08-14:规则引擎 p95 **0.412ms**(400 条规则,预算 50ms 的 1/120);硬约束 `hard_blocks` + 用户禁忌压过专业推荐,黄金集 11 组固化 |
| `T-P2-03` | BE | ✅(接口位):`EmbeddingProvider` 可插拔 + `embedding_model/version` 随行写入(可重跑判据);当前为确定性假实现,**真实 BGE-M3 ONNX 待接入** |
| `T-P2-04` 🔴 | BE | ✅ 2026-08-14:硬过滤→向量→关键词→RRF 重排;**硬过滤零漏有红线用例**(禁忌实体向量距离 0 仍零出现 + 对照组);顺带修复 jsonb NULL 语义真 bug |
| `T-P2-05` | BE | ✅ 2026-08-14:递归 CTE 1~3 跳可解释路径(`path` 数组防环) |
| `T-P2-07` | ALG | 抠图批处理 + 白底规格校验拦截不合格图(SPIKE 代理指标已就绪,批处理待素材) |
| `T-P2-08` | ALG | 属性预标注准确率 ≥ 70%,人工可修正 |
| `T-P2-09` 🔴 | BE | **顾问可独立完成内容维护、审核、发布与回滚,全程无工程介入**(极简后台,第三批开发中) |
| `T-P2-10` | BE | 发布后检索缓存自然失效(第三批开发中) |
| `T-P2-11` 🔴 | BE | 黄金集框架接入 CI,**指标退化即阻断合并**(第三批开发中) |
| `T-P2-06` | BE | ✅ 2026-08-14:无结果 query 落 `kb_gap`(同 query+filter 聚合 `hit_count`),列表/排序接口随后台交付 |
**内容轨(CONT,本 Sprint 的真实瓶颈)**:`T-P2-12` 色板、`T-P2-13` 规则库冷启动(**V1 硬指标 400 条**)、
`T-P2-14` 实体录入、`T-P2-15` 单品 300 件 `tryon_ready`、`T-P2-16` 黄金集标注(**四个子集共 330 例**)。
**出口条件**:知识库达到《美学知识库-建设方案》§9.1 的 **V1 硬指标**(规则 400 / 单品 300 / 方案 100),
黄金集四子集就位并在 CI 里生效,后台可由顾问独立操作。
---
## 4. Sprint 3:报告闭环(M3)
> **依赖**:Sprint 1 的三项算法结论 + Sprint 2 的规则与检索。
| 任务 | 轨道 | 验收标准 |
| --- | --- | --- |
| `T-P3-01` | ALG | 各项返回置信度与质量标记 |
| `T-P3-02` | ALG | 图片质量门禁拦截准确率 ≥ 85%,**给出具体重拍指引**(不是「照片不合格」) |
| `T-P3-03`/`04`/`05` | ALG | 达到 Sprint 1 的验证基线 |
| `T-P3-06` 🔴 | BE | **32 维度**每维四要素(值/置信度/依据/规则命中)完整,缺失显式标注 |
| `T-P3-07` | BE | 触发与频控符合需求文档 §3;配额生效 |
| `T-P3-08` | FE | 问卷完成率 ≥ 80%,可跳过不阻断 |
| `T-P3-09` 🔴 | BE | **LLM 或渲染失败不需重新上传照片**(中间态落库 + 分步恢复) |
| `T-P3-10` | BE | 文案结论与诊断值一致,无自相矛盾 |
| `T-P3-11` 🔴 | BE | 黄金集**硬性禁忌违反数 = 0**;贬损词零通过 |
| `T-P3-12` | BE | 长图渲染 p95 < 8s,跨设备一致 |
| `T-P3-21` | BE+FE | **结论认同/修正入口** —— 「认同率 > 70%、修正率 < 15%」的唯一数据来源 |
| `T-P3-22` | BE+FE | **全面报告预约留资** —— V1 唯一的商业化验证数据来源 |
> `T-P3-21`/`T-P3-22` 是本轮评审补的两项。**缺了它们,V1 会白跑一遍**:
> 前者缺失就无法判断报告质量指标是否达标,后者缺失就拿不到 V2 定价所需的需求信号。
**出口条件**:用户可完整走通初级报告并产出画像与记忆;
初级报告 P95 < 90s(`NFR-PERF-03`);诊断准确率达到**上线质量门槛**(体型 85% / 季型 80%)。
---
## 5. Sprint 4:Agent 与换装(M4)
> **可并行度是本 Sprint 的关键**:`M4-a` 换装/发型只依赖 Sprint 0 与素材入库,**可与 Sprint 3 并行启动**;
> `M4-b` Agent 必须等 Sprint 2 检索 + Sprint 3 画像,**是真正的关键路径**。
**M4-a(可提前)**:`T-P4-01`~ 换装服务纳管改造(`TD-00`)、发型打标与推荐、素材联调。
**M4-b(关键路径)**:意图识别(验证 85% / 上线 90% 两档)、多轮上下文、画像注入、
生成后校验、越界拒答、SSE 流式。
**本 Sprint 的两条硬红线**:
1. **不得编造天气数值**(`TD-33`)。V1 不接天气 API,只能反问用户或按城市+月份推断气候区 ——
模型幻觉出一个温度,用户第二天就会发现。
2. **token 预算按架构 §7.2 执行**(注入 ≤ 1400,总输入 ≤ 4200)。超预算不是「效果更好」,
是成本线性上涨且缓存命中率下降。
**出口条件**:报告 + Agent + 换装/发型三者可用且互相联动;Agent 整轮 P95 < 15s(`NFR-PERF-02b`)。
---
## 6. 持续轨:内容生产(贯穿全程,**关键路径**)
> 关键路径已从「备案审批」转移到「内容产能」。这条轨的特点是 **不能靠 AI 加速,只能靠产能倒排**。
| 任务 | 何时启动 | 产出 |
| --- | --- | --- |
| `T-P0-20` 🔴 | **立刻,全项目最优先** | 全职顾问到岗 + 规则库产能基线(条/周) |
| `T-P0-21` 🔴 | **立刻** | 自采流水线跑通 + 首批 20 件 + 每周产能数据 |
| `T-P0-22`/`23`/`25` | 顾问到岗后 | 拍摄 SOP、本体 Schema、32 维字典与规则矩阵框架 |
| `T-P0-24` | 与 Sprint 1 并行 | 60 款发型适配标签打标 |
| `T-P0-26` | 与 Sprint 1 并行 | ≥ 15 人用户访谈(**V1 不展示价格,价格敏感度只能靠访谈采集**) |
| `T-P0-28` | 采购开始前 | 素材版权留档机制(`license=self_shot`) |
**倒排方法**:拿到 `T-P0-20`/`T-P0-21` 的周产能后,用「V1 硬指标 ÷ 周产能」推出 M2 出口日期,
再据此反推整体上线时间。**在拿到产能数据之前,任何上线日期承诺都没有依据。**
---
## 7. Sprint 5:上线就绪(M5)
`T-P5-*` 全量执行,其中最容易被漏的四项:
| 任务 | 为什么容易漏 |
| --- | --- |
| `T-P0-03`/`04` | 备案编号公示位必须**发布包实机验证**,且展示的模型名与网关实际路由**同源校验** |
| `T-P5-18` | CLS 日志留存 ≥ 6 个月(`CR-11`)是法定义务,原 WBS 无人认领 |
| `T-P5-19` | 熔断四档演练 —— 熔断逻辑没演练过等于没有 |
| `T-P5-17` | 会员页静态展示 + 「上线提醒我」留资,为 V2 蓄客 |
**出口条件**:合规检查清单全绿、压测通过(容量基线见架构 §12.2)、
监控齐备、备案编号公示实机验证通过、V1 可用性 ≥ 99.5%(`NFR-REL-01`,单可用区部署的现实取值)。
---
## 8. 风险与应对
| 风险 | 触发信号 | 应对 |
| --- | --- | --- |
| **内容产能不足** | 周产能低于「硬指标 ÷ 可接受周数」 | 增加拍摄棚时或外采白底图;**不要降低 `tryon_ready` 质检标准** |
| **算法门槛不达标** | `T-P0-10`/`11` 一致率低于验证门槛 | 该维度降级为「仅供参考」或不展示,**不要延期整个产品** |
| **备案未覆盖两家模型** | `T-P0-01` 结论为单家 | V1 配单路由,故障转移改为降级重试;同步办变更 |
| **成本超预算** | 日成本达预算 70% | 四档熔断自动降级;同时按 §1.3 用实测分布重算阈值 |
| **8-17 涨价冲击** | 空闲/高峰单价 2.25~4.5 倍于旧输出价 | 优先做缓存前缀纪律与输出长度约束;必要时把报告文案改到空闲时段生成 |
| **短信被刷** | 发送量突增告警 | 三重频控 + 人机校验;**短信是唯一没有配额兜底的直接现金损失** |
---
## 9. 多 Agent 并行开发交付记录(2026-08-14)
两批共 11 个任务(T1~T11)以「协调提交消除共享文件冲突面 + 每 task 独立 worktree/分支 + 逐分支合并跑全量门禁」的方式并行交付。**零合并冲突**;任务契约与协作规程见 `开发任务包/`。
| 批次 | 任务 → WBS 映射 | 单测增量 | 集成增量 |
| --- | --- | --- | --- |
| 第一批(5 任务) | T1 四档熔断→`T-P1-25b`;T2 任务奖励→`T-P1-26` 收尾;T3 埋点→`T-P1-10`;T4 刷新令牌→`T-P1-13`;T5 直传预签名→`T-P1-27` | +69 | +12 |
| 第二批(6 任务) | T6 实体图谱→`T-P2-01/05`;T7 规则引擎→`T-P2-02`;T8 混合检索→`T-P2-03/04/06`;T9 视觉 SPIKE→`T-P0-10/12/16`(结论已回写 §2);T10 华为登录→`T-P1-12`;T11 短信登录→`T-P1-12b/12c` | +235 | +22 |
| **累计** | 单测 169→**473**,集成 3→**38** | | |
**待联调清单**(代码就绪、等外部凭证):华为登录(AGC 配置)、短信真实发送(签名审核)、COS 直传(四桶创建)——对应《前置开通清单》。
**遗留提醒**:8-17 峰谷新价生效后重算 `LLM_DAILY_BUDGET_CENTS` 与四档阈值;RTMPose 真实照片重验;BiRefNet CPU 3.1s/张需异步化接入任务中心。
---
**文档版本**:v1.1
**创建日期**:2026-08-13
**最后更新**:2026-08-14
**状态**:待评审
**关联文档**:《开发任务拆解》(任务定义与依赖)、《需求规格说明》(验收指标唯一事实源)、
《技术架构文档》(token 预算与成本模型)、《技术选型与调研报告》(`TD-00`~`TD-33`)