• 起因:增量改一个功能仍会跑全量 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 »

  • 原本刻意不传、维持缺省关闭(待 Task 14 收益评估)。现开启:一个模块内的多个
    REQ 不再严格串行走完整条流水线,文件集不相交且不改 schema 的 REQ 进同一批
    并发跑 tdd→verify→review→fix(批宽缺省 2)。
    
    准入是 JS 确定性计算(文件集两两不相交 ∧ schemaChange=false),不信 LLM 单方
    判断;隔离靠 feature worktree + 准入排除 schema 改动 + feature 专属测试库;
    tdd/verify 不起栈不占固定端口,故无需 stackLock。
    
    全链路 fail-open:facts 提取失败 / 准入不过 / lane 建失败一律退回串行链,
    不新增 halt 点。逃生口 features: false。
    
    coding.mjs 未改动——featureBatchRun 及其准入闸本就实现完整,此前只是没打开开关。
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    yanghl authored
     
    Browse Code »

  • 让前端不依赖后端的工作与后端波次并发,所有真后端测试延后。5 类改动:
    - tddPrompt/verifyPrompt 加 feStage:jsdom 模式只处理 jsdom 任务、只跑 vitest、
      硬禁 e2e 命令;e2e 模式只补延后的 e2e 任务。新增 fe-code-done/<FE> 中间 tag。
    - featureLoop 加 feStage 分流:jsdom 跳 review 打 fe-code-done;e2e/all 走
      review→req-done。新增 runFrontendPhase1(前端 worktree,不调 phase()、不
      merge/milestone、永不 throw)。
    - 主循环:frontendOverlap 开时把 frontend-phase 从波次图剔除、起 phase1 与后端
      波次并发;屏障后 reconcile(merge default→frontend-phase)+ 标准
      runModule(feStage=e2e) 主根全栈跑 phase2。后端未全 done / phase1 halt → phase2
      延后、产物保留 resume,绝不新增 halt 点。
    - coding-start SKILL.md + README:开关说明,缺省不传(同 features 闸纪律)。
    
    重叠期前端无栈/无固定端口/无 DB,补 8/9/10 不变量与端口/lane 安全全保住。
    缺省关时 feStage 恒 all、新分支不激活、新编排整段跳过,现行行为零变化。
    语法门通过。设计真值见 docs/superpowers/plans/2026-06-15-frontend-overlap-jsdom.md。
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    yanghl authored
     
    Browse Code »


  • - auto-continue.sh:sentinel 检测只认 transcript 的 assistant 行(修自匹配 bug——
      block reason 自带 [ERP-HALT] 字面量、下次 Stop 命中自己,钩子实际只能续跑一次);
      窗口 60→200 行,兜住「横幅在前、诊断在后」的回合;删 4000B 字节增长启发式
      (与 PostToolUse 清零重复且方向性错误——纯文字空转一轮也超 4000B,上限永远到不了);
      reason 文案去掉对已删 skill 链的指挥与 [ERP-HALT] 字面量。
    - [ERP-HALT] 补全到全部刻意停下点(合计 12 处打印点):add-req 4 处(前置拦截/
      基线停下/空增量/完成横幅)、coding-start 步骤 1/2、plan 阶段 5 处(plan-start
      终结闸 / downstream-gen A5 / db-design-gen 审阅 / scope-lock 骨架 / project-init
      安装失败);coding-start :130 说明文字去字面量防误触发。
    - StopFailure:官方语义为「输出与退出码被忽略、无 decision 控制」(无法在钩子层
      自动续跑;核实于 2026-06-11 code.claude.com/docs/en/hooks.md)。接线
      log-stop-failure.sh:记录中断时间与 error_type 到 $TMPDIR/erp-stopfailure.log,
      供人工/外部 watcher 据此续跑。
    - coding.mjs preflight:起跑线按 docs/04 § 零探测 node/JDK/DB 客户端/测试入口,
      工具链缺失带安装/配置命令的诊断 halt——不再拖到 test-gate 才爆、白跑几十分钟编码。
    zichun authored
     
    Browse Code »
  • 任何 halt 的原因必须直达终端,而不是埋在 Workflow 返回值/RESUME.md/TypeError 里:
    
    - haltError():HALT 抛出前先 log(/workflows 进度叙述行可见)。启动期 4 处
      (invalid-projectRoot / assertSafeId / router-violation×2)换用;模块循环 catch 补
      「⛔ HALT — 模块 <id>:<原因>」;loop-end 补最终状态 log(halt 模块/原因/待跑清单)。
    - agent() null 防御:断网/机器休眠时子代理返回 null,不再以 TypeError 形态 halt——
      adjudicate null→确定性默认 retry;runStage/runAction null→经仲裁重试(上限
      ADJUDICATE_MAX);其余 32 处直调点换 agentR()(null→带 label 的诊断 halt);
      flipDocs08Checkbox 保持裸 agent + null 容忍,守住其「绝不 halt」契约。
    - coding-start 步骤 6:Workflow 通知返回后第一段输出必须是 halt/完成横幅
      (halt 原因全文不许截断或转述 + 已完成/pending 清单 + [ERP-HALT] 终止标记)。
    zichun authored
     
    Browse Dir »
  • cb9da34e 转 coding.mjs Workflow 时把 auto-continue Stop 钩子连同 17 个旧
    coding 子技能一起删了,导致逐 REQ 手动编码会话每个 REQ 完就停下问 continue。
    本提交恢复该机制:
    
    - hooks/scripts/auto-continue.sh(Stop):回合中途结束默认 block 并喂「继续
      推进」,使各 REQ 子任务连跑、用户无需手敲 continue;仅当 transcript 出现
      [ERP-HALT] 或连续空转达上限(8)/无 >4000B 增长时放行停下。
    - hooks/scripts/reset-stall-counter.sh(PostToolUse):有工具调用即清零空转
      计数,真推进时无限续跑。
    - hooks/hooks.json:接线 Stop + PostToolUse(不含已删的 log-cross-module.sh)。
    - coding-start 步骤5「Workflow 已启动」横幅补 [ERP-HALT]:Workflow 转后台后
      主循环干净停下等通知,不被钩子误推去重启 coding-start。
    - .gitattributes:强制 *.sh / hooks.json 用 LF,避免 autocrlf 把 CRLF 注入
      shebang 与钩子输出的 JSON。
    
    钩子在会话启动时加载,需重启已运行会话才生效(开发仓即运行源,无需 commit
    即生效,commit 仅为持久化)。
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    yanghl authored
     
    Browse Dir »
  • P1#2 — validate-ddl 支持增量 migration:
    - parseDDL 新增第三遍 mergeAlterStatements:ALTER TABLE ADD COLUMN /
      ADD [UNIQUE] INDEX|KEY / ADD PRIMARY KEY 并入对应表(仅追加式,
      MODIFY/CHANGE/DROP/RENAME 不处理;并集与文件顺序无关)。
    - CLI 接受多个 DDL 文件:node validate-ddl docs/03 sql/migrations/V*.sql,
      CREATE + 各 V_n 的 ALTER ADD 并集 ↔ docs/03 累积 SSoT 做 4 维比对。
    - add-req SKILL 新增「增量 DDL 校验(fail-closed)」闸门,替换原「多 migration 不适用」说明。
    - 7 个新测试(含 DEFAULT 字面量里的 ALTER 文本不被误吃);52/52 通过。
    
    P1#3 — coding 首跑自动建需求台账基线:
    - coding-start 透传 pluginRoot;coding.mjs ensureLedgerBaseline()
      首跑若 .req-ledger.json 缺失则 commit 基线(幂等、best-effort、缺 pluginRoot 静默跳过),
      使日后 /add-req 能识别增量、免空跑。
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    yanghl authored
     
    Browse Dir »
  • 中断/halt 后重跑能复盘上次状态,不只恢复进度。编码阶段保持全自动静默不变。
    
    - coding.mjs:新增 resumeJournalPromptM + recordResume(best-effort,写失败绝不阻断/
      掩盖主流程)。主循环结束(halt 或全完成)时向 docs/superpowers/RESUME.md 追加一条:
      halt 原因 + 本次自主默认假设(decisions 摘要) + 待跑模块 + 下一步
    - coding-start:新增步骤 3.5,重跑时读 RESUME.md 末尾条目向用户复盘上次 halt/完成状态
    - 进度真值仍是 git tag(milestone/req-done)+ committed 工件——硬中断后 Router 据此续跑;
      RESUME.md 补的是跨会话会丢失的「为何停/做过哪些假设」定向信息(GSD continue-here.md 类比)
    - 硬中断(进程被杀)到不了写入点:那种情况无 halt 原因可记,且 tag+工件已够续跑,无信息损失
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    yanghl authored
     
    Browse Dir »

  • - coding-start / plan-start:去掉已失效的「git 就绪由本入口预检/校验」表述(git 闸已移入 coding.mjs 运行时)
    - skeleton-gen:删除「A2 不再单独出 docs/06/07/09」「原 docs/09 并入」等历史演进注释
    - downstream-gen:描述去掉「A6 已并入此处」历史包袱
    - CLAUDE-template:补全被截断的 migration 规约残句(旧 V_n.sql 保持原样、永不回改)
    - README:修正悬空的「🧭 通用工作准则」引用、删「4 条通用准则」、模板计数 26→19、coding-start git 就绪描述
    zichun authored
     
    Browse Dir »

  • 行为门 v3(docs/design/2026-06-05-frontend-behavior-stage-gate.md):
    - 行为验收从 per-FE review approve 子门迁回阶段末尾一次(phase Behavior,
      featureLoop 后、testGate 前),保留 fix 循环(BEHAVIOR_STAGE_MAX=3 轮,
      fix 后全量前端单测复验再重跑门)
    - req-done/<FE> 语义降为「仅静态 review 过」;行为绿改由 reportPrompt 校验
      阶段级证据(module-reports/frontend-phase-behavior-r*-a*.md 最后一份非 RED)
    - build-failed 取消「兄弟未实现」短路(阶段末尾全 FE 已实现);断言作用域 =
      全部 FE spec「行为验收作用域」小节并集,缺小节记 scope-missing 阻断 green
    - 新增样式层 styleIssues(颜色 token 比对 + layout sanity 共 6 kind),
      降维并入 behaviorHard 与交互硬问题同口径 fix;环境仲裁透传 riders 计数
    
    前端测试目录隔离(对齐后端 src/main↔src/test 物理分离):
    - 锁定约定:单测 frontend/tests/** 镜像 src/(smoke 归 tests/__smoke__/ 且
      以 .test.* 结尾),e2e 在 frontend/e2e/,frontend/src/ 禁任何测试产物;
      vitest include 统一限定 tests/**/*.test.*
    - 五层防线:docs-04 模板 §2.1 锁定约定 / planPrompt+tddPrompt 硬护栏 /
      fe-skeleton 单测基线 / code-reviewer 新增第 8 维「测试文件隔离」
    - legacy 守卫:frontend/src/ 内已存在 colocated 测试时绝不收窄 include
      (防旧单测静默停跑),骨架幂等检测同步豁免,留人工迁移
    
    经两轮多代理对抗审计(34 agents),确认项均已修复。
    zichun authored
     
    Browse Code »

  • Replaces the phase-level read-only behavior-gate with a per-FE acceptance dimension: each FE is approved only when the code-reviewer approves AND runtime behavior verification is green. Behavior defects (dead control / sentinel text mismatch) become fixable must-fix that drive verify->fix->re-verify, not halts.
    
    - reviewWithFixLoop (frontend only, via if(fe)): at the approve gate, behaviorSubGate boots this FE's full stack + seeds sentinels, enumerates this FE's routes, two-tier asserts. Hard issues with a locator -> fixPrompt -> functional reverify -> next behaviorRound; soft text (i18n/literal/semantic) -> adjudicate(continue); behaviorRound bounded by BEHAVIOR_FE_MAX=3, env race by BEHAVIOR_ATTEMPT_MAX=2. Backend featureLoop branch unchanged.
    
    - New runFrontendSkeleton stage (before featureLoop(frontend)): App shell + full lazy router + FeStub placeholders + shared nav, so the app is buildable at every mid-phase point; tdd swaps FeStub->real component per FE. Idempotent via fe-skeleton-done tag.
    
    - BEHAVIOR_GATE_SCHEMA gains build-failed envError kind (sibling-FE-unimpl short-circuit, not a bug) + locator-not-resolvable coverage reason; deriveSpec emits a per-FE route-scope section, reviewer validates it.
    
    - Removed phase-level runBehaviorGate + 'Behavior' phase; kept phase-level testGate (regression). REVIEW_HARD_ROUNDS 8->10.
    
    - Safety: test-DB naming guard pushed into scripts-setup-test-db.mjs template (fail-closed unless name contains test/_dev/_local or ALLOW_NONTEST_DROP=1) + 3 tests.
    
    - agentType stays erp-workflow:code-reviewer. v1 design doc marked SUPERSEDED; v2 design at docs/design/2026-06-02-frontend-behavior-in-review-loop.md.
    
    Verified: wrapped syntax check SYNTAX_OK, 87/87 lib tests pass, no orphan refs, no time/random builtins, top-level return intact. Not yet run end-to-end against a real ERP project.
    zichun authored
     
    Browse File »
  • New 'Behavior' stage between Gate and Milestone, frontend-phase only, after testGate green and before report/milestone. Verifies every interactive control actually works and every text region shows the right content, independent of the tests the tdd agent wrote.
    
    - BEHAVIOR_GATE_SCHEMA / behaviorGateContract() / behaviorGatePrompt() / runBehaviorGate(); reportPrompt now gates the milestone on behavior-gate evidence (frontend-phase-behavior-gate-r*.md, last attempt must be non-RED).
    
    - Two-tier failure: interaction defects (incl. binding-garbage) flake-retry once then hard-halt via adjudicate(allowContinue:false); text issues split by source (sentinel=objective -> no continue; i18n/literal/semantic=adjudicable). Convergence loop re-runs the env + interaction hard gates after any text-layer retry so a refreshed result can't slip a green past the hard gates.
    
    - Full-stack seeded run: test-DB name guard (deterministic halt, not adjudicated), strict 4-phase ordering (empty DB -> boot backend so Flyway builds schema -> seed -> boot frontend), auth bootstrap via storageState, router-config-driven route discovery, ephemeral .tmp/behavior-gate runner with finally teardown, type-legal per-field-unique sentinels.
    
    - agentType uses the plugin-namespaced 'erp-workflow:code-reviewer' (a bare 'code-reviewer' is ambiguous with feature-dev:code-reviewer); README + agents/code-reviewer.md aligned (frontmatter name: stays bare).
    
    - Design: docs/design/2026-06-02-frontend-behavior-gate.md. README + coding-start banner updated.
    zichun authored
     
    Browse File »



  • zichun authored
     
    Browse Dir »
  • zichun authored
     
    Browse Dir »
  • 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).
    zichun authored
     
    Browse Code »