Преглед изворни кода

docs(tdd): 测试负责人第81轮汇报 + R80报告补推 + 阻塞台账更新(admin 5/5恢复、B-62/B-53/B-58闭环、B-61第3轮P0、B-56派发探针新证据)

E2E Test Bot пре 4 дана
родитељ
комит
3b2ad5100f

+ 136 - 0
docs/tdd/orchestration/report-test-2026-11-08-0630.md

@@ -0,0 +1,136 @@
+# 测试负责人工作汇报(2026-11-08 第 81 轮)
+
+> 汇报人:陆谨(软件测试专家团主理人 · 测试负责人)|周期:2026-11-08 06:10 ~ 06:30(第 81 轮自动化测试闭环)
+
+---
+
+## 基本信息
+
+| 项目 | 内容 |
+|------|------|
+| 汇报人 | 测试负责人(软件测试专家团 主理人) |
+| 汇报周期 | 2026-11-08 06:10 ~ 06:30(第 81 轮) |
+| 负责模块/单元 | 全项目(cfc-backend / cfc-frontend / cfc-web / cfc-langgraph + 线上 E2E) |
+
+---
+
+## 一、本轮工作数据汇总
+
+### 1.1 测试用例建设
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **本轮新增测试用例数** | 0 个 | SRS 闸门为空(`docs/tdd/SRS.md`/需求分析/specs/api 自 362bf7b1b 起零变更),无需新增/登记 RED |
+| **本轮验证执行测试数** | 556 例 | 343(frontend Jest) + 90(web Jest) + 5(admin) + 6(frontend E2E) + 4(shop) + 13(health) + 43(langgraph) + 后端 test-compile 1 项 + 三节点派发探针 3 项 |
+| **用例通过率** | 95.68% | 532 通过 ÷ 556 执行(1 skip 不计失败;health 3 例 + langgraph 17 例 + 派发探针 3 项受限) |
+
+### 1.2 会话与任务分发
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **分派任务数** | 3 个 | opencode 探针任务:189-admin、204-frontend、251-langgraph(均只读探测,见 1.2b) |
+| **恢复智能体会话数** | 0 个 | 本轮无中断/超时会话需恢复 |
+| **当前在用会话数** | 0 个 | 三节点探针会话已结束(create 成功,任务实际执行受限于通道/配额,见下方) |
+
+### 1.2b 各会话当前工作状态列表
+
+| 会话标签 | 会话 ID(探针) | 当前状态 | 当前任务 | 静默/空闲时长 | 工作目录 | 备注 |
+|----------|-----------------|----------|----------|---------------|----------|------|
+| 189-admin | `ses_e47e973adffe3M1nuiAmwzWOHh` | done(通道失效) | admin 浏览器 E2E 派发探针 | — | c:\code\cfc | `POST /api/session/{id}/prompt` → **404**(API 版本不符),零产出;admin E2E 已本机实跑 5/5 兜底 |
+| 204-frontend | `ses_e47e8b3c2ffeZxmJIs6qM1rub1` | done(配额限流) | frontend 浏览器 E2E 派发探针 | — | d:\cfc | prompt 200、assistant 有响应但 `[RETRY provider.rate-limit 今日额度用尽 1req/3min]`;frontend E2E 已本机实跑 6/6 兜底 |
+| 251-langgraph | `ses_e47e88103ffeiqeZBkFGCLOjes` | done(配额限流) | langgraph pytest 派发探针 | — | /sc-data/cfc | prompt 200,同样命中配额限流;langgraph 9000 服务 closed;pytest 已本机 .venv 兜底 26/43 |
+| 本机浏览器节点(desktop204) | — | idle | 本机兜底 Playwright(admin 5/5、frontend 6/6、shop 4/4、health 10/13) | — | d:\cfc\tests | 串行、只读、无 globalSetup;作业目录干净 |
+
+**状态判定依据**:三节点探针实时执行(R79 探针脚本,2026-11-08 06:12~06:18);本机工作目录 `git status --porcelain` 59 项(测试侧产物 + 研发 WIP 并存,测试侧均不入库,见提交说明)。
+
+### 1.3 问题处置
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **新测试发现问题数** | 1 个 | P1:远程派发通道再探针(189 prompt 404 新证据 + 204/251 配额限流新证据,B-56 演进,见附录 C) |
+| **已解决测试相关问题数** | 4 个 | B-62(14 RED 转绿,frontend 全绿)/ B-53(13 文件入库,WIP 清零)/ B-58(8 文件入库,账本收口)/ 上轮 /admin 退化(5/5 恢复,待复测稳判) |
+| **待解决测试相关问题数** | 见附录 C | P0×1(B-61 健康方案鉴权,第 3 轮)+ P1×3(langgraph 17 红、派发通道、JaCoCo)+ 历史 P1 若干 |
+
+### 1.4 本轮 git 提交与推送证据(真理证据)
+
+| 提交 sha | 关联任务/能力键 | 阶段 | 触及文件类型 | 目标分支 | 已推送远端 | 备注 |
+|----------|-----------------|------|--------------|----------|------------|------|
+| (本轮提交,见下) | R81 测试闭环 | 汇报/台账 | 测试(报告/台账) | cfclub | 是(提交后即 push) | 含 automation-run-0630 + report-test-0630 + blockers.md 更新 + 上轮 0550 报告补推 |
+| b6d5b0391(基线) | S-cfc-63/64 | GREEN | 实现 | cfclub | 是 | 本轮起始 HEAD;远端 origin/cfclub=72d5d77d7(+4,S-cfc-65 等) |
+
+### 1.5 状态机阶段分布(全局进度)
+
+| 阶段 | 键数 | 备注 |
+|------|------|------|
+| GREEN | 5 | 本地 `.tdd/state.json` 5 键全 GREEN(health.report.createReport 等,updated 11-06 16:57) |
+| DONE | 12+ | 研发侧口径 22 键 = 12 DONE + 9 GREEN + 1 YELLOW(sleep.config.tags 待 mark-green) |
+| RED | 0 | 研发侧 RED 5(S-cfc-* 新契约,研发报告口径) |
+
+> 口径说明:本地账本与研发侧账本存在版本差异(B-17 审计提示承袭),以研发 06:10 汇报为准:SC 15/241。
+
+### 1.6 数据源健康度
+
+| 数据源 | 读取键数 | 是否正常 | 备注 |
+|--------|----------|----------|------|
+| 需求侧(⏳ wish) | 0 | 正常 | CFC 未启用 SRS 需求池(srs_section 为占位段) |
+| 契约常量(contract) | 5 键 | 正常 | 本地 state.json 5 键 GREEN |
+| 测试用例引用(test_case_map) | 556 | 正常 | 本轮实跑用例数,见 1.1 |
+| 执行结果回填(case_results) | 43+1 | 正常 | langgraph 43 例 + 浏览器 28 例 + Jest 433 例 |
+
+---
+
+## 二、向研发提出的改进建议
+
+| 序号 | 建议标题 | 问题描述 | 根因分析 | 建议方案 | 优先级 | 状态 |
+|------|----------|----------|----------|----------|--------|------|
+| 1 | 修 P0 健康方案鉴权(B-61,第 3 轮催办) | `/api/health/plan/{adjust,attribution,generate}` 匿名 200 | `JwtInterceptor.LOGIN_REQUIRED_PATHS` opt-in 清单漏配,与华为/小米健康同族 | `LOGIN_REQUIRED_PATHS` 追加 `/api/health/plan/`,部署后复跑 health 契约 13/13 | P0 | 待评估(连续第 3 轮) |
+| 2 | 确认 langgraph conftest 修复意图(B-58 收口) | 主干 17 红持续(26/43) | 入库 conftest.py 不含 R76 工作区版本的 `collect_ignore`/`llm_live` 重构 | 研发将已验证的 conftest 修复内容正式提交;或确认按 B-54 环境路线(VC++ 运行时/重建 venv/FakeEmbeddings)处置 | P1 | 待评估 |
+| 3 | 恢复节点派发通道(B-56) | 189 prompt 404 / 204·251 配额限流,浏览器/langgraph 无法按节点分派 | opencode 版本不一致 + 模型今日文本额度用尽 | 对齐 opencode 版本与 API 路由;恢复/切换模型配额;251 放通 9000 | P1 | 待评估 |
+
+---
+
+## 三、本轮阻塞与风险
+
+| 阻塞项 | 影响范围 | 阻塞类型 | 处置进展 | 需要协调 |
+|--------|----------|----------|----------|----------|
+| P0 健康方案鉴权(B-61) | 健康方案 3 端点安全缺口 | 研发 | 待处理(第 3 轮);已入 `docs/tdd/test/blockers.md` | 研发修 + 部署 |
+| langgraph 17 红(B-54/B-58) | 问卷/解析/意图链路 | 研发/测试 | 处理中;本机兜底 26/43 | 研发确认 conftest 意图或环境修复 |
+| 远程派发通道(B-56) | 浏览器/langgraph 节点化分派 | 测试/运维 | 本轮探针取证完成;浏览器任务本机串行兜底合规 | 运维恢复配额/端口,研发对齐版本 |
+| 全量后端 `mvn test` 未复跑 | 后端通过率基线陈旧(R77 95.07%) | 测试 | mvn 3.9.9 已定位,本轮仅 test-compile;建议授权整轮实跑固化新基线 | 环境放行 |
+
+---
+
+## 四、下轮工作计划
+
+| 计划项 | 预计完成时间 | 前置依赖 | 备注 |
+|--------|--------------|----------|------|
+| 复测 /admin 5/5 稳定性(连续 2 轮绿) | 下轮 | — | 验证上轮退化是否永久恢复 |
+| 复测 health 契约 13/13(P0) | 下轮 | 研发修 JwtInterceptor | B-61 闭环判据 |
+| 三节点派发通道重探 | 下轮 | 配额恢复/端口放行 | 按指令恢复 189→admin / 204→frontend / 251→langgraph |
+| 后端全量 `mvn test` 实跑(若环境放行) | 待定 | 用户授权 + 时长窗口 | 固化新权威基线 |
+
+---
+
+## 附录
+
+### 附录 A:本轮新增测试用例明细
+
+| 用例 ID | 能力键 | 目标单元 | 用例标题 | 预期失败契约 | 是否已登记 RED | 登记 sha |
+|---------|--------|----------|----------|--------------|----------------|----------|
+| (无) | — | — | SRS 闸门为空,本轮零新增用例 | — | 否 | — |
+
+### 附录 B:任务分派与会话恢复明细
+
+| 任务号 | 目标会话标签 | 分派时间 | 分派类型 | 当前状态 | 恢复会话标签 | 恢复原因 | 恢复时间 |
+|--------|--------------|----------|----------|----------|--------------|----------|----------|
+| probe-r79-189 | 189-admin | 06:12 | 新建 | done(通道失效) | — | prompt 404 无产出 | 06:18 |
+| probe-r79-204 | 204-frontend | 06:14 | 新建 | done(配额限流) | — | provider rate-limit | 06:16 |
+| probe-r79-251 | 251-langgraph | 06:16 | 新建 | done(配额限流) | — | provider rate-limit + 9000 closed | 06:18 |
+
+### 附录 C:新发现问题明细
+
+| 问题 ID | 能力键/任务号 | 问题类型 | 路由去向 | 登记时间 | 处置状态 | 关联 sha |
+|---------|---------------|----------|----------|----------|----------|----------|
+| B-56-Update(R79 探针) | — | 阻塞(通道/配额) | 测试/运维 | 2026-11-08 06:18 | 待处理 | — |
+| B-61(第 3 轮复现) | health.plan.* | 缺陷(安全缺口) | 研发 | 2026-11-08 06:26 | 待处理 | — |
+| B-62(闭环确认) | S-cfc-35/38 | 阻塞解除 | 研发(已实现) | 2026-11-08 06:28 | 已解决(14 RED 转绿) | 2c65d98f7/4f40a8973 |

+ 195 - 0
docs/tdd/test/automation-run-2026-11-08-0550.md

@@ -0,0 +1,195 @@
+# 测试闭环报告 · 浠艾福 XAF(每小时轮)
+
+- **执行时间**:2026-11-08 05:50 (GMT+8)
+- **执行档**:review 档(已授权内网 `cfc.iwintrue.com`→`192.168.16.251`,仅 `/admin`、`/frontend` 及同源只读契约;不联网)
+- **本轮 HEAD**:`b6d5b0391`(S-cfc-63 team.user.portal 使绿 / S-cfc-64 分润管道化 GREEN)
+- **上次自动化 HEAD**:`362bf7b1b`(2026-11-08 02:21)
+- **两轮间提交**:44 commits(team.* 实现 + 家庭加入前端 + 大量 S-cfc-* RED/GREEN 契约单测 + docs 汇报)
+- **测试负责人**:陆谨(软件测试专家团主理人,只读审查 + 授权内测试用例编写)
+
+---
+
+## 一、历史审查记录(对照,非本次结论依据)
+
+按记忆库召回(本对象历史密集,近 10 轮均为「⛔不通过(有条件)」)。遗留长期风险:
+- **B-61 / P0**:`/api/health/plan/**` 未纳入 `JwtInterceptor.LOGIN_REQUIRED_PATHS`,匿名 POST 直通 200(自 02:21 起持续)。
+- **JaCoCo 缺失**:离线不可得(`.m2` 无 `org/jacoco`,需联网下载),覆盖率 N/A。
+- **37 红类**(3×B-13 + 34 漂移,含 S-cfc-31 blank-key 真实缺陷)长期未归零。
+- **growth_records 重复列**(P1)历史未处置。
+- **B-34/B-35** LangGraph 问卷降级(需 AI 9000,超内网授权)。
+- **/admin 真实登录**:R78(05:06)曾 5/5 全绿;02:21 因无凭据+滑块降级未实跑。
+
+---
+
+## 二、项目画像速览(只读)
+
+| 模块 | 技术栈 | 端口 | 本轮可测范围 |
+|---|---|---|---|
+| cfc-backend | Spring Boot 2.7.18 + MyBatis-Plus + Java 8 | 9082 | 单测/契约单测(离线 test-compile 验证) |
+| cfc-frontend | uni-app 小程序 (Vue2) | — | Jest 单元/组件(mock API) |
+| cfc-web | Vue2 + ElementUI 管理端 | 8082 | Jest 单元/组件(mock API) |
+| cfc-langgraph | Python FastAPI + LangGraph | 9000 | 离线不可测(需 .venv + LLM 凭据) |
+| 内网部署 | `cfc.iwintrue.com`→192.168.16.251 | — | Playwright 只读 E2E(已授权 `/admin`、`/frontend` 及同源契约) |
+
+**关键路径/约束(据 AGENTS.md)**:统一 `@PostMapping`、JWT 拦截 `/api/**`(8 公开路径)、`JwtInterceptor.LOGIN_REQUIRED_PATHS` 为鉴权门禁核心;小程序禁用可选链/CSS Grid;迁移唯一入口 `DatabaseInitializer`。
+
+---
+
+## 三、20 类测试覆盖矩阵(三态:已发现 / 未发现 / 待核实)
+
+| # | 测试类型 | 三态 | 证据 |
+|---|---|---|---|
+| 1 | 单元测试 | 已发现(实测) | cfc-frontend 19套件/342+1skip;cfc-web 12套件/90 |
+| 2 | 组件级测试 | 已发现(实测) | cfc-web `*/*.spec.js` 组件测试(ProductPicker/SkuEditor/Audit…) |
+| 3 | 集成测试 | 已发现(部分) | 后端 S-cfc-* 契约单测(未全量复跑,复用基线);shop-api 接口契约 |
+| 4 | 接口/API 测试 | 已发现(实测) | shop-sort-api TC-S-U01~04、health-contract TC-H-U01~10 |
+| 5 | 系统/端到端 | 已发现(实测) | frontend-live 6、admin-live 5、health 13(Playwright 真实浏览器) |
+| 6 | 冒烟测试 | 已发现 | ci-smoke、frontend TC-F-U01 首屏渲染 |
+| 7 | 回归测试 | 已发现(实测) | Jest 双绿连绿 + E2E 复跑对比(见第五节) |
+| 8 | 探索性测试 | 未发现 | 无现成资产 → 降级为测试设计(见第十三节) |
+| 9 | 验收/UAT/BDD | 未发现 | 待核实(无 BDD 规格资产) |
+| 10 | 性能测试 | 未发现 | 未授权未执行(需公网/打远端)→ 测试设计 |
+| 11 | 可靠性测试 | 待核实 | 无现成资产;健康探针 302 可达但无持续可靠性刻画 |
+| 12 | 安全(SAST/DAST/依赖) | 未发现 | 未授权未执行(需公网)→ 测试设计 |
+| 13 | 兼容性测试 | 已发现(部分) | admin-desktop(1440×900) + frontend-mobile(375×812, isMobile) |
+| 14 | 可用性测试 | 待核实 | 前端 E2E 含「无 requestfailed」部分覆盖 |
+| 15 | 无障碍测试 | 未发现 | 无资产 → 降级设计 |
+| 16 | 覆盖率度量 | 待核实(未实测) | JaCoCo 离线缺失,覆盖率 N/A;仅 surefire 口径基线 |
+| 17 | 质量指标 | 已发现 | 通过率/套件数/红例数持续采集 |
+| 18 | 全项目代码审查 | 已发现(只读) | 本轮回溯 44 提交 + 历史 B-类问题;不修改代码 |
+| 19 | 变异测试 | 未发现 | 无资产 → 降级设计 |
+| 20 | 契约测试 | 已发现 | S-cfc-35~49 红/绿契约单测(后端) |
+
+---
+
+## 四、测试方案与执行档
+
+- **范围**:cfc-frontend / cfc-web Jest(全量实跑);内网 E2E(frontend/admin/shop/health 只读);后端 `mvn test-compile`(验证 44 提交编译)。
+- **执行档**:review(内网已授权;公网命令一律不执行)。
+- **排除项**:依赖漏洞/压测/DAST(公网)、JaCoCo(联网下载)、LangGraph 复验(需 9000)、全量后端 `mvn test`(被 S-cfc-* 预期 RED 污染 + 时长,复用权威基线)。
+
+---
+
+## 五、执行结果
+
+| 维度 | 用例总数 | 通过 | 失败 | 备注 |
+|---|---|---|---|---|
+| cfc-frontend Jest | 343 | 342 | 0 | 1 skipped;对比 R79 19套件/343 持平 |
+| cfc-web Jest | 90 | 90 | 0 | 12套件全绿,连绿 |
+| 后端 test-compile | — | — | — | EXIT 0,44 新提交编译通过(未跑全量) |
+| E2E frontend | 6 | 6 | 0 | TC-F-U01~U06 游客态全绿 |
+| E2E shop-api | 4 | 4 | 0 | TC-S-U01~U04 排序契约绿 |
+| E2E admin | 5 | 3 | 2 | TC-A-U01~U03 绿;**U04/U05 失败**(登录身份自动带出为空) |
+| E2E health | 13 | 10 | 3 | 10 鉴权拦截绿;**U01/U02/U03 失败**(匿名 POST 200,P0 持续) |
+
+**覆盖率**:行/分支覆盖率 N/A(JaCoCo 离线缺失);后端权威全量基线 surefire 口径 ≈ 95.07%–95.90%(R77/R79,本次未重跑,标未实测)。
+
+---
+
+## 六、回归与对比(vs 上次自动化 02:21,HEAD 362bf7b1b)
+
+- **Jest 双绿连绿**:frontend 19/342、web 12/90,与基线一致,**无新增回归**。
+- **E2E 前端 6/6、shop 4/4、health 10/10**:与历史持平。
+- **新增执行项 — /admin 真实登录**:02:21 因无凭据+滑块**降级未实跑**;本轮实跑得 3 通过 / 2 失败(U04/U05 卡在「登录身份自动带出」为空)。对照 R78(05:06)曾 `/admin 5/5 全绿`,本轮为**退化信号**,须核实(见第八节 / 第九节)。
+- **P0 健康方案鉴权缺口(B-61)**:health TC-HP-U01/02/03 连续多轮失败,匿名 POST `/api/health/plan/{adjust,attribution,generate}` 仍返回 200,**未修复**。
+- **生产 src/main 自 02:21 起变更**:team.*(S-cfc-63/64 等)+ family.invite 前端,均随契约单测合入,无新增红类证据。
+
+---
+
+## 七、测试用例编写产出(SRS 闸门)
+
+- **闸门判定**:`git diff 362bf7b1b..HEAD -- docs/tdd/SRS.md "docs/需求分析" docs/superpowers/specs docs/superpowers/api` → **无任何变更**。
+- **结论**:**本次无需求/SRS/接口文档变更,跳过测试用例编写**,零仓库抖动(符合闭环「零抖动」约定)。
+- 注:44 提交中的 `docs/tdd/*` 为 TDD 编排汇报,不在闸门路径内,不触发编写。
+
+---
+
+## 八、新增风险
+
+- **🔴 /admin 真实登录退化(P1,待核实)**:TC-A-U04/U05 在「输入手机号后登录身份自动带出」步骤失败(期望非空,实际 `''`)。对照 R78 5/5 全绿,提示部署态/账号角色查询(`account-roles`)可能回退或测试账号角色配置缺失。需研发/运维核实目标实例该账号角色数据,非直接判定代码回归。
+
+---
+
+## 九、覆盖缺口清单
+
+| 缺口 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
+|---|---|---|---|---|---|
+| P0 健康方案鉴权 | `/api/health/plan/**` 未入 LOGIN_REQUIRED_PATHS | 匿名可调用的付费/隐私接口 | 复跑 TC-HP-U01~03,期望 401/403 | P0 | 修 JwtInterceptor 后 E2E 转绿 |
+| /admin 登录退化 | 身份自动带出空 | 真实管理员无法登录后台 | 核实账号角色 + 复跑 U04/U05 | P1 | 账号数据修复/代码修复后复跑 |
+| JaCoCo 覆盖率 | 离线缺失 | 覆盖率无量化门槛 | 联网下载插件或改 pom 引 jacoco | P1 | 引入后 `mvn test jacoco:report` |
+| 37 红类 | 3 B-13 + 34 漂移(含 S-cfc-31 blank-key 真缺陷) | 已知缺陷长期未闭环 | 逐类派发修复 + 复跑 | P1 | 红例归零 |
+| growth_records 重复列 | 历史未处置 | 数据模型冗余/写入风险 | 架构审查 + 迁移去重 | P1 | 处置后复跑 |
+| 探索性/无障碍/变异/BDD | 无资产 | 非功能覆盖盲区 | 补探索性脚本 + axe 无障碍 + pitest | P2 | 设计态→资产化 |
+
+---
+
+## 十、五要素问题清单
+
+### 问题 1(P0)— 健康方案接口匿名可调用
+1. **问题描述**:匿名 POST `/api/health/plan/{adjust,attribution,generate}` 返回 200(应 401/403)。
+2. **测试 bug 点**:`tests/e2e-live/health-contract.spec.js:84`(`expect([401,403,404]).toContain(status)`,实际 200);根因 `cfc-backend` `JwtInterceptor.LOGIN_REQUIRED_PATHS`(约 87–127 行)未含 `/api/health/plan/**`。
+3. **最优修改方案**:在 `LOGIN_REQUIRED_PATHS` 追加 `/api/health/plan/**`(与 API_REFERENCE §4.49 口径一致)。
+4. **修改目的**:闭合鉴权门禁,防止未授权访问健康方案付费/隐私能力。
+5. **问题闭环**:修复后复跑 `playwright.config.health.js` → TC-HP-U01~03 由失败转 401/403 即通过;标准:3 例全绿。
+
+### 问题 2(P1)— /admin 真实登录身份自动带出失败
+1. **问题描述**:E2E TC-A-U04/U05 输入手机号后「登录身份」未自动带出(期望非空),登录无法完成;对照 R78 曾 5/5。
+2. **测试 bug 点**:`tests/e2e-live/admin-live.spec.js:129` 与 `:153`(`waitIdentityAutoFilled` 返回 `''`);被测端 `account-roles` 查询(输入手机号 500ms 防抖)。
+3. **最优修改方案**:核实目标部署实例(192.168.16.251)测试账号角色数据是否完整;若为代码回归则修复 `account-roles` 返回;若为账号配置则补角色。
+4. **修改目的**:恢复管理端真实登录可用,保障后台可测性与运维可达性。
+5. **问题闭环**:修复后复跑 `playwright.config.live.js --project=admin-desktop` → TC-A-U04/U05 转绿;标准:5/5。
+
+### 问题 3(P1)— 覆盖率不可量化(JaCoCo 缺失)
+1. **问题描述**:离线环境 `.m2` 无 `org/jacoco`,`pom.xml` 无 jacoco 插件,无法产出行/分支覆盖率。
+2. **测试 bug 点**:`cfc-backend/pom.xml` build/plugins 仅 spring-boot/compiler/surefire;无 `jacoco-maven-plugin`。
+3. **最优修改方案**:联网引入 `jacoco-maven-plugin` 并在 surefire 挂载 `-javaagent`,或命令行 `mvn test org.jacoco:jacoco-maven-plugin:report`。
+4. **修改目的**:建立 ≥80% 行覆盖率量化门槛(复评硬条件之一)。
+5. **问题闭环**:引入后 `mvn test jacoco:report` 产出报告,达标即满足;标准:行覆盖率 ≥80%。
+
+### 问题 4(P1)— 已知红类/S-cfc-31 blank-key 真实缺陷未闭环
+1. **问题描述**:37 红类(3 B-13 + 34 漂移)含小程序 blank-key 真实缺陷长期未修复。
+2. **测试 bug 点**:`cfc-frontend` 历史 `S-cfc-31`(blank-key);`DatabaseInitializer` 迁移红类集合。
+3. **最优修改方案**:逐类派发修复单测并复跑;blank-key 按 AGENTS 约束用 `parseDate()`/`&&` 替代。
+4. **修改目的**:消除已知缺陷,提升质量门禁可信度。
+5. **问题闭环**:`mvn test` 红例归零;标准:红例 ≤ 阈值且红类 = 0。
+
+---
+
+## 十一、待核实项
+
+- /admin 真实登录退化是否为部署态账号角色缺失还是代码回归(见问题 2)。
+- 后端全量 `mvn test` 真实红例/红类数(本轮仅 test-compile,复用 R77/R79 基线,标未实测)。
+- cfc-langgraph 测试(需 `.venv` + LLM 凭据,离线不可测)。
+- B-34/B-35 LangGraph 问卷降级复验(需 AI 9000,超内网授权)。
+- 探索性/无障碍/BDD/变异测试资产缺失(无材料,标待核实,不臆造)。
+
+---
+
+## 十二、需用户单独授权才能继续的项(未授权未执行 + 测试设计)
+
+| 项 | 为何未执行 | 测试设计(降级产出) |
+|---|---|---|
+| 依赖漏洞扫描 | 需公网(maven/github 元数据) | 离线可用 `mvn dependency-check:check`(需先联网拉规则库一次);或人工核对 `pom.xml` 依赖版本 |
+| 性能压测 | 需公网 + 打目标环境 | k6/JMeter 脚本针对 `/api/product/list`、`/api/health/plan/*`;授权后仅打内网 192.168.16.251 |
+| DAST(OWASP ZAP) | 需公网下载 | 对 `/admin`、`/frontend` 做被动/主动扫描;授权后仅内网 |
+| JaCoCo 覆盖率 | 需联网下载插件 | 见问题 3 设计 |
+| LangGraph 复验(B-34/B-35) | 需 AI 9000(超内网授权) | 启动 9000 最小服务后复跑问卷降级用例 |
+| 全量 `mvn test` 重跑 | 被 S-cfc-* 预期 RED 污染 + 时长 | 已用 test-compile 验证编译;建议环境就绪后整轮实跑固化新基线 |
+
+---
+
+## 十三、门禁结论
+
+**⛔ 不通过(有条件)**
+
+**依据**:P0 健康方案鉴权缺口(B-61)持续多轮未修;新增 /admin 真实登录退化待核实(对照 R78 5/5 为退化信号);JaCoCo 覆盖率不可量化(N/A);37 红类/S-cfc-31 真缺陷未闭环;growth_records 重复列未处置。本轮 Jest 双绿、前端/shop E2E 全绿、后端编译通过,但门禁硬条件未满足。
+
+**复评条件(全部满足方可转「通过」)**:
+1. 修 P0:将 `/api/health/plan/**` 纳入 `JwtInterceptor.LOGIN_REQUIRED_PATHS` → 复跑 `playwright.config.health.js` 全绿(TC-HP-U01~03 转 401/403)。
+2. 核实并修复 /admin 真实登录退化 → 复跑 `admin-desktop` 5/5。
+3. 引入 JaCoCo,后端行覆盖率 ≥ 80%。
+4. 37 红类归零(含 S-cfc-31 blank-key 真缺陷修复)。
+5. 处置 growth_records 重复列。
+6. 用户单独授权:依赖漏洞/压测/DAST 公网项;B-34/B-35 经 AI 9000 复验。
+
+**本轮产物**:本报告 `docs/tdd/test/automation-run-2026-11-08-0550.md`(未提交、未推送)。

+ 201 - 0
docs/tdd/test/automation-run-2026-11-08-0630.md

@@ -0,0 +1,201 @@
+# 测试闭环报告 · 浠艾福 XAF(每小时轮 · 第 81 轮)
+
+- **执行时间**:2026-11-08 06:30 (GMT+8)
+- **执行档**:review 档(已授权内网 `cfc.iwintrue.com`→`192.168.16.251`,仅 `/admin`、`/frontend` 及同源只读契约;不联网)
+- **本轮 HEAD**:`b6d5b0391`(本地工作树,含 S-cfc-63/64 使绿提交)
+- **远端 HEAD**:`origin/cfclub = 72d5d77d7`(较本地 +4 commits:S-cfc-65 team.star.multiplier 实现 + 2 版本号提交 + 研发 06:10 汇报)
+- **上次自动化 HEAD**:`b6d5b0391`(2026-11-08 05:50 轮,本地未再推进)
+- **两轮间远端提交**:4 commits(team.* 实现 + 版本号 + 研发汇报;SRS/需求/接口文档零变更)
+- **测试负责人**:陆谨(软件测试专家团主理人,只读审查 + 授权内测试用例执行)
+
+---
+
+## 一、历史审查记录(对照,非本次结论依据)
+
+按记忆库召回(本对象历史密集,近 10 轮均为「⛔不通过(有条件)」)。遗留长期风险:
+- **B-61 / P0**:`/api/health/plan/**` 未纳入 `JwtInterceptor.LOGIN_REQUIRED_PATHS`,匿名 POST 直通 200(自 02:21 起持续,**本轮为第 3 轮复现**)。
+- **JaCoCo 缺失**:离线不可得,覆盖率 N/A(无量化门槛)。
+- **37 红类 / S-cfc-31 blank-key**:历史红类集合长期未归零(R77 全量 35 红类 / 115 红例)。
+- **growth_records 重复列**(P1)历史未处置。
+- **B-34/B-35** LangGraph 问卷降级(需 AI 9000,超内网授权)。
+- **/admin 真实登录**:05:50 轮曾退化(U04/U05 身份带出失败 3/5);本轮恢复 5/5(见第五节)。
+
+**较上轮新增改善**:B-62(14 RED 预期未实现)→ 闭环;B-53(11 文件 WIP)→ 闭环(13 文件已入库);B-58(langgraph 8 文件 WIP)→ 入库(但修复内容未落地,见第六节)。
+
+---
+
+## 二、项目画像速览(只读)
+
+| 模块 | 技术栈 | 端口 | 本轮可测范围 |
+|---|---|---|---|
+| cfc-backend | Spring Boot 2.7.18 + MyBatis-Plus + Java 8 | 9082 | 单测/契约单测(离线 test-compile 验证) |
+| cfc-frontend | uni-app 小程序 (Vue2) | — | Jest 单元/组件(mock API) |
+| cfc-web | Vue2 + ElementUI 管理端 | 8082 | Jest 单元/组件(mock API) |
+| cfc-langgraph | Python FastAPI + LangGraph | 9000 | 本地 .venv pytest(qna 排除;LLM/chromadb 受限) |
+| 内网部署 | `cfc.iwintrue.com`→192.168.16.251 | — | Playwright 只读 E2E(`/admin`、`/frontend`、shop、health 契约) |
+
+**关键路径/约束(据 AGENTS.md)**:统一 `@PostMapping`、JWT 拦截 `/api/**`(8 公开路径)、`JwtInterceptor.LOGIN_REQUIRED_PATHS` 为鉴权门禁核心;小程序禁用可选链/CSS Grid;迁移唯一入口 `DatabaseInitializer`。
+
+---
+
+## 三、20 类测试覆盖矩阵(三态:已发现 / 未发现 / 待核实)
+
+| # | 测试类型 | 三态 | 证据 |
+|---|---|---|---|
+| 1 | 单元测试 | 已发现(实测) | cfc-frontend 19套件/342+1skip;cfc-web 12套件/90 |
+| 2 | 组件级测试 | 已发现(实测) | cfc-web `*/*.spec.js` 组件测试(ProductPicker/SkuEditor/Audit…) |
+| 3 | 集成测试 | 已发现(部分) | 后端 S-cfc-* 契约单测(未全量复跑,复用基线);shop-api 接口契约 |
+| 4 | 接口/API 测试 | 已发现(实测) | shop-sort-api TC-S-U01~04、health-contract TC-H-U01~10 |
+| 5 | 系统/端到端 | 已发现(实测) | frontend-live 6、admin-live 5、health 13(Playwright 真实浏览器) |
+| 6 | 冒烟测试 | 已发现 | ci-smoke、frontend TC-F-U01 首屏渲染 |
+| 7 | 回归测试 | 已发现(实测) | Jest 双绿连绿 + E2E 复跑对比(见第五节) |
+| 8 | 探索性测试 | 未发现 | 无现成资产 → 降级为测试设计 |
+| 9 | 验收/UAT/BDD | 未发现 | 待核实(无 BDD 规格资产) |
+| 10 | 性能测试 | 未发现 | 未授权未执行(需公网/打远端)→ 测试设计 |
+| 11 | 可靠性测试 | 待核实 | 无现成资产;健康探针 302 可达但无持续可靠性刻画 |
+| 12 | 安全(SAST/DAST/依赖) | 未发现 | 未授权未执行(需公网)→ 测试设计 |
+| 13 | 兼容性测试 | 已发现(部分) | admin-desktop(1440×900) + frontend-mobile(375×812, isMobile) |
+| 14 | 可用性测试 | 待核实 | 前端 E2E 含「无 requestfailed」部分覆盖 |
+| 15 | 无障碍测试 | 未发现 | 无资产 → 降级设计 |
+| 16 | 覆盖率度量 | 待核实(未实测) | JaCoCo 离线缺失,覆盖率 N/A;仅 surefire 口径基线 |
+| 17 | 质量指标 | 已发现 | 通过率/套件数/红例数持续采集 |
+| 18 | 全项目代码审查 | 已发现(只读) | 本轮回溯 4 远端提交 + 历史 B-类问题;不修改代码 |
+| 19 | 变异测试 | 未发现 | 无资产 → 降级设计 |
+| 20 | 契约测试 | 已发现 | S-cfc-35~49 红/绿契约单测(后端);health-contract 鉴权契约(E2E) |
+
+---
+
+## 四、测试方案与执行档
+
+- **范围**:cfc-frontend / cfc-web Jest(全量实跑);内网 E2E(admin/frontend/shop/health 只读);后端 `mvn test-compile`(验证本机树编译,mvn 3.9.9 已定位);langgraph 本机 `.venv` pytest(qna 排除)。
+- **执行档**:review(内网已授权;公网命令一律不执行)。
+- **排除项**:依赖漏洞/压测/DAST(公网)、JaCoCo(联网下载)、全量后端 `mvn test`(被 S-cfc-* 预期 RED 污染 + 时长,复用权威基线 R77 95.07%)、langgraph 远程派发(251 不可达/限流,见第十二节)。
+
+---
+
+## 五、执行结果
+
+| 维度 | 用例总数 | 通过 | 失败 | 备注 |
+|---|---|---|---|---|
+| cfc-frontend Jest | 343 | 342 | 0 | 1 skipped;19 套件连绿;**B-62 的 14 例 RED 已全部转绿** |
+| cfc-web Jest | 90 | 90 | 0 | 12 套件连绿 |
+| 后端 test-compile | — | — | — | EXIT 0(mvn 3.9.9,5m52s;本机树 b6d5b0391+WIP 编译通过) |
+| E2E admin | 5 | 5 | 0 | TC-A-U01~U05 全绿;**U04/U05 真实登录+菜单遍历恢复**(上轮 3/5) |
+| E2E frontend | 6 | 6 | 0 | TC-F-U01~U06 游客态全绿 |
+| E2E shop-api | 4 | 4 | 0 | TC-S-U01~U04 排序契约绿 |
+| E2E health | 13 | 10 | 3 | TC-H-U01~U10 绿;**TC-HP-U01/02/03 仍 200 直通(B-61 P0 第 3 轮)** |
+| langgraph pytest | 43 | 26 | 17 | 与 R77/R78 一致;C 类环境 14(chromadb DLL + LLM 401 + 数据路径)+ A 类夹具 3(MemoryManager embeddings 签名) |
+
+**覆盖率**:行/分支覆盖率 N/A(JaCoCo 离线缺失);后端权威全量基线 surefire 口径 ≈ 95.07%(R77,本轮未重跑,标未实测)。
+
+---
+
+## 六、回归与对比(vs 上次自动化 05:50,HEAD b6d5b0391)
+
+- **Jest 双绿连绿**:frontend 19/342+1skip、web 12/90,与基线一致,**无新增回归**。
+- **/admin 恢复**:05:50 轮 3/5(U04/U05 登录身份自动带出失败,报告列为「退化信号待核实」);**本轮 5/5 全绿**,U04/U05 通过 → 上轮退化未再复现,初步判定为瞬态/账号数据抖动,**待下轮复测确认稳定**(不排除上轮账号角色查询偶发)。
+- **P0 健康方案鉴权(B-61)**:TC-HP-U01/02/03 匿名 POST `/api/health/plan/{adjust,attribution,generate}` 仍返回 200,**连续第 3 轮未修复**。
+- **langgraph**:43 收集/26 过/17 红,与 R77/R78 完全一致(无改善、无劣化)。B-58 的 8 个 WIP 文件已入库(`git status` 该路径已干净),但**入库 conftest.py 并不含 R76 工作区版本的 `collect_ignore`/`llm_live` 重构**(`git log -- cfc-langgraph/tests/conftest.py` 最近触达为版本号/ai-q/restore 提交)→ 主干 17 红仍真实存在,B-58 仅「已修未提交」维度收口,「修复内容落地」未实现。
+- **生产 src/main 自 02:21 起变更**:team.*(S-cfc-63/64/65)+ family.invite 前端(S-cfc-66/67 birthday/gender),均随契约单测合入,本机树编译通过。
+
+---
+
+## 七、测试用例编写产出(SRS 闸门)
+
+- **闸门判定**:`git diff 362bf7b1b..origin/cfclub -- docs/tdd/SRS.md "docs/需求分析" docs/superpowers/specs docs/superpowers/api` → **无任何变更**(EXIT 0,空输出)。
+- **结论**:**本次无需求/SRS/接口文档变更,跳过测试用例编写**,零仓库抖动(符合闭环「零抖动」约定)。
+- 注:远端 +4 提交中 `docs/tdd/*` 为研发汇报,不在闸门路径内,不触发编写。
+
+---
+
+## 八、测试案例变更(对照场景)
+
+- **B-62 场景闭环**:家庭加入 join-form birthday/gender 捕获(S-cfc-35/S-cfc-38)——研发已于 04:53/04:56 提交实现(`4f40a8973`/`2c65d98f7`),本轮 frontend Jest 19 套件 343 例(含此前 14 例 RED 契约)全绿 → **14 例 RED 转绿,B-62 闭环**。无需新增/修改用例,仅状态更新。
+
+---
+
+## 九、新增/更新风险
+
+- **🔴 /admin 登录(P2,观察项)**:上轮 U04/U05 退化本轮未复现(5/5),标注「待下轮复测确认稳定」,暂不升级为 P1。
+- **🟡 langgraph 17 红**:B-58 入库后无改善(conftest 未含重构),主干 langgraph 26/43 持续;需研发确认 conftest 意图或本机装 VC++/重建 venv。
+
+---
+
+## 十、覆盖缺口清单
+
+| 缺口 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
+|---|---|---|---|---|---|
+| P0 健康方案鉴权 | `/api/health/plan/**` 未入 LOGIN_REQUIRED_PATHS | 匿名可调用的付费/隐私接口 | 复跑 TC-HP-U01~03,期望 401/403 | P0 | 修 JwtInterceptor 后 E2E 转绿 |
+| langgraph 17 红 | chromadb DLL + LLM 401 + MemoryManager 签名 | 问卷/解析/意图链路不可信 | 本机装 VC++ 运行时/重建 venv + 补 FakeEmbeddings;或 251 恢复 9000 派发 | P1 | 环境修复后 43 例归绿 |
+| 远程派发通道 | 189 prompt 404;204/251 provider 配额限流(1req/3min) | 无法按节点分派浏览器/langgraph | 升级/对齐 opencode 版本 + 恢复模型配额 | P1 | 通道恢复后按 189→admin / 204→frontend / 251→langgraph 分派 |
+| JaCoCo 覆盖率 | 离线缺失 | 覆盖率无量化门槛 | 联网下载插件或改 pom 引 jacoco | P1 | 引入后 `mvn test jacoco:report` |
+| 37 红类/115 红例 | 3 B-13 + 34 漂移 | 已知缺陷长期未闭环 | 逐类派发修复 + 复跑 | P1 | 红例归零 |
+| growth_records 重复列 | 历史未处置 | 数据模型冗余/写入风险 | 架构审查 + 迁移去重 | P1 | 处置后复跑 |
+| 探索性/无障碍/变异/BDD | 无资产 | 非功能覆盖盲区 | 补探索性脚本 + axe 无障碍 + pitest | P2 | 设计态→资产化 |
+
+---
+
+## 十一、五要素问题清单
+
+### 问题 1(P0)— 健康方案接口匿名可调用(B-61,第 3 轮)
+1. **问题描述**:匿名 POST `/api/health/plan/{adjust,attribution,generate}` 返回 200(应 401/403)。
+2. **测试 bug 点**:`tests/e2e-live/health-contract.spec.js:84`(`expect([401,403,404]).toContain(status)`,实际 200);根因 `cfc-backend` `JwtInterceptor.LOGIN_REQUIRED_PATHS`(约 87–127 行)未含 `/api/health/plan/**`。
+3. **最优修改方案**:在 `LOGIN_REQUIRED_PATHS` 追加 `/api/health/plan/**`(与 API_REFERENCE §4.49 口径一致,同族对齐华为/小米健康)。
+4. **修改目的**:闭合鉴权门禁,防止未授权访问健康方案付费/隐私能力。
+5. **问题闭环**:修复后复跑 `playwright.config.health.js` → TC-HP-U01~03 由失败转 401/403 即通过;标准:3 例全绿。
+
+### 问题 2(P1)— langgraph 17 红持续(B-54/B-58-Update 承袭)
+1. **问题描述**:langgraph pytest 43 收集 / 26 过 / 17 红,与 R77/R78 完全一致;B-58 入库后无改善。
+2. **测试 bug 点**:C 类环境 14 例(`chromadb_rust_bindings` DLL 缺失→/chat、/analyze、/auto_tag 500;LLM 凭据无效→test_intent 4 例退化 CHAT;test_report_parse 数据路径)+ A 类夹具 3 例(`tests/test_memory.py:7/14/22` `MemoryManager()` 缺 `embeddings`,`app/memory/store.py:15` 已改必填)。
+3. **最优修改方案**:① 本机装 VC++ 运行时或 `pip install --force-reinstall chromadb`;② 用例补 `FakeEmbeddings`(研发确认 MemoryManager 签名意图后);③ 或恢复 251 节点 langgraph 9000 后按指令派发复跑。
+4. **修改目的**:恢复问卷/解析/意图链路可测性。
+5. **问题闭环**:修复后 43 例全绿或 ≥45 绿(51 口径);标准:红例归零。
+
+### 问题 3(P1)— 远程派发通道受限(B-56 演进)
+1. **问题描述**:按指令应将浏览器任务派 189/204、langgraph 派 251,但三节点探针均无法有效派发。
+2. **测试 bug 点**:`192.168.16.189:4090` `POST /api/session/{id}/prompt` → **404**(API 路径/版本不符);`192.168.16.204:4091` 与 `192.168.16.251:4096` 通道可用(prompt 200,assistant 有响应)但返回 `[RETRY provider.rate-limit You have used up today's text quota...1 request every 3 min]` → 模型今日文本额度用尽。
+3. **最优修改方案**:① 189 节点对齐 opencode API 版本(`/api/session/{id}/prompt` 404 需按实例实际路由适配);② 204/251 恢复模型配额或切换模型/提供方;③ 升级本机 CLI 至与节点同版本。
+4. **修改目的**:恢复「admin→189 / frontend→204 / langgraph→251」节点化分派,满足「每节点仅一浏览器任务」。
+5. **问题闭环**:三节点派发任务能回传真实 playwright/pytest 结果 JSON;标准:任一节点分派成功且产出非空。
+
+---
+
+## 十二、待核实项
+
+- /admin 登录(上轮退化)是否稳定恢复:待下轮复测确认(本轮 5/5)。
+- 后端全量 `mvn test` 真实红例/红类数(本轮仅 test-compile,复用 R77 基线 95.07%,标未实测)。
+- cfc-langgraph 远程派发(251 可达但 9000 服务 closed + 配额限流;本机 .venv 兜底)。
+- B-34/B-35 LangGraph 问卷降级复验(需 AI 9000,超内网授权)。
+- 探索性/无障碍/BDD/变异测试资产缺失(无材料,标待核实,不臆造)。
+
+---
+
+## 十三、需用户单独授权才能继续的项(未授权未执行 + 测试设计)
+
+| 项 | 为何未执行 | 测试设计(降级产出) |
+|---|---|---|
+| 依赖漏洞扫描 | 需公网(maven/github 元数据) | 离线可用 `mvn dependency-check:check`(需先联网拉规则库一次);或人工核对 `pom.xml` 依赖版本 |
+| 性能压测 | 需公网 + 打目标环境 | k6/JMeter 脚本针对 `/api/product/list`、`/api/health/plan/*`;授权后仅打内网 192.168.16.251 |
+| DAST(OWASP ZAP) | 需公网下载 | 对 `/admin`、`/frontend` 做被动/主动扫描;授权后仅内网 |
+| JaCoCo 覆盖率 | 需联网下载插件 | 引入 jacoco 插件后 `mvn test jacoco:report` |
+| LangGraph 复验(B-34/B-35) | 需 AI 9000(超内网授权) | 启动 9000 最小服务后复跑问卷降级用例 |
+| 全量 `mvn test` 重跑 | 被 S-cfc-* 预期 RED 污染 + 时长 | 已用 test-compile 验证编译;建议环境就绪后整轮实跑固化新基线 |
+
+---
+
+## 十四、门禁结论
+
+**⛔ 不通过(有条件)**
+
+**依据**:P0 健康方案鉴权缺口(B-61)连续第 3 轮未修;langgraph 17 红持续(B-58 入库未改善);远程派发通道受限(189 404 / 204·251 配额限流);JaCoCo 覆盖率不可量化(N/A);历史 35 红类/115 红例未闭环;growth_records 重复列未处置。本轮改善显著:**/admin 5/5 恢复、B-62(14 RED)闭环、B-53/B-58 WIP 收口、Jest 双绿连绿、浏览器 15/15 全绿(除 health 3 例 B-61)**、后端编译通过——但门禁硬条件未满足。
+
+**复评条件(全部满足方可转「通过」)**:
+1. 修 P0:将 `/api/health/plan/**` 纳入 `JwtInterceptor.LOGIN_REQUIRED_PATHS` → 复跑 `playwright.config.health.js` 全绿(TC-HP-U01~03 转 401/403)。
+2. langgraph 43 例红例归零(环境 + MemoryManager 夹具),或恢复 251 派发复跑。
+3. 引入 JaCoCo,后端行覆盖率 ≥ 80%。
+4. 37/35 红类归零(含 S-cfc-31 blank-key 真缺陷修复)。
+5. 处置 growth_records 重复列。
+6. 恢复节点派发通道(189/204/251),浏览器/langgraph 按节点分派。
+7. 用户单独授权:依赖漏洞/压测/DAST 公网项;B-34/B-35 经 AI 9000 复验。
+
+**本轮产物**:本报告 `docs/tdd/test/automation-run-2026-11-08-0630.md`(随 `docs/tdd/test/` 推送);上轮未推送报告 `docs/tdd/test/automation-run-2026-11-08-0550.md`(本次一并入库推送)。

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

@@ -70,3 +70,8 @@
 | B-60 | `ActivityControllerTest` 单类 16 例耗时 412.4s,占后端全量时长 16% | 研发 | **P2 测试隔离/时效缺陷(第 77 轮实测新发现)**。本轮后端全量 `Total time: 48:18 min`,surefire XML 累计 **2568s(42.8 min)**,其中 `com.etotem.cfc.controller.ActivityControllerTest` **412.4s / 16 例**(均值 25.8s/例)、`GuideModuleIntegrationTest` 236.5s / 4 例、`PlannerBindInviteFlowTest` 169.9s / 9 例、`AIChatControllerTest` 125.4s / 17 例、`ArticleCategoryControllerTest` 85.5s / 3 例。对照组:同为 controller 包的多数类在 0.0x~1s 量级。推断:测试内存在真实外部调用(微信/AI 网关/HTTP)或反复重建 Spring 上下文与数据库迁移(`DatabaseInitializer` 每个上下文重跑一次迁移)。影响:全量反馈周期被 5 个类拉到 40 min 以上,属 CI 门禁落地的直接障碍;也让每轮巡检的时间成本翻倍。建议:① 用 `@MockBean`/WireMock 截断真实网络;② 慢类合并上下文(`@DirtiesContext` 只在必要时用);③ 为单类设 120s 警戒阈值,超阈即视为缺陷。闭环:全量 `mvn test` ≤25 min 且无单类 >120s | 测试负责人(第 77 轮实测登记) | 2026-11-08 02:16 | 待处理 |
 | B-61 | `JwtInterceptor.LOGIN_REQUIRED_PATHS` 缺 `/api/health/plan/**`,健康方案 3 端点匿名 200 直通业务层 | 研发 | **P0 安全/契约缺口(第 78 轮实测,连续 2 轮复现)**。`POST /api/health/plan/{adjust,attribution,generate}` 未携带 Authorization 均返回 **HTTP 200**(attribution/generate 业务码 4001 付费墙、adjust 500 NPE),未按 API_REFERENCE §4.49.1/§4.49.2(标注「登录用户 JWT」)拦截为 401/403。对照 `POST /api/huawei-health/auth-url` 无鉴权正确返回 401。根因:`JwtInterceptor.LOGIN_REQUIRED_PATHS`(`JwtInterceptor.java:87–127`)为 opt-in 清单,已含 `/api/huawei-health/`、`/api/xiaomi-health/`,但健康方案族 `HealthPlanController.java:33/:63/:100` 三个端点(adjust/attribution/generate)**既不在 LOGIN_REQUIRED_PATHS 也不在 PUBLIC_PATHS** → 匿名请求被放行到 controller,与 SEC-20261031-01 注释(:96–108)明确反对的「匿名 userId=-1 放行走业务 500 而非安全 401」口径漂移属同族遗漏。影响:匿名用户可触发健康方案归因/生成/调整业务链路(消耗 AI 配额、可能越权读取/生成家庭私有健康方案)。测试证据:`tests/e2e-live/health-contract.spec.js` TC-HP-U01/02/03(上轮新增,本轮复测 3 例仍失败)。修复建议:`LOGIN_REQUIRED_PATHS` 增加 `"/api/health/plan/"`(与健康报告/华为/小米同族),统一「默认拒绝 + 显式放行」。闭环:TC-HP-U01/02/03 由失败转 pass(返回 401)+ 后端补带/不带 token 双向 MockMvc 用例 | 测试负责人(第 78 轮实测登记) | 2026-11-08 02:47 | 待处理(P0,连续 2 轮) |
 | B-62 | cfc-frontend 2 个 RED 契约套件进入执行范围,14 例待实现(S-cfc-35/S-cfc-38 birthday/gender 捕获) | 研发 | **P1 契约待实现(第 79 轮实测,2026-11-08 03:23)**。本轮 jest 执行范围由 17 套件/319 扩至 19 套件/343(`jest.config.js` mtime 03:15,`testMatch: ['**/__tests__/**/*.test.js', ...]`),使 2 个既有 RED 契约套件纳入统计:`__tests__/family-join/join-form.required-info.test.js`(12 败)+ `__tests__/pages/family-members.joinRequestCardInfo.test.js`(2 败)。两文件已在 R78 树内(提交 076cfa879 / c5e065dda,属 S-cfc-35/S-cfc-38 RED 契约),此前 R78 报告未纳入。**性质 = 预期 RED(功能未实现),非既有用例回归**:生产 `cfc-frontend/pages/invite/join-form.vue` 实际仅渲染「真实姓名/昵称」,缺出生日期/性别字段与校验,故断言 birthday/gender 必填、prefill、提交拦截、picker 映射、审批卡片三项信息均失败。**无通过用例转红**(328 通过含 R78 全部通过用例 + 净新增通过用例)。通知研发:家庭加入 birthday/gender 捕获实现(S-cfc-35/S-cfc-38 待 YELLOW)落地后复测 14 例转绿;此前 R78「frontend 全绿」口径未覆盖该 2 套件,本轮为覆盖可见性修正。闭环:研发实现 join-form birthday/gender 捕获 → 14 例 RED 转绿 + 状态机 S-cfc-35/S-cfc-38 置 YELLOW | 测试负责人(第 79 轮实测登记) | 2026-11-08 03:23 | 待处理(P1,预期 RED,待实现) |
+| B-53-Update(第 81 轮闭环确认) | B-53 13 个测试文件已全部入库,WIP 清零 | 研发 | **闭环确认(第 81 轮,2026-11-08 06:25)**。`git status --porcelain` 中 11 个 `M` controller 测试文件与 2 个 `??` 新测试文件(FamilyEarningsAdminRoleGateTest / SurveyHealthReviewContractTest)均无未提交改动;`git ls-files cfc-backend/src/test/java/com/etotem/cfc/integration/controller/` 命中 13 相关文件 → 全部入库并随 cfclub 推送。闭环判据(clean 树复跑 ≥96.83% 且红例 ≤73)仍待全量 `mvn test` 实跑复核(本轮仅 test-compile)。**B-53 主体关闭**,量化复验列入下轮后端全量计划 | 测试负责人(第 81 轮确认) | 2026-11-08 06:25 | **已解除(WIP 已收口;<96.83% 全量复验待环境放行)** |
+| B-58-Update(第 81 轮收口确认) | 8 个 langgraph 文件已入库,但修复内容未落地,主干 17 红仍在 | 研发/测试 | **部分闭环(第 81 轮,2026-11-08 06:22)**。`git status cfc-langgraph/tests/` 已干净、8 文件全部 tracked(B-58「已修未提交」维度收口)。但:① `tests/conftest.py` 入库版本**不含** R76 工作区版本的 `collect_ignore=["qna"]`/`llm_live` marker/`StubLLM` 重构(`git log -- cfc-langgraph/tests/conftest.py` 最近触达为版本号/ai-q/restore 提交)→ 无 `--ignore=tests/qna` 时 `tests/qna/test_graph.py` 仍在收集期中断整个套件;② 本轮 `pytest tests --ignore=tests/qna -p no:cacheprovider` 实测 **43 收集 / 26 过 / 17 红**,与 R77/R78 完全一致(无改善无劣化)。结论:B-58 账本收口,但 R76 描述的「修复内容」从未正式入库;17 红按 B-54 环境路线(VC++ 运行时/rebuilt venv + FakeEmbeddings + LLM 凭据)持续处置 | 测试负责人(第 81 轮确认) | 2026-11-08 06:22 | 部分解除(入库收口);17 红归 B-54 持续处置 |
+| B-56-Update(第 81 轮探针新证据) | 三节点派发通道再探针:189 prompt 404;204/251 配额限流 | 测试/运维 | **第 81 轮(2026-11-08 06:12~06:18)三节点实测**。探活:`192.168.16.189:4090`→200、`192.168.16.204:4091`→200、`192.168.16.251:4096`→200(均 Basic 认证通过,会话创建 200)。派发探针(SIMPLE 提示「请只回复 OK」):① **189** `POST /api/session/{id}/prompt` → **404**(API 路径/版本不符,零产出);② **204** prompt 200、assistant 有响应但 `[RETRY provider.rate-limit You have used up today's text quota...1 request every 3 min]` → 模型今日文本额度用尽;③ **251** 同 204,命中配额限流;且 251 上 langgraph 9000 服务 CLOSED。结论:远程派发仍不可用(B-56 由「零产出」演进为「189 路由 404 + 204/251 配额限流」两条),浏览器任务按既定兜底策略本机串行实跑(admin 5/5、frontend 6/6、shop 4/4、health 10/13)。闭环调整:① 运维恢复 204/251 opencode 模型配额(或切模型/提供方);② 研发/运维对齐 189 opencode API 版本路由;③ 251 放通 9000 | 测试负责人(第 81 轮实测登记) | 2026-11-08 06:18 | 待处理 |
+| B-61-Update(第 81 轮复现) | P0 健康方案鉴权缺口连续第 3 轮复现 | 研发 | **连续第 3 轮复现(2026-11-08 06:26)**。本轮 `playwright.config.health.js` 契约实测:TC-H-U01~U10 **10/10 全绿**(华/小米健康鉴权稳定拦截),但 TC-HP-U01/02/03(`/api/health/plan/{adjust,attribution,generate}` 匿名 POST)仍返回 **HTTP 200** 直通(应 401/403/404)。`JwtInterceptor.LOGIN_REQUIRED_PATHS` 修复未随任何部署轮次生效。与 B-61 主登记同因:opt-in 清单漏配 `/api/health/plan/`。闭环判据不变:修复+部署后 TC-HP-U01~03 转 401 即通过 | 测试负责人(第 81 轮复现登记) | 2026-11-08 06:26 | 待处理(P0,连续第 3 轮) |
+| B-62-Update(第 81 轮闭环确认) | S-cfc-35/S-cfc-38 birthday/gender 捕获 14 例 RED 全部转绿 | 研发(已实现) | **闭环确认(第 81 轮,2026-11-08 06:20)**。研发 04:53/04:56 提交实现(`4f40a8973` S-cfc-67 审批卡片出生日期/性别 + `2c65d98f7` S-cfc-66 加入申请表单必填项)后,本轮 frontend Jest **19 套件 / 343 例 / 342 通过 + 1 skip / 0 失败**:`join-form.required-info.test.js`(12 例)与 `family-members.joinRequestCardInfo.test.js`(2 例)**14 RED 全部转绿**,B-62 场景闭环。无通过用例转红(R79 基线 328 通过含净新增)。后续哨兵:frontend Jest 每轮 343 例全绿即维持闭环保守 | 测试负责人(第 81 轮确认) | 2026-11-08 06:28 | **已解除(14 RED 转绿,frontend 连绿)** |