popeye-cli 2.1.0 → 2.7.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 (356) hide show
  1. package/dist/adapters/gemini.d.ts +14 -0
  2. package/dist/adapters/gemini.d.ts.map +1 -1
  3. package/dist/adapters/gemini.js +41 -6
  4. package/dist/adapters/gemini.js.map +1 -1
  5. package/dist/adapters/grok.d.ts +14 -0
  6. package/dist/adapters/grok.d.ts.map +1 -1
  7. package/dist/adapters/grok.js +42 -6
  8. package/dist/adapters/grok.js.map +1 -1
  9. package/dist/adapters/openai.d.ts +10 -0
  10. package/dist/adapters/openai.d.ts.map +1 -1
  11. package/dist/adapters/openai.js +44 -5
  12. package/dist/adapters/openai.js.map +1 -1
  13. package/dist/cli/commands/create.js +1 -1
  14. package/dist/cli/commands/create.js.map +1 -1
  15. package/dist/cli/interactive.d.ts.map +1 -1
  16. package/dist/cli/interactive.js +328 -21
  17. package/dist/cli/interactive.js.map +1 -1
  18. package/dist/generators/all.d.ts.map +1 -1
  19. package/dist/generators/all.js +25 -2
  20. package/dist/generators/all.js.map +1 -1
  21. package/dist/generators/doc-parser.d.ts +21 -6
  22. package/dist/generators/doc-parser.d.ts.map +1 -1
  23. package/dist/generators/doc-parser.js +55 -4
  24. package/dist/generators/doc-parser.js.map +1 -1
  25. package/dist/generators/templates/fullstack.js +1 -1
  26. package/dist/generators/templates/website-components.js +1 -1
  27. package/dist/generators/templates/website-components.js.map +1 -1
  28. package/dist/generators/templates/website-config.d.ts +4 -1
  29. package/dist/generators/templates/website-config.d.ts.map +1 -1
  30. package/dist/generators/templates/website-config.js +17 -11
  31. package/dist/generators/templates/website-config.js.map +1 -1
  32. package/dist/generators/templates/website-conversion.js +1 -1
  33. package/dist/generators/templates/website-conversion.js.map +1 -1
  34. package/dist/generators/templates/website-landing.js +1 -1
  35. package/dist/generators/templates/website-landing.js.map +1 -1
  36. package/dist/generators/templates/website-layout.d.ts +36 -4
  37. package/dist/generators/templates/website-layout.d.ts.map +1 -1
  38. package/dist/generators/templates/website-layout.js +466 -23
  39. package/dist/generators/templates/website-layout.js.map +1 -1
  40. package/dist/generators/templates/website-pricing.js +1 -1
  41. package/dist/generators/templates/website-pricing.js.map +1 -1
  42. package/dist/generators/templates/website-sections.js +1 -1
  43. package/dist/generators/templates/website-sections.js.map +1 -1
  44. package/dist/generators/templates/website-seo.d.ts.map +1 -1
  45. package/dist/generators/templates/website-seo.js +4 -1
  46. package/dist/generators/templates/website-seo.js.map +1 -1
  47. package/dist/generators/templates/website.d.ts +1 -1
  48. package/dist/generators/templates/website.d.ts.map +1 -1
  49. package/dist/generators/templates/website.js +1 -1
  50. package/dist/generators/templates/website.js.map +1 -1
  51. package/dist/generators/website-content-ai.d.ts +52 -0
  52. package/dist/generators/website-content-ai.d.ts.map +1 -0
  53. package/dist/generators/website-content-ai.js +141 -0
  54. package/dist/generators/website-content-ai.js.map +1 -0
  55. package/dist/generators/website-content-scanner.d.ts +1 -1
  56. package/dist/generators/website-content-scanner.d.ts.map +1 -1
  57. package/dist/generators/website-content-scanner.js +98 -1
  58. package/dist/generators/website-content-scanner.js.map +1 -1
  59. package/dist/generators/website-context.d.ts +34 -1
  60. package/dist/generators/website-context.d.ts.map +1 -1
  61. package/dist/generators/website-context.js +131 -9
  62. package/dist/generators/website-context.js.map +1 -1
  63. package/dist/generators/website-debug.d.ts +12 -0
  64. package/dist/generators/website-debug.d.ts.map +1 -1
  65. package/dist/generators/website-debug.js +16 -0
  66. package/dist/generators/website-debug.js.map +1 -1
  67. package/dist/generators/website.d.ts.map +1 -1
  68. package/dist/generators/website.js +26 -4
  69. package/dist/generators/website.js.map +1 -1
  70. package/dist/pipeline/artifact-manager.d.ts.map +1 -1
  71. package/dist/pipeline/artifact-manager.js +3 -0
  72. package/dist/pipeline/artifact-manager.js.map +1 -1
  73. package/dist/pipeline/auto-recovery.d.ts +56 -0
  74. package/dist/pipeline/auto-recovery.d.ts.map +1 -0
  75. package/dist/pipeline/auto-recovery.js +185 -0
  76. package/dist/pipeline/auto-recovery.js.map +1 -0
  77. package/dist/pipeline/change-request.d.ts +39 -0
  78. package/dist/pipeline/change-request.d.ts.map +1 -1
  79. package/dist/pipeline/change-request.js +40 -1
  80. package/dist/pipeline/change-request.js.map +1 -1
  81. package/dist/pipeline/check-runner.d.ts +30 -1
  82. package/dist/pipeline/check-runner.d.ts.map +1 -1
  83. package/dist/pipeline/check-runner.js +122 -1
  84. package/dist/pipeline/check-runner.js.map +1 -1
  85. package/dist/pipeline/command-resolver.d.ts.map +1 -1
  86. package/dist/pipeline/command-resolver.js +33 -2
  87. package/dist/pipeline/command-resolver.js.map +1 -1
  88. package/dist/pipeline/consensus/arbitrator-query.d.ts +22 -0
  89. package/dist/pipeline/consensus/arbitrator-query.d.ts.map +1 -0
  90. package/dist/pipeline/consensus/arbitrator-query.js +70 -0
  91. package/dist/pipeline/consensus/arbitrator-query.js.map +1 -0
  92. package/dist/pipeline/consensus/consensus-runner.d.ts +131 -7
  93. package/dist/pipeline/consensus/consensus-runner.d.ts.map +1 -1
  94. package/dist/pipeline/consensus/consensus-runner.js +809 -35
  95. package/dist/pipeline/consensus/consensus-runner.js.map +1 -1
  96. package/dist/pipeline/cr-lifecycle.d.ts +42 -0
  97. package/dist/pipeline/cr-lifecycle.d.ts.map +1 -0
  98. package/dist/pipeline/cr-lifecycle.js +89 -0
  99. package/dist/pipeline/cr-lifecycle.js.map +1 -0
  100. package/dist/pipeline/gate-engine.d.ts +1 -0
  101. package/dist/pipeline/gate-engine.d.ts.map +1 -1
  102. package/dist/pipeline/gate-engine.js +27 -8
  103. package/dist/pipeline/gate-engine.js.map +1 -1
  104. package/dist/pipeline/migration.d.ts.map +1 -1
  105. package/dist/pipeline/migration.js +3 -26
  106. package/dist/pipeline/migration.js.map +1 -1
  107. package/dist/pipeline/orchestrator.d.ts +1 -1
  108. package/dist/pipeline/orchestrator.d.ts.map +1 -1
  109. package/dist/pipeline/orchestrator.js +311 -16
  110. package/dist/pipeline/orchestrator.js.map +1 -1
  111. package/dist/pipeline/packets/consensus-packet-builder.d.ts +15 -4
  112. package/dist/pipeline/packets/consensus-packet-builder.d.ts.map +1 -1
  113. package/dist/pipeline/packets/consensus-packet-builder.js +29 -17
  114. package/dist/pipeline/packets/consensus-packet-builder.js.map +1 -1
  115. package/dist/pipeline/phases/architecture.d.ts.map +1 -1
  116. package/dist/pipeline/phases/architecture.js +5 -3
  117. package/dist/pipeline/phases/architecture.js.map +1 -1
  118. package/dist/pipeline/phases/audit.d.ts.map +1 -1
  119. package/dist/pipeline/phases/audit.js +5 -3
  120. package/dist/pipeline/phases/audit.js.map +1 -1
  121. package/dist/pipeline/phases/consensus-architecture.d.ts.map +1 -1
  122. package/dist/pipeline/phases/consensus-architecture.js +10 -1
  123. package/dist/pipeline/phases/consensus-architecture.js.map +1 -1
  124. package/dist/pipeline/phases/consensus-master-plan.d.ts.map +1 -1
  125. package/dist/pipeline/phases/consensus-master-plan.js +10 -3
  126. package/dist/pipeline/phases/consensus-master-plan.js.map +1 -1
  127. package/dist/pipeline/phases/consensus-role-plans.d.ts.map +1 -1
  128. package/dist/pipeline/phases/consensus-role-plans.js +10 -1
  129. package/dist/pipeline/phases/consensus-role-plans.js.map +1 -1
  130. package/dist/pipeline/phases/done.d.ts.map +1 -1
  131. package/dist/pipeline/phases/done.js +9 -4
  132. package/dist/pipeline/phases/done.js.map +1 -1
  133. package/dist/pipeline/phases/intake.d.ts +1 -0
  134. package/dist/pipeline/phases/intake.d.ts.map +1 -1
  135. package/dist/pipeline/phases/intake.js +56 -13
  136. package/dist/pipeline/phases/intake.js.map +1 -1
  137. package/dist/pipeline/phases/phase-context.d.ts +2 -0
  138. package/dist/pipeline/phases/phase-context.d.ts.map +1 -1
  139. package/dist/pipeline/phases/phase-context.js +3 -1
  140. package/dist/pipeline/phases/phase-context.js.map +1 -1
  141. package/dist/pipeline/phases/production-gate.d.ts.map +1 -1
  142. package/dist/pipeline/phases/production-gate.js +28 -3
  143. package/dist/pipeline/phases/production-gate.js.map +1 -1
  144. package/dist/pipeline/phases/qa-validation.d.ts.map +1 -1
  145. package/dist/pipeline/phases/qa-validation.js +38 -5
  146. package/dist/pipeline/phases/qa-validation.js.map +1 -1
  147. package/dist/pipeline/phases/recovery-loop.d.ts +2 -0
  148. package/dist/pipeline/phases/recovery-loop.d.ts.map +1 -1
  149. package/dist/pipeline/phases/recovery-loop.js +200 -6
  150. package/dist/pipeline/phases/recovery-loop.js.map +1 -1
  151. package/dist/pipeline/phases/review.d.ts.map +1 -1
  152. package/dist/pipeline/phases/review.js +58 -28
  153. package/dist/pipeline/phases/review.js.map +1 -1
  154. package/dist/pipeline/phases/role-planning.d.ts.map +1 -1
  155. package/dist/pipeline/phases/role-planning.js +20 -5
  156. package/dist/pipeline/phases/role-planning.js.map +1 -1
  157. package/dist/pipeline/phases/stuck.d.ts.map +1 -1
  158. package/dist/pipeline/phases/stuck.js +10 -0
  159. package/dist/pipeline/phases/stuck.js.map +1 -1
  160. package/dist/pipeline/repo-snapshot.d.ts.map +1 -1
  161. package/dist/pipeline/repo-snapshot.js +3 -0
  162. package/dist/pipeline/repo-snapshot.js.map +1 -1
  163. package/dist/pipeline/role-execution-adapter.d.ts +2 -1
  164. package/dist/pipeline/role-execution-adapter.d.ts.map +1 -1
  165. package/dist/pipeline/role-execution-adapter.js +22 -7
  166. package/dist/pipeline/role-execution-adapter.js.map +1 -1
  167. package/dist/pipeline/skill-loader.d.ts +19 -0
  168. package/dist/pipeline/skill-loader.d.ts.map +1 -1
  169. package/dist/pipeline/skill-loader.js +22 -0
  170. package/dist/pipeline/skill-loader.js.map +1 -1
  171. package/dist/pipeline/skills/constitution-generator.d.ts +51 -0
  172. package/dist/pipeline/skills/constitution-generator.d.ts.map +1 -0
  173. package/dist/pipeline/skills/constitution-generator.js +210 -0
  174. package/dist/pipeline/skills/constitution-generator.js.map +1 -0
  175. package/dist/pipeline/skills/coverage-gate.d.ts +44 -0
  176. package/dist/pipeline/skills/coverage-gate.d.ts.map +1 -0
  177. package/dist/pipeline/skills/coverage-gate.js +143 -0
  178. package/dist/pipeline/skills/coverage-gate.js.map +1 -0
  179. package/dist/pipeline/skills/generator.d.ts +65 -0
  180. package/dist/pipeline/skills/generator.d.ts.map +1 -0
  181. package/dist/pipeline/skills/generator.js +221 -0
  182. package/dist/pipeline/skills/generator.js.map +1 -0
  183. package/dist/pipeline/skills/role-map.d.ts +38 -0
  184. package/dist/pipeline/skills/role-map.d.ts.map +1 -0
  185. package/dist/pipeline/skills/role-map.js +234 -0
  186. package/dist/pipeline/skills/role-map.js.map +1 -0
  187. package/dist/pipeline/skills/types.d.ts +47 -0
  188. package/dist/pipeline/skills/types.d.ts.map +1 -0
  189. package/dist/pipeline/skills/types.js +5 -0
  190. package/dist/pipeline/skills/types.js.map +1 -0
  191. package/dist/pipeline/skills/usage-registry.d.ts +48 -0
  192. package/dist/pipeline/skills/usage-registry.d.ts.map +1 -0
  193. package/dist/pipeline/skills/usage-registry.js +55 -0
  194. package/dist/pipeline/skills/usage-registry.js.map +1 -0
  195. package/dist/pipeline/strategy-context.d.ts +20 -0
  196. package/dist/pipeline/strategy-context.d.ts.map +1 -0
  197. package/dist/pipeline/strategy-context.js +55 -0
  198. package/dist/pipeline/strategy-context.js.map +1 -0
  199. package/dist/pipeline/type-defs/artifacts.d.ts +30 -5
  200. package/dist/pipeline/type-defs/artifacts.d.ts.map +1 -1
  201. package/dist/pipeline/type-defs/artifacts.js +5 -0
  202. package/dist/pipeline/type-defs/artifacts.js.map +1 -1
  203. package/dist/pipeline/type-defs/audit.d.ts +28 -13
  204. package/dist/pipeline/type-defs/audit.d.ts.map +1 -1
  205. package/dist/pipeline/type-defs/checks.d.ts +19 -8
  206. package/dist/pipeline/type-defs/checks.d.ts.map +1 -1
  207. package/dist/pipeline/type-defs/checks.js +4 -0
  208. package/dist/pipeline/type-defs/checks.js.map +1 -1
  209. package/dist/pipeline/type-defs/packets.d.ts +119 -18
  210. package/dist/pipeline/type-defs/packets.d.ts.map +1 -1
  211. package/dist/pipeline/type-defs/packets.js +17 -1
  212. package/dist/pipeline/type-defs/packets.js.map +1 -1
  213. package/dist/pipeline/type-defs/state.d.ts +165 -16
  214. package/dist/pipeline/type-defs/state.d.ts.map +1 -1
  215. package/dist/pipeline/type-defs/state.js +26 -1
  216. package/dist/pipeline/type-defs/state.js.map +1 -1
  217. package/dist/shared/text-utils.d.ts +23 -0
  218. package/dist/shared/text-utils.d.ts.map +1 -0
  219. package/dist/shared/text-utils.js +66 -0
  220. package/dist/shared/text-utils.js.map +1 -0
  221. package/dist/shared/website-strategy-format.d.ts +18 -0
  222. package/dist/shared/website-strategy-format.d.ts.map +1 -0
  223. package/dist/shared/website-strategy-format.js +47 -0
  224. package/dist/shared/website-strategy-format.js.map +1 -0
  225. package/dist/state/index.d.ts +2 -0
  226. package/dist/state/index.d.ts.map +1 -1
  227. package/dist/state/index.js +57 -8
  228. package/dist/state/index.js.map +1 -1
  229. package/dist/types/consensus.d.ts +1 -0
  230. package/dist/types/consensus.d.ts.map +1 -1
  231. package/dist/types/consensus.js.map +1 -1
  232. package/dist/types/website-strategy.d.ts +1 -1
  233. package/dist/types/workflow.d.ts +447 -0
  234. package/dist/types/workflow.d.ts.map +1 -1
  235. package/dist/types/workflow.js +3 -0
  236. package/dist/types/workflow.js.map +1 -1
  237. package/dist/upgrade/handlers.d.ts.map +1 -1
  238. package/dist/upgrade/handlers.js +6 -3
  239. package/dist/upgrade/handlers.js.map +1 -1
  240. package/dist/workflow/consensus.d.ts.map +1 -1
  241. package/dist/workflow/consensus.js +1 -0
  242. package/dist/workflow/consensus.js.map +1 -1
  243. package/dist/workflow/website-strategy.d.ts.map +1 -1
  244. package/dist/workflow/website-strategy.js +2 -29
  245. package/dist/workflow/website-strategy.js.map +1 -1
  246. package/dist/workflow/website-updater.d.ts.map +1 -1
  247. package/dist/workflow/website-updater.js +3 -2
  248. package/dist/workflow/website-updater.js.map +1 -1
  249. package/package.json +1 -1
  250. package/src/adapters/gemini.ts +51 -6
  251. package/src/adapters/grok.ts +51 -6
  252. package/src/adapters/openai.ts +53 -5
  253. package/src/cli/commands/create.ts +1 -1
  254. package/src/cli/interactive.ts +337 -20
  255. package/src/generators/all.ts +25 -2
  256. package/src/generators/doc-parser.ts +75 -15
  257. package/src/generators/templates/fullstack.ts +1 -1
  258. package/src/generators/templates/website-components.ts +1 -1
  259. package/src/generators/templates/website-config.ts +23 -11
  260. package/src/generators/templates/website-conversion.ts +1 -1
  261. package/src/generators/templates/website-landing.ts +1 -1
  262. package/src/generators/templates/website-layout.ts +491 -23
  263. package/src/generators/templates/website-pricing.ts +1 -1
  264. package/src/generators/templates/website-sections.ts +1 -1
  265. package/src/generators/templates/website-seo.ts +4 -1
  266. package/src/generators/templates/website.ts +3 -0
  267. package/src/generators/website-content-ai.ts +186 -0
  268. package/src/generators/website-content-scanner.ts +113 -1
  269. package/src/generators/website-context.ts +151 -12
  270. package/src/generators/website-debug.ts +26 -0
  271. package/src/generators/website.ts +28 -3
  272. package/src/pipeline/artifact-manager.ts +3 -0
  273. package/src/pipeline/auto-recovery.ts +283 -0
  274. package/src/pipeline/change-request.ts +63 -1
  275. package/src/pipeline/check-runner.ts +141 -2
  276. package/src/pipeline/command-resolver.ts +34 -2
  277. package/src/pipeline/consensus/arbitrator-query.ts +101 -0
  278. package/src/pipeline/consensus/consensus-runner.ts +1099 -42
  279. package/src/pipeline/cr-lifecycle.ts +103 -0
  280. package/src/pipeline/gate-engine.ts +36 -8
  281. package/src/pipeline/migration.ts +5 -30
  282. package/src/pipeline/orchestrator.ts +367 -16
  283. package/src/pipeline/packets/consensus-packet-builder.ts +44 -18
  284. package/src/pipeline/phases/architecture.ts +6 -3
  285. package/src/pipeline/phases/audit.ts +6 -3
  286. package/src/pipeline/phases/consensus-architecture.ts +10 -1
  287. package/src/pipeline/phases/consensus-master-plan.ts +10 -3
  288. package/src/pipeline/phases/consensus-role-plans.ts +10 -1
  289. package/src/pipeline/phases/done.ts +15 -4
  290. package/src/pipeline/phases/intake.ts +67 -14
  291. package/src/pipeline/phases/phase-context.ts +6 -1
  292. package/src/pipeline/phases/production-gate.ts +41 -3
  293. package/src/pipeline/phases/qa-validation.ts +51 -5
  294. package/src/pipeline/phases/recovery-loop.ts +229 -7
  295. package/src/pipeline/phases/review.ts +73 -30
  296. package/src/pipeline/phases/role-planning.ts +23 -5
  297. package/src/pipeline/phases/stuck.ts +10 -0
  298. package/src/pipeline/repo-snapshot.ts +3 -0
  299. package/src/pipeline/role-execution-adapter.ts +30 -4
  300. package/src/pipeline/skill-loader.ts +33 -0
  301. package/src/pipeline/skills/constitution-generator.ts +236 -0
  302. package/src/pipeline/skills/coverage-gate.ts +199 -0
  303. package/src/pipeline/skills/generator.ts +287 -0
  304. package/src/pipeline/skills/role-map.ts +248 -0
  305. package/src/pipeline/skills/types.ts +53 -0
  306. package/src/pipeline/skills/usage-registry.ts +87 -0
  307. package/src/pipeline/strategy-context.ts +60 -0
  308. package/src/pipeline/type-defs/artifacts.ts +5 -0
  309. package/src/pipeline/type-defs/checks.ts +4 -0
  310. package/src/pipeline/type-defs/packets.ts +18 -1
  311. package/src/pipeline/type-defs/state.ts +26 -1
  312. package/src/shared/text-utils.ts +70 -0
  313. package/src/shared/website-strategy-format.ts +56 -0
  314. package/src/state/index.ts +60 -8
  315. package/src/types/consensus.ts +1 -0
  316. package/src/types/workflow.ts +6 -0
  317. package/src/upgrade/handlers.ts +9 -3
  318. package/src/workflow/consensus.ts +1 -0
  319. package/src/workflow/website-strategy.ts +2 -36
  320. package/src/workflow/website-updater.ts +4 -2
  321. package/tests/adapters/gemini.test.ts +165 -0
  322. package/tests/adapters/grok.test.ts +137 -0
  323. package/tests/adapters/openai.test.ts +128 -0
  324. package/tests/generators/doc-parser.test.ts +88 -9
  325. package/tests/generators/quality-gate.test.ts +19 -3
  326. package/tests/generators/website-components.test.ts +34 -0
  327. package/tests/generators/website-content-ai.test.ts +308 -0
  328. package/tests/generators/website-content-scanner.test.ts +86 -0
  329. package/tests/generators/website-context.test.ts +3 -2
  330. package/tests/integration/smokestack-scaffold.test.ts +385 -0
  331. package/tests/pipeline/auto-recovery.test.ts +337 -0
  332. package/tests/pipeline/change-request.test.ts +70 -0
  333. package/tests/pipeline/command-resolver.test.ts +42 -0
  334. package/tests/pipeline/consensus/arbitrator-query.test.ts +107 -0
  335. package/tests/pipeline/consensus-runner.test.ts +1333 -10
  336. package/tests/pipeline/consensus-scoring.test.ts +602 -18
  337. package/tests/pipeline/gate-engine.test.ts +34 -0
  338. package/tests/pipeline/install-check.test.ts +261 -0
  339. package/tests/pipeline/migration.test.ts +4 -3
  340. package/tests/pipeline/orchestrator.test.ts +1506 -15
  341. package/tests/pipeline/packets/builders.test.ts +29 -6
  342. package/tests/pipeline/phases/role-planning.strategy.test.ts +204 -0
  343. package/tests/pipeline/pipeline-persistence.test.ts +230 -0
  344. package/tests/pipeline/recovery-loop-guidance.test.ts +280 -0
  345. package/tests/pipeline/role-execution-adapter.test.ts +88 -0
  346. package/tests/pipeline/skills/constitution-generator.test.ts +201 -0
  347. package/tests/pipeline/skills/coverage-gate.test.ts +370 -0
  348. package/tests/pipeline/skills/generator.test.ts +213 -0
  349. package/tests/pipeline/skills/role-map.test.ts +198 -0
  350. package/tests/pipeline/skills/usage-registry.test.ts +114 -0
  351. package/tests/pipeline/strategy-context.test.ts +148 -0
  352. package/tests/shared/text-utils.test.ts +155 -0
  353. package/tests/state/progress-analysis.test.ts +375 -0
  354. package/tests/upgrade/handlers.test.ts +33 -2
  355. package/tests/workflow/consensus.test.ts +6 -0
  356. package/tsconfig.json +1 -1
@@ -11,13 +11,17 @@
11
11
  */
12
12
  import { readFileSync, existsSync } from 'node:fs';
13
13
  import { join } from 'node:path';
14
- import { createDefaultPipelineState } from './types.js';
14
+ import { createDefaultPipelineState, toLegacyPhase } from './types.js';
15
15
  import { createGateEngine } from './gate-engine.js';
16
16
  import { createArtifactManager } from './artifact-manager.js';
17
17
  import { createSkillLoader } from './skill-loader.js';
18
18
  import { createConsensusRunner } from './consensus/consensus-runner.js';
19
19
  import { verifyConstitution } from './constitution.js';
20
+ import { SkillUsageRegistry } from './skills/usage-registry.js';
21
+ import { runSkillCoverageCheck } from './check-runner.js';
22
+ import { resolveActiveCR, checkStagnation } from './cr-lifecycle.js';
20
23
  import { runIntake, runConsensusMasterPlan, runArchitecture, runConsensusArchitecture, runRolePlanning, runConsensusRolePlans, runImplementation, runQaValidation, runReview, runAudit, runProductionGate, runRecoveryLoop, runDone, runStuck, } from './phases/index.js';
24
+ import { updateState } from '../state/index.js';
21
25
  // ─── Phase Dispatch Map ──────────────────────────────────
22
26
  const PHASE_HANDLERS = {
23
27
  INTAKE: runIntake,
@@ -42,17 +46,21 @@ const CR_CHECK_PHASES = new Set(['REVIEW', 'AUDIT']);
42
46
  export async function runPipeline(options) {
43
47
  const { projectDir, state, consensusConfig, additionalContext, onPhaseStart, onPhaseComplete, onProgress, } = options;
44
48
  // Initialize pipeline state if needed
45
- const pipeline = state.pipeline
46
- ?? createDefaultPipelineState();
49
+ const pipeline = state.pipeline ?? createDefaultPipelineState();
50
+ // Attach pipeline to state so persistence includes it
51
+ state.pipeline = pipeline;
47
52
  // Persist user guidance in pipeline state so it survives resume
48
53
  if (additionalContext && !pipeline.sessionGuidance) {
49
54
  pipeline.sessionGuidance = additionalContext;
50
55
  }
56
+ // Initialize skill usage events array (v2.2.1)
57
+ pipeline.skillUsageEvents = pipeline.skillUsageEvents ?? [];
58
+ const skillUsageRegistry = new SkillUsageRegistry(pipeline.skillUsageEvents);
51
59
  // Create context dependencies
52
60
  const gateEngine = createGateEngine();
53
61
  const artifactManager = createArtifactManager(projectDir);
54
62
  const skillLoader = createSkillLoader(projectDir);
55
- const consensusRunner = createConsensusRunner(projectDir, consensusConfig);
63
+ const consensusRunner = createConsensusRunner(projectDir, consensusConfig, skillLoader, skillUsageRegistry);
56
64
  // Ensure docs structure
57
65
  artifactManager.ensureDocsStructure();
58
66
  const context = {
@@ -63,6 +71,7 @@ export async function runPipeline(options) {
63
71
  artifactManager,
64
72
  gateEngine,
65
73
  consensusRunner,
74
+ skillUsageRegistry,
66
75
  };
67
76
  let phase = pipeline.pipelinePhase;
68
77
  let failedPhase = null;
@@ -95,6 +104,19 @@ export async function runPipeline(options) {
95
104
  };
96
105
  }
97
106
  onPhaseComplete?.(phase, result);
107
+ // Log phase outcome — critical for diagnosing pipeline loops
108
+ if (!result.success) {
109
+ onProgress?.(`Phase ${phase} FAILED: ${result.message}${result.error ? ` — ${result.error}` : ''}`);
110
+ }
111
+ // v2.2.1: Run skill coverage check before gates that require it
112
+ if (phase === 'CONSENSUS_ROLE_PLANS' || phase === 'PRODUCTION_GATE') {
113
+ const coverageResult = runSkillCoverageCheck(pipeline, phase);
114
+ const phaseChecks = pipeline.gateChecks[phase] ?? [];
115
+ // Replace any existing skill_coverage check result
116
+ const filtered = phaseChecks.filter((c) => c.check_type !== 'skill_coverage');
117
+ filtered.push(coverageResult);
118
+ pipeline.gateChecks[phase] = filtered;
119
+ }
98
120
  // v1.1: Verify constitution integrity before evaluating gate
99
121
  const constitutionCheck = verifyConstitution(pipeline, projectDir);
100
122
  // Evaluate gate with constitution verification result
@@ -106,47 +128,168 @@ export async function runPipeline(options) {
106
128
  mergeGateResult(pipeline, phase, gateResult);
107
129
  if (gateResult.pass) {
108
130
  // ─── PASS ────────────────────────────────────────
131
+ // v2.7.0: Clear failedPhase when the originally-failed phase now passes.
132
+ // INVARIANT: This is the ONLY place failedPhase is cleared during the main loop.
133
+ // It must remain set throughout the entire recovery traversal to guard budget resets.
134
+ if (pipeline.failedPhase === phase) {
135
+ pipeline.failedPhase = undefined;
136
+ pipeline.recoveryBaselineFailedCheckCount = undefined;
137
+ }
138
+ // v2.4.9: Resolve the active CR after its routed phase passes
139
+ if (pipeline.activeChangeRequestId) {
140
+ resolveActiveCR(pipeline, onProgress);
141
+ }
109
142
  // v1.1: Check for pending CRs after REVIEW/AUDIT — route to consensus before continuing
110
143
  if (CR_CHECK_PHASES.has(phase)) {
111
144
  const crRoute = getNextCRRoute(pipeline);
112
145
  if (crRoute) {
113
146
  onProgress?.(`CR ${crRoute.cr_id} routing to ${crRoute.target_phase}`);
147
+ // v2.5.4: CR routing to a new phase — reset recovery budget
148
+ if (crRoute.target_phase !== phase && pipeline.recoveryCount > 0) {
149
+ onProgress?.(`Recovery budget reset: ${pipeline.recoveryCount} -> 0 (CR routing ${phase} -> ${crRoute.target_phase})`);
150
+ pipeline.recoveryCount = 0;
151
+ pipeline.lastRewindTarget = undefined;
152
+ }
153
+ pipeline.activeChangeRequestId = crRoute.cr_id;
114
154
  phase = crRoute.target_phase;
115
155
  pipeline.pipelinePhase = phase;
156
+ // v2.5.0: Stagnation check before continue (otherwise skipped by the continue)
157
+ if (checkStagnation(pipeline, onProgress)) {
158
+ phase = 'STUCK';
159
+ pipeline.pipelinePhase = phase;
160
+ }
161
+ // Persist before continue (otherwise CR-routed phase is lost on crash)
162
+ try {
163
+ await updateState(projectDir, { pipeline, phase: toLegacyPhase(phase) });
164
+ }
165
+ catch { /* non-fatal */ }
116
166
  continue;
117
167
  }
118
168
  }
119
169
  if (phase === 'RECOVERY_LOOP') {
120
170
  // Recovery succeeded. RCA may specify rewind target.
121
171
  const rca = getLatestRCA(pipeline, projectDir);
122
- if (rca?.requires_phase_rewind_to) {
123
- phase = rca.requires_phase_rewind_to;
172
+ let rewindTarget = rca?.requires_phase_rewind_to;
173
+ // v2.4.6: Detect repeated same-target rewind — if we already rewound
174
+ // to this target last iteration and it didn't help, skip the rewind
175
+ // and re-test the failed phase directly.
176
+ if (rewindTarget && rewindTarget === pipeline.lastRewindTarget) {
177
+ onProgress?.(`Repeated rewind to ${rewindTarget} detected ` +
178
+ `(recovery #${pipeline.recoveryCount}) — re-testing ` +
179
+ `${failedPhase ?? 'QA_VALIDATION'} directly`);
180
+ rewindTarget = undefined;
124
181
  }
125
- else {
126
- // Retest the phase that failed
127
- phase = failedPhase ?? 'QA_VALIDATION';
182
+ // Determine effective target
183
+ const effectiveTarget = rewindTarget ?? failedPhase ?? 'QA_VALIDATION';
184
+ phase = effectiveTarget;
185
+ // Record only the actual rewind target taken (not undefined when skipped)
186
+ pipeline.lastRewindTarget = rewindTarget;
187
+ // v2.4.6: Clear stale gate data so the re-entered phase evaluates fresh
188
+ if (failedPhase) {
189
+ delete pipeline.gateResults[failedPhase];
190
+ delete pipeline.gateChecks[failedPhase];
128
191
  }
129
192
  failedPhase = null;
130
193
  }
131
194
  else {
132
195
  // Normal progression
133
- phase = gateEngine.getNextPhase(phase, gateResult);
196
+ const nextPhase = gateEngine.getNextPhase(phase, gateResult);
197
+ // v2.5.4: Reset recovery budget on forward phase change.
198
+ // Each phase gets a fresh budget — prevents a single contentious consensus
199
+ // from consuming all iterations, leaving later phases with zero.
200
+ // v2.7.0: Don't reset budget during recovery traversal.
201
+ // failedPhase stays set until the originally-failed phase passes, so
202
+ // intermediate forward transitions (IMPL→QA→REVIEW→AUDIT) are skipped.
203
+ if (nextPhase !== phase && pipeline.recoveryCount > 0 && !pipeline.failedPhase) {
204
+ onProgress?.(`Recovery budget reset: ${pipeline.recoveryCount} -> 0 (advancing ${phase} -> ${nextPhase})`);
205
+ pipeline.recoveryCount = 0;
206
+ pipeline.lastRewindTarget = undefined;
207
+ }
208
+ phase = nextPhase;
134
209
  }
135
210
  }
136
211
  else {
137
212
  // ─── FAIL ────────────────────────────────────────
213
+ onProgress?.(`Gate FAILED for ${phase}: ${gateResult.blockers.join('; ')}`);
214
+ // v2.7.0: Regression detection — recovery made things worse than the original failure
215
+ if (pipeline.failedPhase === phase &&
216
+ pipeline.recoveryBaselineFailedCheckCount !== undefined &&
217
+ (gateResult.failedChecks.length + gateResult.missingArtifacts.length) > pipeline.recoveryBaselineFailedCheckCount) {
218
+ onProgress?.(`[regression] Recovery worsened ${phase}: ` +
219
+ `${pipeline.recoveryBaselineFailedCheckCount} -> ` +
220
+ `${gateResult.failedChecks.length + gateResult.missingArtifacts.length} failing checks. ` +
221
+ `Treating budget as exhausted.`);
222
+ pipeline.recoveryCount = pipeline.maxRecoveryIterations;
223
+ }
138
224
  if (pipeline.recoveryCount >= pipeline.maxRecoveryIterations) {
139
- phase = 'STUCK';
225
+ const exhaustedPhase = phase; // capture before any reassignment
226
+ // v2.6.0: One auto-recovery attempt before STUCK
227
+ const arbitratorConfigured = !!(consensusConfig?.arbitrator);
228
+ if (!pipeline.autoRecoveryResult && arbitratorConfigured) {
229
+ onProgress?.(`[auto-recovery] Budget exhausted at ${exhaustedPhase}. Consulting arbitrator...`);
230
+ try {
231
+ const { attemptAutoRecovery } = await import('./auto-recovery.js');
232
+ const result = await attemptAutoRecovery({
233
+ pipeline, projectDir, artifactManager, consensusConfig,
234
+ });
235
+ pipeline.autoRecoveryResult = result.success ? 'success' : 'invalid';
236
+ if (result.artifact)
237
+ pipeline.artifacts.push(result.artifact);
238
+ if (result.success && result.guidance) {
239
+ onProgress?.(`[auto-recovery] Strategic guidance received (${result.guidance.length} chars). Resetting budget.`);
240
+ pipeline.recoveryCount = 0;
241
+ pipeline.lastRewindTarget = undefined;
242
+ // Stay on the failed phase — let the normal loop re-execute it
243
+ // with the injected strategic guidance
244
+ phase = exhaustedPhase;
245
+ pipeline.pipelinePhase = phase;
246
+ pipeline.failedPhase = exhaustedPhase;
247
+ // Clear stale gate data so re-entry evaluates fresh
248
+ delete pipeline.gateResults[exhaustedPhase];
249
+ delete pipeline.gateChecks[exhaustedPhase];
250
+ // Continue main loop (don't fall through to STUCK)
251
+ }
252
+ else {
253
+ onProgress?.(`[auto-recovery] No useful guidance. Entering STUCK.`);
254
+ phase = 'STUCK';
255
+ }
256
+ }
257
+ catch (err) {
258
+ pipeline.autoRecoveryResult = err?.message?.includes('timeout') ? 'timeout' : 'error';
259
+ onProgress?.(`[auto-recovery] Failed: ${err instanceof Error ? err.message : 'unknown'}. Entering STUCK.`);
260
+ phase = 'STUCK';
261
+ }
262
+ }
263
+ else {
264
+ phase = 'STUCK';
265
+ }
140
266
  }
141
267
  else {
268
+ // v2.7.0: Capture baseline for fresh failure or when failure origin changes
269
+ if (pipeline.recoveryBaselineFailedCheckCount === undefined ||
270
+ pipeline.failedPhase !== phase // Different phase failing — new recovery origin
271
+ ) {
272
+ pipeline.recoveryBaselineFailedCheckCount = gateResult.failedChecks.length + gateResult.missingArtifacts.length;
273
+ }
142
274
  failedPhase = phase;
143
275
  pipeline.failedPhase = phase;
144
276
  phase = 'RECOVERY_LOOP';
145
277
  pipeline.recoveryCount++;
146
278
  }
147
279
  }
280
+ // v2.5.0: Stagnation detection — shared helper checks rolling signature window
281
+ if (checkStagnation(pipeline, onProgress)) {
282
+ phase = 'STUCK';
283
+ }
148
284
  // Update pipeline phase in state
149
285
  pipeline.pipelinePhase = phase;
286
+ // v2.4.5b: Persist pipeline state after each phase transition (crash safety)
287
+ try {
288
+ await updateState(projectDir, { pipeline, phase: toLegacyPhase(phase) });
289
+ }
290
+ catch (persistErr) {
291
+ onProgress?.(`Warning: Failed to persist pipeline state: ${persistErr instanceof Error ? persistErr.message : String(persistErr)}`);
292
+ }
150
293
  onProgress?.(`Transitioning to: ${phase}`);
151
294
  }
152
295
  // ─── Terminal State ────────────────────────────────────
@@ -162,6 +305,13 @@ export async function runPipeline(options) {
162
305
  }
163
306
  }
164
307
  }
308
+ // Persist final pipeline state (DONE or STUCK)
309
+ try {
310
+ await updateState(projectDir, { pipeline, phase: toLegacyPhase(phase) });
311
+ }
312
+ catch {
313
+ // Best-effort for terminal persistence
314
+ }
165
315
  return {
166
316
  success: phase === 'DONE',
167
317
  finalPhase: phase,
@@ -172,9 +322,153 @@ export async function runPipeline(options) {
172
322
  : undefined,
173
323
  };
174
324
  }
175
- /** Resume pipeline from saved state */
325
+ /** Resume pipeline from saved state — with STUCK recovery (v2.4.5) */
176
326
  export async function resumePipeline(options) {
177
- // Resume is the same as run — it picks up from pipeline.pipelinePhase
327
+ const pipeline = options.state.pipeline;
328
+ // v2.5.3: Normalize stale legacy status when pipeline is STUCK.
329
+ // completeProject() may have set status='complete' before the pipeline entered STUCK,
330
+ // leaving inconsistent state. Fix on load so the display layer never sees the lie.
331
+ if (pipeline &&
332
+ (pipeline.pipelinePhase === 'STUCK' || pipeline.pipelinePhase === 'RECOVERY_LOOP') &&
333
+ options.state.status === 'complete') {
334
+ options.state.status = 'in-progress';
335
+ try {
336
+ await updateState(options.projectDir, { status: 'in-progress' });
337
+ }
338
+ catch {
339
+ // Best-effort — display layer override in interactive.ts handles it regardless
340
+ }
341
+ }
342
+ // v2.4.8: RECOVERY_LOOP with remaining attempts — auto-resume without guidance.
343
+ // Must check this BEFORE the STUCK branch because RECOVERY_LOOP with exhausted
344
+ // attempts falls through to the guidance-required path below.
345
+ if (pipeline?.pipelinePhase === 'RECOVERY_LOOP' &&
346
+ pipeline?.failedPhase &&
347
+ pipeline.recoveryCount < (pipeline.maxRecoveryIterations ?? 5)) {
348
+ // Reset to the failed phase so the main loop re-enters. Do NOT reset
349
+ // recoveryCount — the pipeline retains its remaining iteration budget.
350
+ // Do NOT clear lastRewindTarget — preserve repeated-rewind detection.
351
+ pipeline.pipelinePhase = pipeline.failedPhase;
352
+ delete pipeline.gateResults[pipeline.failedPhase];
353
+ delete pipeline.gateChecks[pipeline.failedPhase];
354
+ options.onProgress?.(`[resume] Auto-resuming from RECOVERY_LOOP: resetting to ${pipeline.failedPhase}, ` +
355
+ `recoveryCount ${pipeline.recoveryCount}/${pipeline.maxRecoveryIterations}`);
356
+ }
357
+ else if (
358
+ // v2.4.7: STUCK (or RECOVERY_LOOP with exhausted attempts) requires user guidance.
359
+ (pipeline?.pipelinePhase === 'STUCK' ||
360
+ (pipeline?.pipelinePhase === 'RECOVERY_LOOP' &&
361
+ pipeline.recoveryCount >= (pipeline.maxRecoveryIterations ?? 5))) &&
362
+ pipeline?.failedPhase) {
363
+ // v2.5.2: Purge legacy CRs without drift_key (from pre-v2.5.0 infinite loop).
364
+ // These are orphaned — no drift_key means they can never be deduplicated or resolved.
365
+ // Runs unconditionally (before guidance check) so cleanup persists even without guidance.
366
+ if (pipeline.pendingChangeRequests) {
367
+ const before = pipeline.pendingChangeRequests.length;
368
+ pipeline.pendingChangeRequests = pipeline.pendingChangeRequests.filter((cr) => cr.drift_key != null || cr.status === 'proposed');
369
+ const purged = before - pipeline.pendingChangeRequests.length;
370
+ if (purged > 0) {
371
+ options.onProgress?.(`[resume] Purged ${purged} legacy CRs without drift_key`);
372
+ }
373
+ }
374
+ // Clear stale activeChangeRequestId if the referenced CR was purged
375
+ if (pipeline.activeChangeRequestId &&
376
+ !pipeline.pendingChangeRequests?.some((cr) => cr.cr_id === pipeline.activeChangeRequestId)) {
377
+ options.onProgress?.(`[resume] Cleared stale activeChangeRequestId: ${pipeline.activeChangeRequestId}`);
378
+ pipeline.activeChangeRequestId = undefined;
379
+ }
380
+ const guidance = options.additionalContext?.trim() ?? '';
381
+ if (guidance.length > 0) {
382
+ // User provided guidance — allow one more retry
383
+ const prevRecovery = pipeline.recoveryCount;
384
+ pipeline.pipelinePhase = pipeline.failedPhase;
385
+ pipeline.recoveryCount = 0;
386
+ pipeline.lastRewindTarget = undefined;
387
+ pipeline.autoRecoveryResult = undefined; // v2.6.0: Fresh auto-recovery budget after user guidance
388
+ // Clear stale gate results and checks for the failed phase
389
+ delete pipeline.gateResults[pipeline.failedPhase];
390
+ delete pipeline.gateChecks[pipeline.failedPhase];
391
+ options.onProgress?.(`[resume] Recovering from ${pipeline.pipelinePhase}: resetting to ${pipeline.failedPhase}, ` +
392
+ `recoveryCount ${prevRecovery} -> 0 (user provided guidance)`);
393
+ }
394
+ else {
395
+ // No guidance — v2.6.0: attempt auto-recovery before giving up
396
+ const arbitratorConfigured = !!(options.consensusConfig?.arbitrator);
397
+ if (!pipeline.autoRecoveryResult && arbitratorConfigured) {
398
+ options.onProgress?.(`[resume] No guidance provided. Attempting auto-recovery via arbitrator...`);
399
+ try {
400
+ const artifactManager = createArtifactManager(options.projectDir);
401
+ const { attemptAutoRecovery } = await import('./auto-recovery.js');
402
+ const result = await attemptAutoRecovery({
403
+ pipeline,
404
+ projectDir: options.projectDir,
405
+ artifactManager,
406
+ consensusConfig: options.consensusConfig,
407
+ });
408
+ pipeline.autoRecoveryResult = result.success ? 'success' : 'invalid';
409
+ if (result.artifact)
410
+ pipeline.artifacts.push(result.artifact);
411
+ if (result.success && result.guidance) {
412
+ options.onProgress?.(`[resume] Auto-recovery guidance received (${result.guidance.length} chars). Resetting budget.`);
413
+ const prevRecovery = pipeline.recoveryCount;
414
+ pipeline.pipelinePhase = pipeline.failedPhase;
415
+ pipeline.recoveryCount = 0;
416
+ pipeline.lastRewindTarget = undefined;
417
+ delete pipeline.gateResults[pipeline.failedPhase];
418
+ delete pipeline.gateChecks[pipeline.failedPhase];
419
+ options.onProgress?.(`[resume] Recovering from STUCK: resetting to ${pipeline.failedPhase}, ` +
420
+ `recoveryCount ${prevRecovery} -> 0 (auto-recovery guidance)`);
421
+ // Fall through to runPipeline() below
422
+ }
423
+ else {
424
+ options.onProgress?.(`[resume] Auto-recovery produced no useful guidance.`);
425
+ // Fall through to return STUCK below
426
+ }
427
+ }
428
+ catch (err) {
429
+ pipeline.autoRecoveryResult = err?.message?.includes('timeout') ? 'timeout' : 'error';
430
+ options.onProgress?.(`[resume] Auto-recovery failed: ${err instanceof Error ? err.message : 'unknown'}`);
431
+ // Fall through to return STUCK below
432
+ }
433
+ // Persist state (whether auto-recovery succeeded or not)
434
+ try {
435
+ await updateState(options.projectDir, { pipeline });
436
+ }
437
+ catch { /* best-effort */ }
438
+ // If auto-recovery succeeded, fall through to runPipeline()
439
+ if (pipeline.autoRecoveryResult === 'success') {
440
+ return runPipeline(options);
441
+ }
442
+ }
443
+ // No guidance, no auto-recovery (or auto-recovery failed) — return STUCK
444
+ try {
445
+ await updateState(options.projectDir, { pipeline });
446
+ }
447
+ catch {
448
+ // Best-effort — cleanup is still in memory for next resume
449
+ }
450
+ options.onProgress?.(`[resume] Pipeline is stuck at ${pipeline.failedPhase} after ${pipeline.recoveryCount} recovery attempts. ` +
451
+ `Provide guidance to attempt recovery.`);
452
+ return {
453
+ success: false,
454
+ finalPhase: 'STUCK',
455
+ artifacts: pipeline.artifacts,
456
+ recoveryIterations: pipeline.recoveryCount,
457
+ error: `Pipeline stuck at ${pipeline.failedPhase} after ${pipeline.recoveryCount} recovery iterations. Provide guidance to retry.`,
458
+ };
459
+ }
460
+ }
461
+ else if ((pipeline?.pipelinePhase === 'STUCK' || pipeline?.pipelinePhase === 'RECOVERY_LOOP') &&
462
+ !pipeline?.failedPhase) {
463
+ options.onProgress?.(`[resume] Pipeline is ${pipeline.pipelinePhase} but failedPhase is missing — cannot auto-recover`);
464
+ return {
465
+ success: false,
466
+ finalPhase: 'STUCK',
467
+ artifacts: pipeline?.artifacts ?? [],
468
+ recoveryIterations: pipeline?.recoveryCount ?? 0,
469
+ error: 'Pipeline is stuck with no failed phase recorded. Manual intervention required.',
470
+ };
471
+ }
178
472
  return runPipeline(options);
179
473
  }
180
474
  // ─── Helpers ─────────────────────────────────────────────
@@ -185,12 +479,13 @@ export async function resumePipeline(options) {
185
479
  */
186
480
  function mergeGateResult(pipeline, phase, gateResult) {
187
481
  const existing = pipeline.gateResults[phase];
188
- if (existing?.score !== undefined || existing?.consensusScore !== undefined) {
189
- // Preserve consensus scores from the phase handler
482
+ if (existing?.score !== undefined || existing?.consensusScore !== undefined || existing?.finalStatus !== undefined) {
483
+ // Preserve consensus scores and finalStatus from the phase handler
190
484
  pipeline.gateResults[phase] = {
191
485
  ...gateResult,
192
486
  score: existing.score ?? gateResult.score,
193
487
  consensusScore: existing.consensusScore ?? gateResult.consensusScore,
488
+ finalStatus: existing.finalStatus ?? gateResult.finalStatus, // v2.4.3
194
489
  };
195
490
  }
196
491
  else {
@@ -208,7 +503,7 @@ function getNextCRRoute(pipeline) {
208
503
  const nextCR = pending.find((cr) => cr.status === 'proposed');
209
504
  if (!nextCR)
210
505
  return undefined;
211
- // Mark as approved (it has been routed to the consensus phase)
506
+ // Mark as routed/in-flight (kept as 'approved' for backward compatibility)
212
507
  nextCR.status = 'approved';
213
508
  return {
214
509
  cr_id: nextCR.cr_id,
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/pipeline/orchestrator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/pipeline/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  /**
2
2
  * Consensus Packet Builder — aggregates reviewer votes into a ConsensusPacket.
3
3
  * Auto-computes consensus result (score, approval) and final status.
4
- * v1.1: Added confidence-weighted scoring.
4
+ * v2.0: Option B scoring — avg(baseWeight * confidence) per reviewer.
5
+ * REJECT guard: REJECT with true blockers prevents APPROVED (not ARBITRATED).
6
+ * Normalization summary passthrough.
5
7
  */
6
8
  import type { ArtifactRef, ReviewerVote, ConsensusPacket } from '../types.js';
7
9
  export interface ConsensusRules {
@@ -9,6 +11,12 @@ export interface ConsensusRules {
9
11
  quorum: number;
10
12
  min_reviewers: number;
11
13
  }
14
+ export interface NormalizationSummary {
15
+ tagged_blockers_demoted_to_suggestions: number;
16
+ tagged_blockers_demoted_to_required: number;
17
+ untagged_from_blocking_routed_to_required: number;
18
+ forced_rejects: number;
19
+ }
12
20
  export interface BuildConsensusPacketArgs {
13
21
  planPacketRef: ArtifactRef;
14
22
  votes: ReviewerVote[];
@@ -18,18 +26,21 @@ export interface BuildConsensusPacketArgs {
18
26
  merged_patch?: string;
19
27
  artifact_ref?: ArtifactRef;
20
28
  };
29
+ normalizationMoves?: NormalizationSummary;
21
30
  }
22
31
  /**
23
32
  * Compute both simple and confidence-weighted consensus scores.
24
33
  *
25
34
  * Simple score: approve count / total votes (backward compat).
26
- * Weighted score: each vote's weight (APPROVE=1, CONDITIONAL=0.5, REJECT=0)
27
- * multiplied by voter confidence, then averaged by total confidence.
28
- * If any vote has blocking_issues, weighted_score is forced to 0.
35
+ * Option B weighted score: average of (vote_weight * confidence) per reviewer.
36
+ * v2.4.2: Returns honest rawWeighted score + has_true_blockers flag.
37
+ * Force-zero veto removed governance guard in buildConsensusPacket() is
38
+ * the single enforcement point for blocker-based rejection.
29
39
  */
30
40
  export declare function computeConsensusScore(votes: ReviewerVote[]): {
31
41
  score: number;
32
42
  weighted_score: number;
43
+ has_true_blockers: boolean;
33
44
  };
34
45
  export declare function buildConsensusPacket(args: BuildConsensusPacketArgs): ConsensusPacket;
35
46
  //# sourceMappingURL=consensus-packet-builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"consensus-packet-builder.d.ts","sourceRoot":"","sources":["../../../src/pipeline/packets/consensus-packet-builder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EAChB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,WAAW,CAAC;IAC3B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,cAAc,CAAC;IACtB,gBAAgB,CAAC,EAAE;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,WAAW,CAAC;KAC5B,CAAC;CACH;AASD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EAAE,GACpB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAwB3C;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,wBAAwB,GAAG,eAAe,CAqCpF"}
1
+ {"version":3,"file":"consensus-packet-builder.d.ts","sourceRoot":"","sources":["../../../src/pipeline/packets/consensus-packet-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EAChB,MAAM,aAAa,CAAC;AAGrB,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,sCAAsC,EAAE,MAAM,CAAC;IAC/C,mCAAmC,EAAE,MAAM,CAAC;IAC5C,yCAAyC,EAAE,MAAM,CAAC;IAClD,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,WAAW,CAAC;IAC3B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,cAAc,CAAC;IACtB,gBAAgB,CAAC,EAAE;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,WAAW,CAAC;KAC5B,CAAC;IACF,kBAAkB,CAAC,EAAE,oBAAoB,CAAC;CAC3C;AASD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EAAE,GACpB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,OAAO,CAAA;CAAE,CA0BvE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,wBAAwB,GAAG,eAAe,CAiDpF"}
@@ -1,9 +1,12 @@
1
1
  /**
2
2
  * Consensus Packet Builder — aggregates reviewer votes into a ConsensusPacket.
3
3
  * Auto-computes consensus result (score, approval) and final status.
4
- * v1.1: Added confidence-weighted scoring.
4
+ * v2.0: Option B scoring — avg(baseWeight * confidence) per reviewer.
5
+ * REJECT guard: REJECT with true blockers prevents APPROVED (not ARBITRATED).
6
+ * Normalization summary passthrough.
5
7
  */
6
8
  import { randomUUID } from 'node:crypto';
9
+ import { isNoneVariant } from '../../shared/text-utils.js';
7
10
  /** Vote weight mapping: APPROVE=1.0, CONDITIONAL=0.5, REJECT=0.0 */
8
11
  const VOTE_WEIGHTS = {
9
12
  'APPROVE': 1.0,
@@ -14,36 +17,38 @@ const VOTE_WEIGHTS = {
14
17
  * Compute both simple and confidence-weighted consensus scores.
15
18
  *
16
19
  * Simple score: approve count / total votes (backward compat).
17
- * Weighted score: each vote's weight (APPROVE=1, CONDITIONAL=0.5, REJECT=0)
18
- * multiplied by voter confidence, then averaged by total confidence.
19
- * If any vote has blocking_issues, weighted_score is forced to 0.
20
+ * Option B weighted score: average of (vote_weight * confidence) per reviewer.
21
+ * v2.4.2: Returns honest rawWeighted score + has_true_blockers flag.
22
+ * Force-zero veto removed governance guard in buildConsensusPacket() is
23
+ * the single enforcement point for blocker-based rejection.
20
24
  */
21
25
  export function computeConsensusScore(votes) {
22
26
  if (votes.length === 0)
23
- return { score: 0, weighted_score: 0 };
27
+ return { score: 0, weighted_score: 0, has_true_blockers: false };
24
28
  // Simple score (backward compat): approve ratio
25
29
  const approvedCount = votes.filter((v) => v.vote === 'APPROVE').length;
26
30
  const score = approvedCount / votes.length;
27
- // Weighted score: confidence-weighted vote values
28
- let totalWeight = 0;
31
+ // Option B scoring: average of (vote_weight * confidence) per reviewer
29
32
  let weightedSum = 0;
30
33
  for (const v of votes) {
31
- const w = v.confidence;
32
- weightedSum += (VOTE_WEIGHTS[v.vote] ?? 0) * w;
33
- totalWeight += w;
34
+ const baseWeight = VOTE_WEIGHTS[v.vote] ?? 0;
35
+ weightedSum += baseWeight * v.confidence;
34
36
  }
35
- const rawWeighted = totalWeight > 0 ? weightedSum / totalWeight : 0;
36
- // Override: any vote with blocking_issues forces weighted_score to 0
37
- const hasBlockingIssues = votes.some((v) => v.blocking_issues.length > 0);
37
+ const rawWeighted = weightedSum / votes.length;
38
+ // v2.4.2: Detect true blockers but don't force score to 0.
39
+ // Downstream code uses has_true_blockers for decisions instead.
40
+ const has_true_blockers = votes.some((v) => v.vote === 'REJECT' && v.blocking_issues.some((issue) => !isNoneVariant(issue)));
38
41
  return {
39
42
  score,
40
- weighted_score: hasBlockingIssues ? 0 : rawWeighted,
43
+ weighted_score: rawWeighted,
44
+ has_true_blockers,
41
45
  };
42
46
  }
43
47
  export function buildConsensusPacket(args) {
44
- const { planPacketRef, votes, rules, arbitratorResult } = args;
45
- const { score, weighted_score } = computeConsensusScore(votes);
46
- const approved = score >= rules.threshold && votes.length >= rules.quorum;
48
+ const { planPacketRef, votes, rules, arbitratorResult, normalizationMoves } = args;
49
+ const { score, weighted_score, has_true_blockers } = computeConsensusScore(votes);
50
+ // Use weighted_score (not simple score) for approval decision
51
+ const approved = weighted_score >= rules.threshold && votes.length >= rules.quorum;
47
52
  let finalStatus;
48
53
  if (arbitratorResult) {
49
54
  finalStatus = 'ARBITRATED';
@@ -54,6 +59,11 @@ export function buildConsensusPacket(args) {
54
59
  else {
55
60
  finalStatus = 'REJECTED';
56
61
  }
62
+ // Governance guard: REJECT with true blockers prevents APPROVED (but not ARBITRATED)
63
+ const hasRejectWithTrueBlockers = votes.some((v) => v.vote === 'REJECT' && v.blocking_issues.some((i) => !isNoneVariant(i)));
64
+ if (hasRejectWithTrueBlockers && finalStatus === 'APPROVED') {
65
+ finalStatus = 'REJECTED';
66
+ }
57
67
  return {
58
68
  metadata: {
59
69
  packet_id: randomUUID(),
@@ -72,9 +82,11 @@ export function buildConsensusPacket(args) {
72
82
  score,
73
83
  weighted_score,
74
84
  participating_reviewers: votes.length,
85
+ has_true_blockers,
75
86
  },
76
87
  arbitrator_result: arbitratorResult,
77
88
  final_status: finalStatus,
89
+ normalization_moves: normalizationMoves,
78
90
  };
79
91
  }
80
92
  //# sourceMappingURL=consensus-packet-builder.js.map