测试闭环报告 · 第 123 轮(2026-11-10 12:35 GMT+8)
主理人:陆谨(软件测试专家团 · 测试架构师)
执行档:review 档(内网 cfc.iwintrue.com 已授权;无联网外部请求;未装依赖;未改生产代码)
对象:d:/cfc(浠艾福 XAF)
触发:定时自动化「测试负责人闭环(全部用例通过 + 覆盖 SRS/场景含异常流)+ 浏览器走 /admin 与 /frontend(189/本机每节点单任务)+ langgraph 派 251 + 结果有变提交远程并通知研发」
0. 本轮结论速览
| 项 |
值 |
| 基线 |
cfclub @ 568cecac6(跑前 = 跑后;收尾 fetch 远端前进 3 提交,全为 docs + auto bump,零源码变更) |
| 全量用例 |
3501 例 / 3444 过 = 98.37%(红 50 / 跳过 7) |
对比上轮权威基线(R118/R120 98.06% / 3432 过) |
+1 例、+12 过、+0.31pp |
| 后端全量 |
2865 例 / 2828 过 = 98.71%(新高),30F+3E+4S,14 红类 / 33 红例,48:05,XML 339/339 无沉默 |
| 浏览器自动化 |
28/28 全绿(live 15 + health 13) |
| langgraph @ 251 |
43 例 / 42 过 / 1 红(首次由 251 节点实派取回,B-55 本轮闭合) |
| 门禁 |
不通过(有条件) — 见 §9 |
三件必须让研发看到的事
- R122 的「本机无 Maven」是第 4 次误判:
D:\maven\apache-maven-3.6.1 + D:\jdk1.8.0_25 一直可用。本轮据此拿到后端全量 98.71%,而 R122 直接跳过整个后端模块(降级为「复用 R120 基线」)。这是流程缺陷而非环境缺陷,登记 B-123。
- B-121(admin
TC-A-U05 确定性失败 2/2)本轮未复现:同机同套件 5/5 全绿,U05 用时 58.4s 通过。R122 判「确定性失败」过重,改判「节点偶发(滑块/风控时序)」,转观察态,连续 2 轮绿即销号。
- B-74 由 5 例降到 1 例:251 实派仅
test_auto_tag_content_relevance 一例 AssertionError(LLM 语义相关性),其余 4 例随 eeb147273 一并转绿;同时 251 实派独立复核了 B-65/B-82 的销号(test_analyze 2 例、test_intent 4 例均不在失败清单)。
1. 历史审查记录
| 项 |
内容 |
| 上次本对象审查 |
R122 @ 2026-11-10 12:10~12:33(568cecac6,即本轮的同一 HEAD) |
| 上次结论 |
未单独出完整门禁;以「R120 全量基线 98.06% + 本小时 589/599」形式呈现,未评门禁 |
| 上次遗留缺口 |
① 后端全量未实测(误判无 Maven)② B-121 admin U05 新增红 ③ B-55 251 派发未达成 ④ 覆盖率/变异/压测/安全 长期未实测 |
| 本次是否改善 |
①②③ 全部改善(① 拿到 98.71% ② U05 转绿 ③ 251 实派成功);④ 未变(execute 档未授权) |
| 是否首次审查 |
否。同对象已连续审查 ≥123 轮 |
本节仅作对照。本轮全部结论均以本轮实测取证,未沿用任何历史数字作为通过依据;仅「SRS 台账计数」因窗口零变更而标注沿用。
2. 项目画像
| 维度 |
结论 |
| 业务定位 |
家庭教育 SaaS:家长/孩子(能登录/不能登录用户)双角色、成长规划师、五维能量、健康报告解析、测评订单、商城、AI 管家 |
| 技术栈 |
后端 Spring Boot 2.7.18 + MyBatis-Plus + Java 8(端口 9082);小程序 uni-app Vue2;管理端 Vue2 + Element UI;AI 侧 Python FastAPI + LangGraph + ChromaDB(9000,生产 ai.etotem.com.cn);独立商城 Spring Boot(8888) |
| 规模(本轮实测) |
后端测试类 339、@Test 2854、@Disabled 4、控制器 363、@GetMapping 8 处(仍违 AGENTS.md「统一 @PostMapping」);SRS 规格 200 份;用例台账 14 份 |
| 关键路径 |
登录鉴权(JWT 拦截 + 8 公开路径)→ 家庭成员/关系 → 成长任务与能量 → 健康报告上传-解析-入库 → 测评订单 → 商城下单/分润 → AI 对话/画像 |
| 质量目标 |
全量用例通过率、SRS/场景锚点覆盖、线上鉴权契约、浏览器双端可用性、跨节点可派发 |
| 本轮风险点 |
真实 DB 集成测试依赖 192.168.16.251:3306;A 类夹具仍 16 红;platform_fee 列溢出;189 节点仓库陈旧 |
3. 20 类测试覆盖矩阵
图例:● 已发现(有资产且有本轮/近期实测证据)/○ 未发现(扫描未命中)/◐ 待核实(有资产但本轮未实测或被降级)
| # |
类别 |
状态 |
证据 |
| 1 |
单元测试 |
● |
后端 339 类 2865 例实跑;cfc-web 116、cfc-frontend 426 Jest 实跑 |
| 2 |
组件测试 |
● |
后端 *ControllerTest(MockMvc)批量实跑;前端 Vue 组件 __tests__ 实跑 |
| 3 |
接口 API 测试 |
● |
浏览器侧 health 契约 13 例(10 端点未鉴权全 401)+ shop-sort 4 例实跑 |
| 4 |
系统 / 端到端 |
● |
/admin 5 例 + /frontend 6 例真浏览器实跑(Playwright 1 worker) |
| 5 |
验收 UAT |
◐ |
有 tests/user-scenarios 198 场景映射,但无独立 UAT 执行记录(业务凭据不全) |
| 6 |
冒烟测试 |
● |
每轮固定 28 例 live/health 冒烟;本轮全绿 |
| 7 |
回归测试 |
● |
后端全量 2865 例 + 三套 Jest 全量 = 本轮回归基线 |
| 8 |
探索性测试 |
○ |
无 chartered 探索会话记录 |
| 9 |
契约测试 |
● |
health 13 + shop-sort 4 + 后端 *ContractTest(DimensionRegistryMap / TeamProfitCron / WechatLoginContract 等) |
| 10 |
性能测试 |
○ |
无压测脚本与基线(execute 档,需联网授权) |
| 11 |
可靠性测试 |
○ |
无故障注入/恢复演练;仅线上 502 抖动被观测(B-72 历史) |
| 12 |
安全测试 |
◐ |
鉴权契约 23 端点实测(全 401);SAST/DAST/依赖扫描未执行(execute 档) |
| 13 |
兼容性测试 |
◐ |
仅 Chromium;多浏览器/多机型矩阵未执行 |
| 14 |
可用性测试 |
○ |
无真实用户可用性证据 |
| 15 |
无障碍测试 |
○ |
无 WCAG 检查 |
| 16 |
覆盖率度量 |
◐ |
cfc-web 引用历史 10.11/6.12/7.51/9.98%;后端 JaCoCo 离线不可用 |
| 17 |
变异测试 |
○ |
无 PIT/mutation 配置 |
| 18 |
质量指标 |
● |
通过率/红例分布/桶分布本轮重算(§8) |
| 19 |
QA 流程 |
● |
自动化闭环 123 轮可追溯;门禁脚本化不足(G11) |
| 20 |
代码审查 |
● |
本轮抽检红例对应生产代码 6 处(EnergySystem / DimensionRegistry / platform_fee / ArticleAutoTag / CfCommission / WechatLogin) |
缺口初判:5 类 ○ 全为「非功能 + 探索性 + 变异」,均属 execute 档或需专项排期;5 类 ◐ 为本轮降级项,已在 §7 转成缺口条目。
4. 测试方案(本轮实际执行)
| 项 |
内容 |
| 目标 |
全量用例重新取证;验证 SRS/场景零变更;验证跨节点派发;验证上轮遗留 3 项(U05 / 251 / 后端全量) |
| 范围 |
后端全量 339 类、cfc-web 17 套、cfc-frontend 26 套、根级 tests 3 套、langgraph@251 43 例、浏览器 live 15 + health 13 |
| 覆盖维度 |
功能层次 5 类 + 功能保障 4 类 + 非功能鉴权/兼容(部分) |
| 执行档 |
review(离线白名单);内网 HTTP 探针与内网站点浏览器访问均为已授权范围 |
| 优先级 |
P0:后端全量 + 鉴权契约 + 浏览器双端;P1:251 派发;P2:度量口径 |
| 排除项 |
压测、DAST/SCA、变异、多浏览器矩阵、UAT 全流量(未授权/无凭据)——报告中标「未实测」,不计通过 |
5. 执行结果明细
5.1 后端全量(mvn -o -B clean test,JDK1.8.0_25 + Maven 3.6.1)
| 项 |
值 |
| 总耗时 |
48:05 |
| 结果 |
2865 例 / 2828 过 / 30F + 3E + 4S = 98.71%(剔 skip 98.85%) |
| 红类 / 红例 |
14 类 / 33 例 |
| 完整性 |
surefire XML 339/339,与 339 个测试类一一对应,沉默丢失 0 |
| testCompile |
345 源 0 错 |
| 恒等式 |
@Test 2854 − @Disabled 4 + 参数化/早退净增 15 = 2865,误差 0 |
| dump |
1 份 2026-11-10T12-41-35_125-jvmRun1.dump,内容为 PpidChecker 收尾 IllegalStateException: error [STOPPED] to read process(构建结束瞬间的 fork 回收竞态),非测试崩溃 |
| 对比 R118/R120 |
2864/2826/98.67%/34 红 → +1 例 +2 过 +0.04pp,红例 −1 |
33 红三层归因
| 桶 |
例数 |
明细 |
| A 装置(测试自身缺陷) |
16 |
CfCommissionServiceSettleTest 8(Wanted but not invoked)· ArticleAutoTagServiceTest 4(threadPoolTaskExecutor.execute 未命中)· GrowthRecordSyncFlowTest 3(1F+2E)· TaskPlanServiceTest 1(expected 100 but was null) |
| B 产品 |
13 |
EnergySystemFlowTest 6(5×expected 200 but was 500 + 1 断言 false)· OrchestrationEngineTest 1 + OrchestrationIntegrationTest 1 · MembershipPaySwitchTest 1 · PaymentServiceORDRoutingTest 1 · UserServiceWechatLoginTest 1 + UserServiceWechatLoginContractTest 1 · TeamProfitCronContractTest 1(cancelled=0) |
| C 数据 |
1 |
GuideModuleIntegrationTest — Data truncation: Out of range value for column 'platform_fee'(第 12 轮) |
| 契约待裁决 |
3 |
DimensionRegistryMapContractTest(expected 400 but was 200、$.data 应为 null 实为 ""/unknown_legacy_xyz) |
历史红类消失证据(B-69 落码生效):MindFortuneControllerTest 本轮不在红类清单(R118 为 1 红)。线上 POST /api/mind/fortune 本轮复证 401,与 /api/energy/overview 401 对照一致 → 鉴权清单修复在生产与单测两侧同时成立。
5.2 前端 / 管理端 / 根级
| 套件 |
套件数 |
例数 |
过 |
红 |
跳过 |
与基线 |
| cfc-web Jest |
17 |
116 |
116 |
0 |
0 |
零漂移 |
| cfc-frontend Jest |
26 |
426 |
423 |
0 |
3 |
零漂移 |
| tests 根级 Jest |
3 |
23 |
7 |
16 |
0 |
零漂移(B-36,9082 未启动 → ECONNREFUSED) |
5.3 浏览器自动化(workers=1,单节点单任务)
| 套件 |
例数 |
结果 |
耗时 |
备注 |
admin-desktop(/admin) |
5 |
5/5 |
5.6/5.3/3.7/10.2/58.4s |
U04 真实登录通过;U05 通过(R122 为 2/2 失败) |
frontend-mobile(/frontend) |
6 |
6/6 |
3.6~9.6s |
游客流 TC-F-U01~U06 |
shop-api |
4 |
4/4 |
77~115ms |
价格排序契约 TC-S-U01~U04 |
health-api(契约) |
13 |
13/13 |
7.2s |
华为 5 + 小米 5 + 健康方案 3,全部 401 |
合计 28/28 全绿,与 R118/R120 基线一致;U05 由红转绿是相对 R122 的最大正向变化。
5.4 langgraph @ 192.168.16.251(首次由 251 节点实派取回)
| 项 |
值 |
| 通道 |
POST /api/shell?location[directory]=/sc-data/cfc/cfc-langgraph(Basic opencode:***,port 4096)→ GET /api/shell/{id}/output |
| 节点 HEAD |
568cecac6(git reset --hard origin/cfclub 后) |
| 命令 |
.venv/bin/python -m pytest tests --ignore=tests/qna --ignore=tests/test_chat.py -q --tb=line |
| 结果 |
1 failed, 42 passed in 344.83s(43 例,主口径「不含 test_chat」) |
| 唯一红例 |
tests/test_auto_tag.py::test_auto_tag_content_relevance — AssertionError(内容相关性判定,依赖 LLM 语义输出) |
| 对比 |
R121/R122 pre-fix 43/32/11 → 42/1,红例 −10 |
本次实派同时完成三项历史销号的独立复核:test_analyze 2 例(B-65)不在失败清单;test_intent 4 例(B-82)不在失败清单;test_auto_tag 由 5 例降为 1 例(B-74 收窄)。
5.5 节点可达性
| 节点 |
端口 |
结论 |
| 本机 |
— |
浏览器 28/28 全量承担(单任务) |
192.168.16.189 |
4090 OPEN(Basic 认证通过,shell 通道可建可读) |
通道已通但不可承载:仓库为 C:\worktrees\cfc-user-is-child @ e3e52ca38(分支 feature/user-is-child),tests/e2e-live 不存在、node_modules 不存在 → 无法执行浏览器套件;不允许装依赖 → 本轮未派发(B-122) |
192.168.16.251 |
9000 OPEN / 4096 OPEN / 22 OPEN |
langgraph 实派成功;/health 200 |
192.168.16.204 |
4090 CLOSED |
延续失联(B-95) |
5.6 线上鉴权与可达性(curL 探针)
| 目标 |
结果 |
GET http://cfc.iwintrue.com/admin |
302(登录墙,24ms) |
GET http://cfc.iwintrue.com/frontend |
302(21ms) |
POST /api/mind/fortune(匿名) |
401 {"code":401,"message":"请先登录"} |
POST /api/energy/overview(匿名,对照) |
401 |
6. 覆盖缺口清单
| 编号 |
缺口类型 |
现状 |
风险 |
建议测试设计 |
优先级 |
闭环方式 |
| G-123-1 |
性能测试 |
无脚本无基线 |
健康报告解析、AI 对话为长耗时链路,无容量依据 |
用 k6 对 POST /api/health/report/upload、/api/v1/chat 做 20/50 并发阶梯,记录 P95 |
P2 |
需 execute 档联网授权后执行,产出基线表 |
| G-123-2 |
可靠性 |
无故障注入 |
EnergySystem 500 类问题在生产会直接暴露 |
对 MySQL 断连 + LLM 超时各注入 1 次,断言降级而非 5xx |
P2 |
与研发约定注入窗口 |
| G-123-3 |
安全扫描 |
仅鉴权契约 |
仅覆盖 23 个端点的未鉴权路径 |
SAST(Semgrep)+ 依赖漏洞(mvn dependency-check) |
P2 |
execute 档授权 |
| G-123-4 |
兼容性/无障碍 |
仅 Chromium |
小程序多机型、管理端 IE 类浏览器、WCAG 均空 |
Playwright projects 加 firefox/webkit;axe-core 扫 /admin 5 页 |
P3 |
增配置后纳入冒烟 |
| G-123-5 |
覆盖率 |
后端 JaCoCo 离线不可得 |
98.71% 通过率不等于行覆盖率 |
离线环境预置 jacoco agent jar 后 mvn test jacoco:report |
P1 |
预置依赖后补测 |
| G-123-6 |
变异测试 |
无 |
高通过率可能掩盖弱断言 |
对 EnergySystemService、CfCommissionService 引入 PIT,目标 kill ≥60% |
P3 |
专项排期 |
| G-123-7 |
UAT / BDD |
198 场景仅文档映射 |
场景与断言未一一绑定,锚点率低 |
将 §7 的锚点规范落到 tests/test-cases,每场景至少 1 可执行断言 |
P1 |
见 B-124 |
| G-123-8 |
探索性测试 |
无 chartered 记录 |
无脚本外缺陷发现能力 |
每轮 30min 时间盒探索,产出 charter + 发现清单 |
P3 |
常态化 |
7. 域结论表
| 审查维度 |
负责专家 |
结论 |
关键证据 |
| 单元·组件级 |
苏雅 |
有条件通过 |
后端 2865 例 98.71%,14 红类;cfc-web 116/116、frontend 423/426 |
| 集成·接口级 |
柯砚 |
不通过(局部) |
契约 23 端点全 401 ✅;但 DimensionRegistryMap 3 例契约口径未裁决、platform_fee 溢出 1 例 |
| 系统·验收级 |
白樾 |
有条件通过 |
浏览器 28/28 ✅;UAT 全流量未执行(无凭据),场景锚点偏低 |
| 测试保障级 |
闻朔 |
通过 |
冒烟 28/28;回归全量 3501 例可复跑;探索性缺失(登记缺口) |
| 性能·可靠性 |
骆骋 |
未实测(降级) |
execute 档未授权 → 转 G-123-1/2 测试设计 |
| 安全 |
关屿 |
有条件通过 |
匿名 23 端点全 401(含 /api/mind/** 已修);SAST/SCA 未执行 |
| 兼容·体验 |
阮清 |
未实测(降级) |
仅 Chromium;无 axe/WCAG → G-123-4 |
| 流程·度量·代码 |
何序 |
不通过(局部) |
@GetMapping 8 处仍违规范;R122 环境探针缺失致整模块漏测(B-123);锚点口径三种不一致(B-124) |
8. 五要素问题清单
#1 admin U05 登录前置确定性失败(B-121,本轮转绿)
- ① 问题描述:R122 同一套件
TC-A-U05 连续 2 次停在 /admin/login 硬断言失败,而步骤一致的 TC-A-U04 通过;本轮同机同套件 U05 通过(58.4s),U04 亦通过。
- ② 测试 bug 点:
tests/e2e-live/admin-live.spec.js:184(TC-A-U05 登录前置未做「等 XHR 返回 + 断言状态码」,只依赖元素/URL 终态)。
- ③ 最优修改方案:把 U05 前置改为复用
waitLoginFormReady() + fillPhoneAndAwaitRoles()(等 /api/admin-auth/login 返回 200 后再断言菜单),失败时输出「控件属性 + 提示文案 + 几何量」三件套。
- ④ 修改目的:把「滑块/风控时序」与「产品登录回归」解耦,避免同类误判反复计入红例。
- ⑤ 闭环:隔离复跑 U05 连续 2 轮通过即销号;若重试仍红且 U04 同流程绿,则判产品侧并转研发。
#2 langgraph test_auto_tag_content_relevance 红(B-74 收窄至 1 例)
- ① 问题描述:251 实派 43 例中唯一失败为
test_auto_tag_content_relevance,AssertionError;其余 4 例 auto_tag 已随 eeb147273 转绿。
- ② 测试 bug 点:
cfc-langgraph/tests/test_auto_tag.py::test_auto_tag_content_relevance(断言依赖 LLM 对「内容相关性」的语义输出,无固定桩)。
- ③ 最优修改方案:为该用例注入确定性桩(mock LLM 返回固定标签集)作为主断言,另设 1 例
@pytest.mark.llm 真实链路冒烟并允许 skip;同时给 251 .venv 装 pytest-timeout。
- ④ 修改目的:把「LLM 凭据/网络」与「打标逻辑回归」分离,使该维度可稳定门禁。
- ⑤ 闭环:251 复跑该文件 5/5 全绿,且
pytest-timeout 生效(单例 ≤60s)即销号。
#3 根级黑盒 16 红(B-36,第 26 轮零漂移)
- ① 问题描述:
tests/ 根级 3 套 23 例,稳定 7 绿 / 16 红,全部 ECONNREFUSED(后端 9082 未启动)。
- ② 测试 bug 点:
tests/integration/*.spec.js(如 mini-games-api.spec.js:259)硬编码 http://127.0.0.1:9082,无「服务未起则 skip」保护。
- ③ 最优修改方案:加
beforeAll 探活,未起则 test.skip 并打印启动指引;CI 中由 globalSetup 拉起后端。
- ④ 修改目的:消除「环境未起」被统计为「产品失败」的长期噪声(每轮固定 16 红)。
- ⑤ 闭环:连续 1 轮根级 0 红(或 16 例显式 skip 而非 fail)。
#4 A 类夹具 16 红(装置缺陷,非产品)
- ① 问题描述:
CfCommissionServiceSettleTest 8、ArticleAutoTagServiceTest 4、GrowthRecordSyncFlowTest 3、TaskPlanServiceTest 1 红,形态集中于 Wanted but not invoked / execute 未命中。
- ② 测试 bug 点:上述 4 类(
CfCommission...:settle_F03a...、ArticleAutoTag...:toggleStatus_...、TaskPlan...:applyAndActivate_...)。
- ③ 最优修改方案:
CfCommission 逐例核对 mock 方法签名与生产 7 参 overload;ArticleAutoTag 改为注入同步 Executor 替身(避免线程池异步断言);TaskPlan 补齐 @Mock 返回值;GrowthRecordSync 2 例 E 需读 Caused by 最内层。
- ④ 修改目的:让 16 红退出统计,暴露真实产品缺口。
- ⑤ 闭环:定向复跑 4 类全绿(
mvn -Dtest=A,B,C,D 用逗号,且必须看 Tests run: 行)。
#5 B 产品 13 红
- ① 问题描述:
EnergySystemFlowTest 6(5×500)、Orchestration* 2、MembershipPaySwitch 1、PaymentORD 1、WechatLogin 2、TeamProfitCron 1。
- ② 测试 bug 点:
EnergySystemFlowTest:parentGetsEnergyOverview_Success 等 6 例;TeamProfitCronContractTest:refundWithinCooling_cancelAllRecordsFundsNotPaid。
- ③ 最优修改方案:EnergySystem 5 例 500 需抓服务端堆栈定位(疑 DB/事务);TeamProfitCron 冷静期退款未置
cancelled 需核对 §8.2 实现;WechatLogin 2 例疑 mock 凭据缺失。
- ④ 修改目的:把「疑似产品缺陷」转为可派研发的具体缺陷单。
- ⑤ 闭环:对应类 0 红 + 线上同路径 200。
#6 platform_fee 列溢出(C 数据,第 12 轮)
- ① 问题描述:
GuideModuleIntegrationTest 写库报 Data truncation: Out of range value for column 'platform_fee'。
- ② 测试 bug 点:
GuideModuleIntegrationTest::testGuidePackageCreationFlow(造数金额超出列宽)。
- ③ 最优修改方案:核对
guide_order.platform_fee 列类型与业务上限;若业务值合法则扩列(DDL 走 DatabaseInitializer 迁移 + 同步 schema.sql),否则修造数。
- ④ 修改目的:避免真实大额订单写库失败。
- ⑤ 闭环:迁移后该类转绿 + 用边界值(上限 ±1)复测。
#7 DimensionRegistryMap 契约 3 例待裁决
- ① 问题描述:
unknown_legacy/empty 期望 data=null 实为原值/空串;missing 期望 400 实为 200。
- ② 测试 bug 点:
DimensionRegistryMapContractTest:map_unknownLegacy_returnsNullData、map_emptyLegacy_returnsNullData、map_missingLegacy_returnsBadRequest。
- ③ 最优修改方案:由产品/研发对「未知 legacy 键」的语义拍板(null vs 原样回传),据此单向修正契约或用例,写入 SRS。
- ④ 修改目的:消除长期悬空契约,避免前后端对同一键不同解释。
- ⑤ 闭环:契约条款落 SRS 后,3 例按新条款全绿。
#8 R122 环境能力探针缺失致整模块漏测(B-123,流程)
- ① 问题描述:R122 以「本机无 Maven」为由跳过后端全量,采信历史基线;实测
D:\maven\apache-maven-3.6.1 + D:\jdk1.8.0_25 完全可用,本分钟即跑通 2865 例。
- ② 测试 bug 点:
docs/tdd/test/automation-run-2026-11-10-R122.md「降级(未实测)」段(未做 mvn -v / java -version 探针即下结论)。
- ③ 最优修改方案:在自动化 prompt/SOP 中固定「环境探针前置」:每轮先执行
java -version && mvn -v && df -h,三项任一失败才允许降级,且降级必须贴探针输出。
- ④ 修改目的:杜绝「凭记忆判环境」导致整模块漏测(本轮已是第 4 次复发)。
- ⑤ 闭环:连续 3 轮报告均含探针输出且无「无 Maven」类降级 → 销号。
#9 TC 锚点口径不一致(B-124,度量)
- ① 问题描述:同一台账三种正则得三组数:严格
57/333=17.1%、宽松 165/866=19.1%、R118 口径 86/812=10.6%;无法跨轮比较。
- ② 测试 bug 点:
docs/tdd/tools/test_report_metrics.py(无输出、口径未固化)与各轮报告手写正则。
- ③ 最优修改方案:把锚点定义为「测试代码中被引用的唯一 TC 编号 / 台账中定义的唯一 TC 编号」,正则写进脚本并输出 JSON,报告只引用脚本结果。
- ④ 修改目的:让 G9 可复算、可跨轮对比。
- ⑤ 闭环:连续 2 轮报告 G9 数值由脚本产出且一致。
9. 门禁结论
| 门禁 |
判据 |
实测 |
结论 |
| G1 全量通过率 |
≥95% |
98.37%(3444/3501) |
✅ |
| G2 红例数 |
≤10 |
50(后端 33 + 根级 16 + langgraph 1) |
❌ |
| G3 前端 Jest |
0 红 |
423 过 / 0 红 / 3 skip |
✅ |
| G4 管理端 Jest |
0 红 |
116/116 |
✅ |
| G5 编译与完整性 |
testCompile 0 错 + XML 无沉默 |
345 源 0 错;339/339 |
✅ |
| G6 浏览器 |
28/28 |
28/28 |
✅ |
| G7 langgraph |
0 红 |
1 红 |
❌ |
| G8 鉴权契约 |
全 401 |
23/23(含 /api/mind/**) |
✅ |
| G9 SRS 锚点 |
≥80% |
17.1%(严格)/ 19.1%(宽松) |
❌ |
| G10 双节点派发 |
251 + 189 均实派 |
251 ✅ / 189 ⚠️(通道通、仓库陈旧不可承载) |
⚠️ 部分 |
| G11 CI 含后端全量 |
存在 blocking 全量 |
无 |
❌ |
| G12 用例入库 |
本轮有新增/更新 |
无 SRS 变更 → 不新增(合规) |
✅ |
总裁决:不通过(有条件)
- 阻塞放行的三项:G2 50 红、G9 锚点 17.1%、G11 无 CI 全量。
- 相比 R118/R120:G1 +0.31pp、G6 维持 28/28、G7 由 11 红降至 1 红、G8 由「mind 缺项」转为全绿、G10 由 0/2 转为 1/2。
- 放行建议:后端 98.71% 且鉴权契约全绿,可支撑内网灰度;不支撑对外正式发布,除非 G2 中 13 例 B 类产品红有明确结论。
10. 窗口内变更登记(SRS 闸门)
| 检查项 |
结果 |
docs/superpowers/specs 200 份 |
窗口内 零新增 / 零修改(find -newermt "2026-11-10 11:28" 零命中;git diff 730b7058a..HEAD 该目录无输出) |
docs/tdd/user-scenarios 11 份 |
零变更 |
docs/superpowers/api/API_REFERENCE.md |
零变更 |
| 代码侧变更 |
窗口内仅 eeb147273(langgraph 修复)与 84239ce22(/api/mind/** 鉴权)——均为既有规格的实现落地,不产生新用例需求,已由既有 pytest / 契约用例覆盖 |
| 结论 |
不新写用例;SRS→用例映射关系保持,缺口转 §6 G-123-7 |
11. 度量
| 指标 |
值 |
测试类 / @Test / @Disabled |
339 / 2854 / 4 |
控制器 / @GetMapping |
363 / 8(违 AGENTS.md) |
| SRS 规格 / 用例台账 |
200 / 14 |
场景(^## 场景) |
198 |
TC(严格 /TC-[A-Z]{1,3}-[A-Z]{1,2}-?\d{1,3}/) |
333 |
| TC(宽松,含引用) |
866 |
可执行 TC 锚点(唯一,排 generated) |
165 |
| 锚点率 |
17.1%(严格)/ 19.1%(宽松) |
12. 本轮方法论沉淀
- 远程 shell 派发失败要分三态查:
401/000(凭据/端口)→ create 404 LocationNotFound(工作目录不存在,如 189 的 C:\cfc)→ create 200 但 output 空(对象被回收)。本轮 189 的失败是第二种,而非历轮记的「鉴权门控」。
- 同节点重复建 shell 会杀掉在跑的进程:首轮 251 pytest 跑到第 36 例即被后续
tail shell 打断(日志无 summary 且有 DONE_0)。正确做法是 setsid nohup 分离 + 本地 sleep 后一次性读文件,读文件期间不得再建 shell。
-q 的进度点就是用例数:...F................................ 的字符数可用于判断「是否被截断」,比等 summary 更早发现异常终止。
- 判「节点能否承载浏览器任务」不能只看端口:189
4090 OPEN 且 shell 可建可读,但仓库停在 feature/user-is-child @ e3e52ca38、无 node_modules、无 tests/e2e-live → 能力缺失。必须先 Test-Path tests\e2e-live; Test-Path node_modules 再派发。
- 环境能力禁止凭记忆判定(第 4 次复发):每轮固定
java -version && mvn -v && df -h 探针,未跑探针不得写「降级」。