agentic-flow-kit 1.8.2 → 2.0.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 (936) hide show
  1. package/README.md +113 -148
  2. package/bin/flow-kit.mjs +5 -2
  3. package/locales/en/installer.json +25 -0
  4. package/locales/en/overrides/.agents/commands/deploy.md +52 -0
  5. package/locales/en/overrides/.agents/commands/maintain.md +76 -0
  6. package/locales/en/overrides/.agents/commands/new-task.md +89 -0
  7. package/locales/en/overrides/.agents/commands/pipeline-run.md +56 -0
  8. package/locales/en/overrides/.agents/commands/pr-review.md +30 -0
  9. package/locales/en/overrides/.agents/commands/review.md +93 -0
  10. package/locales/en/overrides/.agents/commands/stages.md +256 -0
  11. package/locales/en/overrides/.agents/notes/pr-review-cost-discipline.md +48 -0
  12. package/locales/en/overrides/.agents/notes/process-order-rule.md +21 -0
  13. package/locales/en/overrides/.agents/notes/runtime-env.local.example.md +21 -0
  14. package/locales/en/overrides/.agents/pipelines/_TEMPLATE.md +75 -0
  15. package/locales/en/overrides/.agents/pipelines/pipeline-closing.md +28 -0
  16. package/locales/en/overrides/.agents/roles/implementer.md +28 -0
  17. package/locales/en/overrides/.agents/roles/independent-reviewer.md +39 -0
  18. package/locales/en/overrides/.agents/roles/pr-adjudicator.md +27 -0
  19. package/locales/en/overrides/.agents/roles/pr-finder.md +51 -0
  20. package/locales/en/overrides/.agents/roles/pr-verifier.md +44 -0
  21. package/locales/en/overrides/.agents/roles/ui-verifier.md +22 -0
  22. package/locales/en/overrides/.agents/roles/wiki-compiler.md +47 -0
  23. package/locales/en/overrides/.agents/skills/arena/SKILL.md +50 -0
  24. package/locales/en/overrides/.agents/skills/autonomous-run/SKILL.md +45 -0
  25. package/locales/en/overrides/.agents/skills/blast-radius/SKILL.md +53 -0
  26. package/locales/en/overrides/.agents/skills/csharp-quality-gates/SKILL.md +109 -0
  27. package/locales/en/overrides/.agents/skills/dev-tour/SKILL.md +98 -0
  28. package/locales/en/overrides/.agents/skills/dream/SKILL.md +63 -0
  29. package/locales/en/overrides/.agents/skills/eval/SKILL.md +42 -0
  30. package/locales/en/overrides/.agents/skills/interrogate/SKILL.md +49 -0
  31. package/locales/en/overrides/.agents/skills/number-vetting/SKILL.md +35 -0
  32. package/locales/en/overrides/.agents/skills/page-refactor/SKILL.md +192 -0
  33. package/locales/en/overrides/.agents/skills/papercut-fix/SKILL.md +92 -0
  34. package/locales/en/overrides/.agents/skills/pause-safely/SKILL.md +31 -0
  35. package/locales/en/overrides/.agents/skills/perf/SKILL.md +42 -0
  36. package/locales/en/overrides/.agents/skills/review-method/SKILL.md +92 -0
  37. package/locales/en/overrides/.agents/skills/session-resume/SKILL.md +69 -0
  38. package/locales/en/overrides/.agents/skills/shipyard-workflow-closeout/SKILL.md +109 -0
  39. package/locales/en/overrides/.agents/skills/show-me-your-work/SKILL.md +57 -0
  40. package/locales/en/overrides/.agents/skills/tfs-pr/SKILL.md +95 -0
  41. package/locales/en/overrides/.agents/skills/verify-ui/SKILL.md +116 -0
  42. package/locales/en/overrides/.agents/skills/visual-parity/SKILL.md +35 -0
  43. package/locales/en/overrides/.agents/skills/why/SKILL.md +56 -0
  44. package/locales/en/overrides/.agents/skills/wiki/SKILL.md +53 -0
  45. package/locales/en/overrides/.claude/agents/implementer.md +9 -0
  46. package/locales/en/overrides/.claude/agents/independent-reviewer.md +10 -0
  47. package/locales/en/overrides/.claude/agents/pr-adjudicator.md +10 -0
  48. package/locales/en/overrides/.claude/agents/pr-finder.md +10 -0
  49. package/locales/en/overrides/.claude/agents/pr-verifier.md +10 -0
  50. package/locales/en/overrides/.claude/agents/ui-verifier.md +10 -0
  51. package/locales/en/overrides/.claude/agents/wiki-compiler.md +10 -0
  52. package/locales/en/overrides/.claude/commands/wf-deploy.md +8 -0
  53. package/locales/en/overrides/.claude/commands/wf-maintain.md +8 -0
  54. package/locales/en/overrides/.claude/commands/wf-new-task.md +8 -0
  55. package/locales/en/overrides/.claude/commands/wf-pipeline-run.md +8 -0
  56. package/locales/en/overrides/.claude/commands/wf-pr-review.md +8 -0
  57. package/locales/en/overrides/.claude/commands/wf-review.md +8 -0
  58. package/locales/en/overrides/.claude/commands/wf-stages.md +8 -0
  59. package/locales/en/overrides/.cline/agents/implementer.yml +13 -0
  60. package/locales/en/overrides/.cline/agents/independent-reviewer.yml +11 -0
  61. package/locales/en/overrides/.cline/agents/pr-adjudicator.yml +11 -0
  62. package/locales/en/overrides/.cline/agents/pr-finder.yml +11 -0
  63. package/locales/en/overrides/.cline/agents/pr-verifier.yml +11 -0
  64. package/locales/en/overrides/.cline/agents/ui-verifier.yml +8 -0
  65. package/locales/en/overrides/.cline/agents/wiki-compiler.yml +14 -0
  66. package/locales/en/overrides/.cline/workflows/wf-deploy.md +8 -0
  67. package/locales/en/overrides/.cline/workflows/wf-maintain.md +8 -0
  68. package/locales/en/overrides/.cline/workflows/wf-new-task.md +8 -0
  69. package/locales/en/overrides/.cline/workflows/wf-pipeline-run.md +8 -0
  70. package/locales/en/overrides/.cline/workflows/wf-pr-review.md +8 -0
  71. package/locales/en/overrides/.cline/workflows/wf-review.md +8 -0
  72. package/locales/en/overrides/.cline/workflows/wf-stages.md +8 -0
  73. package/locales/en/overrides/.codebuddy/CODEBUDDY.md +7 -0
  74. package/locales/en/overrides/.codebuddy/agents/implementer.md +9 -0
  75. package/locales/en/overrides/.codebuddy/agents/independent-reviewer.md +10 -0
  76. package/locales/en/overrides/.codebuddy/agents/pr-adjudicator.md +10 -0
  77. package/locales/en/overrides/.codebuddy/agents/pr-finder.md +10 -0
  78. package/locales/en/overrides/.codebuddy/agents/pr-verifier.md +10 -0
  79. package/locales/en/overrides/.codebuddy/agents/ui-verifier.md +11 -0
  80. package/locales/en/overrides/.codebuddy/agents/wiki-compiler.md +10 -0
  81. package/locales/en/overrides/.codebuddy/commands/wf-deploy.md +8 -0
  82. package/locales/en/overrides/.codebuddy/commands/wf-maintain.md +8 -0
  83. package/locales/en/overrides/.codebuddy/commands/wf-new-task.md +8 -0
  84. package/locales/en/overrides/.codebuddy/commands/wf-pipeline-run.md +8 -0
  85. package/locales/en/overrides/.codebuddy/commands/wf-pr-review.md +8 -0
  86. package/locales/en/overrides/.codebuddy/commands/wf-review.md +8 -0
  87. package/locales/en/overrides/.codebuddy/commands/wf-stages.md +8 -0
  88. package/locales/en/overrides/.codebuddy/rules/backend-scope.md +5 -0
  89. package/locales/en/overrides/.codebuddy/rules/frontend-scope.md +5 -0
  90. package/locales/en/overrides/.codebuddy/skills/tfs-pr/SKILL.md +6 -0
  91. package/locales/en/overrides/.commandcode/agents/implementer.md +10 -0
  92. package/locales/en/overrides/.commandcode/agents/independent-reviewer.md +9 -0
  93. package/locales/en/overrides/.commandcode/agents/pr-adjudicator.md +9 -0
  94. package/locales/en/overrides/.commandcode/agents/pr-finder.md +9 -0
  95. package/locales/en/overrides/.commandcode/agents/pr-verifier.md +9 -0
  96. package/locales/en/overrides/.commandcode/agents/ui-verifier.md +10 -0
  97. package/locales/en/overrides/.commandcode/agents/wiki-compiler.md +10 -0
  98. package/locales/en/overrides/.commandcode/commands/wf-deploy.md +7 -0
  99. package/locales/en/overrides/.commandcode/commands/wf-maintain.md +7 -0
  100. package/locales/en/overrides/.commandcode/commands/wf-new-task.md +7 -0
  101. package/locales/en/overrides/.commandcode/commands/wf-pipeline-run.md +7 -0
  102. package/locales/en/overrides/.commandcode/commands/wf-pr-review.md +7 -0
  103. package/locales/en/overrides/.commandcode/commands/wf-review.md +7 -0
  104. package/locales/en/overrides/.commandcode/commands/wf-stages.md +7 -0
  105. package/locales/en/overrides/.opencode/agents/implementer.md +51 -0
  106. package/locales/en/overrides/.opencode/agents/independent-reviewer.md +18 -0
  107. package/locales/en/overrides/.opencode/agents/pr-adjudicator.md +18 -0
  108. package/locales/en/overrides/.opencode/agents/pr-finder.md +18 -0
  109. package/locales/en/overrides/.opencode/agents/pr-verifier.md +18 -0
  110. package/locales/en/overrides/.opencode/agents/ui-verifier.md +45 -0
  111. package/locales/en/overrides/.opencode/agents/wiki-compiler.md +51 -0
  112. package/locales/en/overrides/.opencode/commands/wf-deploy.md +7 -0
  113. package/locales/en/overrides/.opencode/commands/wf-maintain.md +7 -0
  114. package/locales/en/overrides/.opencode/commands/wf-new-task.md +7 -0
  115. package/locales/en/overrides/.opencode/commands/wf-pipeline-run.md +7 -0
  116. package/locales/en/overrides/.opencode/commands/wf-pr-review.md +7 -0
  117. package/locales/en/overrides/.opencode/commands/wf-review.md +7 -0
  118. package/locales/en/overrides/.opencode/commands/wf-stages.md +7 -0
  119. package/locales/en/overrides/.pi/agents/implementer.md +11 -0
  120. package/locales/en/overrides/.pi/agents/independent-reviewer.md +12 -0
  121. package/locales/en/overrides/.pi/agents/pr-adjudicator.md +12 -0
  122. package/locales/en/overrides/.pi/agents/pr-finder.md +11 -0
  123. package/locales/en/overrides/.pi/agents/pr-verifier.md +11 -0
  124. package/locales/en/overrides/.pi/agents/ui-verifier.md +11 -0
  125. package/locales/en/overrides/.pi/agents/wiki-compiler.md +11 -0
  126. package/locales/en/overrides/.qoder/agents/implementer.md +9 -0
  127. package/locales/en/overrides/.qoder/agents/independent-reviewer.md +10 -0
  128. package/locales/en/overrides/.qoder/agents/pr-adjudicator.md +10 -0
  129. package/locales/en/overrides/.qoder/agents/pr-finder.md +10 -0
  130. package/locales/en/overrides/.qoder/agents/pr-verifier.md +10 -0
  131. package/locales/en/overrides/.qoder/agents/ui-verifier.md +10 -0
  132. package/locales/en/overrides/.qoder/agents/wiki-compiler.md +10 -0
  133. package/locales/en/overrides/.qoder/commands/wf-deploy.md +8 -0
  134. package/locales/en/overrides/.qoder/commands/wf-maintain.md +8 -0
  135. package/locales/en/overrides/.qoder/commands/wf-new-task.md +8 -0
  136. package/locales/en/overrides/.qoder/commands/wf-pipeline-run.md +8 -0
  137. package/locales/en/overrides/.qoder/commands/wf-pr-review.md +8 -0
  138. package/locales/en/overrides/.qoder/commands/wf-review.md +8 -0
  139. package/locales/en/overrides/.qoder/commands/wf-stages.md +8 -0
  140. package/locales/en/overrides/.qwen/agents/implementer.md +10 -0
  141. package/locales/en/overrides/.qwen/agents/independent-reviewer.md +10 -0
  142. package/locales/en/overrides/.qwen/agents/pr-adjudicator.md +10 -0
  143. package/locales/en/overrides/.qwen/agents/pr-finder.md +10 -0
  144. package/locales/en/overrides/.qwen/agents/pr-verifier.md +10 -0
  145. package/locales/en/overrides/.qwen/agents/ui-verifier.md +10 -0
  146. package/locales/en/overrides/.qwen/agents/wiki-compiler.md +13 -0
  147. package/locales/en/overrides/.qwen/commands/wf-deploy.md +7 -0
  148. package/locales/en/overrides/.qwen/commands/wf-maintain.md +7 -0
  149. package/locales/en/overrides/.qwen/commands/wf-new-task.md +7 -0
  150. package/locales/en/overrides/.qwen/commands/wf-pipeline-run.md +7 -0
  151. package/locales/en/overrides/.qwen/commands/wf-pr-review.md +7 -0
  152. package/locales/en/overrides/.qwen/commands/wf-review.md +7 -0
  153. package/locales/en/overrides/.qwen/commands/wf-stages.md +7 -0
  154. package/locales/en/overrides/.trae/agents/implementer.md +9 -0
  155. package/locales/en/overrides/.trae/agents/independent-reviewer.md +10 -0
  156. package/locales/en/overrides/.trae/agents/pr-adjudicator.md +10 -0
  157. package/locales/en/overrides/.trae/agents/pr-finder.md +10 -0
  158. package/locales/en/overrides/.trae/agents/pr-verifier.md +10 -0
  159. package/locales/en/overrides/.trae/agents/ui-verifier.md +10 -0
  160. package/locales/en/overrides/.trae/agents/wiki-compiler.md +10 -0
  161. package/locales/en/overrides/.trae/commands/wf-deploy.md +8 -0
  162. package/locales/en/overrides/.trae/commands/wf-maintain.md +8 -0
  163. package/locales/en/overrides/.trae/commands/wf-new-task.md +8 -0
  164. package/locales/en/overrides/.trae/commands/wf-pipeline-run.md +8 -0
  165. package/locales/en/overrides/.trae/commands/wf-pr-review.md +8 -0
  166. package/locales/en/overrides/.trae/commands/wf-review.md +8 -0
  167. package/locales/en/overrides/.trae/commands/wf-stages.md +8 -0
  168. package/locales/en/overrides/.trae/rules/backend-scope.md +5 -0
  169. package/locales/en/overrides/.trae/rules/frontend-scope.md +5 -0
  170. package/locales/en/overrides/.zcode/agents/implementer.md +8 -0
  171. package/locales/en/overrides/.zcode/agents/independent-reviewer.md +8 -0
  172. package/locales/en/overrides/.zcode/agents/ui-verifier.md +8 -0
  173. package/locales/en/overrides/.zcode/agents/wiki-compiler.md +8 -0
  174. package/locales/en/overrides/AGENTS.md +52 -0
  175. package/locales/en/overrides/CLAUDE.md +20 -0
  176. package/locales/en/overrides/wiki/INDEX.md +33 -0
  177. package/locales/en/overrides/wiki/drafts-archive/README.md +6 -0
  178. package/locales/en/overrides/wiki//346/225/260/346/215/256/347/273/264/346/212/244/README.md +22 -0
  179. package/locales/en/overrides/wiki//347/237/245/350/257/206/346/262/211/346/267/200/346/200/273/350/247/210.html +230 -0
  180. package/locales/en/overrides/workflow/INDEX.md +13 -0
  181. package/locales/en/overrides/workflow/README.md +67 -0
  182. package/locales/en/overrides/workflow/archive/README.md +3 -0
  183. package/locales/en/overrides/workflow/delegations.md +4 -0
  184. package/locales/en/overrides/workflow/effective-policy.md +4 -0
  185. package/locales/en/overrides/workflow/gate-cost.md +4 -0
  186. package/locales/en/overrides/workflow/incidents/_TEMPLATE.md +49 -0
  187. package/locales/en/overrides/workflow/intents/_TEMPLATE.md +43 -0
  188. package/locales/en/overrides/workflow/metrics.md +4 -0
  189. package/locales/en/overrides/workflow/papercuts.md +3 -0
  190. package/locales/en/overrides/workflow/plans/_TEMPLATE.md +47 -0
  191. package/locales/en/overrides/workflow/regression-checklist.md +3 -0
  192. package/locales/en/overrides/workflow/specs/_TEMPLATE.md +86 -0
  193. package/locales/en/overrides/workflow/verify-evidence.md +4 -0
  194. package/locales/zh-CN/installer.json +25 -0
  195. package/package.json +23 -36
  196. package/schemas/install-manifest.schema.json +24 -0
  197. package/schemas/project-profile.schema.json +28 -0
  198. package/src/cli/args.mjs +41 -0
  199. package/src/cli/main.mjs +72 -0
  200. package/src/commands/add-host.mjs +29 -0
  201. package/src/commands/doctor.mjs +80 -0
  202. package/src/commands/install.mjs +149 -0
  203. package/src/commands/upgrade.mjs +30 -0
  204. package/src/git/config.mjs +61 -0
  205. package/src/hosts/registry.mjs +26 -0
  206. package/src/i18n.mjs +32 -0
  207. package/src/install/apply.mjs +124 -0
  208. package/src/install/manifest.mjs +40 -0
  209. package/src/install/plan.mjs +83 -0
  210. package/src/render/tokens.mjs +58 -0
  211. package/templates/engine/.agents/board/dev-tour.html +1940 -0
  212. package/templates/engine/.agents/board/index.html +835 -0
  213. package/templates/engine/.agents/commands/deploy.md +52 -0
  214. package/templates/engine/.agents/commands/maintain.md +76 -0
  215. package/templates/engine/.agents/commands/new-task.md +89 -0
  216. package/templates/engine/.agents/commands/pipeline-run.md +56 -0
  217. package/templates/engine/.agents/commands/pr-review.md +30 -0
  218. package/templates/engine/.agents/commands/review.md +93 -0
  219. package/templates/engine/.agents/commands/stages.md +256 -0
  220. package/templates/engine/.agents/config/commit-msg-rules.json +7 -0
  221. package/templates/engine/.agents/config/engine.json +11 -0
  222. package/templates/engine/.agents/config/gate-budgets.json +5 -0
  223. package/templates/engine/.agents/config/mechanism-registry.md +62 -0
  224. package/templates/engine/.agents/config/model-roles.json +26 -0
  225. package/templates/engine/.agents/config/model-roles.local.example.json +7 -0
  226. package/templates/engine/.agents/config/pr-review.json +67 -0
  227. package/templates/engine/.agents/config/principles.md +32 -0
  228. package/templates/engine/.agents/config/workflow-enums.txt +25 -0
  229. package/templates/engine/.agents/hooks/check-architecture.mjs +168 -0
  230. package/templates/engine/.agents/hooks/check-audit-fields.mjs +56 -0
  231. package/templates/engine/.agents/hooks/check-commit-plan-ref.mjs +84 -0
  232. package/templates/engine/.agents/hooks/check-confirm-order.mjs +281 -0
  233. package/templates/engine/.agents/hooks/check-delete-guard.mjs +63 -0
  234. package/templates/engine/.agents/hooks/check-notify-guard.mjs +55 -0
  235. package/templates/engine/.agents/hooks/commit-check.cjs +208 -0
  236. package/templates/engine/.agents/hooks/gates.json +33 -0
  237. package/templates/engine/.agents/hooks/local-pre-commit.mjs +27 -0
  238. package/templates/engine/.agents/hooks/pre-shell-check.cjs +361 -0
  239. package/templates/engine/.agents/hooks/pre-write-check.cjs +220 -0
  240. package/templates/engine/.agents/notes/gate-diet.md +75 -0
  241. package/templates/engine/.agents/notes/pr-review-cost-discipline.md +48 -0
  242. package/templates/engine/.agents/notes/process-order-rule.md +21 -0
  243. package/templates/engine/.agents/notes/runtime-env.local.example.md +21 -0
  244. package/templates/engine/.agents/pipelines/_TEMPLATE.md +75 -0
  245. package/templates/engine/.agents/pipelines/pipeline-closing.md +28 -0
  246. package/templates/engine/.agents/pipelines//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
  247. package/templates/engine/.agents/roles/implementer.md +28 -0
  248. package/templates/engine/.agents/roles/independent-reviewer.md +39 -0
  249. package/templates/engine/.agents/roles/pr-adjudicator.md +27 -0
  250. package/templates/engine/.agents/roles/pr-finder.md +51 -0
  251. package/templates/engine/.agents/roles/pr-verifier.md +44 -0
  252. package/templates/engine/.agents/roles/ui-verifier.md +22 -0
  253. package/templates/engine/.agents/roles/wiki-compiler.md +47 -0
  254. package/templates/engine/.agents/scripts/agg-delegations.mjs +439 -0
  255. package/templates/engine/.agents/scripts/agg-judgments.mjs +301 -0
  256. package/templates/engine/.agents/scripts/agg-kb-usage.mjs +196 -0
  257. package/templates/engine/.agents/scripts/append-compensation.mjs +109 -0
  258. package/templates/engine/.agents/scripts/archive-sweep.mjs +229 -0
  259. package/templates/engine/.agents/scripts/auto-tour.mjs +77 -0
  260. package/templates/engine/.agents/scripts/board-port.mjs +17 -0
  261. package/templates/engine/.agents/scripts/check-doc-body-drift.mjs +102 -0
  262. package/templates/engine/.agents/scripts/check-engine-artifacts.mjs +54 -0
  263. package/templates/engine/.agents/scripts/check-hook-wiring.mjs +75 -0
  264. package/templates/engine/.agents/scripts/check-lane-surface.mjs +393 -0
  265. package/templates/engine/.agents/scripts/check-ledger-doc-presence.mjs +71 -0
  266. package/templates/engine/.agents/scripts/check-ledger-invariant.mjs +873 -0
  267. package/templates/engine/.agents/scripts/check-local-gate-config.mjs +95 -0
  268. package/templates/engine/.agents/scripts/check-local-gates.mjs +248 -0
  269. package/templates/engine/.agents/scripts/check-loop-kit.mjs +550 -0
  270. package/templates/engine/.agents/scripts/check-loop-rev-semantics.mjs +59 -0
  271. package/templates/engine/.agents/scripts/check-loop-sections/s01-pairing.mjs +116 -0
  272. package/templates/engine/.agents/scripts/check-loop-sections/s03x-regr-evidence.mjs +38 -0
  273. package/templates/engine/.agents/scripts/check-loop-sections/s08-acceptance.mjs +130 -0
  274. package/templates/engine/.agents/scripts/check-loop-sections/s15-fingerprint.mjs +152 -0
  275. package/templates/engine/.agents/scripts/check-loop-sections/s23-convergence-audit.mjs +182 -0
  276. package/templates/engine/.agents/scripts/check-loop-sections/s29-regr-enforcer.mjs +69 -0
  277. package/templates/engine/.agents/scripts/check-loop.mjs +131 -0
  278. package/templates/engine/.agents/scripts/check-regression-consistency.mjs +252 -0
  279. package/templates/engine/.agents/scripts/check-schema-residue.mjs +144 -0
  280. package/templates/engine/.agents/scripts/check-scope-range.mjs +156 -0
  281. package/templates/engine/.agents/scripts/check-scope.mjs +121 -0
  282. package/templates/engine/.agents/scripts/check-scripts-syntax.mjs +138 -0
  283. package/templates/engine/.agents/scripts/check-secrets-lite.mjs +239 -0
  284. package/templates/engine/.agents/scripts/check-secrets.mjs +104 -0
  285. package/templates/engine/.agents/scripts/check-test-impact-map.mjs +107 -0
  286. package/templates/engine/.agents/scripts/ci-assert-frontend-deps.mjs +42 -0
  287. package/templates/engine/.agents/scripts/ci-commit-hygiene.mjs +86 -0
  288. package/templates/engine/.agents/scripts/ci-install-gitleaks.mjs +75 -0
  289. package/templates/engine/.agents/scripts/ci-push-before.mjs +49 -0
  290. package/templates/engine/.agents/scripts/closeout.mjs +127 -0
  291. package/templates/engine/.agents/scripts/compact-ledgers.mjs +70 -0
  292. package/templates/engine/.agents/scripts/confirm-doc.mjs +737 -0
  293. package/templates/engine/.agents/scripts/delegation-presence.mjs +38 -0
  294. package/templates/engine/.agents/scripts/dev-tour-model.mjs +1398 -0
  295. package/templates/engine/.agents/scripts/dream-run.mjs +283 -0
  296. package/templates/engine/.agents/scripts/ensure-board.mjs +187 -0
  297. package/templates/engine/.agents/scripts/failure-attribution.mjs +11 -0
  298. package/templates/engine/.agents/scripts/fill-intent.mjs +60 -0
  299. package/templates/engine/.agents/scripts/fill-plan.mjs +105 -0
  300. package/templates/engine/.agents/scripts/fill-spec.mjs +72 -0
  301. package/templates/engine/.agents/scripts/gen-dev-tour.mjs +191 -0
  302. package/templates/engine/.agents/scripts/gen-effective-policy.mjs +113 -0
  303. package/templates/engine/.agents/scripts/gen-engine-map.mjs +292 -0
  304. package/templates/engine/.agents/scripts/gen-narrative-claims.mjs +275 -0
  305. package/templates/engine/.agents/scripts/gen-verify-evidence.mjs +115 -0
  306. package/templates/engine/.agents/scripts/gen-wiki-board.mjs +221 -0
  307. package/templates/engine/.agents/scripts/gen-workflow-index.mjs +201 -0
  308. package/templates/engine/.agents/scripts/gen-workflow-metrics.mjs +692 -0
  309. package/templates/engine/.agents/scripts/git-merge-jsonl.mjs +62 -0
  310. package/templates/engine/.agents/scripts/judgment-ledger.mjs +68 -0
  311. package/templates/engine/.agents/scripts/kb-cache-evict.mjs +50 -0
  312. package/templates/engine/.agents/scripts/kb-search.mjs +423 -0
  313. package/templates/engine/.agents/scripts/lane-surface-audit.mjs +145 -0
  314. package/templates/engine/.agents/scripts/ledger-loader.mjs +77 -0
  315. package/templates/engine/.agents/scripts/ledger-shards.mjs +346 -0
  316. package/templates/engine/.agents/scripts/metrics-core.mjs +131 -0
  317. package/templates/engine/.agents/scripts/pipeline-run.mjs +964 -0
  318. package/templates/engine/.agents/scripts/policy.mjs +250 -0
  319. package/templates/engine/.agents/scripts/pr-create.mjs +54 -0
  320. package/templates/engine/.agents/scripts/pr-review.mjs +1551 -0
  321. package/templates/engine/.agents/scripts/quote-grounding.mjs +233 -0
  322. package/templates/engine/.agents/scripts/regen-ledgers.mjs +59 -0
  323. package/templates/engine/.agents/scripts/rewrite-file.mjs +135 -0
  324. package/templates/engine/.agents/scripts/rule-budget.mjs +246 -0
  325. package/templates/engine/.agents/scripts/stage-gates.mjs +812 -0
  326. package/templates/engine/.agents/scripts/test-impact-lib.mjs +451 -0
  327. package/templates/engine/.agents/scripts/test-impact.mjs +105 -0
  328. package/templates/engine/.agents/scripts/trust-mode.mjs +130 -0
  329. package/templates/engine/.agents/scripts/verify-scope.mjs +163 -0
  330. package/templates/engine/.agents/scripts/verify-wiki-consistency.mjs +264 -0
  331. package/templates/engine/.agents/scripts/verify.mjs +847 -0
  332. package/templates/engine/.agents/scripts/warn-format.mjs +57 -0
  333. package/templates/engine/.agents/scripts/wf-journal.mjs +230 -0
  334. package/templates/engine/.agents/scripts/workflow-board-server.mjs +696 -0
  335. package/templates/engine/.agents/scripts/workflow-enums.mjs +70 -0
  336. package/templates/engine/.agents/scripts/workflows-check.mjs +260 -0
  337. package/templates/engine/.agents/settings.json +33 -0
  338. package/templates/engine/.agents/skills/arena/SKILL.md +50 -0
  339. package/templates/engine/.agents/skills/autonomous-run/SKILL.md +45 -0
  340. package/templates/engine/.agents/skills/blast-radius/SKILL.md +53 -0
  341. package/templates/engine/.agents/skills/csharp-quality-gates/SKILL.md +109 -0
  342. package/templates/engine/.agents/skills/csharp-quality-gates/scripts/quality-gates.mjs +430 -0
  343. package/templates/engine/.agents/skills/dev-tour/SKILL.md +98 -0
  344. package/templates/engine/.agents/skills/dream/SKILL.md +63 -0
  345. package/templates/engine/.agents/skills/eval/SKILL.md +42 -0
  346. package/templates/engine/.agents/skills/eval/scripts/eval-score.mjs +59 -0
  347. package/templates/engine/.agents/skills/interrogate/SKILL.md +49 -0
  348. package/templates/engine/.agents/skills/interrogate/scripts/interrogate-plan.mjs +72 -0
  349. package/templates/engine/.agents/skills/number-vetting/SKILL.md +35 -0
  350. package/templates/engine/.agents/skills/page-refactor/SKILL.md +192 -0
  351. package/templates/engine/.agents/skills/page-refactor/references/templates.md +989 -0
  352. package/templates/engine/.agents/skills/papercut-fix/SKILL.md +92 -0
  353. package/templates/engine/.agents/skills/papercut-fix/references/response-template.md +81 -0
  354. package/templates/engine/.agents/skills/pause-safely/SKILL.md +31 -0
  355. package/templates/engine/.agents/skills/perf/SKILL.md +42 -0
  356. package/templates/engine/.agents/skills/review-method/SKILL.md +92 -0
  357. package/templates/engine/.agents/skills/review-method/golden-set.md +61 -0
  358. package/templates/engine/.agents/skills/session-resume/SKILL.md +69 -0
  359. package/templates/engine/.agents/skills/session-resume/scripts/worktree-audit.mjs +110 -0
  360. package/templates/engine/.agents/skills/shipyard-workflow-closeout/SKILL.md +109 -0
  361. package/templates/engine/.agents/skills/show-me-your-work/SKILL.md +57 -0
  362. package/templates/engine/.agents/skills/show-me-your-work/references/decision-log-template.tsv +1 -0
  363. package/templates/engine/.agents/skills/show-me-your-work/scripts/decision-log.mjs +24 -0
  364. package/templates/engine/.agents/skills/tfs-pr/SKILL.md +95 -0
  365. package/templates/engine/.agents/skills/tfs-pr/scripts/tfs-pr.mjs +947 -0
  366. package/templates/engine/.agents/skills/verify-ui/SKILL.md +116 -0
  367. package/templates/engine/.agents/skills/verify-ui/features/.gitkeep +0 -0
  368. package/templates/engine/.agents/skills/verify-ui/scripts/gen-verify-feature.mjs +114 -0
  369. package/templates/engine/.agents/skills/visual-parity/SKILL.md +35 -0
  370. package/templates/engine/.agents/skills/why/SKILL.md +56 -0
  371. package/templates/engine/.agents/skills/why/scripts/why-evidence.mjs +74 -0
  372. package/templates/engine/.agents/skills/wiki/SKILL.md +53 -0
  373. package/templates/engine/.agents/tests/auto-tour.test.mjs +82 -0
  374. package/templates/engine/.agents/tests/dev-tour-model.test.mjs +452 -0
  375. package/templates/engine/.agents/tests/fill-plan-lite.test.mjs +46 -0
  376. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-bare-mid-path.md +14 -0
  377. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-bare-mid-path.model.json +179 -0
  378. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-fake-path-guard.md +21 -0
  379. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-fake-path-guard.model.json +194 -0
  380. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-h3-batches.md +20 -0
  381. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-h3-batches.model.json +207 -0
  382. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-issues.md +24 -0
  383. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-issues.model.json +225 -0
  384. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-l1-single-file.md +15 -0
  385. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-l1-single-file.model.json +160 -0
  386. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-layer-word-unique.md +29 -0
  387. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-layer-word-unique.model.json +266 -0
  388. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-layers-fallback.md +17 -0
  389. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-layers-fallback.model.json +207 -0
  390. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-numbered-steps.md +39 -0
  391. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-numbered-steps.model.json +359 -0
  392. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-path-guess.md +16 -0
  393. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-path-guess.model.json +131 -0
  394. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-table-rows.md +29 -0
  395. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-table-rows.model.json +190 -0
  396. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-task-checkboxes.md +39 -0
  397. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-task-checkboxes.model.json +362 -0
  398. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-union-label.md +24 -0
  399. package/templates/engine/.agents/tests/fixtures/dev-tour/plan-union-label.model.json +224 -0
  400. package/templates/engine/.agents/tests/tools/gen-synthetic-plan.mjs +108 -0
  401. package/templates/git/.gitattributes +22 -0
  402. package/templates/git/.githooks/commit-msg +72 -0
  403. package/templates/git/.githooks/post-commit +62 -0
  404. package/templates/git/.githooks/pre-commit +197 -0
  405. package/templates/git/.githooks/pre-merge-commit +28 -0
  406. package/templates/git/.githooks/pre-push +201 -0
  407. package/templates/git/.gitignore.engine +11 -0
  408. package/templates/hosts/claude/CLAUDE.md +55 -0
  409. package/templates/hosts/claude/agents/implementer.md +7 -0
  410. package/templates/hosts/claude/agents/independent-reviewer.md +8 -0
  411. package/templates/hosts/claude/agents/pr-adjudicator.md +8 -0
  412. package/templates/hosts/claude/agents/pr-finder.md +8 -0
  413. package/templates/hosts/claude/agents/pr-verifier.md +8 -0
  414. package/templates/hosts/claude/agents/ui-verifier.md +8 -0
  415. package/templates/hosts/claude/agents/wiki-compiler.md +8 -0
  416. package/templates/hosts/claude/commands/wf-deploy.md +10 -0
  417. package/templates/hosts/claude/commands/wf-maintain.md +10 -0
  418. package/templates/hosts/claude/commands/wf-new-task.md +10 -0
  419. package/templates/hosts/claude/commands/wf-pipeline-run.md +10 -0
  420. package/templates/hosts/claude/commands/wf-pr-review.md +10 -0
  421. package/templates/hosts/claude/commands/wf-review.md +10 -0
  422. package/templates/hosts/claude/commands/wf-stages.md +10 -0
  423. package/templates/hosts/claude/settings.json +57 -0
  424. package/templates/hosts/cline/agents/implementer.yml +15 -0
  425. package/templates/hosts/cline/agents/independent-reviewer.yml +20 -0
  426. package/templates/hosts/cline/agents/pr-adjudicator.yml +18 -0
  427. package/templates/hosts/cline/agents/pr-finder.yml +19 -0
  428. package/templates/hosts/cline/agents/pr-verifier.yml +18 -0
  429. package/templates/hosts/cline/agents/ui-verifier.yml +17 -0
  430. package/templates/hosts/cline/agents/wiki-compiler.yml +20 -0
  431. package/templates/hosts/cline/hooks/PreToolUse.cjs +260 -0
  432. package/templates/hosts/cline/workflows/wf-deploy.md +8 -0
  433. package/templates/hosts/cline/workflows/wf-maintain.md +8 -0
  434. package/templates/hosts/cline/workflows/wf-new-task.md +8 -0
  435. package/templates/hosts/cline/workflows/wf-pipeline-run.md +8 -0
  436. package/templates/hosts/cline/workflows/wf-pr-review.md +8 -0
  437. package/templates/hosts/cline/workflows/wf-review.md +8 -0
  438. package/templates/hosts/cline/workflows/wf-stages.md +8 -0
  439. package/templates/hosts/codebuddy/CODEBUDDY.md +7 -0
  440. package/templates/hosts/codebuddy/agents/implementer.md +9 -0
  441. package/templates/hosts/codebuddy/agents/independent-reviewer.md +10 -0
  442. package/templates/hosts/codebuddy/agents/pr-adjudicator.md +10 -0
  443. package/templates/hosts/codebuddy/agents/pr-finder.md +10 -0
  444. package/templates/hosts/codebuddy/agents/pr-verifier.md +10 -0
  445. package/templates/hosts/codebuddy/agents/ui-verifier.md +11 -0
  446. package/templates/hosts/codebuddy/agents/wiki-compiler.md +10 -0
  447. package/templates/hosts/codebuddy/commands/wf-deploy.md +10 -0
  448. package/templates/hosts/codebuddy/commands/wf-maintain.md +10 -0
  449. package/templates/hosts/codebuddy/commands/wf-new-task.md +10 -0
  450. package/templates/hosts/codebuddy/commands/wf-pipeline-run.md +10 -0
  451. package/templates/hosts/codebuddy/commands/wf-pr-review.md +10 -0
  452. package/templates/hosts/codebuddy/commands/wf-review.md +10 -0
  453. package/templates/hosts/codebuddy/commands/wf-stages.md +10 -0
  454. package/templates/hosts/codebuddy/rules/backend-scope.md +5 -0
  455. package/templates/hosts/codebuddy/rules/frontend-scope.md +5 -0
  456. package/templates/hosts/codebuddy/settings.json +31 -0
  457. package/templates/hosts/codebuddy/skills/tfs-pr/SKILL.md +6 -0
  458. package/templates/hosts/commandcode/agents/implementer.md +10 -0
  459. package/templates/hosts/commandcode/agents/independent-reviewer.md +9 -0
  460. package/templates/hosts/commandcode/agents/pr-adjudicator.md +9 -0
  461. package/templates/hosts/commandcode/agents/pr-finder.md +9 -0
  462. package/templates/hosts/commandcode/agents/pr-verifier.md +9 -0
  463. package/templates/hosts/commandcode/agents/ui-verifier.md +11 -0
  464. package/templates/hosts/commandcode/agents/wiki-compiler.md +10 -0
  465. package/templates/hosts/commandcode/commands/wf-deploy.md +9 -0
  466. package/templates/hosts/commandcode/commands/wf-maintain.md +9 -0
  467. package/templates/hosts/commandcode/commands/wf-new-task.md +9 -0
  468. package/templates/hosts/commandcode/commands/wf-pipeline-run.md +9 -0
  469. package/templates/hosts/commandcode/commands/wf-pr-review.md +9 -0
  470. package/templates/hosts/commandcode/commands/wf-review.md +9 -0
  471. package/templates/hosts/commandcode/commands/wf-stages.md +9 -0
  472. package/templates/hosts/commandcode/settings.json +59 -0
  473. package/templates/hosts/opencode/agents/implementer.md +51 -0
  474. package/templates/hosts/opencode/agents/independent-reviewer.md +18 -0
  475. package/templates/hosts/opencode/agents/pr-adjudicator.md +18 -0
  476. package/templates/hosts/opencode/agents/pr-finder.md +18 -0
  477. package/templates/hosts/opencode/agents/pr-verifier.md +18 -0
  478. package/templates/hosts/opencode/agents/ui-verifier.md +45 -0
  479. package/templates/hosts/opencode/agents/wiki-compiler.md +51 -0
  480. package/templates/hosts/opencode/commands/wf-deploy.md +7 -0
  481. package/templates/hosts/opencode/commands/wf-maintain.md +7 -0
  482. package/templates/hosts/opencode/commands/wf-new-task.md +7 -0
  483. package/templates/hosts/opencode/commands/wf-pipeline-run.md +7 -0
  484. package/templates/hosts/opencode/commands/wf-pr-review.md +7 -0
  485. package/templates/hosts/opencode/commands/wf-review.md +7 -0
  486. package/templates/hosts/opencode/commands/wf-stages.md +7 -0
  487. package/templates/hosts/pi/agents/implementer.md +10 -0
  488. package/templates/hosts/pi/agents/independent-reviewer.md +11 -0
  489. package/templates/hosts/pi/agents/pr-adjudicator.md +11 -0
  490. package/templates/hosts/pi/agents/pr-finder.md +10 -0
  491. package/templates/hosts/pi/agents/pr-verifier.md +10 -0
  492. package/templates/hosts/pi/agents/ui-verifier.md +10 -0
  493. package/templates/hosts/pi/agents/wiki-compiler.md +10 -0
  494. package/templates/hosts/pi/extensions/lib/gates-core.cjs +196 -0
  495. package/templates/hosts/pi/extensions/shipyard-gates.ts +95 -0
  496. package/templates/hosts/pi/settings.json +5 -0
  497. package/templates/hosts/qoder/agents/implementer.md +9 -0
  498. package/templates/hosts/qoder/agents/independent-reviewer.md +10 -0
  499. package/templates/hosts/qoder/agents/pr-adjudicator.md +10 -0
  500. package/templates/hosts/qoder/agents/pr-finder.md +10 -0
  501. package/templates/hosts/qoder/agents/pr-verifier.md +10 -0
  502. package/templates/hosts/qoder/agents/ui-verifier.md +10 -0
  503. package/templates/hosts/qoder/agents/wiki-compiler.md +10 -0
  504. package/templates/hosts/qoder/commands/wf-deploy.md +8 -0
  505. package/templates/hosts/qoder/commands/wf-maintain.md +8 -0
  506. package/templates/hosts/qoder/commands/wf-new-task.md +8 -0
  507. package/templates/hosts/qoder/commands/wf-pipeline-run.md +8 -0
  508. package/templates/hosts/qoder/commands/wf-pr-review.md +8 -0
  509. package/templates/hosts/qoder/commands/wf-review.md +8 -0
  510. package/templates/hosts/qoder/commands/wf-stages.md +8 -0
  511. package/templates/hosts/qoder/settings.json +63 -0
  512. package/templates/hosts/qwen/agents/implementer.md +8 -0
  513. package/templates/hosts/qwen/agents/independent-reviewer.md +8 -0
  514. package/templates/hosts/qwen/agents/pr-adjudicator.md +8 -0
  515. package/templates/hosts/qwen/agents/pr-finder.md +8 -0
  516. package/templates/hosts/qwen/agents/pr-verifier.md +8 -0
  517. package/templates/hosts/qwen/agents/ui-verifier.md +8 -0
  518. package/templates/hosts/qwen/agents/wiki-compiler.md +11 -0
  519. package/templates/hosts/qwen/commands/wf-deploy.md +9 -0
  520. package/templates/hosts/qwen/commands/wf-maintain.md +9 -0
  521. package/templates/hosts/qwen/commands/wf-new-task.md +9 -0
  522. package/templates/hosts/qwen/commands/wf-pipeline-run.md +9 -0
  523. package/templates/hosts/qwen/commands/wf-pr-review.md +9 -0
  524. package/templates/hosts/qwen/commands/wf-review.md +9 -0
  525. package/templates/hosts/qwen/commands/wf-stages.md +9 -0
  526. package/templates/hosts/qwen/settings.json +59 -0
  527. package/templates/hosts/trae/agents/implementer.md +9 -0
  528. package/templates/hosts/trae/agents/independent-reviewer.md +10 -0
  529. package/templates/hosts/trae/agents/pr-adjudicator.md +10 -0
  530. package/templates/hosts/trae/agents/pr-finder.md +10 -0
  531. package/templates/hosts/trae/agents/pr-verifier.md +10 -0
  532. package/templates/hosts/trae/agents/ui-verifier.md +10 -0
  533. package/templates/hosts/trae/agents/wiki-compiler.md +10 -0
  534. package/templates/hosts/trae/commands/wf-deploy.md +8 -0
  535. package/templates/hosts/trae/commands/wf-maintain.md +8 -0
  536. package/templates/hosts/trae/commands/wf-new-task.md +8 -0
  537. package/templates/hosts/trae/commands/wf-pipeline-run.md +8 -0
  538. package/templates/hosts/trae/commands/wf-pr-review.md +8 -0
  539. package/templates/hosts/trae/commands/wf-review.md +8 -0
  540. package/templates/hosts/trae/commands/wf-stages.md +8 -0
  541. package/templates/hosts/trae/hooks.json +17 -0
  542. package/templates/hosts/trae/rules/backend-scope.md +5 -0
  543. package/templates/hosts/trae/rules/frontend-scope.md +5 -0
  544. package/templates/hosts/zcode/agents/implementer.md +8 -0
  545. package/templates/hosts/zcode/agents/independent-reviewer.md +8 -0
  546. package/templates/hosts/zcode/agents/ui-verifier.md +8 -0
  547. package/templates/hosts/zcode/agents/wiki-compiler.md +8 -0
  548. package/templates/hosts/zcode/config.json +31 -0
  549. package/templates/hosts/zcode/workflows/code-review.dwf.ts +428 -0
  550. package/templates/hosts/zcode/workflows/fullchain-flow-test.dwf.ts +898 -0
  551. package/templates/profiles/dotnet/.agents/config/lane-surfaces.txt +33 -0
  552. package/templates/profiles/dotnet/.agents/config/rule-budgets.txt +84 -0
  553. package/templates/profiles/dotnet/.agents/config/test-impact-map.json +590 -0
  554. package/templates/profiles/dotnet/.agents/config/workflow-modules.txt +18 -0
  555. package/templates/profiles/dotnet/.agents/hooks/commit-check.config.json +18 -0
  556. package/templates/profiles/dotnet/.agents/hooks/delete-guard-allowlist.txt +28 -0
  557. package/templates/profiles/dotnet/.agents/notes/runtime-env.md +178 -0
  558. package/templates/profiles/dotnet/AGENTS.md +52 -0
  559. package/templates/profiles/empty/.agents/config/lane-surfaces.txt +12 -0
  560. package/templates/profiles/empty/.agents/config/rule-budgets.txt +3 -0
  561. package/templates/profiles/empty/.agents/config/test-impact-map.json +8 -0
  562. package/templates/profiles/empty/.agents/config/workflow-modules.txt +2 -0
  563. package/templates/profiles/empty/.agents/hooks/commit-check.config.json +5 -0
  564. package/templates/profiles/empty/.agents/hooks/delete-guard-allowlist.txt +2 -0
  565. package/templates/profiles/empty/.agents/notes/runtime-env.md +44 -0
  566. package/templates/profiles/empty/AGENTS.md +52 -0
  567. package/templates/profiles/node/.agents/config/lane-surfaces.txt +12 -0
  568. package/templates/profiles/node/.agents/config/rule-budgets.txt +3 -0
  569. package/templates/profiles/node/.agents/config/test-impact-map.json +8 -0
  570. package/templates/profiles/node/.agents/config/workflow-modules.txt +2 -0
  571. package/templates/profiles/node/.agents/hooks/commit-check.config.json +5 -0
  572. package/templates/profiles/node/.agents/hooks/delete-guard-allowlist.txt +2 -0
  573. package/templates/profiles/node/.agents/notes/runtime-env.md +44 -0
  574. package/templates/profiles/node/AGENTS.md +52 -0
  575. package/templates/scaffold/wiki/INDEX.md +33 -0
  576. package/templates/scaffold/wiki/drafts-archive/README.md +7 -0
  577. package/templates/scaffold/wiki//344/272/247/345/223/201/351/234/200/346/261/202/.gitkeep +0 -0
  578. package/templates/scaffold/wiki//345/274/200/345/217/221/346/226/271/346/241/210/.gitkeep +0 -0
  579. package/templates/scaffold/wiki//346/225/260/346/215/256/347/273/264/346/212/244/README.md +22 -0
  580. package/templates/scaffold/wiki//346/265/213/350/257/225/346/212/245/345/221/212/.gitkeep +0 -0
  581. package/templates/scaffold/wiki//347/224/250/346/210/267/345/212/237/350/203/275/.gitkeep +0 -0
  582. package/templates/scaffold/wiki//347/237/245/350/257/206/346/262/211/346/267/200/346/200/273/350/247/210.html +230 -0
  583. package/templates/scaffold/wiki//351/241/271/347/233/256/350/247/204/350/214/203/.gitkeep +0 -0
  584. package/templates/scaffold/workflow/INDEX.md +13 -0
  585. package/templates/scaffold/workflow/README.md +67 -0
  586. package/templates/scaffold/workflow/archive/README.md +3 -0
  587. package/templates/scaffold/workflow/delegations.d/.gitkeep +0 -0
  588. package/templates/scaffold/workflow/delegations.md +4 -0
  589. package/templates/scaffold/workflow/effective-policy.md +4 -0
  590. package/templates/scaffold/workflow/evidence/.gitkeep +0 -0
  591. package/templates/scaffold/workflow/gate-cost.md +4 -0
  592. package/templates/scaffold/workflow/gate-metrics.d/.gitkeep +0 -0
  593. package/templates/scaffold/workflow/incidents/_TEMPLATE.md +49 -0
  594. package/templates/scaffold/workflow/intents/_TEMPLATE.md +43 -0
  595. package/templates/scaffold/workflow/metrics.md +4 -0
  596. package/templates/scaffold/workflow/papercuts.d/.gitkeep +0 -0
  597. package/templates/scaffold/workflow/papercuts.md +3 -0
  598. package/templates/scaffold/workflow/plans/_TEMPLATE.md +47 -0
  599. package/templates/scaffold/workflow/regression-checklist.d/.gitkeep +0 -0
  600. package/templates/scaffold/workflow/regression-checklist.md +3 -0
  601. package/templates/scaffold/workflow/research/.gitkeep +0 -0
  602. package/templates/scaffold/workflow/reviews.d/.gitkeep +0 -0
  603. package/templates/scaffold/workflow/specs/_TEMPLATE.md +87 -0
  604. package/templates/scaffold/workflow/verify-evidence/.gitkeep +0 -0
  605. package/templates/scaffold/workflow/verify-evidence.md +4 -0
  606. package/LICENSE +0 -21
  607. package/modules/gates/README.md +0 -25
  608. package/modules/gates/dotnet-ca/README.md +0 -24
  609. package/modules/gates/dotnet-ca/check-architecture.sh +0 -150
  610. package/modules/gates/dotnet-ca/local-pre-commit.line +0 -1
  611. package/modules/gates/generated-readonly/README.md +0 -13
  612. package/modules/gates/generated-readonly/check-generated.mjs +0 -61
  613. package/modules/gates/generated-readonly/local-pre-commit.line +0 -1
  614. package/modules/gates/node-layer/README.md +0 -9
  615. package/modules/gates/node-layer/check-node-layer.mjs +0 -29
  616. package/modules/gates/node-layer/local-pre-commit.line +0 -1
  617. package/modules/gates/py-import/README.md +0 -9
  618. package/modules/gates/py-import/check-py-import.mjs +0 -30
  619. package/modules/gates/py-import/local-pre-commit.line +0 -1
  620. package/modules/gates/test-protect/README.md +0 -23
  621. package/modules/gates/test-protect/check-test-protect.mjs +0 -64
  622. package/modules/gates/test-protect/local-pre-commit.line +0 -1
  623. package/modules/hosts/README.md +0 -57
  624. package/modules/hosts/claude/agents/implementer.md +0 -51
  625. package/modules/hosts/claude/agents/independent-reviewer.md +0 -49
  626. package/modules/hosts/claude/agents/ui-verifier.md +0 -48
  627. package/modules/hosts/claude/commands/wf-build.md +0 -69
  628. package/modules/hosts/claude/commands/wf-deploy.md +0 -58
  629. package/modules/hosts/claude/commands/wf-design.md +0 -49
  630. package/modules/hosts/claude/commands/wf-gate-checklist.md +0 -77
  631. package/modules/hosts/claude/commands/wf-maintain.md +0 -76
  632. package/modules/hosts/claude/commands/wf-new-task.md +0 -102
  633. package/modules/hosts/claude/commands/wf-pipeline-run.md +0 -35
  634. package/modules/hosts/claude/commands/wf-plan.md +0 -40
  635. package/modules/hosts/claude/commands/wf-review.md +0 -49
  636. package/modules/hosts/claude/commands/wf-sync-hosts.md +0 -64
  637. package/modules/hosts/claude/commands/wf-test.md +0 -68
  638. package/modules/hosts/codex/agents/implementer.md +0 -51
  639. package/modules/hosts/codex/agents/independent-reviewer.md +0 -49
  640. package/modules/hosts/codex/agents/ui-verifier.md +0 -48
  641. package/modules/hosts/codex/commands/wf-build.md +0 -69
  642. package/modules/hosts/codex/commands/wf-deploy.md +0 -58
  643. package/modules/hosts/codex/commands/wf-design.md +0 -49
  644. package/modules/hosts/codex/commands/wf-gate-checklist.md +0 -77
  645. package/modules/hosts/codex/commands/wf-maintain.md +0 -76
  646. package/modules/hosts/codex/commands/wf-new-task.md +0 -102
  647. package/modules/hosts/codex/commands/wf-pipeline-run.md +0 -35
  648. package/modules/hosts/codex/commands/wf-plan.md +0 -40
  649. package/modules/hosts/codex/commands/wf-review.md +0 -49
  650. package/modules/hosts/codex/commands/wf-sync-hosts.md +0 -64
  651. package/modules/hosts/codex/commands/wf-test.md +0 -68
  652. package/modules/hosts/codex/skills/flow-kit/SKILL.md +0 -14
  653. package/modules/hosts/cursor/agents/implementer.md +0 -51
  654. package/modules/hosts/cursor/agents/independent-reviewer.md +0 -49
  655. package/modules/hosts/cursor/agents/ui-verifier.md +0 -48
  656. package/modules/hosts/cursor/commands/wf-build.md +0 -69
  657. package/modules/hosts/cursor/commands/wf-deploy.md +0 -58
  658. package/modules/hosts/cursor/commands/wf-design.md +0 -49
  659. package/modules/hosts/cursor/commands/wf-gate-checklist.md +0 -77
  660. package/modules/hosts/cursor/commands/wf-maintain.md +0 -76
  661. package/modules/hosts/cursor/commands/wf-new-task.md +0 -102
  662. package/modules/hosts/cursor/commands/wf-pipeline-run.md +0 -35
  663. package/modules/hosts/cursor/commands/wf-plan.md +0 -40
  664. package/modules/hosts/cursor/commands/wf-review.md +0 -49
  665. package/modules/hosts/cursor/commands/wf-sync-hosts.md +0 -64
  666. package/modules/hosts/cursor/commands/wf-test.md +0 -68
  667. package/modules/hosts/omp/agents/implementer.md +0 -52
  668. package/modules/hosts/omp/agents/independent-reviewer.md +0 -50
  669. package/modules/hosts/omp/agents/ui-verifier.md +0 -49
  670. package/modules/hosts/opencode/agents/implementer.md +0 -59
  671. package/modules/hosts/opencode/agents/independent-reviewer.md +0 -53
  672. package/modules/hosts/opencode/agents/ui-verifier.md +0 -52
  673. package/modules/hosts/opencode/commands/wf-build.md +0 -69
  674. package/modules/hosts/opencode/commands/wf-deploy.md +0 -58
  675. package/modules/hosts/opencode/commands/wf-design.md +0 -49
  676. package/modules/hosts/opencode/commands/wf-gate-checklist.md +0 -77
  677. package/modules/hosts/opencode/commands/wf-maintain.md +0 -76
  678. package/modules/hosts/opencode/commands/wf-new-task.md +0 -102
  679. package/modules/hosts/opencode/commands/wf-pipeline-run.md +0 -35
  680. package/modules/hosts/opencode/commands/wf-plan.md +0 -40
  681. package/modules/hosts/opencode/commands/wf-review.md +0 -49
  682. package/modules/hosts/opencode/commands/wf-sync-hosts.md +0 -64
  683. package/modules/hosts/opencode/commands/wf-test.md +0 -68
  684. package/modules/hosts/trae/agents/implementer.md +0 -52
  685. package/modules/hosts/trae/agents/independent-reviewer.md +0 -51
  686. package/modules/hosts/trae/agents/ui-verifier.md +0 -50
  687. package/modules/hosts/trae/commands/wf-build.md +0 -70
  688. package/modules/hosts/trae/commands/wf-deploy.md +0 -59
  689. package/modules/hosts/trae/commands/wf-design.md +0 -50
  690. package/modules/hosts/trae/commands/wf-gate-checklist.md +0 -78
  691. package/modules/hosts/trae/commands/wf-maintain.md +0 -77
  692. package/modules/hosts/trae/commands/wf-new-task.md +0 -103
  693. package/modules/hosts/trae/commands/wf-pipeline-run.md +0 -36
  694. package/modules/hosts/trae/commands/wf-plan.md +0 -41
  695. package/modules/hosts/trae/commands/wf-review.md +0 -50
  696. package/modules/hosts/trae/commands/wf-sync-hosts.md +0 -65
  697. package/modules/hosts/trae/commands/wf-test.md +0 -69
  698. package/modules/hosts/trae/hooks/post-edit-check.cjs +0 -98
  699. package/modules/hosts/trae/hooks/pre-shell-check.cjs +0 -192
  700. package/modules/hosts/trae/hooks/resolve-shell.cjs +0 -30
  701. package/modules/hosts/trae/hooks.json +0 -29
  702. package/modules/hosts/trae/rules/beautify-input-chinese.md +0 -6
  703. package/modules/hosts/trae/rules/git-commit-message.md +0 -10
  704. package/modules/hosts/trae/rules/project-workflow.md +0 -14
  705. package/modules/hosts/zcode/agents/implementer.md +0 -51
  706. package/modules/hosts/zcode/agents/independent-reviewer.md +0 -49
  707. package/modules/hosts/zcode/agents/ui-verifier.md +0 -48
  708. package/src/add-gate.mjs +0 -116
  709. package/src/add-gate.test.mjs +0 -103
  710. package/src/add-host.mjs +0 -68
  711. package/src/cli.mjs +0 -169
  712. package/src/doctor.mjs +0 -629
  713. package/src/executor.mjs +0 -262
  714. package/src/executor.test.mjs +0 -295
  715. package/src/fresh-init.test.mjs +0 -64
  716. package/src/gate-dotnet-ca.test.mjs +0 -124
  717. package/src/gates.test.mjs +0 -143
  718. package/src/init.mjs +0 -382
  719. package/src/init.test.mjs +0 -163
  720. package/src/instance-ref.test.mjs +0 -62
  721. package/src/jscpd-drift.test.mjs +0 -144
  722. package/src/pack.test.mjs +0 -24
  723. package/src/profiles.mjs +0 -183
  724. package/src/render.mjs +0 -132
  725. package/src/rule-budget.test.mjs +0 -103
  726. package/src/run-tests.mjs +0 -56
  727. package/src/stack-profile.test.mjs +0 -95
  728. package/src/sync-hosts.mjs +0 -257
  729. package/src/sync-hosts.test.mjs +0 -291
  730. package/src/sync.mjs +0 -228
  731. package/src/sync.test.mjs +0 -452
  732. package/src/trae-hooks.test.mjs +0 -127
  733. package/src/validate.mjs +0 -77
  734. package/src/validate.test.mjs +0 -95
  735. package/templates/.gitattributes +0 -17
  736. package/templates/AGENTS.md +0 -57
  737. package/templates/_agents/board/index.html +0 -676
  738. package/templates/_agents/commands/build.md +0 -84
  739. package/templates/_agents/commands/deploy.md +0 -66
  740. package/templates/_agents/commands/design.md +0 -63
  741. package/templates/_agents/commands/gate-checklist.md +0 -91
  742. package/templates/_agents/commands/maintain.md +0 -90
  743. package/templates/_agents/commands/new-task.md +0 -110
  744. package/templates/_agents/commands/pipeline-run.md +0 -43
  745. package/templates/_agents/commands/plan.md +0 -48
  746. package/templates/_agents/commands/review.md +0 -62
  747. package/templates/_agents/commands/sync-hosts.md +0 -77
  748. package/templates/_agents/commands/test.md +0 -87
  749. package/templates/_agents/control-surfaces.txt +0 -53
  750. package/templates/_agents/engine-lock.json +0 -342
  751. package/templates/_agents/hooks/check-index-incremental.mjs +0 -48
  752. package/templates/_agents/hooks/check-pairing-incremental.mjs +0 -66
  753. package/templates/_agents/hooks/check-wiki-ledger.mjs +0 -30
  754. package/templates/_agents/hooks/commit-check.cjs +0 -193
  755. package/templates/_agents/hooks/local-pre-commit +0 -6
  756. package/templates/_agents/lane-surfaces.txt +0 -17
  757. package/templates/_agents/level-hints.txt +0 -30
  758. package/templates/_agents/loop/papercut-debt/DESIGN.md +0 -112
  759. package/templates/_agents/mechanism-registry.md +0 -27
  760. package/templates/_agents/metric-claims.txt +0 -81
  761. package/templates/_agents/notes/engine-internals.md +0 -17
  762. package/templates/_agents/notes/runtime-env.md +0 -18
  763. package/templates/_agents/roles/implementer.md +0 -47
  764. package/templates/_agents/roles/independent-reviewer.md +0 -45
  765. package/templates/_agents/roles/ui-verifier.md +0 -44
  766. package/templates/_agents/rule-budgets.txt +0 -18
  767. package/templates/_agents/scripts/agg-delegations.cjs +0 -302
  768. package/templates/_agents/scripts/agg-delegations.test.mjs +0 -282
  769. package/templates/_agents/scripts/agg-gate-stats.mjs +0 -113
  770. package/templates/_agents/scripts/agg-gate-stats.test.mjs +0 -95
  771. package/templates/_agents/scripts/agg-judgments.mjs +0 -156
  772. package/templates/_agents/scripts/agg-judgments.test.mjs +0 -93
  773. package/templates/_agents/scripts/archive-sweep.mjs +0 -235
  774. package/templates/_agents/scripts/archive-sweep.test.mjs +0 -129
  775. package/templates/_agents/scripts/check-attribution.mjs +0 -37
  776. package/templates/_agents/scripts/check-convergence.mjs +0 -124
  777. package/templates/_agents/scripts/check-engine-integrity.mjs +0 -220
  778. package/templates/_agents/scripts/check-engine-integrity.test.mjs +0 -215
  779. package/templates/_agents/scripts/check-funnel.mjs +0 -56
  780. package/templates/_agents/scripts/check-hygiene.mjs +0 -167
  781. package/templates/_agents/scripts/check-hygiene.test.mjs +0 -182
  782. package/templates/_agents/scripts/check-index-incremental.test.mjs +0 -73
  783. package/templates/_agents/scripts/check-lane-surface.mjs +0 -238
  784. package/templates/_agents/scripts/check-lane-surface.test.mjs +0 -302
  785. package/templates/_agents/scripts/check-ledger-invariant.mjs +0 -527
  786. package/templates/_agents/scripts/check-ledger-invariant.test.mjs +0 -639
  787. package/templates/_agents/scripts/check-loop-rev.test.mjs +0 -336
  788. package/templates/_agents/scripts/check-loop-unit.test.mjs +0 -103
  789. package/templates/_agents/scripts/check-loop.mjs +0 -1958
  790. package/templates/_agents/scripts/check-loop.sh +0 -6
  791. package/templates/_agents/scripts/check-loop.test.mjs +0 -3875
  792. package/templates/_agents/scripts/check-metric-claims.mjs +0 -277
  793. package/templates/_agents/scripts/check-prejudgment.mjs +0 -64
  794. package/templates/_agents/scripts/check-registry.mjs +0 -45
  795. package/templates/_agents/scripts/check-scope.mjs +0 -96
  796. package/templates/_agents/scripts/check-scope.test.mjs +0 -96
  797. package/templates/_agents/scripts/check-scripts-syntax.mjs +0 -61
  798. package/templates/_agents/scripts/check-scripts-syntax.test.mjs +0 -72
  799. package/templates/_agents/scripts/check-spec-verif.mjs +0 -47
  800. package/templates/_agents/scripts/check-stage-index.mjs +0 -40
  801. package/templates/_agents/scripts/check-stage-index.test.mjs +0 -77
  802. package/templates/_agents/scripts/closeout-l1.mjs +0 -217
  803. package/templates/_agents/scripts/closeout-l1.test.mjs +0 -105
  804. package/templates/_agents/scripts/commit-check-trigger.test.mjs +0 -205
  805. package/templates/_agents/scripts/compact-ledgers.mjs +0 -97
  806. package/templates/_agents/scripts/compact-ledgers.test.mjs +0 -162
  807. package/templates/_agents/scripts/confirm-doc.mjs +0 -603
  808. package/templates/_agents/scripts/confirm-doc.test.mjs +0 -1103
  809. package/templates/_agents/scripts/doctor.test.mjs +0 -770
  810. package/templates/_agents/scripts/draft-sediment.mjs +0 -178
  811. package/templates/_agents/scripts/draft-sediment.test.mjs +0 -272
  812. package/templates/_agents/scripts/edit-face-check.mjs +0 -109
  813. package/templates/_agents/scripts/edit-face-check.test.mjs +0 -99
  814. package/templates/_agents/scripts/ensure-board.mjs +0 -185
  815. package/templates/_agents/scripts/fill-intent.mjs +0 -91
  816. package/templates/_agents/scripts/fill-intent.test.mjs +0 -113
  817. package/templates/_agents/scripts/fill-plan.mjs +0 -79
  818. package/templates/_agents/scripts/fill-plan.test.mjs +0 -224
  819. package/templates/_agents/scripts/fill-spec.mjs +0 -70
  820. package/templates/_agents/scripts/fill-spec.test.mjs +0 -266
  821. package/templates/_agents/scripts/fixture-scripts.mjs +0 -153
  822. package/templates/_agents/scripts/fixture-scripts.test.mjs +0 -112
  823. package/templates/_agents/scripts/gate-checklist.mjs +0 -209
  824. package/templates/_agents/scripts/gate-checklist.test.mjs +0 -201
  825. package/templates/_agents/scripts/gate-seg.mjs +0 -54
  826. package/templates/_agents/scripts/gate-seg.test.mjs +0 -112
  827. package/templates/_agents/scripts/gen-effective-policy.mjs +0 -107
  828. package/templates/_agents/scripts/gen-effective-policy.test.mjs +0 -100
  829. package/templates/_agents/scripts/gen-verify-evidence.mjs +0 -107
  830. package/templates/_agents/scripts/gen-verify-evidence.test.mjs +0 -84
  831. package/templates/_agents/scripts/gen-wiki-board.mjs +0 -276
  832. package/templates/_agents/scripts/gen-wiki-board.test.mjs +0 -249
  833. package/templates/_agents/scripts/gen-workflow-dashboard.mjs +0 -251
  834. package/templates/_agents/scripts/gen-workflow-dashboard.test.mjs +0 -188
  835. package/templates/_agents/scripts/gen-workflow-index.mjs +0 -201
  836. package/templates/_agents/scripts/gen-workflow-index.test.mjs +0 -152
  837. package/templates/_agents/scripts/gen-workflow-metrics.mjs +0 -334
  838. package/templates/_agents/scripts/gen-workflow-metrics.test.mjs +0 -224
  839. package/templates/_agents/scripts/git-merge-jsonl.mjs +0 -63
  840. package/templates/_agents/scripts/git-merge-jsonl.test.mjs +0 -125
  841. package/templates/_agents/scripts/judgment-ledger.mjs +0 -65
  842. package/templates/_agents/scripts/judgment-ledger.test.mjs +0 -129
  843. package/templates/_agents/scripts/kb-cache-evict.mjs +0 -50
  844. package/templates/_agents/scripts/kb-cache-evict.test.mjs +0 -104
  845. package/templates/_agents/scripts/kb-search.mjs +0 -413
  846. package/templates/_agents/scripts/kb-search.test.mjs +0 -299
  847. package/templates/_agents/scripts/lane-surface-audit.mjs +0 -143
  848. package/templates/_agents/scripts/lane-surface-audit.test.mjs +0 -93
  849. package/templates/_agents/scripts/ledger-doc-chain.test.mjs +0 -166
  850. package/templates/_agents/scripts/ledger-loader.mjs +0 -108
  851. package/templates/_agents/scripts/ledger-loader.test.mjs +0 -131
  852. package/templates/_agents/scripts/ledger-prune.mjs +0 -96
  853. package/templates/_agents/scripts/ledger-prune.test.mjs +0 -120
  854. package/templates/_agents/scripts/ledger-shards.mjs +0 -344
  855. package/templates/_agents/scripts/ledger-shards.test.mjs +0 -356
  856. package/templates/_agents/scripts/ledger-ts-monotonic.test.mjs +0 -135
  857. package/templates/_agents/scripts/level-criteria.mjs +0 -231
  858. package/templates/_agents/scripts/level-criteria.test.mjs +0 -281
  859. package/templates/_agents/scripts/mechanism-retire-watch.mjs +0 -183
  860. package/templates/_agents/scripts/mechanism-retire-watch.test.mjs +0 -114
  861. package/templates/_agents/scripts/papercut-debt-controller.mjs +0 -141
  862. package/templates/_agents/scripts/papercut-debt-controller.test.mjs +0 -127
  863. package/templates/_agents/scripts/papercut-debt-sensor.mjs +0 -170
  864. package/templates/_agents/scripts/papercut-debt-sensor.test.mjs +0 -146
  865. package/templates/_agents/scripts/pipeline-run-docs.mjs +0 -76
  866. package/templates/_agents/scripts/pipeline-run-run.mjs +0 -63
  867. package/templates/_agents/scripts/pipeline-run.mjs +0 -867
  868. package/templates/_agents/scripts/pipeline-run.test.mjs +0 -517
  869. package/templates/_agents/scripts/policy.mjs +0 -281
  870. package/templates/_agents/scripts/pre-push.test.mjs +0 -105
  871. package/templates/_agents/scripts/resolve-merge-conflicts.mjs +0 -110
  872. package/templates/_agents/scripts/resolve-merge-conflicts.test.mjs +0 -87
  873. package/templates/_agents/scripts/rewrite-file.mjs +0 -133
  874. package/templates/_agents/scripts/rewrite-file.test.mjs +0 -148
  875. package/templates/_agents/scripts/rule-budget.mjs +0 -96
  876. package/templates/_agents/scripts/rule-budget.test.mjs +0 -118
  877. package/templates/_agents/scripts/run-tests.mjs +0 -99
  878. package/templates/_agents/scripts/run-tests.test.mjs +0 -105
  879. package/templates/_agents/scripts/solidify-task.mjs +0 -107
  880. package/templates/_agents/scripts/solidify-task.test.mjs +0 -129
  881. package/templates/_agents/scripts/stage-gates.mjs +0 -343
  882. package/templates/_agents/scripts/stage-gates.test.mjs +0 -105
  883. package/templates/_agents/scripts/trust-mode.mjs +0 -67
  884. package/templates/_agents/scripts/trust-mode.test.mjs +0 -110
  885. package/templates/_agents/scripts/verify-wiki-consistency.mjs +0 -253
  886. package/templates/_agents/scripts/verify-wiki-consistency.test.mjs +0 -123
  887. package/templates/_agents/scripts/verify.mjs +0 -210
  888. package/templates/_agents/scripts/verify.test.mjs +0 -358
  889. package/templates/_agents/scripts/wf-journal.mjs +0 -231
  890. package/templates/_agents/scripts/wf-journal.test.mjs +0 -216
  891. package/templates/_agents/scripts/wiki-search.mjs +0 -19
  892. package/templates/_agents/scripts/wiki-search.test.mjs +0 -57
  893. package/templates/_agents/scripts/workflow-board-server.mjs +0 -393
  894. package/templates/_agents/scripts/workflow-board-server.test.mjs +0 -201
  895. package/templates/_agents/scripts/workflow-enums.mjs +0 -70
  896. package/templates/_agents/scripts/workflow-enums.test.mjs +0 -118
  897. package/templates/_agents/scripts/workflows-check.mjs +0 -260
  898. package/templates/_agents/scripts/workflows-check.test.mjs +0 -278
  899. package/templates/_agents/scripts-test-exempt.txt +0 -16
  900. package/templates/_agents/skills/papercut-fix/SKILL.md +0 -60
  901. package/templates/_agents/skills/papercut-fix/references/response-template.md +0 -81
  902. package/templates/_agents/skills/review-method/SKILL.md +0 -55
  903. package/templates/_agents/skills/verify-ui/SKILL.md +0 -61
  904. package/templates/_agents/skills/wiki/SKILL.md +0 -106
  905. package/templates/_agents/workflow-enums.txt +0 -26
  906. package/templates/_agents/workflow-modules.txt +0 -11
  907. package/templates/_agents/workflows/_TEMPLATE.md +0 -75
  908. package/templates/_agents/workflows/pipeline-closing.md +0 -28
  909. 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 +0 -16
  910. package/templates/_githooks/commit-msg +0 -17
  911. package/templates/_githooks/post-commit +0 -10
  912. package/templates/_githooks/pre-commit +0 -126
  913. package/templates/_githooks/pre-merge-commit +0 -29
  914. package/templates/_githooks/pre-push +0 -136
  915. package/templates/_github/workflows/kit-ci.yml +0 -49
  916. package/templates/wiki/INDEX.md +0 -73
  917. package/templates/wiki/drafts-archive/README.md +0 -3
  918. package/templates/wiki//344/272/247/345/223/201/351/234/200/346/261/202/README.md +0 -3
  919. package/templates/wiki//345/274/200/345/217/221/346/226/271/346/241/210/README.md +0 -3
  920. package/templates/wiki//346/225/260/346/215/256/347/273/264/346/212/244/README.md +0 -3
  921. package/templates/wiki//346/265/213/350/257/225/346/212/245/345/221/212/README.md +0 -3
  922. package/templates/wiki//347/224/250/346/210/267/345/212/237/350/203/275/README.md +0 -3
  923. package/templates/wiki//347/237/245/350/257/206/346/262/211/346/267/200/346/200/273/350/247/210.html +0 -77
  924. package/templates/wiki//351/241/271/347/233/256/350/247/204/350/214/203/README.md +0 -3
  925. package/templates/wiki//351/241/271/347/233/256/350/256/241/345/210/222/README.md +0 -3
  926. package/templates/workflow/README.md +0 -90
  927. package/templates/workflow/delegations.md +0 -29
  928. package/templates/workflow/incidents/_TEMPLATE.md +0 -51
  929. package/templates/workflow/intents/_TEMPLATE.md +0 -46
  930. package/templates/workflow/papercuts.md +0 -9
  931. package/templates/workflow/plans/_TEMPLATE.md +0 -47
  932. package/templates/workflow/regression-checklist.md +0 -23
  933. package/templates/workflow/specs/_TEMPLATE.md +0 -80
  934. /package/templates/{_agents → engine/.agents}/board/marked.min.js +0 -0
  935. /package/templates/{_agents/workflows → engine/.agents/pipelines}/steps//347/244/272/344/276/213-/351/203/250/347/275/262/351/252/214/350/257/201.md" +0 -0
  936. /package/templates/{_agents → engine/.agents}/scripts/git-core.mjs +0 -0
@@ -0,0 +1,898 @@
1
+ /* zcode-workflow
2
+ description: 全链路穷尽用例矩阵测试:对
3
+ MTO→采购申请→采购订单→到货→入库→出库申请→出库订单全链路做穷尽性体检——侦察→穷尽矩阵设计(正向/逆向/守卫/一致性 ×
4
+ 七域)→换人独立评审→按域并行实现→构建门+执行+修复环(≤3轮)→残留失败独立诊断→问题落盘并交付报告。正链造数纪律:凡需链上单据作前置,一律以真实
5
+ API 贯通 MTO→采购申请→采购订单→…逐级造出(采购订单必须从采购申请引入,禁止直种单据/「等价状态」捷径,脚本 grep
6
+ 卡口退回);造数载荷须带完整业务内容并断言跨单据关联。
7
+ whenToUse: 需要对全链路做穷尽性回归体检——穷尽正向贯通、逆向回退、守卫触发、跨单据一致性用例并定性问题、问题落盘出报告时;或业务面大改后需要一次穷尽回归时。运行前提:本地
8
+ TEST_DB_CONN 必须指向专用测试库(TestDbWriteGuard 对未设或指向共享 dev 库的写用例 fail-loud);运行会更新本地
9
+ FullChain/ 测试文件与 tmp/ 矩阵、报告(均不入库,git 历史可回溯本文件历史版本),须人工审阅后本地留存。
10
+ args:
11
+ testFilter:
12
+ type: string
13
+ description: dotnet test --filter 过滤表达式,决定执行门跑哪些测试
14
+ required: false
15
+ default: FullyQualifiedName~FullChain
16
+ */
17
+ // ============================================================
18
+ // 全链路穷尽用例矩阵测试:MTO→采购申请→采购订单→到货→入库→出库申请→出库订单
19
+ // 穷尽纪律锚定侦察事实:每条守卫→触发用例、每个清理端点→回退用例、
20
+ // 每条数量/状态回写链→跨单据一致性断言用例;问题(失败/受阻/未清零缺口)落盘出报告
21
+ // 正链造数纪律:链上单据前置必须以真实 API 贯通 MTO→采购申请→采购订单→…(采购订单从采购申请引入),
22
+ // 禁止 EF/SQL 直种单据本体或「等价状态」捷径;造数载荷带完整业务内容(合同/供应商/采购员/计税/双数量口径)
23
+ // 门禁隔离:生成文件整体 #if FCLocal 包裹,调度方以 -p:DefineConstants=FCLocal 编译执行
24
+ // ============================================================
25
+
26
+ // ---------- 类型 ----------
27
+ interface ChainLinkReport {
28
+ /** 环节名 */
29
+ link: string;
30
+ /** 核心实体:实体名 — 文件位置(path:line) — 一句话职责 */
31
+ entities: string[];
32
+ /** 关键 API:METHOD 路由 — 用途 + 关键 DTO 字段(正向贯通按调用顺序标注) */
33
+ endpoints: string[];
34
+ /** 单据状态机:实体: 状态A→状态B→…(贯通推进路径与终止态) */
35
+ statusFlows: string[];
36
+ /** 正向贯通会遇到的业务守卫/前置要求:一句话 + 代码位置 + 校验消息原文(审批上下文、库位必填、锚点门等) */
37
+ guards: string[];
38
+ /** 清理链:本环节单据的取消/驳回/关闭/冲销端点及对库存/占用的影响;不可逆环节单独注明 */
39
+ cleanupOps: string[];
40
+ /** 落库表与关键字段:表名 — 关键字段(数量/状态/批次/关联外键) */
41
+ dataTables: string[];
42
+ /** 数量/状态回写联动契约(生成下游、回写上游哪个字段)+ 集成测试可行性备注(审批人/当前用户如何注入)+ 造数前提 */
43
+ testability: string;
44
+ }
45
+
46
+ interface TestInfraReport {
47
+ /** 集成测试项目相对路径与根命名空间 */
48
+ testProject: string;
49
+ /** 可复用基架:fixture/基类/helper 类名 + 文件位置 + 用途 */
50
+ fixtures: string[];
51
+ /** 运行机制:如何获得后端与数据库、连接串来源、是否依赖本地 SQL Server */
52
+ runtime: string;
53
+ /** 造数与隔离/清理惯例,新测试必须遵守什么 */
54
+ isolation: string;
55
+ /** 值得模仿的现有测试类 + 文件位置 */
56
+ exemplars: string[];
57
+ /** 新测试的硬约束(每条一句话) */
58
+ constraints: string[];
59
+ /** FullChain/ 既有本地回归网清单:每类一条「类名 — 用例数 — 覆盖域一句话 — 疑似失效用例(如有)」;目录不存在/为空则返回空数组 */
60
+ fullchainInventory: string[];
61
+ /** 门禁隔离事实:IntegrationTests.csproj 对 FullChain/ 的包含方式(SDK 通配递归?有无 Compile Remove 排除?path:line 证据)+ 门禁构建/测试命令为何不受生成文件影响,一句话结论 */
62
+ gateIsolation: string;
63
+ }
64
+
65
+ interface TestCase {
66
+ /** 用例 id,FC-<域>-<三位序号>,全文唯一连续 */
67
+ id: string;
68
+ /** 所属域:MTO|PO|ARRIVAL|INBOUND|OUTBOUND|REVERSE|CONSISTENCY 之一 */
69
+ domain: string;
70
+ /** 类别:正向|逆向|守卫|一致性 之一 */
71
+ category: string;
72
+ /** 优先级:P0 主链路|P1 重要边界|P2 穷尽补全 */
73
+ priority: string;
74
+ /** 一句话标题 */
75
+ title: string;
76
+ /** 前置造数清单(单据/主数据/状态,取最短必要路径,按基架 isolation 惯例) */
77
+ preconditions: string[];
78
+ /** 步骤:API 调用级(端点+关键 DTO 字段+前置状态) */
79
+ steps: string[];
80
+ /** 数据流转断言(字段级:单据状态/数量回写/库存与占用/跨单据关联/拒绝消息) */
81
+ expected: string[];
82
+ /** 清理动作(走真实释放链;不可逆环节注明止步点) */
83
+ cleanup: string[];
84
+ }
85
+
86
+ interface MatrixDomain {
87
+ /** 域 id:MTO|PO|ARRIVAL|INBOUND|OUTBOUND|REVERSE|CONSISTENCY 之一 */
88
+ domain: string;
89
+ /** 固定测试类名(由调度方映射,实现员不得改) */
90
+ testClassName: string;
91
+ /** 本域用例 id 列表(与矩阵文件一致) */
92
+ caseIds: string[];
93
+ }
94
+
95
+ interface MatrixSpec {
96
+ /** 矩阵文件相对路径 */
97
+ matrixPath: string;
98
+ /** 七域分组(每域至少一例) */
99
+ domains: MatrixDomain[];
100
+ /** 用例总数 */
101
+ totalCases: number;
102
+ /** P0/P1/P2 计数 */
103
+ priorityCounts: { p0: number; p1: number; p2: number };
104
+ /** 设计说明与风险(含正向链运行成本、现状断言口径声明) */
105
+ risks: string[];
106
+ }
107
+
108
+ interface MatrixReview {
109
+ /** 结论:通过 / 需补 */
110
+ verdict: "通过" | "需补";
111
+ /** 问题清单(每条指明用例 id、域或穷尽维度) */
112
+ issues: string[];
113
+ }
114
+
115
+ interface ImplOutcome {
116
+ /** 本域测试文件相对路径 */
117
+ filePath: string;
118
+ /** 已实现用例 id */
119
+ implementedCaseIds: string[];
120
+ /** 未能实现的用例 + 原因 */
121
+ blockedCases: { id: string; reason: string }[];
122
+ /** 一句话说明(含疑似产品缺陷记录) */
123
+ note: string;
124
+ }
125
+
126
+ interface FailureDiagnosis {
127
+ /** 失败测试全名 */
128
+ test: string;
129
+ /** 是否已单独复现 */
130
+ reproduced: boolean;
131
+ /** 根因归类 */
132
+ rootCause: "产品缺陷" | "测试问题" | "环境问题";
133
+ /** 证据:path:line 或复跑输出关键行 */
134
+ evidence: string;
135
+ /** 一句话结论 */
136
+ conclusion: string;
137
+ }
138
+
139
+ interface TestRun {
140
+ /** 本轮是否全绿 */
141
+ ok: boolean;
142
+ /** 失败数 */
143
+ failed: number;
144
+ /** 通过数 */
145
+ passed: number;
146
+ /** 失败用例全名 */
147
+ failedTests: string[];
148
+ /** 输出尾部(证据) */
149
+ output: string;
150
+ }
151
+
152
+ interface Finding {
153
+ /** 位置:文件路径或测试全名 */
154
+ where: string;
155
+ /** 一句话:发现了什么 */
156
+ what: string;
157
+ /** 证据 */
158
+ evidence: string;
159
+ /** verified=独立核验过;unconfirmed=未能复现或未核验 */
160
+ status: "verified" | "unconfirmed";
161
+ /** 影响程度 */
162
+ severity: "low" | "medium" | "high";
163
+ }
164
+
165
+ interface WorkflowReport {
166
+ /** 两三句话回答用户的问题 */
167
+ conclusion: string;
168
+ /** 发现清单 */
169
+ findings: Finding[];
170
+ /** 本运行实际做了哪些核验 */
171
+ verified: string[];
172
+ /** 未覆盖项与原因 */
173
+ notCovered: string[];
174
+ }
175
+
176
+ // ---------- 人设 ----------
177
+ const READONLY_SYSTEM =
178
+ "你是只读侦察员:绝不修改任何文件、绝不执行 git 写命令;每条结论必须给可核对的 path:line 证据;查不到就明说查不到,禁止编造。若任务与事实冲突或无法完成,如实说明而不是硬凑结论。";
179
+ const DESIGNER_SYSTEM =
180
+ "你是资深测试架构师:只读仓库,仅允许写矩阵文件本身(tmp/ 下指定路径);矩阵必须可执行、可断言、穷尽有据(每例都能指回侦察事实),禁止发明侦察事实之外的系统功能。前置造数必须真实贯通受测正链(MTO→采购申请→采购订单→到货→入库→出库,采购订单从采购申请引入),禁止设计直种单据或「等价状态」捷径,造数载荷字段完整。若发现事实不足以下结论,如实说明。";
181
+ const REVIEWER_SYSTEM =
182
+ "你是独立评审员:只读,禁止修改任何文件;挑毛病优先于认可,每条意见落到具体用例 id、域或穷尽维度。";
183
+ const IMPL_SYSTEM =
184
+ "你是集成测试实现员:只允许在 tests/Shipyard.Material.IntegrationTests/FullChain/ 下新建或修改你负责的那一个测试文件(FullChain/ 为本地留存不入库的回归面,文件全部内容必须整体 #if FCLocal 包裹以隔离仓库门禁);禁止修改产品代码(backend/、frontend/)与其他测试文件;禁止任何 git 写命令;禁止运行 dotnet build / dotnet test(统一由调度方执行)。若指令矛盾或基架无法支撑,如实说明并给出受阻清单,不要绕过或编造。";
185
+ const DIAG_SYSTEM =
186
+ "你是独立诊断员:只读分析,可运行单个测试复现(dotnet test 过滤单个用例,命令须带 -p:DefineConstants=FCLocal),不得修改任何文件、不得跑全量套件(调度方已跑过)。结论以证据为准;复现不了就如实标 reproduced=false。";
187
+
188
+ // ---------- 常量 ----------
189
+ const MATRIX_PATH = "tmp/fullchain-matrix.md";
190
+ const REPORT_PATH = "tmp/fullchain-matrix-report.md";
191
+ const TEST_PROJECT = "tests/Shipyard.Material.IntegrationTests";
192
+ const FLOW_NAMESPACE = "Shipyard.Material.IntegrationTests.FullChain";
193
+ const FC_GLOB = `${TEST_PROJECT}/FullChain/*.cs`;
194
+ const FLOW_STAGES = ["MTO", "采购申请", "采购订单", "到货", "入库", "出库申请", "出库订单"];
195
+ const DOMAINS = ["MTO", "PO", "ARRIVAL", "INBOUND", "OUTBOUND", "REVERSE", "CONSISTENCY"];
196
+ const DOMAIN_NAME: Record<string, string> = {
197
+ MTO: "MTO需求",
198
+ PO: "采购",
199
+ ARRIVAL: "到货",
200
+ INBOUND: "入库",
201
+ OUTBOUND: "出库",
202
+ REVERSE: "逆向冲销",
203
+ CONSISTENCY: "跨单据一致性",
204
+ };
205
+ const DOMAIN_CLASS: Record<string, string> = {
206
+ MTO: "FcMtoTests",
207
+ PO: "FcPoTests",
208
+ ARRIVAL: "FcArrivalTests",
209
+ INBOUND: "FcInboundTests",
210
+ OUTBOUND: "FcOutboundTests",
211
+ REVERSE: "FcReverseTests",
212
+ CONSISTENCY: "FcConsistencyTests",
213
+ };
214
+ const FULLCHAIN_FILTER = String(args.testFilter ?? "FullyQualifiedName~FullChain");
215
+
216
+ // 看板:按域实现/执行进度(声明一次,顶层)
217
+ artifact.board("groups", {
218
+ title: "穷尽矩阵按域进度",
219
+ key: "id",
220
+ status: "status",
221
+ columns: ["已实现", "全绿", "有失败", "受阻"],
222
+ cardTitle: "name",
223
+ detail: [{ field: "detail", label: "进度" }],
224
+ });
225
+
226
+ // 报告 markdown 同步落盘 tmp/(运行卡片之外的磁盘留档副本;脚本自身无文件写工具,用 node 确定性写盘,失败只记日志不阻断主流程)
227
+ async function writeTmpMarkdown(path: string, content: string): Promise<void> {
228
+ try {
229
+ const w = await world.run("node", ["-e", "require('fs').writeFileSync(process.argv[1], process.argv[2], 'utf8')", path, content]);
230
+ if (w.exitCode === 0) log(`报告已落盘:${path}`);
231
+ else log(`报告落盘 ${path} 失败(exitCode ${w.exitCode}),运行卡片仍可查看`);
232
+ } catch (e) {
233
+ log(`报告落盘 ${path} 异常:${String(e)}`);
234
+ }
235
+ }
236
+
237
+ log("全链路穷尽用例矩阵测试工作流启动:正向/逆向/守卫/一致性 × 七域,问题落盘出报告;门禁卡口不动(#if FCLocal 隔离)");
238
+
239
+ // ---------- 侦察 ----------
240
+ const RECON_LINKS = [
241
+ {
242
+ key: "MTO需求",
243
+ hint: "MTO/物资需求单全链路事实:创建/明细/提交/审批端点与 DTO(审批通过、可下推采购态,注意审批通过不改单据状态轴);与下游采购申请的生成联动(生成端点或字段关联、数量回写、MTO 占用桶怎么记);造数前提(物资/仓库等主数据要求);清理链(关闭/取消/利库取消等端点及占用影响)。穷尽线索重点:guards 与 cleanupOps 要一条不漏。",
244
+ },
245
+ {
246
+ key: "采购",
247
+ hint: "采购申请(PR)→采购订单(PO)全链路事实:PR 从 MTO 生成的端点/字段关联(含明细级 MTOOrderDetailID 关联与数量回写),PR 创建/提交/审批;PR→PO 引入/生成端点与数量联动(分批/超量规则,最简合法路径,PO 明细如何携带 PurchaseRequestID/PurchaseRequestNo 关联);PO 提交/审批;PO.DeliveredQty 等数量字段;造数前提(供应商等主数据)。必须产出「从 MTO 到已审批 PO 的完整造数配方」并写到载荷级全字段(合同号、供应商、采购员、采购组织、计税方式/税率、单价与双数量口径),供到货/入库/一致性等下游域前置照抄——本工作流测试数据一律经采购申请中转(MTO→采购申请→采购订单),不造无采购申请来源的采购订单(守卫用例专测无 PR/悬空 PR 引用时除外)。穷尽线索重点:PR/PO 的合同编号必填、计税默认等新守卫一条不漏。",
248
+ },
249
+ {
250
+ key: "到货入库",
251
+ hint: "到货登记→入库全链路事实:到货登记端点(从 PO 候选/下推?)与 DTO、到货确认(容差边界)、下推生成入库单与撤销;入库单确认(库位必填)写库存台账与流水、明细拆分(库位/批次);数量回写链 PO.DeliveredQty→到货 ReceivedQty→库存 Qty/UsageQty;造数前提(仓库/库位/批次要求);清理链(入库冲销/撤销下推及对库存的影响)。穷尽线索重点:容差边界与超收/欠收守卫。",
252
+ },
253
+ {
254
+ key: "出库与库存",
255
+ hint: "领料出库全链路事实:库存表结构(Qty/UsageQty 与占用/锁字段);出库申请两种形态(定额 PickingType=1 需 PML 锚点 / 借条 =2 审批增补)各自创建/提交/审批端点与 DTO;check-inventory 材料检查(占用唯一入口、整组判够全占);出库单创建/拣货 pick/确认 confirm(五道闸逐道列出);OutedQty 回写与库存扣减;造数前提;清理链(驳回/取消/关闭释放占用;出库确认后不可逆的边界)。穷尽线索重点:五道闸与占用释放链一条不漏。",
256
+ },
257
+ ];
258
+
259
+ function reconAsk(l: { key: string; hint: string }): string {
260
+ return [
261
+ `你是只读侦察员。仓库:ASP.NET Core 6 + EF Core + SQL Server(Clean Architecture,backend/ 下 material 与 shared 双模块),API 层在 backend/material/Shipyard.Material.API/Controllers/。`,
262
+ `任务:为「全链路穷尽用例矩阵」(正向/逆向/守卫/一致性四类,域覆盖 ${DOMAINS.join("/")})提供「${l.key}」环节的事实底座。穷尽矩阵的规模与覆盖面完全由你的 guards/cleanupOps/testability 决定:漏一条守卫就漏一类用例,宁全勿略。`,
263
+ `侦察范围:${l.hint}`,
264
+ ``,
265
+ `必须产出(查不到的项留空数组并在 testability 说明,禁止编造):`,
266
+ `1. entities:涉及的核心实体 + 文件位置(path:line) + 一句话职责;`,
267
+ `2. endpoints:Controller 路由(METHOD 路由 — 用途 + 关键 DTO 字段),按正向调用顺序排列;`,
268
+ `3. statusFlows:涉及单据的状态机(合法推进 + 终止态 + 非法推进会被哪个守卫拦);`,
269
+ `4. guards:业务守卫/前置要求(审批上下文、库位必填、锚点门、必填字段、状态门等),逐条带消息原文与 path:line——每一条都会变成一个守卫触发用例;`,
270
+ `5. cleanupOps:清理链——取消/驳回/关闭/冲销端点及对库存/占用的影响;不可逆环节单独注明——每一个可回退端点都会变成一条逆向用例;`,
271
+ `6. dataTables:落库表与关键字段(数量/状态/批次/关联外键尤其要全);`,
272
+ `7. testability:数量/状态回写联动契约(生成下游、回写上游哪个字段)+ 进程内集成测试怎么驱动(审批人上下文、当前用户如何注入)+ 造数前提——每条契约都会变成一条一致性断言用例。`,
273
+ ``,
274
+ `每条结论都要有证据;这份报告直接决定穷尽矩阵的覆盖面。`,
275
+ ].join("\n");
276
+ }
277
+
278
+ const INFRA_ASK = [
279
+ `你是只读侦察员。仓库:ASP.NET Core 6 + Vue 3,集成测试在 tests/Shipyard.Material.IntegrationTests(xUnit)。`,
280
+ `任务:摸清集成测试基架,为「全链路穷尽用例矩阵」按域并行实现铺路。以下为上一轮核实过的基线,请逐项核实(漂移了就纠正)并补细节:`,
281
+ `- TestApiFactory : WebApplicationFactory<Program>,UseSetting 注入 TestDb.ConnectionString 与测试 JWT;`,
282
+ `- TestDb:连接串 TEST_DB_CONN 环境变量优先,缺省回读 API appsettings.json;TestDbWriteGuard 对未设/指向共享 dev 库的写用例 fail-loud;`,
283
+ `- RollbackTestBase 事务回滚基类(直连服务用例);HTTP 管线用例不进外层事务 → 本机套件惯例「自建自清」:唯一后缀播种 + finally 定向清理(先子后头);`,
284
+ `- 程序集禁并行 + sp_getapplock 串行锁;统一运行入口 scripts/verify/backend/run-backend-tests.mjs 或 dotnet test;`,
285
+ `- FullChain/ 目录被 .gitignore 忽略(本地回归面,不入库);2026-11-03 起目录可为空(历史本机套件已退役),本工作流生成物是唯一内容;`,
286
+ `- 门禁口径:仓库门禁与权威面 = dotnet build Shipyard.Material.sln + dotnet test sln --no-build(无过滤);生成的本机套件必须对其零影响。`,
287
+ `必须产出:`,
288
+ `1. testProject:项目相对路径与根命名空间;`,
289
+ `2. fixtures:fixture/基类/helper 类名 + 文件位置 + 用途,新测试应继承/复用什么;`,
290
+ `3. runtime:连接串来源、TestDbWriteGuard 拦截规则与逃生口、依赖的 SQL Server 实例与库;`,
291
+ `4. isolation:现有测试怎么造数、怎么隔离/清理(事务回滚? 唯一编码? finally 定向清理?);`,
292
+ `5. exemplars:最值得模仿的跨单据链路测试类(存量套件优先)+ 文件位置;`,
293
+ `6. fullchainInventory:FullChain/ 既有每个测试类一条「类名 — 用例数 — 覆盖域一句话 — 疑似失效用例(如有)」;目录不存在/为空则返回空数组;另核对 ${DOMAINS.map((d) => DOMAIN_CLASS[d]).join("、")} 是否与既有类重名,重名则在 constraints 里说明;`,
294
+ `7. constraints:给新测试的硬约束(最多 6 条,每条一句话),例如禁止依赖执行顺序、清理不得残留占用、文件必须整体 #if FCLocal 包裹等;`,
295
+ `8. gateIsolation:Shipyard.Material.IntegrationTests.csproj 对 FullChain/ 子目录的包含事实(SDK 通配递归包含?有无 Compile Remove 排除?给 path:line 证据);据此判断「生成文件整体 #if FCLocal 包裹 + 调度方 dotnet test -p:DefineConstants=FCLocal 执行」能否保证门禁(无符号构建/跑测试)零影响,一句话结论。`,
296
+ ``,
297
+ `每条结论带 path:line 或文件位置;查不到就明说,禁止编造。`,
298
+ ].join("\n");
299
+
300
+ phase("侦察链路API与测试基建");
301
+ log(`5 路侦察并行:${RECON_LINKS.map((l) => l.key).join("、")} + 测试基建`);
302
+ // 屏障有意为之:矩阵设计师必须拿到全链路视角
303
+ const [chainReports, infra] = await Promise.all([
304
+ Promise.all(RECON_LINKS.map((l) => agent(`侦察-${l.key}`, { system: READONLY_SYSTEM }).ask<ChainLinkReport>(reconAsk(l)))),
305
+ agent("侦察-测试基建", { system: READONLY_SYSTEM }).ask<TestInfraReport>(INFRA_ASK),
306
+ ]);
307
+ log(`侦察完成:${chainReports.map((r) => `${r.link}(守卫 ${r.guards.length} 条、清理端点 ${r.cleanupOps.length} 个)`).join(",")}`);
308
+ // 工作区基线:本工作流全部产物(tmp/、FullChain/)均已 gitignore,实现后比对 git.status() 应无新增可见文件——有即为越权写入
309
+ const statusBaseline = await git.status();
310
+
311
+ // ---------- 设计穷尽矩阵 ----------
312
+ const DESIGN_RULES = [
313
+ `穷尽纪律(矩阵逐条对照侦察事实覆盖,宁滥勿缺;每个用例都能指回一条侦察事实):`,
314
+ `1. 守卫穷尽:四路链路侦察事实里每一条 guards(审批上下文、库位必填、锚点门、必填字段、状态门、五道闸等)至少一条「触发它」的用例(守卫类,断言拒绝响应与无副作用);`,
315
+ `2. 逆向穷尽:每条 cleanupOps 列出的取消/驳回/关闭/冲销端点至少一条「成功回退/释放」用例(逆向类),断言占用/数量/状态回退到位;不可逆环节注明止步点,不设计无法收尾的用例;`,
316
+ `3. 一致性穷尽:testability 里每条数量/状态回写联动契约(MTO 占用→PR→PO.DeliveredQty→到货 ReceivedQty→库存 Qty/UsageQty→OutedQty)至少一条跨单据字段级断言用例(一致性类);`,
317
+ `4. 正向兜底:七个环节(${FLOW_STAGES.join("→")})各至少被一条正向用例覆盖,且其中至少一例 P0 从 MTO 连续贯通推进到出库订单确认(整链单据一次造全、业务内容完整);正向用例允许整链一例或按环节拆例,但用例之间禁止依赖执行顺序(xUnit 用例无序);`,
318
+ `5. 边界补全:数量边界(零/上界/分批/部分量/容差)、状态非法推进等按侦察事实补 P2 用例;并发与竞态不在矩阵内(程序集禁并行、并发属既有专项),在 risks 里声明;`,
319
+ `6. 每例自包含·正链贯通(硬纪律):凡前置需要采购申请/采购订单/到货/入库/出库单等链上单据,必须按 ${FLOW_STAGES.join("→")} 的真实顺序以 API 逐级造出到本例所需环节(MTO 审批→生成采购申请→PR 确认→采购订单从采购申请引入建单(明细带 PurchaseRequestID 关联)→提交/审批→到货→入库→…),禁止以 EF/SQL 直种单据本体或「等价状态」捷径替代——SQL 播种仅限守卫/竞态/历史行等 API 无法达成的 UPDATE 类状态微调与 PML、库存行等无创建端点的非单据主数据;按基架 isolation 惯例(唯一编码、审批上下文注入方式)写进 preconditions;steps 写到 API 调用级;expected 落到字段级(状态/数量回写/库存占用/跨单据关联 id——含 MTO 明细→PR→PO 的关联字段/拒绝消息原文);cleanup 走真实释放链;`,
320
+ `7. 数据内容完整:造数载荷必须携带完整业务内容(按侦察事实逐项落字段:合同号、供应商、采购员、采购组织、计税方式/税率、单价与双数量口径、仓库/库位/批次等),并断言这些内容随链落库、在下游单据正确回显/回写;禁止任意 Guid 占位供应商/采购员等主数据引用(守卫用例专测非法引用时除外);`,
321
+ `8. 分类分级:category 取 正向|逆向|守卫|一致性;priority 取 P0 主链路|P1 重要边界|P2 穷尽补全;编号 FC-<域>-<三位序号>(域取 ${DOMAINS.join("/")}),id 全文唯一连续;`,
322
+ `9. 现状断言纪律:按侦察到的现状语义断言,禁止按未实施的目标语义设计;侦察事实与旧基线冲突时以侦察为准并写入 risks;`,
323
+ `10. 把完整矩阵写入 ${MATRIX_PATH}:开头总览(总数、P0/P1/P2 计数、七域分组表),随后每域一节,每例完整呈现 id/title/category/priority/preconditions/steps/expected/cleanup 全文——一字不丢、不得缩写(实现员只读这个文件);`,
324
+ `11. 返回 MatrixSpec:matrixPath 固定填 ${MATRIX_PATH};domains 只填 domain 与 caseIds(与文件一致,不得缩写),testClassName 由调度方映射;totalCases、priorityCounts、risks 如实填。`,
325
+ ].join("\n");
326
+
327
+ function normalizeDomains(domains: MatrixDomain[]): MatrixDomain[] {
328
+ return DOMAINS.map((dm) => ({
329
+ domain: dm,
330
+ testClassName: DOMAIN_CLASS[dm],
331
+ caseIds: Array.from(new Set(domains.find((x) => x.domain === dm)?.caseIds ?? [])),
332
+ }));
333
+ }
334
+ function missingDomains(spec0: MatrixSpec): string[] {
335
+ return DOMAINS.filter((dm) => {
336
+ const d = spec0.domains.find((x) => x.domain === dm);
337
+ return !d || d.caseIds.length === 0;
338
+ });
339
+ }
340
+ // 缺域中止统一出口(首次设计与评审修订后共用):落盘报告并返回可交付的失败结论
341
+ async function matrixDesignAbort(missingList: string[], stageNote: string): Promise<WorkflowReport> {
342
+ const failReport = ["# 矩阵设计失败:仍缺域", "", `缺域:${missingList.map((d) => DOMAIN_NAME[d]).join("、") || "全矩阵为空"};实现与执行未进行(${stageNote})。`].join("\n");
343
+ await writeTmpMarkdown(REPORT_PATH, failReport);
344
+ await artifact.markdown("report", failReport, { title: "穷尽矩阵设计失败报告", primary: true });
345
+ return {
346
+ conclusion: `穷尽矩阵${stageNote}仍缺域(${missingList.map((d) => DOMAIN_NAME[d]).join("、") || "空"}),工作流中止;侦察事实已产出可人工接管。`,
347
+ findings: [{ where: MATRIX_PATH, what: "穷尽矩阵缺域,无法进入实现", evidence: `设计师${stageNote}返回仍有空域`, status: "verified", severity: "high" }],
348
+ verified: ["5 路只读侦察(链路 ×4 + 测试基建)", `矩阵设计尝试(${stageNote})`],
349
+ notCovered: ["实现、执行、诊断全部未进行;矩阵未经验证"],
350
+ };
351
+ }
352
+
353
+ phase("设计穷尽用例矩阵");
354
+ const designer = agent("矩阵设计师", { system: DESIGNER_SYSTEM });
355
+ let spec = await designer.ask<MatrixSpec>(
356
+ [
357
+ `任务:设计「全链路穷尽用例矩阵」——对 ${FLOW_STAGES.join("→")} 全链路,按 正向/逆向/守卫/一致性 四类穷尽设计用例,全部用例经 API 自动造数驱动(禁止依赖既有单据或手工步骤),逐步给出数据流转断言。`,
358
+ ``,
359
+ `=== 链路侦察事实(四环节) ===`,
360
+ JSON.stringify(chainReports),
361
+ ``,
362
+ `=== 测试基架事实 ===`,
363
+ JSON.stringify(infra),
364
+ ``,
365
+ DESIGN_RULES,
366
+ ].join("\n"),
367
+ );
368
+ spec.domains = normalizeDomains(spec.domains);
369
+ // 脚本级确定性校验:七域必须每域有例
370
+ const missing = missingDomains(spec);
371
+ if (spec.totalCases === 0 || missing.length > 0) {
372
+ log(`矩阵缺域(${missing.map((d) => DOMAIN_NAME[d]).join("、") || "无任何用例"}),退回设计师补全`);
373
+ spec = await designer.ask<MatrixSpec>(
374
+ `你返回的矩阵缺以下域的用例:${missing.map((d) => `${DOMAIN_NAME[d]}(${d})`).join("、") || "(全矩阵为空)"}。请补全 ${MATRIX_PATH}(每域至少一例,沿用编号规则追加),返回修订后的 MatrixSpec。`,
375
+ );
376
+ spec.domains = normalizeDomains(spec.domains);
377
+ }
378
+ const stillMissing = missingDomains(spec);
379
+ if (stillMissing.length > 0) return await matrixDesignAbort(stillMissing, "两次设计");
380
+ const matrixTotal = spec.domains.reduce((a, d) => a + d.caseIds.length, 0);
381
+ log(`矩阵就绪:${matrixTotal} 例(P0 ${spec.priorityCounts.p0} / P1 ${spec.priorityCounts.p1} / P2 ${spec.priorityCounts.p2})× ${spec.domains.length} 域`);
382
+
383
+ // ---------- 换人独立评审矩阵 ----------
384
+ phase("换人独立评审矩阵");
385
+ const reviewer = agent("矩阵评审员", { system: REVIEWER_SYSTEM });
386
+ const review = await reviewer.ask<MatrixReview>(
387
+ [
388
+ `你是独立评审员(没有参与设计,只读,禁止改任何文件)。请通读矩阵文件 ${spec.matrixPath},对照侦察事实审查穷尽性:`,
389
+ ``,
390
+ `=== 链路侦察事实(四环节) ===`,
391
+ JSON.stringify(chainReports),
392
+ ``,
393
+ `=== 基架摘要 ===`,
394
+ JSON.stringify({ runtime: infra.runtime, isolation: infra.isolation, constraints: infra.constraints, gateIsolation: infra.gateIsolation }),
395
+ ``,
396
+ `回答(宁严勿松,这份矩阵要支撑穷尽性体检验收):`,
397
+ `1. 守卫穷尽:侦察事实里每条 guards 是否都有触发用例?逐条核对,漏一条记一条(指明该守卫原文与应归域);`,
398
+ `2. 逆向穷尽:每条 cleanupOps 是否都有回退/释放用例?不可逆止步点是否注明?`,
399
+ `3. 一致性穷尽:数量回写链(MTO 占用→PR→PO.DeliveredQty→ReceivedQty→库存→OutedQty)每段有无字段级断言缺口?`,
400
+ `4. 可执行性:步骤是否 API 调用级?前置造数按基架可造吗?审批上下文能注入吗?用例间有无隐藏执行顺序依赖?`,
401
+ `5. 正链贯通:有无用例前置以 EF/SQL 直种单据本体或「等价状态」替代 MTO→采购申请→采购订单→… 的真实 API 贯通?PO 明细是否携带采购申请关联(PurchaseRequestID)?(有=直接需补)`,
402
+ `6. 数据内容完整:造数载荷是否带齐关键业务字段(合同号/供应商/采购员/采购组织/计税/单价与双数量口径/仓库库位批次)?有无任意 Guid 占位主数据引用?(守卫用例专测非法引用时除外;有缺口=需补)`,
403
+ `7. 红线:有无用例需要修改产品代码或门禁配置才能通过?(有=直接需补)`,
404
+ `8. verdict:无实质缺口=「通过」,否则「需补」;issues 每条指明用例 id、域或穷尽维度。`,
405
+ ].join("\n"),
406
+ );
407
+ log(`独立评审:${review.verdict}(问题 ${review.issues.length} 条)`);
408
+ if (review.verdict === "需补" && review.issues.length > 0) {
409
+ spec = await designer.ask<MatrixSpec>(
410
+ [
411
+ `独立评审发现以下问题,请修订矩阵文件 ${spec.matrixPath} 并返回修订后的 MatrixSpec(counts/caseIds 同步,文件与返回一致;新用例沿用编号规则追加):`,
412
+ JSON.stringify(review.issues),
413
+ ].join("\n"),
414
+ );
415
+ spec.domains = normalizeDomains(spec.domains);
416
+ log("矩阵按评审意见修订完成");
417
+ }
418
+ // 修订可能误删整域:同一确定性校验再跑一遍,给一次补全机会,仍缺则中止
419
+ const revisedMissing = missingDomains(spec);
420
+ if (revisedMissing.length > 0) {
421
+ log(`评审修订后缺域(${revisedMissing.map((d) => DOMAIN_NAME[d]).join("、")}),退回设计师补全`);
422
+ spec = await designer.ask<MatrixSpec>(
423
+ `独立评审修订后矩阵缺以下域的用例:${revisedMissing.map((d) => `${DOMAIN_NAME[d]}(${d})`).join("、")}。请补全 ${spec.matrixPath}(每域至少一例,沿用编号规则追加),返回修订后的 MatrixSpec。`,
424
+ );
425
+ spec.domains = normalizeDomains(spec.domains);
426
+ }
427
+ const finalMissing = missingDomains(spec);
428
+ if (finalMissing.length > 0) return await matrixDesignAbort(finalMissing, "评审修订后");
429
+
430
+ // ---------- 预检构建环境 ----------
431
+ phase("预检构建环境");
432
+ const smoke = await world.run("dotnet", ["build", "Shipyard.Material.sln", "--nologo", "-v", "q"], { timeoutMs: 1800000, output: { tail: 32768 } });
433
+ if (smoke.exitCode !== 0) {
434
+ const failFinding: Finding = { where: "Shipyard.Material.sln", what: "基线构建失败,穷尽矩阵无法开展", evidence: (smoke.stdout + "\n" + smoke.stderr).slice(-2000), status: "verified", severity: "high" };
435
+ try {
436
+ await artifact.file("matrix", spec.matrixPath, { title: "穷尽用例矩阵" });
437
+ } catch {
438
+ // 矩阵发布失败则忽略,文件仍在工作区
439
+ }
440
+ const failReport = ["# 预检失败:基线构建不通过", "", "```", (smoke.stdout + "\n" + smoke.stderr).slice(-2000), "```", "", `矩阵已产出:${spec.matrixPath}(${matrixTotal} 例,未执行验证)`].join("\n");
441
+ await writeTmpMarkdown(REPORT_PATH, failReport);
442
+ await artifact.markdown("report", failReport, { title: "穷尽矩阵预检失败报告", primary: true });
443
+ return {
444
+ conclusion: `基线构建失败,未进入实现与执行。穷尽矩阵 ${matrixTotal} 例已产出待用。`,
445
+ findings: [failFinding],
446
+ verified: ["dotnet build Shipyard.Material.sln(预检)"],
447
+ notCovered: ["实现、执行、修复、诊断全部未进行;矩阵未经验证"],
448
+ } as WorkflowReport;
449
+ }
450
+ log("预检构建通过");
451
+
452
+ // ---------- 按域并行实现 ----------
453
+ function implAsk(d: MatrixDomain): string {
454
+ return [
455
+ `你是集成测试实现员,负责穷尽矩阵的「${DOMAIN_NAME[d.domain]}」域(${d.caseIds.length} 例)。把矩阵中本域全部用例实现为一个测试类:命名空间 ${FLOW_NAMESPACE},类名 ${d.testClassName},文件 ${TEST_PROJECT}/FullChain/${d.testClassName}.cs(已存在则先通读再整体重写本类内容;不存在则新建;勿动其他文件)。`,
456
+ ``,
457
+ `材料:`,
458
+ `- 穷尽矩阵:${spec.matrixPath}(先通读总览,再按本域一节逐例实现);`,
459
+ `- 测试基架事实:${JSON.stringify(infra)};`,
460
+ `- 链路侦察事实:${JSON.stringify(chainReports)}。`,
461
+ ``,
462
+ `硬约束:`,
463
+ `- 只允许新建/修改 ${TEST_PROJECT}/FullChain/${d.testClassName}.cs 这一个文件;禁止修改产品代码(backend/、frontend/)与其他测试文件;禁止任何 git 写命令;禁止运行 dotnet build / dotnet test(统一由调度方执行)。`,
464
+ `- 门禁隔离(最高优先级):文件全部内容(含 using)必须整体包在 #if FCLocal 与 #endif 之间——仓库门禁在无该符号下构建与跑测试,卡口一行不动;调度方以 dotnet test -p:DefineConstants=FCLocal 编译执行本文件。`,
465
+ `- 正链造数(硬纪律):凡前置需要 MTO/采购申请/采购订单/到货/入库/出库单据,必须按真实 API 链逐级造出(${FLOW_STAGES.join("→")},采购订单明细必须携带 PurchaseRequestID 关联采购申请,不造无采购申请来源的采购订单);禁止 EF/SQL 直种单据本体或「等价状态」捷径——SQL 播种仅限 UPDATE 类状态微调(守卫/竞态窗口)与 PML、库存行等无创建端点的非单据主数据;调度方会 grep 直种写法(DbSet.Add / INSERT INTO 单据头表)并退回重写。`,
466
+ `- 数据内容完整:造数载荷按矩阵携带全部业务字段(合同号、供应商、采购员、采购组织、计税、单价与双数量口径、仓库/库位/批次等),禁止任意 Guid 占位主数据引用(守卫用例专测非法引用时除外);跨单据关联字段(MTOOrderDetailID/PurchaseRequestID 等)必须随链传递并显式断言。`,
467
+ `- 每条用例一个 [Fact](方法名=用例 id 的下划线形式,如 FC-MTO-001→FC_MTO_001),用例间禁止依赖执行顺序;每例自建自清(唯一后缀播种 + try/finally 按用例 cleanup 先子后头),不得残留孤儿占用。`,
468
+ `- 每条 expected 必须落成显式断言(单据状态、数量回写字段、库存表数量/占用字段、跨单据关联 id、拒绝响应,不许只断言 HTTP 状态码)。`,
469
+ `- 矩阵中因基架/接口限制确实无法驱动的用例:不实现,记入 blockedCases(id+原因),不许静默跳过。`,
470
+ `- 完成后返回 ImplOutcome:filePath=相对路径、implementedCaseIds、blockedCases、note=一句话说明。`,
471
+ ].join("\n");
472
+ }
473
+
474
+ phase("按域并行实现穷尽测试");
475
+ const implByDomain: Record<string, Agent> = {};
476
+ for (const d of spec.domains) implByDomain[d.domain] = agent(`实现-${d.domain}`, { system: IMPL_SYSTEM });
477
+ // 屏障有意为之:执行门要一次性编译全部域的测试文件
478
+ const outcomes = await Promise.all(
479
+ spec.domains.map(async (d) => {
480
+ try {
481
+ return { d, outcome: await implByDomain[d.domain].ask<ImplOutcome>(implAsk(d)) };
482
+ } catch (e) {
483
+ return {
484
+ d,
485
+ outcome: {
486
+ filePath: "",
487
+ implementedCaseIds: [],
488
+ blockedCases: d.caseIds.map((id) => ({ id, reason: `实现员异常:${String(e)}` })),
489
+ note: "实现阶段异常",
490
+ } as ImplOutcome,
491
+ };
492
+ }
493
+ }),
494
+ );
495
+ const outcomeByDomain: Record<string, ImplOutcome> = {};
496
+ for (const o of outcomes) outcomeByDomain[o.d.domain] = o.outcome;
497
+ for (const o of outcomes) {
498
+ report(
499
+ {
500
+ id: o.d.domain,
501
+ name: DOMAIN_NAME[o.d.domain],
502
+ status: o.outcome.implementedCaseIds.length > 0 ? "已实现" : "受阻",
503
+ detail: `实现 ${o.outcome.implementedCaseIds.length} 例 / 受阻 ${o.outcome.blockedCases.length} 例`,
504
+ },
505
+ "groups",
506
+ );
507
+ }
508
+ const implementedTotal = outcomes.reduce((a, o) => a + o.outcome.implementedCaseIds.length, 0);
509
+ const filesWritten = outcomes.filter((o) => o.outcome.filePath).length;
510
+ log(`实现完成:${implementedTotal} 例已实现、${outcomes.reduce((a, o) => a + o.outcome.blockedCases.length, 0)} 例受阻(${filesWritten}/${spec.domains.length} 个文件落盘)`);
511
+
512
+ // 门禁隔离自检:每个生成的测试文件必须整体 #if FCLocal 包裹
513
+ const fcFiles = await files.glob(FC_GLOB);
514
+ let guardMatches = await files.grep("#if FCLocal", FC_GLOB);
515
+ let guarded = new Set(guardMatches.map((m) => m.path));
516
+ let unguarded = fcFiles.filter((f) => !guarded.has(f));
517
+ if (unguarded.length > 0) {
518
+ log(`门禁隔离自检:${unguarded.length} 个文件缺 #if FCLocal 包裹,退回实现员补包裹`);
519
+ await Promise.all(
520
+ unguarded.map((f) => {
521
+ const cls = f.split("/").pop()?.replace(/\.cs$/, "") ?? "";
522
+ const dom = spec.domains.find((d) => d.testClassName === cls)?.domain;
523
+ const target = dom ? implByDomain[dom] : undefined;
524
+ if (!target) return Promise.resolve();
525
+ return target.ask<string>(
526
+ `门禁隔离自检发现 ${f} 未整体包在 #if FCLocal / #endif 之内——该文件会被仓库门禁(无符号构建与跑测试)编译执行,污染权威面。请把该文件全部内容(含 using)整体包进 #if FCLocal ... #endif,禁止改其他文件,完成后回复 OK。`,
527
+ );
528
+ }),
529
+ );
530
+ guardMatches = await files.grep("#if FCLocal", FC_GLOB);
531
+ guarded = new Set(guardMatches.map((m) => m.path));
532
+ unguarded = fcFiles.filter((f) => !guarded.has(f));
533
+ }
534
+ const stillUnguarded = unguarded.length;
535
+ if (stillUnguarded > 0) log(`警告:${stillUnguarded} 个文件仍未包裹,将记入报告(门禁污染风险)`);
536
+ else log(`门禁隔离自检通过:${fcFiles.length} 个文件全部 #if FCLocal 包裹`);
537
+
538
+ // 正链造数自检:生成文件不得直种链上单据本体(MTO/采购申请/采购订单/到货/入库/出库 单据头)——
539
+ // 前置必须走真实 API 链 MTO→采购申请→采购订单→…(PO 从 PR 引入);SQL 播种仅限 UPDATE 类状态微调与 PML/库存行等非单据主数据
540
+ const SEED_RE =
541
+ "\\.(MTOOrders|PurchaseRequests|PurchaseOrders|ArrivalOrders|InboundOrders|OutboundRequests|OutboundOrders)\\.Add(Async)?\\(|Set<(MTOOrder|PurchaseRequest|PurchaseOrder|ArrivalOrder|InboundOrder|OutboundRequest|OutboundOrder)>\\(\\)\\.Add(Async)?\\(|INSERT INTO MM_(PUR_MTOOrder|PUR_PurchaseRequest|PUR_PurchaseOrder|ARR_ArrivalOrder|INB_InboundOrder|ISS_OutboundRequest|ISS_OutboundOrder)\\b";
542
+ let seedHits = await files.grep(SEED_RE, FC_GLOB);
543
+ if (seedHits.length > 0) {
544
+ const seededFiles = Array.from(new Set(seedHits.map((m) => m.path)));
545
+ log(`正链造数自检:${seededFiles.length} 个文件存在直种链上单据本体的写法(共 ${seedHits.length} 处),退回实现员改走真实 API 链`);
546
+ await Promise.all(
547
+ seededFiles.map((f) => {
548
+ const cls = f.split("/").pop()?.replace(/\.cs$/, "") ?? "";
549
+ const dom = spec.domains.find((d) => d.testClassName === cls)?.domain;
550
+ const target = dom ? implByDomain[dom] : undefined;
551
+ if (!target) return Promise.resolve();
552
+ return target.ask<string>(
553
+ `正链造数自检发现 ${f} 存在直种链上单据本体(MTO/采购申请/采购订单/到货/入库/出库 单据头)的写法:\n${seedHits.filter((m) => m.path === f).map((m) => `${m.line}: ${m.text.trim().slice(0, 120)}`).join("\n")}\n硬纪律:这些单据的前置必须按 ${FLOW_STAGES.join("→")} 的顺序以真实 API 逐级造出(采购订单明细带 PurchaseRequestID 关联采购申请),SQL 播种仅限 UPDATE 类状态微调(守卫/竞态窗口)与 PML、库存行等无创建端点的非单据主数据。请把直种处改为真实链造数(断言相应保持),禁止改其他文件,完成后回复 OK。`,
554
+ );
555
+ }),
556
+ );
557
+ seedHits = await files.grep(SEED_RE, FC_GLOB);
558
+ }
559
+ const stillSeedHits = seedHits.length;
560
+ if (stillSeedHits > 0) log(`警告:${stillSeedHits} 处直种链上单据本体的写法未改正(违背正链口径),记入报告`);
561
+ else log("正链造数自检通过:无直种链上单据本体的写法");
562
+
563
+ // 越权写入自检:与侦察期基线比对,任何 git 可见的新增/修改(tmp/ 与 FullChain/ 之外)都是越权
564
+ const statusAfterImpl = await git.status();
565
+ function newPaths(base: string[], now: string[]): string[] {
566
+ const known = new Set(base);
567
+ return now.filter((p) => !known.has(p));
568
+ }
569
+ const leakedPaths = [
570
+ ...newPaths(statusBaseline.staged, statusAfterImpl.staged),
571
+ ...newPaths(statusBaseline.unstaged, statusAfterImpl.unstaged),
572
+ ...newPaths(statusBaseline.untracked, statusAfterImpl.untracked),
573
+ ].filter((p) => !p.startsWith("tmp/") && !p.startsWith("tests/Shipyard.Material.IntegrationTests/FullChain/"));
574
+ if (leakedPaths.length > 0) log(`警告:检测到 ${leakedPaths.length} 个越权新增/修改的文件(不在授权产物路径内):${leakedPaths.slice(0, 5).join("、")}`);
575
+ else log("越权写入自检通过:工作区无本工作流之外的可见变更");
576
+
577
+ // ---------- 执行门 + 修复环 ----------
578
+ function parseFailLines(s: string): string[] {
579
+ const out: string[] = [];
580
+ for (const line of s.split(/\r?\n/)) {
581
+ // 仓库测试栈为 xunit 2.x + VSTest:失败行是「失败/Failed <用例全名> [<耗时> ms]」(本机 zh-CN 实测);[FAIL] 行仅 xunit v3 输出,保留兜底
582
+ const m = /^\s*(?:失败|Failed)\s+(\S+)\s+\[\d/.exec(line) ?? /\]\s+(\S+)\s+\[FAIL\]/.exec(line);
583
+ if (m) out.push(m[1]);
584
+ }
585
+ return out;
586
+ }
587
+ function parseDotnetCounts(s: string): { failed: number; passed: number } | null {
588
+ const failedFirst = /(?:失败|Failed)\s*[::]\s*(\d+)\s*[,,]\s*(?:通过|Passed)\s*[::]\s*(\d+)/.exec(s);
589
+ if (failedFirst) return { failed: Number(failedFirst[1]), passed: Number(failedFirst[2]) };
590
+ const passedFirst = /(?:通过|Passed)\s*[::]\s*(\d+)\s*[,,]\s*(?:失败|Failed)\s*[::]\s*(\d+)/.exec(s);
591
+ return passedFirst ? { failed: Number(passedFirst[2]), passed: Number(passedFirst[1]) } : null;
592
+ }
593
+ function classesFromTests(tests: string[]): string[] {
594
+ const out: string[] = [];
595
+ for (const t of tests) {
596
+ const seg = t.split(".").slice(-2)[0];
597
+ if (seg) out.push(seg);
598
+ }
599
+ return Array.from(new Set(out));
600
+ }
601
+ function classesFromBuildOutput(s: string): string[] {
602
+ const out: string[] = [];
603
+ for (const line of s.split(/\r?\n/)) {
604
+ const m = /FullChain[\\/]([A-Za-z0-9_]+)\.cs/.exec(line);
605
+ if (m) out.push(m[1]);
606
+ }
607
+ return Array.from(new Set(out));
608
+ }
609
+
610
+ phase("构建并执行穷尽测试");
611
+ let lastTest: TestRun | null = null;
612
+ let buildFails = 0;
613
+ let testRounds = 0;
614
+ for (let round = 1; round <= 3; round++) {
615
+ const build = await world.run("dotnet", ["build", TEST_PROJECT, "--nologo", "-v", "q", "-p:DefineConstants=FCLocal"], { timeoutMs: 1800000, output: { tail: 32768 } });
616
+ if (build.exitCode !== 0) {
617
+ buildFails += 1;
618
+ const bad = classesFromBuildOutput(build.stdout + "\n" + build.stderr);
619
+ const uniq = Array.from(
620
+ new Set(
621
+ bad.length > 0
622
+ ? bad.map((c) => spec.domains.find((d) => d.testClassName === c)?.domain).filter((x): x is string => !!x)
623
+ : spec.domains.map((d) => d.domain),
624
+ ),
625
+ );
626
+ log(`第 ${round} 轮构建失败(涉及 ${uniq.length} 个域),交回实现员修复编译错误`);
627
+ await Promise.all(
628
+ uniq.map((dom) =>
629
+ implByDomain[dom].ask<string>(
630
+ `dotnet build(带 FCLocal 符号)第 ${round} 轮失败。请只检查并修复你自己的测试文件里的编译错误,禁止动产品代码与其他文件。错误输出尾部:\n${(build.stdout + "\n" + build.stderr).slice(-4000)}\n修复后回复 OK。`,
631
+ ),
632
+ ),
633
+ );
634
+ continue;
635
+ }
636
+ const test = await world.run("dotnet", ["test", TEST_PROJECT, "--filter", FULLCHAIN_FILTER, "--nologo", "--no-build", "-p:DefineConstants=FCLocal"], { timeoutMs: 1800000, output: { tail: 131072 } });
637
+ testRounds += 1;
638
+ const combined = `${test.stdout}\n${test.stderr}`;
639
+ const failedTests = Array.from(new Set(parseFailLines(combined)));
640
+ const dc = parseDotnetCounts(combined);
641
+ const ok = test.exitCode === 0;
642
+ lastTest = { ok, failed: dc ? dc.failed : failedTests.length, passed: dc ? dc.passed : 0, failedTests, output: combined.slice(-6000) };
643
+ if (ok) {
644
+ log(`第 ${round} 轮全绿:通过 ${lastTest.passed} 个用例`);
645
+ break;
646
+ }
647
+ const failClasses = classesFromTests(failedTests);
648
+ log(`第 ${round} 轮:${failedTests.length} 个用例失败(${failClasses.length} 个域),交回对应实现员(只修测试侧;疑似产品缺陷保持失败并记录)`);
649
+ if (failedTests.length > 0) {
650
+ const failedRun = lastTest;
651
+ await Promise.all(
652
+ failClasses.map((cls) => {
653
+ const dom = spec.domains.find((d) => d.testClassName === cls)?.domain;
654
+ const own = failedTests.filter((t) => t.split(".").slice(-2)[0] === cls);
655
+ if (!dom) return Promise.resolve();
656
+ return implByDomain[dom].ask<ImplOutcome>(
657
+ `你实现的 ${cls} 有 ${own.length} 个用例失败(第 ${round} 轮)。\n失败清单:\n${own.join("\n")}\n失败输出尾部:\n${failedRun.output}\n处理规则:若是测试自身问题(造数、断言、隔离、清理),修测试;若你判断是产品代码缺陷,禁止修改产品代码——保持该用例现状(失败)并在 note 里记「疑似产品缺陷+证据」;修完返回更新后的 ImplOutcome。`,
658
+ );
659
+ }),
660
+ );
661
+ } else {
662
+ // 非零退出但没解析到失败行:测试进程异常
663
+ const run = lastTest;
664
+ await Promise.all(
665
+ spec.domains.map((d) =>
666
+ implByDomain[d.domain].ask<string>(
667
+ `dotnet test 退出码 ${test.exitCode} 但未解析到失败用例行。请检查你的测试文件是否可能导致测试进程异常(fixture 初始化、死循环、线程池耗尽等),只修自己的文件。输出尾部:\n${(run?.output ?? "").slice(-4000)}\n修复后回复 OK。`,
668
+ ),
669
+ ),
670
+ );
671
+ }
672
+ }
673
+
674
+ // ---------- 独立诊断残留失败 ----------
675
+ const diagnoses: FailureDiagnosis[] = [];
676
+ const lt = lastTest;
677
+ if (lt && !lt.ok && lt.failedTests.length > 0) {
678
+ phase("独立诊断残留失败");
679
+ const toDiagnose = lt.failedTests.slice(0, 5);
680
+ log(`${lt.failedTests.length} 个残留失败,独立诊断前 ${toDiagnose.length} 个`);
681
+ const diagResults = await Promise.all(
682
+ toDiagnose.map((t, i) =>
683
+ agent(`诊断员-${i + 1}`, { system: DIAG_SYSTEM }).ask<FailureDiagnosis>(
684
+ [
685
+ `集成测试用例失败,且实现员按「只修测试不改产品」处理后仍未通过。请独立定性:`,
686
+ `失败用例:${t}\n失败输出尾部:\n${lt.output}`,
687
+ `要求:`,
688
+ `1. 读相关测试代码与产品代码定位根因(测试类在 ${TEST_PROJECT}/FullChain/ 下,类名取用例全名倒数第二段);`,
689
+ `2. 用 dotnet test ${TEST_PROJECT} --filter "FullyQualifiedName=${t}" --nologo -p:DefineConstants=FCLocal 单独复跑核实(必须带 -p:DefineConstants=FCLocal,否则本机套件不参与编译、用例不存在;只跑这一个用例,禁止跑全量套件);`,
690
+ `3. rootCause 三选一:产品缺陷 / 测试问题 / 环境问题;`,
691
+ `4. reproduced=是否复现成功;evidence 给 path:line 或复跑输出关键行;conclusion 一句话给用户能行动的结论。`,
692
+ ].join("\n"),
693
+ ),
694
+ ),
695
+ );
696
+ diagnoses.push(...diagResults);
697
+ for (const d of diagnoses) {
698
+ report({
699
+ where: d.test,
700
+ what: `【${d.rootCause}】${d.conclusion}`,
701
+ evidence: d.evidence,
702
+ status: d.reproduced ? "verified" : "unconfirmed",
703
+ severity: d.rootCause === "产品缺陷" ? "high" : d.rootCause === "环境问题" ? "medium" : "low",
704
+ });
705
+ }
706
+ }
707
+
708
+ // ---------- 汇总交付 ----------
709
+ phase("汇总交付问题清单与报告");
710
+ // 收尾恢复权威构建产物:执行门与诊断复跑都用 FCLocal 符号构建过,磁盘上的测试 DLL 可能含本机套件;
711
+ // 门禁入口 run-backend-tests.mjs 是 --no-build,工作流结束后任何门禁重跑都必须面对无符号的权威面产物。
712
+ // 此构建同时是对「生成文件污染权威面」的最终核验:若 #if 包裹有漏,这里会编译不过。
713
+ let restoreExitCode = -1; // -1 = 未执行(无生成文件)
714
+ if (fcFiles.length > 0) {
715
+ const restore = await world.run("dotnet", ["build", "Shipyard.Material.sln", "--nologo", "-v", "q"], { timeoutMs: 1800000, output: { tail: 32768 } });
716
+ restoreExitCode = restore.exitCode;
717
+ if (restore.exitCode === 0) log("收尾恢复构建通过:权威面产物已恢复为无 FCLocal 符号版本,门禁重跑安全");
718
+ else log(`警告:收尾恢复构建失败(exitCode ${restore.exitCode})——无符号构建下权威面编译不过,须人工检查 FullChain/ 生成文件`);
719
+ }
720
+ // 执行后按域回填看板状态
721
+ const failedDomains = new Set<string>();
722
+ if (lt) {
723
+ for (const t of lt.failedTests) {
724
+ const cls = t.split(".").slice(-2)[0];
725
+ const dom = spec.domains.find((d) => d.testClassName === cls)?.domain;
726
+ if (dom) failedDomains.add(dom);
727
+ }
728
+ }
729
+ for (const d of spec.domains) {
730
+ const o = outcomeByDomain[d.domain];
731
+ let status = "已实现";
732
+ if (o && o.implementedCaseIds.length === 0) status = "受阻";
733
+ else if (failedDomains.has(d.domain)) status = "有失败";
734
+ else if (lt && lt.ok) status = "全绿";
735
+ report({ id: d.domain, name: DOMAIN_NAME[d.domain], status, detail: `实现 ${o ? o.implementedCaseIds.length : 0} 例 / 受阻 ${o ? o.blockedCases.length : 0} 例` }, "groups");
736
+ }
737
+
738
+ const blockedAll: { domain: string; id: string; reason: string }[] = [];
739
+ for (const o of outcomes) {
740
+ for (const b of o.outcome.blockedCases) blockedAll.push({ domain: o.d.domain, id: b.id, reason: b.reason });
741
+ }
742
+ const totalFailed = lt ? lt.failed : 0;
743
+
744
+ const findings: Finding[] = [];
745
+ if (stillUnguarded > 0) {
746
+ findings.push({
747
+ where: `${TEST_PROJECT}/FullChain/`,
748
+ what: `${stillUnguarded} 个生成文件未整体 #if FCLocal 包裹——仓库门禁(无符号构建/跑测试)会被污染,须人工包裹或删除后复审`,
749
+ evidence: `files.grep("#if FCLocal") 对照 files.glob 缺口:${unguarded.join("、")}`,
750
+ status: "verified",
751
+ severity: "high",
752
+ });
753
+ }
754
+ if (stillSeedHits > 0) {
755
+ findings.push({
756
+ where: `${TEST_PROJECT}/FullChain/`,
757
+ what: `${stillSeedHits} 处直种链上单据本体的写法未按正链口径改正(前置须真实 API 贯通 MTO→采购申请→采购订单→…),须人工复核`,
758
+ evidence: `files.grep 直种写法残留:${seedHits.slice(0, 5).map((m) => `${m.path}:${m.line}`).join(";")}`,
759
+ status: "verified",
760
+ severity: "high",
761
+ });
762
+ }
763
+ if (leakedPaths.length > 0) {
764
+ findings.push({
765
+ where: leakedPaths.slice(0, 3).join("、"),
766
+ what: `${leakedPaths.length} 个 git 可见路径被新增/修改,超出本工作流授权产物范围(tmp/ 与 FullChain/ 之外),须人工核查`,
767
+ evidence: "git.status() 与侦察期基线比对",
768
+ status: "verified",
769
+ severity: "high",
770
+ });
771
+ }
772
+ if (restoreExitCode > 0) {
773
+ findings.push({
774
+ where: "Shipyard.Material.sln",
775
+ what: "收尾恢复构建失败:无 FCLocal 符号下权威面编译不过,门禁(commit-check 构建步)会被卡住,须人工处理 FullChain/ 生成文件",
776
+ evidence: "dotnet build Shipyard.Material.sln(无符号)非零退出",
777
+ status: "verified",
778
+ severity: "high",
779
+ });
780
+ }
781
+ if (blockedAll.length > 0) {
782
+ findings.push({
783
+ where: outcomes.map((o) => o.outcome.filePath).filter((p) => p).join("、") || "(未创建)",
784
+ what: `${blockedAll.length} 个矩阵用例未能实现(含受阻域说明)`,
785
+ evidence: blockedAll.slice(0, 3).map((b) => `[${DOMAIN_NAME[b.domain]}] ${b.id}: ${b.reason.slice(0, 60)}`).join(";"),
786
+ status: "verified",
787
+ severity: "medium",
788
+ });
789
+ }
790
+ if (lt && totalFailed > 0) {
791
+ findings.push({
792
+ where: lt.failedTests.slice(0, 3).join(";") + (lt.failedTests.length > 3 ? " 等" : ""),
793
+ what: `穷尽用例 ${totalFailed} 个失败(诊断定性见问题清单)`,
794
+ evidence: `dotnet test --filter ${FULLCHAIN_FILTER} -p:DefineConstants=FCLocal(共 ${testRounds} 轮)`,
795
+ status: "verified",
796
+ severity: "high",
797
+ });
798
+ }
799
+ if (!lt) {
800
+ findings.push({
801
+ where: TEST_PROJECT,
802
+ what: `构建门未通过(${buildFails} 轮修复后仍失败),穷尽用例未执行`,
803
+ evidence: "dotnet build(带 FCLocal 符号)持续失败",
804
+ status: "verified",
805
+ severity: "high",
806
+ });
807
+ } else if (!lt.ok && lt.failedTests.length === 0) {
808
+ findings.push({ where: "FullChain 套件", what: "测试进程异常退出,执行结果未判定", evidence: lt.output.slice(-800), status: "verified", severity: "high" });
809
+ }
810
+
811
+ // 发布矩阵(失败则让设计师重写一次)
812
+ let matrixOk = true;
813
+ try {
814
+ await artifact.file("matrix", spec.matrixPath, { title: "穷尽用例矩阵", description: `${matrixTotal} 例 / P0 ${spec.priorityCounts.p0}·P1 ${spec.priorityCounts.p1}·P2 ${spec.priorityCounts.p2}` });
815
+ } catch {
816
+ await designer.ask<string>(`矩阵文件 ${spec.matrixPath} 发布失败(可能不存在或为空)。请立即把完整矩阵重写到该路径,完成后回复 OK。`);
817
+ try {
818
+ await artifact.file("matrix", spec.matrixPath, { title: "穷尽用例矩阵", description: `${matrixTotal} 例 / P0 ${spec.priorityCounts.p0}·P1 ${spec.priorityCounts.p1}·P2 ${spec.priorityCounts.p2}` });
819
+ } catch {
820
+ matrixOk = false;
821
+ }
822
+ }
823
+
824
+ const notCovered: string[] = [
825
+ "并发与竞态场景不在矩阵内(程序集禁并行,并发属既有专项测试)",
826
+ "前端 UI 层与浏览器交互不在范围(本工作流为 API/集成层测试)",
827
+ "FullChain 之外的存量集成测试未重跑,绿红基线以实跑为准;已登记红测试清单见 workflow/papercuts.d/(台账为快照,可能滞后)",
828
+ "穷尽性以侦察事实为界:侦察漏掉的守卫/链路不在矩阵(独立评审已挑缺口,未清零的见问题清单)",
829
+ ];
830
+ if (blockedAll.length > 0) {
831
+ notCovered.push(
832
+ `未实现 ${blockedAll.length} 例:${blockedAll.slice(0, 3).map((b) => `${b.id}(${b.reason.slice(0, 40)})`).join(";")}${blockedAll.length > 3 ? " 等" : ""}`,
833
+ );
834
+ }
835
+ if (lt && !lt.ok && lt.failedTests.length > 5) notCovered.push(`残留失败共 ${lt.failedTests.length} 个,仅独立诊断前 5 个,其余未定性`);
836
+ if (!lt) notCovered.push(`构建门未通过(${buildFails} 轮修复后仍失败),全部用例未执行`);
837
+ else if (!lt.ok && lt.failedTests.length === 0) notCovered.push("测试进程异常退出且未解析到失败行,结果未判定");
838
+
839
+ const verified: string[] = [
840
+ `dotnet build Shipyard.Material.sln:预检 1 次;dotnet build ${TEST_PROJECT}(带 FCLocal 符号):修复重编 ${buildFails} 次`,
841
+ `dotnet test ${TEST_PROJECT} --filter ${FULLCHAIN_FILTER}(带 FCLocal 符号):共 ${testRounds} 轮`,
842
+ `#if FCLocal 门禁隔离自检:files.grep 核对全部 ${fcFiles.length} 个生成文件`,
843
+ `正链造数自检:files.grep 核对直种链上单据本体的写法${stillSeedHits > 0 ? `(残留 ${stillSeedHits} 处,已记问题清单)` : "(无直种,前置均走真实 API 链)"}`,
844
+ `越权写入自检:git.status() 与侦察期基线比对${leakedPaths.length > 0 ? `(检出 ${leakedPaths.length} 个越权路径)` : "(无越权变更)"}`,
845
+ `收尾恢复构建(无 FCLocal 符号):${restoreExitCode === -1 ? "未执行(无生成文件)" : `exitCode ${restoreExitCode},权威面产物已还原`}`,
846
+ "独立评审员(未参与设计)通读穷尽矩阵并逐条对照侦察事实",
847
+ ];
848
+ if (lt && lt.ok && totalFailed === 0) verified.push(`执行门全绿:${implementedTotal} 例穷尽用例全部通过`);
849
+ if (diagnoses.length > 0) verified.push("每个残留失败由独立诊断员单独复跑定性");
850
+
851
+ const mdLines: string[] = [];
852
+ mdLines.push("# 全链路穷尽用例矩阵测试报告", "");
853
+ mdLines.push(`- 链路:${FLOW_STAGES.join("→")}(正向/逆向/守卫/一致性 四类穷尽)`);
854
+ mdLines.push(`- 矩阵:${spec.matrixPath}(${matrixTotal} 例;P0 ${spec.priorityCounts.p0} / P1 ${spec.priorityCounts.p1} / P2 ${spec.priorityCounts.p2})`);
855
+ mdLines.push(`- 域分布:${spec.domains.map((d) => `${DOMAIN_NAME[d.domain]} ${d.caseIds.length} 例`).join(",")}`);
856
+ mdLines.push(`- 测试文件:${TEST_PROJECT}/FullChain/ 下 ${filesWritten} 个(整体 #if FCLocal 包裹,门禁卡口不动)`);
857
+ if (lt) {
858
+ const runNote = lt.ok ? "全绿" : totalFailed > 0 ? `${totalFailed} 个失败` : "测试进程异常,结果未判定";
859
+ mdLines.push(`- 执行:dotnet test(过滤 ${FULLCHAIN_FILTER},共 ${testRounds} 轮)——通过 ${lt.passed} / 失败 ${totalFailed} / 未实现 ${blockedAll.length}(${runNote})`);
860
+ } else {
861
+ mdLines.push(`- 执行:未能完成(构建门未通过(${buildFails} 轮)),通过/失败未判定`);
862
+ }
863
+ mdLines.push(`- 矩阵发布:${matrixOk ? "成功" : "失败(文件仍在工作区)"}`, "");
864
+ if (spec.risks.length > 0) {
865
+ mdLines.push("## 设计口径与风险", "");
866
+ for (const r of spec.risks.slice(0, 6)) mdLines.push(`- ${r}`);
867
+ mdLines.push("");
868
+ }
869
+ if (diagnoses.length > 0 || totalFailed > 0 || blockedAll.length > 0 || stillUnguarded > 0) {
870
+ mdLines.push("## 问题清单", "");
871
+ if (totalFailed > 0 && lt) {
872
+ for (const t of lt.failedTests) mdLines.push(`- 失败:\`${t}\``);
873
+ mdLines.push("");
874
+ }
875
+ for (const d of diagnoses) mdLines.push(`- 定性:\`${d.test}\` —【${d.rootCause}】${d.conclusion}${d.reproduced ? "(已复现)" : "(未复现,仅供参考)"}`);
876
+ if (diagnoses.length > 0) mdLines.push("");
877
+ for (const b of blockedAll) mdLines.push(`- 未实现:[${DOMAIN_NAME[b.domain]}] ${b.id}:${b.reason.slice(0, 80)}`);
878
+ if (blockedAll.length > 0) mdLines.push("");
879
+ for (const f of findings) mdLines.push(`- [${f.severity}/${f.status}] ${f.what}`);
880
+ mdLines.push("");
881
+ }
882
+ mdLines.push("## 未覆盖", "");
883
+ for (const nc of notCovered) mdLines.push(`- ${nc}`);
884
+ const reportMd = mdLines.join("\n");
885
+ await artifact.markdown("report", reportMd, { title: "全链路穷尽用例矩阵测试报告", description: "正向/逆向/守卫/一致性穷尽体检执行结果与问题清单", primary: true });
886
+ await writeTmpMarkdown(REPORT_PATH, reportMd);
887
+
888
+ const defectCount = diagnoses.filter((d) => d.rootCause === "产品缺陷").length;
889
+ const verdictLine = !lt
890
+ ? `构建门未通过(${buildFails} 轮修复后仍失败),未能完成执行判定`
891
+ : lt.ok && totalFailed === 0
892
+ ? `穷尽用例全绿(通过 ${lt.passed} 例)`
893
+ : totalFailed > 0
894
+ ? `有 ${totalFailed} 个用例失败,定性见问题清单`
895
+ : "测试进程异常退出,结果未判定";
896
+ const conclusion = `全链路穷尽矩阵(${DOMAINS.length} 域):${matrixTotal} 例(P0 ${spec.priorityCounts.p0}/P1 ${spec.priorityCounts.p1}/P2 ${spec.priorityCounts.p2}),实现 ${implementedTotal} 例、未实现 ${blockedAll.length} 例;${verdictLine}。${defectCount > 0 ? `其中 ${defectCount} 个失败定性为产品缺陷。` : ""}${stillUnguarded > 0 ? `注意:${stillUnguarded} 个文件未 #if FCLocal 包裹,门禁有被污染风险。` : "生成文件已全部 #if FCLocal 包裹,门禁卡口不受影响。"}${stillSeedHits > 0 ? `注意:${stillSeedHits} 处直种单据写法未按正链口径(MTO→采购申请→采购订单)改正。` : "正链造数自检通过:全部前置走真实 API 链。"}${leakedPaths.length > 0 ? `另有 ${leakedPaths.length} 个越权写入的文件须人工核查。` : ""}测试文件未提交,留待你审阅;报告落盘 ${REPORT_PATH},矩阵落盘 ${spec.matrixPath}。`;
897
+
898
+ return { conclusion, findings, verified, notCovered } as WorkflowReport;