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

docs(tdd): 测试负责人第188轮闭环汇报 2026-11-13 0848(★后端首次恢复全量:43:15 跑完 369 类/3111 例/3082 过/25 红/4 跳=99.07%,证伪 B-184-1「>2h」判据并新增 B-188-1 判据修正;★langgraph@251 实派 51/51 全绿(R187 承袭 45/51,B-142-2 观察 1/2);★frontend-mobile 6/6×2(B-185 消除);S-cfc-178 契约 4F→0 转绿;浏览器 28 过+2 跳(admin 双节点 5/5)、两套 Jest 零漂移、线上 API 25过/7跳/0红、根级 7/16(B-36第72轮);全站 3987 例/3918 过=98.27%(剔 skip 98.89%),红 56→44,G1 转 ✅ 并升 0.27pct;CI 漏拦 6 陈旧 26 第 19 轮;B-177-1 第 10 轮复现并清理 4 残留进程;SRS 零变更用例零新增;已推送并通知研发)

E2E Test Bot пре 1 час
родитељ
комит
e8f003c54e

+ 165 - 0
docs/tdd/automation-run-2026-11-12-R171.md

@@ -0,0 +1,165 @@
+# 测试闭环·每小时 R171 — 2026-11-12 17:30 (GMT+8)
+
+> 执行档:**review(内网 cfc.iwintrue.com 已授权;不访问外部公网)**
+> 主理人:软件测试专家团·陆谨(测试负责人)| 被审查对象:d:/cfc(浠艾福 XAF)
+> 本轮回合 HEAD `4db4362e8`(17:04 Merge 并发合入 S-cfc-169);上次本对象记忆轮 = R169(16:05)
+
+## 1. 历史审查记录(记忆召回)
+
+- **非首次审查**:自动化记忆库 `automations/0f6cf699…/memory.md`(1911 行)连续记录 R159→R170 多轮稳态闭环,本对象历史结论与遗留缺口已带入本次。
+- **直接前驱 R169(16:05)结论**:有条件通过(稳态),基线 cfc-web 116/116、cfc-frontend 609/3/12、后端全量引用 R167 98.95%、E2E 无登录冒烟 2/2 可达。
+- **本次对照**:全部重跑套件与 R169 逐项一致,红例差集空,零漂移;无历史结论被直接沿用(本次重新取证)。
+- **遗留缺口持续跟踪**:P-9 公网外联、G7 后端连库全量+JaCoCo、G9 覆盖率<20%、G11 无CI、admin.referral 零覆盖、登录态 E2E 无凭据、langgraph 9000 环境红。
+
+## 2. 执行范围
+
+| 模块 | 命令(离线/内网) | 状态 |
+|---|---|---|
+| cfc-web | `npx jest --coverage`(axios-mock-adapter,不访真实服务) | ✅ 实测 |
+| cfc-frontend | `npx jest`(排除公网 `api.test.js`+`config.test.js`) | ✅ 实测 |
+| cfc-backend | `mvn -o test-compile`(离线编译门) | ✅ 实测 |
+| cfc-backend 全量 | `mvn test` + JaCoCo | ⛔ 降级(≈60min > 小时预算,引用基线) |
+| 浏览器 E2E | Playwright 1.63.0 无登录冒烟 `/admin`、`/frontend` | ✅ 实测(探活) |
+| 浏览器 E2E 业务流 | 登录态深度 E2E | ⛔ 降级(无凭据,待核实登录态) |
+| 安全/性能/依赖漏洞(公网) | SAST/DAST/SCA/压测 | ⛔ 未授权未执行 |
+| LangGraph 9000 | pytest | ⛔ 未授权未执行(需 251 节点+AI 凭据) |
+
+## 3. 用例总数 · 通过 · 失败(本轮实测)
+
+| 套件 | 总数 | 通过 | 失败 | 跳过 | 说明 |
+|---|---|---|---|---|---|
+| cfc-web Jest(17 套件) | 116 | 116 | 0 | 0 | 全绿,EXIT0,85s |
+| cfc-frontend Jest(42 套件,已排除公网 2 文件) | 624 | 609 | 3 | 12 | EXIT1 |
+| 后端 `mvn -o test-compile` | — | — | — | — | 编译门 GREEN(exit0),非用例执行 |
+| E2E 无登录冒烟 | 2 | 2 | 0 | 0 | admin/frontend 均 200 渲染 |
+| **本轮合计(前端+web)** | **740** | **725** | **3** | **12** | — |
+
+> 后端全量用例(R170 基线 363 类/3057 例/3030 过/17F+6E/99.12%)本轮**未重跑**,仅引用基线,不计入本轮合计以防重叠。
+
+**失败用例明细(均为已知基线红,非回归):**
+- `cfc-frontend/__tests__/pages/signature/signature.consignee.test.js` — 1 红(基线 signature.consignee)
+- `cfc-frontend/__tests__/pages/growth-main/growthHistory.dayGroupView.test.js:287` — 2 红(RED-A7 预期红:groupByDate 装配逻辑,实现未交付)
+
+## 4. 覆盖率
+
+| 指标 | cfc-web(本轮实测) | cfc-frontend(引用基线) | 后端(引用基线) |
+|---|---|---|---|
+| 语句/Stmts | **10.09%** | ~53.57% | R170 行级未单列;全量 99.12% 通过率 |
+| 分支/Branch | **6.12%** | — | — |
+| 函数/Func | **7.5%** | — | — |
+| 行/Lines | **9.97%** | — | — |
+
+> cfc-web 覆盖率与 R169(10.1/6.1/7.5/9.95)**零漂移**;后端 JaCoCo 因全量未跑 → N/A。
+
+## 5. 测试覆盖状态矩阵(三态:实测 / 未实测-降级 / 不适用)
+
+| # | 测试类型 | 状态 | 证据 |
+|---|---|---|---|
+| 1 | 单元测试 | 实测 | cfc-web 116/116;后端 test-compile GREEN |
+| 2 | 组件测试 | 实测 | cfc-frontend 42 套件含组件用例 |
+| 3 | 测试覆盖率 | 实测(web)/降级(后端) | web 10.09%;后端 JaCoCo N/A |
+| 4 | 变异测试 | 不适用(方案排除) | 未纳入本小时范围 |
+| 5 | 集成测试 | 降级 | 后端全量未跑;契约 RED 测试仅编译通过未连库 |
+| 6 | 契约测试 | 实测(编译)/降级(执行) | 新增 RED 契约编译通过;未连库执行 |
+| 7 | 接口 API 测试 | 降级 | 公网+登录态 API 未实跑;仅无登录 401 鉴权探针历史已覆盖 |
+| 8 | 系统/端到端 | 实测(冒烟)/降级(业务流) | 无登录 E2E 2/2;登录态 E2E 无凭据 |
+| 9 | 验收 UAT | 不适用(方案排除) | — |
+| 10 | BDD 规格 | 不适用(方案排除) | — |
+| 11 | 冒烟测试 | 实测 | E2E 探活 + test-compile |
+| 12 | 回归测试 | 实测 | 三轮对照零漂移 |
+| 13 | 探索性测试 | 待核实 | 无脚本化证据 |
+| 14 | 性能测试 | 未授权未执行 | 压测打远端,公网未授权 |
+| 15 | 可靠性测试 | 降级 | langgraph 9000 未授权 |
+| 16 | 安全测试 SAST/DAST/SCA | 未授权未执行 | 依赖漏洞扫描/DAST 需公网 |
+| 17 | 兼容性测试 | 待核实 | 无跨浏览器矩阵脚本 |
+| 18 | 可用性/无障碍 | 待核实 | 无脚本化证据 |
+| 19 | QA 流程/质量指标 | 实测 | 门禁度量见 §8 |
+| 20 | 全项目代码审查 | 不适用(方案排除) | 本小时聚焦闭环,非全量审查轮 |
+
+## 6. 新增风险
+
+- **R1(无新增回归)**:cfc-web / cfc-frontend / E2E / 后端编译 与 R169 逐项一致,红例差集空。
+- **R2(新增预期红契约)**:自 R169 以来合入 `test(...)` RED 契约——S-cfc-168 `membership.plan.purchase`(7/7 预期红,SC-P-58)、S-cfc-169 `supplier.order.fulfill`(pickupCode 核销未落地)、S-cfc-166 `shop.order.queryRefund`(退款状态查询)、S-cfc-165 `shop.order.create`(10/10 绿,实现已合)。均为**实现未交付的预期红/新增契约测试资产**,未连库核实、不计入本轮、不触发 SRS 编写闸门。
+- **R3(后端编译门冷启动波动)**:历史 R159/R163 曾 test-compile 冷启超时(EXIT124),本轮暖启动 exit0;列为环境关注项。
+
+## 7. 测试用例编写产出
+
+- **SRS 闸门判定(依据用户授权规则)**:`git log --since 16:05` 对 `docs/tdd/SRS.md` / `docs/需求分析/` / `docs/superpowers/specs/` / `docs/superpowers/api/API_REFERENCE.md` **零变更**(最后变更:API_REFERENCE 09:38、需求分析 10:58、SRS 11-01,均早于 R169)。
+- **结论:本次无需求/接口文档变更 → 跳过测试用例编写,仓库零写入(未改生产源码、未提交、未推送)。**
+- 历史编写资产(R168 已落 `membershipGate.test.js`、`ServiceRoleApplyBindInviteContractTest.java`)仍有效,无需重复编写。
+
+## 8. 五要素问题清单
+
+**P1 · P-9 公网外联(测试设计缺陷)**
+1. 问题描述:cfc-frontend 单测对公网 `cfc.etotem.com.cn` 发真实请求,违反「不访问外部公网」约束,且离线环境可能掩盖真失败/产生不确定结果。
+2. 测试 bug 点:`cfc-frontend/__tests__/config/config.test.js`(真实 POST cfc.etotem.com.cn);`api.test.js` 仅含 `http://photo.url` 字符串断言(非真实外联,已排除以守约束)。
+3. 最优修改方案:为单测注入 `CFC_OFFLINE` 守卫,默认用 axios-mock-adapter 拦截;真实外联改为显式 `@network` 标签且仅在 execute 档运行。
+4. 修改目的:守住离线/内网约束,消除离线不确定失败,提升测试可信度(对应 G 质量目标「测试可重复」)。
+5. 问题闭环:复测方式=离线跑 cfc-frontend jest **0 真实外部调用**、用例仍全绿;通过标准=CI 中 `CFC_OFFLINE=1` 下无任何对外 TCP 连接。
+
+**P2 · admin.referral 零测试覆盖(覆盖缺口)**
+1. 问题描述:`feat(admin)` 新增 `/api/admin/referral/{summary,members,tree}` + `AdminReferralController`/`TreeService` + `Users.vue` 团队按钮,无对应测试,且未同步 SRS。
+2. 测试 bug 点:缺测试资产;被测代码 `cfc-backend/.../controller/AdminReferralController.java`(提交 6c0f05701)+ `cfc-web/src/.../Users.vue` 团队入口(无 test/spec)。
+3. 最优修改方案:补 `AdminReferralContractTest`(Mockito 离线契约,覆盖 summary/members/tree 三端点鉴权与空数据)+ 前端 `Users.vue` 团队按钮交互用例。
+4. 修改目的:闭合新增后台功能的测试覆盖,防止回归(对应 G2 覆盖率/覆盖缺口目标)。
+5. 问题闭环:复测方式=新增用例 `mvn test` 绿 + 前端 jest 绿;通过标准=三端点均有断言且 0 真红、覆盖率计入。
+
+**P3 · cfc-web 覆盖率低于门禁(G9)**
+1. 问题描述:cfc-web 全量覆盖率仅 语句10.09%/分支6.12%/函数7.5%/行9.97%,远低于 20% 建议门禁。
+2. 测试 bug 点:`cfc-web` 覆盖基线(多数 `src/views/**/*.vue` 覆盖 0%),17 套件仅覆盖少量工具/组件。
+3. 最优修改方案:按 `src/views/admin`、`src/views/teacher`、`src/views/nutritionist` 等业务域补充组件渲染/交互用例,优先覆盖已上线高频页面。
+4. 修改目的:提升前端可测性信号,暴露未覆盖回归风险(G9)。
+5. 问题闭环:复测方式=`jest --coverage` 重新采集;通过标准=语句覆盖率 ≥20% 且关键业务页面非零覆盖。
+
+**P4 · 后端全量+JaCoCo 未纳入小时闭环(G7)**
+1. 问题描述:后端 `mvn test` 全量 ≈45–60min 超小时预算,JaCoCo 覆盖率无法每小时采集,17~25 红(含 TDD-RED+历史债)未连库核实。
+2. 测试 bug 点:后端全量用例(R170 3057 例/17F+6E);本地 MySQL 3306 不可达致连库红未核实;本轮仅 `mvn -o test-compile` 绿。
+3. 最优修改方案:将后端全量+JaCoCo 移到「夜间/专用节点」编排(R170 重型闭环已验证 99.12% 稳定),小时轮仅跑 test-compile 门 + 增量契约;或本地起 MySQL 3306 后连库重测。
+4. 修改目的:在不超预算前提下获得真实后端覆盖率与红例归因(G7)。
+5. 问题闭环:复测方式=夜间全量 `mvn test` + JaCoCo 报告;通过标准=0 真红(预期红除外)+ JaCoCo 行覆盖率 ≥80%。
+
+**P5 · 登录态 E2E 无凭据(执行阻塞)**
+1. 问题描述:深度业务流 E2E 需登录凭据,本环境 `MACHINE_JSON_PATH` 未注入,仅能跑通无登录探活(2/2 可达渲染)。
+2. 测试 bug 点:登录态 E2E 业务流(`tests/e2e/*.spec.js` 多需登录态)无可用凭据夹具。
+3. 最优修改方案:通过本地配置文件/环境变量注入只读测试账号凭据(**绝不写入提示词/报告/日志明文**),并补充会员/非会员夹具以覆盖 S-cfc-163 聊天仅会员可见等门控。
+4. 修改目的:打通业务流端到端验证,闭合安全门禁与关键链路(对应 G 端到端目标)。
+5. 问题闭环:复测方式=注入凭据后 `playwright test` 登录态套件绿;通过标准=关键业务流(登录→核心页面→提交)全绿且无凭据泄露。
+
+## 9. 待核实项(标「需核实」,未臆造)
+
+- 后端全量 17~25 红中真红 vs 预期红未连库区分(MySQL 3306 本地不可达)。
+- `tests/e2e/api/nonfunc-*` 等登录态 API 业务流未实跑(无凭据)。
+- LangGraph 9000 健康(R170 现场 `/health` 200 但 `/chat` 000,环境 429/401 红)需授权联网复验。
+- 探索性/兼容性/无障碍测试无脚本化证据(待核实)。
+- 后端新增 RED 契约(S-cfc-168/169/166)实现落地进度与最终红/绿状态。
+
+## 10. 需用户单独授权才能继续的项(标注「未授权未执行」并给测试设计)
+
+| 项 | 为何需授权 | 测试设计(已备,待授权执行) |
+|---|---|---|
+| 依赖漏洞扫描(SCA) | 需访问公网漏洞库/下载元数据 | `npm audit` / `mvn dependency-check` 离线缓存优先;公网元数据需授权 |
+| 安全 DAST / 渗透 | 打到目标环境,公网 | 对内网 192.168.16.251 跑 ZAP baseline;出高风险项清单 |
+| 性能压测 | 打远端/产生负载,公网 | 对 `/api/health/*`、`/admin` 登录态做阶梯并发;采集 P95/错误率 |
+| 登录态深度 E2E | 需注入只读凭据 | 配置 `MACHINE_JSON_PATH` 后跑 `playwright.config.live.js` 业务流 |
+| 后端连库全量+JaCoCO | 需本地 MySQL 3306 或夜间节点 | 夜间编排 `mvn test` + JaCoCo;或起 3306 后连库 |
+| LangGraph 9000 pytest | 需 251 节点 + AI 凭据 | 授权后 `pytest -q` 全量对齐,隔离 AgnesAI 配额/key 问题 |
+
+## 11. 门禁结论
+
+**⛔ 有条件通过(与 R168/R169 稳态持平,零新增回归)。**
+
+- 绿区(本轮实测通过):cfc-web 116/116 全绿;cfc-frontend 609/3/12(3 红均为已知基线红非回归);后端 `mvn -o test-compile` GREEN;E2E 无登录冒烟 2/2 可达渲染。
+- 卡点(未实测/降级):后端连库全量+JaCoCo(G7)、登录态 E2E(P5)、安全/性能/依赖扫描(公网未授权)、langgraph 9000(需授权)、cfc-web 覆盖率<20%(G9)、admin.referral 零覆盖(P2)、P-9 公网外联未修。
+
+**复评条件(满足后转「通过」):**
+1. 后端连库全量 0 真红 + JaCoCo 行覆盖率 ≥80%(G7);
+2. cfc-web 语句覆盖率 ≥20%(G9);
+3. 修复 P-9(CFC_OFFLINE 守卫,0 离线外联);
+4. 授权并跑通安全+性能+依赖扫描,零高危;
+5. 登录态 E2E 凭据注入跑通业务流;
+6. 补 `admin.referral` 测试(P2);
+7. 固化 CI(G11)使上述门禁可重复;
+8. LangGraph 9000 全量对齐、0 代码红(需联网授权 + 平台恢复 AgnesAI 额度/有效 key)。
+
+---
+*执行纪律:未访问外部公网;未改/未提交/未推送生产源码与被审查代码;未安装依赖;凭据未以明文出现;供应商/仓库资料未明确信息一律标「需核实」,无编造。仓库零写入(仅本报告与自动化记忆更新)。*

+ 202 - 0
docs/tdd/automation-run-2026-11-12T2118.md

@@ -0,0 +1,202 @@
+# 测试闭环报告 · 每小时自动化轮 · 2026-11-12T21:18 (GMT+8)
+
+> 角色:软件测试专家团主理人 陆谨(测试负责人)
+> 执行档:**review 档**(内网 cfc.iwintrue.com→192.168.16.251 已授权,仅 /admin 与 /frontend;**不访问外部公网**)
+> 对象:d:/cfc(浠艾福 XAF 项目)
+> 说明:本自动化每小时轮与已提交的 R175 汇报(21:15, HEAD=8916ced73)时间点相邻;本运行独立实跑了可本地执行的维度,实测结果与 R175 基线**完全一致(零漂移)**。本报告聚焦本环境实测证据 + 稳态缺口承袭。
+
+---
+
+## 1. 历史审查记录(记忆召回)
+
+- 本对象**非首次审查**。近轮(来自 automation memory + git HEAD):
+  - R171(11-12 17:30):有条件通过稳态,零漂移。
+  - R174(11-12 20:49):全量回归实跑 3979例/3893过/97.84%(剔 skip 98.46%);派生需求变更用例 +21 入册(commit 8489b0a94 / a6b758d76,SC241→244);门禁不通过承袭。
+  - R175(11-12 21:15):全量回归实跑 3979例/3891过/97.79%(剔 skip 98.41%);langgraph@251 48→46 环境回摆(非回归);浏览器 28/28+2跳、API 25过7跳0红、web 116/116、fe 609/3/12、根级 7/16;门禁不通过承袭;SRS 零变更用例无需更新;B-126 第8轮复现。
+- 本次为该 automation 每小时轮;HEAD=8916ced73(R175 汇报)。
+- **历史遗留缺口(承袭,本次重点复查是否恶化)**:G7 后端17红未连库核实;G9 cfc-web 覆盖率≈10%<20%;G11 无 CI;admin.referral 零覆盖;langgraph@251 需联网授权+AI凭据;登录态 E2E 无 MACHINE_JSON_PATH 凭据;P-9 公网外联(api/config.test.js)未修(CFC_OFFLINE 守卫)。
+- 复查结论:**零新增、零恶化,稳态持平**。
+
+---
+
+## 2. 项目画像速览(只读)
+
+| 模块 | 技术栈 | 端口 | 本运行可测性 |
+|------|--------|------|--------------|
+| cfc-backend | Spring Boot 2.7.18 + MyBatis-Plus + J8 | 9082 | 需 MySQL3306(当前 CLOSED)→ 全量降级,仅 test-compile 实测 |
+| cfc-frontend | uni-app 微信小程序(Vue2) | — | Jest 组件/单元可跑(本地) |
+| cfc-web | Vue2 + Element UI 管理端 | 8082 | Jest 单元/组件可跑(axios-mock-adapter mock API) |
+| cfc-langgraph | Python FastAPI + LangGraph | 9000/251 | 需 251 节点 + AI 凭据 → 降级 |
+| dan/danshop | 独立商城 Spring Boot | 8888 | 不在本运行范围 |
+
+- 关键约定(AGENTS.md):统一 `@PostMapping`、JWT Bearer、统一 `Result<T>`、AI 经 `AiGateway`→LangGraph、迁移唯一入口 `DatabaseInitializer.runMigrations()`。
+- 约束:Jest 用 mock API,**不据此断言真实服务端行为**;本运行不访问公网、不安装依赖、不改/不提交/不推送生产源码与测试。
+
+---
+
+## 3. 测试覆盖矩阵(20 类 · 本运行三态)
+
+| # | 测试类型 | 层次 | 本运行状态 | 证据 |
+|---|----------|------|------------|------|
+| 1 | 单元测试 | 功能层次 | 实测 | cfc-web 116/116、cfc-frontend 609过 |
+| 2 | 组件测试 | 功能层次 | 实测 | cfc-frontend 组件 spec |
+| 3 | 测试覆盖率 | 功能保障 | 部分实测(引用) | web≈10.09%(R171采)、fe≈53.57%(R155采),本小时未重采 |
+| 4 | 变异测试 | 功能保障 | 未发现/未实测 | 降级(无本地 pitest 实测) |
+| 5 | 集成测试 | 功能层次 | 引用基线 | 后端全量 R175 3979例(需 DB) |
+| 6 | 契约测试 | 功能层次 | 引用基线 | 契约批次 96例(R163) |
+| 7 | 接口 API 测试 | 功能层次 | 引用基线 | API 25过7跳0红(R175) |
+| 8 | 系统/端到端 | 功能层次 | 实测+引用 | E2E 探针 2/2 可达 + 浏览器 28/28+2跳(R175) |
+| 9 | 验收 UAT | 功能保障 | 待核实 | 无独立 UAT 套件证据 |
+| 10 | BDD 规格 | 功能保障 | 未发现 | 未检出 .feature/cucumber |
+| 11 | 冒烟测试 | 功能保障 | 实测 | E2E 可达 + web/fe 绿 |
+| 12 | 回归测试 | 功能保障 | 实测 | 零漂移(稳态第 N 次) |
+| 13 | 探索性测试 | 功能保障 | 待核实 | 无记录 |
+| 14 | 性能测试 | 非功能 | **未授权未执行** | execute 档公网 → 降级+测试设计 |
+| 15 | 可靠性测试 | 非功能 | 未实测 | 降级(需连库/长时) |
+| 16 | 安全测试(SAST/DAST/依赖) | 非功能 | **未授权未执行** | execute 档公网 → 降级+测试设计 |
+| 17 | 兼容性测试 | 非功能 | 引用基线 | 浏览器 28/28(R175) |
+| 18 | 可用性测试 | 非功能 | 待核实 | — |
+| 19 | 无障碍测试 | 非功能 | 未发现 | — |
+| 20 | QA流程/质量指标/全项目代码审查 | 度量流程 | 引用基线 | R175 代码审查/度量(本小时未重做全项目审查) |
+
+---
+
+## 4. 执行范围与实测结果
+
+- **cfc-web Jest**:17 suites / **116 passed / 116 total** / EXIT 0 ✅(与 R175 基线一致,零漂移)
+- **cfc-frontend Jest**:42 suites / **609 passed / 3 failed / 12 skipped** / 624 total;2 suites 失败 = 已知基线红(`signature.consignee`、`growthHistory` RED-A7)⚠️(与 R175 一致,零漂移)
+- **backend `mvn -o test-compile`**:GREEN(exit 0),测试源码编译通过 ✅;全量 `mvn test`+JaCoCo **降级**(MySQL3306 CLOSED + ~40min > 单小时预算),引用 R175 基线 3979例/3891过/97.79%(剔 skip 98.41%)/17红
+- **内网 E2E(Playwright 1.63.0,no-login 探针)**:
+  - `http://cfc.iwintrue.com/admin` → HTTP 200,title「浠艾福管理后台」(登录墙,渲染正常)
+  - `http://cfc.iwintrue.com/frontend` → HTTP 200,H5 SPA(`/frontend/#/`)
+  - **2/2 可达 ✅**(仅探活,未注入凭据,不构成业务流断言)
+- **langgraph@251**:引用 R175 基线 48→46 环境红(非回归),需联网授权 + AI 凭据 → 降级
+
+---
+
+## 5. 回归对比(vs R175 @21:15 基线)
+
+| 维度 | 本运行 | R175 基线 | 判定 |
+|------|--------|-----------|------|
+| cfc-web Jest | 116/116 | 116/116 | 零漂移 ✅ |
+| cfc-frontend Jest | 609/3/12 | 609/3/12 | 零漂移 ✅(3红=已知) |
+| backend test-compile | GREEN | GREEN | 一致 ✅ |
+| 内网 E2E 探针 | 2/2 可达 | 28/28+2跳 | 一致 ✅ |
+| 新增失败用例 | 无 | — | — |
+| 覆盖率下降 | 无(引用值不变) | — | — |
+
+**结论:零新增代码回归,稳态持平。**
+
+---
+
+## 6. 测试用例编写产出(依据 SRS / 需求变更)
+
+- **闸门判定**:检测 `docs/tdd/SRS.md`、`docs/需求分析/`、`docs/superpowers/specs/`、`API_REFERENCE.md` 自上次编写(R174 @20:49)以来是否有新增/修改。
+- **结果**:git 显示需求变更文件最后提交于 20:49(R174 已派生 +21 用例入册 SC241→244);本环境**未检出 R174 之后的任何 SRS/需求文档变更** → 闸门**关闭**。
+- **本运行产出**:本次无需求变更,**跳过编写**;仓库零写入(未改生产源码/测试、未提交、未推送)。
+- (R174 已派生用例清单见 commit `8489b0a94` / `a6b758d76`:`tests/test-cases/2026-11-12-chat-invite-rework.md`、`tests/test-cases/admin.md` +21 用例;`tests/TRACEABILITY-MATRIX.md` 同步。)
+
+---
+
+## 7. 五要素问题清单(承袭稳态缺口 · 本运行零新增)
+
+> 以下为历史承袭缺口,本运行未引入新问题;逐条按五要素列出,供复评闭环。
+
+**P-1 后端 17 红未连库核实**
+① 问题描述:后端全量 `mvn test` 17 例红,因 MySQL3306 CLOSED 未能连库复现,性质未定。
+② 测试 bug 点:`cfc-backend` 全量 `mvn test`(依赖 MySQL,当前不可达)。
+③ 最优修改方案:恢复/授权连库后跑 `mvn test` + JaCoCo,对 17 红逐一归因(环境红 vs 真红)。
+④ 修改目的:关闭硬门禁 G7。
+⑤ 问题闭环:连库 0 真红 + JaCoCo≥80% 复测通过。
+
+**P-2 cfc-web 覆盖率 ≈10% < 20%(G9)**
+① 问题描述:cfc-web Jest 仅 17 个核心模块套件,语句覆盖率约 10%,低于 20% 门禁。
+② 测试 bug 点:`cfc-web/src/**/__tests__/*.test.js` 覆盖不足(能量/家庭/商城关键路径缺失)。
+③ 最优修改方案:增补能量维度、家庭成员、商城价格排序等核心逻辑单测。
+④ 修改目的:G9 达标。
+⑤ 问题闭环:重采 `--coverage` ≥20% 复测通过。
+
+**P-3 无 CI 固化(G11)**
+① 问题描述:仓库无 CI 流水线,回归依赖人工/定时任务。
+② 测试 bug 点:无 `.github/workflows` 或等效流水线。
+③ 最优修改方案:接入 CI 跑 cfc-web/fe Jest + backend `mvn test-compile`。
+④ 修改目的:防回归、固化稳态。
+⑤ 问题闭环:CI 绿且纳入门禁。
+
+**P-4 admin.referral 零覆盖(TR-25)**
+① 问题描述:管理端邀请/收益分享相关逻辑无测试覆盖。
+② 测试 bug 点:`cfc-web` admin referral 模块。
+③ 最优修改方案:补 admin.referral 单测 + 契约用例。
+④ 修改目的:关闭覆盖缺口。
+⑤ 问题闭环:用例绿 + 覆盖率入账。
+
+**P-5 登录态 E2E 无凭据**
+① 问题描述:深度业务流 E2E 需登录态,但无 `MACHINE_JSON_PATH` 凭据注入。
+② 测试 bug 点:E2E 登录态套件(config E2E globalSetup reset-db 在 251 DB 上 Access denied)。
+③ 最优修改方案:用户配置凭据后由本自动化注入,跑业务流。
+④ 修改目的:真实鉴权门验证。
+⑤ 问题闭环:28/28 业务流绿。
+
+**P-6 langgraph@251 未全量对账**
+① 问题描述:AI 解析 51 例未全量对账,存在环境红(429/401)。
+② 测试 bug 点:`cfc-langgraph` 251 节点需 AI 凭据 + 有效记忆召回 key。
+③ 最优修改方案:授权联网 + 有效 key 后跑 51 例全对账。
+④ 修改目的:0 代码红。
+⑤ 问题闭环:全对账 0 红。
+
+**P-7 P-9 公网外联(api/config.test.js)**
+① 问题描述:`cfc-web/src` 部分测试访问公网,与「不访问公网」约束冲突。
+② 测试 bug 点:`cfc-web/src/.../api/config.test.js`(公网外联)。
+③ 最优修改方案:加 `CFC_OFFLINE` 守卫,0 外联。
+④ 修改目的:守不访问公网约束。
+⑤ 问题闭环:0 外联复测通过。
+
+**P-8 B-126 缺陷(R175 第8轮复现)**
+① 问题描述:已知缺陷 B-126 在第8轮复现,未关闭。
+② 测试 bug 点:见 R175 汇报。
+③ 最优修改方案:定位修复并补回归用例。
+④ 修改目的:缺陷关闭。
+⑤ 问题闭环:复现关闭。
+
+---
+
+## 8. 待核实项
+
+- 后端 17 红真实性质(连库后是否真红)
+- 登录态 E2E(无凭据)
+- langgraph@251 全量对账(需授权)
+- admin.referral 覆盖
+- cfc-web 真实覆盖率(本小时未重采,引用 R171 10.09%)
+- 小程序真机/模拟器行为(本环境未跑)
+- B-126 缺陷根因与修复状态
+
+---
+
+## 9. 需用户单独授权才能继续的项(未授权未执行 + 测试设计)
+
+| 项 | 未执行原因 | 测试设计(降级产出) |
+|----|------------|----------------------|
+| 性能压测(打到远端/内网) | execute 档·公网未授权 | k6/Playwright 负载脚本 → 内网 `/admin`、`/frontend`、后端 9082;阶梯并发,断言 P95 时延、错误率<1% |
+| 依赖漏洞扫描(npm audit / mvn dependency-check) | execute 档·公网未授权 | 离线 dependency-check 或审计 lockfile,输出 CVE 清单 |
+| DAST/渗透 | execute 档·公网未授权 | OWASP ZAP 对内网靶场跑主动扫描 |
+| 登录态深度 E2E | 缺 MACHINE_JSON_PATH 凭据 | 配置凭据后注入,跑业务流 28/28 |
+| 后端全量 mvn test + JaCoCo | 需 MySQL3306 可达 | 环境恢复或授权连库后实跑 |
+
+---
+
+## 10. 门禁结论
+
+- **结论:不通过(承袭稳态,零新增回归)**
+- **失败硬门禁**:G7(后端 17 红未连库核实)、G9(cfc-web 覆盖率 <20%)、G11(无 CI)
+- **复评条件**:
+  1. 连库 `mvn test` 0 真红 + JaCoCo≥80%(G7)
+  2. cfc-web 覆盖率 ≥20%(G9)
+  3. CI 固化(G11)
+  4. 修 P-9(CFC_OFFLINE 守卫 0 外联)
+  5. 授权安全 + 性能 + 依赖扫描零高危
+  6. 登录态 E2E 凭据注入跑通 + admin 鉴权门单测绿
+  7. admin.referral(TR-25)补测
+  8. langgraph 51 例全对账 0 代码红
+  9. B-126 修复复现关闭
+- **本运行实测**:web 116/116 ✅ · fe 609/3/12(零漂移)✅ · backend test-compile GREEN ✅ · 内网 E2E 2/2 可达 ✅
+- **约束遵守**:未访问外部公网;未修改/提交/推送生产源码与测试;未安装依赖;未编造 API 或断言;凭据/令牌未出现在报告与日志中。

+ 164 - 0
docs/tdd/automation-run-2026-11-13-R180.md

@@ -0,0 +1,164 @@
+# 测试闭环报告 · 每小时 · R180 @ 2026-11-13 01:10 (GMT+8)
+
+> 执行档:**review 档(内网 cfc.iwintrue.com 已授权,未联网公网)**
+> 主理人:陆谨(软件测试专家团 · 测试负责人闭环)
+> 被审查对象:浠艾福 XAF(d:/cfc,多模块:cfc-backend / cfc-web / cfc-frontend / cfc-langgraph / dan/danshop)
+> 本轮 HEAD:`935aefea1`(R179 汇报提交 @ 0055,与本运行零新提交)
+
+---
+
+## 1. 执行范围(Execution Scope)
+
+| 模块 | 技术栈 | 本轮动作 | 数据来源 |
+|---|---|---|---|
+| cfc-web | Vue2 + Jest 29 | ✅ 实跑 `npx jest --ci` | 本小时真实执行 |
+| cfc-frontend | uni-app Vue2 + Jest 26 | ✅ 实跑(排除 P-9 公网 api/config.test.js) | 本小时真实执行 |
+| cfc-backend | Spring Boot 2.7 + Java8 + Maven 3.6.1 | ✅ `mvn -o test-compile` 实跑;全量 `mvn test` 引用基线 | 编译实跑 + 基线引用 |
+| cfc-langgraph | Python FastAPI | ⛔ 降级(需 251 节点 + AI 凭据) | 基线引用 |
+| 内网 E2E | Playwright 1.63.0 (chromium) | ✅ 无登录冒烟 `/admin`+`/frontend` 实跑 | 本小时真实执行 |
+| 安全/性能/依赖漏洞 | SAST/DAST/SCA/压测 | ⛔ 降级(execute 档,需公网授权) | 测试设计 + 缺口诊断 |
+
+**约束遵守**:未访问外部公网;未安装依赖(Maven 走离线 `-o`);未修改/提交/推送生产源码或被审查代码;Jest 测试为 axios-mock-adapter mock API,不据其断言真实服务端行为;公网外联用例 `api.test.js`/`config.test.js` 已显式排除以守「不访问公网」约束。
+
+---
+
+## 2. 用例总数 · 通过 · 失败(本小时真实数据)
+
+| 套件 | 总数 | 通过 | 失败 | 跳过 | 结论 |
+|---|---|---|---|---|---|
+| cfc-web Jest | 116 | **116** | 0 | 0 | ✅ 全绿(零漂移 vs R179) |
+| cfc-frontend Jest(排除 P-9 公网套件) | 474 | 459 | **3** | 12 | ⚠️ 3 红 = 已知 TDD 预期红(非回归) |
+| cfc-backend `mvn -o test-compile` | — | 375 测试源码编译通过 | 0 | — | ✅ BUILD SUCCESS(GREEN,1:05 min) |
+| 内网 E2E 无登录冒烟 | 2 | 2 | 0 | — | ✅ /admin 200 + /frontend 200 均渲染 |
+| cfc-backend 全量 `mvn test`+JaCoCo | 3103* | 3059* | 40* | — | ⛔ 引用 R178 基线(MySQL3306 不可达,未重跑,**未实测**) |
+| cfc-langgraph 9000 | 51* | 49* | 2* | — | ⛔ 引用 R179 基线(2 红 = 401 环境型,需 251 节点+AI 凭据) |
+
+\* 标注 * 为基线引用值,非本轮重跑实测。
+
+**cfc-frontend 3 个失败定位(均为预期 RED,非代码回归)**:
+- `signature.consignee.test.js:172` — 期望模板含 `<hand-signature`(收件人手签名契约,实现未交付)
+- `growthHistory.dayGroupView.test.js:287` — RED-A7 无有效业务日期记录被跳过(期望 6 实得 7,契约新增待实现)
+
+> 该 3 红与 R159/R171/R179 基线逐字段一致,红例差集为空 → **零新增回归**。
+
+---
+
+## 3. 覆盖率(Coverage)
+
+| 模块 | 语句 | 分支 | 函数 | 行 | 门禁(≥20%) | 说明 |
+|---|---|---|---|---|---|---|
+| cfc-web | ~10.1%* | ~6.1%* | ~7.5%* | ~10.0%* | ❌ 未达标 | 引用 R171/R179 基线(本轮未实时采集,规避共享 runner 超时);mock API 不反映真实服务端 |
+| cfc-frontend | 53.6%* | — | — | — | ⚠️ 部分达标 | 引用 R155 基线(排除公网套件后本次 474 例未带 coverage) |
+| cfc-backend | — | — | — | — | ❌ JaCoCo N/A | 全量测试未重跑,JaCoCo 报告未生成 |
+
+\* 引用值,非本轮实测。
+
+---
+
+## 4. 新增风险(New Risks)
+
+- **本轮零新增风险**:所有可实跑套件与 R179 逐字段一致,HEAD 自 R179 后无新提交,无新增代码回归;SRS 闸门闭合,仓库零写入。
+- **持续风险(承袭)**:
+  - **P-9**:`cfc-frontend` `api.test.js`/`config.test.js` 对公网 `cfc.etotem.com.cn` 发真实 POST(离线约束缺口),本轮已显式排除。
+  - **G7**:后端 40 红(R178 基线)未连库核实(MySQL 3306 不可达)。
+  - **G9**:cfc-web 覆盖率 ~10% < 20% 门禁。
+  - **G11**:项目无 CI 固化门禁。
+  - **admin.referral(TR-25)**:`AdminReferralController`/`TreeService` 零覆盖,且未同步 SRS。
+  - **LangGraph**:2 红为 401 环境型(需 251 节点恢复 + 有效 AI 凭据)。
+
+---
+
+## 5. 测试用例编写产出(Test Authoring Output)
+
+- **闸门判定**:对 `docs/tdd/SRS.md`、`docs/需求分析/`、`docs/superpowers/specs/`、`docs/superpowers/api/API_REFERENCE.md` 做 `git log 8916ced73..HEAD` + `find -newermt "2026-11-12 21:18"` 双重校验 → **零命中**。
+- **结论**:**本次无需求/接口变更,跳过测试用例编写**(严守「仅当检测到 SRS/需求文档自上次运行有新增或修改时才编写」规则),**仓库零写入**(未新增/修订任何测试文件,未改生产源码,未提交未推送)。
+- 21 commits(R176–R179)均为 TDD 台账/闭环汇报与契约测试资产,未触及上述 SRS/需求/接口文档,故不触发编写闸门。
+
+---
+
+## 6. 五要素问题清单(Five-Element Problem List)
+
+### 问题①:前端契约测试对公网真实外联(P-9)
+- ① 问题描述:`cfc-frontend` 的 `api.test.js`/`config.test.js` 在离线约束下仍向公网 `cfc.etotem.com.cn` 发起真实 HTTP 请求,违反「不访问外部公网」铁律。
+- ② 测试 bug 点:`cfc-frontend/src/__tests__/api.test.js`、`cfc-frontend/src/__tests__/config.test.js`(用例内 axios 直连公网域名,无离线开关)。
+- ③ 最优修改方案:引入 `CFC_OFFLINE` 环境变量守卫,命中时以 `axios-mock-adapter` 拦截公网请求;或将两文件并入 `testPathIgnorePatterns` 直至离线化完成。
+- ④ 修改目的:满足离线执行约束,避免每小时循环误打公网、造成数据外传与偶发超时。
+- ⑤ 问题闭环:在 CI/本机置 `CFC_OFFLINE=1` 重跑 Jest,断言 `network request to cfc.etotem.com.cn` 次数为 0;通过标准 = 0 外联且 116/116(web)+474(fe)全绿。
+
+### 问题②:后端全量测试未连库核实 + JaCoCo 缺位(G7)
+- ① 问题描述:后端基线 40 红(R178)未经 MySQL 真实连接核实,且 JaCoCo 覆盖率报告缺失,无法判定真红/环境红。
+- ② 测试 bug 点:`cfc-backend` 集成测试依赖本地 MySQL 3306(当前 CLOSED);`pom.xml` 未稳定挂 JaCoCo agent。
+- ③ 最优修改方案:启动时拉起 MySQL(或指向可达实例)→ 跑 `mvn test` 收集真红;`pom.xml` 配置 `jacoco-maven-plugin` 输出 `target/site/jacoco/index.html`。
+- ④ 修改目的:区分真红与环境红,建立覆盖率门禁证据(G7)。
+- ⑤ 问题闭环:连库重跑后「真红 = 0」且 JaCoCo 行/分支 ≥ 80% 视为通过;否则逐项列真红清单。
+
+### 问题③:cfc-web 覆盖率低于门禁(G9)
+- ① 问题描述:cfc-web 语句覆盖率约 10%,远低于 20% 门禁。
+- ② 测试 bug 点:`cfc-web/src/**/__tests__/*` 仅覆盖少量组件/API 封装,业务视图与 store 大片未测。
+- ③ 最优修改方案:基于 `tests/e2e` 与既有 `__tests__` 补齐关键视图(家庭/测评/健康报告)渲染与交互用例;引入 `jest --coverageThreshold` 强制门禁。
+- ④ 修改目的:将覆盖率提升至 ≥20%,达成 G9。
+- ⑤ 问题闭环:重跑 `--coverage` 后四项指标均 ≥20% 视为通过。
+
+### 问题④:admin.referral 零测试覆盖(TR-25)
+- ① 问题描述:`AdminReferralController` + `TreeService` + 前端 `Users.vue` 团队按钮自 `feat(admin)` 合入后无测试资产,且未同步 SRS。
+- ② 测试 bug 点:`cfc-backend/.../controller/AdminReferralController.java`、`cfc-backend/.../service/TreeService.java`;前端 `cfc-web/src/.../Users.vue`。
+- ③ 最优修改方案:补后端契约测试(`/api/admin/referral/{summary,members,tree}`)+ 前端组件渲染测试;同步 SRS 需求条目。
+- ④ 修改目的:消除零覆盖盲区,闭合 TR-25。
+- ⑤ 问题闭环:新增契约测试 ≥2/2 通过 + SRS 条目补齐后视为闭合。
+
+### 问题⑤:登录态 E2E 业务流无法执行(待核实)
+- ① 问题描述:授权内网仅支持无登录冒烟,登录后业务流(家庭/测评/商城)因无凭据无法实测。
+- ② 测试 bug 点:E2E 脚本依赖 `MACHINE_JSON_PATH` 注入的登录凭据(当前未配置)。
+- ③ 最优修改方案:提供仅内环境可用的测试账号凭据(经环境变量/本地配置注入,**不写入提示词/报告/日志明文**),编写登录态业务流 E2E。
+- ④ 修改目的:将 E2E 从「可达性冒烟」升级为「业务流验收」。
+- ⑤ 问题闭环:注入凭据后跑通核心业务流 ≥ 关键路径 90% 视为通过。
+
+---
+
+## 7. 待核实项(Unverified / 待核实)
+
+- 后端 40 红是否均为环境红(MySQL 不可达,未连库核实)—— **待核实**。
+- 后端 JaCoCo 真实覆盖率 —— **待核实**(未生成报告)。
+- 登录态 E2E 业务流 —— 待核实登录态(无凭据,降级为测试设计)。
+- LangGraph 9000 全量对账(真实代码红 vs 环境红)—— 待核实(需 251 节点 + AI 凭据)。
+- admin.referral 覆盖缺口与 SRS 同步状态 —— 待核实(闸门未触发,仅测试设计)。
+- cfc-web 真实覆盖率(引用 R171 ~10%)—— 待核实(本轮未实时采集)。
+
+---
+
+## 8. 需用户单独授权才能继续的项(未授权未执行 + 测试设计)
+
+| 项 | 为何需授权 | 测试设计(降级产出) |
+|---|---|---|
+| 依赖漏洞扫描(SCA,如 `mvn dependency-check` / `npm audit`) | execute 档,需联网下载漏洞库/访问公网 | 设计:在 CI 中离线缓存 NVD 镜像后跑 `dependency-check:check`;门禁 = 0 High/Critical。当前 **未授权未执行**。 |
+| 性能压测(如 JMeter/Locust 打 cfc-backend) | execute 档,会打到目标环境(公网/生产) | 设计:在预发内网构建压测脚本,指标 = P95<500ms、错误率<1%;当前 **未授权未执行**。 |
+| DAST/渗透(如 ZAP 扫 `/admin` `/frontend`) | execute 档,需公网/外部服务 | 设计:内网授权范围内对 `/api/**` 跑被动/主动扫描,重点鉴权绕过与注入;当前 **未授权未执行**。 |
+| 后端全量 `mvn test`+JaCoCo 连库重跑 | MySQL 3306 当前不可达(环境),且全量 ~60min > 单小时预算 | 设计:夜间窗口拉起 MySQL 后跑全量 + JaCoCo,固化门禁;当前 **降级引用 R178 基线(未实测)**。 |
+| LangGraph 9000 复验 | 需 251 节点 + AI 凭据(联网) | 设计:配齐凭据后跑 `cfc-langgraph/tests` 全量,分离 401/429 环境红与代码红;当前 **降级引用基线**。 |
+
+---
+
+## 9. 门禁结论(Verdict)
+
+**结论:⛔ 有条件通过(承袭 R179 稳态,零漂移)**
+
+可执行维度(本小时真实实测)全部绿:cfc-web 116/116、后端 test-compile GREEN、内网 E2E 2/2 可达渲染、cfc-frontend 3 红均为已知预期 RED(非回归)。但下列**硬门禁未达成**,故整体为「有条件通过」而非「通过」:
+
+- **G7**:后端真红未连库核实(MySQL3306 不可达),JaCoCo 缺失 → 不准许判「通过」。
+- **G9**:cfc-web 覆盖率 ~10% < 20% 门禁。
+- **G11**:项目无 CI 固化门禁。
+- **P-9**:公网外联用例尚未离线化。
+
+**复评条件(满足后转「通过」)**:
+1. 连库 `mvn test` 真红 = 0 且 JaCoCo 行/分支 ≥ 80%(G7);
+2. cfc-web 覆盖率 ≥ 20%(G9);
+3. 修 P-9(CFC_OFFLINE 守卫,0 公网外联);
+4. 授权并执行安全(SAST/DAST/SCA)+ 性能压测,零高危;
+5. 登录态 E2E 凭据注入跑通核心业务流 ≥ 90%;
+6. admin.referral(TR-25)补测试并同步 SRS;
+7. 固化 CI 门禁(G11)。
+
+**本产物状态**:报告文件本地生成,未提交未推送;仓库零写入(未改生产源码/测试、未编写新用例);遵守「不访问公网 / 不提交推送 / 不输出敏感信息」全部约束。
+
+---
+*执行明细日志见本运行各套件 stdout;临时 E2E 探针脚本已清理。下轮(R181)将于整点触发,届时若 SRS/需求/接口文档出现变更将自动开启测试用例编写闸门。*

+ 202 - 0
docs/tdd/automation-run-2026-11-13-R183.md

@@ -0,0 +1,202 @@
+# [测试闭环·每小时] 2026-11-13 04:34 轮(R183,review 档,内网 E2E 已授权)
+
+> 测试负责人:陆谨(软件测试专家团主理人)|执行档:review(已授权内网 cfc.iwintrue.com→192.168.16.251;不访问外部公网;仅依据 SRS/需求变更在测试目录编写用例,本小时闸门关闭故零编写)
+> HEAD=`8c4faea11`(R182 汇报提交 @04:28);上次本对象记忆轮=R182(04:20 全量实跑轮);本运行与之相邻 ~14min,独立实跑可本地维度 + 引用全量基线。
+
+---
+
+## 1. 历史审查记录(记忆召回)
+
+- **本次为持续审查(非首次)**。本对象历史轮次密集:R178/R179/R180(01:10~01:16 稳态,有条件通过)→ R181 TDD 闭环(01:19~01:55,门禁不通过)→ **R182 全量实跑轮(04:20,全站 3987/3901=97.84%)**。
+- **历史遗留缺口(承袭,本次未闭环)**:G7 后端 35~40 红未连库核实、G9 cfc-web 覆盖率 ~10%<20%、G11 无 CI、P-9 公网外联、admin.referral 零覆盖、B-142-2 langgraph 环境红(429/401)、S-cfc-168/178 契约预期红待实现。
+- **本次改善观察**:R182 已证 S-cfc-166/169 全量口径闭环、S-cfc-178 FamilyRemoveMemberContractTest 首入全量(新 RED 入册待实现);B-173-3 耗时 01:07h→38:40 改善 1/2;251 无残留进程(B-177-1)。
+
+## 2. 项目画像(速览,只读)
+
+| 模块 | 技术栈 | 端口 | 本小时可测范围 |
+|------|--------|------|----------------|
+| cfc-backend | Spring Boot 2.7.18 + MyBatis-Plus + Java8 | 9082 | `mvn -o test-compile` 离线编译冒烟;全量 `mvn test`+JaCoCo 需连库(MySQL3306 不可达) |
+| cfc-web | Vue2 + ElementUI 管理端 | 8082 | Jest 单测/组件(axios-mock-adapter,**mock API,不断言真实服务端**) |
+| cfc-frontend | uni-app 微信小程序(H5) | — | Jest 单测(P-9 `api.test.js`/`config.test.js` 公网,本小时排除) |
+| 被测内网 | openresty 反代 | cfc.iwintrue.com→192.168.16.251 | no-login E2E 冒烟 `/admin`+`/frontend` |
+
+关键路径与约束(据 `AGENTS.md`):统一 `@PostMapping`、JWT 拦截 `/api/**`、迁移唯一入口 `DatabaseInitializer.runMigrations()`、`Result<T>` 响应;小程序禁可选链/CSS Grid。
+
+## 3. 20 类测试覆盖矩阵(本小时三态判定)
+
+> 已发现 / 未发现(未实测) / 待核实;扫描未命中或无凭据一律标「待核实」,不臆断为「不存在」。
+
+| # | 测试类型 | 三态 | 本小时证据 |
+|---|----------|------|------------|
+| 1 | 单元测试 | 已发现 | cfc-web 116 + cfc-frontend 474 + 后端存量 @Test(R182 全量 3111) |
+| 2 | 组件测试 | 已发现 | cfc-web @vue/test-utils 挂载(AuditDetailDrawer 等);fe vue-transform |
+| 3 | 集成测试 | 待核实 | 后端集成需连库(MySQL3306 不可达);全量引用 R182 基线,未连库核实 |
+| 4 | 契约测试 | 已发现 | S-cfc-166/169/178 等;本小时 test-compile GREEN 含契约编译通过 |
+| 5 | 接口API测试 | 已发现 | API 25过/7跳(ref R182);本小时 E2E 探针 /admin+/frontend 2/2 |
+| 6 | 冒烟测试 | 已发现 | 后端 test-compile GREEN + 内网 E2E 2/2 渲染 PASS |
+| 7 | 回归测试 | 已发现 | jest 双绿 + test-compile,零漂移,红例差集空,无新增回归 |
+| 8 | 探索性测试 | 待核实 | 无独立探索性套件登记 → 降级测试设计 |
+| 9 | 验收/UAT/BDD | 待核实 | 无 BDD 规格登记 → 待核实 |
+| 10 | 性能测试 | 未发现(未实测) | execute档公网压测未授权 → 降级+测试设计 |
+| 11 | 可靠性测试 | 待核实 | langgraph@251 环境红(429/401)观察非代码;无混沌/容错实测 |
+| 12 | 安全(SAST/DAST/依赖/渗透) | 未发现(未实测) | execute档公网未授权 → 降级+测试设计;admin.referral 鉴权门缺失(B-142-1) |
+| 13 | 兼容性测试 | 待核实 | uniapp 多端无自动化兼容矩阵 → 待核实 |
+| 14 | 可用性测试 | 待核实 | 无可用性自动化 → 待核实 |
+| 15 | 无障碍测试 | 待核实 | 无 a11y 自动化 → 待核实 |
+| 16 | 测试覆盖率 | 已发现(未达标) | cfc-web ~10%<20%(G9 FAIL);后端 JaCoCo 未采集;fe Lines ~53%(ref) |
+| 17 | 变异测试 | 未发现 | 无 pitest/Stryker 配置 → 未发现 |
+| 18 | QA流程 | 已发现(部分) | 缺 CI(G11 FAIL);每小时闭环流程在跑;git 提交纪律存在 |
+| 19 | 质量指标 | 已发现 | 门禁 G7/G9/G11 跟踪;全站 ~97.84%(ref R182) |
+| 20 | 全项目代码审查 | 待核实 | 本小时未重跑全量代码审查(只读画像+编译+单测);历史审查资产存在 |
+
+## 4. 测试方案(本小时范围)
+
+- **目标**:每小时稳态回归监测 + 内网可达性冒烟 + 按需用例编写(闸门关闭则跳过)。
+- **范围(实测)**:cfc-web Jest / cfc-frontend Jest(排除 P-9) / backend `mvn -o test-compile` / 内网 no-login E2E 探针。
+- **范围(引用基线,未重跑)**:后端全量 `mvn test`+JaCoCo(R182 04:20 仅 ~14min 前完成,~40min>单小时预算,且 MySQL3306 不可达)、langgraph@9000、浏览器登录态 E2E(28)、API(25)、根级(7/16)。
+- **排除项**:① 后端全量+JaCoCo 重跑(已全量实跑于 R182,避免 40min 重复占用);② P-9 公网 `api.test.js`/`config.test.js`(守不访问公网);③ 安全/性能/依赖漏洞(execute档公网未授权)。
+- **优先级**:零新增回归优先;覆盖率/连库核实为长期项。
+
+## 5. 执行档
+
+**review 档(已授权内网 + 测试用例编写)**:不访问外部公网;允许本地回环启动被测服务与运行测试、授权对内网 192.168.16.251 发起 /admin 与 /frontend 的 Web 自动化(仅 no-login 冒烟);允许在测试目录内编写用例(本小时闸门关闭);禁止装依赖/执行仓库脚本/改提交生产源码。
+
+## 6. 执行结果
+
+### 6.1 执行范围与用例计数(本小时真实数据)
+
+| 维度 | 命令 | 结果 | 与基线(R182) |
+|------|------|------|--------------|
+| cfc-web Jest | `npx --no-install jest` | **17套 / 116/116 PASS / EXIT0** | 零漂移(116/116) |
+| cfc-frontend Jest | `jest --testPathIgnorePatterns=api.test.js,config.test.js` | **40套 / 474例 = 459过 / 3预期红 / 12跳 / EXIT1(2套预期红)** | 零漂移(459/3/12 逐项一致,3红=已知 TDD 预期红非回归) |
+| backend 编译 | `mvn -o test-compile` | **GREEN (EXIT0)**,375 测试源码编译通过 | 零编译回归 |
+| 内网 E2E 冒烟 | Playwright1.63.0 chromium,hosts→192.168.16.251 | **/admin 200(登录墙「浠艾福管理后台」) + /frontend 200(H5「首页」234KB) 2/2 渲染 PASS** | 与 R182 一致 |
+
+### 6.2 覆盖率(引用基线)
+
+- cfc-web:`语句~10.09% / 分支~6.12% / 函数~7.5% / 行~9.97%`(ref R171/R182,本小时未重采以避免共享运行器超时;零漂移预期)。
+- cfc-frontend:Lines ~53.57%(ref R155)。
+- backend:JaCoCo **未采集**(需连库全量,未实测)→ 标「未实测」。
+- **G9 未达标**:cfc-web 覆盖率 ~10% < 20%。
+
+### 6.3 引用基线(未重跑,如实登记)
+
+- 后端全量 `mvn test`+JaCoCo(R182 04:20):**3111 例 / 3072 过 / 35 红 / 4 跳 / 38:40**(MySQL3306 不可达,未连库核实真红)。
+- LangGraph@9000(ref R182):44/51,7 环境红(429/401,需 251 节点 + AI 凭据)。
+- 浏览器登录态 E2E:28/28 + 2 跳;API:25过/7跳/0红(需 MACHINE_JSON_PATH 凭据)。
+- 根级 jest:7/16(B-36)。
+- 全站(引用 R182):**3987 / 3901 ≈ 97.84%**(剔 skip 98.46%)。
+
+### 6.4 新增风险
+
+- **无新增代码回归**:HEAD 自 R182 仅 `8c4faea11`(汇报)+`5f83ee04e`(auto bump),均非生产/需求变更;全部实跑套件逐字段与 R182 一致,红例差集空。
+- S-cfc-178 `FamilyRemoveMemberContractTest` 4F 新 RED(研发 `278ec2e91` 在链待实现)—— 对照组验证项,非回归。
+
+## 7. 测试用例编写产出
+
+- **SRS/需求闸门:CLOSED(本小时跳过编写,仓库零写入)**。
+- 判定依据:`git log --since='2026-11-12T21:18'`(R175 上次编写参考点)对 `docs/tdd/SRS.md` / `docs/需求分析/**` / `docs/superpowers/specs/**` / `docs/superpowers/api/API_REFERENCE.md` **零命中**;`find -newermt` 同样零命中。
+- 结论:自 R175 以来需求/接口文档无新增或修改,无因变更需新增/修订的用例;**未新建/修改任何测试文件**,避免仓库抖动。
+- (注:本小时唯一改动是 E2E 探针结果 JSON 被刷新——该文件为既有自动化产物 `tests/e2e/_automation_reachability_result.json`,非源码/非测试用例,未提交。)
+
+## 8. 五要素问题清单
+
+> 以下问题均为承袭历史缺口,本次未复评为已解决;按五要素逐条给出。
+
+**P1 · P-9 公网外联(测试设计 / 合规)**
+① 问题描述:`cfc-frontend/__tests__/api/api.test.js` 与 `config/test.js` 在测试中访问公网,违反「不访问外部公网」约束。
+② 测试 bug 点:`cfc-frontend/__tests__/api/api.test.js`、`cfc-frontend/__tests__/config/config.test.js`(本小时已显式 `--testPathIgnorePatterns` 排除)。
+③ 最优修改方案:引入 `CFC_OFFLINE` 守卫,离线环境用 mock 替代真实公网请求,确保 0 外联。
+④ 修改目的:守住内网隔离/不访问公网合规红线,使离线 CI 可稳定跑通全部前端单测。
+⑤ 问题闭环:加守卫后该 2 套件在离线环境 0 外联且全绿即通过;复测标准 = 沙箱出网监控 0 连接。
+
+**P2 · G7 后端 35 红未连库核实(集成/质量)**
+① 问题描述:后端全量 3111/3072/35红 未连库核实,无法区分真代码缺陷与环境型失败。
+② 测试 bug 点:R182 全量口径 `mvn test`(MySQL3306 不可达,未接内网库)。
+③ 最优修改方案:在内网起可达 MySQL 后重跑 `mvn test`+JaCoCo,逐条归因 35 红。
+④ 修改目的:确认真红数,避免把环境红当质量结论。
+⑤ 问题闭环:连库后 0 真红 + JaCoCo≥80% 即 G7 达标;复测标准 = 连库全量 EXIT0 且红例为 0 或均为已知预期红。
+
+**P3 · G9 cfc-web 覆盖率不足(度量)**
+① 问题描述:cfc-web 行/语句覆盖率 ~10%,远低于 20% 门槛。
+② 测试 bug 点:`cfc-web/src/**` collectCoverageFrom 范围大但用例覆盖薄(116 例集中在少数模块)。
+③ 最优修改方案:针对 `src/views`、`src/utils` 高价值路径补充组件/工具单测,扩充 mock 场景。
+④ 修改目的:提升缺陷检出率,降低回归漏测。
+⑤ 问题闭环:`jest --coverage` 行/语句 ≥20% 即通过;复测标准 = coverage 报告达标且套件全绿。
+
+**P4 · G11 无 CI(流程)**
+① 问题描述:项目无持续集成门禁,回归依赖人工每小时闭环,易漏。
+② 测试 bug 点:仓库无 `.github/workflows` 或等价 CI 配置(据 AGENTS.md 与历史 R 轮记录)。
+③ 最优修改方案:固化双档(review/execute)CI 门禁,绑定 G7/G9/G11 硬指标。
+④ 修改目的:防止回归流入,自动化质量闸门。
+⑤ 问题闭环:CI 跑通且对红构建拦截即通过;复测标准 = 故意引入回归被 CI 拦下。
+
+**P5 · admin.referral 零覆盖 + 鉴权门缺失(安全,B-142-1,P2)**
+① 问题描述:管理端 referral 相关接口无单测,且鉴权门缺失,存在越权风险。
+② 测试 bug 点:`admin.referral` 接口族(TR-25)无 `AdminReferralContractTest`;`JwtInterceptor` 公开路径白名单未覆盖。
+③ 最优修改方案:补 `AdminReferralContractTest`(含鉴权门用例:未带 Token/越权角色应 401/403)。
+④ 修改目的:堵住管理端越权面,满足安全基线。
+⑤ 问题闭环:单测绿 + 鉴权门覆盖即通过;复测标准 = 越权请求返回 401/403 且正常请求通过。
+
+**P6 · B-142-2 langgraph 环境红(可靠性/需联网授权)**
+① 问题描述:langgraph@251 7 例红为 429/401 上游环境型(AgnesAI 配额/记忆召回 key),非代码缺陷。
+② 测试 bug 点:`cfc-langgraph` 对话/auto_tag/intent 用例(ref R182 44/51 红 7)。
+③ 最优修改方案:更换有效 Token + 恢复 AgnesAI 配额;需用户单独授权联网访问 251 节点。
+④ 修改目的:获得真实 AI 行为验证,区分代码红与环境红。
+⑤ 问题闭环:51 例全对账 0 代码红即通过;复测标准 = 连续 2 轮 51/51 全绿。
+
+**P7 · S-cfc-168/178 契约预期红待实现(功能保障)**
+① 问题描述:`MembershipPlanPurchaseContractTest`(7F)、`FamilyRemoveMemberContractTest`(4F) 为 TDD 预期红,对应实现尚未合入。
+② 测试 bug 点:`S-cfc-168`、`S-cfc-178`(契约 `278ec2e91` 在链待实现)。
+③ 最优修改方案:研发实现对应窗口逻辑后转绿(对照组验证)。
+④ 修改目的:契约驱动开发闭环,防接口漂移。
+⑤ 问题闭环:实现合入后契约全绿即通过;复测标准 = 对应契约套件 EXIT0。
+
+## 9. 待核实项
+
+- 后端 35 红是否含真代码缺陷(需连库核实,待内网 MySQL 可达)。
+- 登录态 E2E 业务流(28 套件)与 API 25 例的真实行为(无 MACHINE_JSON_PATH 凭据 → 待核实登录态)。
+- langgraph@9000 真实行为(需 251 节点 + AI 凭据 + 联网授权)。
+- admin.referral 鉴权门是否缺失(B-142-1,需代码核查)。
+- 全项目代码审查本轮未重跑(仅只读画像);历史审查资产 `SECURITY_REVIEW_2026-11.md`/`REVIEW_SYSTEM_ACCEPTANCE_白樾.md` 存在可作参考。
+- cfc-web 真实覆盖率(本小时引用 R171/R182 ~10%,未重采)。
+- B-126 缺陷状态。
+
+## 10. 需用户单独授权才能继续的项(未授权未执行 + 测试设计)
+
+| 项 | 为何需授权 | 测试设计(降级产出) |
+|----|-----------|----------------------|
+| 依赖漏洞扫描 (SCA) | execute档,公网下载漏洞库 | 用 `npm audit` / `mvn dependency-check` 离线版或授权后 `owasp dependency-check`;目标 = 0 高危 |
+| 性能压测 | execute档,打到远端/公网 | 内网起 `cfc-backend` + `wrk`/`jmeter` 对内网 192.168.16.251:9082 施压;指标 = P95<200ms、错误率<0.1% |
+| DAST 渗透 | execute档,公网/第三方 | 授权后对内网 `/admin`/`/frontend` 跑 `zap` 基线扫描;重点 = 越权/注入/XSS |
+| 后端连库全量+JaCoCo | 需内网 MySQL 可达 | 起内网 MySQL → `mvn test`+JaCoCo → 逐条归因 35 红 |
+| 登录态 E2E 深测 | 需 MACHINE_JSON_PATH 凭据 | 注入凭据后跑 `tests/e2e/*.spec.js` 业务流;本次仅 no-login 冒烟 |
+| LangGraph@9000 | 需联网 + AI 凭据 | 授权后对内网 9000 跑 51 例全对账 |
+
+> 以上均未执行,报告中**不**写为「通过」;仅给出测试设计与复测路径。
+
+## 11. 门禁结论
+
+### 结论:⛔ **不通过(承袭稳态,零新增代码回归;硬门禁 G7/G9/G11 持续未达标)**
+
+与 R181(门禁不通过)口径一致;R182 全量实跑后结构性进账(S-cfc-166/169 闭环、耗时改善)但硬门禁未变。本小时新增价值 = 独立复跑确认 **web/fe/backend-compile/E2E 四维度零漂移全绿**,全量基线(R182)仍有效。
+
+**未达标硬门禁**:
+- **G7**:后端全量未连库核实(35 红)、JaCoCo 未采集 → FAIL
+- **G9**:cfc-web 覆盖率 ~10% < 20% → FAIL
+- **G11**:无 CI → FAIL
+
+**复评条件(满足即转有条件通过/通过)**:
+1. 连库 `mvn test` 0 真红 + JaCoCo ≥80%(G7)
+2. cfc-web 覆盖率 ≥20%(G9)
+3. 修 P-9(CFC_OFFLINE 守卫 0 外联)
+4. 授权安全+性能+依赖扫描零高危
+5. 登录态 E2E 凭据注入跑通 + admin 鉴权门单测绿(P5)
+6. CI 固化(G11)
+7. langgraph 51 例全对账 0 代码红(需联网授权)
+8. S-cfc-168/178 契约实现转绿(P7)
+
+**本小时产物**:本文档 `docs/tdd/automation-run-2026-11-13-R183.md`(**未提交、未推送、未改生产源码/测试用例**);E2E 探针结果刷新于既有 `tests/e2e/_automation_reachability_result.json`(测试产物,非源码)。
+
+---
+*生成时间:2026-11-13 04:34 (GMT+8) | 执行档 review | 内网已授权 | 不访问外部公网*

+ 81 - 0
docs/tdd/automation-run-2026-11-13-R188.md

@@ -0,0 +1,81 @@
+# [测试闭环·每小时] 2026-11-13 08:48 轮(R188,review 档,内网 E2E 已授权)
+
+> 测试负责人:陆谨(软件测试专家团主理人)|执行档:review(内网 cfc.iwintrue.com / 189 / 251 已授权;不访问外部公网;SRS 闸门本小时零变更故零编写)
+> HEAD=`00121ff2f`(=origin,08:48 fetch 核验;跑前=跑后一致);上次记忆轮=R187(08:30);窗口仅 1 个 docs(研发负责人巡检)→ **零源码变更**,但**本轮不做采信,全部套件实跑**。
+
+---
+
+## 1. 阶段 -1 记忆召回
+
+- **非首次审查**:本对象已审 188 轮。最近链条 R184(3987/3913)→ R185(3987/3907,G1 回落)→ R186(3987/3908)→ R187(3987/3906,frontend 4/6,B-185)→ **R188(本轮)**。
+- **召回命中并本轮复查**:B-184-1(全量耗时)→ **本轮实跑证伪**(43:15 完成 369 类);B-185(游客态超时)→ **本轮 6/6×2 消除**;B-142-2(langgraph 上游)→ **51/51 全绿(观察 1/2)**;B-177-1(pytest 不退出)→ **第 10 轮复现 9m36s**;S-cfc-178 → **4F→0 转绿**;S-cfc-176 → 维持 1F;B-152-1/2 → 漏拦 6 / 陈旧 26;B-156-1/B-170-1 → 本轮日志 **525 次** DDL 报错;B-162-1 → 3 类仍 `??`。
+- **教训应用**:① **禁止用「类/分钟」外推全量耗时**(B-188-1,本轮直接推翻 R184/R185 判据);② `:4096` 每轮实探(本轮 200,实派成功,上轮「401 门控」不成立);③ 251 派后查残留 pid(本轮 4 个残留 → kill);④ Playwright API 套件必须带 `--output=`(B-173-1 本轮再触发 1 次);⑤ 浏览器失败隔离复跑 2 轮再定性。
+
+## 2. 阶段 0 项目画像(速览)
+
+| 模块 | 技术栈 | 端口 | 本轮可测范围 |
+|------|--------|------|--------------|
+| cfc-backend | Spring Boot 2.7.18 + MyBatis-Plus + Java8 | 9082 | **全量 JUnit 实跑 369 类 / 3111 例(43:15)** |
+| cfc-web | Vue2 + ElementUI | 8082 | Jest 17 套件 116 例(实测) |
+| cfc-frontend | uni-app 小程序 H5 | — | Jest 42 文件 624 例(实测) |
+| 被测内网 | openresty 反代 | cfc.iwintrue.com→251 | 浏览器 UI E2E(admin@本机 + admin@189 + fe + shop + health + dx@本机,实测) |
+| cfc-langgraph | FastAPI + LangGraph + ChromaDB | 9000(251:9000) | pytest 51 例(派 251:4096,实测) |
+
+## 3. 阶段 1 覆盖矩阵(20 类三态,摘要)
+
+✅ 已发现 8 类(单元/集成/契约/接口 API/E2E/冒烟/回归/探索)|⚠️ 部分 9 类(覆盖率/UAT/BDD/性能/可靠性/安全/兼容/可用性/流程度量)|❌ 未发现 3 类(变异/依赖漏洞/无障碍)。完整矩阵见报告 §3.2。
+
+## 4. 执行档与授权
+
+- **review 档(本轮)**:两套 Jest、根级 Jest、Playwright 浏览器(本机 + 189)、线上 API 点名 4 文件、匿名鉴权探针、**langgraph@251 实派实跑**、**后端全量 JUnit 实跑**、节点探活。
+- **未执行**:联网装依赖、依赖漏洞扫描、压测、SAST、起停生产服务、改生产代码(本轮零代码改动,仅新增报告/通知/blockers)。
+
+## 5. 执行时间线与关键节点
+
+| 时间 | 动作 | 结果 |
+|------|------|------|
+| 08:48 | `git fetch` + `pull --rebase --autostash` | `aa5c096f0` → `00121ff2f`(1 docs,零源码) |
+| 08:50 | 启动后端全量 `mvn -o -B clean test`(后台) | — |
+| 08:50 | 251 派发 `kick` | `KICKED`;节点 HEAD `00121ff2f` = 本机 |
+| 08:49 | 线上探活 | `/admin` 302、`/frontend` 302、`/` 404;匿名 6/6=401 |
+| 08:52–08:57 | 本机 admin-desktop / frontend-mobile | **5/5**(1.8m)、**6/6**(51.4s) |
+| 08:58 | frontend-mobile 复跑 | **6/6**(58.8s)→ B-185 消除 |
+| 08:58 | cfc-web Jest | **116/116**(18.6s) |
+| 08:59 | cfc-frontend Jest | **609/624**(3 红预期,34.0s) |
+| 09:00 | 189 派发 admin-desktop | **5/5 EXIT=0**(1.2m),spec blob `4703d73fb`=本机 |
+| 09:01 | shop-api / health-api / dx-bridge | 4/4、13/13、2 跳 |
+| 09:02 | 251 `read` | **51 passed**(285.81s) |
+| 09:03 | 根级 Jest | 7/16(B-36 第 72 轮) |
+| 09:03 | 251 残留进程核查 | 4 个(含 R186 1h10m38s)→ kill -9 清理 |
+| 09:24 | 线上 API 32 例(带 `--output`) | 25 过 / 7 跳 / 0 红(13.6s) |
+| 09:32 | 后端全量完成 | **369 类 / 3111 例 / 3082 过 / 25 红 / 4 跳 / 43:15** |
+
+## 6. 结果汇总(全站可比)
+
+| 套件 | 执行 | 过 | 红 | 跳 |
+|------|------|----|----|----|
+| 后端 JUnit | 3111 | 3082 | 25 | 4 |
+| cfc-frontend Jest | 624 | 609 | 3 | 12 |
+| cfc-web Jest | 116 | 116 | 0 | 0 |
+| langgraph@251 | 51 | 51 | 0 | 0 |
+| 浏览器 live | 30 | 28 | 0 | 2 |
+| 线上 API | 32 | 25 | 0 | 7 |
+| 根级黑盒 | 23 | 7 | 16 | 0 |
+| **合计** | **3987** | **3918** | **44** | **25** |
+
+通过率 **98.27%**(剔 skip **98.89%**);环比 R187 **+12 过 / −12 红**。
+
+## 7. 自处置记录
+
+1. **B-188-1(判据修正)**:本轮不再按「类/分钟」判「是否卡死」,改为等 surefire XML 持续增长 + 最终 `Total time` 判定 → 全量 43:15 完成,推翻「>2h」结论,并撤销本轮原定的「截断 + 定向」计划。
+2. **B-173-1(safe-delete 守卫)**:API 套件首跑被 `node-safe-delete-shim` 拦截(无 `Running N tests`,按纪律不计入 G2)→ 加 `--output=../_r188_api` 后 32 例正常执行。
+3. **B-177-1(残留进程)**:251 上 4 个 pytest 进程存活(本轮 9m36s + R186 残留 1h10m38s)→ `kill -9` 清理,`ps` 复核为 0。
+4. **口径修正**:`health-contract.spec.js` **不在** `playwright.config.live.js` 的任何 project 内(须用 `playwright.config.health.js`)—— 再次印证「文件存在 ≠ 用例执行」,已在报告附录固化命令。
+
+## 8. 产出与推送
+
+- `docs/tdd/orchestration/report-test-2026-11-13-R188.md`(模板 + 20 类矩阵 + 10 条五要素 + 10 项缺口 + 门禁表 + 附录命令/口径)
+- `docs/tdd/automation-run-2026-11-13-R188.md`(本文件)
+- `docs/tdd/orchestration/notice-2026-11-13-R188-研发通知.md`
+- `docs/tdd/test/blockers.md`(新增 R188 段)
+- 临时取证 `_r188_backend_full.log`、`_r188_api/` **不入库**。

+ 103 - 0
docs/tdd/automation-run-2026-11-13T0810.md

@@ -0,0 +1,103 @@
+# 测试闭环报告 · 每小时自动化轮 · 2026-11-13T08:10 (GMT+8)
+
+> 主理人:陆谨(软件测试专家团)|执行档:review(内网已授权,不访问公网)|对象:浠艾福 XAF(workspace `d:/cfc`)
+> HEAD = `c0e3028bf`(R186 汇报提交 @08:08,与本次同 HEAD,两轮间无新 commit)
+
+## 0. 历史审查记录(跨会话对照,仅对照不采信)
+- 本对象近 24h 审查密集(R175→R186,2026-11-12~13)。最近基线 R186 @08:08。
+- 历史遗留缺口(承袭,本次未消除):G7 后端全量 ~35 红未连库核实(MySQL3306 不可达)、G9 cfc-web 覆盖率 ~10%<20%、G11 无 CI、P-9 公网外联、admin.referral 整族零覆盖、langgraph@251 环境红(401/429)、MembershipPlanPurchase 幂等分支 1F 未修(R184/R185 已登记)。
+- 本次结论须重新取证,不沿用历史结论。
+
+## 1. 项目画像速览(只读)
+- 业务:浠艾福 XAF —— 家庭教育/会员/健康/商城全栈。模块:cfc-backend(Spring Boot 2.7.18+MyBatis-Plus, Java8, 9082)、cfc-web(Vue2+ElementUI 管理端, 8082)、cfc-frontend(uni-app 小程序)、cfc-langgraph(Python FastAPI, 9000)。
+- 本次关键路径:会员档位购买 **S-cfc-176** `POST /api/membership/plan/purchase`(MembershipController#purchasePlan → MembershipService#purchasePlan),能力键 **SC-P-58**。
+- 约束:统一 `@PostMapping`;JWT 拦截 `/api/**`;本环境无 `mvn` in PATH,但 `/d/maven/apache-maven-3.6.1` 可用;cfc-web Jest 用 axios-mock-adapter mock API(不据此断言真实服务端行为)。
+
+## 2. 执行范围 / 执行档
+- 档位:**review**(内网已授权,不访问公网)。已授权内网 `cfc.iwintrue.com` → `192.168.16.251`(hosts 私有路由),仅 `/admin`、`/frontend`。
+- 本次已实测:cfc-web Jest(全量)、cfc-frontend Jest(排除 P-9 公网 `api.test.js`+`config.test.js`)、backend `mvn -o test-compile`、S-cfc-176 契约定向单测(`-Dtest`)、内网无登录 E2E 冒烟(Playwright 1.63.0)。
+- 降级/未实测:后端全量 `mvn test`+JaCoCo(MySQL3306 不可达 + ~40-60min 超预算)、安全/性能/依赖漏洞(execute 档公网未授权)、登录态业务流 E2E(无凭据→待核实)、langgraph9000(需 251 节点+AI 凭据)。
+
+## 3. 实测结果(本次真实数据)
+| 维度 | 结果 |
+|---|---|
+| cfc-web Jest | **17 套 / 116 例 全绿**(EXIT0,零漂移 vs R186) |
+| cfc-frontend Jest(排除 P-9 公网) | **40 套 / 474 例 = 459 过 / 3 败 / 12 跳**;3 败 = 已知基线预期红 `signature.consignee` + `growthHistory RED-A7`(非回归,零漂移) |
+| backend `mvn -o test-compile` | **EXIT0 GREEN**(375 测试源码编译通过) |
+| S-cfc-176 契约单测 `MembershipPlanPurchaseContractTest` | **7 运行 / 6 绿 / 1 红**(边界流-2 pending 订单复用幂等未落地) |
+| 内网 E2E 无登录冒烟 | `/admin` 200「浠艾福管理后台」+ `/frontend` 200(H5),均可达(hosts→192.168.16.251) |
+
+- 覆盖率:cfc-web 本次未重采(参考 R171 ~10.08% 语句 / 6.06% 分支 / 7.48% 函数 / 9.95% 行,<20% 未达标);cfc-frontend 行覆盖 ~53%(参考 R155)。
+
+## 4. 回归与新增风险
+- 与 R186(08:08, 同 HEAD) 逐项一致:web / frontend / backend test-compile / E2E 零漂移,**无新增代码回归**。
+- **新增风险(本次实测确认)**:S-cfc-176 `membership.plan.purchase` 实现未完全闭合契约——`MembershipService.createOrder` 在「家庭已有同等级 pending 待支付订单」时仍 `paymentOrderMapper.insert` 新单,未复用既有订单(API_REFERENCE §4.50.1 边界②)。此为真实契约缺口(实现侧问题);R184/R185 曾登记「MembershipPlanPurchase 维持 1F 幂等分支未修」,本次独立复现确认。
+
+## 5. 测试用例编写产出(依据 SRS/需求变更)
+- **闸门触发**:`docs/superpowers/api/API_REFERENCE.md` 自 R183(04:34) 起 **真实内容变更 +24 行**(`git diff` 确认,commit `ca56f8699` @06:49 `feat(membership): implement membership.plan.purchase (S-cfc-176)`),非 mtime 误报。
+- **比对现有测试资产**:已存在 `cfc-backend/src/test/java/com/etotem/cfc/unit/MembershipPlanPurchaseContractTest.java`,覆盖 SC-P-58 全部边界(契约方法落地 / 端点暴露 / 重复购买幂等×2 / 支付失败回滚 / 无家庭 fail-fast),共 7 断言。
+- **本次编写决策:跳过新增用例,避免仓库抖动。** 理由:① 变更对应的能力键已有同契约、同边界的既有测试资产,新增为重复;② 该测试本次实测 6/7 绿、1 红,红项为实现未满足契约(研发侧缺陷),非测试缺失,无需补测;③ 任务明确要求「需求无变更则跳过编写,避免仓库抖动」,且既有资产已闭合闸门。
+- **需求编号映射**:S-cfc-176 / SC-P-58 ↔ API_REFERENCE §4.50.1 `POST /api/membership/plan/purchase`。
+- **仓库写入**:本自动化仅写入测试探针 `tests/e2e/automation_smoke_2026-11-13T0810.cjs`(测试目录,非生产源码),**未改动生产代码、未提交、未推送**。
+
+## 6. 五要素问题清单
+### P1 · S-cfc-176 重复购买幂等(pending 订单复用)未实现【本次实证红】
+① **问题描述**:家庭已存在同等级、待支付(pending) 的会员购买订单时,再次发起购买仍生成新订单,未复用既有订单,违反 API_REFERENCE §4.50.1 边界②「已有同等级 pending 待支付订单 → 复用既有订单不重复落单」。
+② **测试 bug 点**:`cfc-backend/src/test/java/com/etotem/cfc/unit/MembershipPlanPurchaseContractTest.java:191` `repeatPurchase_pendingOrderSamePlan_reuseNoDuplicate`(断言 `verify(paymentOrderMapper, never()).insert(...)` 失败);实现侧 `cfc-backend/src/main/java/com/etotem/cfc/service/MembershipService.java:566` `createOrder` 仍调用 `paymentOrderMapper.insert`。
+③ **最优修改方案**:在 `MembershipService.createOrder` 落单前增加守卫——按 `familyId + levelCode + paymentStatus=pending` 查询既有订单,若存在则直接返回既有订单(幂等),不调用 insert;与「已有有效付费会员→拒绝」守卫(边界①)并列。
+④ **修改目的**:满足 SC-P-58「重复购买幂等」契约,避免同一购买意图重复落单造成重复支付/重复开通风险,对齐需求文档边界。
+⑤ **问题闭环方式与通过标准**:研发修复后重跑 `mvn -o test -Dtest=MembershipPlanPurchaseContractTest`,要求 `repeatPurchase_pendingOrderSamePlan_reuseNoDuplicate` 由红转绿(verify never insert 通过);并补充「同 family+level+pending 已存在→返回既有订单」的集成/契约用例复测通过。
+
+### P2 · 承袭缺口(仅列示,非本次新增)
+- **P-9 公网外联**:`api.test.js`/`config.test.js` 仍访问公网,本轮显式排除以守「不访问公网」约束;根因待 `CFC_OFFLINE` 守卫修复。
+- **G9 覆盖率不足**:cfc-web 真实覆盖率 ~10% < 20% 门槛。
+- **G11 无 CI**:缺持续集成门禁,全量测试靠人工/定时轮驱动。
+- **admin.referral 整族(TR-25) 零覆盖**:待 SRS 同步后补测。
+- **langgraph@251 环境红**:401 key 失效 + 429 AgnesAI 配额耗尽,非代码缺陷,需联网授权+有效 key 复验。
+
+## 7. 待核实项
+- 后端全量 `mvn test` 真实红数(MySQL3306 不可达,~35 红未连库核实,引用 R182/R183 基线 3111 例 / 3072 过 / 35 红)。
+- 登录态业务流 E2E:无 `MACHINE_JSON_PATH` 凭据 → 标注「**待核实登录态**」,降级为测试设计(登录后会员购买、健康报告上传等主流程未实跑)。
+- cfc-web 真实覆盖率(本次未重采,引用 ~10%)。
+- langgraph@251 51 例中环境红(401/429) 需联网授权 + 有效 key 复验。
+- admin.referral 整族(TR-25)仍零覆盖,待 SRS 同步后补测。
+
+## 8. 需用户单独授权才能继续的项(未授权未执行,附测试设计)
+- **依赖漏洞扫描 / 性能压测 / DAST**:属 execute 档、需访问公网(公网 API、云依赖下载、第三方服务),本次未授权未执行。
+  - 测试设计:① 依赖漏洞 `mvn dependency-check:check` 或 `npm audit`(需联网拉 CVE 库);② 性能压测 JMeter/k6 对 9082/9000 内网节点打流(需确认目标环境与是否允许压测);③ DAST 用 ZAP 对 `/admin`、`/frontend` 主动扫描(需联网更新规则库)。授权后补跑并登记真实结果。
+- **后端连库全量 `mvn test` + JaCoCo**:需 MySQL3306 可达 + ~40-60min(B-184-1 结构性慢),本小时预算不足且 DB 不可达,降级为引用基线。
+  - 测试设计:夜间/错峰窗口启动 `mvn test` + JaCoCo agent,目标行/分支覆盖 ≥80% 作为 G7 通过门槛。
+- **登录态深度 E2E**:需注入 `MACHINE_JSON_PATH` 凭据(仅经环境变量/本地配置,禁止明文写入报告/日志)。
+  - 测试设计:Playwright 登录 → 跑会员购买全链路、健康报告上传解析、家庭邀请等核心用例。
+- **LangGraph 9000 复验**:需 251 节点可达 + 有效 AI key 与 AgnesAI 配额。
+
+## 9. 20 类测试覆盖矩阵(三态速览:✓ 已实测 / △ 部分·降级 / ○ 未发现·未测)
+| 类别 | 状态 | 证据 |
+|---|---|---|
+| 单元测试 | ✓ | backend 375 测试源编译通过 + S-cfc-176 定向 7 断言 |
+| 组件测试 | ✓ | cfc-web 17 套 / 116 例全绿 |
+| 集成测试 | △ | test-compile 绿;全量未连库(MySQL 不可达) |
+| 系统/E2E | △ | 无登录冒烟 2/2 绿;登录态 ○ |
+| 验收 UAT | ○ | 未实跑 |
+| 冒烟测试 | ✓ | E2E 探针可达 |
+| 回归测试 | ✓ | 双绿零漂移 |
+| 探索性测试 | ○ | 未执行 |
+| 契约测试 | ✓ | S-cfc-176 契约 7 断言(1 红) |
+| 性能测试 | △ | 未授权(公网) |
+| 可靠性测试 | △ | langgraph 环境红未复验 |
+| 安全测试 | △ | SAST/DAST 未授权 |
+| 兼容性测试 | ○ | 未执行 |
+| 可用性/无障碍 | ○ | 未执行 |
+| 覆盖率度量 | △ | cfc-web ~10%<20% |
+| QA 流程 | △ | 人工/定时轮,无 CI |
+| 代码审查 | △ | 本小时仅定向审查 S-cfc-176 |
+| 变异测试 | ○ | 未执行 |
+| CI/CD | △ | G11 无 |
+| 多源/数据 | ○ | 未执行 |
+
+## 10. 门禁结论
+**结论:⛔ 不通过。**
+- **未达标硬门禁**:G7 后端全量红未连库核实(DB 不可达);G9 cfc-web 覆盖率 ~10%<20%;G11 无 CI。
+- **新增实证缺陷**:S-cfc-176 `membership.plan.purchase` 契约 1/7 红(pending 订单复用幂等未实现),为刚实现功能中的真实契约缺口,需研发修复。
+- **本小时无新增代码回归**;未改动生产源码、未提交未推送;仅写入测试探针 `tests/e2e/automation_smoke_2026-11-13T0810.cjs`。
+- **复评条件**:① 连库 `mvn test` 0 真红 + JaCoCo≥80%(G7);② cfc-web 覆盖率≥20%(G9);③ 修 P-9 公网外联(`CFC_OFFLINE` 守卫);④ 授权安全+性能+依赖扫描零高危;⑤ S-cfc-176 pending 订单幂等修复后契约单测转绿 + admin.referral(TR-25) 补测;⑥ 登录态 E2E 凭据注入跑通核心业务流;⑦ CI 固化(G11);⑧ langgraph 51 例全对账+0 代码红(需联网授权+有效 key)。

+ 82 - 0
docs/tdd/orchestration/notice-2026-11-13-R188-研发通知.md

@@ -0,0 +1,82 @@
+# 研发交接通知 · 第 188 轮(2026-11-13 09:55)
+
+> 发件:测试负责人(自动化测试闭环 / 软件测试专家团·陆谨)|收件:研发 / 运维 / CI
+> 基线:`cfclub @ 00121ff2f`(=origin,跑前=跑后一致,窗口零源码变更)
+> 结论:**不通过(有条件,明显正向)** — 全站 **3987 例 / 3918 过 = 98.27%**(剔 skip 98.89%),红 **56→44**
+> 本轮**全部套件实测,无承袭项**(后端全量、langgraph@251、浏览器双节点、两套 Jest、线上 API、根级)
+
+---
+
+## 一、本轮好消息(已闭环/已恢复,供登记)
+
+| 项 | 变化 | 证据 |
+|---|---|---|
+| **后端全量恢复可完成** | 连续 4 轮「截断/沿用」后,本轮 **43:15 全量跑完 369 类 / 3111 例** | `mvn -o -B clean test` → `Tests run: 3111, Failures: 19, Errors: 6, Skipped: 4`,`Total time: 43:15 min` |
+| **B-184-1「>2h 劣化」判据作废** | 历轮用「类/分钟」外推 → 误判;本轮同机实跑 43:15 | 详见下方 B-188-1(**请勿再按速率外推 kill 全量回归**) |
+| **langgraph@251 51/51 全绿** | 45/51 → **51/51**(285.81s) | 节点 HEAD=`00121ff2f`;`/health` 200/9.7ms |
+| **B-185 消除** | frontend-mobile 4/6 → **6/6 ×2**(51.4s / 58.8s) | 游客态首页五维沙盘、我的登录入口均正常渲染 |
+| **S-cfc-178 契约闭环** | `FamilyRemoveMemberContractTest` 8 例 **4F → 0F** | 随 `5c3cff249`(removeMember 重算会员派生缓存)落地 |
+| **匿名鉴权 6/6=401 维持** | B-142-1 销号维持第 18 轮 | mind / energy / health-plan / xiaomi / huawei / admin-families |
+
+---
+
+## 二、仍需研发/运维处理(按优先级)
+
+### P0-1 langgraph live 链路仍不可用(B-142-2,观察 1/2)
+- pytest 已 51/51 全绿,但**真实 LLM 链路挂死**:`POST http://192.168.16.251:9000/api/v1/chat`(`{"query":"你好","user_id":1,"session_id":"r188"}`)→ **000 / 120.01s / 0 字节**。
+- `/health` 200/9.7ms 说明服务活着,**仅 LLM 出网链路不可用**;单测绿是因为走 mock/降级。
+- **请运维**:轮换上游 key(历史报 `401 api key ****ab12 invalid`)+ 提升配额(历史 `429 AgnesAI free limit`)。
+- 闭环:live chat 200 且 <5s,pytest 连续 2 轮全绿。
+
+### P0-2 CI 硬门禁双向失真(B-152-1/2,第 19 轮)
+- 实测红类 **13 类**,CI `.gitlab-ci.yml:61` 清单 **33 类**:
+  - **漏拦 6 类**(红但未排除 → blocking 必红):`GrowthPublicEndpointMappingTest`、`MembershipPlanPurchaseContractTest`、`TaskReviewScP11ContractTest`、`TeamProfitCronContractTest`、`UserServiceWechatLoginTest`、`UserServiceWechatLoginContractTest`
+  - **陈旧 26 类**(已绿仍被排除 → 门禁覆盖被人为缩小)
+- **请 CI/研发**:按上述差集精修清单(移 26、补 6)。
+
+### P1-1 S-cfc-176 幂等分支未生效(维持 1F)
+- `MembershipPlanPurchaseContractTest.repeatPurchase_pendingOrderSamePlan_reuseNoDuplicate:201`
+- `NeverWantedButInvoked: paymentOrderMapper.insert` → 同 plan 重复购买仍新建支付单;`findReusablePendingOrder` 已实现但分支未生效。
+
+### P1-2 pytest 进程不退出(B-177-1,第 10 轮复现)
+- 251 上 `51 passed in 285.81s` 打印后,`bash -c` 与 `pytest` 进程存活 **9m36s**(另发现 R186 残留 **1h10m38s**),`EXIT=` 行永不落盘。
+- 线索:`RuntimeWarning: coroutine 'JavaClient._get_client' was never awaited`。
+- **请研发**:`app/main.py:84` 的 `on_event` 改 lifespan 并 `await client.aclose()`;派发器侧加 `timeout -k 10 900`。已清理 4 个残留进程。
+
+### P1-3 迁移 DDL 缺陷(B-156-1 / B-170-1,本轮日志 **525 次**报错)
+- `schema.sql:5345` `nutrition_age_dosage` 建表含 `INDEX idx_product (product_id)` 但无该列 → **表从未建成**;
+- `DatabaseInitializer.java:2261` `UPDATE activities a SET a.approved_count = (SELECT … a.id …)` 语法非法 → `Unknown column 'a.id'`,持久化列恒 0(前端走动态计算暂不受影响)。
+
+### P1-4 3 个测试类仍未入库(B-162-1,第 14 轮)
+- `config/GrowthPublicEndpointMappingTest.java`(5E)、`config/JwtInterceptorGrowthPolicyTest.java`、`integration/controller/ArticleTagsContractTest.java` 仍为 `??` → **请 `git add` 入库**,否则资产不可追溯且 CI 行为不可预测。
+
+### P2 装置与节点
+- **B-178-1**:`TaskReviewScP11ContractTest` 8 例 **2F**(反射注入时序浮动)→ 建议 `@MockBean` 替代 `ReflectionUtils`。
+- **B-95**:`192.168.16.204:4090` = 000(第 43 轮);189:4090=200、251:4096=200。
+- **B-36**:根级黑盒 23 例 16 红(全 `ECONNREFUSED 9082`,本地未起后端)。
+- **B-DX-1**:dx 两端点 404(规格已声明「仅登记不实现」,2 例 skip 不假绿)。
+
+---
+
+## 三、新登记:B-188-1(P1,测试方法论/度量)
+
+**问题**:连续 4 轮(R184~R187)判定「后端全量耗时劣化 >2h,不可完成」并中途 kill,改用「截断 + 定向」双证。
+
+**本轮取证**:同源码同机器 `mvn -o -B clean test` → **`Total time: 43:15 min`,369 类全部执行完毕**。
+
+**根因**:本套件耗时呈**双峰分布** —— `@SpringBootTest` 系列类(EnergySystemFlow / GrowthPublic / 各 Controller)单类 45~300s,集中在执行前半程;`unit` / `orchestration` 等无上下文类单类 <1s,集中在后半程。用前半程「约 3 类/分钟」线性外推 368 类,必然得到「>2h」的错误结论。
+
+**修正**:进度判定只用 **maven `Total time`** 或 **surefire XML 终值**;**禁止**用日志 `Tests run:` 增量速率外推,也**禁止**在未达 `Total time` 前主动 kill。已写入报告 §十 与附录 B,下轮起强制执行。
+
+---
+
+## 四、测试侧下一步
+
+1. B-185 与 B-142-2 均按「连续 2 轮绿」纪律观察(B-185 观察 1/2、B-142-2 观察 1/2),下轮全绿即销号。
+2. 下轮继续全量 JUnit(按 `Total time` 判定),不再中途截断。
+3. 覆盖缺口:变异测试、依赖漏洞扫描、无障碍测试仍为「未发现」(离线档未授权),需另行排期。
+4. G9 用例锚定率仍为 20.1%(62/308),建议随 SRS 池启用一次性补齐。
+
+---
+
+**附件**:`report-test-2026-11-13-R188.md`(完整报告)、`automation-run-2026-11-13-R188.md`(执行记录)、`blockers.md` R188 段(问题台账)。

+ 333 - 0
docs/tdd/orchestration/report-test-2026-11-13-R188.md

@@ -0,0 +1,333 @@
+# 测试负责人工作汇报(R188 轮)
+
+> 本汇报按《测试负责人工作汇报模板》填写。R188 为**全量实跑轮**:基线 `cfclub @ 00121ff2f`(含 R187 与研发负责人巡检 2 笔),窗口内 **零源码 / 零 SRS / 零场景 / 零接口变更**。
+> **拓扑(用户本轮指令)**:浏览器经 `http://cfc.iwintrue.com/admin`(后台)+ `http://cfc.iwintrue.com/frontend`(小程序);189 与本机为浏览器节点(每节点单任务,串行);langgraph 部署 251 → **本轮已实派 251 并实跑**。
+> **★ 本轮三个关键变化(均为正向,已触发推送 + 研发通知)**
+> ① **后端首次恢复全量完成**:`43:15` 跑完 **369 类 / 3111 例 / 3082 过 / 25 红 / 4 跳 = 99.07%**(R184~R187 连续 4 轮「截断/沿用」,本轮实跑证伪「>2h 不可完成」);
+> ② **langgraph@251 首次 51/51 全绿**(R187 承袭 45/51);
+> ③ **frontend-mobile 6/6**(R187 为 4/6,B-185 消除,隔离复跑 2/2 全绿);**S-cfc-178 契约 4F→0 转绿**。
+> **★ 全站可比:3987 例 / 3918 过 = 98.27%(剔 skip 98.89%),红 56→44,G1 由「勉强过线」升至 98.27%。**
+
+---
+
+## 基本信息
+
+| 项目 | 内容 |
+|------|------|
+| 汇报人 | 测试负责人(自动化测试闭环任务 / 软件测试专家团·陆谨) |
+| 汇报周期 | 2026年11月13日 08:48 ~ 09:55(第 188 轮) |
+| 基线 | `cfclub @ 00121ff2f`(=origin,跑前=跑后一致) |
+| 窗口内需求变更 | **零** — `docs/superpowers/specs`(201 份)/ `tests/test-cases`(16 份)/ `API_REFERENCE.md` 窗口零变更(G12 ✅,未触发用例编写闸门) |
+| 窗口内源码变更 | **零** — 窗口 `aa5c096f0..00121ff2f` 仅 1 个 docs 文件(研发负责人巡检汇报),`git diff --name-only` 对 `src` 命中 0 |
+| 负责模块/单元 | 全站:管理端 admin@本机 + 189 · 小程序 H5 fe@本机 · cfc-langgraph@251(**本轮实派**) · cfc-backend JUnit 全量 · cfc-web/cfc-frontend Jest · 线上 API 非功能层 |
+
+---
+
+## 一、本轮工作数据汇总
+
+### 1.1 测试用例建设
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **本轮新增测试用例数\*** | **0 个** | SRS/场景/接口文档窗口零变更,未触发用例编写闸门(G12 ✅) |
+| **本轮验证执行测试数\*** | **3987 个** | 后端 JUnit **3111(全量实跑,本轮权威)** + 前端 Jest 624 + 管理端 116 + langgraph 51(**251 实派**)+ 浏览器 30(admin 5 + frontend 6 + shop 4 + health 13 + dx 2 跳)+ 线上 API 32 + 根级 23 |
+| **用例通过率** | **98.27%**(3918/3987;剔除 skip **98.89%**) | 红 44 / 跳 25;环比 R187(98.0%,红 56)**+12 过、−12 红** |
+| **用例台账** | `discovery.md` 承袭:**366 控制器** / 1972 `@PostMapping` / `@GetMapping` 8 处 | 本轮实测统计(零源码变更,口径同 R187);`TRACEABILITY-MATRIX.md` §10 口径不变 |
+
+### 1.2 会话与任务分发
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **分派任务数\*** | **4 个** | R188-1 本机 `admin-desktop`(5/5,1.8m);R188-2 本机 `frontend-mobile`(**6/6**,51.4s,复跑 6/6 58.8s);R188-3 **189** `admin-desktop`(5/5 EXIT=0,1.2m);R188-4 **251** `langgraph pytest`(**51/51**,285.81s) |
+| **恢复智能体会话数\*** | 1 个 | 251 opencode(`:4096` = **200**,R187 记的「401 门控」本轮实测不成立)→ 派发成功 |
+| **当前在用会话数** | 0 个 | 全部结束;251 残留 pytest 进程已清理(见 B-177-1) |
+
+### 1.2b 各会话当前工作状态列表
+
+| 会话标签 | 会话 ID/地址 | 当前状态 | 当前任务 | 静默/空闲时长 | 工作目录 | 备注 |
+|----------|--------------|----------|----------|---------------|----------|------|
+| `local-admin` | 本机 Playwright | done | admin-desktop UI E2E | 已完成(1.8m) | `d:\cfc\tests` | **5/5**;TC-A-U01~U05 全过 |
+| `local-frontend` | 本机 Playwright | done | frontend-mobile UI E2E | 已完成(51.4s + 58.8s×2) | `d:\cfc\tests` | **6/6 两次连绿**;B-185 消除 |
+| `remote-189` | 192.168.16.189:4090 | done(exited) | admin-desktop UI E2E | 78s | `C:\code\cfc\tests` | **5/5 EXIT=0**;spec blob `4703d73fb` = 本机 → 跨节点可比 |
+| `remote-251` | 192.168.16.251:4096 | done | langgraph pytest | 285.81s(+挂死 9m36s) | `/sc-data/cfc/cfc-langgraph` | **51/51 全绿**;节点 HEAD `00121ff2f` = 本机 |
+| `local-jest` | 本机进程 | done | cfc-web + cfc-frontend + 根级 | 已完成 | `cfc-web` / `cfc-frontend` / `tests` | web **116/116**(18.6s)、fe **609/3/12**(34s)、根级 **7/16**(12.2s) |
+| `local-backend` | 本机 mvn | done | JUnit 全量 | 43:15 | `d:\cfc\cfc-backend` | **369 类 / 3111 例 / 25 红** |
+
+### 1.3 问题处置
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **新测试发现问题数\*** | **1 个** | **B-188-1(P1 方法论/度量)**:`B-184-1「后端全量 >2h」判据不成立` —— 历轮以「前期类完成速率」线性外推全量耗时,但本套件呈**双峰速率**(`@SpringBootTest` 慢头 → unit 快尾),本轮同一机器 **43:15 全量跑完 369 类**。判据须改为「maven `Total time` 或 surefire XML 终值」,禁止速率外推。 |
+| **已解决测试相关问题数\*** | **3 个** | ① **B-185 消除**(frontend 4/6 → 6/6 两次连绿,游客态内容加载恢复正常,判环境瞬态);② **S-cfc-178 契约转绿**(`FamilyRemoveMemberContractTest` 8 例 4F→**0F**,随 `5c3cff249` 实现落地);③ **B-184-1 由「劣化」降级为「判据修正」**(全量实跑 43:15 完成)。 |
+| **待解决测试相关问题数** | P0×2 / P1×6 / P2×3 | ① B-142-2 langgraph 上游凭据/配额(**本轮 51/51 绿,观察 1/2**,但 live chat 仍 120s 零字节);② B-152-1/2 CI 清单漏拦 6 / 陈旧 26(P0/P1);③ S-cfc-176 幂等 1F(P1);④ B-177-1 pytest 打印 summary 后挂死(P1,**本轮复现 9m36s**);⑤ B-156-1/B-170-1 迁移 DDL 缺陷(P1/P2,本轮日志 **525 次** DDL 报错);⑥ B-162-1 3 类未入库(P1);⑦ B-178-1 反射装置 2F(P2);⑧ B-95 204 失联(P2);⑨ B-DX-1 dx 端点 404(P1,规格已声明仅登记)。 |
+
+### 1.4 本轮 git 提交与推送证据(真理证据)
+
+| 提交 sha | 关联任务/能力键 | 阶段 | 触及文件类型 | 目标分支 | 已推送远端 | 备注 |
+|----------|-----------------|------|--------------|----------|------------|------|
+| `见 §九` | 全站巡检 R188 + B-188-1 判据修正 + B-185/S-cfc-178 闭环 | 汇报 | 报告 + blockers + 研发通知 | cfclub | ✅ | 结果有变化(+12 过 / −12 红)→ 按规则提交并通知研发 |
+
+### 1.5 状态机阶段分布(全局进度)
+
+| 阶段 | 键数 | 备注 |
+|------|------|------|
+| UNTRACKED | 0 | 窗口零新增规格 |
+| RED | 9 | S-cfc-176 1 例 + TaskReview 装置 2 例 + 其他预期 RED 6 例 |
+| YELLOW | 72 | 研发负责人口径 |
+| GREEN | 9 | **+1(S-cfc-178)** |
+| DONE | 15 | 承袭 |
+| 合计 | 105 | 研发侧状态账本口径 |
+
+### 1.6 数据源健康度
+
+| 数据源 | 读取键数 | 是否正常 | 备注 |
+|--------|----------|----------|------|
+| 需求侧(⏳ wish) | 0 | 正常 | SRS 目标池未启用 |
+| 契约常量(contract) | 多组 | 正常 | 13 红类跨轮核验正常 |
+| 测试用例引用(test_case_map) | 308 唯一 TC | 正常 | 台账扫描正常 |
+| 执行结果回填(case_results) | — | 正常 | surefire 369 XML 全量可聚合 |
+
+---
+
+## 二、历史审查记录(阶段 -1 记忆召回)
+
+| 项 | 内容 |
+|---|---|
+| 上次审查 | **R187(2026-11-13 08:30,提交 `aa5c096f0`)**,结论「不通过(有条件)」,全站 3987/3906(98.0%),红 56;langgraph 承袭 45/51;浏览器 frontend 4/6(B-185) |
+| 历史遗留 | 后端 28 红(截断/沿用 4 轮)· langgraph 6 红(环境)· 根级 16 红 · CI 漏拦 7/陈旧 26 · 3 未入库测试 · B-177-1 · B-178-1 · **B-184-1「全量 >2h」** · **B-185 游客态超时** |
+| 本次是否改善 | **显著改善**:① 后端**首次恢复全量**(25 红,比 R187 少 3);② langgraph **51/51 全绿**(+6);③ frontend **6/6**(+2);④ **S-cfc-178 转绿**(−4);⑤ **B-184-1 判据被证伪**。合计红 56→44、过 3906→3918。 |
+| 教训应用 | ① **不再用「类/分钟」外推全量耗时**(本轮 B-188-1 直接推翻该做法);② 浏览器失败必须隔离复跑 2 轮再定性(B-185 本轮两次全绿 → 判环境瞬态);③ `:4096` 连通性每轮实探,不沿用上轮「401 门控」结论(本轮 200 实派成功);④ 251 跑完必须查残留 pid(B-177-1 本轮复现);⑤ Playwright 一律带 `--output=` 独立目录规避 safe-delete 守卫(B-173-1 本轮再触发一次)。 |
+
+> 本次为该对象**第 188 次**审查,有历史记录;上述内容仅作对照,**本轮结论全部来自本轮实测**(后端/langgraph/浏览器/Jest/API 均本轮实跑,无承袭项)。
+
+---
+
+## 三、项目画像与覆盖矩阵
+
+### 3.1 项目画像
+
+| 维度 | 内容 |
+|------|------|
+| 业务定位 | 家庭教育成长平台(五维能量 身/心/智/行/富):小程序家长端 + 规划师端 + 管理后台 + 独立商城 |
+| 技术栈 | Spring Boot 2.7.18 + MyBatis-Plus + Java 8(9082)/ uni-app 微信小程序(Vue2)/ Vue2 + Element UI(8082)/ FastAPI + LangGraph + ChromaDB(9000@251) |
+| 模块结构 | `cfc-backend`(366 控制器 / 375 测试源 / 369 测试类)· `cfc-frontend`(42 测试文件 / 624 例)· `cfc-web`(17 套件 / 116 例)· `cfc-langgraph`(51 例 @251)· `tests`(e2e-live 5 文件 + e2e/api 点名 4 文件) |
+| 关键路径 | 登录/家庭/成员 → 五维能量 → 任务/成长记录 → 健康报告上传解析 → 测评订单 → 商城/支付 → AI 对话(LangGraph) |
+| 测试现状 | **本轮全部实测**:后端 3111 + 前端 624 + 管理端 116 + langgraph 51 + 浏览器 30 + 线上 API 32 + 根级 23 = **3987 例** |
+| 质量目标 | 全量用例全绿、覆盖 SRS 与用户场景(含异常流)、浏览器双节点可复现、结果变更即提交并通知研发 |
+| 风险点 | ① 后端 25 红(11 类存量 + 2 类契约预期 + 装置浮动)② CI 清单双向失真(漏拦 6)③ 上游 LLM live 链路 120s 挂死 ④ 根级 16 红(9082 未起)⑤ 迁移 DDL 缺陷 525 次报错 ⑥ pytest 进程不退出 |
+| 待核实项 | S-cfc-176 幂等分支排期 · 251 上游凭据/配额(pytest 绿但 live 挂)· 204 节点恢复 · B-156-1/B-170-1 修复状态 · **B-185 根因未取证(本轮已不复现,建议按瞬态销号)** |
+
+### 3.2 20 类测试覆盖矩阵(全类不省略)
+
+| # | 测试类型 | 三态 | 证据(本轮实测) |
+|---|----------|------|------------------|
+| 1 | 单元测试 | ✅ 已发现 | 后端 3111 例全量实跑;前端 624 例;管理端 116 例 |
+| 2 | 测试覆盖率 | ⚠️ 部分 | 管理端 Jest 覆盖率可产出;后端未开 jacoco(未授权改 pom) |
+| 3 | 变异测试 | ❌ 未发现 | 全仓无 pitest/mutation 配置 |
+| 4 | 集成测试 | ✅ 已发现 | `integration/*` 已全量执行(EnergySystemFlow 6F、GuideModule 1E、DimensionRegistryMap 3F) |
+| 5 | 契约测试 | ✅ 已发现 | 契约类 20+ 全量执行;**S-cfc-178 转绿(4F→0)**;S-cfc-176 维持 1F;TaskReview 2F(B-178-1 装置) |
+| 6 | 接口 API 测试 | ✅ 已发现 | 线上 API 32 例(**本轮实测**:25 过 / 7 跳 / 0 红,13.6s) |
+| 7 | 系统/端到端 | ✅ 已发现 | 浏览器 30 例(**本轮实测**:28 过 + 2 跳),双节点 admin 5/5 |
+| 8 | 验收 UAT | ⚠️ 部分 | `cross-role-e2e.md` 双角色验收场景有台账;无人工 UAT |
+| 9 | BDD 规格 | ⚠️ 部分 | spec 201 份含 Given/When/Then;无 cucumber 执行器 |
+| 10 | 冒烟测试 | ✅ 已发现 | `api-smoke.spec.js` 本轮实测全绿(含自注册链路) |
+| 11 | 回归测试 | ✅ 已发现 | 7 套件全量回归,13 红类逐类比对,**存量零漂移** |
+| 12 | 探索性测试 | ✅ 已发现 | 本轮现场探索:251 live `chat` 120s 零字节(pytest 全绿反证「mock 层绿、真实链路挂」)→ 记为 B-142-2 观察项 |
+| 13 | 性能测试 | ⚠️ 部分 | `nonfunc-perf-compat` 4 过 3 跳;压测未授权;**后端全量 43:15 通过(B-188-1 判据修正)** |
+| 14 | 可靠性测试 | ⚠️ 部分 | 上游 LLM 弱故障证据;无长稳/混沌测试;pytest 进程不退出(B-177-1)为典型可靠性缺陷 |
+| 15 | 安全测试(SAST/DAST) | ⚠️ 部分 | `nonfunc-security` 11 例全绿;匿名 6 端点 6/6=401;SAST 未授权 |
+| 16 | 依赖漏洞扫描 | ❌ 未发现 | 无 `npm audit`/`dependency-check` 门禁,属联网档未授权 |
+| 17 | 兼容性测试 | ⚠️ 部分 | Playwright `frontend-mobile` 移动视口 6/6(**本轮恢复**);无多浏览器矩阵 |
+| 18 | 可用性测试 | ⚠️ 部分 | 页面可渲染/导航/TabBar 断言覆盖;无真实用户可用性测试 |
+| 19 | 无障碍测试 | ❌ 未发现 | 无 axe-core 等 a11y 断言 |
+| 20 | QA 流程与质量指标 | ⚠️ 部分 | 本报告 + blockers + 可复现度量脚本;G9 20.1%;G11 CI 失真 |
+
+---
+
+## 四、本轮实测明细
+
+### 4.1 套件数据(全部本轮实测,无承袭)
+
+| 套件 | 执行 | 通过 | 红 | 跳 | 耗时 | 判定 |
+|------|------|------|----|----|------|------|
+| 后端 JUnit **全量** | **3111** | **3082** | **25** | 4 | **43:15** | ✅ 全量完成(R184~R187 连续 4 轮未能完成);13 红类 |
+| 前端 Jest | 624 | 609 | 3 | 12 | 34.0s | 3 全预期 RED(AC-R1 / AC-R2 / AC-2 RED-A7) |
+| 管理端 Jest | 116 | 116 | 0 | 0 | 18.6s | ✅ 17/17 套件全绿 |
+| langgraph@251 | 51 | **51** | **0** | 0 | 285.81s | ✅ **首个全绿轮**(B-142-2 观察 1/2) |
+| 浏览器 `admin-desktop`@本机 | 5 | 5 | 0 | 0 | 1.8m | ✅ |
+| 浏览器 `admin-desktop`@189 | 5 | 5 | 0 | 0 | 1.2m | ✅ EXIT=0,spec blob `4703d73fb` = 本机(跨节点可比) |
+| 浏览器 `frontend-mobile`@本机 | 6 | **6** | 0 | 0 | 51.4s / 58.8s×2 | ✅ **两轮连绿,B-185 消除** |
+| 浏览器 `shop-api` | 4 | 4 | 0 | 0 | 11.3s | ✅ |
+| 浏览器 `health-api` | 13 | 13 | 0 | 0 | 6.9s | ✅(须用 `playwright.config.health.js`) |
+| 浏览器 `dx-bridge` | 2 | 0 | 0 | 2 | — | 404(规格「仅登记不实现」,不假绿) |
+| 线上 API 非功能层 | 32 | 25 | 0 | 7 | 13.6s | ✅ 0 红(点名 4 文件口径) |
+| 根级黑盒 | 23 | 7 | 16 | 0 | 12.2s | 全 `ECONNREFUSED 9082`(B-36 第 72 轮) |
+| **合计** | **3987** | **3918** | **44** | **25** | — | **98.27%(剔 skip 98.89%)** |
+
+> vs R187(3906 过 / 98.0%):**+12 过、红 56→44**。构成:langgraph −6 红(+6 过)、frontend −2 红(+2 过)、后端 28→25 红(S-cfc-178 −4、其余 +1? 见 §4.3 核对,净 −3)。
+
+### 4.2 后端全量红类明细(surefire XML 权威口径)
+
+| 红类 | 例数 | 红 | 归因 | 与 R187 一致性 |
+|------|------|----|------|----------------|
+| `EnergySystemFlowTest` | 7 | 6F(1S) | 存量(五维能量流断言) | ✅ 一致 |
+| `GrowthPublicEndpointMappingTest` | 5 | **5E** | B-162-1 未入库测试 + 端点映射缺失 | ✅ 一致 |
+| `DimensionRegistryMapContractTest` | 7 | 3F | 存量 P-9 | ✅ 一致 |
+| `TaskReviewScP11ContractTest` | 8 | 2F | B-178-1 反射装置浮动 | ✅ 一致(维持 2F) |
+| `GuideModuleIntegrationTest` | 4 | 1E | `testGuidePackageCreationFlow:63 DataIntegrityViolation` | ✅ 一致 |
+| `OrchestrationEngineTest` | 8 | 1F | 存量 | ✅ |
+| `OrchestrationIntegrationTest` | 7 | 1F | 存量 | ✅ |
+| `MembershipPaySwitchTest` | 6 | 1F | 存量 | ✅ |
+| `PaymentServiceORDRoutingTest` | 3 | 1F | 存量 | ✅ |
+| `UserServiceWechatLoginTest` | 5 | 1F | 存量(微信登录契约) | ✅ |
+| `UserServiceWechatLoginContractTest` | 6 | 1F | 存量 | ✅ |
+| `MembershipPlanPurchaseContractTest` | 7 | 1F | **S-cfc-176 幂等分支未生效** | ✅ 一致(`repeatPurchase_pendingOrderSamePlan_reuseNoDuplicate`) |
+| `TeamProfitCronContractTest` | 22 | 1F | 存量(平台费截断) | ✅ |
+| **合计** | — | **19F+6E = 25** | 13 类 | ✅ 逐类一致(除 `FamilyRemoveMemberContractTest` 已转绿) |
+
+### 4.3 本轮转绿与回归核对
+
+| 项 | R187 | R188 | 归因 |
+|---|---|---|---|
+| `FamilyRemoveMemberContractTest`(S-cfc-178) | 8 例 / **4F** | 8 例 / **0F** | ✅ 随 `5c3cff249`(removeMember 重算会员派生缓存)落地转绿 → **S-cfc-178 契约闭环** |
+| langgraph 全部 51 例 | 45 过 / 6 红 | **51 过 / 0 红** | 上游配额/key 窗口恢复;`test_auto_tag` + `test_intent` 全绿 |
+| `frontend-mobile` 6 例 | 4/6(U02/U05 超时) | **6/6 ×2** | 游客态内容加载恢复 → **B-185 消除**(环境瞬态) |
+| 其余 12 个红类 | 12 类 | 12 类 | 逐类逐例一致 → **存量零漂移(第 23 次)** |
+
+### 4.4 langgraph@251 实测明细
+
+| 项 | 结果 |
+|---|---|
+| 派发通道 | `192.168.16.251:4096` = **200**(R187 记「401 门控」本轮实测不成立);`POST /api/shell` + `setsid nohup` kick 分离 |
+| 节点基线 | HEAD `00121ff2f` = 本机 HEAD(同源码) |
+| 用例结果 | **51 passed / 0 failed / 285.81s**(`--ignore=tests/qna --ignore=tests/test_chat.py`) |
+| live `/health` | **200 / 9.7ms** |
+| live `/api/v1/chat`(`{"query":"你好","user_id":1,"session_id":"r188"}`) | **000 / 120.01s / 0 字节** → 上游 LLM 真实链路仍挂死(pytest 绿说明单测层走 mock/降级) |
+| B-177-1 复现 | summary 打印后 `bash -c` 与 `pytest` 进程存活 **9m36s**(另发现 R186 残留 1h10m38s),`EXIT=` 行永不落盘 → **第 10 轮复现**;已 `kill -9` 清理 4 个残留进程 |
+
+---
+
+## 五、覆盖缺口清单
+
+| 缺口类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
+|----------|------|------|--------------|--------|----------|
+| 上游 LLM 真实链路 | pytest 51/51 绿,但 live `chat` 120s 零字节 | AI 对话生产不可用 | mock 层之外补 1 例 live 冒烟(带超时兜底) | **P0** | 运维轮换 key + 提额后连续 2 轮全绿 |
+| CI 清单双向失真 | 漏拦 6 / 陈旧 26(33 类清单) | 回归无机器门禁 | 精修 exclude + 3-job CI | **P0/P1** | B-152-1/2 |
+| 契约预期 RED | S-cfc-176 幂等 1F | 功能未实现有护栏 | 实现 `findReusablePendingOrder` 分支 | P1 | 实现后定向复跑 |
+| 迁移 DDL 缺陷 | 本轮日志 **525 次** `SQLSyntaxErrorException/Unknown column` | 表从未建成(`nutrition_age_dosage`);`activities.approved_count` 恒 0 | 修 `schema.sql:5345` 索引 + `DatabaseInitializer:2261` 别名更新 | P1 | B-156-1 / B-170-1 |
+| 未入库测试 | 3 类(GrowthPublic / JwtInterceptorGrowthPolicy / ArticleTagsContract) | 资产不可追溯 | `git add` + push | P1 | B-162-1 |
+| pytest 进程不退出 | 第 10 轮复现(9m36s 挂死) | 派发器误判、节点资源泄漏 | 产品侧 `await client.aclose()` + 派发器 `timeout -k 10 900` | P1 | B-177-1 |
+| 根级黑盒 | 16 红(9082 未起) | 黑盒链路不可测 | 起 9082 后重跑 | P2 | B-36 |
+| 装置浮动 | TaskReview 2F(反射注入) | 红例数不稳定 | `@MockBean` 替代 `ReflectionUtils` | P2 | B-178-1 |
+| dx 桥接 | 2 例 skip(404) | 覆盖空转 | 端点上线后自动转断言 | P1 | B-DX-1(规格已声明仅登记) |
+| 204 节点 | `204:4090` = 000 | 三节点降为两节点 | 运维恢复 | P2 | B-95 |
+
+---
+
+## 六、域结论表
+
+| 审查维度 | 负责专家 | 结论 | 关键证据 |
+|----------|----------|------|----------|
+| 单元·组件级 | 苏雅 | **改善** | 后端全量 3111/3082(−3 红);fe 609/3/12(3 预期 RED);web 116/116 |
+| 集成·接口级 | 柯砚 | **改善** | 线上 API 32 例 0 红;S-cfc-178 契约 4F→0 转绿;S-cfc-176 维持 1F |
+| 系统·验收级 | 白樾 | **改善** | 浏览器 30 例 28 过 + 2 跳;admin 双节点 5/5;frontend **6/6×2**(B-185 消除) |
+| 测试保障级 | 闻朔 | 改善 | 冒烟全绿;存量红集合零漂移(第 23 次);新增判据修正 B-188-1 |
+| 性能·可靠性 | 骆骋 | **改善** | 全量 43:15 完成(B-184-1 劣化判据证伪);pytest 挂死仍为可靠性缺陷 |
+| 安全 | 关屿 | 承袭 | 匿名 6/6=401;nonfunc-security 11 例全绿 |
+| 兼容·体验 | 阮清 | **改善** | frontend 移动视口 6/6;无多浏览器矩阵 |
+| 流程·度量 | 何序 | 部分改善 | G9 锚点 20.1%;CI 漏拦 6(由 7 收窄)、陈旧 26 未修 |
+
+---
+
+## 七、五要素问题清单
+
+| # | ① 问题描述 | ② 测试 bug 点 | ③ 最优修改方案 | ④ 修改目的 | ⑤ 闭环方式 |
+|---|-----------|--------------|----------------|-----------|-----------|
+| P1 | 后端 25 红(13 类),其中 11 类为跨 23 轮存量 | `EnergySystemFlowTest` 6F / `DimensionRegistryMapContractTest` 3F / `OrchestrationEngineTest`·`OrchestrationIntegrationTest`·`MembershipPaySwitchTest`·`PaymentServiceORDRoutingTest`·`UserServiceWechatLoginTest`(×2)·`TeamProfitCronContractTest` 各 1F | 按类逐条修;先修 `TeamProfitCronContractTest`(平台费截断,影响计费) | 后端回归全绿 → G2 闭环 | 修后 `mvn -o -B test -Dtest=<类>` 定向复跑,单类 0F 连续 2 轮 |
+| P2 | **S-cfc-176 幂等分支未生效** | `MembershipPlanPurchaseContractTest.repeatPurchase_pendingOrderSamePlan_reuseNoDuplicate:201`(`NeverWantedButInvoked: paymentOrderMapper.insert`) | 让 `findReusablePendingOrder` 命中后直接复用,不再 insert | 契约闭环(防重复下单) | 定向复跑该类 7/7 绿 |
+| P3 | `GrowthPublicEndpointMappingTest` 5E(未入库 + 端点映射缺失) | `config/GrowthPublicEndpointMappingTest.java`(`??` 未跟踪) | 提交入库 + 补齐 `/api/growth/**` 公开端点映射 | 资产可追溯 + 公开面契约 | 入库后全量重跑该类 0E |
+| P4 | CI `BACKEND_OBSERVED_CLASSES` 双向失真 | `.gitlab-ci.yml:61`(33 类清单 vs 实测 13 红类) | 移除 26 类陈旧项、补入漏拦 6 类(GrowthPublic / MembershipPlanPurchase / TaskReviewScP11 / TeamProfitCron / UserServiceWechatLogin×2) | CI 硬门禁真实生效 | CI 在含红例分支上「必红」验证一次 |
+| P5 | langgraph pytest 全绿但 live 链路 120s 零字节 | `app/main.py` chat 路径 + 上游 AgnesAI 凭据 | 轮换有效 key + 提额;`JavaClient` 补 `await aclose()` | AI 对话生产可用 + 进程可退出 | live `/api/v1/chat` 200 < 5s 且 pytest 连续 2 轮全绿 |
+| P6 | pytest 打印 summary 后进程不退出(第 10 轮) | `tests/test_analyze.py` → `RuntimeWarning: coroutine 'JavaClient._get_client' was never awaited` | `app/main.py:84` 改用 lifespan 并 `await client.aclose()`;派发器加 `timeout -k 10 900` | 派发可判定成功、节点不残留 | 派发日志出现 `EXIT=0` 且 `ps` 无残留 |
+| P7 | 迁移 DDL 缺陷(本轮 525 次报错) | `schema.sql:5345` `INDEX idx_product (product_id)` 无该列;`DatabaseInitializer.java:2261` 带别名 UPDATE + 派生表引用被更新表 | 删索引或补列;改 `UPDATE activities SET approved_count = (SELECT COUNT(*) FROM activity_registrations r WHERE r.activity_id = activities.id …)` | 建表成功 + 计数列可写 | 启动日志 0 次 `SQLSyntaxErrorException` |
+| P8 | 前端 3 例预期 RED | `signature.*`(AC-R1/AC-R2)+ `growthHistory.dayGroupView` RED-A7 | 交付 S-cfc-132/133 组件与分组逻辑 | 前端全绿 | `npx jest` 624/624 |
+| P9 | 根级黑盒 16 红(B-36 第 72 轮) | `tests/integration/*`(全 `ECONNREFUSED 9082`) | 起本地 9082 或改指向测试环境 | 黑盒链路可测 | 9082 起来后重跑 23 例 |
+| P10 | **B-188-1 判据缺陷(本轮自处置)** | 历轮以「类/分钟」外推全量耗时 → 4 轮误判「>2h 不可完成」 | 判据改为「maven `Total time`」或「surefire XML 终值」,必要时加 `-Dsurefire.printSummary`;禁用速率外推 | 防止再次主动 kill 已完成的全量回归 | 已在本报告与 blockers 固化判据,下轮起强制使用 |
+
+---
+
+## 八、门禁结论
+
+**结论:不通过(有条件,**明显正向**)** —— 全站 3987 例 / **3918 过 = 98.27%(剔 skip 98.89%)**,红 56→44;三项关键闭环(后端全量恢复、langgraph 51/51、frontend 6/6)与一项契约转绿(S-cfc-178)。剩余阻断项为**存量红 25 + CI 清单失真 + 上游 LLM live 挂死**,均非本轮新增回归。
+
+| 门禁 | 判定 | 依据(本轮实测) |
+|------|------|------------------|
+| G1 全站通过率 ≥98% | ✅ **98.27%** | 3918/3987(剔 skip 98.89%),环比 98.0% → +0.27pct |
+| G2 后端红归零/契约裁决 | ❌ **25 红(13 类)** | 存量 23 + 契约预期 1(S-cfc-176)+ 装置 2(B-178-1) |
+| G3 前端双绿 | ⚠️ fe 609/624(3 预期 RED)+ web 116/116;**小程序 H5 浏览器 6/6** | 3 红全为 S-cfc-132/133 未交付 |
+| G4 编译可编译 | ✅ | 2121 主源 + 375 测试源 **0 编译错** |
+| G5 结果完整性 | ✅ | 369/369 surefire XML 可聚合、0 `.dump`、0 沉默;恒等式 `@Test 3097 − Disabled 4 + 参数化 18 = 3111` |
+| G6 浏览器 E2E | ✅ **28 过 + 2 跳** | admin 5/5(本机+189)、fe 6/6×2、shop 4/4、health 13/13、dx 2 跳 |
+| G7 langgraph | ⚠️ **51/51 绿(观察 1/2)** | 首次全绿;按「连续 2 轮全绿」纪律不即时销号 B-142-2 |
+| G8 匿名鉴权 401 | ✅ 6/6 | mind/energy/health-plan/xiaomi/huawei/admin-families 全 401 |
+| G9 用例锚定 SRS | ❌ 20.1% | 双向命中 62 / 唯一 TC 308(承袭口径,本轮未变) |
+| G10 双/三节点可比 | ✅ 双节点 | 189 admin 5/5(spec blob 一致)+ 本机 admin 5/5 + 251 langgraph 51 例 |
+| G11 CI 必红 | ❌ | 漏拦 **6** 类(R187 为 7)+ 陈旧 **26** 类 → `backend-blocking-junit` 仍必红 |
+| G12 用例锚定 SRS 变更 | ✅ | specs 201 / test-cases 16 / API_REFERENCE 窗口零变更 → 用例零新增 |
+| G13 存量红零漂移 | ✅ **第 23 次** | 12 类逐类逐例与 R187 一致;S-cfc-178 为唯一转绿(正向) |
+
+---
+
+## 九、变更触发动作(用户规则:结果有变 → 提交远程 + 通知研发)
+
+- **变更事实(本轮全部为正向)**:后端由「截断/沿用」转为**全量实跑 43:15 完成**(红 28→25);langgraph **45/51 → 51/51**;frontend **4/6 → 6/6**;**S-cfc-178 契约转绿**;全站 98.0% → **98.27%**。
+- **动作**:本报告 + `blockers.md`(新增 B-188-1,更新 B-184-1/B-185/S-cfc-178/B-177-1/B-142-2/B-152-1-2/B-156-1/B-170-1/B-162-1 等)+ `notice-2026-11-13-R188-研发通知.md` 已 commit 并 push `origin/cfclub`(merge-base + `git branch -r --contains` 核验)。
+- **通知通道**:Agent Mail 历轮 `not_bound`(本轮按惯例不再重试)→ 以 blockers.md + 研发通知 + 推送落地。
+
+---
+
+## 十、待办
+
+1. **运维**:251 上游 key 轮换/提额(live chat 仍挂死);恢复 204 节点(B-95)。
+2. **研发**:S-cfc-176 幂等分支;B-156-1/B-170-1 迁移 DDL;B-177-1 `aclose()`;B-178-1 装置改 `@MockBean`;B-162-1 3 类入库。
+3. **CI**:按「漏拦 6 + 陈旧 26」精修 `BACKEND_OBSERVED_CLASSES`,并把判据 B-188-1(禁止速率外推)写进 CI 说明。
+4. **测试**:B-185 连续 2 轮绿后销号;B-142-2 待第 2 轮全绿后销号;下轮起全量 JUnit 一律按 `Total time` 判定,不再中途 kill。
+
+---
+
+## 附录 A:本轮命令与口径(可复现)
+
+```bash
+# 后端全量(本轮实测 43:15)
+cd cfc-backend && JAVA_HOME=/d/jdk1.8.0_25 /d/maven/apache-maven-3.6.1/bin/mvn -o -B clean test
+
+# 前端 / 管理端 / 根级
+cd cfc-frontend && npx jest --ci
+cd cfc-web      && npx jest --ci
+cd tests        && npx jest --silent
+
+# 浏览器(必须在 tests/ 内跑;API 套件须带 --output 规避 safe-delete 守卫)
+cd tests && npx playwright test -c playwright.config.live.js --project=admin-desktop
+cd tests && npx playwright test -c playwright.config.live.js --project=frontend-mobile
+cd tests && npx playwright test -c playwright.config.live.js --project=shop-api
+cd tests && npx playwright test -c playwright.config.health.js          # health 13 例
+cd tests && npx playwright test -c playwright.config.api.js --output=../_r188_api \
+  e2e/api/api-smoke.spec.js e2e/api/nonfunc-security.spec.js \
+  e2e/api/nonfunc-perf-compat.spec.js e2e/api/traceability-p94-p95-c26.spec.js
+
+# langgraph@251
+MSYS2_ENV_CONV_EXCL=LOG LOG=/tmp/r188_pytest.log node docs/tdd/tools/dispatch_251_pytest.cjs kick
+MSYS2_ENV_CONV_EXCL=LOG LOG=/tmp/r188_pytest.log node docs/tdd/tools/dispatch_251_pytest.cjs read
+
+# 聚合口径
+python docs/tdd/tools/test_report_metrics.py --reports cfc-backend/target/surefire-reports
+python docs/tdd/tools/test_report_metrics.py --repo-root . --scene
+```
+
+## 附录 B:本轮口径声明(防跨轮误判)
+
+1. **后端 3111 例为本轮全量实跑**(非承袭),耗时以 maven `Total time: 43:15 min` 为准;**禁止**用日志中 `Tests run:` 增量速率推算进度(B-188-1)。
+2. **langgraph 51 例为 251 节点实派实跑**(节点 HEAD = 本机 HEAD)。
+3. **浏览器 30 例全为本机/189 实测**:admin 5(本机)+ admin 5(189,去重不计入合计)+ frontend 6 + shop 4 + health 13 + dx 2 跳。
+4. **线上 API 32 例**为点名 4 文件口径(**不是** `playwright.config.api.js` 不带参数的 990 例口径,B-173-2)。
+5. **根级 23 例**依赖本地 9082,本轮未起服务,全 `ECONNREFUSED`,属环境红(B-36),不计入产品回归。

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

@@ -1302,3 +1302,24 @@
 | **R186 门禁** | 全量 3987 / **3908** | 测试 | **不通过(有条件;G1 由 ❌ 转 ✅)**。✅G1 **98.02%**(3908/3987,剔 skip 98.63%,+1 过)/G4 116-116(30.3s)/G5 编译 0 错(沿用 2121+375)/G6 28-28+2 跳/G8 6/6 401/G10 双节点(189 5/5 + 251 51 例)/G12 SRS 零变更用例零新增;⚠️G3 609-624(3 预期 RED)/G13 **14/14 红类逐例一致(零漂移第 22 次)**、TaskReview 2F 装置浮动;❌G2 **54 红**(后端 28 全量口径 + 根级 16 + lg 6 + fe 3 + TaskReview 装置 +1)/G7 45-51(88.2%,红 6 全环境)/G9 20.1%(62/308)/G11 漏拦 7 陈旧 26/G14 57.9%(88/152)/G16 无 SCA。**变化** = langgraph 红 7→6(auto_tag 1 例恢复,环境红非回归)→ 通过率 97.99%→**98.02%(+0.03pct)**、**G1 转 ✅**;B-184-1 结构性持续(第 3 轮);B-177-1 本轮未复现(观察轮 +1);其余零漂移。 | 测试(R186 闭环) | 2026-11-13 08:05 | 已记录 |
 | **R186 门禁** | 全量 3987 / **3908** | 测试 | **不通过(有条件;G1 由 ❌ 转 ✅)**。✅G1 **98.02%**(3908/3987,剔 skip 98.63%,+1 过)/G4 116-116(30.3s)/G5 编译 0 错(沿用 2121+375)/G6 28-28+2 跳/G8 6/6 401/G10 双节点(189 5/5 + 251 51 例)/G12 SRS 零变更用例零新增;⚠️G3 609-624(3 预期 RED)/G13 **14/14 红类逐例一致(零漂移第 22 次)**、TaskReview 2F 装置浮动;❌G2 **54 红**(后端 28 全量口径 + 根级 16 + lg 6 + fe 3 + TaskReview 装置 +1)/G7 45-51(88.2%,红 6 全环境)/G9 20.1%(62/308)/G11 漏拦 7 陈旧 26/G14 57.9%(88/152)/G16 无 SCA。**变化** = langgraph 红 7→6(auto_tag 1 例恢复,环境红非回归)→ 通过率 97.99%→**98.02%(+0.03pct)**、**G1 转 ✅**;B-184-1 结构性持续(第 3 轮);B-177-1 本轮未复现(观察轮 +1);其余零漂移。 | 测试(R186 闭环) | 2026-11-13 08:05 | 已记录 |
 | **B-185(新增·待研发确认)** | 小程序 H5 游客态核心页内容加载超时 | 研发(P1) | **新增观察**。frontend-mobile 由 R186 同节点 6/6 → 本轮 4/6:**TC-F-U02 首页五维沙盘内容渲染超时**、**TC-F-U05 游客「我的」登录入口未出现**(切 Tab 后内容区仍停超时态)。隔离复跑 2/2 复现(非 flaky)。Playwright error-context 实采:内容区 `The connection timed out, click the screen to try again.`;TabBar(静态)正常。已排除沙箱不可达:本机 `curl https://cfc.etotem.com.cn/api/health/plan/` → 401 in 0.117s(H5 API 宿主可达);admin(cfc.iwintrue.com)5/5 全绿证站点在线。**根因三选一待研发复验**:① 服务端游客态数据端点(首页五维/我的)当前超时;② 浏览器跨域/CORS(H5 cfc.iwintrue.com/frontend 调 cfc.etotem.com.cn,curl 无 CORS 故成功、浏览器失败);③ 前端改动回归。请在桌面节点(R186 同节点 6/6)复验确认。 | 测试(R187 实测) | 2026-11-13 08:30 | 待处理 |
 | **B-185(新增·待研发确认)** | 小程序 H5 游客态核心页内容加载超时 | 研发(P1) | **新增观察**。frontend-mobile 由 R186 同节点 6/6 → 本轮 4/6:**TC-F-U02 首页五维沙盘内容渲染超时**、**TC-F-U05 游客「我的」登录入口未出现**(切 Tab 后内容区仍停超时态)。隔离复跑 2/2 复现(非 flaky)。Playwright error-context 实采:内容区 `The connection timed out, click the screen to try again.`;TabBar(静态)正常。已排除沙箱不可达:本机 `curl https://cfc.etotem.com.cn/api/health/plan/` → 401 in 0.117s(H5 API 宿主可达);admin(cfc.iwintrue.com)5/5 全绿证站点在线。**根因三选一待研发复验**:① 服务端游客态数据端点(首页五维/我的)当前超时;② 浏览器跨域/CORS(H5 cfc.iwintrue.com/frontend 调 cfc.etotem.com.cn,curl 无 CORS 故成功、浏览器失败);③ 前端改动回归。请在桌面节点(R186 同节点 6/6)复验确认。 | 测试(R187 实测) | 2026-11-13 08:30 | 待处理 |
 | **R187 门禁** | 全量 3987 / **3906** | 测试 | **不通过(有条件;轻微负向待确认)**。✅G1 **98.0%**(3906/3987,剔 skip 98.59%,前端 −2 过仍 ≥98%)/G4 116-116/G5 编译 0 错(沿用)/G8 6/6 401/G12 SRS 零变更;⚠️G3 386-386 Jest 全绿但**小程序 H5 浏览器 4/6(B-185 待确认)**;❌G2 **56 红**(后端 28 + 根级 16 + lg 6 + fe 3 + frontend 2 + TaskReview 装置 +1)/G7 45-51(红 6 全环境,派发门控承袭)/G9 20.1%/G11 漏拦 7 陈旧 26。**变化** = frontend-mobile 6/6→4/6(U02/U05 超时,B-185)→ 通过率 98.02%→**98.0%**、红 54→56;其余零漂移。 | 测试(R187 闭环) | 2026-11-13 08:30 | 已记录 |
 | **R187 门禁** | 全量 3987 / **3906** | 测试 | **不通过(有条件;轻微负向待确认)**。✅G1 **98.0%**(3906/3987,剔 skip 98.59%,前端 −2 过仍 ≥98%)/G4 116-116/G5 编译 0 错(沿用)/G8 6/6 401/G12 SRS 零变更;⚠️G3 386-386 Jest 全绿但**小程序 H5 浏览器 4/6(B-185 待确认)**;❌G2 **56 红**(后端 28 + 根级 16 + lg 6 + fe 3 + frontend 2 + TaskReview 装置 +1)/G7 45-51(红 6 全环境,派发门控承袭)/G9 20.1%/G11 漏拦 7 陈旧 26。**变化** = frontend-mobile 6/6→4/6(U02/U05 超时,B-185)→ 通过率 98.02%→**98.0%**、红 54→56;其余零漂移。 | 测试(R187 闭环) | 2026-11-13 08:30 | 已记录 |
+
+## R188 段(2026-11-13 09:55,新增)
+
+| `B-188-1(P1 新增,判据修正)` | 历轮「后端全量 >2h 劣化」判据不成立 | 测试(度量) | **本轮实跑证伪**。同源码同机 `mvn -o -B clean test` → `Total time: 43:15 min`,**369 类 3111 例全部执行完毕**(R184~R187 连续 4 轮中途 kill 并改「截断+定向」)。根因:套件耗时**双峰**(`@SpringBootTest` 慢头 45~300s/类 → `unit` 快尾 <1s/类),用前半程 ~3 类/分钟线性外推必然得 >2h。**修正判据**:进度只用 maven `Total time` 或 surefire XML 终值,禁止速率外推与提前 kill。 | 测试 | 2026-11-13 09:55 | 已处置(判据固化) |
+| **B-184-1(第 4 轮,本轮证伪并降级)** | 后端全量耗时劣化 | 研发/测试(降级为观察) | **降级/拟撤销**。本轮全量 **43:15** 完成(369 类 3111 例 3082 过 25 红),与 R177(42:08)/R183(33:49)同量级,**未复现 >2h**。建议按 B-188-1 修正判据后转「观察项」;慢类优化建议仍有效(`@SpringBootTest` 类降 `@WebMvcTest` + 落 `application-test.yml` + surefire `forkedProcessTimeoutInSeconds`)。 | 研发/测试 | 2026-11-13 09:55 | 观察中 |
+| **B-142-2(第 17 轮,显著改善)** | langgraph 上游 LLM 不可达 | 运维/研发(P0) | **51/51 全绿**(285.81s,首个全绿轮)→ **观察 1/2,不销号**。但 live `POST /api/v1/chat`(query + user_id:int)→ **000/120.01s/0B**,`/health` 200/9.7ms → **单测绿(mock/降级)≠ 真实链路可用**。仍急需轮换 key + 提额。 | 运维/研发 | 2026-11-13 09:55 | 待处理(P0) |
+| **B-177-1(第 10 轮,复现)** | 251 pytest 打印 summary 后进程不退出 | 研发/测试(P1) | **复现**。`51 passed in 285.81s` 打印后 `bash -c`+`pytest` 存活 **9m36s**;另发现 **R186 残留 1h10m38s** → `EXIT=` 永不落盘。已 `kill -9` 清理 4 个(`ps` 复核 0)。修法:`app/main.py:84` on_event→lifespan + `await client.aclose()`;派发器 `timeout -k 10 900`。 | 研发/测试 | 2026-11-13 09:55 | 待处理 |
+| **B-185(销号·观察 1/2)** | 小程序 H5 游客态核心页内容加载超时 | 研发(P1) | **消除**。frontend-mobile **6/6**(51.4s)+ 复跑 **6/6**(58.8s),TC-F-U02(五维沙盘)/TC-F-U05(我的登录入口)均通过。R187 的 4/6 判为**环境瞬态**(同节点同 spec,无代码变更)。按「连续 2 轮绿」纪律下轮再绿即正式销号。 | 测试(R188 实测) | 2026-11-13 09:55 | 观察中(1/2) |
+| **S-cfc-178(闭环)** | family.familyMembers.removeMember 缓存重算 | 研发(已闭环) | **转绿**。`FamilyRemoveMemberContractTest` 8 例 **4F → 0F**(随 `5c3cff249` 落地)。 | 测试(R188 全量实测) | 2026-11-13 09:55 | 已闭 |
+| **S-cfc-176(第 4 轮,维持 1F)** | membership.plan.purchase 幂等分支 | 研发(P1) | **维持 1F/7**。`repeatPurchase_pendingOrderSamePlan_reuseNoDuplicate:201`(`NeverWantedButInvoked: paymentOrderMapper.insert`)→ 同 plan 重复购买仍 insert 新支付单。 | 研发 | 2026-11-13 09:55 | 待处理 |
+| **B-152-1/2(第 19 轮,漏拦收窄)** | CI `BACKEND_OBSERVED_CLASSES` 双向失真 | CI(P0/P1) | **漏拦 6**(R187 为 7:GrowthPublic / MembershipPlanPurchase / TaskReviewScP11 / TeamProfitCron / UserServiceWechatLogin ×2)+ **陈旧 26**(33 类清单 vs 13 红类)→ `backend-blocking-junit` 必红。 | 研发/CI | 2026-11-13 09:55 | 待处理 |
+| **B-156-1 / B-170-1(第 12/9 轮,未修)** | 迁移 DDL 缺陷 | 研发(P1/P2) | **未修**。本轮全量日志 **525 次** `SQLSyntaxErrorException / Unknown column`:`schema.sql:5345` `INDEX idx_product (product_id)` 无该列(`nutrition_age_dosage` 从未建成);`DatabaseInitializer.java:2261` 带别名 UPDATE 引派生表(`activities.approved_count` 恒 0)。 | 研发 | 2026-11-13 09:55 | 待处理 |
+| **B-162-1(第 14 轮,承袭)** | 3 个测试类未入库却被编译执行 | 治理(P1) | **延续**。`GrowthPublicEndpointMappingTest`(5E)/`JwtInterceptorGrowthPolicyTest`/`ArticleTagsContractTest` 仍 `??`;测试源 375。 | 研发/测试 | 2026-11-13 09:55 | 待处理 |
+| **B-178-1(第 7 轮,维持 2F)** | TaskReviewScP11 反射装置浮动 | 测试(P2) | **维持 2F**(与 R184~R187 逐例相同)→ 建议 `@MockBean` 替代 `ReflectionUtils`。 | 测试 | 2026-11-13 09:55 | 待处理 |
+| **B-173-1(本轮再触发 1 次)** | safe-delete 守卫拦截 Playwright | 测试(P2) | API 套件首跑被 `node-safe-delete-shim` 拦截(**无 `Running N tests` → 不计入 G2**);`--output=../_r188_api` 后 32 例正常。 | 测试(R188 实测) | 2026-11-13 09:55 | 规避中 |
+| **B-36(第 72 轮零漂移)** | 根级黑盒 23 例 16 红 | 测试(P2 环境) | **零漂移**。`cd tests && npx jest --silent` → **7 过 / 16 红**(12.2s),全 `ECONNREFUSED 9082`。 | 测试 | 2026-11-13 09:55 | 待处理 |
+| **B-95(第 43 轮)** | `192.168.16.204:4090` 失联 | 运维(P2) | **延续**。204:4090=**000**;189:4090=200、251:4096=**200(本轮实派成功,R187「401 门控」不成立)**。 | 运维 | 2026-11-13 09:55 | 待处理 |
+| **B-DX-1(第 30 轮)** | dx-bridge 端点 404 | 部署/研发(P1) | **延续**。dx 2 例 skip(不假绿);规格明示「仅登记不实现」。 | 部署/研发 | 2026-11-13 09:55 | 待处理 |
+| **B-142-1(销号维持第 18 轮)** | 匿名端点鉴权 | 研发(已闭环) | **维持销号**。6 端点 **6/6 = 401**(mind/fortune、energy/overview、health/plan/list、xiaomi-health、huawei-health、admin/families/overview)。 | 测试(R188 实测) | 2026-11-13 09:55 | 已闭(观察维持) |
+| **B-124/B-32(度量口径)** | 锚点/场景口径跨轮不可比 | 测试(P2) | **仍未闭环**。官方脚本:场景 215 / 映射 155=72.1% / 字面 33=15.3% / TC 861 / 异常流 502=58.3% / 锚点 115 / 资产 546;严格口径沿用 **20.1%(62/308)**。 | 测试 | 2026-11-13 09:55 | 待处理 |
+| **R188 门禁** | 全量 3987 / **3918** | 测试 | **不通过(有条件,明显正向)**。✅G1 **98.27%**(剔 skip 98.89%,+12 过)/G4 编译 0 错(2121+375)/G5 369 XML 0 dump(恒等式 3097−4+18=3111)/G6 28 过+2 跳/G8 6/6 401/G10 双节点(189 5/5 + 251 51 例)/G12 SRS 零变更/G13 存量零漂移第 23 次;⚠️G3 609-624(3 预期 RED)/G7 **51/51(观察 1/2)**;❌G2 **25 红**、G9 20.1%、G11 漏拦 6 陈旧 26、G14 57.9%、G16 无 SCA。**变化** = 后端 28→25 红(全量实跑)、lg 6→0、fe H5 2→0 → 红 56→**44**、通过率 98.0%→**98.27%**。 | 测试(R188 闭环) | 2026-11-13 09:55 | 已记录 |