|
|
@@ -0,0 +1,257 @@
|
|
|
+# 测试负责人工作汇报 · 第 127 轮(2026-11-10 16:30~17:35)
|
|
|
+
|
|
|
+> 执行档:**review(内网 cfc.iwintrue.com 已授权;离线 mvn -o;未联网装依赖)**
|
|
|
+> 基线 HEAD:`05f48f12d`(= origin/cfclub,跑测期间分支/HEAD 未漂移)
|
|
|
+> 分工:**189**=admin 浏览器套件|**本机**=frontend/shop/health 浏览器套件 + Jest + 后端全量|**251**=langgraph pytest|**204**=失联(B-95)
|
|
|
+> 结论:⛔ **不通过(有条件)** — 三项阻塞延续:G2 49 红 / G9 可执行锚点 9.9% / G11 无 CI 全量
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 1. 历史审查记录(仅作对照,不作为本轮结论依据)
|
|
|
+
|
|
|
+| 轮次 | 时间 | 后端全量 | langgraph | 结论 | 遗留缺口 |
|
|
|
+|---|---|---|---|---|---|
|
|
|
+| R123 | 11-10 13:30 | 2865 例 / 2828 过 / **98.71%** / 33 红 | 43/42/1 | 不通过(有条件) | G2 50 红、G9 17.1%、G11 |
|
|
|
+| R125 | 11-10 14:55 | 3501/3445=**98.40%**(引用上一轮后端) | **43/43 全绿** | 不通过(有条件) | G2 49、G9、G11 |
|
|
|
+| R126 | 11-10 15:55 | 未跑(仅 test-compile) | **39/43**(B-74 复发 4 例 LLM 401) | 有条件通过 | B-74、B-95、B-125 |
|
|
|
+| **R127(本轮)** | 11-10 17:30 | **2865 例 / 2828 过 / 98.71% / 33 红**(与 R123 逐字段一致) | **43/43 全绿** | **不通过(有条件)** | G2 49、G9 9.9%、G11 |
|
|
|
+
|
|
|
+- 本轮为该对象**第 127 轮**持续闭环审查,非首次。
|
|
|
+- 与 R123 对比:后端**逐类逐例零漂移**(2865/2828/33 红,红类集合完全一致)→ 研发窗口内无后端源码变更。
|
|
|
+- B-74(langgraph 4 例 LLM 401)**本轮未复现**,43/43 全绿;因 R126 曾复发,按纪律「连续 2 轮绿才销号」记为**观察第 1 轮**。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 2. 项目画像速览
|
|
|
+
|
|
|
+- **业务**:浠艾福 XAF —— 家庭教育 SaaS(家庭成员/五维能量/成长规划师/健康报告/商城分佣/AI 管家)。
|
|
|
+- **技术栈**:`cfc-backend`(Spring Boot 2.7.18 + MyBatis-Plus + Java 8,9082)· `cfc-web`(Vue2 + ElementUI,Jest 116 例)· `cfc-frontend`(uni-app H5/小程序,Jest 426 例)· `cfc-langgraph`(FastAPI + LangGraph + Chroma,9000)· `dan/danshop`(独立商城 8888)。
|
|
|
+- **关键路径**:登录/家庭邀请 → 五维测评 → 成长任务 → 健康报告上传解析 → 商城下单分佣(CF)→ AI 对话。
|
|
|
+- **测试现状**:后端 339 测试类 / 2865 例(全量可跑);前端 Jest 27 套件;浏览器硬契约 28 例;langgraph 43 例。
|
|
|
+- **质量目标**:20 类全覆盖、G1≥95%、G2≤10 红、G6 28/28、G7 0 红、G9≥80%。
|
|
|
+- **风险点**:后端 33 红中 14 例产品类未闭环;SRS 锚点率长期 <30%(B-124 口径未统一);无 CI 全量门禁。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 3. 20 类测试覆盖矩阵(三态:已实测 / 未发现 / 待核实)
|
|
|
+
|
|
|
+| # | 测试类型 | 状态 | 证据 |
|
|
|
+|---|---|---|---|
|
|
|
+| 1 | 单元测试 | ✅ 已实测 | 后端 339 类 2865 例(surefire);web 116;fe 426 |
|
|
|
+| 2 | 组件测试 | ✅ 已实测 | Vue shallowMount 组件用例(Families/AuditDetailDrawer 等 17+26 套件) |
|
|
|
+| 3 | 接口 API 测试 | ✅ 已实测 | 后端 364 Controller 的 MockMvc/直调用例;线上 4 端点鉴权探针 401 |
|
|
|
+| 4 | 集成测试 | ✅ 已实测 | `integration.*` 5 类(EnergySystem/GrowthRecordSync/GuideModule/DimensionRegistryMap)实跑 |
|
|
|
+| 5 | 系统/端到端 E2E | ✅ 已实测 | 浏览器 28/28(admin 5 / frontend 6 / shop-api 4 / health 13) |
|
|
|
+| 6 | 冒烟测试 | ✅ 已实测 | 浏览器 28 例 + Jest 全绿即冒烟面 |
|
|
|
+| 7 | 回归测试 | ✅ 已实测 | 与 R123 后端逐字段零漂移;web/fe 零漂移;langgraph 由 39→43 |
|
|
|
+| 8 | 探索性测试 | ⚠️ 待核实 | 本轮只做定向探针(langgraph live chat/analyze),无 chartered 探索会话 |
|
|
|
+| 9 | 验收 UAT / BDD | ⚠️ 待核实 | 无 BDD(cucumber/gherkin)执行证据 |
|
|
|
+| 10 | 性能测试 | ⛔ 未授权未执行 | 压测属 execute 档(需联网授权),本轮未做 |
|
|
|
+| 11 | 可靠性测试 | ⚠️ 待核实 | 无混沌/恢复演练;仅观察 502 窗口与节点失联 |
|
|
|
+| 12 | 安全测试(SAST/DAST/SCA/渗透) | ⛔ 未授权未执行 | 依赖漏洞扫描/DAST 需联网;仅剩静态项(见 §7 #10) |
|
|
|
+| 13 | 兼容性测试 | ⚠️ 待核实 | 仅 Chromium 单浏览器;无 iOS/Android/多浏览器矩阵 |
|
|
|
+| 14 | 可用性测试 | ⚠️ 待核实 | 无真实用户可用性证据 |
|
|
|
+| 15 | 无障碍测试 | ⚠️ 待核实 | 无 axe/WCAG 扫描 |
|
|
|
+| 16 | 覆盖率度量 | ⚠️ 已实测(低) | cfc-web 语句 10.09% / 分支 6.12% / 函数 7.50% / 行 9.97%;后端 JaCoCo 未接入 |
|
|
|
+| 17 | 变异测试 | ⛔ 未发现 | 无 PIT/mutation 资产 |
|
|
|
+| 18 | 契约测试 | ✅ 已实测 | 鉴权契约 4/4 401(含 `/api/mind/**`);D/X 桥接契约 16 例在册全绿 |
|
|
|
+| 19 | QA 流程 | ⚠️ 待核实 | 127 轮闭环可追溯;门禁未脚本化(G11) |
|
|
|
+| 20 | 全项目代码审查 | ⚠️ 待核实 | 本轮仅做规范扫描(`@GetMapping` 8 处仍违 AGENTS.md),未跑全量静态审查 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 4. 实测结果明细(本轮真实信号,全部本机/节点实跑,无引用)
|
|
|
+
|
|
|
+| # | 维度 | 命令/方式 | 节点 | 结果 |
|
|
|
+|---|---|---|---|---|
|
|
|
+| 1 | 后端全量 | `mvn -o -B clean test`(JDK1.8.0_25 + Maven 3.6.1,**42m36s**) | 本机 | **339 类 / 2865 例 / 2828 过 / 30F+3E+4S = 98.71%**;14 红类 / 33 红例;**339/339 XML 无沉默**;testCompile **345 源 0 错**;`target/classes` **2325** class |
|
|
|
+| 2 | cfc-web Jest | `CI=true npx jest --ci --runInBand` | 本机 | ✅ **17 套件 / 116 例全绿**(18.1s) |
|
|
|
+| 3 | cfc-frontend Jest | 同上 | 本机 | ✅ **26 套件 / 426 例 = 423 过 / 3 skip / 0 红**(18.1s) |
|
|
|
+| 4 | 根级黑盒 Jest | `npx jest -c tests/jest.config.js` | 本机 | ⚠️ **23 例 = 7 过 / 16 红**(`ECONNREFUSED` 9082 未启,B-36 第 30 轮零漂移) |
|
|
|
+| 5 | langgraph pytest | 251 `POST /api/shell` 实派 `.venv/bin/python -m pytest tests --ignore=tests/qna --ignore=tests/test_chat.py` | **251** | ✅ **43 passed / 0 红(1020.56s)**;`PYTEST_EXIT=124`=测试跑完后解释器不退(`timeout` 收尾杀进程),非用例失败 |
|
|
|
+| 6 | 管理端 UI E2E | `playwright -c live --project=admin-desktop` | **189** | ✅ **5/5**(1.3m,TC-A-U01~U05 含滑块+真实登录入主框架) |
|
|
|
+| 7 | 小程序 H5 E2E | `--project=frontend-mobile` | 本机 | ✅ **6/6**(1.1m,TC-F-U01~U06) |
|
|
|
+| 8 | 商城排序契约 | `--project=shop-api` | 本机 | ✅ **4/4**(11.6s,TC-S-U01~U04) |
|
|
|
+| 9 | 健康鉴权契约 | `-c playwright.config.health.js` | 本机 | ✅ **13/13**(7.6s,TC-HP-U01~U03 均 401) |
|
|
|
+| 10 | 线上鉴权探针 | `curl -X POST` 4 端点匿名 | 本机 | ✅ **4/4 = 401**(`/api/mind/fortune`、`/api/energy/overview`、`/api/health/plan/list`、`/api/huawei-health/status`)→ **B-69 连续 2 轮闭环** |
|
|
|
+| 11 | langgraph live | `POST /api/v1/chat`、`/api/v1/analyze`(正确 schema) | 本机→251 | ❌ **均 90s 零字节(HTTP 000)** → **B-90 延续**(`/health` 6ms 200、schema 校验层 422 均正常,仅 LLM 链路挂死) |
|
|
|
+| 12 | 节点探活 | curl | 4 节点 | 251:4096=200 / 251:9000=`{"status":"ok"}` / 189:4090=200 / **204:4090=000(B-95)** / 本机 9082 未启 |
|
|
|
+
|
|
|
+**全量计数**(去重口径:后端 2865 + web 116 + fe 426 + 根级 23 + langgraph 43 + 浏览器 28)
|
|
|
+- 合计 **3501 例**,通过 **3445** = **98.40%**,红 **49**(后端 33 + 根级 16),skip **7**(后端 4 + fe 3)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 5. 覆盖缺口清单
|
|
|
+
|
|
|
+| 缺口 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
|
|
|
+|---|---|---|---|---|---|
|
|
|
+| G-127-1 SRS 可执行锚点 | 827 TC 行,末列锚点非空 234(28.3%),指向可执行用例仅 **82(9.9%)** | 需求→用例不可双向追溯,改动无法判断回归面 | 为每个 spec 章节强制登记 ≥1 个可执行 anchor(用例名/测试类#方法) | P1 | `test-cases/*.md` 末列补锚点后重算 ≥80% 才过 G9 |
|
|
|
+| G-127-2 场景覆盖 | SC 244,被 TC 引用 146(**59.8%**) | 98 个场景无用例,验收无据 | 按 P0 场景优先补三类流(正常/异常/边界) | P1 | sc-key-map 与 TC 台账双向对账 |
|
|
|
+| G-127-3 后端产品红 14 例 | EnergySystem 6×500、Orchestration 2、UserWechatLogin 2、MembershipPay 1、PaymentORD 1、TeamProfitCron 1、platform_fee 1 | 五维能量与微信登录为高频入口,可能真实不可用 | 先线上复现(可用账号)再定产品/装置 | **P0** | 研发修复后定向复跑转绿 |
|
|
|
+| G-127-4 装置红 16 例 | CfCommission 8、ArticleAutoTag 4、GrowthRecordSync 3、TaskPlan 1 | 掩盖真实分佣/打标回归 | 按 §7 #1~#4 修装置 | P1 | 定向复跑 16/16 绿 |
|
|
|
+| G-127-5 langgraph 运行时不收敛 | 测试 43/43 通过但进程不退(EXIT=124);live chat/analyze 90s 零字节 | CI 会挂死;生产 AI 对话不可用 | ① 加 `--timeout`/`os._exit` 收尾 ② 给 LLM 调用加显式超时与降级 | **P0** | 连续 2 轮 pytest 正常退出 + live 200 有 body |
|
|
|
+| G-127-6 无 CI 后端全量 | 后端 2865 例只在本地人工跑 | 回归不可持续,红例长期沉淀 | GitLab CI 增 blocking 全量 job(可离线缓存 m2) | P1 | CI 绿/红可查 + 阻断合并 |
|
|
|
+| G-127-7 覆盖率空白 | 后端无 JaCoCo;web 语句 10.09% | 无法度量单测有效性 | 后端接 jacoco-maven-plugin,报告入库 | P2 | 覆盖率报告产出并可复算 |
|
|
|
+| G-127-8 204 节点失联 | 4090 等端口全 000 | 浏览器任务无冗余节点 | 运维恢复并登记节点能力 | P2 | 探活 200 + 实派 1 例绿 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 6. 域结论表
|
|
|
+
|
|
|
+| 审查维度 | 负责专家 | 结论 | 关键证据 |
|
|
|
+|---|---|---|---|
|
|
|
+| 单元·组件级 | 苏雅 | **不通过(局部)** | 后端 33 红中 16 例装置型(Mockito 误用/夹具无值);web 覆盖率 10.09% 偏低 |
|
|
|
+| 集成·接口级 | 柯砚 | **不通过(局部)** | `integration.*` 5 类中 4 类红(EnergySystem 6×500、GrowthRecord 3、GuideModule 1 截断、DimensionMap 3) |
|
|
|
+| 系统·验收级 | 白樾 | **有条件通过** | 浏览器 28/28;但无 UAT/BDD,验收仅靠 E2E 硬契约 |
|
|
|
+| 测试保障级 | 闻朔 | **有条件通过** | 26 轮零漂移回归有效;冒烟面 = 28 例;探索性无 chartered 记录 |
|
|
|
+| 性能·可靠性 | 骆骋 | **未实测(未授权)** | 压测需 execute 档授权;仅有 langgraph 90s 零字节的可靠性观察 |
|
|
|
+| 安全 | 关屿 | **不通过(局部)** | 鉴权 4/4 401 达标;但 `@GetMapping` 8 处违 AGENTS.md、`application.yml` 明文凭据 B-31 未改造 |
|
|
|
+| 兼容·体验 | 阮清 | **待核实** | 仅 Chromium;无多端矩阵、无 axe 无障碍扫描 |
|
|
|
+| 流程·度量·代码 | 何序 | **不通过(局部)** | G9 口径三套并存(B-124);无 CI 全量(G11);测例台账 827 行但可执行锚点 9.9% |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 7. 五要素问题清单
|
|
|
+
|
|
|
+### #1【P1·装置】CfCommissionServiceSettleTest 8 例「Wanted but not invoked」
|
|
|
+- **① 问题描述**:`settle_*` 8 例全部失败,报 `cfBalanceService.earnByRule(...)` / `ppointConsumptionLogMapper.insert(...)` 未被调用。
|
|
|
+- **② 测试 bug 点**:`cfc-backend/src/test/java/com/etotem/cfc/service/CfCommissionServiceSettleTest.java`(`settle_F03a发放_自动创建感恩记录`、`settle_两级销售奖_F03a按团队档位_F03b按自身档位`、`settle_同家庭引荐人跳过_顺延到下一级拿F03a`、`settle_商品订单实付与分润基数分离`、`settle_推荐人分润只走earnByRule_不再写旧分佣流水`、`settle_最多两级_第三级引荐人不发放`、`settle_档位比例超规则上限_按上限封顶`、`settle_落P点消费日志_基数与订单对应`)。
|
|
|
+- **③ 最优修改方案**:先补 settle 路径的前置守卫桩(订单状态、受益人解析、家庭关系),mock 返回真实形态对象;断言由精确 `any()` 改为 `ArgumentCaptor` 捕获后校验实付/基数/档位,避免「桩不匹配 → 提前 return → 断言不触发」。
|
|
|
+- **④ 修改目的**:消除 8 例装置假红,恢复分佣链路的真实守护能力(CF 结算是资金链路)。
|
|
|
+- **⑤ 闭环**:`mvn -Dtest=CfCommissionServiceSettleTest test`(注意 surefire 2.22.2 只认**逗号**分隔)复跑 **12/12 绿**。
|
|
|
+
|
|
|
+### #2【P1·装置】ArticleAutoTagServiceTest 4 例线程池调用次数断言
|
|
|
+- **①**:3 例 `Wanted 1 time` 未发生、1 例 `Never wanted here` 反被调用。
|
|
|
+- **②**:`cfc-backend/src/test/java/com/etotem/cfc/unit/ArticleAutoTagServiceTest.java`(`auditArticle_…`、`publishByUser_…`、`toggleStatus_发布且标签为空_调度自动打标`、`toggleStatus_标签非空_不调度自动打标`)。
|
|
|
+- **③**:改用 `verify(executor, timeout(1000)).execute(any())` 容忍异步提交;标签非空用例先显式 `clearInvocations(executor)` 再断言 never。
|
|
|
+- **④**:区分「异步调度」与「同步执行」,避免把时序差异判成功能缺失。
|
|
|
+- **⑤**:定向复跑 4/4 绿,且连续 2 轮稳定(防 flaky)。
|
|
|
+
|
|
|
+### #3【P1·装置】GrowthRecordSyncFlowTest 3 例(2 处 NPE + 1 处布尔断言)
|
|
|
+- **①**:`parentCreatesRecordWithOrder_Success:164`、`parentUploadsHealthReport_Success:204` 抛 `NullPointerException`;`parentCreatesRecordWithoutChild_Fails:130` 期望 true 得 false。
|
|
|
+- **②**:`cfc-backend/src/test/java/com/etotem/cfc/integration/GrowthRecordSyncFlowTest.java:130/164/204`。
|
|
|
+- **③**:164/204 补 mock 返回值(订单/报告对象在「孩子→家庭成员」重构后改走 `getXxxByFamilyMember`,桩仍是旧方法名);130 改为断言业务响应码/message,而非守卫层布尔。
|
|
|
+- **④**:消除重构遗留的夹具滞后,恢复成长记录同步的回归保护。
|
|
|
+- **⑤**:定向复跑 10/10 绿。
|
|
|
+
|
|
|
+### #4【P2·装置】TaskPlanServiceTest 1 例
|
|
|
+- **①**:`applyAndActivate_无active实例时新建并置active` 期望 100 得 null(返回 id 为空)。
|
|
|
+- **②**:`cfc-backend/src/test/java/com/etotem/cfc/unit/TaskPlanServiceTest.java`。
|
|
|
+- **③**:补 `insert` 回填主键的 mock(`doAnswer` 设置 id),或改用 `ArgumentCaptor` 校验保存对象。
|
|
|
+- **④**:使激活路径可断言,避免「新建成功但 id 空」类缺陷逃逸。
|
|
|
+- **⑤**:定向复跑 4/4 绿。
|
|
|
+
|
|
|
+### #5【P0·产品】EnergySystemFlowTest 6 例全 500(五维能量核心链路)
|
|
|
+- **①**:`parentGetsEnergyOverview` / `parentQueriesEnergyLogs` / `taskCompletionGrantsEnergy` / `childExchangesWishWithEnergy` 均 `expected 200 but was 500`;`childExchangesWithInsufficientEnergy_Fails` 期望 true 得 false;`userWithoutFamily_Fails` 期望 500 得 5001。
|
|
|
+- **②**:`cfc-backend/src/test/java/com/etotem/cfc/integration/EnergySystemFlowTest.java:116/150/182/212/246/282`。
|
|
|
+- **③**:先取 500 的 `Caused by` 最内层(历史同类多为空指针/字段缺失),对照 `/api/energy/*` 实现在「孩子→家庭成员」重构后的成员解析;5001 为自定义错误码,需与断言口径对齐(若 5001 为设计值,则改断言并写入契约)。
|
|
|
+- **④**:五维能量是产品主线,6 例常红意味着能量查询/兑换可能对真实用户不可用。
|
|
|
+- **⑤**:修复后定向复跑 7 例全绿 + 线上 `/api/energy/overview` 带 token 实返 200。
|
|
|
+
|
|
|
+### #6【P1·产品】Orchestration 2 例
|
|
|
+- **①**:`testOnTaskFailed_FoundNode_ThenMarkFailedAndEvaluateFlow` 期望 `"manual_fail"` 得 null;`testEvaluateFlow_AndNode_AllCompleted_Triggered` 实际 `"failed"` 不在 `[in_progress,pending]`。
|
|
|
+- **②**:`cfc-backend/src/test/java/com/etotem/cfc/orchestration/OrchestrationEngineTest.java:176`、`OrchestrationIntegrationTest.java:105`。
|
|
|
+- **③**:核对失败原因枚举落库时机(是否仅在事务提交后回写);若实现改为异步回写,则用例改为轮询等待终态。
|
|
|
+- **④**:编排引擎的失败态判定直接影响任务流转与结算。
|
|
|
+- **⑤**:定向复跑 2 类全绿,并补 1 例「失败→重试→终态」回归。
|
|
|
+
|
|
|
+### #7【P1·产品】UserServiceWechatLogin(Contract) 2 例 + MembershipPaySwitch 1 例 + PaymentServiceORD 1 例
|
|
|
+- **①**:微信首次登录返回 `null` 而非 `jwt-token-1`;`createOrderWithPayType_virtualEnabled_configMissing_returnsNull` 返回了订单对象;ORD 未知前缀未路由到 `handlePaymentCallback`(得 FAIL)。
|
|
|
+- **②**:`service/UserServiceWechatLoginTest.java`、`UserServiceWechatLoginContractTest.java:110`、`MembershipPaySwitchTest.java:209`、`PaymentServiceORDRoutingTest.java:83`。
|
|
|
+- **③**:微信登录按「新 openid 建档 + 家庭创建」契约核对返回体;虚拟支付在配置缺失时应短路返回 null(当前未短路);ORD 路由补前缀白名单。
|
|
|
+- **④**:登录与支付是营收入口,任何静默降级都是资金/账号风险。
|
|
|
+- **⑤**:3 类定向复跑全绿 + 线上登录取 token 冒烟 1 次。
|
|
|
+
|
|
|
+### #8【P1·产品】TeamProfitCronContractTest 冷静期退款未全撤销
|
|
|
+- **①**:`refundWithinCooling_cancelAllRecordsFundsNotPaid` 断言 `cancelled=0` 应为 true。
|
|
|
+- **②**:`cfc-backend/src/test/java/com/etotem/cfc/unit/TeamProfitCronContractTest.java`(§8.2 契约)。
|
|
|
+- **③**:退款回调需将 `team_share_record`/`team_award_record` 置 cancelled 且不发放;核对定时任务与退款回调的竞态(谁先谁后)。
|
|
|
+- **④**:冷静期退款错发是资金损失。
|
|
|
+- **⑤**:定向复跑 22 例全绿 + 1 例竞态顺序用例。
|
|
|
+
|
|
|
+### #9【P0·契约待裁决】DimensionRegistryMapContractTest 3 例(P-9,第 9 轮)
|
|
|
+- **①**:`map_unknownLegacy_returnsNullData` 期望 `data=null` 实得 `"unknown_legacy_xyz"`;`map_missingLegacy_returnsBadRequest` 期望 400 得 200;`map_emptyLegacy` 期望 null 得 `""`。
|
|
|
+- **②**:`cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionRegistryMapContractTest.java:76/85/92`。
|
|
|
+- **③**:需主理人裁决「未知 legacyCode 的语义」——透传 or 归 null;裁决后**单向**修改(改实现或改用例),不得两边各改一半。
|
|
|
+- **④**:同一契约连续 9 轮红,已成为 G2 的固定分母,且掩盖真实回归。
|
|
|
+- **⑤**:裁决落地后定向复跑 7/7 绿,并在 P-9 台账销号。
|
|
|
+
|
|
|
+### #10【P1·安全和流程】`@GetMapping` 8 处仍违 AGENTS.md + 明文凭据未改造
|
|
|
+- **①**:`cfc-backend/src/main/java` 仍有 8 处 `@GetMapping`(规范要求统一 `@PostMapping`);`application.yml` 7 处明文凭据(B-31)未按 O-10 改造。
|
|
|
+- **②**:`grep -rn "@GetMapping" cfc-backend/src/main/java`(8 命中);`cfc-backend/src/main/resources/application.yml`。
|
|
|
+- **③**:8 处改为 `@PostMapping`(同步前端调用);凭据改 `${ENV_VAR}` 占位 + 部署注入 + gitleaks 预检。
|
|
|
+- **④**:GET 暴露参数于 URL/日志;明文凭据可被仓库读权限者直取。
|
|
|
+- **⑤**:`grep -c @GetMapping` = 0;gitleaks 扫描 0 命中。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 8. 度量快照
|
|
|
+
|
|
|
+| 指标 | 数值 | 环比 |
|
|
|
+|---|---|---|
|
|
|
+| 测试类(后端) | 339 | 与 R123 一致 |
|
|
|
+| 后端用例 | 2865 | 一致 |
|
|
|
+| 用例台账 TC 行 / 唯一编号 | 827 / 284 | 一致(SRS 零变更) |
|
|
|
+| 可执行锚点 | 82(**9.9%**)/ 末列非空 234(28.3%) | 口径见 B-124 |
|
|
|
+| 用户场景 SC | 244,TC 引用 146(59.8%) | 一致 |
|
|
|
+| Controller | 364 | — |
|
|
|
+| `@GetMapping` 违规 | 8 | 一致(未整改) |
|
|
|
+| 测试文件 / testCompile | 345 源,0 错 | — |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 9. 门禁结论
|
|
|
+
|
|
|
+| 门禁 | 判据 | 实测 | 结论 |
|
|
|
+|---|---|---|---|
|
|
|
+| G1 全量通过率 | ≥95% | **98.40%**(3445/3501) | ✅ |
|
|
|
+| G2 红例数 | ≤10 | **49**(后端 33 + 根级 16) | ❌ |
|
|
|
+| G3 前端 Jest | 0 红 | 423 过 / 0 红 / 3 skip | ✅ |
|
|
|
+| G4 管理端 Jest | 0 红 | 116/116 | ✅ |
|
|
|
+| G5 编译与完整性 | testCompile 0 错 + XML 无沉默 | 345 源 0 错;**339/339 XML** | ✅ |
|
|
|
+| G6 浏览器 | 28/28 | **28/28**(4 套件) | ✅ |
|
|
|
+| G7 langgraph | 0 红 | **0 红(43/43,B-74 观察第 1 轮)** | ✅ |
|
|
|
+| G8 鉴权契约 | 全 401 | 线上 4/4 + 契约 13/13(含 `/api/mind/**`) | ✅ |
|
|
|
+| G9 SRS 锚点 | ≥80% | **9.9%(严格)/ 28.3%(宽松)** | ❌ |
|
|
|
+| G10 双节点派发 | 251 + 189 均实派 | **251 ✅(43 例)/ 189 ✅(5/5)** | ✅ |
|
|
|
+| G11 CI 含后端全量 | 存在 blocking 全量 | 无 | ❌ |
|
|
|
+| G12 用例入库 | 本轮有新增/更新 | SRS 窗口零变更 → 不新增(合规) | ✅ |
|
|
|
+
|
|
|
+**总裁决:不通过(有条件)**
|
|
|
+
|
|
|
+- 阻塞放行三项:**G2 49 红**、**G9 可执行锚点 9.9%**、**G11 无 CI 全量**。
|
|
|
+- 环比改善:**G7 由 39/43 回到 43/43**;**G10 双节点连续 2 轮通过(189 admin 5/5 第 2 轮,B-122 销号成立)**;**B-69 连续 2 轮闭环**。
|
|
|
+- 环比持平:后端 2865/2828/98.71% 与 R123 逐字段一致(零漂移);49 红构成不变。
|
|
|
+- 新增/延续风险:**B-90** langgraph live `chat`/`analyze` 90s 零字节(生产 AI 对话不可用),与「测试 43/43 全绿」并存 → 说明单测覆盖不到 LLM 真实链路,需补 live 契约。
|
|
|
+- **放行建议**:内网灰度可放(核心浏览/登录/商城/健康鉴权均绿);**不支撑对外正式发布**,除非 §7 #5/#7/#8 的产品红有结论或已修复。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 10. 本轮执行合规声明
|
|
|
+
|
|
|
+- 未联网安装依赖、未启停线上服务、未修改生产源码;仅新增测试侧脚本与本报告/台账。
|
|
|
+- 未触碰他人 WIP(跑前跑后 `git status --porcelain` 已跟踪改动 **0**)。
|
|
|
+- 浏览器任务严格「每节点单任务」:189 跑 admin,本机串行跑 frontend→shop→health(`workers:1`)。
|
|
|
+- 8 类套件全部实跑,无引用历史数字。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 附录 A · 本轮命令(可复现)
|
|
|
+
|
|
|
+```bash
|
|
|
+# 后端
|
|
|
+cd cfc-backend && JAVA_HOME=D:/jdk1.8.0_25 mvn -o -B clean test # 42m36s
|
|
|
+# Jest
|
|
|
+cd cfc-web && CI=true npx jest --ci --runInBand --coverage # 116
|
|
|
+cd cfc-frontend && CI=true npx jest --ci --runInBand # 423+3skip
|
|
|
+cd tests && npx jest -c jest.config.js --ci # 7/16
|
|
|
+# 浏览器(本机串行,workers:1)
|
|
|
+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
|
|
|
+# 189(PowerShell 节点,cmd /c 分离进程)
|
|
|
+node _r127_189_admin.cjs kick / read
|
|
|
+# 251(同 shell 轮询 + tee 落盘)
|
|
|
+MSYS_NO_PATHCONV=1 PYTEST_TIMEOUT=1650 node _r127_251_v3.cjs
|
|
|
+```
|