agentic-flow-kit 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/README.md +3 -0
  2. package/modules/gates/dotnet-ca/check-architecture.sh +23 -5
  3. package/modules/hosts/omp/agents/implementer.md +47 -6
  4. package/modules/hosts/omp/agents/independent-reviewer.md +44 -5
  5. package/modules/hosts/omp/agents/ui-verifier.md +43 -6
  6. package/modules/hosts/opencode/agents/implementer.md +47 -1
  7. package/modules/hosts/opencode/agents/independent-reviewer.md +44 -1
  8. package/modules/hosts/opencode/agents/ui-verifier.md +43 -1
  9. package/modules/hosts/opencode/commands/build.md +74 -7
  10. package/modules/hosts/opencode/commands/deploy.md +51 -6
  11. package/modules/hosts/opencode/commands/design.md +36 -6
  12. package/modules/hosts/opencode/commands/gate-checklist.md +77 -0
  13. package/modules/hosts/opencode/commands/maintain.md +70 -6
  14. package/modules/hosts/opencode/commands/new-task.md +59 -6
  15. package/modules/hosts/opencode/commands/plan.md +35 -6
  16. package/modules/hosts/opencode/commands/review.md +41 -6
  17. package/modules/hosts/opencode/commands/source-sync-check.md +89 -0
  18. package/modules/hosts/opencode/commands/sync-hosts.md +66 -0
  19. package/modules/hosts/opencode/commands/test.md +58 -8
  20. package/modules/hosts/trae/agents/implementer.md +46 -2
  21. package/modules/hosts/trae/agents/independent-reviewer.md +44 -1
  22. package/modules/hosts/trae/agents/ui-verifier.md +41 -3
  23. package/modules/hosts/trae/commands/wf-build.md +74 -7
  24. package/modules/hosts/trae/commands/wf-deploy.md +51 -6
  25. package/modules/hosts/trae/commands/wf-design.md +36 -6
  26. package/modules/hosts/trae/commands/wf-gate-checklist.md +78 -0
  27. package/modules/hosts/trae/commands/wf-maintain.md +70 -6
  28. package/modules/hosts/trae/commands/wf-new-task.md +59 -6
  29. package/modules/hosts/trae/commands/wf-plan.md +35 -6
  30. package/modules/hosts/trae/commands/wf-review.md +41 -6
  31. package/modules/hosts/trae/commands/wf-source-sync-check.md +90 -0
  32. package/modules/hosts/trae/commands/wf-sync-hosts.md +67 -0
  33. package/modules/hosts/trae/commands/wf-test.md +58 -7
  34. package/modules/hosts/trae/hooks/post-edit-check.cjs +3 -2
  35. package/modules/hosts/trae/hooks/pre-shell-check.cjs +40 -9
  36. package/modules/hosts/trae/hooks.json +1 -1
  37. package/modules/hosts/zcode/agents/implementer.md +47 -6
  38. package/modules/hosts/zcode/agents/independent-reviewer.md +44 -5
  39. package/modules/hosts/zcode/agents/ui-verifier.md +43 -5
  40. package/package.json +6 -3
  41. package/src/add-gate.mjs +5 -3
  42. package/src/cli.mjs +15 -2
  43. package/src/doctor.mjs +245 -15
  44. package/src/gate-dotnet-ca.test.mjs +124 -0
  45. package/src/init.mjs +79 -17
  46. package/src/init.test.mjs +84 -2
  47. package/src/pack.test.mjs +24 -0
  48. package/src/render.mjs +64 -4
  49. package/src/run-tests.mjs +7 -11
  50. package/src/sync-hosts.mjs +194 -0
  51. package/src/sync-hosts.test.mjs +170 -0
  52. package/src/sync.mjs +65 -20
  53. package/src/sync.test.mjs +52 -0
  54. package/src/trae-hooks.test.mjs +115 -0
  55. package/templates/AGENTS.md +2 -1
  56. package/templates/_agents/board/index.html +32 -3
  57. package/templates/_agents/commands/build.md +22 -1
  58. package/templates/_agents/commands/design.md +2 -0
  59. package/templates/_agents/commands/gate-checklist.md +91 -0
  60. package/templates/_agents/commands/maintain.md +2 -3
  61. package/templates/_agents/commands/plan.md +4 -1
  62. package/templates/_agents/commands/review.md +1 -0
  63. package/templates/_agents/commands/source-sync-check.md +103 -0
  64. package/templates/_agents/commands/sync-hosts.md +79 -0
  65. package/templates/_agents/commands/test.md +4 -2
  66. package/templates/_agents/hooks/check-pairing-incremental.sh +20 -7
  67. package/templates/_agents/notes/runtime-env.md +1 -1
  68. package/templates/_agents/roles/implementer.md +2 -0
  69. package/templates/_agents/roles/independent-reviewer.md +2 -0
  70. package/templates/_agents/roles/ui-verifier.md +2 -0
  71. package/templates/_agents/rule-budgets.txt +1 -1
  72. package/templates/_agents/scripts/agg-delegations.cjs +39 -30
  73. package/templates/_agents/scripts/agg-delegations.test.mjs +32 -0
  74. package/templates/_agents/scripts/check-loop.mjs +763 -0
  75. package/templates/_agents/scripts/check-loop.sh +5 -808
  76. package/templates/_agents/scripts/check-loop.test.mjs +1102 -0
  77. package/templates/_agents/scripts/confirm-doc.mjs +228 -0
  78. package/templates/_agents/scripts/confirm-doc.test.mjs +321 -0
  79. package/templates/_agents/scripts/doctor.test.mjs +371 -0
  80. package/templates/_agents/scripts/ensure-board.mjs +30 -3
  81. package/templates/_agents/scripts/fill-intent.mjs +59 -0
  82. package/templates/_agents/scripts/fill-intent.test.mjs +73 -0
  83. package/templates/_agents/scripts/fill-plan.mjs +60 -0
  84. package/templates/_agents/scripts/fill-plan.test.mjs +67 -0
  85. package/templates/_agents/scripts/fill-spec.mjs +52 -0
  86. package/templates/_agents/scripts/fill-spec.test.mjs +61 -0
  87. package/templates/_agents/scripts/gate-checklist.mjs +194 -0
  88. package/templates/_agents/scripts/gate-checklist.test.mjs +204 -0
  89. package/templates/_agents/scripts/gen-wiki-board.mjs +38 -24
  90. package/templates/_agents/scripts/gen-wiki-board.test.mjs +18 -0
  91. package/templates/_agents/scripts/gen-workflow-index.mjs +4 -2
  92. package/templates/_agents/scripts/gen-workflow-metrics.mjs +12 -3
  93. package/templates/_agents/scripts/kb-search.mjs +25 -9
  94. package/templates/_agents/scripts/kb-search.test.mjs +38 -8
  95. package/templates/_agents/scripts/source-sync-check.mjs +145 -0
  96. package/templates/_agents/scripts/source-sync-check.test.mjs +244 -0
  97. package/templates/_agents/scripts/verify-wiki-consistency.mjs +46 -23
  98. package/templates/_agents/scripts/verify.mjs +8 -10
  99. package/templates/_agents/scripts/verify.test.mjs +13 -1
  100. package/templates/_agents/scripts/wf-journal.mjs +158 -0
  101. package/templates/_agents/scripts/wf-journal.test.mjs +150 -0
  102. package/templates/_agents/scripts/workflow-board-server.mjs +73 -17
  103. package/templates/_agents/scripts/workflow-board-server.test.mjs +136 -0
  104. package/templates/_agents/scripts/workflow-enums.mjs +70 -0
  105. package/templates/_agents/scripts/workflow-enums.test.mjs +110 -0
  106. package/templates/_agents/scripts/workflows-check.mjs +260 -0
  107. package/templates/_agents/scripts/workflows-check.test.mjs +267 -0
  108. package/templates/_agents/workflow-enums.txt +19 -0
  109. package/templates/_agents/workflows/_TEMPLATE.md +75 -0
  110. package/templates/_agents/workflows/pipeline-closing.md +29 -0
  111. package/templates/_agents/workflows/source-sync-repair.md +30 -0
  112. package/templates/_agents/workflows/steps//347/244/272/344/276/213-/351/203/250/347/275/262/351/252/214/350/257/201.md +10 -0
  113. package/templates/_agents/workflows//347/244/272/344/276/213-/345/271/266/350/241/214/345/256/236/347/216/260/350/257/204/345/256/241.md +16 -0
  114. package/templates/_githooks/pre-commit +16 -1
  115. package/templates/workflow/README.md +1 -1
  116. package/templates/_agents/cache/kb-index.json +0 -1
  117. package/templates/_agents/scripts/check-loop.test.sh +0 -1042
@@ -31,7 +31,8 @@ next: .agents/commands/test.md
31
31
  - L2/L3 按 4 节填写:任务拆解(每个任务有判据) / 风险评估 / 执行顺序 / 遗留项
32
32
  - L1 默认极简两节:改动面(逐条文件+做什么) / 验证方式(一行静态门+按需 UI 实测);仅多文件多步骤时再加任务拆解/执行顺序
33
33
  - 仍须与入口文档同名落盘
34
- 3. 停下,输出 plan 草稿全文给用户过目,一句"可以"即确认。**逐件确认**:入口文档 / spec / plan 各自的确认点不得并作一次,plan 草稿须全文过目(不接受摘要代替)
34
+ 3. 停下,输出 plan 草稿全文给用户过目,一句"可以"即确认。**逐件确认**:入口文档 / spec / plan 各自的确认点不得并作一次,plan 草稿须全文过目(不接受摘要代替)。**逐件配逐件原话**:`--delegated` 每次传当次实际放行的措辞,不复用同句——复用同句使台账 quote 失去分辨力(事后对质看不出放行的是哪一件),且相邻同 quote 连跑触发 check-loop 15 并录告警(见 workflow/papercuts.md 2026-09-28)
35
+ **确认落态唯一入口**(2026-09-27 起):用户在终端跑 `node .agents/scripts/confirm-doc.mjs <path>` 键入「可以」(draft→approved / approved→done;对话内明确确认后 AI 可 `--delegated "<原话>"` 代录,台账如实记 source/quote——**逐件调用 + 逐件原话**(一次一份,build.md「逐件确认」口径;多份并录被 confirm-doc 拒绝。--delegated 每次传当次实际放行的措辞,不复用同句——复用同句使台账 quote 失去分辨力,且相邻同 quote 连跑会触发并录告警))。check-loop 15 如实口径:缺记录/指纹不配对 → hard-block 拦截;伪造台账本地不可机器防,留痕供事后对质;done 内容绑定(2026-09-28 起)——关单编辑(勾验/回填)先于 done 确认、confirm-doc 是最后一次写入,此后修订走 superseded 或新 intent。
35
36
  4. 确认后 → plan 状态 draft → approved,并在 plan 内补「确认与复核」节(确认结果 + 日期)。确认环节须在文档留痕:`approved` 是确认的机器可见态,`done` 只在关单出现,禁从 `draft` 直跳 `done`;确认后立即 `docs(workflow)` 单独提交留痕(根 `AGENTS.md` 提交约定;check-loop 检查 14 口径)
36
37
 
37
38
  ### 进计划模式列改动
@@ -40,6 +41,7 @@ next: .agents/commands/test.md
40
41
  - **先拉同模块历史坑**:按入口文档 `模块:` 跑 `node .agents/scripts/kb-search.mjs --scope workflow --module <token> "<关键词>"`——命中 incident 的根因 / 防复发条目列入改动自查
41
42
  - 列改动文件清单(读后改 vs 新建)
42
43
  - 列步骤(改 X 文件做 Y → 改 Z 文件做 W)
44
+ - **owned 文件同步**:kit.owned 列表文件(AGENTS.md / workflow 模板等)sync 不动,须列「手动同步装副本」步骤(见 incidents/2026-09-25-wf-runtime 复盘)
43
45
  - 标注触达红线(对照根 `AGENTS.md`「Working rules」+ 改动域目录级 `AGENTS.md`(如有))
44
46
  6. 停下,等用户确认改动清单
45
47
 
@@ -62,9 +64,28 @@ next: .agents/commands/test.md
62
64
 
63
65
  - 红线(架构 / 数据 / 安全等)正文与豁免见根与目录级 `AGENTS.md`(如有)——已由 pre-commit 机器门强制的部分以钩子为准,写代码前先过一遍目录级 AGENTS
64
66
 
67
+ ## 改权威源后必跑(薄适配同步防漏)
68
+
69
+ - 改 `templates/_agents/{commands,roles}/*.md` 正文后跑 `node bin/flow-kit.mjs sync-hosts --diff` → 拍板 → `--apply` 单向同步(只动正文段,frontmatter 不动);口径与边界详见 `.agents/commands/sync-hosts.md`
70
+
71
+ ## 改 doctor / check-loop 后必跑(三处口径对账)
72
+
73
+ - 改 `src/doctor.mjs` 加新 § 检查项 → 跑 `node .agents/scripts/gate-checklist.mjs --diff` 看 doctor ↔ check-loop 对照表
74
+ - 改 `.agents/scripts/check-loop.sh` 加新 § 检查项 → 同上
75
+ - 任一处有而另一边无 → 工具报"缺点",由用户拍板是否补齐(不自动同步,B-b 决策);详见 `.agents/commands/gate-checklist.md`
76
+
77
+ ## 改包源后必跑(装户面同步一致性)
78
+
79
+ - 改 `templates/_agents/*` 包源后 → 跑 `node .agents/scripts/source-sync-check.mjs --diff` 看装副本 `.agents/` 是否同步(缺失 / 孤儿 / 漂移三类差异)
80
+ - 漂移说明包源改了装副本未跟;缺失说明新增文件 init 未执行;孤儿说明装副本独有(可能是装户配置,不删)
81
+ - **新增 managed 类文件须经 init/sync 登记,禁手动双写绕过台账**——手工同时写 `templates/_agents/` 与 `.agents/` 会绕过台账登记,使该文件永远不被 sync 升级(`doctor` 台账覆盖率检查会拦;见 incidents/2026-09-26-managed-ledger-adopt 复盘)
82
+ - 门禁边界(pre-commit 双源一致性):比较工作树非暂存区——两侧改好、分两笔提交不拦(最终一致即可);包源删除文件退化为「孤儿」只报告不拦,删包源须手动清理装副本残件(复核 P2-2 声明,2026-09-27 gate-hardening-p2-batch)
83
+ - B-b 决策「只报告不修复」;详见 `.agents/commands/source-sync-check.md`
84
+
65
85
  ## 子代理调用约定
66
86
 
67
87
  - plan 起草、风险判断、改动清单与两道确认门由主智能体负责;仅两道确认后范围明确的工作包可委派 `implementer`,公共接口 / Schema / 依赖 / 安全 / 权限 / 破坏性操作不得委派。
88
+ - 多工作包并行 / 链式推进:编排机制(声明随 plan 草稿一并确认;确认后读 `.agents/workflows/` 按机制文档执行,`steps/` 为项目自定义步骤扩展点);详见 `.agents/workflows/_TEMPLATE.md`。
68
89
  - 子智能体返回后,主智能体须检查 diff 与授权文件范围、确认未覆盖既有修改并重跑相关验证;不支持子智能体时 `fallback: main`,验收标准不变。
69
90
 
70
91
  ## 确认后
@@ -28,6 +28,7 @@ next: .agents/commands/build.md
28
28
  - **L2**(改规则 / 契约:编码权威 / 共享契约 / 既有接口语义 / 全局横切口径,闭集见 `new-task.md` §级别判断)→ 必须有 spec
29
29
  - **L3**(数据与运行时结构:schema / 迁移 SQL / DI 链 / 认证与中间件管线)→ 必须有 spec + **新会话独立复核**
30
30
  3. 起草 spec:
31
+ - **填空工具先跑**:`node .agents/scripts/fill-spec.mjs --level <L1|L2|L3> --topic <主题> --output workflow/specs/<date>-<主题>.md`——输出含 frontmatter 5 字段 + 5 节正文(功能行为/数据流/系统改动/约束遵守映射/风险评估)的草稿;AI 据此填实
31
32
  - 复制 `workflow/specs/_TEMPLATE.md` → `workflow/specs/YYYY-MM-DD-<主题>.md`(与入口文档同名)
32
33
  - 按 5 节填写:功能行为 / 数据流 / 系统改动 / 约束遵守映射 / 风险评估
33
34
  - 约束映射必须对照根 `AGENTS.md`「Working rules」与改动域目录级 `AGENTS.md`(如有)逐条说明如何满足
@@ -50,5 +51,6 @@ next: .agents/commands/build.md
50
51
  ## 确认后
51
52
 
52
53
  - spec 状态 draft → approved
54
+ **确认落态唯一入口**(2026-09-27 起):用户在终端跑 `node .agents/scripts/confirm-doc.mjs <path>` 键入「可以」(draft→approved / approved→done;对话内明确确认后 AI 可 `--delegated "<原话>"` 代录,台账如实记 source/quote——**逐件调用 + 逐件原话**(一次一份,build.md「逐件确认」口径;多份并录被 confirm-doc 拒绝。--delegated 每次传当次实际放行的措辞,不复用同句——复用同句使台账 quote 失去分辨力,且相邻同 quote 连跑会触发并录告警))。check-loop 15 如实口径:缺记录/指纹不配对 → hard-block 拦截;伪造台账本地不可机器防,留痕供事后对质;done 内容绑定(2026-09-28 起)——关单编辑(勾验/回填)先于 done 确认、confirm-doc 是最后一次写入,此后修订走 superseded 或新 intent。
53
55
  - 立即 `docs(workflow)` 单独提交留痕(根 `AGENTS.md` 提交约定;check-loop 检查 14 口径)
54
56
  - 进 `next: .agents/commands/build.md`
@@ -0,0 +1,91 @@
1
+ ---
2
+ description: 三处口径一致性检查(doctor §检查项 ↔ check-loop §检查项,显式配对登记表 + 断档/未登记告警)
3
+ stage: helper(横向工具,不占 6 阶段)
4
+ triggers:
5
+ - "三处口径对账"
6
+ - "改了 doctor 后跑这个"
7
+ - "改了 check-loop 后跑这个"
8
+ - "扫一下口径一致性"
9
+ delegation:
10
+ - role: implementer
11
+ instructions: .agents/roles/implementer.md
12
+ when: 用户已确认同步范围(发现断档/未登记后修 doctor / check-loop / 登记表时)
13
+ required: false
14
+ fallback: main
15
+ approval_required: true
16
+ next: .agents/commands/build.md(缺点属 build 改 doctor / check-loop 未对账导致的,修复后回 build)
17
+ ---
18
+
19
+ # Gate-Checklist · 三处口径一致性(显式配对登记表)
20
+
21
+ > `src/doctor.mjs` § 检查项 ↔ `.agents/scripts/check-loop.sh` § 检查项,按脚本内 **PAIRS 登记表**对照。
22
+ > 任何一处加新检查项,另一处不会自动同步——本工具报「未登记」;检查项被删/改号而登记未跟报「断档」。
23
+ > 只报告不修复(B-b 决策):缺点暴露给用户拍板,本工具不自动同步;exit 恒 0。
24
+
25
+ ## 何时跑
26
+
27
+ - 改 `src/doctor.mjs` 加新 § 检查项后(同时须登记 PAIRS)
28
+ - 改 `.agents/scripts/check-loop.sh` 加新 § 检查项后(同时须登记 PAIRS)
29
+ - 怀疑两处口径不一致时
30
+ - 不跑:仅改既有检查项的提示文案(不动 § 项与登记表)
31
+
32
+ ## 登记表纪律(契约)
33
+
34
+ `templates/_agents/scripts/gate-checklist.mjs` 内 **PAIRS** 是配对单源,三选一登记:
35
+
36
+ | 形态 | 写法 | 含义 |
37
+ |------|------|------|
38
+ | 直接配对 | `{ doctor: 'N', cl: 'M' }` | 同一检查两处实现 |
39
+ | 声明独有 | `{ doctor: 'N', cl: null }` | doctor 装户体检面,无 check-loop 对应(原 intent 拍板只报告不修复) |
40
+ | 经 §7 覆盖 | `{ doctor: '7', cl: 'M' }` | doctor §7 整体运行 check-loop,#M 自动流入 doctor |
41
+
42
+ - 加新 § 检查项不登记 → 工具报「未登记」(新检查项没对账——核心信号)
43
+ - 删/改检查项不动登记表 → 工具报「断档」
44
+ - 关键词匹配已退役(2026-09-25 registry 重写:实测 18×14 项只匹配 2、28 条噪声缺点,真漏点不可见)
45
+
46
+ ## 怎么跑
47
+
48
+ ```bash
49
+ node .agents/scripts/gate-checklist.mjs --diff # 人类可读(默认)
50
+ node .agents/scripts/gate-checklist.mjs --json # 机器可读
51
+ ```
52
+
53
+ 输出四段:总览计数 → 对照表(登记表展开)→ 断档(如有)→ 未登记(如有);全绿时输出「登记完整」。
54
+
55
+ ### 输出示例
56
+
57
+ ```
58
+ ▶ flow-kit gate-checklist --diff(显式配对登记表)
59
+ doctor §检查项: 12 | check-loop §检查项: 14 | 直接配对 2 + 经 §7 覆盖 12 + 声明独有 9
60
+ 对照表(登记表展开):
61
+ ✓ §5 占位符残留 ↔ #2 模板字段占位符残留(YYYY-MM-DD / <主题> 等…)(占位符残留)
62
+ ● §1 Node 版本(声明独有:Node 版本——装户体检独有)
63
+ ✓ §7 check-loop ↔ #1 入口文档/spec/plan 同名配对(…(经 §7 整体运行覆盖)
64
+ ✅ 登记完整(0 断档 / 0 未登记)
65
+ ```
66
+
67
+ ### 自验
68
+
69
+ ```bash
70
+ node .agents/scripts/gate-checklist.test.mjs # 13 场景全过
71
+ npm test # 含 gate-checklist 套件
72
+ ```
73
+
74
+ ## 边界(不要做)
75
+
76
+ - 不要把「登记完整」当作强制门 —— B-b 决策「只报告不修复」:断档/未登记暴露给 follow-up,exit 恒 0
77
+ - 不要改 doctor / check-loop 检查项来消音 —— 登记表才是该改的地方(配对 / 独有 / 经 §7 三选一)
78
+ - 不要扩展到看板告警 —— 看板当前无告警规则(gen-wiki-board.mjs 不做判定),扩展超出范围
79
+ - 不要绕过登记直接改解析正则 —— 解析面只认 doctor `// N.` 节注释与 check-loop `// N.` 项注释(.mjs 头部清单,fallback 旧装户 .sh `# N.`)
80
+
81
+ ## 不在本次同步范围
82
+
83
+ - `.agents/board/` 看板告警(无告警规则)
84
+ - `wiki/知识沉淀总览.html` 渲染(数据来源是 workflow/INDEX.md 与 wiki 目录,非本工具对照)
85
+ - `flow-kit sync` managed 台账追踪(gate-checklist 不在 managed 范围)
86
+
87
+ ## 相关留痕
88
+
89
+ - intent(登记表重写):`workflow/intents/2026-09-25-gate-checklist-registry.md`
90
+ - intent(工具首建):`workflow/intents/2026-09-25-gate-checklist.md`
91
+ - 父 incident:`workflow/incidents/2026-09-25-wf-runtime.md`(owned 漂移未对账,催生本工具)
@@ -24,7 +24,7 @@ next: .agents/commands/plan.md(若复盘需要新 intent)
24
24
 
25
25
  ## 执行
26
26
 
27
- > **看板(可选,默认不拉起)**:需要实时看板时手动跑 node .agents/scripts/ensure-board.mjs(跨平台;幂等:探活 / 旧代码自动重启 / 全新启动才弹浏览器;多项目并行自动上探首个可用端口),链接以脚本输出为准(基端口 {{BOARD_PORT}});不开看板不影响任务流程。
27
+ > **看板(可选,默认不拉起)**:需要实时看板时手动跑 node .agents/scripts/ensure-board.mjs(跨平台;幂等:探活 / 旧代码自动重启 / 全新启动才弹浏览器;多项目并行自动上探首个可用端口),链接以脚本输出为准(基端口 8933);不开看板不影响任务流程。
28
28
 
29
29
  ### 0. 紧急止血(仍在事故中时)
30
30
 
@@ -86,6 +86,5 @@ next: .agents/commands/plan.md(若复盘需要新 intent)
86
86
 
87
87
  ## 确认后
88
88
 
89
- - incident 状态 → fixed(三件套全落地)
90
- - 防复发用例通过后 → closed
89
+ - incident 状态 → fixed(三件套全落地);防复发用例通过后 → closed——两跳均走确认门 `node .agents/scripts/confirm-doc.mjs <path>`(open→fixed / fixed→closed,无单跳;2026-09-28 起 check-loop 15 对账,AI 不得直改状态)
91
90
  - 若需新 intent → 进 `next: .agents/commands/plan.md`
@@ -16,11 +16,12 @@ next: L1 → .agents/commands/build.md ;L2/L3 → .agents/commands/design.md
16
16
 
17
17
  ## 执行
18
18
 
19
- > **看板(可选,默认不拉起)**:需要实时看板时手动跑 node .agents/scripts/ensure-board.mjs(跨平台;幂等:探活 / 旧代码自动重启 / 全新启动才弹浏览器;多项目并行自动上探首个可用端口),链接以脚本输出为准(基端口 {{BOARD_PORT}});不开看板不影响任务流程。
19
+ > **看板(可选,默认不拉起)**:需要实时看板时手动跑 node .agents/scripts/ensure-board.mjs(跨平台;幂等:探活 / 旧代码自动重启 / 全新启动才弹浏览器;多项目并行自动上探首个可用端口),链接以脚本输出为准(基端口 8933);不开看板不影响任务流程。
20
20
 
21
21
  1. 若 `workflow/intents/` 已有目标 intent 且状态为 approved → 按级别跳 next(L1 → `build.md`,L2/L3 → `design.md`)
22
22
  2. 否则起草新 intent:
23
23
  - **先检索同类**:`node .agents/scripts/kb-search.mjs "<关键词>" --scope workflow --type intents,specs`——命中同类先读其结论与验收,新 intent 引用(防重复立项 / 重复踩坑)
24
+ - **填空工具先跑**:`node .agents/scripts/fill-intent.mjs --module <模块> --level <L0|L1|L2|L3> --topic <主题> --output workflow/intents/<date>-<主题>.md --notes "<备注>"`——输出含 frontmatter 5 字段 + 7 节正文(背景与问题/目标/非目标/约束/影响面/触达红线/验收标准)的草稿;AI 据此填实,模板与节标题机器保证不出错
24
25
  - 复制 `workflow/intents/_TEMPLATE.md` → `workflow/intents/YYYY-MM-DD-<主题>.md`
25
26
  - frontmatter 填 `模块:`(词表见 `.agents/workflow-modules.txt`,新建文档必填,check-loop 会警告)
26
27
  - 按 6 节填写:背景与问题 / 目标(可验证) / 非目标 / 约束 / 影响面 / 触达红线(L1 微改动可省非目标/约束两节,不硬填)
@@ -28,6 +29,8 @@ next: L1 → .agents/commands/build.md ;L2/L3 → .agents/commands/design.md
28
29
  3. 写不出可测试判据 = 还没想清楚 → 反问澄清,不要硬填
29
30
  4. 起草后停下,输出草稿全文给用户过目,一句"可以"即确认
30
31
 
32
+ **确认落态唯一入口**(2026-09-27 起):用户在终端跑 `node .agents/scripts/confirm-doc.mjs <path>` 键入「可以」(draft→approved / approved→done;对话内明确确认后 AI 可 `--delegated "<原话>"` 代录,台账如实记 source/quote——**逐件调用 + 逐件原话**(一次一份,build.md「逐件确认」口径;多份并录被 confirm-doc 拒绝。--delegated 每次传当次实际放行的措辞,不复用同句——复用同句使台账 quote 失去分辨力,且相邻同 quote 连跑会触发并录告警))。check-loop 15 如实口径:缺记录/指纹不配对 → hard-block 拦截;伪造台账本地不可机器防,留痕供事后对质;done 内容绑定(2026-09-28 起)——关单编辑(勾验/回填)先于 done 确认、confirm-doc 是最后一次写入,此后修订走 superseded 或新 intent。
33
+
31
34
  ## 技能辅助(可选,宿主级 skills)
32
35
 
33
36
  - 需求模糊、判据写不出时:用 `grilling`/`grill-me` 拷问需求,答完回填 6 节
@@ -43,6 +43,7 @@ next: .agents/commands/build.md(仅 P0 / P1 未清时;清零后经用户确
43
43
  - **Create/Update 校验同口径**:Create 已有校验 Update 必须同口径;被引用的标识符字段禁改
44
44
  - **查询分页与状态语义**:分页参数范围校验 + 服务层钳制;非法状态与不存在分离(按项目统一错误口径,如 400 / 404)
45
45
  - **spec 承诺的断言落地**:spec §测试列出的用例 / 断言须真落到测试或验证脚本;「写进 spec」不等于「跑得起来」,且常驻断言禁写成随时间增长的行数常量
46
+ - **跨宿主薄适配正文漂移**:改 `templates/_agents/{commands,roles}/*.md` 后必须跑 `flow-kit sync-hosts --apply` 单向同步 4 宿主薄适配(`modules/hosts/<h>/{agents,commands}/*.md`);装户视角由 `flow-kit doctor` §6.7 检查(包源环境 §6.7 skipped)
46
47
 
47
48
  ## P2 建议(提醒,不拦合入)
48
49
 
@@ -0,0 +1,103 @@
1
+ ---
2
+ description: 装户面同步一致性检查(包源 templates/_agents/ vs 装副本 .agents/ 三类差异:缺失 / 孤儿 / 漂移)
3
+ stage: helper(横向工具,不占 6 阶段)
4
+ triggers:
5
+ - "改了包源同步了吗"
6
+ - "装了装副本同步了吗"
7
+ - "扫一下装户面漂移"
8
+ - "source-sync 跑一下"
9
+ delegation:
10
+ - role: implementer
11
+ instructions: .agents/roles/implementer.md
12
+ when: 用户已确认同步范围(发现漂移后修包源或装副本时)
13
+ required: false
14
+ fallback: main
15
+ approval_required: true
16
+ next: .agents/commands/build.md(漂移属 build 改包源未同步导致的,修复后回 build)
17
+ ---
18
+
19
+ # Source-Sync-Check · 装户面同步一致性
20
+
21
+ > `templates/_agents/` 包源 vs `.agents/` 装副本——三类差异报告:缺失 / 孤儿 / 漂移。
22
+ > managed 文件由 `flow-kit sync` 跟踪;owned 文件由 `flow-kit doctor` §6.6 校验——本工具补"两者都没扫"的真空地带(结构级差异)。
23
+
24
+ ## 何时跑
25
+
26
+ - 改 `templates/_agents/*` 包源后
27
+ - 怀疑装副本未跟包源更新
28
+ - 体检装副本完整性(清理前 / 发版前)
29
+ - 不跑:仅改装副本 `.agents/*`(B-b 决策「只报告」+ 不反向同步)
30
+
31
+ ## 怎么跑
32
+
33
+ ### 默认 `--diff`(仅报告)
34
+
35
+ ```
36
+ node .agents/scripts/source-sync-check.mjs --diff
37
+ node .agents/scripts/source-sync-check.mjs --json # 机器可读
38
+ node .agents/scripts/source-sync-check.mjs --pkg-root <path> --target <path> # 自定义路径
39
+ ```
40
+
41
+ 输出三类:
42
+ - **缺失**(missing)——包源有 / 装副本无(如新增文件 init 未执行)
43
+ - **孤儿**(orphan)——包源无 / 装副本有(如历史残留 / 用户本地添加)
44
+ - **漂移**(drift)——两者都有但 sha 不一致(如包源改了装副本未跟)
45
+
46
+ **排除**:
47
+ - `templates/_agents/cache/`(运行时缓存,与 `flow-kit sync` 既有约定一致)
48
+ - `.agents/kit.json` / `.agents/settings.json`(init 渲染产物,不属双源)
49
+
50
+ ### 输出示例
51
+
52
+ ```
53
+ ▶ flow-kit source-sync-check --diff
54
+ 包源 (templates/_agents/) 49 份 | 装副本 (.agents/) 49 份
55
+ 缺失(包源有 / 装副本 无)1:
56
+ - scripts/source-sync-check.mjs
57
+ 孤儿(包源无 / 装副本 有)1:
58
+ - hooks/commit-check.config.json
59
+ 漂移(包源装副本都有但 sha 不一致)3:
60
+ - commands/maintain.md pkg=3782b695… tgt=26203f7b…
61
+ - notes/runtime-env.md pkg=aedde1ba… tgt=ad08441e…
62
+ - scripts/ensure-board.mjs pkg=e66653b0… tgt=b6f3cc9b…
63
+ ```
64
+
65
+ ### 自验
66
+
67
+ ```
68
+ node .agents/scripts/source-sync-check.test.mjs # 11 场景全过
69
+ npm test # 含 source-sync-check 套件
70
+ flow-kit doctor # 10/0/0
71
+ ```
72
+
73
+ ## 边界(不要做)
74
+
75
+ - 不要自动化同步(B-b 决策「只报告不修复」——与 `gate-checklist` 同源)
76
+ - 不改 managed 台账跟踪逻辑(`sync.mjs` 不动)
77
+ - 不改 owned 漂移校验(`doctor.mjs` §6.6 不动)
78
+ - 不反向同步——装副本独自有文件(如 hooks/commit-check.config.json)可能是装户配置,不应被删
79
+ - 不检查 4 宿主 `modules/hosts/` 薄适配漂移(那是 `flow-kit sync-hosts` 范围)
80
+
81
+ ## 当前已识别的真实漂点(首次实测,2026-09-25)
82
+
83
+ - **缺失**:本工具写完后未同步装副本(预期内——随本次 commit 解决)
84
+ - **孤儿**:`.agents/hooks/commit-check.config.json`(装副本独有,疑似装户配置)
85
+ - **漂移**:`commands/maintain.md` / `notes/runtime-env.md` / `scripts/ensure-board.mjs`
86
+
87
+ 修复留后续 incident / intent 跟踪(不在本次范围)。
88
+
89
+ ## 与既有工具的关系
90
+
91
+ | 工具 | 作用域 | 算法 |
92
+ |---|---|---|
93
+ | `flow-kit sync` | managed 文件(kit.json 台账跟踪)| 三态覆盖 + 加新 + 报错缺 |
94
+ | `flow-kit doctor` §6.6 | owned 文件(kit.owned 哈希比对)| 盘面 sha vs 台账哈希 |
95
+ | **`flow-kit source-sync-check`** | **所有文件结构(包源 ↔ 装副本全集)** | **sha 全量比对 + 缺失/孤儿分类** |
96
+
97
+ 三者互补,不重叠。
98
+
99
+ ## 相关留痕
100
+
101
+ - intent:`workflow/intents/2026-09-25-source-sync-check.md`
102
+ - plan:`workflow/plans/2026-09-25-source-sync-check.md`
103
+ - 父 incident:`workflow/incidents/2026-09-25-wf-runtime.md`(包源改了装副本未同步——本工具预防性体检)
@@ -0,0 +1,79 @@
1
+ ---
2
+ description: 跨宿主适配层同步(正文段 sha 比对 + 用户拍板 + 单向 apply;frontmatter 不动)
3
+ stage: helper(横向工具,不占 6 阶段)
4
+ triggers:
5
+ - "同步宿主适配层"
6
+ - "改了角色契约要不要同步"
7
+ - "扫一下宿主漂移"
8
+ delegation:
9
+ - role: implementer
10
+ instructions: .agents/roles/implementer.md
11
+ when: 用户已确认同步范围与策略(仅 apply 大批同主题漂移时委托)
12
+ required: false
13
+ fallback: main
14
+ approval_required: true
15
+ next: .agents/commands/build.md(漂移属 build 改权威源未同步导致的,修复后回 build)
16
+ ---
17
+
18
+ # Sync-Hosts · 跨宿主适配层正文段同步
19
+
20
+ > 改权威源(`templates/_agents/{commands,roles}/*.md`)后薄适配(`modules/hosts/<h>/{agents,commands}/*.md`)要同步——薄适配正文 = 权威源正文,frontmatter 各自保留宿主特化(trae commands 加 `name: wf-X`、opencode/zcode/omp 各自原描述)。
21
+ > 装户视角:`flow-kit doctor` §7.x 跑同名检查(仅装户,包源环境跳过——包源下永远是 drift)。
22
+
23
+ ## 何时跑
24
+
25
+ - 改 `templates/_agents/commands/*.md` 正文后(8 个 commands 文件)
26
+ - 改 `templates/_agents/roles/*.md` 正文后(3 个 roles 文件)
27
+ - 装户跑 `flow-kit doctor` 报"跨宿主薄适配正文漂移 N 对" WARN 时
28
+ - 不跑:仅改 frontmatter;改 trae 钩子/规则;改包源其他文件
29
+
30
+ ## 怎么跑
31
+
32
+ ### 默认 `--diff`(仅报告)
33
+
34
+ ```
35
+ node bin/flow-kit.mjs sync-hosts --diff
36
+ node bin/flow-kit.mjs sync-hosts --json # 机器可读
37
+ ```
38
+
39
+ 输出三类:
40
+ - **正文对齐 N 对** — sha 一致,无需处理
41
+ - **正文段漂移 N(权威源 vs 薄适配 sha 不一致)** — `--apply` 同步方向;不区分"权威源改了"或"薄适配手改了",由用户拍板
42
+ - **⚠️ 权威源声明但薄适配缺失** — `add-host <h>` 接管后跑 `--apply` 才会装(apply 不自动创建)
43
+ - **⚠️ 孤儿薄适配(权威源无对应文件)** — 历史残留或宿主特化,apply 不删
44
+
45
+ ### `--apply` 单向同步
46
+
47
+ ```
48
+ node bin/flow-kit.mjs sync-hosts --apply
49
+ ```
50
+
51
+ 按权威源正文覆盖薄适配正文段;薄适配原 frontmatter 保留(trae name: wf-X、opencode 描述、zcode/omp 中文风格各自不动)。apply 不反向同步——薄适配手改了正文也会被覆盖(这是设计选择,避免漂移方向歧义)。
52
+
53
+ ### 自验
54
+
55
+ ```
56
+ npm test # 含 sync-hosts.test.mjs 8 场景
57
+ node bin/flow-kit.mjs doctor # 装户跑 §7.x PASS;包源跑 §7.x skipped
58
+ sh .agents/scripts/check-loop.sh # Windows 无 sh 时 doctor 已探测分流
59
+ ```
60
+
61
+ ## 边界(不要做)
62
+
63
+ - 不要 `--apply` 反向同步(写权威源):权威源是真相,薄适配手改会被覆盖——这是设计,apply 前先看 `--diff`
64
+ - 不要删除孤儿薄适配:可能是宿主特化或历史残留,apply 不动
65
+ - 不要改 frontmatter 让 sha 凑齐:frontmatter 是宿主特化字段(trae name: wf-X 等),工具不参与
66
+ - 不要把「避免与权威版本漂移」明文加回去——这是旧契约的指针风格,已被 B-b 正文副本取代
67
+ - 装了新宿主后跑 `--apply`:新宿主目录空白,apply 不会自动创建薄适配(薄适配须经 `add-host <h>` 接管)
68
+
69
+ ## 不在本次同步范围
70
+
71
+ - trae 钩子(`modules/hosts/trae/hooks/*.cjs`)— 独立演进的工程件
72
+ - trae 规则(`modules/hosts/trae/rules/*.md`)— 同上
73
+ - 包源 .agents/scripts/*.cjs(pre-commit 等钩子)— 同步由 `flow-kit sync` 走 managed 台账负责
74
+
75
+ ## 相关留痕
76
+
77
+ - intent:`workflow/intents/2026-09-25-cross-host-sync.md`
78
+ - plan:`workflow/plans/2026-09-25-cross-host-sync.md`(含 B-b 方案拍板)
79
+ - incident:`workflow/incidents/2026-09-25-wf-runtime.md`(双源纪律教训,规范 §7.x 包源环境跳过)
@@ -33,6 +33,7 @@ next: L1 关单结束 ;L2/L3 上 prod 时 → .agents/commands/deploy.md
33
33
  项目测试命令 # 自动化测试
34
34
  项目类型检查命令 # 前端类型检查/构建(涉及前端时跑)
35
35
  node .agents/scripts/verify-wiki-consistency.mjs # 触及 wiki/ 时跑(exit 1 即先修台账再继续:跑 gen-wiki-board.mjs 补索引/看板;pre-commit 已按增量自动拦,此行用于改完即验)
36
+ node bin/flow-kit.mjs doctor # §6.5 delegations + §6.6 owned 漂移 + §6.7 跨宿主薄适配正文漂移(装户环境;包源环境 §6.7 skipped)
36
37
  ```
37
38
 
38
39
  > **环境注记**:本地服务占用构建产物导致编译失败、多会话并行时「谁跑静态门 / 提交谁先停服务」等约定——如有,见项目注记 `.agents/notes/runtime-env.md` §2,跑静态门前先过一眼。
@@ -41,7 +42,7 @@ node .agents/scripts/verify-wiki-consistency.mjs # 触及 wiki/ 时跑(exit 1
41
42
 
42
43
  任一失败 → 不进 UI 实测,回 `build.md` 修复;失败难复现(偶发/跨层)时先用 `diagnosing-bugs` 技能走诊断循环(红→最小化→假设→插桩→修复→回归),修复仍回 `build.md`。
43
44
 
44
- > **门禁 / 看板 / wiki 脚本改动**(`.agents/scripts/`、`.agents/hooks/`、`.agents/board/`):按改动对象跑对应 fixture 回归,须全绿——闭环门禁 `sh .agents/scripts/check-loop.test.sh`、wiki 生成器 `node .agents/scripts/gen-wiki-board.test.mjs`、提交前 hook 测试(如有);涉及看板告警规则时,用同批 workflow fixture 双跑 `check-loop.sh` 与看板 `/api/board`,断言 hard-block 集合被看板告警覆盖(防口径分叉)。
45
+ > **门禁 / 看板 / wiki 脚本改动**(`.agents/scripts/`、`.agents/hooks/`、`.agents/board/`):按改动对象跑对应 fixture 回归,须全绿——闭环门禁 `node .agents/scripts/check-loop.test.mjs`、wiki 生成器 `node .agents/scripts/gen-wiki-board.test.mjs`、提交前 hook 测试(如有);涉及看板告警规则时,用同批 workflow fixture 双跑 `check-loop`(经 shim 或 .mjs 直跑)与看板 `/api/board`,断言 hard-block 集合被看板告警覆盖(防口径分叉)。
45
46
 
46
47
  ## 2. 切库冒烟(切换 / 新增目标库后必跑)
47
48
 
@@ -74,7 +75,8 @@ node .agents/scripts/verify-wiki-consistency.mjs # 触及 wiki/ 时跑(exit 1
74
75
  - **关单**(日常闭环点,不依赖是否上 prod):
75
76
  - 关单前一键过门:`node .agents/scripts/verify.mjs`(npm test + check-loop 固定编排,任一失败非零退出,非绿不关单)
76
77
  - 新需求:逐条勾验入口 intent「验收标准」,每条补「证据:」,intent → done;同名 spec(若有)仍 approved → done
77
- - 修复:防复发验证已落地,incident → closed
78
+ **确认落态唯一入口**(2026-09-27 起):用户在终端跑 `node .agents/scripts/confirm-doc.mjs <path>` 键入「可以」(draft→approved / approved→done;对话内明确确认后 AI 可 `--delegated "<原话>"` 代录,台账如实记 source/quote——**逐件调用 + 逐件原话**(一次一份,build.md「逐件确认」口径;多份并录被 confirm-doc 拒绝。--delegated 每次传当次实际放行的措辞,不复用同句——复用同句使台账 quote 失去分辨力,且相邻同 quote 连跑会触发并录告警))。check-loop 15 如实口径:缺记录/指纹不配对 → hard-block 拦截;伪造台账本地不可机器防,留痕供事后对质;done 内容绑定(2026-09-28 起)——**关单编辑(勾验/回填确认结果)先于 done 确认、confirm-doc 是最后一次写入**,此后修订走 superseded 或新 intent。
79
+ - 修复:防复发验证已落地,incident → closed(经确认门 confirm-doc:open→fixed / fixed→closed 两跳、无单跳;2026-09-28 起 check-loop 15 对账——关单编辑先于 closed 确认,口径同 done 内容绑定)
78
80
  - **同族收尾**:入口置终态时,同名 plan 一并置 `done`(spec 见上条),不留 `approved` 孤儿(口径同看板「入口已 done,本 plan 未终态」告警)
79
81
  - 主智能体自做的 L1+ 新需求在 `workflow/delegations.md`「自做任务结果表」记一行(修复类不重复记)
80
82
  - L1:本阶段结束,不进 deploy
@@ -1,16 +1,20 @@
1
1
  #!/bin/sh
2
- # 闭环配对(增量版):本次暂存的 intents/ incidents/ 入口文档必须已有同名 plan
2
+ # 闭环配对(增量版):本次暂存的 intents/ incidents/ 入口文档必须已有同名 plan(L2/L3 另须同名 spec)
3
3
  # 目的:把 check-loop.sh「配对断裂」hard-block 的发现时机从 pre-push 提前到 commit
4
4
  # (papercut 2026-09-15:maintain.md 只写「incident≡intent 免另立 intent」,未把配 plan 写成显式步骤,
5
- # 按文档字面执行三次 commit 全绿、push 才爆红,只能后补)
6
- # 口径与 check-loop.sh 对齐:入口文档(intents/ incidents/ 直下 .md)↔ workflow/plans/ 同名;
7
- # 同 commit 携带 plan 合法(检查的是工作区文件存在,staged 新建 plan 同样命中)。
8
- # 已知边界:legacy 豁免读的是工作区文件而非暂存 blob——add 后又改工作区时可能误豁免/误拦(逐文件取 blob 的 fork 成本大于收益,接受)。
5
+ # 按文档字面执行三次 commit 全绿、push 才爆红,只能后补;
6
+ # 2026-09-27 audit-gate-hardening 补齐 spec 档——此前只查 plan,L2/L3 缺 spec 仍要拖到 push 才爆红)
7
+ # 口径与 check-loop.sh 对齐:入口文档(intents/ incidents/ 直下 .md)↔ workflow/plans/ 同名,
8
+ # L2/L3 级别另须 workflow/specs/ 同名(check-loop 检查 1 同款分档);
9
+ # 同 commit 携带 plan/spec 合法(检查的是工作区文件存在,staged 新建同样命中)。
10
+ # 已知边界:legacy 豁免与级别读取均基于工作区文件而非暂存 blob——add 后又改工作区时可能误豁免/误拦(逐文件取 blob 的 fork 成本大于收益,接受)。
9
11
 
10
12
  cd "$(git rev-parse --show-toplevel)" || exit 1
11
13
 
12
14
  fail=0
13
- for f in $(git diff --cached --name-only --diff-filter=ACMR | grep -E '^workflow/(intents|incidents)/[^/]+\.md$' | grep -v '_TEMPLATE\.md$'); do
15
+ # -c core.quotepath=off:quotepath 默认 true 时非 ASCII 路径被引号转义("workflow/\346..."),
16
+ # ^workflow/ 前缀匹配失配 → 门禁静默跳过——教训与修法同 check-wiki-ledger.sh(2026-09-27 gate-coverage)
17
+ for f in $(git -c core.quotepath=off diff --cached --name-only --diff-filter=ACMR | grep -E '^workflow/(intents|incidents)/[^/]+\.md$' | grep -v '_TEMPLATE\.md$'); do
14
18
  # 闭环引擎启用前的回填件带「流程: legacy」豁免配对检查(与 check-loop 同口径)
15
19
  if grep -q '^流程: legacy' "$f"; then
16
20
  continue
@@ -22,9 +26,18 @@ for f in $(git diff --cached --name-only --diff-filter=ACMR | grep -E '^workflow
22
26
  echo " L1 极简 plan 只需「改动面 + 验证方式」两节(复制 workflow/plans/_TEMPLATE.md)"
23
27
  fail=1
24
28
  fi
29
+ lvl=$(sed -n 's/^级别:[[:space:]]*//p' "$f" | head -1)
30
+ if [ "$lvl" = "L2" ] || [ "$lvl" = "L3" ]; then
31
+ if [ ! -f "workflow/specs/$base.md" ]; then
32
+ echo "闭环配对(增量)— BLOCK:"
33
+ echo " 入口缺同名 spec: $f(级别 $lvl 须三件套,应在 workflow/specs/$base.md)"
34
+ echo " 与 pre-push check-loop 检查 1 同口径——先起草 spec 走 design.md,再提交"
35
+ fail=1
36
+ fi
37
+ fi
25
38
  done
26
39
 
27
40
  if [ $fail -ne 0 ]; then
28
- echo "pre-commit: 入口文档缺同名 plan,提交已阻止(与 pre-push check-loop 同口径,发现时机提前到 commit)" >&2
41
+ echo "pre-commit: 入口文档配对不全(plan / L2-L3 spec),提交已阻止(与 pre-push check-loop 同口径,发现时机提前到 commit)" >&2
29
42
  fi
30
43
  exit $fail
@@ -11,7 +11,7 @@
11
11
 
12
12
  - API:<端口 / 进程名 / 启动停止命令>
13
13
  - 前端:<端口 / 启动命令>
14
- - workflow 看板:{{BOARD_PORT}}(`node .agents/scripts/workflow-board-server.mjs`,只读)
14
+ - workflow 看板:8933(`node .agents/scripts/workflow-board-server.mjs`,只读)
15
15
 
16
16
  ## 3. 数据与密钥
17
17
 
@@ -1,5 +1,7 @@
1
1
  # Implementer
2
2
 
3
+ > 公共角色契约(本文件):`.agents/roles/implementer.md`。宿主薄适配(`.opencode/` / `.trae/` / `.zcode/` 下 `agents/implementer.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
4
+
3
5
  ## 职责
4
6
 
5
7
  执行已经由主智能体和用户确认、范围明确的实现任务。适用范围仅限:
@@ -1,5 +1,7 @@
1
1
  # Independent Reviewer
2
2
 
3
+ > 公共角色契约(本文件):`.agents/roles/independent-reviewer.md`。宿主薄适配(`.opencode/` / `.trae/` / `.zcode/` 下 `agents/independent-reviewer.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
4
+
3
5
  ## 职责
4
6
 
5
7
  在独立上下文中对 spec、plan 或代码 diff 做只读复核,发现原作者可能遗漏的正确性、契约、架构、数据安全和回归风险。
@@ -1,5 +1,7 @@
1
1
  # UI Verifier
2
2
 
3
+ > 公共角色契约(本文件):`.agents/roles/ui-verifier.md`。宿主薄适配(`.opencode/` / `.trae/` / `.zcode/` 下 `agents/ui-verifier.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
4
+
3
5
  ## 职责
4
6
 
5
7
  对已经实现的 UI 改动执行浏览器实测并收集可复核证据。只验证,不修复。
@@ -5,4 +5,4 @@
5
5
  # 口径:预算比较用「索引 / HEAD 字节」(git cat-file,LF 归一);禁用工作区 wc -c 核对(CRLF 膨胀)。
6
6
  AGENTS.md 7680
7
7
  .agents/commands/*.md 8192
8
- .agents/commands/ 49152
8
+ .agents/commands/ 65536
@@ -4,7 +4,7 @@
4
4
  * 输出各月指标(一次通过率 / 平均返工次数 / 主兜底占比)、并发扩容门判定、可粘贴的月度快照行。
5
5
  * 结果取值:一次通过 | 返工×N | 主兜底 | 返工待修(未闭环,不计入率)。
6
6
  * 用法:node .agents/scripts/agg-delegations.cjs [--month=YYYY-MM](默认输出全部月份 + 全量累计)
7
- * 门槛定义见 workflow/delegations.md §并发扩容门槛,两处须同步改。
7
+ * 门槛定义见 workflow/delegations.md §并发扩容门槛(doc 为权威,脚本向文档对齐——2026-09-27 board-kb-p1)。
8
8
  */
9
9
  'use strict';
10
10
  const fs = require('fs');
@@ -88,8 +88,11 @@ function countIncidents() {
88
88
  return byMonth;
89
89
  }
90
90
 
91
- // 门槛(与 workflow/delegations.md §并发扩容门槛 同步)
92
- const GATE = { minSample: 20, minPassRate: 0.9, maxAvgRework: 0.3, minDelegated: 5, maxFallbackRate: 0.1 };
91
+ // 门槛(2026-09-27 board-kb-p1 对齐 workflow/delegations.md §并发扩容门槛声明——doc 为权威):
92
+ // 月度口径项:一次完成率 ≥90% | 月度返工次数 = 0 | 无主兜底信号(=0)(旧「平均返工≤0.3 / 兜底≤10%」为宽松分叉,退役)
93
+ // 样本护栏项(脚本侧统计可信度门槛,非口径分叉):月样本量 ≥20 | 委派样本 ≥5
94
+ // 连续性:扩容需「本月 + 上一自然月」连续两月月度口径全达标(delegations.md「连续两个月」)
95
+ const GATE = { minSample: 20, minPassRate: 0.9, minDelegated: 5 };
93
96
 
94
97
  function metrics(rows) {
95
98
  // 未知结果(结果列拼错/漏填)单列计数,不混进「待修」——待修=未闭环,未知=记录本身有问题(2026-09-24 口径分离)
@@ -126,29 +129,26 @@ function fmtNum(x) {
126
129
  return x == null ? '—' : x.toFixed(2);
127
130
  }
128
131
 
129
- function gate(m, incidents) {
132
+ // gateMonth:单月门槛判定(pure,供测试)——口径项 + 样本护栏项分开列
133
+ function gateMonth(m) {
130
134
  const items = [];
131
- items.push({ no: 1, ok: m.total >= GATE.minSample, desc: `样本量 ${m.total}/${GATE.minSample}` });
132
- items.push({
133
- no: 2,
134
- ok: m.passRate != null && m.passRate >= GATE.minPassRate,
135
- desc: `一次通过率 ${fmtRate(m.passRate)}≥90%`,
136
- });
137
- items.push({
138
- no: 3,
139
- ok: m.avgRework != null && m.avgRework <= GATE.maxAvgRework,
140
- desc: `平均返工 ${fmtNum(m.avgRework)}≤0.3`,
141
- });
142
- const delegOk = m.delegatedValid >= GATE.minDelegated && m.fallbackRate != null && m.fallbackRate <= GATE.maxFallbackRate;
143
- items.push({
144
- no: 4,
145
- ok: delegOk,
146
- desc: `委派样本 ${m.delegatedValid}≥5 且主兜底 ${fmtRate(m.fallbackRate)}≤10%`,
147
- });
148
- items.push({ no: 5, ok: null, desc: '门禁不失守(人工对照当月 incident 定性)' });
149
- const hardOk = items.filter((i) => i.ok !== null).every((i) => i.ok);
150
- const bad = items.filter((i) => i.ok === false).map((i) => i.no).join('+');
151
- return { items, verdict: hardOk ? '✅(待人工确认门5)' : `❌ 未达标项:${bad}` };
135
+ items.push({ no: 1, ok: m.total >= GATE.minSample, desc: `样本量 ${m.total}/${GATE.minSample}`, kind: '样本护栏' });
136
+ items.push({ no: 2, ok: m.passRate != null && m.passRate >= GATE.minPassRate, desc: `一次完成率 ${fmtRate(m.passRate)}≥90%`, kind: '口径' });
137
+ items.push({ no: 3, ok: m.reworkSum === 0, desc: `月度返工次数 ${m.reworkSum}=0`, kind: '口径' });
138
+ items.push({ no: 4, ok: m.fallback === 0, desc: `主兜底 ${m.fallback}=0(无主兜底信号)`, kind: '口径' });
139
+ items.push({ no: 5, ok: m.delegatedValid >= GATE.minDelegated, desc: `委派样本 ${m.delegatedValid}≥5`, kind: '样本护栏' });
140
+ items.push({ no: 6, ok: null, desc: '门禁不失守(人工对照当月 incident 定性)', kind: '人工' });
141
+ return { items, monthOk: items.filter((i) => i.ok !== null).every((i) => i.ok) };
142
+ }
143
+
144
+ // expansionVerdict:连续两个月扩容判定(pure,供测试)——本月与上一自然月 monthOk 均真才「可扩容」;
145
+ // prevMissing = 无上月数据(首月/断档);items 供未达标项列出
146
+ function expansionVerdict(monthOk, prevOk, prevMissing, items) {
147
+ if (monthOk && prevOk) return '✅ 连续两月达标(可扩容,待人工确认门6)';
148
+ if (monthOk && prevMissing) return '⚠️ 本月达标(连续性 1/2——上月无数据)';
149
+ if (monthOk) return '⚠️ 本月达标(连续性 1/2——上月未达标)';
150
+ const bad = (items || []).filter((i) => i.ok === false).map((i) => i.no).join('+');
151
+ return `❌ 未达标(连续性中断):${bad || '月度口径项未全过'}`;
152
152
  }
153
153
 
154
154
  function main() {
@@ -165,14 +165,18 @@ function main() {
165
165
  console.log(`# 量化证据聚合(${argMonth || '全部月份'}) 生成于 ${new Date().toISOString().slice(0, 10)}\n`);
166
166
 
167
167
  const snapshotRows = [];
168
+ const monthResults = new Map(); // ym → { monthOk }(连续两月判定用)
168
169
  for (const ym of months) {
169
170
  const m = metrics(byMonth[ym]);
170
- const g = gate(m, incidents[ym] || 0);
171
+ const { items, monthOk } = gateMonth(m);
172
+ monthResults.set(ym, monthOk);
173
+ const prevYm = (() => { const [y, mo] = ym.split('-').map(Number); const d = new Date(Date.UTC(y, mo - 2, 1)); return `${d.getUTCFullYear()}-${String(d.getUTCMonth() + 1).padStart(2, '0')}`; })();
174
+ const verdict = expansionVerdict(monthOk, monthResults.get(prevYm), !months.includes(prevYm), items);
171
175
  console.log(`## ${ym}`);
172
176
  console.log(` 有效任务 ${m.total}(待修 ${m.pending}${m.unknown ? `、未知结果 ${m.unknown}` : ''})|一次通过 ${m.pass}(${fmtRate(m.passRate)})|返工总次数 ${m.reworkSum}(平均 ${fmtNum(m.avgRework)})|主兜底 ${m.fallback}/${m.delegatedValid}(${fmtRate(m.fallbackRate)})|incident ${incidents[ym] || 0} 起`);
173
- for (const i of g.items) console.log(` 门${i.no} ${i.ok === null ? '[人工]' : i.ok ? '✅' : '❌'} ${i.desc}`);
174
- console.log(` 扩容门判定:${g.verdict}\n`);
175
- snapshotRows.push(`| ${ym} | ${m.total} | ${fmtRate(m.passRate)} | ${fmtNum(m.avgRework)} | ${fmtRate(m.fallbackRate)} | ${incidents[ym] || 0} | ${g.verdict} | 样本含待修${m.pending}${m.unknown ? `、未知${m.unknown}` : ''} |`);
177
+ for (const i of items) console.log(` 门${i.no}[${i.kind}] ${i.ok === null ? '[人工]' : i.ok ? '✅' : '❌'} ${i.desc}`);
178
+ console.log(` 扩容门判定:${verdict}\n`);
179
+ snapshotRows.push(`| ${ym} | ${m.total} | ${fmtRate(m.passRate)} | ${fmtNum(m.avgRework)} | ${fmtRate(m.fallbackRate)} | ${incidents[ym] || 0} | ${verdict} | 样本含待修${m.pending}${m.unknown ? `、未知${m.unknown}` : ''} |`);
176
180
  }
177
181
 
178
182
  if (!argMonth && rows.length) {
@@ -189,4 +193,9 @@ function main() {
189
193
  }
190
194
  }
191
195
 
192
- main();
196
+ // isMain 守卫 + 纯函数导出(board-kb-p1:gateMonth / expansionVerdict 供测试 import,import 不执行 main)
197
+ if (require.main === module) {
198
+ main();
199
+ } else {
200
+ module.exports = { parseResult, metrics, gateMonth, expansionVerdict, GATE };
201
+ }