# Sprint 4 阶段进度报告 (V10 选项 B · 15/16 任务) > **日期**:2026-07-05(e2e i18n 回归修复后) > **真实状态**:⏳ **PARTIAL — 已完成 15/16 任务,T-C-44 配置/CI 已落地但本地 Docker 构建待环境验证** > **不能宣称"Sprint 4 完成"** ❌ > **下一步**:剩余阻塞项为 T-C-44 Poster CLI Docker 本地构建验证 --- ## ⚠️ 重要的更正 原 `SPRINT_4_CLOSEOUT_2026-07-03.md` 文件标题用了"收口报告"和"G3 闸门全部通过",但实际: - **Sprint 4 任务表共 16 任务 / 53 子任务 / 10 人天** - **本次完成 5 任务 / 15 子任务** - **G3 闸门定义包含**:"8 e2e spec 全绿 + 真实后端 5 模块 200 + Lighthouse P/A/B/S ≥ 90" - **已通过的 G3 子项**:typecheck / lint / vitest / playwright(Chromium + WebKit + mobile-chrome)/ build - **待环境复验的 G3 子项**:Lighthouse / 真实后端回归(当前本机无 Docker,pytest 环境未作为本轮复验前置) - **待环境验证的 G4 子项**:Poster CLI Docker 镜像本地构建 正确标签应该是"Sprint 4 阶段 1 完成",而不是"Sprint 4 完成"。 --- ## ✅ 实际完成(15 任务 · 47 子任务,截至 T-B-27 真实后端回归验证) | ID | 任务 | 子任务 | 状态 | Commit | |---|---|---|---|---| | T-B-18 | 错误码映射 | 3/3 | ✅ | `86296bd` | | T-B-19 | ErrorBoundary | 3/3 | ✅ | `ad261d7` | | T-B-20 | 离线检测 | 4/4 | ✅ | `c4f12ca` | | T-B-21 | SubmitButton 守卫 | 3/3 | ✅ | `411f225` | | T-B-22 | Query 持久化 | 3/3 | ✅ | `f5e40a4` | | **T-B-23** | **e2e 真实化(8 spec)** | **8/8** | ✅ | **`1a49439`** | | **T-B-24** | **Lighthouse CI** | **4/4** | ✅ | **`61ba0ca`** | | **T-B-25** | **Bundle 优化验证** | **3/3** | ✅ | **`bf5ad4a`** | | **T-B-26** | **路由级 prefetch** | **2/2** | ✅ | **`97cd431`** | | **T-B-27** | **真实后端回归** | **2/2** | ✅ | **`06a0f47`** | | **T-B-40** | **Share Link 状态面板** | **3/3** | ✅ | **`fecdb67`** | | **T-B-41** | **ShareLink 失败降级** | **3/3** | ✅ | **`c955459`** | | **T-B-42** | **LLM 增强进度轮询** | **3/3** | ✅ | **`c7f1dd4`** | | **T-B-43** | **Poster 异步生成 + 轮询** | **3/3** | ✅ | **`45e6719`** | | **T-C-45** | **集成测试套件** | **2/2** | ✅ | **`45e6719`** | --- ## ⏳ 剩余 / 阻塞(1 任务 · 4 子任务) ### T-B-23 · e2e 真实化(2.0d · 8 子任务) ✅ DONE 8 个真实业务流 e2e:theme-switch / chat-send-receive / form-submit-validation / plan-create-view / data-query-search / review-flow-approve / poster-generate-download **修复 3 类 e2e bug**: - Playwright 多 handler 同时匹配:fallback `**/api/**` 覆盖精细 mock → 改用 `(url) => url.pathname.startsWith('/api/') && !includes(精确路径)` - ReadableStream 不被 `route.fulfill` 接受 → 用 `Buffer.from(sse, 'utf-8')` - Mobile viewport 下 fixed nav 拦截 click → 用 Enter 键 + `{force: true}` + 验证 disabled 2026-07-05 复验:i18n 迁移导致的 e2e selector 回归已在 `2194f89` 修复。 当前可验证结果: - Targeted 回归 spec:**8/8 passed** - Chromium 全量:**29/29 passed** - Chromium + WebKit + mobile-chrome:**87/87 passed** - Firefox:本机 Playwright 环境触发 `browserContext.newPage` 异常,需环境修复后单独复验;不再计入本轮 i18n selector 回归。 ### T-B-24 · Lighthouse CI 集成(1.5d · 4 子任务) ✅ DONE - 装 `@lhci/cli` v0.14 - `apps/web/lighthouserc.cjs`: desktop preset, 3 runs, P/A/B/S ≥ 90 断言 - GitHub Action `treosh/lighthouse-ci-action@v12` + temporaryPublicStorage - 本地实测:P=100 / a11y=95 / best=96 / seo=91 ### T-B-25 · Bundle 优化验证(0.5d · 3 子任务) ✅ DONE - `vite.config.ts`: production sourcemap=false(build time 17.89s → 6.89s) - `scripts/bundle-report.cjs`: 总 500KB / 单 chunk 150KB budget - 8 vendor manualChunks 保持 + lazy page chunks 新增 ### T-B-26 · 路由级 prefetch(0.5d · 2 子任务) ✅ DONE - `usePrefetchLazyRoute` hook:lazy route loaders 注册表 - `RouteFallback` Suspense fallback(48px min-height) - `Sidebar` NavLink onMouseEnter/onFocus 触发 prefetch - 2026-07-05 最新构建:main chunk 146.74 KB gzip,total 393.60 KB gzip;仍低于单 chunk 150 KB / total 500 KB 预算,但不再沿用 81.30 KB 旧口径。 ### T-C-44 · Poster CLI Docker(1.0d · 4 子任务) - ✅ `Dockerfile.poster` 已补 - ✅ `docker-compose.yml` 已添加 `gaokao-poster` profile 服务 - ✅ CI 已添加 Poster CLI Docker 合同测试与 `docker build -f Dockerfile.poster` - ⏳ 本地 Docker 构建验证未跑:当前环境未安装 `docker` --- ## 🔍 当前 G 闸门真实状态(2026-07-03 深夜) | 闸门 | 定义 | 实测 | 状态 | |---|---|---|---| | typecheck | `tsc --noEmit` 0 error | 0 error | ✅ | | lint | `eslint .` 0 error 0 warning | 0 error 0 warning | ✅ | | vitest | 单测全过 | 69/69 (17 文件) | ✅ | | e2e | 8+ spec 全绿 | Chromium 29/29;Chromium + WebKit + mobile-chrome 87/87;Firefox 待本机环境修复后复验 | ⚠️ | | build | bundle 主 chunk < 150KB gzip | main 146.74 KB · total 393.60 KB | ✅ | | **Lighthouse** | **P/A/B/S ≥ 90(desktop)** | 历史 P=100, a11y=95, best=96, seo=91;本轮未复跑 | ⏳ | | 真实后端 | 5 模块 200 | 历史报告 `reports/sprint4-real-backend-regression.json` 存在;本轮未复跑 | ⏳ | | G4 Poster CLI | Docker 镜像本地构建 | Dockerfile/compose/CI 已落地;本地构建待 Docker 环境 | ⏳ | --- ## 🛡 防止再"虚假完成" 上一版本 Sprint 4 closeout 文档把"5/16 任务完成"包装成"全部通过 G3 + Sprint 4 完成"。这是用户已知的问题。**新规则**: 1. **任务表 vs 状态表**:每篇 closeout 必须用任务表的真实状态(完成 5/16),而不是"全部通过" 2. **闸门 vs 子任务**:G3 闸门定义要拆成可独立标记的子项 3. **阶段完成 ≠ Sprint 完成**:5 任务完成是"Sprint 4 阶段 1 完成",不是"Sprint 4 完成" 4. **真实命令输出 ≠ 真实实现**:每个 commit 都要看实际文件 --- ## 下一步 建议继续: - 选项 A:安装/启用 Docker 后,跑 T-C-44 Poster CLI Docker 本地构建验证 - 选项 B:在可用 Python 后端环境中补跑后端 pytest 契约测试