-
起因:增量改一个功能仍会跑全量 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>
-
与 quick-field 成对:纯前端直改 frontend/(lint/类型检查 + grep 自检, 不起栈、不跑行为门/e2e),可见布局变化同步 prototype/、按需更新 docs/08 §三 FE 行文字,台账重基线但绝不作废 req-done/milestone tag——前端阶段 不重跑。硬边界:只消费 docs/05 既有端点、不新增页面/路由/FE 行,超界 回落 /add-req。 同步:docs/08 §四 标题泛化为「微改待验清单(quick-field / quick-ui)」 两通道共用(quick-ui 含旧标题迁移指令);quick-field/add-req 分流提示 互指;plugin.json 注册(10→11 skill);README 目录树/入口表(4→5)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
保 schema SSoT 不缩水(V_n ALTER + docs/03 同步 + validate-ddl fail-closed), 代码主会话直改 + grep 清单/轻量编译自检;台账 req-ledger 重基线但绝不作废 req-done/milestone tag——Router 视一切已完成,不冷起栈、不跑测试门/行为门。 未过行为验收的字段登记 docs/08 §四 待验清单,攒批人工勾销。 硬护栏:仅追加式 ADD COLUMN(可空/带 DEFAULT)+ 既有链路多带一个字段, 超界回落 /add-req;步骤 0 要求台账干净(防全量重基线吞掉其他待处理增量); 禁手动灌库(源库 Flyway 托管,绕 history 会重复 apply 报错)。 同步:plugin.json 注册(9→10 skill)、README 目录树/入口表、add-req 顶部分流提示。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
初始 Plan 完结后追加/修改需求时,只跑增量、不必整仓重跑。 - lib/req-ledger.mjs(+单测):对 docs/01 REQ 卡 + docs/08 §三 FE 行算 sha256 内容哈希, 对比 .req-ledger.json,scan/commit 出 new/changed/removed/unchanged - skills/plan/add-req:新增 user-invocable 增量入口。基线→检测→校验真实数据→ A3-delta(写 V_n migration + 同步 docs/03,永不改 V1)→A5-delta(docs/05/02/08)→ 作废 changed 单元的 req-done/milestone tag→提交台账。Router 无需改动,缺 tag 即重跑 - 变更识别靠内容哈希(非仅 tag 缺失):改过的老 REQ 也能认出并作废其 req-done, 否则 Router 会跳过它——OpenSpec delta 思路的零依赖落地 - 首跑无台账则先建基线,避免把存量误当新增重跑整仓 - plugin.json 注册第 9 个 skill + 版本 0.2.0→0.3.0;CLAUDE 模板 Schema 演化补增量 V_n 规约 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
-
- delete frontend-scope-lock skill + docs/06 templates (static + module-pagelist) - A5 downstream-gen gains prototype/ gate + FE-list derivation -> docs/08 § 三 - plan-start: drop A6 dispatch row, gate 5->4 items; coding-start A0~A6 -> A0~A5 - Design Tokens single source = src/styles/tokens.css (code-reviewer, coding.mjs) - plugin.json skills 9->8; docs-09 tree drops 06-UI; docs-08 drops A6 section
-
Visual clarity: the file tree now matches the README's phase model. - skills/plan/ — 8 skills (plan-start entry + A0~A6) - skills/coding/ — 1 skill (coding-start thin entry) Slugs unchanged. /erp-workflow:<name> still resolves identically because each SKILL.md declares its own `name:` frontmatter (verified for all 9). Plugin loader treats the default `./skills/` scan as flat, so the nested layout is opted into via an explicit path array in plugin.json — the only mechanism Claude Code provides for nested skill discovery. Changes: - mv skills/{plan-start,project-init,scope-lock,skeleton-gen, db-design-gen,db-init,downstream-gen,frontend-scope-lock} → skills/plan/<same>/ - mv skills/coding-start → skills/coding/coding-start/ - .claude-plugin/plugin.json: skills[] now lists all 9 explicit paths - README.md: directory tree + Skill 清单 heading updated to reflect grouping No code touches any skill path (only README did, and only in the tree diagram). lib tests still pass (62/62). -
Independent Claude + Codex review of the working-tree diff surfaced 23 issues; all applied in-place across three domains. workflows/coding.mjs (9): - spec/plan/verify/review prompts now git-commit their artifacts (closes milestone-dirty-worktree halt risk) - CHECKBOX_STATE_SCHEMA requires `state` + defensive guard in reviewWithFixLoop - writeDocs08FieldPromptM scopes edits to module via line anchor - assertSafeId guards Router output (module/REQ/FE ids) - featureLoop captures reviewWithFixLoop's return value - dateFromArtifactPath rejects impossible dates (9999-99-99 etc.) - terminal HALT review-unresolved message disambiguated - updated comment on top-level `return` (ESM vs node --check) lib/validate-ddl.mjs + tests (10): - extractType preserves unsigned/signed modifiers - KEY/INDEX fallthrough no longer creates spurious 'KEY' columns - FOREIGN KEY REFERENCES accepts schema-qualified `db.table` - index keys normalized to name:kind:cols (UNIQUE-aware) - FK keys include ON DELETE action (defaults to RESTRICT) - CREATE TEMPORARY TABLE parsed - parseForeignKeyBullet/parseIndexBullet reject prose bullets - +10 regression tests (62 total, all pass) - merge-gitignore.mjs docstring synced to implementation skills/ (4): - docs-06 template header: § 一~二 → § 一~三 - downstream-gen §A steps renumbered 1-7 (was 1,3,4,5,6,7,8) - docs-08 initial template adds tokens.css checkbox - coding-start drops "已在后台启动" wording (Workflow is synchronous)
-
- mr-create → milestone-tag:本地 merge 进默认分支 + 打 milestone/<id> tag,完成后自动回调 coding-start(无人工闸门) - 移除 push/GitLab MR/API:删 deny-no-verify hook、derive-gitlab 脚本、pre-push 模板,env-local 去 GITLAB_* - 完成判定改为 docs/08「里程碑」字段 + git tag -l;README/CLAUDE-template/状态语义同步 - 删除空 skills/internal 目录,skill 计数 27→25 - docs-04 § 一 新增 1.1 规则(后端通用约定)占位,由 skeleton-gen E 填写