Просмотр исходного кода

test(lead): R78 登记 B-61 P0 健康方案鉴权缺口 + O-14 langgraph 签名变更协调单

E2E Test Bot 5 дней назад
Родитель
Сommit
021b664739
2 измененных файлов с 2 добавлено и 0 удалено
  1. 1 0
      docs/tdd/orchestration/pending.md
  2. 1 0
      docs/tdd/test/blockers.md

+ 1 - 0
docs/tdd/orchestration/pending.md

@@ -19,3 +19,4 @@
 | O-12 | EVD-10/EVD-11 契约核对缺口处置路径:成长规划师域 G-1/2/3 + 平台运营域 A-04/14/19/20/21 的派发/回收/登记口径 | 研发+测试+主理人 | EVD-10(成长规划师域 32 SC)+ EVD-11(平台运营域 25 SC)契约核对产出已回收 `77026df42`/`9abed8e11`,但缺口键(G-1/2/3、A-04/14/19/20/21)处置路径需与 O-7 契约补建节奏对齐 | **已裁决(研发负责人 错峰03 第47轮,主理人 2026-11-07 1330 轮确认生效)**:EVD-10/EVD-11 缺口键按 O-7 契约补建工作流处置——契约定一批→映射入池→测试侧补证据,渐进而非全量 | 2026-11-07 13:30(研发负责人 错峰03) | **已裁决生效**(主理人最终确认 2026-11-07 13:30 轮,O-12 闭环) |
 | O-13 | B-38④ platform_fee 口径分歧:26 红类归因之一,字段单位/类型裁决 | 研发+测试+主理人 | B-38 全量实测 26 红类/69 红例归因中 platform_fee 相关用例红,根因 = 测试假设口径与实现不一致(字段单位「元 vs 分」、类型 DECIMAL vs 整型、默认值缺省)。诉求:裁决 platform_fee 统一口径供测试侧修订用例、实现侧对齐 | **已裁决生效(主理人 2026-11-07 17:5x 拍板确认)**:platform_fee 统一为**单位「分」+ BIGINT NOT NULL DEFAULT 0**(与平台现有金额字段口径一致,避免浮点精度/单位换算错误;测试侧按此修订用例,实现侧无需改动——当前实现即分单位) | 2026-11-07 16:06(研发负责人 错峰03 意见;17:5x 主理人拍板) | **已裁决生效(O-13 闭环)** |
 | O-14 | D/X 域(华为/小米健康)实现先于设计登记:4344688d2/978d1bc95/4815aae95 已合入 cfclub 但无场景/无测试/未入池 | 研发+测试+主理人 | 14:36 检出 feat(xiaomi-health) X1-X5 + feat(huawei-health) D1-D5 + fix isBound 共 3 提交已合入 origin/cfclub(token 表/授权/同步/5接口/mock 通道),但:无对应用户场景(241 SC 基线无 D/X 域条目)、无测试用例、未入 TDD 池。诉求:裁决处置路径(纳入 241 基线 vs 独立契约核对批次) | **已裁决生效(主理人 2026-11-07 17:5x 拍板确认)**:D/X 域作 **O-7 独立契约核对批次**(同 EVD 节奏:契约核对=文档核对+端点比对,产出契约文档转测试侧补证据),**不纳入 241 基线**(当前 DEV_GOAL=241 SC 无 D/X 域条目,基线不膨胀);实现已合入无需研发重做,仅需设计契约登记 + 测试证据补建 | 2026-11-07 16:06(研发负责人 错峰03 意见;17:5x 主理人拍板) | **已裁决生效(O-14 闭环,D/X 契约核对批次待启动)** |
+| O-14 | langgraph test_memory 构造签名变更(MemoryManager 需 embeddings)是否属预期契约变更 | 测试+研发 | B-54/B-58 关联:`app/memory/store.py:15` 的 `__init__` 现要求必传 `embeddings`,但 `tests/test_memory.py:7/14/22` 3 例仍无参调用 → 主干 clean tree 下 TypeError 红。诉求:研发确认该签名变更是预期契约(内存版记忆已在 main 链路替换为向量版),测试侧据此补 `FakeEmbeddings` 桩更新 3 例并转绿;同时确认 251 节点 langgraph 9000 服务恢复时间(运维侧)以便按指令派发复验 | 测试+研发 | 待裁决(测试侧重写用例需研发确认 mock 接口;251 恢复由运维排期) | 2026-11-08 02:47 | 待处理 |

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

@@ -68,3 +68,4 @@
 | B-53-Update(第 77 轮量化) | B-53 第 4 次量化:13 个测试文件(11 `M` + 2 `??`)入库可 +42 例转绿、+17 例新增 | 研发 | **P0 第 4 次催办,量化口径已固化**。干净基线隔离树 `D:\_wt_r077` @`8e736c3bb` 全量 292 类 / 2416 例 / 2297 过 / 65F+50E+4S = **95.07%**,35 红类 / 115 红例。随后把主工作区 13 个后端测试文件(11 `M` + 2 `??`:`FamilyEarningsAdminRoleGateTest`、`SurveyHealthReviewContractTest`)复制入同一隔离树,定向复跑同 13 类:**170 例 / 48 红 → 187 例 / 6 红**,即 **42 例转绿 + 17 例新增(全绿)**;残余 6 红分布:`GuideFamilyTaskControllerTest` 2F+1E、`GuideRolePermissionTest` 1F+1E、`StatsControllerTest` 1F。全量预测:2356/2433 = **96.83%**,红例 115 → 73,红类 35 → 28。逐类对照:Article 9→0、Auth 4→0、Family 1→0、GuideOrder 8→0、GuideTeam 2→0、Payment 4→0、Product 3→0、ProductOrder 6→0,GuideFamilyTask 5→3、GuideRolePermission 5→2、Stats 1→1。闭环:13 文件入库后全量复跑 ≥96.83% 且红例 ≤73 | 测试负责人(第 77 轮实测量化) | 2026-11-08 02:16 | 待处理(连续 4 轮未收口) |
 | B-59 | `tests/e2e-live/admin-live.spec.js:158` TC-A-U05 用「网址含 /login 就跳过」把前置失败转成不判定 | 测试(下轮自处置) | **P1 用例哨兵失效(第 77 轮实测新发现)**。本轮 admin-desktop 套件结果为 **14 过 / 1 跳过**(R75/R76 为 5/5 全过),被跳过的正是 `TC-A-U05 后台核心菜单可访问`:该用例自己重新走一遍登录流程(填凭据 → 等身份带出 → 拖滑块 → 点击登录 → `waitForTimeout(5000)`),随后执行 `test.skip(page.url().includes('/login'), '登录未通过(见 TC-A-U04),本用例无法在无会话下判定')`。本轮同一次运行里 `TC-A-U04` 真实登录**通过**并落到 `/admin/dashboard`(菜单 102),但 U05 自身的第二次登录在 5s 等待窗内未完成跳转 → 命中跳过分支。影响:① 跳过不计红,套件看起来「绿」,实际菜单遍历验收缺口;② 与 B-48/B-57 同族——把不确定态转成不判定,哨兵永久失效;③ 5s 固定等待属时序脆弱点(并发跑后端全量时机器负载高,登录链路变慢)。建议修复(任选其一,均 ≤5 行):① 把 `test.skip(...)` 改为 `expect(page.url()).not.toContain('/login')`,让前置失败直接红;② 让 U05 复用 U04 的 `storageState`(`playwright.config` 开启 `storageState` 复用),彻底避免二次登录;③ `waitForTimeout(5000)` 换成 `page.waitForURL(/\/admin\/dashboard/, { timeout: 20000 })`。闭环:admin 套件连续 2 轮 5/5 全过且无 skip | 测试负责人(第 77 轮实测登记) | 2026-11-08 02:16 | 待处理(下轮自处置) |
 | 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 轮) |