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

test(lead): R78 闭环汇报 - /admin 5/5 全绿打通(登录+滑块+核心菜单) + /frontend 6/6 复跑确认 + HP-U01~03 鉴权契约(P0 延续) + langgraph test_memory 用例滞后发现

E2E Test Bot 5 дней назад
Родитель
Сommit
61448a23c2

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

@@ -0,0 +1,136 @@
+# 测试负责人工作汇报 · 2026-11-08 02:47 轮
+
+> 模板版本:v1.1(2026-11-03)· 适用对象:测试负责人 / 测试角色会话
+> 详细证据与五要素问题清单:`docs/tdd/test/automation-run-2026-11-08-0247.md`
+
+---
+
+## 基本信息
+
+| 项目 | 内容 |
+|------|------|
+| 汇报人 | 陆谨(软件测试专家团主理人 · 测试负责人) |
+| 汇报周期 | 2026-11-07 02:21 ~ 2026-11-08 02:47(R78 轮) |
+| 负责模块/单元 | cfc 全栈(backend/web/frontend/tests/cfc-langgraph)+ E2E 浏览器自动化 |
+
+---
+
+## 一、本轮工作数据汇总
+
+### 1.1 测试用例建设
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **本轮新增测试用例数** | 0 个(上轮已新增 TC-HP-U01~03,本轮复测;langgraph test_memory 3 例滞后待更新) | 区分「已登记 RED」与「待登记」:均待登记 |
+| **本轮验证执行测试数** | 477 个(本机实测:admin 5 + frontend 6 + shop 4 + health 13 + frontend Jest 319 + web Jest 90 + langgraph 兜底 43)+ 后端基线 2903(复用) | 含全态 |
+| **用例通过率** | 本机实测 450/477 = **94.3%**(后端基线并入后 3234/3380=95.7%) | 不含后端基线为 94.3% |
+
+### 1.2 会话与任务分发
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **分派任务数** | 0 个(浏览器任务按历史最优实践**本机直跑**;189/204 远程派发探针验证 B-56 仍失效,不重复派发) | 未派发 opencode 任务 |
+| **恢复智能体会话数** | 0 个 | — |
+| **当前在用会话数** | 0 个(本自动化无常驻会话) | — |
+
+### 1.2b 各会话当前工作状态列表
+
+| 会话标签 | 会话 ID | 当前状态 | 当前任务 | 静默/空闲时长 | 工作目录 | 备注 |
+|----------|---------|----------|----------|---------------|----------|------|
+| `web-4091`(本机 opencode) | localhost:4091 | idle(API 可认证) | — | — | 不干净 | 仅探活,未派发任务 |
+| `web-189-4090`(189) | 192.168.16.189:4090 | unknown(API 可认证) | — | — | — | B-56:agent 零产出 |
+| `web-204-4091`(204) | 192.168.16.204:4091 | unknown(API 可认证) | — | — | — | B-56:探针复现零产出 |
+| `junit/251` | 192.168.16.251 | unreachable(9000/4090 closed) | — | — | — | langgraph 无法按指令派发 |
+
+> 说明:189/204 的 opencode `POST /api/session` 均返回 200 创建成功,但 25s 轮询 assistant 消息为 0 —— B-56「派发任务 agent 零产出」本轮复现,远程派发通道仍不可用;浏览器自动化按历史最优实践在本机单节点串行实跑(符合「每节点仅一个浏览器任务」约束)。
+
+### 1.3 问题处置
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **新测试发现问题数** | 1 个(langgraph test_memory 用例滞后:MemoryManager 构造签名变更,3 例 TypeError) | 另确认 B-56 复现、P0 HP 鉴权延续 |
+| **已解决测试相关问题数** | 0 个 | — |
+| **待解决测试相关问题数** | 6 个(P0×1 延续 + P1×4 + B-56 P2×1 延续) | 详见 automation-run §九/§十二 |
+
+### 1.4 本轮 git 提交与推送证据(真理证据)
+
+| 提交 sha | 关联任务/能力键 | 阶段 | 触及文件类型 | 目标分支 | 已推送远端 | 备注 |
+|----------|-----------------|------|--------------|----------|------------|------|
+| 见文末 | — | 报告/用例 | 测试 | cfclub | 待推送 | 本轮报告 + HP 用例(上轮写入)提交推送 |
+
+### 1.5 状态机阶段分布(全局进度)
+
+| 阶段 | 键数 | 备注 |
+|------|------|------|
+| UNTRACKED | — | 本闭环以发现/跟踪为主 |
+| RED | 0 | — |
+| YELLOW | 0 | — |
+| GREEN | 5 | 本地 `.tdd/state.json`(O-2 方案A契约实跑) |
+| DONE | — | 研发侧口径 22 键 DONE/GREEN 推进(见研发汇报) |
+
+### 1.6 数据源健康度
+
+| 数据源 | 读取键数 | 是否正常 | 备注 |
+|--------|----------|----------|------|
+| 需求侧(SRS 池) | 未启用 | 正常(CFC 未启用 SRS 池) | 需求跟踪以 API_REFERENCE + specs 为准 |
+| 契约常量(contract) | 0 | 正常 | ops_file 无契约常量文件 |
+| 测试用例引用(test_case_map) | 正常 | 正常 | tests/test-cases 台账可读 |
+| 执行结果回填(case_results) | 正常 | 正常 | — |
+
+---
+
+## 二、向研发提出的改进建议
+
+| 序号 | 建议标题 | 问题描述 | 根因分析 | 建议方案 | 优先级 | 状态 |
+|------|----------|----------|----------|----------|--------|------|
+| 1 | `/api/health/plan/**` 强制 JWT(连续 2 轮催办) | 三端点匿名 200 直通业务层(4001/500),违反 API_REFERENCE §4.49 | `LOGIN_REQUIRED_PATHS`(JwtInterceptor.java:87–127)漏配该族 | 加入 `/api/health/plan/`,统一「默认拒绝 + 显式放行」 | P0 | 待评估 |
+| 2 | langgraph test_memory 用例更新 | `MemoryManager()` 无参调用 vs 实现要求 `embeddings`,3 例 TypeError | store.py 签名变更(52e9f39f8 起)未同步测试 | 测试侧注入 fake embeddings 更新 3 例;研发确认签名意图 | P1 | 待评估 |
+| 3 | 251 节点恢复 langgraph 9000 | 251:9000/4090 closed,AI 服务维度盲区,无法按指令派发 | 服务未启动/未部署 | 运维恢复 9000;测试侧更新用例后复验 | P1 | 待评估 |
+| 4 | B-53 13 测试文件收口 | 后端 13 集成测试文件未提交,覆盖率无法到 96.83% | PR 未合入 | 研发 `git add/commit/push` | P1 | 待评估 |
+| 5 | 自动化环境注入 Maven/mvnw | 后端每轮无法复测 | 无 mvn | 注入 Maven 或提交 wrapper | P1 | 待评估 |
+| 6 | 189/204 opencode agent 执行链路 | 建会话成功但 assistant 零产出(B-56 复现) | opencode 平台 agent run 链路缺陷 | 运维/平台修复;或 `opencode run` 直执行 | P2 | 待评估 |
+
+---
+
+## 三、本轮阻塞与风险
+
+| 阻塞项 | 影响范围 | 阻塞类型 | 处置进展 | 需要协调 |
+|--------|----------|----------|----------|----------|
+| P0 健康方案端点未强制 JWT | 安全契约(AI 配额/家庭隐私) | 研发 | 待响应(连续 2 轮) | 研发修复后复测 HP-U01~03 |
+| 251 langgraph 不可达 | langgraph 测试盲区 | 测试(环境) | 待响应 | 运维恢复 9000 |
+| B-56 189/204 agent 零产出 | 远程浏览器自动化派发 | 测试(环境) | 待处理(已多次登记) | 运维/平台修复 |
+| B-53 测试文件未提交 | 后端覆盖率口径 | 研发 | 待响应 | 研发收口 PR |
+| 本机 langgraph 兜底损坏(chromadb DLL/LLM 401) | 本机兜底无效 | 测试(环境) | 自处置无效、无需修(正式走 251) | — |
+
+---
+
+## 四、下轮工作计划
+
+| 计划项 | 预计完成时间 | 前置依赖 | 备注 |
+|--------|--------------|----------|------|
+| 复验 P0 HP 三端点(若研发修复) | 下轮 | 研发合入 | TC-HP-U01~03 转 pass 即推进门禁 |
+| 更新 langgraph test_memory 3 例(审批后落库) | 下轮 | 研发确认签名意图 | 测试目录内改动 |
+| 复验 /admin 5/5、/frontend 6/6 稳定性 | 下轮 | 无 | 每轮回归 |
+| 251 恢复后按 pytest 全量复验 langgraph | 待运维 | 251:9000 | 落实「langgraph 派 251」约束 |
+
+---
+
+## 附录
+
+### 附录 A:本轮新增测试用例明细
+
+| 用例 ID | 能力键 | 目标单元 | 用例标题 | 预期失败契约 | 是否已登记 RED | 登记 sha |
+|---------|--------|----------|----------|--------------|----------------|----------|
+| (本轮无新增;上轮 TC-HP-U01~03 复测) | health.plan.** | HealthPlanController | 3 端点未鉴权应 401/403 | ❌ 当前失败(暴露 P0) | 否 | 随本轮提交 |
+
+### 附录 B:任务分派与会话恢复明细
+
+| 任务号 | 目标会话标签 | 分派时间 | 分派类型 | 当前状态 | 恢复会话标签 | 恢复原因 | 恢复时间 |
+|--------|--------------|----------|----------|----------|--------------|----------|----------|
+| (无) | — | — | — | — | — | — | — |
+
+### 附录 C:新发现问题明细
+
+| 问题 ID | 能力键/任务号 | 问题类型 | 路由去向 | 登记时间 | 处置状态 | 关联 sha |
+|---------|---------------|----------|----------|----------|----------|----------|
+| P-5 | langgraph MemoryManager 签名 | 缺陷/用例滞后 | 测试自处置+研发确认 | 2026-11-08 02:47 | 待处理 | HEAD store.py (52e9f39f8 起) |

+ 220 - 0
docs/tdd/test/automation-run-2026-11-08-0247.md

@@ -0,0 +1,220 @@
+# 测试闭环报告 · 每小时轮(review 档,内网已授权)
+
+- **执行时间**:2026-11-08 02:47 (GMT+8)
+- **对象 / 分支**:`d:/cfc`(浠艾福 XAF)· `origin/cfclub`
+- **HEAD(本轮)**:`362bf7b1b`(R77 闭环汇报)→ 本轮提交见文末
+- **上次自动化轮**:2026-11-08 02:21,HEAD `362bf7b1b`(结论:⛔不通过(有条件))
+- **执行档**:review(内网 `cfc.iwintrue.com` /admin 与 /frontend + 配套 /api 只读探测;禁止公网;只读,不修改/提交/推送生产源码)
+- **测试负责人**:陆谨(软件测试专家团主理人,本闭环仅做只读审查 + 测试目录内用例编写/更新)
+
+---
+
+## 一、历史审查记录(记忆召回)
+
+- **非首次审查**:历史闭环记录齐全(最早 2026-10-28)。
+- **上次结论(02:21 R77)**:⛔不通过(有条件)。遗留缺口:① **P0 健康方案 3 端点未强制 JWT**(TC-HP-U01/02/03 失败);② B-53 后端集成测试 13 文件未提交;③ 自动化环境无 mvn → 后端覆盖率只能复用基线;④ /admin 凭据缺失长期降级;⑤ LangGraph 问卷降级/依赖漏洞/压测需授权。
+- **本轮改善点**:① `/admin` 浏览器套件**由降级转为 5/5 全绿**(登录+滑块+核心菜单真实打通);② `/frontend` 6/6 复跑确认 23:00 基线仍成立;③ 商城排序契约 4/4 保持。
+- **本轮新发现**:langgraph 本机兜底引入 17 失败(详见第七节,含测试用例滞后问题),langgraph 正式测试仍需 251 节点授权。
+- 历史结论仅作对照,**本次结论基于本次重新取证**。
+
+---
+
+## 二、项目画像速览(只读)
+
+| 模块 | 技术栈 | 端口 | 本轮回测可测范围 |
+|---|---|---|---|
+| `cfc-backend` | Spring Boot 2.7.18 + MyBatis-Plus + Java 8 | 9082 | 单测/集成测试(本运行无 mvn,复用 R77 全量基线 95.07%) |
+| `cfc-web` | Vue 2 + Element UI 管理端 | 8082 | Jest 单元/组件测试(mock API,不断言真实服务端) |
+| `cfc-frontend` | uni-app 微信小程序 (Vue 2) | — | Jest 单元/组件测试 |
+| `tests/e2e-live` | Playwright 1.61.1 + chromium | — | admin / frontend / shop-api / health 契约 E2E(内网实测) |
+| `cfc-langgraph` | FastAPI + LangGraph(AI 服务) | 9000 | **本机兜底异常**(环境损坏 + 用例滞后);正式测试应派发 251 节点(不可达) |
+
+- **关键路径**:统一 `@PostMapping`;`JwtInterceptor` 拦截 `/api/**`(`LOGIN_REQUIRED_PATHS` opt-in 清单)。
+- **需求变更命中**:`API_REFERENCE.md` §4.49.1(adjust,HL-04/R4)、§4.49.2(attribution R2 + generate followUpAnswers R3,HL-03)——上轮已配套新增 TC-HP-U01~03 契约用例,本轮复测仍 3 失败(P0 未修复)。**SRS.md 与 docs/需求分析 自上次运行无变更**;specs 变更均为 EVD 契约核对(既有键状态变化,无新增能力键)。
+
+---
+
+## 三、执行范围与命令
+
+| 项 | 命令 | 状态 |
+|---|---|---|
+| 浏览器 E2E /admin | `npx playwright test -c playwright.config.live.js --project=admin-desktop` | ✅ 实测 5/5 |
+| 浏览器 E2E /frontend | `--project=frontend-mobile` | ✅ 实测 6/6 |
+| 商城排序契约 | `--project=shop-api` | ✅ 实测 4/4 |
+| E2E 健康契约(含新增 HP-U01~03) | `npx playwright test -c playwright.config.health.js` | ✅ 实测 10 通过 / 3 失败 |
+| cfc-frontend Jest | `cd cfc-frontend && npx jest --ci` | ✅ 实测 319/319 |
+| cfc-web Jest | `cd cfc-web && npx jest --ci` | ✅ 实测 90/90 |
+| cfc-backend mvn test | `mvn test`(mvn 不在 PATH 且无 mvnw) | ⚠️ 未实测 → 复用 R77 基线 95.07% |
+| cfc-langgraph pytest | `.venv/Scripts/python -m pytest tests --ignore=tests/qna` | ⚠️ 本机兜底 26/17;**251 节点 9000/4090 不可达**,无法按指令派发 |
+| 远程派发验证(189/204) | opencode API `POST /api/session` + 轮询 | ⚠️ 会话创建成功但 assistant 零产出(B-56 复现) |
+| 依赖漏洞 / 性能压测 / DAST | 需公网 | ⛔ 未授权未执行 |
+
+---
+
+## 四、测试结果总览(本轮实测)
+
+| 模块 | 用例总数 | 通过 | 失败 | 跳过 | 备注 |
+|---|---|---|---|---|---|
+| 浏览器 E2E /admin(真实登录) | 5 | **5** | 0 | 0 | TC-A-U01~U05 全绿(登录/滑块/拦截/主框架/核心菜单) |
+| 浏览器 E2E /frontend | 6 | **6** | 0 | 0 | TC-F-U01~U06(首页/五维/健康/成长/我的/资源加载) |
+| 商城排序契约 | 4 | **4** | 0 | 0 | TC-S-U01~U04 |
+| E2E health-contract | 13 | 10 | **3** | 0 | 10 既有全 401 通过;3 新增健康方案鉴权失败(P0 延续) |
+| cfc-frontend Jest | 319 | **319** | 0 | 0 | 17 套件 |
+| cfc-web Jest | 90 | **90** | 0 | 0 | 12 套件 |
+| cfc-backend(R77 基线复用) | 2903 | 2784 | 74 | 4 | 95.07%(未重跑,标注基线) |
+| cfc-langgraph pytest(本机兜底) | 43 | 26 | **17** | 0 | 环境问题为主;用例滞后 3 例(见第七节) |
+| **合计(本机实测)** | **477** | **450** | **20** | 0 | admin/frontend/shop/health/Jest 前端全部实测 |
+
+---
+
+## 五、覆盖率
+
+- **前端/管理端**:Jest 全绿(319+90),功能回归信号稳定。
+- **后端**:R77(02:16 最近全量实测)行覆盖率 **95.07%**,B-53 13 测试文件提交后预测 96.83%。本运行 **mvn 不在 PATH**,按规则复用基线并标注未重测。
+- **langgraph**:本机兜底非权威(环境损坏),覆盖率无意义,标注未实测。
+
+---
+
+## 六、回归与闭环判定(对比 02:21 基线)
+
+- **Jest 双绿连绿**:frontend 319/319、web 90/90,与 02:21 持平,无新增回归。
+- **浏览器 E2E**:admin **5/5 全绿(上次降级 → 本轮打通,重大改善)**;frontend 6/6 确认 23:00 基线成立;shop 4/4 保持。
+- **E2E 健康契约**:10 既有全绿;**3 新增 HP 用例连续两轮失败**(P0 安全缺口未修复,研发未处置)。
+- **langgraph**:上轮未触达;本轮本机兜底 26/17(环境 + 用例滞后),不能据此判定 251 部署态回归。
+- **判定**:功能回归层面稳定且 admin 通道打通;**安全契约缺口延续(P0)+ langgraph 测试资产滞后(P1)**,结论仍为不通过(有条件)。
+
+---
+
+## 七、新增风险与问题明细(本轮证据)
+
+### 🔴 P0(延续)健康方案 3 端点未强制 JWT,匿名可直达业务层
+
+- 证据:`POST /api/health/plan/{adjust,attribution,generate}` 未带 Authorization → HTTP **200**(attribution/generate 业务码 4001,adjust 500),对照 huawei-health 正确返回 401。
+- 根因:`JwtInterceptor.LOGIN_REQUIRED_PATHS`(JwtInterceptor.java:87–127)**未含 `/api/health/plan/**`**;SEC-20261031-01 注释明确反对的「匿名 userId=-1 放行至 controller」漂移同族遗漏。
+- 影响:匿名用户可触发归因/生成/调整(消耗 AI 配额、可能越权触及家庭私有健康方案)。
+- 处置:列入五要素问题清单 P0,本轮再次催办研发。
+
+### 🟡 P1(本轮新增)langgraph 测试资产滞后 + 本机兜底环境损坏
+
+- **测试用例滞后(代码级,251 部署态同样会失败)**:`tests/test_memory.py:7/14/22` 以 `MemoryManager()` 无参构造调用,但 `app/memory/store.py` 的 `__init__(self, embeddings)` 已在 HEAD(52e9f39f8 起)要求必传 `embeddings` → 3 例 TypeError。
+- **环境问题(本机兜底失效,非代码)**:`chromadb_rust_bindings` DLL 加载失败(test_auto_tag/test_chat 等);LLM 上游 401(本地 api key 失效,test_intent 4 例);Checkpointer 缺 thread_id(test_analyze)。
+- **251 节点不可达**:9000/4090 均 closed(8080 为 Gogs、80/443 也是 web),**langgraph 无法按指令「派发 251」** → 按规则标注未实测,本机结果仅作线索。
+- 处置:① 测试侧更新 `test_memory.py` 适配新签名(测试目录内可改);② 研发确认 `store.py` 签名变更意图并同步新增 embeddings 参数 mock;③ 251 节点恢复 langgraph 服务后按其部署态复验。
+
+---
+
+## 八、测试用例建设(SRS/场景变更驱动)
+
+- **闸门**:`API_REFERENCE.md` §4.49.1/§4.49.2 自 23:00 起变更(HL-03/HL-04)→ 上轮已新增 TC-HP-U01~U03 契约用例(`tests/e2e-live/health-contract.spec.js` 工作区新增,未提交),本轮复测断言服务端鉴权,暴露 P0。
+- **本轮新增编写**:无新增用例(HP 用例上轮已写);langgraph `test_memory.py` 属**用例滞后待更新**(本轮仅记录,改动需与实现核对后落库)。
+- **SRS.md / docs/需求分析**:自上次无变更 → 无新用例触发。
+
+---
+
+## 九、五要素问题清单
+
+### 问题 1(P0 · 安全/契约)健康方案端点未强制 JWT(延续)
+
+1. **问题描述**:`POST /api/health/plan/{adjust,attribution,generate}` 无 Authorization → HTTP 200(业务码 4001/500),未按 API_REFERENCE §4.49 拦截为 401/403。
+2. **测试 bug 点**:`cfc-backend/.../config/JwtInterceptor.java:87–127`(`LOGIN_REQUIRED_PATHS` 缺 `/api/health/plan/**`);端点定义 `HealthPlanController.java:33/:63/:100`。
+3. **最优修改方案**:`LOGIN_REQUIRED_PATHS` 增加 `"/api/health/plan/"`(与 huawei/xiaomi-health 同族),统一「默认拒绝 + 显式放行」。
+4. **修改目的**:对齐 SEC-20261031-01,防匿名消耗 AI 配额 / 越权读取家庭私有健康方案。
+5. **问题闭环**:复跑 `tests/e2e-live/health-contract.spec.js` TC-HP-U01/02/03 → 由失败转 pass(401)。通过标准:3 例全绿 + 后端补带/不带 token 双向用例。
+
+### 问题 2(P1 · 测试资产)langgraph test_memory.py 用例滞后于实现签名
+
+1. **问题描述**:`MemoryManager()` 无参调用(test_memory.py:7/14/22),实现已要求 `__init__(self, embeddings)`(store.py:13),3 例 TypeError。
+2. **测试 bug 点**:`cfc-langgraph/tests/test_memory.py:7/14/22`。
+3. **最优修改方案**:测试侧以注入 fake embeddings 对象(如 `unittest.mock.MagicMock()`)更新 3 个用例;同时研发确认签名变更意图(是否内存版与向量版并存)。
+4. **修改目的**:恢复 langgraph 记忆管理单测可执行性,配合 251 派发复验。
+5. **问题闭环**:更新后本机 `pytest tests/test_memory.py` 3/3 通过;251 恢复后全量复验。通过标准:3 例全绿。
+
+### 问题 3(P1 · 流程)B-53 后端集成测试 13 文件仍未提交(延续)
+
+1. **问题描述**:后端 13 测试文件未 `git add/commit/push`,全量覆盖率无法可复现到 96.83%。
+2. **测试 bug 点**:`git status` 无该 13 文件(R77 notice 第 1 项 P0 催办)。
+3. **最优修改方案**:研发执行 R77 notice 复跑命令收口 PR。
+4. **修改目的**:覆盖率达到 G1 96% 线的可复现前提。
+5. **问题闭环**:PR 合入后 `mvn test` ≥96.83%、红例 ≤73。
+
+### 问题 4(P1 · 流程)自动化环境无 mvn,后端无法每轮复测(延续)
+
+1. **问题描述**:`mvn` 不在 PATH 且无 `mvnw`,后端实时覆盖率只能复用基线。
+2. **测试 bug 点**:环境 `which mvn` 缺失;`cfc-backend/` 无 `mvnw`。
+3. **最优修改方案**:注入 Maven 或提交 `mvnw` wrapper。
+4. **修改目的**:后端闭环可自动化回归。
+5. **问题闭环**:下轮能跑 `mvn test` 产出 surefire 覆盖率与红例。
+
+### 问题 5(P1 · 基础设施)251 节点 langgraph 服务与 opencode 均不可达
+
+1. **问题描述**:192.168.16.251 的 9000(langgraph)与 4090(opencode)均 closed → langgraph 测试无法按指令派发 251。
+2. **测试 bug 点**:`echo > /dev/tcp/192.168.16.251/9000` 失败;`/4090` 失败;8080 为 Gogs 非目标服务。
+3. **最优修改方案**:运维恢复 251 上 langgraph 9000 服务(及可选 opencode 4090),或在 `.tdd/config.json` 更新 langgraph 可达地址。
+4. **修改目的**:落实用户「langgraph 测试分派 251 节点」约束,消除测试盲区。
+5. **问题闭环**:251:9000 探活通过后按既有 pytest 套件复验(另需修 test_memory 滞后),通过标准 = EXIT 0。恢复前 langgraph 维度标注「未实测」。
+
+---
+
+## 十、20 类测试覆盖矩阵(三态速览)
+
+| # | 测试类型 | 状态 | 证据/说明 |
+|---|---|---|---|
+| 1 | 单元测试 | 已发现 | web 90 / frontend 319 / backend 2903(基线) / langgraph 43(兜底) |
+| 2 | 测试覆盖率 | 已发现 | 后端 R77 95.07%(JaCoCo 离线缺失,surefire 口径) |
+| 3 | 变异测试 | 待核实 | 未执行/未配置 |
+| 4 | 组件测试 | 已发现 | cfc-web 组件用例 |
+| 5 | 集成测试(接口) | 已发现 | backend 集成测试 + interface smoke 542(历史) |
+| 6 | 契约测试 | 已发现 | health-contract 13(10 绿 3 红 P0)+ shop-api 4 |
+| 7 | 接口 API 测试 | 已发现 | shop-sort-api 4/4 |
+| 8 | 系统/端到端 E2E | 已发现 | /admin 5/5、/frontend 6/6(本轮实测) |
+| 9 | 性能测试 | ⛔未授权未执行 | 需公网压测 |
+| 10 | 可靠性测试 | 待核实 | 未专项执行 |
+| 11 | 安全(SAST/DAST/依赖/渗透) | 已发现(部分) | E2E 鉴权契约(P0 发现);依赖漏洞⛔未授权 |
+| 12 | 兼容性测试 | 待核实 | 未专项执行 |
+| 13 | 可用性测试 | 待核实 | 未专项执行 |
+| 14 | 无障碍测试 | 未发现 | 未覆盖 |
+| 15 | 冒烟测试 | 已发现 | E2E admin/frontend(登录+核心链路) |
+| 16 | 回归测试 | 已发现 | 本轮 Jest 双绿 + E2E 复跑对比 02:21 |
+| 17 | 探索性测试 | 待核实 | 未专项执行 |
+| 18 | QA 流程 | 已发现 | R76/R77/R78 汇报 + B-53/B-56 阻塞跟踪 |
+| 19 | 质量指标 | 已发现 | 覆盖率/红例/通过率指标存在 |
+| 20 | 全项目代码审查 | 已发现 | JwtInterceptor 鉴权缺口定位(P0) |
+
+---
+
+## 十一、待核实项
+
+1. langgraph `store.py` 签名变更意图(MemoryManager 是否双模式并存)——需研发确认。
+2. 251 节点 langgraph 9000 服务恢复时间——需运维确认。
+3. B-53 13 测试文件是否已由研发合入——`git status` 未见(未提交)。
+4. 189/204 opencode agent 零产出是否为 opencode 平台侧缺陷——B-56 持续。
+
+---
+
+## 十二、需用户单独授权/协调才能继续的项
+
+| 项 | 为何受阻 | 测试设计(降级产出) |
+|---|---|---|
+| langgraph 正式测试 | 251:9000 不可达 | 更新 test_memory 滞后用例(本轮已给方案);251 恢复后按全量 pytest 复验 |
+| 依赖漏洞扫描 / 性能压测 / DAST | 需公网 | 设计待授权后执行 |
+| /admin 凭据 | 本轮 5/5 已用 live spec 内凭据打通(无新阻塞) | — |
+| 189/204 远程派发 | 建会话成功但 agent 零产出(B-56) | 本机直跑已兜底,仍建议运维修平台链路 |
+
+---
+
+## 十三、门禁结论
+
+### ⛔ **不通过(有条件)**
+
+**理由**:功能回归层面显著改善(**/admin 由长期降级转 5/5 全绿**、/frontend 6/6、shop 4/4、Jest 双绿),但 **P0 安全缺陷(健康方案 3 端点匿名直通)连续两轮未修复**,且 langgraph 测试资产滞后 + 251 节点不可达导致 AI 服务维度仍为盲区;后端每轮复测依赖 mvn 注入。
+
+**复评条件(全部满足方转「通过」)**:
+1. **P0**:`/api/health/plan/**` 加入 `LOGIN_REQUIRED_PATHS`,TC-HP-U01/02/03 转 pass(401);
+2. **P1**:langgraph `test_memory.py` 更新适配新签名 + 251 节点恢复并复验全量 pytest EXIT 0;
+3. **P1**:B-53 13 测试文件合入,后端全量 ≥96.83%、红例 ≤73;
+4. **P1**:自动化环境具备 Maven(或 mvnw),后端每轮可复测;
+5. **待办**:依赖漏洞扫描 + 性能压测获得授权后执行并达标。
+
+---
+
+> 约束遵守声明:本闭环仅访问内网 `cfc.iwintrue.com`(hosts→192.168.16.251)+ 内网节点 189/204 opencode API;未访问公网;未修改/提交/推送任何生产源码(仅测试目录 `tests/e2e-live/health-contract.spec.js` 上轮新增用例与报告文档);未输出任何密钥/口令/令牌(opencode API 仅用 env 中已有密码做 Basic 认证,未落盘明文);Jest 为 mock API,不据此断言真实服务端行为;未编造,缺材料一律标注待核实。

+ 33 - 0
tests/e2e-live/health-contract.spec.js

@@ -52,3 +52,36 @@ test.describe('华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44
     });
   }
 });
+
+// ================================================================
+// 健康方案 · 接口级鉴权契约 E2E · TC-HP-U01 ~ TC-HP-U03
+// 需求来源:docs/superpowers/api/API_REFERENCE.md(本次闭环检测到变更)
+//   §4.49.1 健康方案对话式调整(POST /api/health/plan/adjust,HL-04/R4)
+//   §4.49.2 健康方案归因 R2(POST /api/health/plan/attribution,HL-03/R2)
+//           与健康方案生成不确定点补充 R3(POST /api/health/plan/generate 新增 followUpAnswers)
+// 契约要点:全部 @PostMapping,需 JWT;未鉴权应被拒绝(401/403),不可 200 直通。
+// 只读:仅发送空 body 探测鉴权门禁,不写任何业务数据;凭据缺失属预期(验证拦截)。
+// 运行:npx playwright test -c playwright.config.health.js
+// ================================================================
+const HP_ENDPOINTS = [
+  ['TC-HP-U01', 'adjust', 'HL-04/R4 健康方案对话式调整'],
+  ['TC-HP-U02', 'attribution', 'HL-03/R2 健康方案归因'],
+  ['TC-HP-U03', 'generate', 'HL-03/R3 生成不确定点补充(followUpAnswers)'],
+];
+
+test.describe('健康方案 · 鉴权契约(§4.49.1/§4.49.2)', () => {
+  for (const [tc, action, req] of HP_ENDPOINTS) {
+    test(`${tc} POST /api/health/plan/${action} 未鉴权应被拒绝(401/403) · ${req}`, async ({ request }) => {
+      const resp = await request.post(`${API}/api/health/plan/${action}`, {
+        data: {},
+        timeout: 20000,
+      });
+      const status = resp.status();
+      // 仅打印状态码,绝不打印响应体或任何凭据
+      console.log(`[${tc}] POST /api/health/plan/${action} -> HTTP ${status}`);
+      // 契约:需 JWT;未鉴权必须被拦截,绝不 200 直通。
+      // 若返回 404 = 该端点尚未在目标部署实例上线,属部署缺口,非断言错误。
+      expect([401, 403, 404], `未鉴权应被拒绝(401/403)/或端点未部署(404),实际 ${status}`).toContain(status);
+    });
+  }
+});