Przeglądaj źródła

docs(tdd): R101 测试负责人执行汇报 — 后端首次全量 96.36%(2829例/99红)、251 派发恢复(B-91闭环)、签名 v2 合入14/14绿(B-81闭环)、线上502窗口(B-93)与D盘满(B-92)登记

test-lead 3 dni temu
rodzic
commit
7bd633140a

+ 240 - 0
docs/tdd/orchestration/report-test-2026-11-09-R101.md

@@ -0,0 +1,240 @@
+# 测试负责人工作汇报(R101)
+
+> 汇报人:测试负责人(软件测试专家团 · 陆谨)|汇报周期:2026-11-09 09:52 ~ 11:15(第 101 轮)
+> 负责模块/单元:浠艾福 XAF(d:/cfc)· 全栈测试闭环(浏览器自动化 + langgraph@251 + 全量回归)
+> 执行档:review(内网 `/admin`+`/frontend`+251 已授权;未联网装依赖;静默无人值守)
+
+---
+
+## 一、本轮工作数据汇总
+
+### 1.1 测试用例建设
+
+| 指标 | 数量 | 说明 |
+|------|------|------|
+| 本轮新增测试用例数 | 0 个 | 窗口内无新增 SRS 需求文档变更(`docs/superpowers/specs/` 无新文件),不新建用例;**SRS 状态变更 1 项已同步用例台账**(见 1.4) |
+| 本轮验证执行测试数 | 3465 个 | 后端 2829(首次全量实测)+ 前端 Jest 426 + 管理端 116 + 根级 tests 23 + langgraph@251 43 + 浏览器 E2E 28 |
+| 用例通过率 | **95.01%** | 3292 PASS / 3465 执行(红 166、SKIP 7) |
+
+分套件实测:
+
+| 套件 | 执行 | 通过 | 红 | 跳过 | 通过率 | 与 R100 对比 |
+|------|------|------|----|------|--------|-------------|
+| cfc-backend(mvn 全量) | 2829 | 2726 | 99 | 4 | 96.36% | **R100 未实测(沿用 R97 94.75%)→ 本轮首次实测,+1.61pp** |
+| cfc-frontend(Jest) | 426 | 383 | 40 | 3 | 89.9% | 零漂移 |
+| cfc-web(Jest) | 116 | 116 | 0 | 0 | 100% | 零漂移 |
+| 根级 tests(Jest) | 23 | 7 | 16 | 0 | 30.4% | 零漂移(B-36) |
+| cfc-langgraph @251(pytest) | 43 | 32 | 11 | 0 | 74.4% | 零漂移(B-91 派发本轮恢复成功) |
+| 浏览器 E2E(live) | 28 | 28 | 0 | 0 | **100%** | 零漂移 |
+
+### 1.2 会话与任务分发
+
+| 指标 | 数量 | 说明 |
+|------|------|------|
+| 分派任务数 | 3 个 | ① 251 节点 langgraph pytest(`ses_e41f57acdffe…`,**成功**)② 本机 admin E2E ③ 本机 frontend E2E(189 失联,本机串行) |
+| 恢复智能体会话数 | 0 个 | — |
+| 当前在用会话数 | 1 个 | 251 派发会话(succeeded) |
+
+### 1.2b 各会话当前工作状态列表
+
+| 会话标签 | 会话 ID | 当前状态 | 当前任务 | 静默/空闲时长 | 工作目录 | 备注 |
+|----------|---------|----------|----------|---------------|----------|------|
+| 251-langgraph | ses_e41f57acdffeAuONBYaPOTEpRo | succeeded | langgraph pytest 43 例 | — | `/sc-data/cfc/cfc-langgraph`(`09ba334af` / cfclub) | 结果经 `/api/shell` 直读,未依赖 LLM 转述 |
+| 本机-admin | — | done | admin E2E 5/5 | — | 干净 | 本机单节点(B-89 189 失联,降级) |
+| 本机-frontend | — | done | frontend E2E 6/6 | — | 干净 | `LIVE_BASE_URL=https://cfc.iwintrue.com` |
+
+### 1.3 问题处置
+
+| 指标 | 数量 | 说明 |
+|------|------|------|
+| 新测试发现问题数 | 3 个 | **B-92**(本机 D 盘 100% 满,隔离树建不出来)、**B-93**(线上 `/api` 全站 502 窗口 10:20~10:26)、**B-94**(B-84 派发不确定性的解法:`/api/shell` 直读通道) |
+| 已解决测试相关问题数 | 2 个 | **B-91 闭环**(251 派发恢复成功)、**B-81 闭环**(签名 canvas2d 实现合入 + 14/14 绿) |
+| 待解决测试相关问题数 | 9 个 | B-65(P0 第 9 轮)、B-69(P1 第 8 轮,本轮线上 4 端点 200 复证)、B-90(P0 第 2 次复证)、B-82、B-84、B-89、B-92、B-93、B-94 |
+
+### 1.4 状态机阶段分布(全局进度)
+
+| 阶段 | 键数 | 备注 |
+|------|------|------|
+| UNTRACKED | — | CFC 发现/跟踪模式 |
+| RED | 3 族 | Guhe 契约 41 例 / DietFoodHealthAdjust 9 例 / diet 前端 40 例(SRS 已定稿待实现收敛) |
+| YELLOW | — | — |
+| GREEN | 5 | 状态机 5 键沿用全 GREEN |
+| DONE | +1 | **`signature.canvas2d.rewrite` 用例台账置「已实现」**(实现 `c0db9643c` 经 `ff76e1607` 09:07 合入 cfclub,定向复跑 14/14 绿) |
+
+### 1.5 数据源健康度
+
+| 数据源 | 读取键数 | 是否正常 | 备注 |
+|--------|----------|----------|------|
+| 需求侧(SRS) | 200 份 specs | 正常 | 窗口内**零新增**;`DOC-2026-11-09-signature-canvas2d-rewrite` 由 RED 转实现 |
+| 测试用例(test-cases) | 13 文件 / 806 条 TC | 正常 | 本轮更新 `signature.md` 状态段 |
+| E2E 用例 | 28 例(admin 5 + frontend 6 + health 13 + shop 4) | 正常 | 100% 通过 |
+| 后端 surefire | 336 类 / 2829 例 | 正常 | 336 源含 `@Test` = 336 XML,**完整性 336/336、静默丢失 0** |
+| langgraph pytest @251 | 43 例 | 正常 | 251 派发成功(95.46s) |
+
+### 1.6 本轮 git 提交与推送证据
+
+| 提交 sha | 关联任务/能力键 | 阶段 | 触及文件类型 | 目标分支 | 已推送远端 | 备注 |
+|----------|-----------------|------|--------------|----------|------------|------|
+| (见文末) | R101 汇报 + blockers(B-81/B-91 闭环, B-92~B-94) + signature 用例状态 | 报告 | 文档 | cfclub | 推送后填写 | 结果有变触发推送 |
+
+---
+
+## 二、向研发提出的改进建议
+
+| 序号 | 建议标题 | 问题描述 | 根因分析 | 建议方案 | 优先级 | 状态 |
+|------|----------|----------|----------|----------|--------|------|
+| 1 | langgraph analyze checkpointer(连续第 9 轮) | `test_analyze.py` 2 例 500(`Checkpointer requires ... thread_id`) | `analysis_graph.py:96 MemorySaver()` + `analyze.py:35 ainvoke` 无 config | 去 MemorySaver 或显式传 `thread_id` | P0 | 待评估 |
+| 2 | 251 LLM 凭据 + LLM 调用超时(第 3 轮) | 251 pytest intent 4 例降级 CHAT(`api key ****ocal is invalid`);**live `chat` 45s / `analyze` 90s 零字节超时**(health 22ms 正常) | 251 侧 LLM 凭据失效 + 调用无 timeout/熔断(B-84 同源) | 注入有效 etotem/deepseek 凭据;所有 LLM/检索调用加 `timeout`+熔断 | P0 | 待评估 |
+| 3 | `/api/mind/**` 4 端点公开白名单(连续第 8 轮) | 本轮线上复测:`/api/mind/alert/active`、`/api/mind/alert/checkin-alerts`、`/api/mind/traditional/mirror`、`/api/mind/traditional/compatibility` 匿名 **全部 200** | `JwtInterceptor.java:79-82` 在 PUBLIC_PATHS | 4 条移入 `LOGIN_REQUIRED_PATHS` → 匿名 401 | P1 | 待评估 |
+| 4 | 线上可用性:`/api` 全站 502 窗口 | 10:20 起全站 `/api/*`(含 `/api/system/health`、`/api/admin-auth/login`)与站点根 `/` 均 502,10:26 自恢复(约 5~6 分钟) | openresty 上游不可达(滚动重启/发布窗口),与 B-72 同族 | 发布/重启改蓝绿或健康检查灰度;恢复窗口自动告警 | P1 | 待评估 |
+| 5 | diet-recommendation 7 条需求前端 40 例长期红 | REQ1~REQ7(去顶部标题/视图互斥/4Tab/分页/「我」/生成 loading/共餐人)全部未实现,`recommendation.vue` 对 `currentTab`/`pagedFoods`/`loadMore`/`confirmParticipants` 命中 0 | SRS `2026-11-08-diet-recommendation-polish.md` 标「RED 入池待派发」,实现未派发 | 派发 `diet.recommendation.uiRework` + `participantSelect` 两个能力键,按 TDD RED→GREEN 收敛 | P1 | 待评估 |
+| 6 | Guhe v2 契约 41 例待全量复验 | 本轮基线 `ac4d7e97f` 上 Guhe 9 类 41 例红(TDD 预期 RED);实现 `ReportParserDispatchService`(S-cfc-84/90)在 `origin/cfclub 66873f066` 已合入但**不在本轮基线** | 跑测窗口内研发推进 5 提交(含 2 个生产文件 +155 行) | 下轮以 `66873f066` 为基线全量复跑,预期 41 例转绿;若仍红则按缺陷派单 | P1 | 待评估 |
+| 7 | `platform_fee` 列截断 | `GuideModuleIntegrationTest.testGuidePackageCreationFlow`:`Data truncation: Out of range value for column 'platform_fee'` | schema 列定义与代码写入值不一致 | 核验列定义/迁移脚本并统一精度 | P2 | 待评估 |
+| 8 | EnergySystem 6 例 / PlannerBind 3 例 500·403 | 集成流 `EnergySystemFlowTest` 6 例 500、`PlannerBindInviteFlowTest` 3 例 403(含 1 例 `doNothing()` 误用属测试侧) | 需研发确认集成流依赖与角色闸门口径(连续 8 轮未决) | 研发确认后测试侧同步装置:A 类自修、B 类派单 | P2 | 待评估 |
+
+---
+
+## 三、本轮阻塞与风险
+
+| 阻塞项 | 影响范围 | 阻塞类型 | 处置进展 | 需要协调 |
+|--------|----------|----------|----------|----------|
+| B-92(新增) | 隔离工作树 / 大盘产物写入 | 环境 | **本机 D 盘 293G/294G(可用 455MB)**,`git worktree add` 直接 `No space left on device` → 无法建隔离副本做「实现分支定向复验」 | 运维清理历史 `_wt_*` 树(7 个,各约 1GB)或扩容 |
+| B-93(新增) | 线上全链路 | 运维/发布 | 502 窗口 10:20~10:26 已自恢复;同窗口浏览器用例已跑完(10:00~10:06),未受影响 | 运维确认是否为发布窗口 |
+| B-89(第 3 轮) | admin 浏览器节点 | 运维 | 189 `:22/:4090` 全拒 → 本机单节点串行跑 admin+frontend(28/28 绿) | 运维恢复 189 或提供等价节点 |
+| B-90(第 2 次复证) | AI 管家线上主链路 | 研发/运维 | 251 `chat`/`analyze` 均超时无响应(health 正常) | 研发+运维(LLM 凭据 + 超时) |
+| B-65(第 9 轮) | AI 报告解析 | 研发 | 未修(源码未变) | 研发实现 |
+| B-69(第 8 轮) | 鉴权边界 | 研发 | 本轮线上 4 端点匿名 200 复证 | 研发实现 |
+| B-82 / B-84 | langgraph 意图分类 / 套件非终止 | 环境/测试 | 本轮以 `/api/shell` 直读绕开 LLM 转述(B-94),派发恢复 | 251 注入 LLM 凭据 |
+
+---
+
+## 四、下轮工作计划
+
+| 计划项 | 预计完成时间 | 前置依赖 | 备注 |
+|--------|--------------|----------|------|
+| 以 `origin/cfclub 66873f066` 为基线全量复跑后端 | 下轮 | D 盘空间(B-92) | 预期 Guhe 41 例转绿 → 后端 ≈97.8% |
+| 后端 49 例非预期红逐类归因与 A 类自修 | 下轮 | 无 | 优先 `CfCommissionServiceSettleTest` 8 例(未 stub 档位查询)与 `ArticleWorkflowTest` 3 例(文案过期) |
+| diet 40 例跟踪 RED→GREEN | 下轮 | 研发派发 2 个能力键 | 前端通过率 89.9% 的天花板 |
+| 251 langgraph 复验(凭据修复后) | 下轮 | 运维注入 LLM 凭据 | 本轮 43/32/11 已可稳定取回 |
+
+---
+
+## 五、本轮实测明细
+
+### 5.1 浏览器自动化(用户指令:`/admin` + `/frontend`)
+
+| 目标 | 节点 | 用例 | 结果 | 说明 |
+|------|------|------|------|------|
+| `http://cfc.iwintrue.com/admin` | 189(失联 B-89)→ 本机降级 | admin-live 5 | ✅ 5/5(2.1m) | TC-A-U01~U05,含 U04 真实登录(滑块+凭据)与 U05 菜单遍历;`workers:1` 串行 |
+| `http://cfc.iwintrue.com/frontend` | 本机 | frontend-live 6 | ✅ 6/6(53.2s) | TC-F-U01~U06 游客只读链路 |
+| 健康鉴权契约 | 本机 | health 13 | ✅ 13/13(11.9s) | 华为/小米 10 端点 + 健康方案 3 端点**全 401**(B-61 维持闭环) |
+| 商城排序契约 | 本机 | shop 4 | ✅ 4/4(11.0s) | price asc/desc/默认/非法列白名单 |
+
+> 每节点仅跑一个浏览器自动化任务:189 失联 → 本机串行执行两个 UI 任务 + 两个契约任务。
+
+### 5.2 langgraph(251 派发 · 本轮成功)
+
+```
+派发通道:opencode @ http://192.168.16.251:4096(Basic Auth)
+会话:ses_e41f57acdffeAuONBYaPOTEpRo(provider=etotem / model=deepseek)
+执行:cd /sc-data/cfc/cfc-langgraph && pytest tests --ignore=tests/qna --ignore=tests/test_chat.py -q --tb=line
+节点仓库:09ba334af(branch cfclub)
+结果:43 collected / 32 passed / 11 failed / 95.46s   ← 与 R97·R99 逐例零漂移
+```
+
+**11 红分布(与本轮 live 探测交叉印证)**:
+
+| 红例分组 | 例数 | 归因 | 本轮 live 证据 |
+|---|---|---|---|
+| `test_analyze.py` | 2 | **B-65**(`Checkpointer requires thread_id` → 500) | live `POST /api/v1/analyze` **90s 无响应** |
+| `test_auto_tag.py` | 5 | **B-74/B-82**:chat 端点 500(LLM key 401) | — |
+| `test_intent.py` | 4 | **B-82**:意图分类降级 CHAT(`api key ****ocal is invalid`) | — |
+
+live 探测:`/health` 200(22ms)、`/api/v1/chat` **45s 零字节超时**、`/api/v1/analyze` **90s 零字节超时** → B-90 第 2 次复证(与 pytest 同源:LLM 凭据失效 + 无超时)。
+
+> **关键改进(B-94)**:本轮改用 `/api/session/{id}/shell` + `/api/shell/{id}/output` **直读命令输出**,不再依赖 agent 用自然语言转述结果 —— R98/R99/R100 的「轮询 780s 取不到 JSON」「agent 只回 reasoning 不回报文」全部消失,95.46s 拿到确定性结果。
+
+### 5.3 后端全量(本轮首次实测,56:17)
+
+| 指标 | 数值 |
+|------|------|
+| 命令 | `mvn -o -B -DskipTests=false clean test`(JDK 1.8.0_25 + Maven 3.9.9) |
+| 结果 | **336 类 / 2829 例 / 2726 过 / 88F + 11E + 4S = 96.36%**(剔 skip 96.49%) |
+| 红类 / 红例 | 29 类 / 99 例 |
+| 编译 | main 2112 源 0 错;test 342 源 0 错 |
+| 完整性 | 336 源含 `@Test` = 336 XML,**沉默 0** |
+| 恒等式 | `@Test 2819 + 参数化展开 26 − @Disabled 4 − 早退截断 12 = 2829`,误差 **0** |
+| 对比 | R97(94.75%/143 红例)→ **+1.61pp / 红例 −44** |
+
+**99 红例三层归因**:
+
+| 层 | 例数 | 明细 |
+|---|---|---|
+| **预期 RED(TDD 契约,SRS 已定稿)** | **50** | Guhe 9 类 41(EvidenceIsolate 11 / LowSideRuleLoad 7 / V2Route 5 / KbQueryLowSidePatch 4 / LowSideAggregate 4 / ReportPersonalAssert 4 / LowSideNoSupplement 3 / VersionSplit 3)+ `DietFoodHealthAdjustContractTest` 9 |
+| **A 类(测试装置,可自修)** | **27** | `CfCommissionServiceSettleTest` 8(未 stub 档位查询)、`ArticleAutoTagServiceTest` 4(执行器断言与实际调用路径不符)、`DimensionScoreServiceImplTest` 4E(`No value present`,Optional 未桩)、`ArticleWorkflowTest` 3(文案过期:`仅已驳回` vs `仅已驳回或已撤回`)、`PlannerBindInviteFlowTest` 1(`doNothing()` 用于非 void)、`ServiceRoleApproveTest` 2E、`UserServiceWechatLogin(Contract)` 2、`TaskPlanServiceTest` 1、`TeamProfitCronContractTest` 1、`GrowthRecordSyncFlowTest` 1 |
+| **B 类(产品/实现,需研发)** | **22** | `EnergySystemFlowTest` 6(500)、`PlannerBindInviteFlowTest` 3(403 角色闸门)、`DimensionRegistryMapContractTest` 3(契约与实现不一致)、`GrowthRecordSyncFlowTest` 2E、`MindFortuneControllerTest` 1(**B-69** 401→实得 400)、`GuideModuleIntegrationTest` 1(`platform_fee` 截断)、其余 6 类各 1 |
+
+> 修完 A 类 27 例 → 后端 **97.31%**;叠加 Guhe 41 例随实现转绿 → **98.76%**(待下轮全量实证)。
+
+### 5.4 前端 / 管理端 / 根级
+
+| 集合 | 结果 | 依据 |
+|------|------|------|
+| cfc-frontend Jest | 26 套 / **383 过 / 40 红 / 3 跳**(426) | 3 个失败套件全为 diet-recommendation:`recommendation.participantSelect`(8)、`recommendation.uiRework`(29)、`recommendation.healthAdjustUi`(3)→ REQ1~REQ7 未实现(TDD RED);**签名 canvas2d 9 例已由红转绿** |
+| cfc-web Jest | 17 套 / **116 全绿** | 41.9s |
+| 根级 tests Jest | 3 套 / 7 过 / **16 红**(23) | B-16/B-36:缺 `ADMIN_PHONE`/`CFC_API_TOKEN` 夹具,`plan-chain`/`mini-games-api` 打真服务 401/500 |
+| 签名定向 | **14/14 绿** | `npx jest __tests__/pages/signature` → B-81 闭环判据达成 |
+
+### 5.5 SRS / 用例台账变更
+
+| 项 | 变更 | 处置 |
+|---|---|---|
+| `DOC-2026-11-09-signature-canvas2d-rewrite` | RED → **已实现**(`ff76e1607` 09:07 合入 cfclub) | `tests/test-cases/signature.md` 状态段更新为「已实现(GREEN,第 101 轮)」,附 14/14 实测证据 |
+| `2026-11-08-diet-recommendation-polish.md`(REQ1~REQ7) | 仍为 RED(实现未派发) | 无用例缺口,40 例已可执行、持续红 → 转研发建议 #5 |
+| `2026-11-09-diet-recommendation-health-questionnaire-adjust.md` | 仍为 RED | 后端契约 `DietFoodHealthAdjustContractTest` 9 例已就位、预期红 |
+| 窗口内新增 SRS | **0 份** | 无新建用例义务 |
+
+---
+
+## 六、门禁结论
+
+**结论:⚠️ 不通过(有条件)**
+
+| 门禁 | 判据 | 实测 | 是否达标 |
+|---|---|---|---|
+| G1 用例通过率 | ≥95% | 全量 **95.01%**、后端 96.36% | ✅ |
+| G2 红例数 | ≤20 | **166**(后端 99 / 前端 40 / 根级 16 / langgraph 11) | ❌ |
+| G3 前端套件 | 全绿 | 383/426(40 红) | ❌ |
+| G4 管理端 | 全绿 | 116/116 | ✅ |
+| G5 后端完整性 | 无沉默 | 336/336 XML、编译 0 错 | ✅ |
+| G6 浏览器 E2E | 全通过 | **28/28**(admin 5 + frontend 6 + health 13 + shop 4) | ✅ |
+| G7 langgraph | 0 红 | 11 红 | ❌ |
+| G8 鉴权契约 | 全 401 | health 13/13;`/api/mind/**` 4 端点 200 | ⚠️ 部分 |
+| G9 SRS 可追溯 | TC 锚点 ≥80% | **61/806 = 7.6%** | ❌ |
+| G10 节点分派 | 按指令分派 | 251 ✅ / 189 ❌(本机降级) | ⚠️ 部分 |
+| G11 CI 门禁 | blocking | 仍为软门禁(B-40) | ❌ |
+| G12 资产入库 | 新资产已入库 | signature 台账已更新;无新增用例 | ✅ |
+
+**未实测项(不计入通过)**:覆盖率/变异(无 JaCoCo、PIT 不可用)、性能压测、DAST/SCA(未授权联网)、无障碍/多浏览器矩阵、真机(iOS/安卓)、UAT/BDD/探索性、`tests/test_chat.py`(B-84 无超时,主动排除)、`tests/qna`(死资产)。
+
+**复评条件(全部满足方转「通过」)**:
+1. B-65 修复 → `test_analyze.py` 2 例转绿 + live analyze 连跑 3 次 200。
+2. B-82/B-90 解决 → 251 LLM 凭据有效 + 调用超时熔断 → intent 4 例转绿 + live chat/analyze <30s。
+3. B-69 修复 → 4 条 `/api/mind/**` 移入 `LOGIN_REQUIRED_PATHS`,线上匿名 401。
+4. diet REQ1~REQ7 实现落地 → 前端 40 例转绿(前端 100%)。
+5. A 类 27 例测试侧自修 → 后端红例 99→72;Guhe 41 例随实现转绿 → 后端 ≈98.8%。
+6. G9:按角色分批补 TC 锚点至 ≥80%;G11:CI 增设 blocking job。
+
+---
+
+## 变更触发(用户规则:结果有变提交远程 + 通知研发)
+
+本轮 vs R100 存在**方向性变化**,触发推送与通知:
+- **后端首次实测 96.36%(2829 例)**,较 R100 引用的 R97 陈旧值 94.75% 提升 1.61pp、红例 −44。
+- **251 langgraph 派发恢复成功**(B-91 闭环)+ 新通道 `/api/shell` 使结果**确定性取回**(B-94)。
+- **B-81 闭环**:签名 canvas2d 实现合入,9 例 RED → GREEN。
+- **新增 P1 环境/可用性问题 2 项**:B-92(D 盘满)、B-93(线上全站 502 窗口)。
+
+→ 本报告 + blockers + signature 台账 commit 并 push `origin/cfclub`;Agent Mail 不可用,以 blockers.md + 本报告 + 研发交接通知为研发通知载体。
+
+*本报告提交至 `origin/cfclub`(docs/tdd/orchestration/),并同步更新 `docs/tdd/test/blockers.md`。*

+ 11 - 0
docs/tdd/test/blockers.md

@@ -157,3 +157,14 @@
 | B-84-Update(第 99 轮 · 251 会话同源卡滞) | langgraph 套件非终止 / 251 派发轮询取回延迟 | 测试/研发 | **第 99 轮(2026-11-09 09:0x)**。251 首派会话轮询 780s 未取到 JSON(`combined_len=14`),会话实际已产出完整结果(直接拉取 `/message` 得 43/32/11)。根因同 B-84/R98:agent 把结果写在 reasoning/文本但轮询聚合函数只认 `"pass"&"fail"&"total"` 同现的 JSON 串,且 `test_chat.py` 无超时拖慢收敛。已用「拉取 `/message` 兜底」取回,结果可用 | 测试负责人(第 99 轮登记) | 2026-11-09 09:0x | 待处理(P1) |
 | B-90(第 99 轮新增 · 复发风险) | 251 `POST /api/v1/chat` 与 `/api/v1/analyze` 60s 无响应 | 研发/运维 | **P0 复发风险(第 99 轮实测,2026-11-09 09:0x)**。`251:9000/health` → `200 {"status":"ok"}`(13ms),但 `POST /api/v1/chat {"query":"你好","user_id":995}` 与 `POST /api/v1/analyze {"report_id":1,...}` 均 **60s 无响应(0 字节,curl 超时)**。B-77 曾在第 94 轮以同特征挂起、第 95 轮确认恢复(R95 三层探测 200),本轮再次出现「health ok + 业务接口挂起」。与 251 pytest 中 LLM key 401 同源(LLM 调用无超时,B-84)。影响 AI 管家线上主链路。闭环:同 B-84——LLM/检索调用加 timeout+熔断;恢复后 live chat/analyze <30s 且连跑 3 次 200 | 测试负责人(第 99 轮实测登记) | 2026-11-09 09:0x | 待处理(P0,复发风险) |
 | B-91(第 100 轮新增 · 251 派发失败) | langgraph pytest 251 派发(用户指令核心项) | 环境/测试 | **P1(第 100 轮实测,2026-11-09 09:50)**。用户要求 langgraph 测试分派 251:本轮经 `OPENCODE_SERVER_PASSWORD` + `_dispatch_251.cjs`(BASE=http://192.168.16.251:4096)建会话 `ses_e4214df4affeHIAVyVSH7uxNh6`,agent `OUTCOME=failed`,未产出 pytest 结果(疑似 B-82 LLM key 无效导致 opencode agent 执行失败);本地 venv 兜底因 B-54 chromadb 性能退化 >18min 超时中止,未能刷新 251 权威数(沿用 R99 43/32/11)。闭环:运维注入 251 有效 LLM 凭据后重派,复验派发可成功取回结果 | 测试负责人(第 100 轮登记) | 2026-11-09 09:50 | 待处理(P1,251 派发失败) |
+
+<!-- ===== 第 101 轮(2026-11-09 09:52~11:15)追加 ===== -->
+
+| B-91-Close(第 101 轮闭环) | langgraph pytest 251 派发 | 测试/环境(已恢复) | **已解除(第 101 轮,2026-11-09 10:35)**。派发方式不变(opencode `http://192.168.16.251:4096`,`OPENCODE_PROVIDER=etotem` / `OPENCODE_MODEL=deepseek`),但**结果取回改走 `/api/session/{id}/shell` + `/api/shell/{id}/output` 直读**:会话 `ses_e41f57acdffeAuONBYaPOTEpRo`,节点仓库 `09ba334af`(branch cfclub),`pytest tests --ignore=tests/qna --ignore=tests/test_chat.py -q` → **43 collected / 32 passed / 11 failed / 95.46s**,与 R97·R99 逐例零漂移。R100 的 `OUTCOME=failed` 实为「agent 只回 reasoning 不出最终报文」+ 轮询只认含 `pass&fail&total` 的 JSON 串(B-84 同源),**不是派发通道故障**。闭环判据达成:251 派发可成功取回权威数 | 测试负责人(第 101 轮实测闭环) | 2026-11-09 10:35 | **已解除** |
+| B-81-Close(第 101 轮闭环) | 签名 v2 竖屏直签 + canvas 2d 重写 | 研发(已实现)/ 测试(已验证) | **已解除(第 101 轮,2026-11-09 10:05)**。实现 `c0db9643c` 经 `ff76e1607`(2026-11-09 09:07)合入 `cfclub`;`git merge-base --is-ancestor ff76e1607 HEAD` = YES。测试侧定向复跑 `npx jest __tests__/pages/signature` → **14/14 全绿**(含原 9 例 RED 契约转 GREEN);前端全量 383/40 中已无签名相关红例(R99 的 51 红 → 现 40 红,差集即签名 11 例)。台账 `tests/test-cases/signature.md` 状态段已由「待开发(RED)」更新为「已实现(GREEN)」。**闭环**:实现合入 ✔ + 前端 9 RED 转绿 ✔ + 台账置已实现 ✔ | 测试负责人(第 101 轮复验闭环) | 2026-11-09 10:05 | **已解除** |
+| B-69-Update(第 101 轮 · 连续第 8 轮) | 4 个 `/api/mind/**` 位于公开白名单 | 研发 | **连续第 8 轮未修(2026-11-09 10:27)**。按 `JwtInterceptor.java:79-82` 的 4 条白名单逐条线上实测(匿名 POST,无 token):`/api/mind/alert/active` → **200**、`/api/mind/alert/checkin-alerts` → **200**、`/api/mind/traditional/mirror` → **200**、`/api/mind/traditional/compatibility` → **200**(对照同批 `/api/huawei-health/status` 为 401,证明拦截器在听、非全局放行)。测试侧 `MindFortuneControllerTest.testGetTodayFortuneWithoutAuth` 仍红:期望 401 实得 **400**(`@RequestAttribute` 绑定层先 400,控制器 null 分支不可达,B-57 同族)。闭环判据不变:4 条移入 `LOGIN_REQUIRED_PATHS` → 测试断言改 401 + 线上全 401 | 测试负责人(第 101 轮线上复证登记) | 2026-11-09 10:27 | 待处理(P1,连续第 8 轮) |
+| B-90-Update(第 101 轮 · 第 2 次复证) | 251 `chat` / `analyze` 无响应(health 正常) | 研发/运维 | **第 101 轮(2026-11-09 10:31)**。`251:9000/health` → 200(22ms);`POST /api/v1/chat {"query":"你好","user_id":995}` → **45s 零字节超时**;`POST /api/v1/analyze {"report_id":1,"user_id":995}`(按线上 `/openapi.json` `AnalyzeRequest` 契约构造)→ **90s 零字节超时**。与同节点 pytest `test_intent` 4 例 `api key ****ocal is invalid` 同源:**LLM 凭据失效 + 调用无 timeout/熔断**(B-84)。影响 AI 管家与报告解析线上主链路。闭环:注入有效凭据 + 全部 LLM/检索调用加 timeout+熔断 → live chat/analyze 连跑 3 次 <30s 且 200 | 测试负责人(第 101 轮实测复证) | 2026-11-09 10:31 | 待处理(P0) |
+| B-92(第 101 轮新增 · 环境) | 本机 D 盘 100% 满,无法建隔离工作树 | 运维 | **P1 测试环境(第 101 轮实测)**。`df`:`D: 294G 已用 293G,可用 455MB(100%)`。执行 `git worktree add D:/_wt_r101 origin/cfclub` 时逐文件报 `error: unable to create file ...: No space left on device`(`docs/系统测试/screenshots/*.png`、`docs/系统测试/test-assets`),`fatal: cannot create directory` → **无法建隔离副本做「实现分支定向复验」**(本轮因此只能对 `66873f066` 的 Guhe 实现做静态核对,未能实测转绿)。历史遗留树 7 个(`_wt_r0247/r0419/r0745/r077/r1054/r85/r91`,单个约 1.1GB,其中 `_wt_r0247` 有 26 项未提交改动**不可直接删**)。建议:运维清理已闭环的历史树(逐个 `git -C <wt> status --porcelain` 确认干净后 `git worktree remove --force`)或扩容 ≥10GB;测试侧不再默认建树,改用主工作区只读跑 | 测试负责人(第 101 轮实测登记) | 2026-11-09 11:02 | 待处理(P1,运维) |
+| B-93(第 101 轮新增 · 线上可用性) | 线上 `/api/*` 全站 502 窗口(约 5~6 分钟) | 运维/研发 | **P1 可用性事件(第 101 轮实测)**。10:20 起 `https://cfc.iwintrue.com` 全站不可用:`/api/system/health`、`/api/admin-auth/login`、`/api/huawei-health/status`、`/api/mind/*` 连测全部 **502**(重试 3 次一致),站点根 `/` 亦 **502**(`/admin` 返回 302,静态路由仍在);10:26:01 起 `/api/system/health` 恢复 200 并连续 6 次稳定。判定:openresty 上游(后端实例)不可达,属**发布/滚动重启窗口**,与 B-72(R90 记录的同族 502 抖动)同类但本轮**全站级**、持续更久。影响:该窗口内的任何浏览器/接口用例都会得到假红(本轮 09:57~10:06 已跑完,未受影响)。建议:发布改蓝绿/灰度 + 上游健康检查;对 `/api/*` 增加 5xx 连续阈值告警。闭环:连续 3 天无 ≥60s 的全站 502 窗口 | 测试负责人(第 101 轮实测登记) | 2026-11-09 10:26 | 待处理(P1,运维) |
+| B-94(第 101 轮新增 · 方法论/工具) | 251 派发结果「取不回来」的确定性解法 | 测试 | **改进落地(第 101 轮)**。根因(B-84/B-91 同源):派发客户端只轮询 session `outcome` 并从 **assistant 文本**里抠 JSON,而 (a) agent 常把结论写进 reasoning 不写正文、(b) `pytest -q` 的 `tail` 输出不含 `pass&fail&total` 同现的 JSON 串 → 轮询必然空转 780s。本轮改用 opencode 原生 shell 通道:`POST /api/session/{sid}/shell {"command": "..."}`(204)→ `GET /api/shell` 取 `id/status/pid` → `GET /api/shell/{id}/output` 取 stdout(`{"data":{"output","size","truncated"}}`)→ 轮询 `GET /api/shell/{id}` 至 `status != running`。**收益**:结果不依赖 LLM 输出格式、可拿原始 stdout、95.46s 收敛(对比 R98/R99 的 780s 超时)。注意:命令需**单行且避免子 shell 变量**(本轮首次派发用 `( ... && PY=... )` 导致 `PY` 为空、`timeout: failed to run command '-m'`;改 `$(ls .venv/bin/python || command -v python3)` 后成功) | 测试负责人(第 101 轮落地) | 2026-11-09 10:40 | 已处置(通道固化,供后续轮次复用) |
+| B-89-Update(第 101 轮 · 第 3 轮失联) | `192.168.16.189` 节点失联 | 运维 | **第 3 轮失联(2026-11-09 09:55)**。`189:22` / `189:4090` 探活均 `http=000`(连接不可达),`189:4090/health` 无响应 → admin 任务仍无法派发该节点。**降级**:本机单节点串行跑完 admin 5/5 + frontend 6/6 + health 13/13 + shop 4/4 = **28/28 全绿**,遵守「每节点单任务」。闭环判据不变:放通 189:4090+22 后复派 admin 5/5 | 测试负责人(第 101 轮探活登记) | 2026-11-09 09:55 | 待处理(P1,运维) |

+ 75 - 0
docs/tdd/研发交接通知-2026-11-09-第101轮.md

@@ -0,0 +1,75 @@
+# 研发交接通知 · 第 101 轮(2026-11-09)
+
+> 发出:测试负责人(陆谨)|轮次:R101(09:52~11:15)|基线:`cfclub @ ac4d7e97f`(= `origin` 起点)
+> 结论:**不通过(有条件)** — 全量 3465 例 / 3292 过 = **95.01%**;后端首次全量实测 **96.36%**
+
+---
+
+## 一、需要研发立即处理的 3 项(P0)
+
+| # | 事项 | 证据 | 需要做什么 |
+|---|------|------|-----------|
+| 1 | **B-65(第 9 轮)** langgraph `/api/v1/analyze` checkpointer 缺 `thread_id` | 251 pytest `test_analyze.py` 2 例 500(`ValueError: Checkpointer requires ... thread_id`);线上 `POST /api/v1/analyze` **90s 零字节超时** | `analysis_graph.py:96` 去掉 `MemorySaver()` 或 `analyze.py:35` 显式传 `config={"configurable":{"thread_id":...}}` |
+| 2 | **B-90(第 2 次复证)** 251 LLM 凭据失效 + 调用无超时 | 251 live `chat` 45s / `analyze` 90s 零字节(health 22ms 正常);pytest `test_intent` 4 例降级 CHAT(`api key ****ocal is invalid`)+ `test_auto_tag` 5 例 | 注入有效 etotem/deepseek 凭据;所有 LLM/检索调用加 `timeout` + 熔断,禁止无限等待 |
+| 3 | **B-69(第 8 轮)** 4 个 `/api/mind/**` 仍在 PUBLIC_PATHS | 线上匿名 POST 4 端点**全部 200**:`/api/mind/alert/active`、`/api/mind/alert/checkin-alerts`、`/api/mind/traditional/mirror`、`/api/mind/traditional/compatibility`(同批 `huawei-health/status` 为 401,证明拦截器生效、非全局放行) | 4 条移入 `JwtInterceptor.LOGIN_REQUIRED_PATHS`(`:79-82` → LOGIN 列表) |
+
+---
+
+## 二、本轮已闭环(供研发核对)
+
+| 项 | 结论 |
+|---|---|
+| **B-81** 签名 v2(竖屏直签 + canvas 2d) | ✅ 闭环。`ff76e1607`(09:07)合入 cfclub,定向复跑 **14/14 绿**,9 例 RED 契约转 GREEN;`tests/test-cases/signature.md` 已置「已实现(GREEN)」 |
+| **B-91** 251 派发失败 | ✅ 闭环。改用 `/api/shell` 直读 stdout,43/32/11(95.46s),与 R97/R99 逐例零漂移。R100 的 `failed` 是「agent 只回 reasoning」而非通道故障 |
+| **B-61** health 越权 | ✅ 维持闭环。health 契约 13/13(华为/小米 10 端点 + 健康方案 3 端点全 401) |
+
+---
+
+## 三、后端 99 红例归因(请按层认领)
+
+| 层 | 例数 | 处置方 | 明细 |
+|---|---|---|---|
+| 预期 RED(TDD 契约) | **50** | 研发实现 | Guhe 9 类 41 例(`EvidenceIsolate` 11 / `LowSideRuleLoad` 7 / `V2Route` 5 / `KbQueryLowSidePatch` 4 / `LowSideAggregate` 4 / `ReportPersonalAssert` 4 / `LowSideNoSupplement` 3 / `VersionSplit` 3)+ `DietFoodHealthAdjustContractTest` 9 |
+| A 类(测试装置) | **27** | 测试自修 | `CfCommissionServiceSettleTest` 8(未 stub 档位查询)、`ArticleAutoTagServiceTest` 4(执行器断言与实际路径不符)、`DimensionScoreServiceImplTest` 4E、`ArticleWorkflowTest` 3(文案过期)、`PlannerBindInviteFlowTest` 1(`doNothing()` 误用)、`ServiceRoleApproveTest` 2E、其余 5 例 |
+| B 类(产品/实现) | **22** | 研发 | `EnergySystemFlowTest` 6(500)、`PlannerBindInviteFlowTest` 3(403 角色闸门)、`DimensionRegistryMapContractTest` 3(契约与实现不一致)、`GrowthRecordSyncFlowTest` 2E、`MindFortuneControllerTest` 1(= B-69)、`GuideModuleIntegrationTest` 1(`platform_fee` 截断)、其余 6 例 |
+
+> **重要**:`origin/cfclub` 已前进至 `66873f066`,其中 `7270303b5`(S-cfc-90 guheV2Route)+ `4ef901c48`(S-cfc-84 versionSplit)新增 `ReportParserDispatchService.java`(+155 行)+ `ParsedReportResult.java`(+15 行)——**正对应 Guhe `V2Route`/`VersionSplit` 等 41 例预期 RED**。本轮全量基线 `ac4d7e97f` 尚未含该实现;**下轮将以 `66873f066` 全量复跑,预期 41 例转绿**。
+
+---
+
+## 四、新增环境/运维事项
+
+| 编号 | 事项 | 影响 | 请谁处理 |
+|---|---|---|---|
+| **B-92** | 本机 D 盘 **100% 满**(294G/293G,可用 455MB),`git worktree add` 报 `No space left on device` | 无法建隔离副本做「实现分支定向复验」 | 运维:清理已闭环历史树(7 个,各约 1.1GB,`_wt_r0247` 有 26 项未提交改动不可直删)或扩容 ≥10GB |
+| **B-93** | 线上 `/api/*` **全站 502 窗口 10:20~10:26**(含 `/api/system/health`、`/api/admin-auth/login`,站点根 `/` 亦 502) | 窗口内任何用例都会假红 | 运维:确认是否发布窗口;建议蓝绿/灰度 + 上游健康检查 + 5xx 连续阈值告警 |
+| **B-89** | `192.168.16.189` `:22/:4090` 全拒(第 3 轮) | admin 浏览器任务无法派该节点 | 运维:恢复 189 或提供等价节点(本轮已本机降级跑 28/28 绿) |
+
+---
+
+## 五、前端 40 红 = 7 条需求未实现(SRS 已定稿)
+
+`docs/superpowers/specs/2026-11-08-diet-recommendation-polish.md`(REQ1~REQ7)状态为「RED 入池待派发」,导致 `cfc-frontend` 稳定 40 红(3 套件):
+- `recommendation.participantSelect` 8 例(REQ7 共餐人选择/`participant_member_ids`)
+- `recommendation.uiRework` 29 例(REQ1 去顶部标题 / REQ2 视图互斥 / REQ3 4Tab / REQ4 分页 / REQ5「我」/ REQ6 生成 loading)
+- `recommendation.healthAdjustUi` 3 例(11-09 健康问卷个性化)
+
+→ 请派发 `diet.recommendation.uiRework` 与 `diet.recommendation.participantSelect` 两个能力键(共用 `recommendation.vue`,须串行)。这是前端通过率 89.9% 的唯一天花板。
+
+---
+
+## 六、本轮实测数据(可复核)
+
+| 套件 | 执行 | 过 | 红 | 跳 | 通过率 |
+|---|---|---|---|---|---|
+| cfc-backend(`mvn -o -B -DskipTests=false clean test`,56:17) | 2829 | 2726 | 99 | 4 | 96.36% |
+| cfc-frontend(Jest) | 426 | 383 | 40 | 3 | 89.9% |
+| cfc-web(Jest) | 116 | 116 | 0 | 0 | 100% |
+| 根级 tests(Jest) | 23 | 7 | 16 | 0 | 30.4% |
+| cfc-langgraph @251(pytest) | 43 | 32 | 11 | 0 | 74.4% |
+| 浏览器 E2E(admin 5 + frontend 6 + health 13 + shop 4) | 28 | 28 | 0 | 0 | **100%** |
+| **合计** | **3465** | **3292** | 166 | 7 | **95.01%** |
+
+后端可信度:336 源含 `@Test` = 336 XML(**沉默 0**)、testCompile 342 源 0 错、恒等式 `2819 + 26 − 4 − 12 = 2829` 误差 0。
+
+详细报告:`docs/tdd/orchestration/report-test-2026-11-09-R101.md`;台账:`docs/tdd/test/blockers.md`(B-81/B-91 闭环,B-69/B-89/B-90 更新,B-92~B-94 新增)。

+ 3 - 2
tests/test-cases/signature.md

@@ -41,7 +41,8 @@
 ### 状态
 
 - 上述用例随 SRS 变更 `DOC-2026-11-09-signature-canvas2d-rewrite`(2026-11-09)重写,取代 11-08 横屏方案(R2 根因:旧式 `uni.createCanvasContext` 触摸坐标依赖缓存 rect → 坐标漂移字迹不显示;R1 根因:`setPageOrientation` 部分机型不可靠)。
-- 功能状态:**待开发(RED)**——v2 任务书未实施,`signature.vue` 仍含 `enterLandscape/restorePortrait/h5DegradeHint`,`hand-signature.vue` 仍为旧式 `canvas-id + ctx.draw()`。
-- 可执行化:**已完成(第 95 轮)**——`cfc-frontend/__tests__/pages/signature/signature.canvas2d.test.js` 覆盖全部 S4-1/S4-2 契约(11 例:9 RED 契约 + 2 保留 GREEN 基线),**实测 9 红 / 2 绿**。
+- 功能状态:**已实现(GREEN,第 101 轮更新)**——实现 `c0db9643c`(`feat(DOC-2026-11-09-signature-canvas2d-rewrite)`)已于 **2026-11-09 09:07 经 `ff76e1607` 合入 `cfclub`**;`signature.vue` 已去横屏依赖、`hand-signature.vue` 已改 `type="2d"` + `ctx.stroke()` 同步绘制。
+- 可执行化:**已完成(第 95 轮)**——`cfc-frontend/__tests__/pages/signature/signature.canvas2d.test.js` 覆盖全部 S4-1/S4-2 契约(11 例:9 RED 契约 + 2 保留 GREEN 基线)。
+- 实测:**第 101 轮(2026-11-09 10:0x)定向复跑 `npx jest __tests__/pages/signature` → 14/14 全绿**(含 9 例原 RED 契约转 GREEN),前端全量 383/40 中不再含签名相关红例 → 与 B-81-Update 的「实现已验证(11/11)」+「待合入 cfclub」两项前置**双双达成**,B-81 可闭环。
 - 归档:旧横屏契约 `cfc-frontend/__tests__/pages/signature/signature.landscape.superseded.js`(7 例验证已作废 S1/S2/S3,改名不参与 jest 匹配,保留审计)。
 - 仍未覆盖:TC-SIG2D-01-E(2d 初始化失败重试)、TC-SIG2D-02-E(导出降级)、TC-SIG2D-N01/N02(真机/多端)——需真机与运行时环境,本轮未实测。