Browse Source

docs(tdd): R98 测试负责人执行汇报 — B-61 闭环、契约 7 类转绿、签名 v2 实现验证通过(11/11)、B-88 虚假声称登记

- 后端契约定向复跑:15 类/122 例 81 过 41 红(NoPathMap/KbVersionSense/StrainBlock/ShellGuard/PageTailClean/GateLowSideRedline/KbFieldExpose 7 类全绿)
- 浏览器 live 15/15 + health 13/13 全绿零 skip;B-61(/api/health/plan 匿名越权)闭环 P0 解除
- langgraph 251 实派:43/32/11 全环境性(B-65 x2 + B-74 x5 + B-82 x4),兜底拉取会话结果
- 签名 v2(feature/signature-canvas2d@c0db9643c)契约复验 11/11 全绿,实现待合入 cfclub
- B-88 登记:研发声称 14f238ac6「12/12 绿」不在 HEAD 链且源码无实现(虚假声称,同 P27/P67 族)
- 前端 jest 49 红预期 RED 零漂移;cfc-web 116/116;根级 23/7/16
E2E Test Bot 3 days ago
parent
commit
ffbd1b5fde

+ 106 - 0
docs/tdd/orchestration/report-test-2026-11-09-0820.md

@@ -0,0 +1,106 @@
+# 测试负责人汇报 · R98(2026-11-09 08:20,本自动化闭环)
+
+> 执行明细与证据见同目录台账;本文件随 `docs/tdd/test/automation-run-2026-11-09-R98.md`、`blockers.md` 一并 push 至 `origin/cfclub` 作为研发通知载体(Agent Mail 仍未开通,无企微通道)。
+> 基线:`cfclub` @ 跑测起点 `2b58da609`;跑测中工作区曾被外部切至 `feature/signature-canvas2d@c0db9643c`(B-28 事件,签名 v2 实现验证在此完成),终点 `cfclub@ef401f717`(新增 5 提交,docs/chore/test(S-cfc-116),无后端生产源码改动→后端结论对两 SHA 均有效;前端结论以 2b58da609 为权威基线)。
+
+---
+
+## 一、执行总览(R98 vs R97)
+
+| 维度 | R98 结果 | R97 基线 | 变化 |
+|---|---|---|---|
+| **后端契约测试** | **15 类 / 122 例 / 81 过 / 41 红**(0 错 0 skip),28 顺延(5 提交零源码改动) | 143 红(94 预期 RED + 37 A 类 + 12 B 类),契约 13 类 85 例 | **★ 7 契约类转绿**(NoPathMap 10/10、KbVersionSense 11/11、StrainBlock 6/6、ShellGuard 7/7、PageTailClean 6/6、GateLowSideRedline 12/12、KbFieldExpose 6/6) |
+| cfc-frontend jest | **423 / 371 / 49 / 3 skip** | 423 / 371 / 49 / 3 | **零漂移**(49 红全为预期 RED) |
+| cfc-web jest | **116 / 116 / 0** | 116 / 116 | 零漂移 |
+| tests/ 根级 jest | **23 / 7 / 16** | 23 / 7 / 16 | 零漂移(B-36 环境依赖) |
+| **langgraph @251 实派 pytest** | **43 / 32 / 11 / 0 skip** | 43 / 33 / 10 | fail +1(auto_tag 5 vs 4,B-74 装置/LLM 401),仍全环境性 |
+| 浏览器 live(admin+frontend+shop) | **15 / 15 全绿 · 0 skip** | 15/15 | 持平 |
+| 浏览器 health-contract | **13 / 13 全绿** | 13/13 | 持平 |
+| 浏览器 dx-health-bridge | 2 skipped(404 允许) | 2 skipped | 持平 |
+| **★ B-61 闭环** | `/api/health/plan/generate/adjust/attribution` 匿名**均 401** | 连续多轮 200(P0 鉴权回归) | **★ P0 解除** |
+| **★ 签名 v2 实现验证** | feature 分支复验 **11/11 全绿** | 9 RED / 2 GREEN(cfclub) | 实现满足契约,待合入 cfclub |
+
+---
+
+## 二、后端契约 41 红例归因(本轮定向复跑口径)
+
+| 层 | 例数 | 类数 | 代表证据 | 性质 |
+|---|---|---|---|---|
+| 预期 RED(TDD 契约待实现) | 41 | 8 | `GuheLowSideRuleLoadContractTest` 7/10、`GuheV2RouteContractTest` 5/8、`GuheKbQueryLowSidePatchContractTest` 4/8(S-cfc-94)、`GuheReportPersonalAssertContractTest` 4/9(S-cfc-93)、`GuheLowSideAggregateContractTest` 4/6、`GuheVersionSplitContractTest` 3/5、`GuheLowSideNoSupplementContractTest` 3/6 | 研发 TDD 红态,**非回归** |
+| **虚假声称(新增登记 B-88)** | 11 | 1 | `GuheEvidenceIsolateContractTest` 11/12:研发提交 `14f238ac6` 声称「G-3 evidenceIsolate 12/12 绿」,但 `git merge-base --is-ancestor 14f238ac6 HEAD` = false(**不在 HEAD 链**),源码 grep `tagEvidence/canEnterRecommendationBasis` = 0 命中 → **自证与事实不符**(与历史 P27/P67 同族) | **process 缺陷,需研发复核** |
+
+> 口径说明:本轮仅定向复跑 `Guhe*ContractTest` 15 类(R97 全量 2802 例基线仍有效——终点 HEAD 相对跑测 HEAD 仅 5 个 docs/chore/test 提交,无后端生产源码改动)。A 类 37 + B 类 12 沿用 R97 归因(B-87/B-69 等)。
+
+---
+
+## 三、本轮三项重点结论
+
+### 3.1 **B-61 闭环(P0 鉴权回归转绿)**
+`/api/health/plan/generate`、`/api/health/plan/adjust`、`/api/health/plan/attribution` 匿名访问**本轮实测全部 401**。此前连续多轮(R9x)返回 200,属计划服务匿名越权 P0;本轮转绿=鉴权回归已修复,P0 解除。对应 `health-contract` 13/13 维持全绿。
+
+### 3.2 **EvidenceIsolate 虚假声称登记(B-88)**
+契约测试 `GuheEvidenceIsolateContractTest` 红 11/12,与研发声称(`14f238ac6`「G-3 evidenceIsolate 12/12 绿」)不符。核查:**该提交不在当前 HEAD 链上**(merge-base 校验 false),且 cfclub 源码不含 `tagEvidence`/`canEnterRecommendationBasis` 方法——**实现未合入,声称无事实支撑**(与 P27/P67 相似)。已登记 blocker 并随本报告催办。
+
+### 3.3 **签名 v2 实现验证通过(feature 分支)**
+研发推送 `feature/signature-canvas2d@c0db9643c` 实现(竖屏直签 + canvas 2d),测试侧用 cfclub 修正版契约(`7d7c0b23a`:01c 仅匹配调用形式 + 03b 双断言)定向复验 **11/11 全绿**(TC-SIG2D-01~08)。cfclub HEAD(`ef401f717`)仅合入 `test(S-cfc-116)` 契约测试补全,**实现待合入**——合入后前端 49 红中的 canvas2d 9 例即转绿。
+
+---
+
+## 四、SRS → 用例更新闭环(本轮无新增需求侧变更)
+
+见执行记录 §五:窗口内 5 份 SRS 均有对应用例资产,签名 v2 由「RED 待实现」升级为「**实现已验证、待合入**」;无需新增用例。**前提条件满足**(SRS 变更时更新用例的闭环已保持)。
+
+## 五、覆盖度量
+
+沿 R97 统一口径:场景 SC 245(55.9% 被测试资产引用);TC 台账 824 条(异常流 496 = 60.2%);**可执行锚点 95/824 = 11.5%**(排除 generated 生成物,B-86 规则)。本轮无新度量变化。
+
+---
+
+## 六、五要素问题清单(P-1 ~ P-7)
+
+### P-1(P0)langgraph `/api/v1/analyze` checkpointer 缺 thread_id(B-65,连续第 7 轮)
+1. **问题描述**:251 pytest 2 例 500(`Checkpointer requires ... thread_id`);同机 live 因依赖版本低侥幸 200(B-85)。
+2. **测试 bug 点**:`cfc-langgraph/tests/test_analyze.py::test_analyze_endpoint`、`::test_analyze_missing_report`;生产帧 `app/graphs/analysis_graph.py:96 MemorySaver()`、`app/api/analyze.py:35 ainvoke`(无 config)。
+3. **最优修改方案**:删除 `MemorySaver()` 或 `ainvoke` 传 `config={"configurable":{"thread_id": f"analysis-{report_id}-{user_id}"}}`。
+4. **闭环方式**:251 重派 `pytest tests/test_analyze.py -q` 2 例 200 + live 连跑 3 次 200。
+
+### P-2(P1)B-69:4 个 `/api/mind/**` 位于公开白名单(连续第 6 轮)
+1. **问题描述**:匿名可进业务层(R97 实测 `traditional/mirror` 200 空数据)。
+2. **测试 bug 点**:`MindFortuneControllerTest.testGetTodayFortuneWithoutAuth`(401 vs 400);`JwtInterceptor.java:79-82` PUBLIC_PATHS。
+3. **最优修改方案**:4 条移入 `LOGIN_REQUIRED_PATHS`。
+4. **闭环方式**:测试转绿 + 线上 4 端点匿名 curl 全 401。
+
+### P-3(P1)A 类测试装置 37 例(B-87,测试侧下轮自处置)
+沿用 R97 归因:`CfCommissionServiceSettleTest` 8、`ArticleAutoTagServiceTest` 4、`DimensionScoreServiceImplTest` 4、`ArticleWorkflowTest` 3、`doNothing()` 误用 2 等。测试侧定向复跑转绿后,后端红例将收敛至「预期 RED + B 类」。
+
+### P-4(P1)B 类产品缺陷 12 例(沿用 R97)
+`EnergySystemFlowTest` 6×500、`PlannerBindInviteFlowTest` 4×403、`GuideModuleIntegrationTest` platform_fee 截断、Mind 401/400。
+
+### P-5(P1)langgraph 套件非终止(B-84)
+`tests/test_chat.py` 真实 LLM 无超时,整套件无法收敛;251 会话首派卡滞同源。闭环:加 `pytest-timeout` 或 LLM 桩。
+
+### P-6(P1)EvidenceIsolate 虚假声称(B-88 新增)
+见 §三.3.2。研发需**复核事实链**:实现提交是否合入 cfclub?若已合入请给出正确 SHA;否则按 RED 契约继续实现。
+
+### P-7(P1)预期 RED 契约 41 例 + 前端 49 例
+前端 49 = uiRework 25 + canvas2d 9 + healthAdjustUi 8 + participantSelect 8(预期 RED,零漂移);后端契约 41 例,其中签名 v2 实现已验证待合入(合入后 -9),healthAdjust/queryLowSidePatch/aggregate 等随 S-cfc-93/94/96/97 实现收口。
+
+---
+
+## 七、门禁结论
+
+**不通过**(G1/G2/G7 未达标),但本轮为**结构性改善轮**:B-61(P0 鉴权回归)闭环、后端契约 7 类转绿、签名 v2 实现验证通过(仅差合入)、浏览器 28/28 连续第 2 轮零 skip。
+
+| 门禁 | 阈值 | 实测 | 结论 |
+|---|---|---|---|
+| G1 全量用例通过率 | ≥96% | 后端契约 66.4% / 前端 87.7% / 管理端 100% / langgraph 74.4% / 浏览器 100% | ❌ |
+| G2 红例数 | 0 | **117**(41+49+16+11) | ❌ |
+| G3 管理端全绿 | 100% | 116/116 | ✅ |
+| G4 后端可构建 | 0 编译错 | testCompile 342 源 0 错 | ✅ |
+| G5 结果完整性 | 无静默丢失 | 契约 15/15 XML;251 会话兜底取回 | ✅ |
+| G6 浏览器套件 | 28/28 | **28/28(零 skip,连续第 2 轮)** | ✅ |
+| G7 langgraph 零失败 | 0 红 | 11 红(全环境/装置性) | ❌ |
+| G8 鉴权契约 | 13/13 | 13/13 | ✅ |
+
+**下一步(测试侧)**:①B-87 A 类 37 例定向修复;②`tests/test_chat.py` 加超时(B-84);③签名 v2 合入 cfclub 后前端 9 例定向复跑确认转绿。
+**催办(研发侧)**:B-65(连续第 7 轮)、B-69(连续第 6 轮)、B-88 虚假声称复核、预期 RED 契约 41 例收口。

+ 155 - 0
docs/tdd/test/automation-run-2026-11-09-R98.md

@@ -0,0 +1,155 @@
+# 全栈测试执行记录 · R98(2026-11-09 07:50 起跑)
+
+> 自动化闭环第 98 轮。执行档:**review(离线)**——未联网装依赖、未启停任何服务、未修改生产代码;仅修改/新增测试侧装置(`tests/e2e-live/`、`.tdd/dispatch_251_langgraph_r98b.py`)。
+> 汇报正文:`docs/tdd/orchestration/report-test-2026-11-09-0820.md`;台账:`docs/tdd/test/blockers.md`。
+
+---
+
+## 一、历史审查记录
+
+| 项 | 内容 |
+|---|---|
+| 上次审查 | R97(2026-11-09 06:10),结论**不通过** |
+| R97 遗留 | 后端 2802/143 红(94 预期 RED + 37 A 类 + 12 B 类)、前端 49 红(预期 RED)、langgraph 251 43/33/10、浏览器 15/15+13/13、B-61/B-65/B-69/B-84/B-86/B-87 等 |
+| 本次改善 | ①**B-61 闭环**(P0 鉴权回归转绿);②**契约大幅转绿**(7 类全绿:NoPathMap/KbVersionSense/StrainBlock/ShellGuard/PageTailClean/GateLowSideRedline/KbFieldExpose);③**签名 v2 实现验证通过**(feature 分支 11/11 全绿复验);④**EvidenceIsolate 虚假声称登记**(B-88) |
+| 历史教训应用 | B-28(分支切换带走工作区)→ 跑前/跑后双查 branch+HEAD(本轮**捕获运行中分支被外部切换**:cfclub@2b58da609 → feature/signature-canvas2d@c0db9643c → 回 cfclub@ef401f717);B-86(生成物污染口径)→ 锚点统计排除 generated;B-67(假红三证)→ 契约红例定向复跑复核 |
+
+---
+
+## 二、项目画像
+
+| 维度 | 内容 |
+|---|---|
+| 业务定位 | 家庭教育成长平台「浠艾福(XAF / CFC)」:家长端/规划师端/孩子端小程序 + 管理后台 + 商城 + AI 服务 |
+| 技术栈 | `cfc-backend` Spring Boot 2.7.18 + MyBatis-Plus + Java 8;`cfc-frontend` uni-app(Vue2);`cfc-web` Vue2+Element UI;`cfc-langgraph` FastAPI+LangGraph+ChromaDB;`dan/danshop` 独立商城 |
+| 模块规模 | 后端 2110 生产源 / 249 控制器 / 333 测试类;前端 26 测试套件;管理端 17 套件;langgraph 43 用例 |
+| 关键路径 | 微信登录 → 家庭/成员 → 五维能量 → 健康报告上传解析 → 测评订单 → 成长任务 → 商城 → AI 管家 |
+| 测试现状 | 后端单测/集成较厚(2802 例);前端用例集中在 diet/signature 改版;E2E 仅 live 28 例;无覆盖率/变异/压测/SAST/无障碍资产 |
+| 质量目标 | 用户口径:**全部用例通过 + 覆盖全部 SRS 与用户场景(含异常流)** |
+| 主要风险 | ①TDD 契约红态堆积(前端 49 + 后端契约 41)导致通过率长期 <96%;②A 类装置红 37 例污染门禁信号;③SRS→可执行锚点仅 11.5%;④langgraph 251 会话卡滞(B-84/B-85 同族) |
+
+---
+
+## 三、执行基线(B-28 纪律:跑前/跑后双查 branch+HEAD)
+
+| 时间点 | 分支 | HEAD | 说明 |
+|---|---|---|---|
+| 跑测起点 | `cfclub` | `2b58da609` | 浏览器/契约/前端 jest 均在此基线完成 |
+| 运行中(外部切换) | `feature/signature-canvas2d` | `c0db9643c` | **研发并行推送签名 v2 实现**,工作区被切走(00:11~00:14 窗口) |
+| 复验签名 v2 | `feature/signature-canvas2d` | `c0db9643c` | 契约 11/11 全绿(详见 §5.6) |
+| 跑测终点 | `cfclub` | `ef401f717` | 研发已合入 `test(S-cfc-116)` 契约测试补全 + docs/chore |
+
+> ⚠️ **B-28 事件**:本轮捕获到「测试执行期间工作区分支被外部切换」(cfclub → feature/signature-canvas2d → cfclub)。已按 B-28 纪律登记;**所有关键结论均落在 `cfclub@2b58da609` 跑测基线**,切换窗口内完成的只有 cfc-web jest(116/116,不受签名分支影响),其余结果不受污染。
+
+---
+
+## 四、执行结果明细
+
+### 4.1 后端契约测试(JDK1.8.0_25 + IDEA Maven 3.9.9,`mvn -o -B test -Dtest=Guhe*ContractTest` 定向复跑,surefire XML 聚合)
+
+```
+契约 15 类 / 122 例 / 81 过 / 41 红(0 错 / 0 skip)
+testCompile: 342 测试源文件 BUILD SUCCESS(消除 R8~R11「无 Maven」误判)
+```
+
+**转绿 7 类(全绿)**:`GuheNoPathMapContractTest` 10/10、`GuheKbVersionSenseContractTest` 11/11、`GuheGateStrainBlockContractTest` 6/6、`GuheShellGuardContractTest` 7/7、`GuhePageTailCleanContractTest` 6/6、`GuheGateLowSideRedlineContractTest` 12/12、`GuheKbFieldExposeContractTest` 6/6。
+
+**仍红 8 类(41 例)**:
+
+| 契约类 | 红/总 | 归因 |
+|---|---|---|
+| `GuheEvidenceIsolateContractTest` | 11/12 | **B-88**:研发声称 14f238ac6「12/12 绿」但**不在 HEAD 链**、源码 grep `tagEvidence/canEnterRecommendationBasis` = 0 命中 → **虚假声称**(类似 P27/P67) |
+| `GuheLowSideRuleLoadContractTest` | 7/10 | 预期 RED(T3/L4-1/L4-2 待实现收尾) |
+| `GuheV2RouteContractTest` | 5/8 | 预期 RED |
+| `GuheReportPersonalAssertContractTest` | 4/9 | 预期 RED(S-cfc-93 个人层双断言,B-83 同族) |
+| `GuheKbQueryLowSidePatchContractTest` | 4/8 | 预期 RED(S-cfc-94 低侧判读补丁块查询) |
+| `GuheLowSideAggregateContractTest` | 4/6 | 预期 RED |
+| `GuheVersionSplitContractTest` | 3/5 | 预期 RED |
+| `GuheLowSideNoSupplementContractTest` | 3/6 | 预期 RED |
+
+### 4.2 浏览器自动化(本机单节点串行,`workers=1`,基线 cfclub@2b58da609)
+
+| 套件 | 结果 | 备注 |
+|---|---|---|
+| live(admin 5 + frontend 6 + shop 4) | **15/15,0 skip** | 与 R97 持平 |
+| health-contract | **13/13** | 持平 |
+| dx-health-bridge | **2 skipped** | 端点 404(允许范围,B-79 已处置) |
+
+**★ B-61 闭环**:`/api/health/plan/generate`、`/api/health/plan/adjust`、`/api/health/plan/attribution` 匿名访问**均 401**(此前连续多轮 200,属 P0 鉴权回归)→ 已转绿,P0 解除。
+
+### 4.3 前端 jest(双套件 + 根级)
+
+| 套件 | 结果 | 红例构成 |
+|---|---|---|
+| `cfc-frontend` | 26 套件 / 423 例 / **49 红** / 3 skip | 预期 RED(uiRework 25 + canvas2d 9 + healthAdjustUi 8 + participantSelect 8)——与 R97 **零漂移** |
+| `cfc-web` | 17 套件 / **116 全绿** | — |
+| `tests/` 根级 | 3 套件 / 23 例 / **16 红** / 7 过 | B-36 黑盒环境依赖(与 R97 **零漂移**) |
+
+### 4.4 langgraph 251 派发(权威口径)
+
+```
+251 仓库: /sc-data/cfc/cfc-langgraph(会话 ses_e426b4328ffeMQ7vpfcN3UsCu4,TC-4a3af2-251-langgraph-pytest-r98)
+命令: timeout 700 .venv/bin/python -m pytest tests --ignore=tests/qna --ignore=tests/test_chat.py -q
+结果: 43 collected / 32 passed / 11 failed / 0 skipped
+```
+
+**11 红全部环境/装置性,无产品逻辑缺陷**:
+
+| 红例分组 | 例数 | 归因 |
+|---|---|---|
+| `test_analyze.py` | 2 | **B-65**:`Checkpointer requires ... thread_id`(源码级,连续第 7 轮) |
+| `test_auto_tag.py` | 5 | **B-74** 装置:`chat 端点返回 500(LLM API Key 401 认证失败)`(R97 为 4 例,本轮 5 例——含 `valid_format` 复现) |
+| `test_intent.py` | 4 | **B-82** 环境:意图分类降级默认 CHAT(LLM key 401,251 凭据对分类不稳定) |
+
+> 251 侧会话行为异常:首派脚本轮询 780s 卡在「远程有更新,同步到最新」未取到 JSON;**但会话实际已产出完整结果**(直接拉取 `/message` 获得 43/32/11)。已备 `dispatch_251_langgraph_r98b.py`(git 同步加硬超时 + 会话兜底核查)。
+
+### 4.5 签名 v2 实现验证(本轮新增复验,基线 feature/signature-canvas2d@c0db9643c)
+
+研发推送 `feature/signature-canvas2d` 分支实现 `c0db9643c`(`feat(DOC-2026-11-09-signature-canvas2d-rewrite)`:手签名改为竖屏直签 + canvas 2d)。测试侧提取 cfclub 修正版契约(`7d7c0b23a`:01c 仅匹配调用形式 + 03b 双断言)在实现分支下定向复跑:
+
+```
+Test Suites: 1 passed, 1 total
+Tests:       11 passed, 11 total   (TC-SIG2D-01~08 全绿)
+```
+
+→ **B-81 签名 v2 契约验证通过**:实现满足全部 11 项契约断言。但 cfclub HEAD `ef401f717` **尚未合入该实现**(仅合入 `test(S-cfc-116)` 契约测试补全)→ cfclub 上 canvas2d 9 例仍为**预期 RED**,待实现合入即转绿。
+
+---
+
+## 五、SRS → 用例更新闭环
+
+窗口内 SRS 变更 5 份全部核对(见 R97 基线 §四),对应测试资产均已入库,本轮**无需新增用例**:
+
+| SRS | 能力键 / 任务 | 对应用例 | 状态 |
+|---|---|---|---|
+| `2026-11-09-diet-recommendation-health-questionnaire-adjust.md` | S-cfc-97 | `recommendation.healthAdjustUi.test.js` 8 RED | 待实现(RED) |
+| `2026-11-09-signature-canvas2d-rewrite.md` | S-cfc-116 / B-81 | `signature.canvas2d.test.js` 11 例 | **实现已验证 11/11 绿(feature 分支),待合入 cfclub** |
+| `2026-11-08-dx-health-bridge.md` | — | `dx-health-bridge-auth.spec.js` 2 skip | 端点 404(允许) |
+| `2026-11-08-diet-recommendation-polish.md` | S-cfc-79 / S-cfc-80 | `recommendation.uiRework` 25 + `participantSelect` 8 RED | 待实现(RED) |
+| `2026-11-08-signature-landscape-fix.md` | B-75 | 已被 v2 整份取代 | 已作废 |
+
+---
+
+## 六、门禁结论
+
+**不通过**(用户双目标未达成),但本轮为**结构性改善轮**:B-61 闭环、契约 7 类转绿、签名 v2 实现验证通过。
+
+| 门禁 | 阈值 | 实测 | 结论 |
+|---|---|---|---|
+| G1 全量用例通过率 | ≥96% | 后端契约 81/122 + 前端 371/423 + 管理端 116/116 + langgraph 32/43 + 浏览器 28/28 | ❌ |
+| G2 红例数 | 0 | 后端契约 41 + 前端 49 + 根级 16 + langgraph 11 | ❌ |
+| G3 管理端全绿 | 100% | 116/116 | ✅ |
+| G4 后端可构建 | 0 编译错 | testCompile 342 源 0 错 | ✅ |
+| G5 结果完整性 | 无静默丢失 | 契约 15/15 XML 完整 | ✅ |
+| G6 浏览器套件 | 28/28 | **28/28(零 skip)** | ✅ |
+| G7 langgraph 零失败 | 0 红 | 11 红(全环境/装置性) | ❌ |
+| G8 鉴权契约 | 13/13 | 13/13 + **B-61 转绿** | ✅ |
+
+## 七、未实测项(如实登记)
+
+1. 后端**全量** JUnit(2802 例)本轮未重跑——契约 15 类定向复跑(R97 全量基线仍有效,本轮变更仅 5 个 docs/version/test 提交,无后端生产源码改动)。
+2. 覆盖率、变异测试、性能压测、SAST、SCA —— 无工具/离线档不允许联网。
+3. `tests/test_chat.py` 1 例 —— 真实 LLM 无超时(B-84,两节点均不收敛)。
+4. UAT、BDD、探索性、无障碍、多浏览器 —— 无资产。
+5. 192.168.16.189 浏览器派发 —— 节点 22/4090 全拒(B-56 延续)。
+6. 后端 A 类 37 例的转绿 —— 测试侧下轮处置(B-87)。

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

@@ -138,3 +138,13 @@
 | B-69-Update(第 97 轮 · 连续第 5 轮 · 证据升级) | 4 个 `/api/mind/**` 位于公开白名单,匿名可达业务层 | 研发 | **连续第 5 轮未修(2026-11-09 05:20)**。源码 `cfc-backend/src/main/java/com/etotem/cfc/config/JwtInterceptor.java:79-82` 把 `/api/mind/alert/active`、`/api/mind/alert/checkin-alerts`、`/api/mind/traditional/mirror`、`/api/mind/traditional/compatibility` **列入 PUBLIC_PATHS(匿名白名单)**,而非 `LOGIN_REQUIRED_PATHS`。线上匿名实测:`POST /api/mind/alert/active` → code 500「参数缺失:memberId」(已进 controller);`POST /api/mind/traditional/mirror` → code 200 data {};对照 `POST /api/health/plan/list` → **401**。后端 `MindFortuneControllerTest.testGetTodayFortuneWithoutAuth` 断言 401 实际 400(`@RequestAttribute` 绑定层先 400,与 B-57 同族)。闭环判据升级:①4 条移入 `LOGIN_REQUIRED_PATHS`;②线上 4 端点匿名 curl 全 401;③`MindFortuneControllerTest` 转绿 | 测试负责人(第 97 轮实测登记) | 2026-11-09 05:20 | 待处理(P1,连续第 5 轮) |
 | B-65-Update(第 97 轮 · 连续第 6 轮 · 定性修正) | langgraph `/api/v1/analyze` 源码级 checkpointer 缺 thread_id | 研发 | **连续第 6 轮未修(2026-11-09 05:15)**。见 B-85:251 pytest 2 例 500 复现 ValueError,而同机 live 200;本机 venv(langgraph 0.6.11)同源码直接 ValueError。源码未变:`cfc-langgraph/app/graphs/analysis_graph.py:96 checkpointer = MemorySaver()`、`app/api/analyze.py:35 await graph.ainvoke({...})`(无 config)。**推翻前几轮「线上 500」的表述**——线上因依赖版本低而侥幸 200,属「未爆的 P0」。闭环:去 MemorySaver 或传 thread_id;部署锁版本;之后 `pytest tests/test_analyze.py` 2 例绿 + live 连跑 3 次 200 | 测试负责人(第 97 轮实测登记) | 2026-11-09 05:15 | 待处理(P0,连续第 6 轮) |
 | B-87(第 97 轮新增 · 测试侧待处置) | 后端 A 类测试装置红例 37 例(桩/夹具/断言过期) | 测试 | **P1 装置缺陷(第 97 轮实测,2026-11-09 05:58)**。后端 143 红例中 37 例失败信息指向测试装置而非产品:`CfCommissionServiceSettleTest` 8(档位/依赖未 stub → Wanted but not invoked)、`ArticleAutoTagServiceTest` 4(verify taskExecutor.execute 与注入/实现不一致)、`DimensionScoreServiceImplTest` 4(No value present)、`ArticleWorkflowTest` 3(源码文案已改「仅已驳回或已撤回」,断言仍旧文案)、`DailyCheckinStreakFlowTest` 1 与 `PlannerBindInviteFlowTest` 1(doNothing 作用于非 void 方法)、`GrowthRecordSyncFlowTest` 3、`DimensionRegistryMapContractTest` 3、`ServiceRoleApproveTest` 2、`Orchestration*` 2、其余 6。影响:门禁信号被装置噪声污染,无法从通过率判断产品健康度。闭环:逐类对齐(文案/桩/断言/注入名),定向 `mvn -Dtest=A,B,C -DfailIfNoTests=false test`(**类分隔必须用逗号**,`+` 会静默 0 执行)→ 37 例转绿且其余类零转红,后端通过率预期 94.75%→约 96.0% | 测试负责人(第 97 轮实测登记) | 2026-11-09 05:58 | 待处理(P1,下轮自处置) |
+
+<!-- ===== 第 98 轮(2026-11-09 08:20)追加 ===== -->
+
+| B-88(第 98 轮新增 · 虚假声称登记) | `GuheEvidenceIsolateContractTest` 11/12 红 vs 研发声称「12/12 绿」(提交 14f238ac6) | 研发 | **P1 事实链不符(第 98 轮核查,2026-11-09 08:10)**。研发声称 `14f238ac6`「G-3 evidenceIsolate 12/12 绿」,核查结论:①`git merge-base --is-ancestor 14f238ac6 HEAD` = **false —— 该提交不在当前 HEAD 链上**;②cfclub 源码 grep `tagEvidence` / `canEnterRecommendationBasis` = **0 命中**(契约方法未实现);③`GuheEvidenceIsolateContractTest` 实测仍 **11/12 红**。判定:**自证与事实不符**(与历史 P27/P67 同族虚假声称),实现未合入。闭环:研发复核——若已实现请给出实际合入 cfclub 的 SHA;若未合入按 RED 契约继续实现(`AttributionComplianceGate#tagEvidence/canEnterRecommendationBasis/isExistenceRecordOnly`),使 12/12 转绿且提交在链 | 测试负责人(第 98 轮核查登记) | 2026-11-09 08:10 | 待处理(P1,事实链复核) |
+| B-61-Close(第 98 轮闭环) | `/api/health/plan/generate/adjust/attribution` 匿名越权(200) | 研发(已修复) | **已解除(第 98 轮,2026-11-09 08:05)**。live 实测:`/api/health/plan/generate`、`/api/health/plan/adjust`、`/api/health/plan/attribution` 匿名访问**全部返回 401**(此前连续多轮 200,P0 鉴权回归)。health-contract 套件 13/13 维持全绿。P0 解除 | 测试负责人(第 98 轮实测闭环) | 2026-11-09 08:05 | **已解除** |
+| B-81-Update(第 98 轮 · 实现验证通过) | 签名 v2 重写(S4-1 竖屏直签 + S4-2 canvas 2d) | 研发(已实现)/ 测试(已验证) | **实现验证通过(第 98 轮,2026-11-09 08:13)**。研发推送 `feature/signature-canvas2d@c0db9643c`(`feat(DOC-2026-11-09-signature-canvas2d-rewrite)`),cfclub 亦合入 `test(S-cfc-116)` 契约测试补全 + 装置修正(`7d7c0b23a`:01c 仅匹配调用形式 + 03b 双断言)。测试侧提取修正版契约在实现分支下定向复跑:**11/11 全绿**(TC-SIG2D-01~08,16.9s)。**注意**:cfclub HEAD `ef401f717` 尚未合入实现(仅测试补全)→ cfclub 上 canvas2d 9 例仍为预期 RED。闭环:实现合入 cfclub → 前端 9 RED 转绿 + `tests/test-cases/signature.md` 置已实现 | 测试负责人(第 98 轮复验登记) | 2026-11-09 08:13 | 待合入 cfclub(实现已验证) |
+| B-65-Update(第 98 轮 · 连续第 7 轮) | langgraph `/api/v1/analyze` checkpointer 缺 thread_id | 研发 | **连续第 7 轮未修(2026-11-09 08:15)**。251 派发 pytest:`test_analyze.py` 2 例 500(`ValueError: Checkpointer requires ... thread_id`)。源码未变:`analysis_graph.py:96 MemorySaver()`、`analyze.py:35 ainvoke` 无 config。B-85 定性保留(live 200 属依赖版本低侥幸)。闭环判据不变 | 测试负责人(第 98 轮复现登记) | 2026-11-09 08:15 | 待处理(P0,连续第 7 轮) |
+| B-69-Update(第 98 轮 · 连续第 6 轮) | 4 个 `/api/mind/**` 位于公开白名单 | 研发 | **连续第 6 轮未修(2026-11-09 08:15)**。本轮未定向复跑 MindFortuneControllerTest(后端仅跑契约 15 类);R97 证据(PUBLIC_PATHS:79-82 + 线上匿名 200)仍有效,无研发修复提交触达(`git log --oneline cfclub -- JwtInterceptor.java` 无新动)。闭环判据不变:4 条移入 LOGIN_REQUIRED_PATHS → 测试转绿 + 线上全 401 | 测试负责人(第 98 轮确认登记) | 2026-11-09 08:15 | 待处理(P1,连续第 6 轮) |
+| B-84-Update(第 98 轮 · 251 会话卡滞同源) | langgraph 套件非终止 / 251 首派会话卡在 git 同步 | 测试/研发 | **第 98 轮(2026-11-09 08:15)**。251 首派会话(`ses_e426b4328ffeMQ7vpfcN3UsCu4`)轮询 780s 卡在「远程有更新,同步到最新」(agent 未完成 git 同步步骤);**兜底**:直接拉取 `/api/session/{id}/message` 取回完整结果 43/32/11。已备 `dispatch_251_langgraph_r98b.py`(git 同步加 `timeout 90` 硬超时 + 失败即用当前 HEAD + 会话兜底核查)。B-84 本体(test_chat.py 无超时)仍待处置 | 测试负责人(第 98 轮登记) | 2026-11-09 08:15 | 待处理(P1) |
+| B-87-Update(第 98 轮 · 顺延) | 后端 A 类测试装置红例 37 例 | 测试 | **顺延(第 98 轮,2026-11-09 08:16)**。本轮后端仅定向跑契约 15 类(R97 全量基线仍有效),A 类 37 例未处置;下轮优先执行定向修复(`mvn -Dtest=逗号分隔`) | 测试负责人(第 98 轮登记) | 2026-11-09 08:16 | 待处理(P1,下轮自处置) |