• 起因:增量改一个功能仍会跑全量 e2e——用户改的功能与被跑的用例(如打印按钮那条)
    毫无关系。实测 test-gate 占全流程墙钟 13.3%,且后端每个模块的 scripts/test.mjs
    内部还会各跑一遍全量 playwright。
    
    coding.mjs 新增 args.testScope(缺省 'affected',逃生口 'full'):
    
    - **只收窄 e2e 段**。build / lint / 后端单测+集成 / 前端 vitest 一律仍全量——它们是
      分钟级的,却是编译期与逻辑回归的第一道网,砍掉省不下多少却漏掉最常见的连带破坏。
    - 前端阶段 test-gate:范围 = 本轮待跑 FE 各自 plan 里 `测试先行类型 = e2e` 的
      test_file 并集(verify 段早有同款推导,line 659);取不到则退冒烟集。
    - 后端模块 test-gate(本轮无 FE 改动):退到 frontend/e2e/__smoke__/ 冒烟集。
      不跳过 e2e 段——它同时是起栈健康检查。
    - 首跑(全新项目)时「本轮待跑 FE」天然等于全部 FE,affected 与 full 重合;收窄只在
      /add-req 后的增量重跑里真的生效,这正是它存在的场景。
    
    载体是 env ERP_E2E_SCOPE,**scripts/test.mjs 一个字未动**——它的 setup→build→lint→
    test→e2e→promote→drop 是迁移晋升链路的契约,且模板改动不落已生成项目(见 preflight
    硬门);env 经 spawnSync 天然继承到 playwright 进程,前后端两条路径同一个开关。
    消费端由 fe-skeleton 生成的 playwright.config 实现(未设=全量,绝不默认收窄),
    同时生成与业务解耦的冒烟集;state 判据同步加严,存量项目会重跑一次骨架 stage 补齐。
    
    防假绿(收窄的唯一真风险):范围推导错的表现是「0 条用例 + exit 0」,与真绿不可区分。
    GATE_SCHEMA 加 e2eScope/e2ePassed,编排层 guardEmptyE2e() 硬判——green 且明确 0 条一律
    翻 red 走既有 retry/仲裁链。module-report 被要求如实记录本次范围,禁止拔高成「全量回归」。
    
    新增 /erp-workflow:full-test(skills/coding/full-test):跑 scripts/test.mjs 全链 +
    显式清空 ERP_E2E_SCOPE 的全量 e2e,出 full-regression-<日期>.md 证据并提交。
    前置硬门:工作树干净(绿后会晋升迁移到源库)、不与正在跑的 coding 流程撞端口。
    后台子进程 + 回合内轮询;只跑测试、不改源码、红了只报告不修复。
    
    代价明说:增量轮里跨功能连带回归(改共享组件 / router / 全局状态 / API 契约 / DB 迁移
    打破没动过的功能)不再有网,由 /full-test 按需兜底。逃生口 testScope: "full"。
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    yanghl authored
     
    Browse Dir »