report-test-2026-11-11-R134.md 23 KB

测试负责人工作汇报 · 第 134 轮(2026-11-11 02:10 GMT+8,本自动化触发)

执行档:review(内网 cfc.iwintrue.com/admin + /frontend 浏览器自动化已授权;langgraph@251 分派;未联网装依赖、未启停服务、未改生产代码;测试侧自处置 4 个测试类改装置 + 新增 1 个契约测试类) 基线 HEAD:b7d74eedc(R133,01:35 推送)→ origin/cfclub == local HEAD(窗口内零源码提交、零 SRS 变更、零部署) 节点:192.168.16.251:9000=200(langgraph 在线)|251:4096=200(opencode 在线,本轮实派 pytest)|189:4090=200(opencode 在线,本轮未派发浏览器)|204:4090=000(B-95 第 8 轮) 分工:本机=浏览器全套(admin 5 + fe 6 + shop 4 + health 13)+ Jest(web/fe/根级)+ 后端全量实测|251=langgraph pytest(实派 51 例) 结论:⛔ 不通过(有条件) — 三项历史红线未变(G2 后端红、G9 锚点率、G11 无 CI 全量门禁);本轮实质推进:测试侧闭环 16 个装置类红例(后端红例 33 → 17,通过率 98.71% → 99.28% 为历史新高),并新建 S-cfc-131 标签筛选契约测试 10 例(补上研发台账里的 RED 键契约缺口)。


1. 历史审查记录(仅作对照,不作为本轮结论依据)

轮次 时间 后端全量 langgraph@251 浏览器 结论
R130 11-10 20:55 2865 例 / 2828 过 / 33 红 / 98.71% 38/43(5 红全 429) 28/28 不通过(有条件)
R132 11-10 夜 沿用 R130(零部署) 33 绿 / 10 环境阻塞 28/28 不通过(有条件)
R133 11-11 01:16 沿用 R130(零部署) 33 绿 / 10 环境阻塞 28/28(B-59 自处置闭环) 不通过(有条件)
R134(本轮) 11-11 02:10 343 类 / 2918 例 / 2897 过 / 17 红 = 99.28% 44 绿 / 7 红(全环境) / 51 例 28/28 不通过(有条件)
  • 本轮为该对象第 134 轮持续闭环审查,非首次审查。
  • 与 R133 对比的三处实质变化:
    1. 后端红例从 33 降到 17(实测):装置类 16 例(CfCommission 8 / ArticleAutoTag 4 / GrowthRecordSync 3 / TaskPlan 1)由测试侧改装置修复,全部转绿;
    2. S-cfc-131 契约缺口被补上:研发 R107 汇报明确「content.article.listByTag RED 键、实现 6e9a511e2 已在链、契约测试缺」→ 本轮新增 ArticleTagFilterContractTest 10 例;
    3. langgraph 口径由 43 例变 51 例:本轮显式排除 tests/qna 与 tests/test_chat.py(B-84)后收集 51 例,红例 7 全为 LLM 凭据/配额(401 + 429),非回归。
  • 沿用项(零变更故不重复取证):dx-bridge 2 例部署滞后 404/502(B-DX-1)、G11 无 CI、G9 锚点率口径。

2. 项目画像速览

  • 业务:浠艾福 XAF —— 家庭教育 SaaS(家庭成员 / 五维能量 / 成长规划师 / 健康报告解析 / 商城分佣 / AI 管家 / 知识中心)。
  • 技术栈:cfc-backend(Spring Boot 2.7.18 + MyBatis-Plus + Java 8,9082)· cfc-web(Vue2 + ElementUI,8082)· cfc-frontend(uni-app H5/小程序)· cfc-langgraph(FastAPI + LangGraph + Chroma,9000,部署 192.168.16.251)· dan/danshop(独立商城 8888)。
  • 关键路径:登录/家庭邀请 → 五维测评 → 成长任务审批 → 健康报告上传解析 → 商城下单分佣 → AI 对话 → 知识中心标签筛选(S-cfc-131,本轮新增契约)。
  • 测试现状:后端 340 测试类(+1 新增契约类);前端 Jest 28 套件 475 例;管理端 Jest 17 套件 116 例;浏览器 live 28 例;langgraph 51 例(251 实派);根级黑盒 23 例。
  • 质量目标:20 类全覆盖、G1≥95%、G2≤10 红、G6 28/28、G7 0 红、G9≥80%。
  • 风险点:后端剩余 17 红集中在产品/契约待裁决(EnergySystem 6×500、Orchestration 2、WechatLogin 2、MembershipPay / PaymentORD / TeamProfitCron 各 1、DimensionRegistryMap 3 契约口径、platform_fee 截断);langgraph LLM 链路凭据 401 + 配额 429 未解(B-74/B-134);无 CI 全量门禁。

3. 20 类测试覆盖矩阵(三态:已实测 / 未发现 / 待核实)

# 测试类型 状态 证据
1 单元测试 ✅ 已实测 后端全量 2918 例(本轮实跑)+ 新增契约 10 例;web 116;fe 472
2 组件测试 ✅ 已实测 Vue shallowMount 组件用例(fe 28 套件 / web 17 套件全绿)
3 接口 API 测试 ✅ 已实测 后端控制器 MockMvc/直调;本轮新增 ArticleTagFilterContractTest 10 例(/list tag 过滤 + /tags 聚合)
4 集成测试 ✅ 已实测 integration.* 实跑(EnergySystem / GrowthRecordSync 等逐例比对)
5 系统/端到端 E2E ✅ 已实测 浏览器 live 28/28(admin 5 + fe 6 + shop 4 + health 13,本机单节点串行 workers=1)
6 冒烟测试 ✅ 已实测 浏览器 28 例 + Jest 588 例零红即冒烟面
7 回归测试 ✅ 已实测 本轮后端全量 + Jest 全绿 + 浏览器 28/28;装置类 16 红转绿后回归面收敛
8 探索性测试 ⚠️ 待核实 本轮定向探针(分佣链路静默跳过取证、ArticleService 异步任务计数取证);无 chartered 探索会话
9 验收 UAT / BDD ⚠️ 待核实 无 cucumber/gherkin 执行证据
10 性能测试 ⛔ 未授权未执行 压测属 execute 档(需联网授权),本轮未做
11 可靠性测试 ⚠️ 待核实 无混沌/恢复演练;仅观察 429 配额窗口与 langgraph 401
12 安全测试(SAST/DAST/SCA/渗透) ⛔ 未授权未执行 依赖漏洞扫描/DAST 需联网;仅静态项 + 鉴权契约
13 兼容性测试 ⚠️ 待核实 仅 Chromium 单浏览器;无多浏览器矩阵
14 可用性测试 ⚠️ 待核实 无真实用户可用性证据
15 无障碍测试 ⚠️ 待核实 无 axe/WCAG 扫描
16 覆盖率度量 ⚠️ 已实测(低) cfc-web 语句 10.09% / 分支 6.12% / 函数 7.50% / 行 9.97%(沿用 R130);后端 JaCoCo 未接入
17 变异测试 ⛔ 未发现 无 PIT / mutation 资产
18 契约测试 ✅ 已实测 health 鉴权 13/13 + shop 排序 4/4 + admin.referral 16/16(R132)+ 新增 article 标签 10/10
19 QA 流程 ⚠️ 待核实 134 轮闭环可追溯;门禁未脚本化(G11)
20 全项目代码审查 ⚠️ 待核实 仅规范扫描,未跑全量静态审查

4. 实测结果明细(本轮真实信号)

4.1 后端全量(本机,JDK1.8.0_25 + Maven 3.6.1,mvn -o -B clean test)

  • 343 类 / 2918 例 / 2897 过 / 16F + 1E + 4S = 99.28%(剔 skip 99.42%),56:53,BUILD FAILURE(仅测试红,编译零错)。
  • 完整性:343/343 XML 全产出、静默丢失 0;testCompile 349 源 0 错;target/classes 2326 个 class。
  • 恒等式:@Test 2917 + 参数化展开净增 1 − @Disabled 4(计为 skip)= 2918,误差 0(本轮无早退截断)。
  • 10 个红类 / 17 红例(全部为已知产品/契约面,无装置类):EnergySystemFlowTest 6 + DimensionRegistryMapContractTest 3 + GuideModuleIntegrationTest 1E + OrchestrationEngineTest 1 + OrchestrationIntegrationTest 1 + MembershipPaySwitchTest 1 + PaymentServiceORDRoutingTest 1 + UserServiceWechatLoginTest 1 + UserServiceWechatLoginContractTest 1 + TeamProfitCronContractTest 1。
  • 方向性变化(对比 R130 基线 33 红 / 98.71%):红例 33 → 17(−16)、通过率 98.71% → 99.28%(+0.57pp);红类集合里 CfCommissionServiceSettleTest / ArticleAutoTagServiceTest / GrowthRecordSyncFlowTest / TaskPlanServiceTest 四类全部转绿,与测试侧改装置一一对应。

4.2 其余套件

# 维度 命令/方式 节点 结果
1 cfc-frontend Jest npx jest --ci 本机 ✅ 28 套件 / 472 过 / 3 跳 / 0 红(29.2s)
2 cfc-web Jest npx jest --ci 本机 ✅ 17 套件 / 116 过 / 0 红(40.8s)
3 根级黑盒 npx jest -c tests/jest.config.js --ci 本机 ⚠️ 7 过 / 16 红(8.5s,全 ECONNREFUSED 127.0.0.1:9082,B-36 第 33 轮零漂移)
4 小程序 H5 E2E --project=frontend-mobile 本机 ✅ 6/6
5 商城排序契约 --project=shop-api 本机 ✅ 4/4
6 健康鉴权契约 -c playwright.config.health.js 本机 ✅ 13/13(6.1s)
7 管理端 UI E2E -c playwright.config.live.js --project=admin-desktop 本机 ✅ 5/5(1.3m,B-59 修复后连续 2 轮稳定)
8 langgraph pytest 251 实派 /sc-data/cfc/cfc-langgraph 251 ⚠️ 44 过 / 7 红 / 51 例(125.6s,--ignore=tests/qna --ignore=tests/test_chat.py)
9 S-cfc-131 契约 mvn -Dtest=ArticleTagFilterContractTest 本机 ✅ 10/10(见 §5)

langgraph 7 红取证(全环境,非回归):

  • test_auto_tag.py 3 例(content_relevance / short_content / empty_content):call_chat 返回 429;
  • test_intent.py 4 例(classify_analysis / recommend / mind / health):断言 assert CHAT == ANALYSIS,日志 意图分类失败: Error code: 429 - API rate limit for free users (AgnesAI_error),默认 chat → 429 被静默兜底成 chat;
  • 另有 chat_graph.py:148 召回记忆失败: 401 - api key ****ab12 is invalid → 记忆召回链路凭据失效(不影响用例判定,但会降低回答质量)。
  • 窗口内 cfc-langgraph/app 与 tests 零 commit → 判环境红(B-74/B-134-4)。

主口径合计(本轮实测面):3621 例 / 3574 过 / 40 红 / 7 skip = 98.70%(剔 skip 98.89%) = 后端 2918(2897 过 / 17 红 / 4 skip)+ 新契约 10(全绿)+ web 116 + fe 475(472 过 / 3 skip)+ 根级 23(7 过 / 16 红)+ langgraph 51(44 过 / 7 红)+ 浏览器 28。


5. 本轮测试侧闭环明细(16 红转绿 + 10 新契约例)

# 测试类 修复前 修复后 根因(测试 bug 点) 处置
1 CfCommissionServiceSettleTest 8 红(WantedButNotInvoked,cfBalanceService 零交互) 12/12 绿(2.8s) 类里缺 @Mock ProductOrderMapper / OrderItemMapper → calcOrderPpoints 内 productOrderMapper.selectById NPE 被 catch 吞掉 → basePpoints=0 → distributeToReferrers 静默 return(CfCommissionService.java:203) 补 2 个 mock + 订单夹具;同步「P点=实付−成本」(c22aca496)新口径断言
2 ArticleAutoTagServiceTest 4 红(TooManyActualInvocations / NeverWantedButInvoked) 8/8 绿(0.35s) 发布路径新增「朗读音频预生成」异步任务(ArticleService.java:915 / :1253),taskExecutor.execute 由 1 次变 2 次,旧断言写死 1 次 断言改 2 次(空标签)/ 1 次(标签非空,仅音频),差量即打标任务
3 GrowthRecordSyncFlowTest 3 红(2 NPE + 1 文案断言) 10/10 绿(130s) ① uploadAndParse(null) 传 null 文件 → file.isEmpty() NPE;② createRecordWithOrder 未打桩 assessmentOrderService.createOrder → 返回 null → order.getOrderNo() NPE;③ 文案由「请选择孩子」改「请选择家庭成员」(AGENTS.md 口径) 改用 MockMultipartFile + 打桩 store/parse 链路;打桩下单返回订单;断言对齐 Stage-1 返回结构 {sourceFileUrl, parsed, reportDateStr, hasDate}
4 TaskPlanServiceTest 1 红(planId 期望 100 实为 null) 4/4 绿(0.33s) insert 的 Answer 把 ID 设到另一个对象 capturedInstance,而服务读的是传入实例 TaskPlanService.java:300 Answer 内改为对 invocation.getArgument(0) 赋值
5 ArticleTagFilterContractTest(新增) 0(不存在) 10/10 绿 S-cfc-131 content.article.listByTag 契约缺失(研发 R107 台账 RED 键) 新建 10 例:tag JSON/逗号两种存储、空 tag 不过滤、无匹配空页、精确匹配(子串不命中)、频次降序、并列字典序、limit≤0 默认 20、空标签忽略、POST /api/articles/tags + body.tag 透传

说明:CfCommissionServiceSettleTest 修复前有 3 例 never() 断言是假绿(早退导致「零交互」天然成立),补 mock 后才真正守护「同家庭跳过 / 最多两级 / 幂等不重复记感恩」。这也是本轮把「装置缺陷」而非「产品回归」定性的关键证据——窗口内 CfCommissionService.java 零 commit。


6. 覆盖缺口清单

# 缺口类型 现状 风险 建议测试设计 优先级 闭环方式
G-134-1 后端剩余 17 红(产品/契约) EnergySystem 6×500、Orchestration 2、WechatLogin 2、MembershipPay/PaymentORD/TeamProfitCron 各 1、DimensionRegistryMap 3(P-9 第 10 轮)、platform_fee 截断 真回归被淹没在固定红里 按类分批:产品类交研发修;P-9 由研发拍板口径后二选一改用例 P0 研发修完复跑该类 + 全量,连 2 轮绿销号
G-134-2 langgraph LLM 链路 251 凭据 401(****ab12)+ AgnesAI 免费额度 429;intent_classifier.py:62 把 429 兜底成 chat 配额/凭据故障被误读为分类缺陷 LLM 依赖用例标 @pytest.mark.llm 拆非门禁套件;429/401 抛外部服务异常而非默认 chat P0 运维换 Token + 研发改兜底语义后连跑 2 轮
G-134-3 分润基数语义歧义 settle(...7参) javadoc 称 orderAmountCent 为「推荐人分润基数」,但实现 calcOrderPpoints 取 paidAmountCent 用例断言面可能与产品意图不一致 研发确认后固化 javadoc 与用例(当前按 c22aca496 实现口径断言,已在用例注释标注待确认) P1 研发回帖确认 → 用例锁死口径
G-134-4 锚点率 TC 唯一编号 863,末列可执行锚点约 10%(口径沿用 R130) 用例→代码追溯弱 锚点口径固化「TC 末列含可执行用例名或 spec 路径」 P2 研发补锚点至 ≥80%
G-134-5 CI 全量门禁 无 CI 跑全量 回归无法自动拦截 落地 CI 全量 job(需联网建管道,未授权) P1 研发/运维建 pipeline
G-134-6 189 节点浏览器未派发 189:4090=200 且历史连续 4 轮 5/5,但 dispatch_shell.cjs 内置 tail 拉取与 Windows PowerShell 不兼容 缺第二节点冗余证据 为 Windows 节点补 Get-Content 分支的派发器 P2 派发器支持双平台后复跑
G-134-7 用例更新纪律 本轮达标(G12):窗口内 SRS/场景零变更;S-cfc-131 由实现驱动补 10 例契约 — 变更触发流程 — 已满足

7. 域结论表

审查维度 负责专家 结论 关键证据
单元·组件级 苏雅 ✅ 本轮显著改善 装置类 16 红转绿(4 类 34 例 → 33 绿);fe 472 / web 116 全绿;变异测试仍缺失
集成·接口级 柯砚 ✅ 有推进 新增 article 标签契约 10/10;admin.referral 16/16(R132);GrowthRecordSync 10/10;dx-bridge 2 例部署滞后未重跑
系统·验收级 白樾 ✅ 绿 浏览器 live 28/28(admin 5 / fe 6 / shop 4 / health 13);UAT/BDD 证据仍缺
测试保障级 闻朔 ✅ 零回归 后端全量 + Jest 588 例 + 浏览器 28/28;B-59 时序哨兵连续 2 轮稳定
性能·可靠性 骆骋 ⛔ 未授权未执行 压测未做;429 配额窗口与 401 凭据为环境可观测项
安全 关屿 ⚠️ 静态趋稳 / 动态缺失 鉴权契约 13/13;SAST/DAST/SCA 未授权
兼容·体验 阮清 ⚠️ 待核实 单 Chromium;无可用性/无障碍证据
流程·度量·代码 何序 ⚠️ 有缺口 锚点约 10%、无 CI;@GetMapping 8 处仍违 AGENTS.md
langgraph 专项(251) 陆谨汇总 ⚠️ 环境红 7 44/51;红例全为 401 凭据 + 429 配额(非回归)

8. 五要素问题清单

问题 1 · 分佣结算链路因测试装置缺 mock 而整链静默跳过(已自处置)

  • ① 问题描述:CfCommissionServiceSettleTest 8 例报 WantedButNotInvoked 且「cfBalanceService 零交互」,看起来像产品停止发放销售奖。
  • ② 测试 bug 点:CfCommissionServiceSettleTest.java:99-101 未声明 @Mock ProductOrderMapper / OrderItemMapper;CfCommissionService.java:349 调 productOrderMapper.selectById 在 try 内 NPE,被 :381 catch 吞成 log.warn → 返回 0 → :203 早退。
  • ③ 最优修改方案:补 2 个 @Mock 字段 + setUp 内打桩订单(qty=1、无明细行),并按 c22aca496 的「P点=实付−成本」口径更新基数断言(100→10000;分离用例给成本 2000 → 断言 8000)。
  • ④ 修改目的:让 12 例真正执行到 distributeToReferrers,恢复「两级销售奖 / 同家庭跳过 / 上限封顶 / P点日志」的守护力(原本 3 例 never() 是假绿)。
  • ⑤ 闭环验证:mvn -Dtest=CfCommissionServiceSettleTest → 12/12 绿(2.8s);全量红例集合中该类消失即闭环。

问题 2 · 发布路径异步任务数变化导致自动打标用例全红(已自处置)

  • ① 问题描述:ArticleAutoTagServiceTest 4 例红,报「多了 1 次 execute」或「本该 0 次却有 1 次」。
  • ② 测试 bug 点:ArticleAutoTagServiceTest.java:65/74/103/138 按「发布只调度 1 个异步任务」断言;生产 ArticleService.java:915、:1253 新增朗读音频预生成后发布路径有 2 个任务。
  • ③ 最优修改方案:空标签发布改断言 2 次、标签非空改断言 1 次(差量即打标任务),并在用例注释写明 1 次=音频。
  • ④ 修改目的:保留「标签为空才打标」的判定能力,同时不再因新增音频特性误报。
  • ⑤ 闭环验证:mvn -Dtest=ArticleAutoTagServiceTest → 8/8 绿(0.35s)。

问题 3 · 成长档案接口契约漂移导致 3 例红(已自处置)

  • ① 问题描述:GrowthRecordSyncFlowTest 2 例 NPE、1 例文案断言失败。
  • ② 测试 bug 点:GrowthRecordSyncFlowTest.java:204 传 null 文件给 uploadAndParse;:164 未打桩 assessmentOrderService.createOrder(返回 null → order.getOrderNo() NPE);:130 断言「请选择孩子」。
  • ③ 最优修改方案:改传 MockMultipartFile + 打桩 storeFile/getFilePath/parseReport;打桩下单返回 AssessmentOrder;文案断言改「请选择家庭成员」,并按 Stage-1 契约 {sourceFileUrl, parsed, reportDateStr, hasDate} 断言。
  • ④ 修改目的:对齐「孩子→家庭成员」重构与 Stage-1/Stage-2 拆分后的真实返回结构,避免用旧契约判产品。
  • ⑤ 闭环验证:mvn -Dtest=GrowthRecordSyncFlowTest → 10/10 绿(130s)。

问题 4 · S-cfc-131 标签筛选 RED 键缺契约测试(已自处置)

  • ① 问题描述:研发 R107 台账 content.article.listByTag(S-cfc-131)红键,实现 6e9a511e2 已入链但无契约测试,键无法转 GREEN。
  • ② 测试 bug 点:cfc-backend/src/test 全目录无 listByTag/listTopTags 相关用例(grep 零命中)。
  • ③ 最优修改方案:新增 ArticleTagFilterContractTest(10 例),锚定规格 §3.1 的 4 条条款。
  • ④ 修改目的:把「知识中心 Tab 由五维改文章标签」这一 SRS 变更变成可回归的契约,防止 tag 参数被静默丢弃(前端传 tag、后端读 body.tag 的断裂点)。
  • ⑤ 闭环验证:mvn -Dtest=ArticleTagFilterContractTest → 10/10 绿(6.29s,BUILD SUCCESS);键可置 GREEN。

问题 5 · langgraph LLM 用例红为凭据 401 + 配额 429(待研发/运维)

  • ① 问题描述:251 实派 51 例中 7 红,auto_tag 3 例、intent 4 例。
  • ② 测试 bug 点:非测试 bug;app/agents/intent_classifier.py:62 捕获异常后 默认 chat,把 429 伪装成分类错误(吞错点)。
  • ③ 最优修改方案:运维换有效 Token(当前 ****ab12 401);研发把 429/401 抛 ExternalServiceError 而非回落 chat;LLM 依赖用例加 @pytest.mark.llm 并从门禁套件剔除。
  • ④ 修改目的:让「分类错误」与「上游不可用」可区分,避免红线误判产品回归。
  • ⑤ 闭环验证:换 Token 后 251 连跑 2 轮 51/51 绿即销号 B-74/B-134-4。

9. 门禁结论

门禁 指标 阈值 本轮 判定
G1 主口径通过率 ≥95% 98.70%(主口径 3574/3621;剔 skip 98.89%) ✅
G2 红例数 ≤10 40(后端 17 + 根级 16 + langgraph 7) ❌
G3 cfc-web Jest 全绿 116/116 ✅
G4 cfc-frontend Jest 全绿 472 过 / 3 跳 ✅
G5 编译 + XML 完整性 0 错 / 无沉默 编译 0 错 / 343 类 2326 class / 343 XML 无沉默 ✅
G6 浏览器 live 28/28 28/28 ✅
G7 langgraph 0 红 44/51(7 全环境) ❌
G8 鉴权契约 全 401/403 13/13(mind 已销号) ✅
G9 SRS/TC 锚点率 ≥80% ≈10% ❌
G10 节点分派 251 + 浏览器节点 251 ✅ / 189 未派发 ⚠️
G11 CI 全量门禁 存在 无 ❌
G12 SRS 变更→用例同步 合规 合规(S-cfc-131 补 10 例) ✅

总裁决:⛔ 不通过(有条件) —— G2/G7/G9/G11 未达标,其中 G7 为环境红、G9/G11 为流程债;本轮把 16 个装置类红例清零并补齐 1 个 RED 键契约,属方向性改善。 复评条件:① 后端 17 红按批修复或口径裁决;② 251 换 Token 后 51/51;③ CI 落地全量 job;④ TC 锚点补齐至 ≥80%。


10. 附录 · 本轮命令

# 后端全量(本机)
cd cfc-backend && JAVA_HOME=/d/jdk1.8.0_25 PATH=$JAVA_HOME/bin:/d/maven/apache-maven-3.6.1/bin:$PATH mvn -o -B clean test
# 装置类定向验证
mvn -o -B -Dtest=CfCommissionServiceSettleTest,ArticleAutoTagServiceTest,GrowthRecordSyncFlowTest,TaskPlanServiceTest -DfailIfNoTests=false test
# 新增契约
mvn -o -B -Dtest=ArticleTagFilterContractTest test
# 前端/管理端/根级
cd cfc-frontend && npx jest --ci ; cd ../cfc-web && npx jest --ci ; cd .. && npx jest -c tests/jest.config.js --ci
# 浏览器(必须在 tests/ 目录内,B-52)
cd tests && npx playwright test -c playwright.config.live.js --project=frontend-mobile --project=shop-api
npx playwright test -c playwright.config.health.js
npx playwright test -c playwright.config.live.js --project=admin-desktop
# langgraph(251 实派,kick 分离 + 本地单次读)
MSYS_NO_PATHCONV=1 BASE=http://192.168.16.251:4096 DIR=/sc-data/cfc/cfc-langgraph \
  CMD='cd /sc-data/cfc/cfc-langgraph && setsid nohup timeout 1700 .venv/bin/python -m pytest -q --ignore=tests/qna --ignore=tests/test_chat.py > /tmp/r134_pytest.log 2>&1 &' \
  node docs/tdd/tools/dispatch_shell.cjs