agentic-flow-kit 0.8.0 → 0.9.1

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 (141) hide show
  1. package/README.md +93 -69
  2. package/modules/gates/README.md +24 -0
  3. package/modules/gates/generated-readonly/README.md +13 -0
  4. package/modules/gates/generated-readonly/check-generated.mjs +61 -0
  5. package/modules/gates/generated-readonly/local-pre-commit.line +1 -0
  6. package/modules/gates/node-layer/README.md +9 -0
  7. package/modules/gates/node-layer/check-node-layer.mjs +29 -0
  8. package/modules/gates/node-layer/local-pre-commit.line +1 -0
  9. package/modules/gates/py-import/README.md +9 -0
  10. package/modules/gates/py-import/check-py-import.mjs +30 -0
  11. package/modules/gates/py-import/local-pre-commit.line +1 -0
  12. package/modules/hosts/claude/agents/implementer.md +52 -0
  13. package/modules/hosts/claude/agents/independent-reviewer.md +49 -0
  14. package/modules/hosts/claude/agents/ui-verifier.md +48 -0
  15. package/modules/hosts/claude/commands/wf-build.md +79 -0
  16. package/modules/hosts/claude/commands/wf-deploy.md +57 -0
  17. package/modules/hosts/claude/commands/wf-design.md +42 -0
  18. package/modules/hosts/claude/commands/wf-gate-checklist.md +77 -0
  19. package/modules/hosts/claude/commands/wf-maintain.md +76 -0
  20. package/modules/hosts/claude/commands/wf-new-task.md +65 -0
  21. package/modules/hosts/claude/commands/wf-plan.md +41 -0
  22. package/modules/hosts/claude/commands/wf-review.md +47 -0
  23. package/modules/hosts/claude/commands/wf-source-sync-check.md +89 -0
  24. package/modules/hosts/claude/commands/wf-sync-hosts.md +66 -0
  25. package/modules/hosts/claude/commands/wf-test.md +66 -0
  26. package/modules/hosts/codex/agents/implementer.md +52 -0
  27. package/modules/hosts/codex/agents/independent-reviewer.md +49 -0
  28. package/modules/hosts/codex/agents/ui-verifier.md +48 -0
  29. package/modules/hosts/codex/commands/wf-build.md +79 -0
  30. package/modules/hosts/codex/commands/wf-deploy.md +57 -0
  31. package/modules/hosts/codex/commands/wf-design.md +42 -0
  32. package/modules/hosts/codex/commands/wf-gate-checklist.md +77 -0
  33. package/modules/hosts/codex/commands/wf-maintain.md +76 -0
  34. package/modules/hosts/codex/commands/wf-new-task.md +65 -0
  35. package/modules/hosts/codex/commands/wf-plan.md +41 -0
  36. package/modules/hosts/codex/commands/wf-review.md +47 -0
  37. package/modules/hosts/codex/commands/wf-source-sync-check.md +89 -0
  38. package/modules/hosts/codex/commands/wf-sync-hosts.md +66 -0
  39. package/modules/hosts/codex/commands/wf-test.md +66 -0
  40. package/modules/hosts/codex/skills/flow-kit/SKILL.md +14 -0
  41. package/modules/hosts/cursor/agents/implementer.md +52 -0
  42. package/modules/hosts/cursor/agents/independent-reviewer.md +49 -0
  43. package/modules/hosts/cursor/agents/ui-verifier.md +48 -0
  44. package/modules/hosts/cursor/commands/wf-build.md +79 -0
  45. package/modules/hosts/cursor/commands/wf-deploy.md +57 -0
  46. package/modules/hosts/cursor/commands/wf-design.md +42 -0
  47. package/modules/hosts/cursor/commands/wf-gate-checklist.md +77 -0
  48. package/modules/hosts/cursor/commands/wf-maintain.md +76 -0
  49. package/modules/hosts/cursor/commands/wf-new-task.md +65 -0
  50. package/modules/hosts/cursor/commands/wf-plan.md +41 -0
  51. package/modules/hosts/cursor/commands/wf-review.md +47 -0
  52. package/modules/hosts/cursor/commands/wf-source-sync-check.md +89 -0
  53. package/modules/hosts/cursor/commands/wf-sync-hosts.md +66 -0
  54. package/modules/hosts/cursor/commands/wf-test.md +66 -0
  55. package/modules/hosts/omp/agents/implementer.md +1 -1
  56. package/modules/hosts/omp/agents/independent-reviewer.md +1 -1
  57. package/modules/hosts/omp/agents/ui-verifier.md +1 -1
  58. package/modules/hosts/opencode/agents/implementer.md +1 -1
  59. package/modules/hosts/opencode/agents/independent-reviewer.md +1 -1
  60. package/modules/hosts/opencode/agents/ui-verifier.md +1 -1
  61. package/modules/hosts/opencode/commands/wf-build.md +3 -4
  62. package/modules/hosts/opencode/commands/wf-design.md +2 -2
  63. package/modules/hosts/opencode/commands/wf-maintain.md +1 -1
  64. package/modules/hosts/opencode/commands/wf-plan.md +3 -3
  65. package/modules/hosts/opencode/commands/wf-review.md +1 -1
  66. package/modules/hosts/opencode/commands/wf-source-sync-check.md +1 -1
  67. package/modules/hosts/opencode/commands/wf-test.md +3 -1
  68. package/modules/hosts/trae/agents/implementer.md +1 -1
  69. package/modules/hosts/trae/agents/independent-reviewer.md +1 -1
  70. package/modules/hosts/trae/agents/ui-verifier.md +1 -1
  71. package/modules/hosts/trae/commands/wf-build.md +3 -4
  72. package/modules/hosts/trae/commands/wf-design.md +2 -2
  73. package/modules/hosts/trae/commands/wf-maintain.md +1 -1
  74. package/modules/hosts/trae/commands/wf-plan.md +3 -3
  75. package/modules/hosts/trae/commands/wf-review.md +1 -1
  76. package/modules/hosts/trae/commands/wf-source-sync-check.md +1 -1
  77. package/modules/hosts/trae/commands/wf-test.md +3 -1
  78. package/modules/hosts/zcode/agents/implementer.md +1 -1
  79. package/modules/hosts/zcode/agents/independent-reviewer.md +1 -1
  80. package/modules/hosts/zcode/agents/ui-verifier.md +1 -1
  81. package/package.json +45 -45
  82. package/src/cli.mjs +16 -4
  83. package/src/doctor.mjs +49 -1
  84. package/src/fresh-init.test.mjs +36 -0
  85. package/src/gates.test.mjs +126 -0
  86. package/src/init.mjs +8 -1
  87. package/src/init.test.mjs +7 -1
  88. package/src/profiles.mjs +10 -4
  89. package/src/run-tests.mjs +3 -0
  90. package/src/stack-profile.test.mjs +89 -0
  91. package/src/sync-hosts.test.mjs +26 -6
  92. package/templates/AGENTS.md +4 -4
  93. package/templates/_agents/board/index.html +3 -3
  94. package/templates/_agents/commands/build.md +4 -5
  95. package/templates/_agents/commands/design.md +4 -4
  96. package/templates/_agents/commands/maintain.md +1 -1
  97. package/templates/_agents/commands/new-task.md +13 -2
  98. package/templates/_agents/commands/plan.md +4 -4
  99. package/templates/_agents/commands/review.md +1 -1
  100. package/templates/_agents/commands/source-sync-check.md +1 -1
  101. package/templates/_agents/commands/test.md +4 -2
  102. package/templates/_agents/hooks/commit-check.cjs +45 -24
  103. package/templates/_agents/lane-surfaces.txt +14 -0
  104. package/templates/_agents/roles/implementer.md +1 -1
  105. package/templates/_agents/roles/independent-reviewer.md +1 -1
  106. package/templates/_agents/roles/ui-verifier.md +1 -1
  107. package/templates/_agents/scripts/check-lane-surface.mjs +164 -0
  108. package/templates/_agents/scripts/check-lane-surface.test.mjs +200 -0
  109. package/templates/_agents/scripts/check-loop-rev.test.mjs +337 -0
  110. package/templates/_agents/scripts/check-loop.mjs +460 -268
  111. package/templates/_agents/scripts/check-loop.test.mjs +677 -17
  112. package/templates/_agents/scripts/check-metric-claims.mjs +275 -0
  113. package/templates/_agents/scripts/commit-check-trigger.test.mjs +64 -1
  114. package/templates/_agents/scripts/confirm-doc.mjs +159 -15
  115. package/templates/_agents/scripts/confirm-doc.test.mjs +362 -10
  116. package/templates/_agents/scripts/doctor.test.mjs +102 -1
  117. package/templates/_agents/scripts/fill-intent.mjs +8 -7
  118. package/templates/_agents/scripts/fill-intent.test.mjs +12 -3
  119. package/templates/_agents/scripts/fill-plan.mjs +27 -11
  120. package/templates/_agents/scripts/fill-plan.test.mjs +148 -8
  121. package/templates/_agents/scripts/fill-spec.mjs +18 -3
  122. package/templates/_agents/scripts/fill-spec.test.mjs +198 -1
  123. package/templates/_agents/scripts/gate-checklist.mjs +4 -1
  124. package/templates/_agents/scripts/gen-workflow-index.mjs +6 -2
  125. package/templates/_agents/scripts/gen-workflow-index.test.mjs +12 -0
  126. package/templates/_agents/scripts/policy.mjs +46 -0
  127. package/templates/_agents/scripts/pre-push.test.mjs +82 -0
  128. package/templates/_agents/scripts/solidify-task.mjs +107 -0
  129. package/templates/_agents/scripts/solidify-task.test.mjs +126 -0
  130. package/templates/_agents/scripts/stage-gates.mjs +256 -0
  131. package/templates/_agents/scripts/trust-mode.mjs +67 -0
  132. package/templates/_agents/scripts/wf-journal.mjs +71 -2
  133. package/templates/_agents/scripts/wf-journal.test.mjs +66 -0
  134. package/templates/_agents/scripts/workflow-board-server.mjs +18 -15
  135. package/templates/_agents/scripts/workflow-board-server.test.mjs +30 -1
  136. package/templates/_agents/workflows/pipeline-closing.md +1 -1
  137. package/templates/_githooks/pre-commit +33 -2
  138. package/templates/_githooks/pre-push +58 -10
  139. package/templates/workflow/README.md +22 -3
  140. package/templates/workflow/incidents/_TEMPLATE.md +4 -0
  141. package/templates/workflow/intents/_TEMPLATE.md +1 -0
@@ -8,7 +8,7 @@ permission:
8
8
  ---
9
9
  # Independent Reviewer
10
10
 
11
- > 公共角色契约(本文件):`.agents/roles/independent-reviewer.md`。宿主薄适配(`.opencode/` / `.trae/` / `.zcode/` 下 `agents/independent-reviewer.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
11
+ > 公共角色契约(本文件):`.agents/roles/independent-reviewer.md`。宿主薄适配(各宿主目录下 `agents/independent-reviewer.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
12
12
 
13
13
  ## 职责
14
14
 
@@ -8,7 +8,7 @@ permission:
8
8
  ---
9
9
  # UI Verifier
10
10
 
11
- > 公共角色契约(本文件):`.agents/roles/ui-verifier.md`。宿主薄适配(`.opencode/` / `.trae/` / `.zcode/` 下 `agents/ui-verifier.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
11
+ > 公共角色契约(本文件):`.agents/roles/ui-verifier.md`。宿主薄适配(各宿主目录下 `agents/ui-verifier.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
12
12
 
13
13
  ## 职责
14
14
 
@@ -10,14 +10,13 @@ description: Build 阶段 · 起 plan + 实现代码 + 自验(两道确认门
10
10
 
11
11
  ### 起草 plan
12
12
 
13
- 1. 确认同名入口文档(approved intent 或已确认的 incident)+ spec(若 L2/L3)均已确认;否则拒绝,回上一阶段
13
+ 1. 确认同名入口文档(approved intent 或已确认的 incident)+ spec(若 L2/L3)均已确认;否则回上一阶段(fill/confirm 未过即拒)
14
14
  2. 起草 plan:
15
15
  - 复制 `workflow/plans/_TEMPLATE.md` → `workflow/plans/YYYY-MM-DD-<主题>.md`(与入口文档同名)
16
16
  - L2/L3 按 4 节填写:任务拆解(每个任务有判据) / 风险评估 / 执行顺序 / 遗留项
17
17
  - L1 默认极简两节:改动面(逐条文件+做什么) / 验证方式(一行静态门+按需 UI 实测);仅多文件多步骤时再加任务拆解/执行顺序
18
- - 仍须与入口文档同名落盘
19
- 3. 停下,输出 plan 草稿全文给用户过目,一句"可以"即确认。**逐件确认**:入口文档 / spec / plan 各自的确认点不得并作一次,plan 草稿须全文过目(不接受摘要代替)。**逐件配逐件原话**:`--delegated` 每次传当次实际放行的措辞,不复用同句——复用同句使台账 quote 失去分辨力(事后对质看不出放行的是哪一件),且相邻同 quote 连跑触发 check-loop 15 并录告警(见 workflow/papercuts.md 2026-09-28)
20
- **确认落态唯一入口**(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。
18
+ 3. 停下,输出 plan 草稿全文给用户过目,一句"可以"即确认。**逐件确认**:入口文档 / spec / plan 各自的确认点不得并作一次,plan 草稿须全文过目(不接受摘要代替)。**逐件配逐件原话**:`--delegated` 每次传当次实际放行的措辞,不复用同句——复用同句使台账 quote 失去分辨力(事后对质看不出放行的是哪一件);原因与根治见 workflow/papercuts.md 2026-09-28
19
+ **确认落态唯一入口**(2026-09-27 起):用户在终端跑 `node .agents/scripts/confirm-doc.mjs <path>` 键入「可以」(draft→approved / approved→done;对话内明确确认后 AI 可 `--delegated "<原话>"` 代录,台账如实记 source/quote——**逐件调用 + 逐件原话**(一次一份,build.md「逐件确认」口径;多份并录被 confirm-doc 拒绝。--delegated 每次传当次实际放行的措辞,不复用同句——复用同句使台账 quote 失去分辨力))。check-loop 15 如实口径:缺记录/指纹不配对 → hard-block 拦截;伪造台账本地不可机器防,留痕供事后对质;done 内容绑定(2026-09-28 起)——关单编辑(勾验/回填)先于 done 确认、confirm-doc 是最后一次写入,此后修订走 superseded 或新 intent。
21
20
  4. 确认后 → plan 状态 draft → approved,并在 plan 内补「确认与复核」节(确认结果 + 日期)。确认环节须在文档留痕:`approved` 是确认的机器可见态,`done` 只在关单出现,禁从 `draft` 直跳 `done`;确认后立即 `docs(workflow)` 单独提交留痕(根 `AGENTS.md` 提交约定;check-loop 检查 14 口径)
22
21
 
23
22
  ### 进计划模式列改动
@@ -8,7 +8,7 @@ description: Design 阶段 · 起 spec(L2/L3 强制,L1 可省略直接进 bu
8
8
 
9
9
  ## 执行
10
10
 
11
- 1. 确认同名入口文档已批准:新需求为 approved intent,修复为已确认的 incident 草稿;否则拒绝,分别回 `plan.md` / `maintain.md`
11
+ 1. 确认同名入口文档已批准:新需求为 approved intent,修复为已确认的 incident 草稿;否则拒绝,分别回 `plan.md` / `maintain.md`(2026-09-30 起机器强制:fill-spec / confirm-doc 对前置未过直接拒绝 exit 2、不落盘不记账)
12
12
  2. 级别判断(对照 AGENTS.md 第 3 条):
13
13
  - **L1**(实现级改动,未命中 L2/L3)→ 可省略 spec,直接跳 `next: build.md`
14
14
  - **L2**(改规则 / 契约:编码权威 / 共享契约 / 既有接口语义 / 全局横切口径,闭集见 `new-task.md` §级别判断)→ 必须有 spec
@@ -37,6 +37,6 @@ description: Design 阶段 · 起 spec(L2/L3 强制,L1 可省略直接进 bu
37
37
  ## 确认后
38
38
 
39
39
  - spec 状态 draft → approved
40
- **确认落态唯一入口**(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。
40
+ **确认落态唯一入口**(2026-09-27 起):用户在终端跑 `node .agents/scripts/confirm-doc.mjs <path>` 键入「可以」(draft→approved / approved→done;对话内明确确认后 AI 可 `--delegated "<原话>"` 代录,台账如实记 source/quote——**逐件调用 + 逐件原话**(一次一份,build.md「逐件确认」口径;多份并录被 confirm-doc 拒绝。--delegated 每次传当次实际放行的措辞,不复用同句——复用同句使台账 quote 失去分辨力))。check-loop 15 如实口径:缺记录/指纹不配对 → hard-block 拦截;伪造台账本地不可机器防,留痕供事后对质;done 内容绑定(2026-09-28 起)——关单编辑(勾验/回填)先于 done 确认、confirm-doc 是最后一次写入,此后修订走 superseded 或新 intent。
41
41
  - 立即 `docs(workflow)` 单独提交留痕(根 `AGENTS.md` 提交约定;check-loop 检查 14 口径)
42
42
  - 进 `next: .agents/commands/build.md`
@@ -50,7 +50,7 @@ description: Maintain 阶段 · 立 incident + 复盘三件套(incident 在 L1
50
50
 
51
51
  ### 3. 起草后停下
52
52
 
53
- 输出草稿全文给用户过目;确认后才执行三件套落地。**确认点不合并**:incident 草稿、spec、plan 各自过目确认(plan 的两道门见 `build.md`);确认后立即留痕(spec/plan 状态 `approved` + 「确认与复核」节,incident 时间线补「用户确认」条目),`done` 只在关单出现。
53
+ 输出草稿全文给用户过目;确认后才执行三件套落地。**确认点不合并**:incident 草稿、spec、plan 各自过目确认(plan 的两道门见 `build.md`);确认后立即留痕(spec/plan 状态 `approved` + 「确认与复核」节,incident 时间线补「用户确认」条目),`done` 只在关单出现。**L2/L3 机器前置**:起草 spec 时 fill-spec / confirm-doc 校验「时间线含『用户确认』留痕」,未过即拒(exit 2)——被拒回本流程补留痕。
54
54
 
55
55
  ### 4. 确认后落地
56
56
 
@@ -13,7 +13,7 @@ description: Plan 阶段 · 立 intent(AI 起草、用户确认;本阶段不
13
13
  1. 若 `workflow/intents/` 已有目标 intent 且状态为 approved → 按级别跳 next(L1 → `build.md`,L2/L3 → `design.md`)
14
14
  2. 否则起草新 intent:
15
15
  - **先检索同类**:`node .agents/scripts/kb-search.mjs "<关键词>" --scope workflow --type intents,specs`——命中同类先读其结论与验收,新 intent 引用(防重复立项 / 重复踩坑)
16
- - **填空工具先跑**:`node .agents/scripts/fill-intent.mjs --module <模块> --level <L0|L1|L2|L3> --topic <主题> --output workflow/intents/<date>-<主题>.md --notes "<备注>"`——输出含 frontmatter 5 字段 + 7 节正文(背景与问题/目标/非目标/约束/影响面/触达红线/验收标准)的草稿;AI 据此填实,模板与节标题机器保证不出错
16
+ - **填空工具先跑**:`node .agents/scripts/fill-intent.mjs --module <模块> --level <L0|L1|L2|L3> --topic <主题> --output workflow/intents/<date>-<主题>.md --notes "<备注>"`——输出含 frontmatter 6 字段(含 risk_level)+ 7 节正文(背景与问题/目标/非目标/约束/影响面/触达红线/验收标准)的草稿;AI 据此填实,模板与节标题机器保证不出错
17
17
  - 复制 `workflow/intents/_TEMPLATE.md` → `workflow/intents/YYYY-MM-DD-<主题>.md`
18
18
  - frontmatter 填 `模块:`(词表见 `.agents/workflow-modules.txt`,新建文档必填,check-loop 会警告)
19
19
  - 按 6 节填写:背景与问题 / 目标(可验证) / 非目标 / 约束 / 影响面 / 触达红线(L1 微改动可省非目标/约束两节,不硬填)
@@ -21,7 +21,7 @@ description: Plan 阶段 · 立 intent(AI 起草、用户确认;本阶段不
21
21
  3. 写不出可测试判据 = 还没想清楚 → 反问澄清,不要硬填
22
22
  4. 起草后停下,输出草稿全文给用户过目,一句"可以"即确认
23
23
 
24
- **确认落态唯一入口**(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。
24
+ **确认落态唯一入口**(2026-09-27 起):用户在终端跑 `node .agents/scripts/confirm-doc.mjs <path>` 键入「可以」(draft→approved / approved→done;对话内明确确认后 AI 可 `--delegated "<原话>"` 代录,台账如实记 source/quote——**逐件调用 + 逐件原话**(一次一份,build.md「逐件确认」口径;多份并录被 confirm-doc 拒绝。--delegated 每次传当次实际放行的措辞,不复用同句——复用同句使台账 quote 失去分辨力))。check-loop 15 如实口径:缺记录/指纹不配对 → hard-block 拦截;伪造台账本地不可机器防,留痕供事后对质;done 内容绑定(2026-09-28 起)——关单编辑(勾验/回填)先于 done 确认、confirm-doc 是最后一次写入,此后修订走 superseded 或新 intent。
25
25
 
26
26
  ## 技能辅助(可选,宿主级 skills)
27
27
 
@@ -37,5 +37,5 @@ description: Plan 阶段 · 立 intent(AI 起草、用户确认;本阶段不
37
37
  ## 确认后
38
38
 
39
39
  - intent 状态 draft → approved
40
- - 立即 `docs(workflow)` 单独提交留痕(根 `AGENTS.md` 提交约定;check-loop 检查 14 口径)
40
+ - 立即 `docs(workflow)` 单独提交留痕(根 `AGENTS.md` 提交约定;check-loop 检查 14 口径)——**提交最早可行点**:入口文档受 pre-commit 闭环配对(增量)门约束,同名 spec / plan 须已在工作区(先例 61ec130)
41
41
  - L1 → `.agents/commands/build.md`;L2/L3 → `.agents/commands/design.md`
@@ -30,7 +30,7 @@ description: Review · 代码评审(横切,合入前使用;P0/P1/P2 分级
30
30
  - **Create/Update 校验同口径**:Create 已有校验 Update 必须同口径;被引用的标识符字段禁改
31
31
  - **查询分页与状态语义**:分页参数范围校验 + 服务层钳制;非法状态与不存在分离(按项目统一错误口径,如 400 / 404)
32
32
  - **spec 承诺的断言落地**:spec §测试列出的用例 / 断言须真落到测试或验证脚本;「写进 spec」不等于「跑得起来」,且常驻断言禁写成随时间增长的行数常量
33
- - **跨宿主薄适配正文漂移**:改 `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)
33
+ - **跨宿主薄适配正文漂移**:改 `templates/_agents/{commands,roles}/*.md` 后必须跑 `flow-kit sync-hosts --apply` 单向同步注册表内全部宿主薄适配(`modules/hosts/<h>/{agents,commands}/*.md`);装户视角由 `flow-kit doctor` §6.7 检查(包源环境 §6.7 skipped)
34
34
 
35
35
  ## P2 建议(提醒,不拦合入)
36
36
 
@@ -62,7 +62,7 @@ flow-kit doctor # 10/0/0
62
62
  - 不改 managed 台账跟踪逻辑(`sync.mjs` 不动)
63
63
  - 不改 owned 漂移校验(`doctor.mjs` §6.6 不动)
64
64
  - 不反向同步——装副本独自有文件(如 hooks/commit-check.config.json)可能是装户配置,不应被删
65
- - 不检查 4 宿主 `modules/hosts/` 薄适配漂移(那是 `flow-kit sync-hosts` 范围)
65
+ - 不检查注册表内宿主 `modules/hosts/` 薄适配漂移(那是 `flow-kit sync-hosts` 范围)
66
66
 
67
67
  ## 当前已识别的真实漂点(首次实测,2026-09-25)
68
68
 
@@ -56,9 +56,11 @@ node bin/flow-kit.mjs doctor # §6.5 delegations + §6.6 o
56
56
  - **关单**(日常闭环点,不依赖是否上 prod):
57
57
  - 关单前一键过门:`node .agents/scripts/verify.mjs`(npm test + check-loop 固定编排,任一失败非零退出,非绿不关单)
58
58
  - 新需求:逐条勾验入口 intent「验收标准」,每条补「证据:」,intent → done;同名 spec(若有)仍 approved → done
59
- **确认落态唯一入口**(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。
59
+ - **approved 留痕提交**(2026-09-30 起):done 确认前确认**本次关单文档**的 approved 态已进 git 历史(越早越好——approved 后即应提交;若尚未,先补提交再 done;门为逐份校验,三件套均关单时逐份各自满足)——confirm-doc 的 done 前置门硬校验(历史未出现「状态: approved」→ 拒绝落账);done 后再提交 done 态与其余改动
60
+ **确认落态唯一入口**(2026-09-27 起):用户在终端跑 `node .agents/scripts/confirm-doc.mjs <path>` 键入「可以」(draft→approved / approved→done;对话内明确确认后 AI 可 `--delegated "<原话>"` 代录,台账如实记 source/quote——**逐件调用 + 逐件原话**(一次一份,build.md「逐件确认」口径;多份并录被 confirm-doc 拒绝。--delegated 每次传当次实际放行的措辞,不复用同句——复用同句使台账 quote 失去分辨力))。check-loop 15 如实口径:缺记录/指纹不配对 → hard-block 拦截;伪造台账本地不可机器防,留痕供事后对质;done 内容绑定(2026-09-28 起)——**关单编辑(勾验/回填确认结果)先于 done 确认、confirm-doc 是最后一次写入**,此后修订走 superseded 或新 intent。
60
61
  - 修复:防复发验证已落地,incident → closed(经确认门 confirm-doc:open→fixed / fixed→closed 两跳、无单跳;2026-09-28 起 check-loop 15 对账——关单编辑先于 closed 确认,口径同 done 内容绑定)
61
62
  - **同族收尾**:入口置终态时,同名 plan 一并置 `done`(spec 见上条),不留 `approved` 孤儿(口径同看板「入口已 done,本 plan 未终态」告警)
62
63
  - 主智能体自做的 L1+ 新需求在 `workflow/delegations.md`「自做任务结果表」记一行(修复类不重复记)
64
+ - **委派快照回写**:关单后若 `workflow/delegations.md` §月度聚合快照缺当月行或 doctor §6.5 报陈旧 → 跑 `node .agents/scripts/agg-delegations.cjs` 并回贴当月快照行
63
65
  - L1:本阶段结束,不进 deploy
64
66
  - L2/L3:仅当用户确认要上 prod 时进 `.agents/commands/deploy.md`
@@ -5,7 +5,7 @@ tools: Read, Glob, Grep, Edit, Write, Bash, LSP
5
5
  ---
6
6
  # Implementer
7
7
 
8
- > 公共角色契约(本文件):`.agents/roles/implementer.md`。宿主薄适配(`.opencode/` / `.trae/` / `.zcode/` 下 `agents/implementer.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
8
+ > 公共角色契约(本文件):`.agents/roles/implementer.md`。宿主薄适配(各宿主目录下 `agents/implementer.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
9
9
 
10
10
  ## 职责
11
11
 
@@ -6,7 +6,7 @@ disallowedTools: Edit, Write, Bash
6
6
  ---
7
7
  # Independent Reviewer
8
8
 
9
- > 公共角色契约(本文件):`.agents/roles/independent-reviewer.md`。宿主薄适配(`.opencode/` / `.trae/` / `.zcode/` 下 `agents/independent-reviewer.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
9
+ > 公共角色契约(本文件):`.agents/roles/independent-reviewer.md`。宿主薄适配(各宿主目录下 `agents/independent-reviewer.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
10
10
 
11
11
  ## 职责
12
12
 
@@ -6,7 +6,7 @@ disallowedTools: Edit, Write
6
6
  ---
7
7
  # UI Verifier
8
8
 
9
- > 公共角色契约(本文件):`.agents/roles/ui-verifier.md`。宿主薄适配(`.opencode/` / `.trae/` / `.zcode/` 下 `agents/ui-verifier.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
9
+ > 公共角色契约(本文件):`.agents/roles/ui-verifier.md`。宿主薄适配(各宿主目录下 `agents/ui-verifier.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
10
10
 
11
11
  ## 职责
12
12
 
@@ -11,14 +11,13 @@ description: Build 阶段 · 起 plan + 实现代码 + 自验(两道确认门
11
11
 
12
12
  ### 起草 plan
13
13
 
14
- 1. 确认同名入口文档(approved intent 或已确认的 incident)+ spec(若 L2/L3)均已确认;否则拒绝,回上一阶段
14
+ 1. 确认同名入口文档(approved intent 或已确认的 incident)+ spec(若 L2/L3)均已确认;否则回上一阶段(fill/confirm 未过即拒)
15
15
  2. 起草 plan:
16
16
  - 复制 `workflow/plans/_TEMPLATE.md` → `workflow/plans/YYYY-MM-DD-<主题>.md`(与入口文档同名)
17
17
  - L2/L3 按 4 节填写:任务拆解(每个任务有判据) / 风险评估 / 执行顺序 / 遗留项
18
18
  - L1 默认极简两节:改动面(逐条文件+做什么) / 验证方式(一行静态门+按需 UI 实测);仅多文件多步骤时再加任务拆解/执行顺序
19
- - 仍须与入口文档同名落盘
20
- 3. 停下,输出 plan 草稿全文给用户过目,一句"可以"即确认。**逐件确认**:入口文档 / spec / plan 各自的确认点不得并作一次,plan 草稿须全文过目(不接受摘要代替)。**逐件配逐件原话**:`--delegated` 每次传当次实际放行的措辞,不复用同句——复用同句使台账 quote 失去分辨力(事后对质看不出放行的是哪一件),且相邻同 quote 连跑触发 check-loop 15 并录告警(见 workflow/papercuts.md 2026-09-28)
21
- **确认落态唯一入口**(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。
19
+ 3. 停下,输出 plan 草稿全文给用户过目,一句"可以"即确认。**逐件确认**:入口文档 / spec / plan 各自的确认点不得并作一次,plan 草稿须全文过目(不接受摘要代替)。**逐件配逐件原话**:`--delegated` 每次传当次实际放行的措辞,不复用同句——复用同句使台账 quote 失去分辨力(事后对质看不出放行的是哪一件);原因与根治见 workflow/papercuts.md 2026-09-28
20
+ **确认落态唯一入口**(2026-09-27 起):用户在终端跑 `node .agents/scripts/confirm-doc.mjs <path>` 键入「可以」(draft→approved / approved→done;对话内明确确认后 AI 可 `--delegated "<原话>"` 代录,台账如实记 source/quote——**逐件调用 + 逐件原话**(一次一份,build.md「逐件确认」口径;多份并录被 confirm-doc 拒绝。--delegated 每次传当次实际放行的措辞,不复用同句——复用同句使台账 quote 失去分辨力))。check-loop 15 如实口径:缺记录/指纹不配对 → hard-block 拦截;伪造台账本地不可机器防,留痕供事后对质;done 内容绑定(2026-09-28 起)——关单编辑(勾验/回填)先于 done 确认、confirm-doc 是最后一次写入,此后修订走 superseded 或新 intent。
22
21
  4. 确认后 → plan 状态 draft → approved,并在 plan 内补「确认与复核」节(确认结果 + 日期)。确认环节须在文档留痕:`approved` 是确认的机器可见态,`done` 只在关单出现,禁从 `draft` 直跳 `done`;确认后立即 `docs(workflow)` 单独提交留痕(根 `AGENTS.md` 提交约定;check-loop 检查 14 口径)
23
22
 
24
23
  ### 进计划模式列改动
@@ -9,7 +9,7 @@ description: Design 阶段 · 起 spec(L2/L3 强制,L1 可省略直接进 wf
9
9
 
10
10
  ## 执行
11
11
 
12
- 1. 确认同名入口文档已批准:新需求为 approved intent,修复为已确认的 incident 草稿;否则拒绝,分别回 `plan.md` / `maintain.md`
12
+ 1. 确认同名入口文档已批准:新需求为 approved intent,修复为已确认的 incident 草稿;否则拒绝,分别回 `plan.md` / `maintain.md`(2026-09-30 起机器强制:fill-spec / confirm-doc 对前置未过直接拒绝 exit 2、不落盘不记账)
13
13
  2. 级别判断(对照 AGENTS.md 第 3 条):
14
14
  - **L1**(实现级改动,未命中 L2/L3)→ 可省略 spec,直接跳 `next: build.md`
15
15
  - **L2**(改规则 / 契约:编码权威 / 共享契约 / 既有接口语义 / 全局横切口径,闭集见 `new-task.md` §级别判断)→ 必须有 spec
@@ -38,6 +38,6 @@ description: Design 阶段 · 起 spec(L2/L3 强制,L1 可省略直接进 wf
38
38
  ## 确认后
39
39
 
40
40
  - spec 状态 draft → approved
41
- **确认落态唯一入口**(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。
41
+ **确认落态唯一入口**(2026-09-27 起):用户在终端跑 `node .agents/scripts/confirm-doc.mjs <path>` 键入「可以」(draft→approved / approved→done;对话内明确确认后 AI 可 `--delegated "<原话>"` 代录,台账如实记 source/quote——**逐件调用 + 逐件原话**(一次一份,build.md「逐件确认」口径;多份并录被 confirm-doc 拒绝。--delegated 每次传当次实际放行的措辞,不复用同句——复用同句使台账 quote 失去分辨力))。check-loop 15 如实口径:缺记录/指纹不配对 → hard-block 拦截;伪造台账本地不可机器防,留痕供事后对质;done 内容绑定(2026-09-28 起)——关单编辑(勾验/回填)先于 done 确认、confirm-doc 是最后一次写入,此后修订走 superseded 或新 intent。
42
42
  - 立即 `docs(workflow)` 单独提交留痕(根 `AGENTS.md` 提交约定;check-loop 检查 14 口径)
43
43
  - 进 `next: .agents/commands/build.md`
@@ -51,7 +51,7 @@ description: Maintain 阶段 · 立 incident + 复盘三件套(incident 在 L1
51
51
 
52
52
  ### 3. 起草后停下
53
53
 
54
- 输出草稿全文给用户过目;确认后才执行三件套落地。**确认点不合并**:incident 草稿、spec、plan 各自过目确认(plan 的两道门见 `build.md`);确认后立即留痕(spec/plan 状态 `approved` + 「确认与复核」节,incident 时间线补「用户确认」条目),`done` 只在关单出现。
54
+ 输出草稿全文给用户过目;确认后才执行三件套落地。**确认点不合并**:incident 草稿、spec、plan 各自过目确认(plan 的两道门见 `build.md`);确认后立即留痕(spec/plan 状态 `approved` + 「确认与复核」节,incident 时间线补「用户确认」条目),`done` 只在关单出现。**L2/L3 机器前置**:起草 spec 时 fill-spec / confirm-doc 校验「时间线含『用户确认』留痕」,未过即拒(exit 2)——被拒回本流程补留痕。
55
55
 
56
56
  ### 4. 确认后落地
57
57
 
@@ -14,7 +14,7 @@ description: Plan 阶段 · 立 intent(AI 起草、用户确认;本阶段不
14
14
  1. 若 `workflow/intents/` 已有目标 intent 且状态为 approved → 按级别跳 next(L1 → `build.md`,L2/L3 → `design.md`)
15
15
  2. 否则起草新 intent:
16
16
  - **先检索同类**:`node .agents/scripts/kb-search.mjs "<关键词>" --scope workflow --type intents,specs`——命中同类先读其结论与验收,新 intent 引用(防重复立项 / 重复踩坑)
17
- - **填空工具先跑**:`node .agents/scripts/fill-intent.mjs --module <模块> --level <L0|L1|L2|L3> --topic <主题> --output workflow/intents/<date>-<主题>.md --notes "<备注>"`——输出含 frontmatter 5 字段 + 7 节正文(背景与问题/目标/非目标/约束/影响面/触达红线/验收标准)的草稿;AI 据此填实,模板与节标题机器保证不出错
17
+ - **填空工具先跑**:`node .agents/scripts/fill-intent.mjs --module <模块> --level <L0|L1|L2|L3> --topic <主题> --output workflow/intents/<date>-<主题>.md --notes "<备注>"`——输出含 frontmatter 6 字段(含 risk_level)+ 7 节正文(背景与问题/目标/非目标/约束/影响面/触达红线/验收标准)的草稿;AI 据此填实,模板与节标题机器保证不出错
18
18
  - 复制 `workflow/intents/_TEMPLATE.md` → `workflow/intents/YYYY-MM-DD-<主题>.md`
19
19
  - frontmatter 填 `模块:`(词表见 `.agents/workflow-modules.txt`,新建文档必填,check-loop 会警告)
20
20
  - 按 6 节填写:背景与问题 / 目标(可验证) / 非目标 / 约束 / 影响面 / 触达红线(L1 微改动可省非目标/约束两节,不硬填)
@@ -22,7 +22,7 @@ description: Plan 阶段 · 立 intent(AI 起草、用户确认;本阶段不
22
22
  3. 写不出可测试判据 = 还没想清楚 → 反问澄清,不要硬填
23
23
  4. 起草后停下,输出草稿全文给用户过目,一句"可以"即确认
24
24
 
25
- **确认落态唯一入口**(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。
25
+ **确认落态唯一入口**(2026-09-27 起):用户在终端跑 `node .agents/scripts/confirm-doc.mjs <path>` 键入「可以」(draft→approved / approved→done;对话内明确确认后 AI 可 `--delegated "<原话>"` 代录,台账如实记 source/quote——**逐件调用 + 逐件原话**(一次一份,build.md「逐件确认」口径;多份并录被 confirm-doc 拒绝。--delegated 每次传当次实际放行的措辞,不复用同句——复用同句使台账 quote 失去分辨力))。check-loop 15 如实口径:缺记录/指纹不配对 → hard-block 拦截;伪造台账本地不可机器防,留痕供事后对质;done 内容绑定(2026-09-28 起)——关单编辑(勾验/回填)先于 done 确认、confirm-doc 是最后一次写入,此后修订走 superseded 或新 intent。
26
26
 
27
27
  ## 技能辅助(可选,宿主级 skills)
28
28
 
@@ -38,5 +38,5 @@ description: Plan 阶段 · 立 intent(AI 起草、用户确认;本阶段不
38
38
  ## 确认后
39
39
 
40
40
  - intent 状态 draft → approved
41
- - 立即 `docs(workflow)` 单独提交留痕(根 `AGENTS.md` 提交约定;check-loop 检查 14 口径)
41
+ - 立即 `docs(workflow)` 单独提交留痕(根 `AGENTS.md` 提交约定;check-loop 检查 14 口径)——**提交最早可行点**:入口文档受 pre-commit 闭环配对(增量)门约束,同名 spec / plan 须已在工作区(先例 61ec130)
42
42
  - L1 → `.agents/commands/build.md`;L2/L3 → `.agents/commands/design.md`
@@ -31,7 +31,7 @@ description: Review · 代码评审(横切,合入前使用;P0/P1/P2 分级
31
31
  - **Create/Update 校验同口径**:Create 已有校验 Update 必须同口径;被引用的标识符字段禁改
32
32
  - **查询分页与状态语义**:分页参数范围校验 + 服务层钳制;非法状态与不存在分离(按项目统一错误口径,如 400 / 404)
33
33
  - **spec 承诺的断言落地**:spec §测试列出的用例 / 断言须真落到测试或验证脚本;「写进 spec」不等于「跑得起来」,且常驻断言禁写成随时间增长的行数常量
34
- - **跨宿主薄适配正文漂移**:改 `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)
34
+ - **跨宿主薄适配正文漂移**:改 `templates/_agents/{commands,roles}/*.md` 后必须跑 `flow-kit sync-hosts --apply` 单向同步注册表内全部宿主薄适配(`modules/hosts/<h>/{agents,commands}/*.md`);装户视角由 `flow-kit doctor` §6.7 检查(包源环境 §6.7 skipped)
35
35
 
36
36
  ## P2 建议(提醒,不拦合入)
37
37
 
@@ -63,7 +63,7 @@ flow-kit doctor # 10/0/0
63
63
  - 不改 managed 台账跟踪逻辑(`sync.mjs` 不动)
64
64
  - 不改 owned 漂移校验(`doctor.mjs` §6.6 不动)
65
65
  - 不反向同步——装副本独自有文件(如 hooks/commit-check.config.json)可能是装户配置,不应被删
66
- - 不检查 4 宿主 `modules/hosts/` 薄适配漂移(那是 `flow-kit sync-hosts` 范围)
66
+ - 不检查注册表内宿主 `modules/hosts/` 薄适配漂移(那是 `flow-kit sync-hosts` 范围)
67
67
 
68
68
  ## 当前已识别的真实漂点(首次实测,2026-09-25)
69
69
 
@@ -57,9 +57,11 @@ node bin/flow-kit.mjs doctor # §6.5 delegations + §6.6 o
57
57
  - **关单**(日常闭环点,不依赖是否上 prod):
58
58
  - 关单前一键过门:`node .agents/scripts/verify.mjs`(npm test + check-loop 固定编排,任一失败非零退出,非绿不关单)
59
59
  - 新需求:逐条勾验入口 intent「验收标准」,每条补「证据:」,intent → done;同名 spec(若有)仍 approved → done
60
- **确认落态唯一入口**(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。
60
+ - **approved 留痕提交**(2026-09-30 起):done 确认前确认**本次关单文档**的 approved 态已进 git 历史(越早越好——approved 后即应提交;若尚未,先补提交再 done;门为逐份校验,三件套均关单时逐份各自满足)——confirm-doc 的 done 前置门硬校验(历史未出现「状态: approved」→ 拒绝落账);done 后再提交 done 态与其余改动
61
+ **确认落态唯一入口**(2026-09-27 起):用户在终端跑 `node .agents/scripts/confirm-doc.mjs <path>` 键入「可以」(draft→approved / approved→done;对话内明确确认后 AI 可 `--delegated "<原话>"` 代录,台账如实记 source/quote——**逐件调用 + 逐件原话**(一次一份,build.md「逐件确认」口径;多份并录被 confirm-doc 拒绝。--delegated 每次传当次实际放行的措辞,不复用同句——复用同句使台账 quote 失去分辨力))。check-loop 15 如实口径:缺记录/指纹不配对 → hard-block 拦截;伪造台账本地不可机器防,留痕供事后对质;done 内容绑定(2026-09-28 起)——**关单编辑(勾验/回填确认结果)先于 done 确认、confirm-doc 是最后一次写入**,此后修订走 superseded 或新 intent。
61
62
  - 修复:防复发验证已落地,incident → closed(经确认门 confirm-doc:open→fixed / fixed→closed 两跳、无单跳;2026-09-28 起 check-loop 15 对账——关单编辑先于 closed 确认,口径同 done 内容绑定)
62
63
  - **同族收尾**:入口置终态时,同名 plan 一并置 `done`(spec 见上条),不留 `approved` 孤儿(口径同看板「入口已 done,本 plan 未终态」告警)
63
64
  - 主智能体自做的 L1+ 新需求在 `workflow/delegations.md`「自做任务结果表」记一行(修复类不重复记)
65
+ - **委派快照回写**:关单后若 `workflow/delegations.md` §月度聚合快照缺当月行或 doctor §6.5 报陈旧 → 跑 `node .agents/scripts/agg-delegations.cjs` 并回贴当月快照行
64
66
  - L1:本阶段结束,不进 deploy
65
67
  - L2/L3:仅当用户确认要上 prod 时进 `.agents/commands/deploy.md`
@@ -4,7 +4,7 @@ description: 在已批准且边界明确的工作包内实现改动或补测试
4
4
  ---
5
5
  # Implementer
6
6
 
7
- > 公共角色契约(本文件):`.agents/roles/implementer.md`。宿主薄适配(`.opencode/` / `.trae/` / `.zcode/` 下 `agents/implementer.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
7
+ > 公共角色契约(本文件):`.agents/roles/implementer.md`。宿主薄适配(各宿主目录下 `agents/implementer.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
8
8
 
9
9
  ## 职责
10
10
 
@@ -4,7 +4,7 @@ description: 只读独立复核(spec 或实现 diff);不改动文件、不
4
4
  ---
5
5
  # Independent Reviewer
6
6
 
7
- > 公共角色契约(本文件):`.agents/roles/independent-reviewer.md`。宿主薄适配(`.opencode/` / `.trae/` / `.zcode/` 下 `agents/independent-reviewer.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
7
+ > 公共角色契约(本文件):`.agents/roles/independent-reviewer.md`。宿主薄适配(各宿主目录下 `agents/independent-reviewer.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
8
8
 
9
9
  ## 职责
10
10
 
@@ -4,7 +4,7 @@ description: 浏览器实测 UI 改动(只读验证、不留脏数据);结
4
4
  ---
5
5
  # UI Verifier
6
6
 
7
- > 公共角色契约(本文件):`.agents/roles/ui-verifier.md`。宿主薄适配(`.opencode/` / `.trae/` / `.zcode/` 下 `agents/ui-verifier.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
7
+ > 公共角色契约(本文件):`.agents/roles/ui-verifier.md`。宿主薄适配(各宿主目录下 `agents/ui-verifier.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
8
8
 
9
9
  ## 职责
10
10
 
package/package.json CHANGED
@@ -1,45 +1,45 @@
1
- {
2
- "name": "agentic-flow-kit",
3
- "version": "0.8.0",
4
- "description": "AI-Native 闭环工作流 + wiki 知识层脚手架——flow-kit init 一条命令为新项目装好 .agents 工作流引擎(阶段命令/角色契约/门禁钩子/kb 检索/看板/规则面预算)+ workflow 文档闭环 + wiki 知识库,装完自包含、零运行时依赖",
5
- "type": "module",
6
- "scripts": {
7
- "test": "node src/run-tests.mjs",
8
- "prepack": "node -e \"require('fs').rmSync('templates/_agents/cache',{recursive:true,force:true})\" && node scripts/check-pack-eol.mjs"
9
- },
10
- "bin": {
11
- "flow-kit": "bin/flow-kit.mjs"
12
- },
13
- "files": [
14
- "bin",
15
- "src",
16
- "templates",
17
- "modules",
18
- "README.md",
19
- "!templates/_agents/cache",
20
- "!templates/_agents/cache/**"
21
- ],
22
- "engines": {
23
- "node": ">=18.0.0"
24
- },
25
- "keywords": [
26
- "ai-native",
27
- "workflow",
28
- "agent",
29
- "scaffold",
30
- "cli",
31
- "wiki",
32
- "check-loop",
33
- "closed-loop"
34
- ],
35
- "license": "MIT",
36
- "private": false,
37
- "repository": {
38
- "type": "git",
39
- "url": "git+https://github.com/zerosloney/agentic-flow-kit.git"
40
- },
41
- "bugs": {
42
- "url": "https://github.com/zerosloney/agentic-flow-kit/issues"
43
- },
44
- "homepage": "https://github.com/zerosloney/agentic-flow-kit#readme"
45
- }
1
+ {
2
+ "name": "agentic-flow-kit",
3
+ "version": "0.9.1",
4
+ "description": "AI-Native 闭环工作流 + wiki 知识层脚手架——flow-kit init 一条命令为新项目装好 .agents 工作流引擎(阶段命令/角色契约/门禁钩子/kb 检索/看板/规则面预算)+ workflow 文档闭环 + wiki 知识库,装完自包含、零运行时依赖",
5
+ "type": "module",
6
+ "scripts": {
7
+ "test": "node src/run-tests.mjs",
8
+ "prepack": "node -e \"require('fs').rmSync('templates/_agents/cache',{recursive:true,force:true})\" && node scripts/check-pack-eol.mjs"
9
+ },
10
+ "bin": {
11
+ "flow-kit": "bin/flow-kit.mjs"
12
+ },
13
+ "files": [
14
+ "bin",
15
+ "src",
16
+ "templates",
17
+ "modules",
18
+ "README.md",
19
+ "!templates/_agents/cache",
20
+ "!templates/_agents/cache/**"
21
+ ],
22
+ "engines": {
23
+ "node": ">=18.0.0"
24
+ },
25
+ "keywords": [
26
+ "ai-native",
27
+ "workflow",
28
+ "agent",
29
+ "scaffold",
30
+ "cli",
31
+ "wiki",
32
+ "check-loop",
33
+ "closed-loop"
34
+ ],
35
+ "license": "MIT",
36
+ "private": false,
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+https://github.com/zerosloney/agentic-flow-kit.git"
40
+ },
41
+ "bugs": {
42
+ "url": "https://github.com/zerosloney/agentic-flow-kit/issues"
43
+ },
44
+ "homepage": "https://github.com/zerosloney/agentic-flow-kit#readme"
45
+ }
package/src/cli.mjs CHANGED
@@ -6,12 +6,23 @@ import { sync } from './sync.mjs';
6
6
  import { syncHosts } from './sync-hosts.mjs';
7
7
  import { addHost } from './add-host.mjs';
8
8
  import { addGate } from './add-gate.mjs';
9
- import { readFileSync } from 'node:fs';
9
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
10
10
  import { fileURLToPath } from 'node:url';
11
11
  import path from 'node:path';
12
12
 
13
13
  const PKG_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
14
14
 
15
+ function gateNames(pkgRoot) {
16
+ const dir = path.join(pkgRoot, 'modules', 'gates');
17
+ if (!existsSync(dir)) return [];
18
+ return readdirSync(dir, { withFileTypes: true })
19
+ .filter((d) => d.isDirectory())
20
+ .map((d) => d.name)
21
+ .sort();
22
+ }
23
+
24
+ const GATE_LIST = gateNames(PKG_ROOT).join(' | ') || '无';
25
+
15
26
  export const HELP = `flow-kit — AI-Native 闭环工作流 + wiki 知识层脚手架(agentic-flow-kit)
16
27
 
17
28
  用法:
@@ -20,8 +31,9 @@ export const HELP = `flow-kit — AI-Native 闭环工作流 + wiki 知识层脚
20
31
  flow-kit sync 升级 managed 文件(未改动→覆盖新版;本地已改→跳过并持续报告——台账不基线化,
21
32
  不会被下次升级静默覆盖;--force 才覆盖;INDEX/看板等生成器目标重跑锚点重写;
22
33
  owned 文件永不触碰)
23
- flow-kit add-host <宿主> 后补宿主适配层:zcode | opencode | trae | omp(已存在文件跳过且不入台账,--force 接管)
24
- flow-kit add-gate <门禁> 装门禁模块并接线 local-pre-commit(当前:dotnet-ca;装后归项目所有)
34
+ flow-kit add-host <宿主> 后补宿主适配层:zcode | opencode | trae | omp | claude | cursor | codex
35
+ (已存在文件跳过且不入台账,--force 接管)
36
+ flow-kit add-gate <门禁> 装门禁模块并接线 local-pre-commit(当前:${GATE_LIST};装后归项目所有)
25
37
  flow-kit sync-hosts 跨宿主适配层同步:templates/_agents/{commands,roles}/*.md 权威源 vs
26
38
  modules/hosts/<h>/{agents,commands}/*.md 薄适配——默认 --diff 输出报告;
27
39
  --apply 单向同步(权威→薄适配,不反向避免污染);
@@ -34,7 +46,7 @@ init 选项(全部可选,均有默认值):
34
46
  条件编译检查(builds)与质量检测(checks:lint/类型/vet 等秒级确定性检查,
35
47
  有对应配置文件才启用)、settings.json 自检验命令权限(allow)、
36
48
  AGENTS.md「项目适配区」命令预填
37
- --hosts <宿主列表> 逗号分隔:zcode,opencode,trae,omp(默认 zcode;zcode/omp 为本地配置,自动进 .gitignore)
49
+ --hosts <宿主列表> 逗号分隔:zcode,opencode,trae,omp,claude,cursor,codex(默认 zcode;zcode/omp 为本地配置,自动进 .gitignore)
38
50
  --board-port <端口> workflow 看板端口(默认 8933)
39
51
  --dir <目录> 目标项目根(默认当前目录)
40
52
  --force 覆盖已存在的同名文件(默认保守跳过)
package/src/doctor.mjs CHANGED
@@ -191,6 +191,16 @@ export function doctor(args, pkgRoot) {
191
191
  }
192
192
  }
193
193
 
194
+ // 6.5b delegations 月度聚合快照新鲜度(p0-gate-noise-batch:回写无门致快照 3 周未更新)
195
+ const snapFresh = checkDelegationSnapshotFreshness(target);
196
+ if (snapFresh.skipped) {
197
+ add('PASS', `delegations 快照新鲜度检查跳过(${snapFresh.note})`);
198
+ } else if (snapFresh.stale) {
199
+ add('WARN', `delegations 月度快照陈旧(台账至 ${snapFresh.ledgerMonth},快照至 ${snapFresh.snapshotMonth || '缺失'})——跑 agg-delegations.cjs 更新 §月度聚合快照`);
200
+ } else {
201
+ add('PASS', `delegations 月度快照最新(${snapFresh.snapshotMonth})`);
202
+ }
203
+
194
204
  // 6.6 owned 漂移校验(kit.owned 列表盘面 sha 不一致;engine 双源纪律对 owned 走「项目自持 + 哈希记账不约束」,
195
205
  // 漂移信号靠本校验给装户可见性。2026-09-25 wf-runtime 复盘:包源改了装副本未同步 = 漂移但 sync 不报。)
196
206
  const ownedRes = checkOwnedDrift(target);
@@ -218,7 +228,7 @@ export function doctor(args, pkgRoot) {
218
228
  if (adapterRes.skipped) {
219
229
  add('PASS', `跨宿主薄适配校验跳过(${adapterRes.note || '权威源目录不存在'})`);
220
230
  } else if (adapterRes.drift === 0) {
221
- add('PASS', `跨宿主薄适配 ${adapterRes.total} 对无正文漂移(装副本引擎 vs 4 宿主薄适配,B-b 语义)`);
231
+ add('PASS', `跨宿主薄适配 ${adapterRes.total} 对无正文漂移(装副本引擎 vs 注册表内宿主薄适配,B-b 语义)`);
222
232
  } else {
223
233
  add('WARN', `跨宿主薄适配正文漂移 ${adapterRes.drift} 对——权威源与薄适配正文段 sha 不一致;按 .agents/commands/sync-hosts.md 跑 flow-kit sync-hosts --apply 单向同步薄适配正文(frontmatter 不动);装户可在 bin/flow-kit.mjs sync 时一并修复`);
224
234
  }
@@ -397,3 +407,41 @@ export function checkAdapterDrift(target) {
397
407
  if (total === 0) return { drift: 0, total: 0, skipped: true, note: '权威源无 commands/roles .md 文件' };
398
408
  return { drift, total, skipped: false };
399
409
  }
410
+
411
+ // delegations 月度聚合快照新鲜度(独立 export 供 doctor 主流程 + 单元测试共用;2026-09-29 p0-gate-noise-batch)
412
+ // 返回:{ stale, ledgerMonth, snapshotMonth, skipped, note? }
413
+ // - skipped=true:delegations.md 不存在 / 无台账数据行 → doctor 记 PASS(跳过),不误报 fresh 装户
414
+ // - stale=true:快照行缺失 或 快照最新月 < 台账数据行最新月
415
+ // - ledgerMonth:台账数据行首列(YYYY-MM-DD)中最大 YYYY-MM
416
+ // - snapshotMonth:快照行首列(YYYY-MM)中最大 YYYY-MM(无快照行则 null)
417
+ export function checkDelegationSnapshotFreshness(target) {
418
+ const file = path.join(target, 'workflow', 'delegations.md');
419
+ if (!fs.existsSync(file)) return { stale: false, ledgerMonth: null, snapshotMonth: null, skipped: true, note: 'delegations.md 不存在' };
420
+ let text;
421
+ try { text = fs.readFileSync(file, 'utf8'); } catch { return { stale: false, ledgerMonth: null, snapshotMonth: null, skipped: true, note: 'delegations.md 不可读' }; }
422
+ const lines = text.split(/\r?\n/);
423
+ let ledgerMonth = null;
424
+ let snapshotMonth = null;
425
+ let hasDataRows = false;
426
+ for (const line of lines) {
427
+ if (!/^\s*\|/.test(line)) continue;
428
+ const cells = line.trim().replace(/^\|/, '').replace(/\|$/, '').split('|').map((c) => c.trim());
429
+ if (!cells.length) continue;
430
+ // 台账数据行:首列 = YYYY-MM-DD
431
+ if (/^\d{4}-\d{2}-\d{2}$/.test(cells[0])) {
432
+ hasDataRows = true;
433
+ const m = cells[0].slice(0, 7);
434
+ if (!ledgerMonth || m > ledgerMonth) ledgerMonth = m;
435
+ continue;
436
+ }
437
+ // 快照行:首列 = YYYY-MM(与数据行正则互斥)
438
+ if (/^\d{4}-\d{2}$/.test(cells[0])) {
439
+ const m = cells[0];
440
+ if (!snapshotMonth || m > snapshotMonth) snapshotMonth = m;
441
+ }
442
+ }
443
+ if (!hasDataRows) return { stale: false, ledgerMonth: null, snapshotMonth: null, skipped: true, note: '台账无数据行' };
444
+ if (!snapshotMonth) return { stale: true, ledgerMonth, snapshotMonth: null, skipped: false };
445
+ if (snapshotMonth < ledgerMonth) return { stale: true, ledgerMonth, snapshotMonth, skipped: false };
446
+ return { stale: false, ledgerMonth, snapshotMonth, skipped: false };
447
+ }
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+ // 空 git 仓库 fresh init --hosts claude:doctor 必须 exit 0,kit 写 audit:false,薄适配落盘。
3
+ import { spawnSync } from 'node:child_process';
4
+ import fs from 'node:fs';
5
+ import os from 'node:os';
6
+ import path from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+
9
+ const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
10
+ const git = process.platform === 'win32' ? 'git.exe' : 'git';
11
+ let pass = 0;
12
+ let fail = 0;
13
+ const check = (name, cond, detail = '') => {
14
+ if (cond) { pass++; console.log(`PASS ${name}`); }
15
+ else { fail++; console.log(`FAIL ${name}${detail ? `\n ${detail}` : ''}`); }
16
+ };
17
+
18
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'fk-fresh-'));
19
+ spawnSync(git, ['init', '-q'], { cwd: dir });
20
+ const r = spawnSync(process.execPath, [
21
+ path.join(ROOT, 'bin', 'flow-kit.mjs'), 'init',
22
+ '--stack', 'none', '--hosts', 'claude', '--board-port', '8941', '--dir', dir,
23
+ ], { encoding: 'utf8', timeout: 120000 });
24
+ const out = `${r.stdout || ''}${r.stderr || ''}`;
25
+ check('fresh init exit 0', r.status === 0, `exit=${r.status}\n${out.split('\n').slice(-30).join('\n')}`);
26
+ const kit = JSON.parse(fs.readFileSync(path.join(dir, '.agents', 'kit.json'), 'utf8'));
27
+ check('新装 audit 为 false 且 policyVersion 为 2', kit.audit === false && kit.policyVersion === 2, JSON.stringify({ audit: kit.audit, policyVersion: kit.policyVersion }));
28
+ check('claude 命令与角色薄适配落盘',
29
+ fs.existsSync(path.join(dir, '.claude', 'commands', 'wf-plan.md'))
30
+ && fs.existsSync(path.join(dir, '.claude', 'agents', 'implementer.md')));
31
+ const hooks = spawnSync(git, ['config', 'core.hooksPath'], { cwd: dir, encoding: 'utf8' });
32
+ check('钩子已挂到 .githooks', hooks.stdout.trim() === '.githooks', hooks.stdout);
33
+ fs.rmSync(dir, { recursive: true, force: true });
34
+
35
+ console.log(`\n合计: PASS ${pass} / FAIL ${fail}`);
36
+ process.exit(fail ? 1 : 0);