popeye-cli 2.2.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 (323) 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 +324 -20
  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 +3 -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/auto-recovery.d.ts +56 -0
  71. package/dist/pipeline/auto-recovery.d.ts.map +1 -0
  72. package/dist/pipeline/auto-recovery.js +185 -0
  73. package/dist/pipeline/auto-recovery.js.map +1 -0
  74. package/dist/pipeline/change-request.d.ts +39 -0
  75. package/dist/pipeline/change-request.d.ts.map +1 -1
  76. package/dist/pipeline/change-request.js +40 -1
  77. package/dist/pipeline/change-request.js.map +1 -1
  78. package/dist/pipeline/check-runner.d.ts +30 -1
  79. package/dist/pipeline/check-runner.d.ts.map +1 -1
  80. package/dist/pipeline/check-runner.js +122 -1
  81. package/dist/pipeline/check-runner.js.map +1 -1
  82. package/dist/pipeline/command-resolver.d.ts.map +1 -1
  83. package/dist/pipeline/command-resolver.js +33 -2
  84. package/dist/pipeline/command-resolver.js.map +1 -1
  85. package/dist/pipeline/consensus/arbitrator-query.d.ts +22 -0
  86. package/dist/pipeline/consensus/arbitrator-query.d.ts.map +1 -0
  87. package/dist/pipeline/consensus/arbitrator-query.js +70 -0
  88. package/dist/pipeline/consensus/arbitrator-query.js.map +1 -0
  89. package/dist/pipeline/consensus/consensus-runner.d.ts +131 -7
  90. package/dist/pipeline/consensus/consensus-runner.d.ts.map +1 -1
  91. package/dist/pipeline/consensus/consensus-runner.js +809 -35
  92. package/dist/pipeline/consensus/consensus-runner.js.map +1 -1
  93. package/dist/pipeline/cr-lifecycle.d.ts +42 -0
  94. package/dist/pipeline/cr-lifecycle.d.ts.map +1 -0
  95. package/dist/pipeline/cr-lifecycle.js +89 -0
  96. package/dist/pipeline/cr-lifecycle.js.map +1 -0
  97. package/dist/pipeline/gate-engine.d.ts +1 -0
  98. package/dist/pipeline/gate-engine.d.ts.map +1 -1
  99. package/dist/pipeline/gate-engine.js +26 -7
  100. package/dist/pipeline/gate-engine.js.map +1 -1
  101. package/dist/pipeline/orchestrator.d.ts +1 -1
  102. package/dist/pipeline/orchestrator.d.ts.map +1 -1
  103. package/dist/pipeline/orchestrator.js +306 -16
  104. package/dist/pipeline/orchestrator.js.map +1 -1
  105. package/dist/pipeline/packets/consensus-packet-builder.d.ts +15 -4
  106. package/dist/pipeline/packets/consensus-packet-builder.d.ts.map +1 -1
  107. package/dist/pipeline/packets/consensus-packet-builder.js +29 -17
  108. package/dist/pipeline/packets/consensus-packet-builder.js.map +1 -1
  109. package/dist/pipeline/phases/architecture.d.ts.map +1 -1
  110. package/dist/pipeline/phases/architecture.js +5 -3
  111. package/dist/pipeline/phases/architecture.js.map +1 -1
  112. package/dist/pipeline/phases/audit.d.ts.map +1 -1
  113. package/dist/pipeline/phases/audit.js +5 -3
  114. package/dist/pipeline/phases/audit.js.map +1 -1
  115. package/dist/pipeline/phases/consensus-architecture.d.ts.map +1 -1
  116. package/dist/pipeline/phases/consensus-architecture.js +10 -1
  117. package/dist/pipeline/phases/consensus-architecture.js.map +1 -1
  118. package/dist/pipeline/phases/consensus-master-plan.d.ts.map +1 -1
  119. package/dist/pipeline/phases/consensus-master-plan.js +10 -3
  120. package/dist/pipeline/phases/consensus-master-plan.js.map +1 -1
  121. package/dist/pipeline/phases/consensus-role-plans.d.ts.map +1 -1
  122. package/dist/pipeline/phases/consensus-role-plans.js +10 -1
  123. package/dist/pipeline/phases/consensus-role-plans.js.map +1 -1
  124. package/dist/pipeline/phases/done.d.ts.map +1 -1
  125. package/dist/pipeline/phases/done.js +9 -4
  126. package/dist/pipeline/phases/done.js.map +1 -1
  127. package/dist/pipeline/phases/intake.d.ts.map +1 -1
  128. package/dist/pipeline/phases/intake.js +7 -3
  129. package/dist/pipeline/phases/intake.js.map +1 -1
  130. package/dist/pipeline/phases/phase-context.d.ts +2 -0
  131. package/dist/pipeline/phases/phase-context.d.ts.map +1 -1
  132. package/dist/pipeline/phases/phase-context.js +3 -1
  133. package/dist/pipeline/phases/phase-context.js.map +1 -1
  134. package/dist/pipeline/phases/production-gate.d.ts.map +1 -1
  135. package/dist/pipeline/phases/production-gate.js +28 -3
  136. package/dist/pipeline/phases/production-gate.js.map +1 -1
  137. package/dist/pipeline/phases/qa-validation.d.ts.map +1 -1
  138. package/dist/pipeline/phases/qa-validation.js +38 -5
  139. package/dist/pipeline/phases/qa-validation.js.map +1 -1
  140. package/dist/pipeline/phases/recovery-loop.d.ts +2 -0
  141. package/dist/pipeline/phases/recovery-loop.d.ts.map +1 -1
  142. package/dist/pipeline/phases/recovery-loop.js +200 -6
  143. package/dist/pipeline/phases/recovery-loop.js.map +1 -1
  144. package/dist/pipeline/phases/review.d.ts.map +1 -1
  145. package/dist/pipeline/phases/review.js +58 -28
  146. package/dist/pipeline/phases/review.js.map +1 -1
  147. package/dist/pipeline/phases/role-planning.d.ts.map +1 -1
  148. package/dist/pipeline/phases/role-planning.js +18 -2
  149. package/dist/pipeline/phases/role-planning.js.map +1 -1
  150. package/dist/pipeline/phases/stuck.d.ts.map +1 -1
  151. package/dist/pipeline/phases/stuck.js +10 -0
  152. package/dist/pipeline/phases/stuck.js.map +1 -1
  153. package/dist/pipeline/repo-snapshot.d.ts.map +1 -1
  154. package/dist/pipeline/repo-snapshot.js +3 -0
  155. package/dist/pipeline/repo-snapshot.js.map +1 -1
  156. package/dist/pipeline/role-execution-adapter.d.ts +2 -1
  157. package/dist/pipeline/role-execution-adapter.d.ts.map +1 -1
  158. package/dist/pipeline/role-execution-adapter.js +22 -7
  159. package/dist/pipeline/role-execution-adapter.js.map +1 -1
  160. package/dist/pipeline/skill-loader.d.ts +19 -0
  161. package/dist/pipeline/skill-loader.d.ts.map +1 -1
  162. package/dist/pipeline/skill-loader.js +22 -0
  163. package/dist/pipeline/skill-loader.js.map +1 -1
  164. package/dist/pipeline/skills/coverage-gate.d.ts +44 -0
  165. package/dist/pipeline/skills/coverage-gate.d.ts.map +1 -0
  166. package/dist/pipeline/skills/coverage-gate.js +143 -0
  167. package/dist/pipeline/skills/coverage-gate.js.map +1 -0
  168. package/dist/pipeline/skills/usage-registry.d.ts +48 -0
  169. package/dist/pipeline/skills/usage-registry.d.ts.map +1 -0
  170. package/dist/pipeline/skills/usage-registry.js +55 -0
  171. package/dist/pipeline/skills/usage-registry.js.map +1 -0
  172. package/dist/pipeline/strategy-context.d.ts +20 -0
  173. package/dist/pipeline/strategy-context.d.ts.map +1 -0
  174. package/dist/pipeline/strategy-context.js +55 -0
  175. package/dist/pipeline/strategy-context.js.map +1 -0
  176. package/dist/pipeline/type-defs/artifacts.d.ts +25 -5
  177. package/dist/pipeline/type-defs/artifacts.d.ts.map +1 -1
  178. package/dist/pipeline/type-defs/artifacts.js +4 -0
  179. package/dist/pipeline/type-defs/artifacts.js.map +1 -1
  180. package/dist/pipeline/type-defs/audit.d.ts +25 -13
  181. package/dist/pipeline/type-defs/audit.d.ts.map +1 -1
  182. package/dist/pipeline/type-defs/checks.d.ts +18 -8
  183. package/dist/pipeline/type-defs/checks.d.ts.map +1 -1
  184. package/dist/pipeline/type-defs/checks.js +4 -0
  185. package/dist/pipeline/type-defs/checks.js.map +1 -1
  186. package/dist/pipeline/type-defs/packets.d.ts +104 -18
  187. package/dist/pipeline/type-defs/packets.d.ts.map +1 -1
  188. package/dist/pipeline/type-defs/packets.js +17 -1
  189. package/dist/pipeline/type-defs/packets.js.map +1 -1
  190. package/dist/pipeline/type-defs/state.d.ts +160 -16
  191. package/dist/pipeline/type-defs/state.d.ts.map +1 -1
  192. package/dist/pipeline/type-defs/state.js +26 -1
  193. package/dist/pipeline/type-defs/state.js.map +1 -1
  194. package/dist/shared/text-utils.d.ts +23 -0
  195. package/dist/shared/text-utils.d.ts.map +1 -0
  196. package/dist/shared/text-utils.js +66 -0
  197. package/dist/shared/text-utils.js.map +1 -0
  198. package/dist/shared/website-strategy-format.d.ts +18 -0
  199. package/dist/shared/website-strategy-format.d.ts.map +1 -0
  200. package/dist/shared/website-strategy-format.js +47 -0
  201. package/dist/shared/website-strategy-format.js.map +1 -0
  202. package/dist/state/index.d.ts +2 -0
  203. package/dist/state/index.d.ts.map +1 -1
  204. package/dist/state/index.js +57 -8
  205. package/dist/state/index.js.map +1 -1
  206. package/dist/types/consensus.d.ts +1 -0
  207. package/dist/types/consensus.d.ts.map +1 -1
  208. package/dist/types/consensus.js.map +1 -1
  209. package/dist/types/website-strategy.d.ts +1 -1
  210. package/dist/types/workflow.d.ts +447 -0
  211. package/dist/types/workflow.d.ts.map +1 -1
  212. package/dist/types/workflow.js +3 -0
  213. package/dist/types/workflow.js.map +1 -1
  214. package/dist/upgrade/handlers.d.ts.map +1 -1
  215. package/dist/upgrade/handlers.js +6 -3
  216. package/dist/upgrade/handlers.js.map +1 -1
  217. package/dist/workflow/consensus.d.ts.map +1 -1
  218. package/dist/workflow/consensus.js +1 -0
  219. package/dist/workflow/consensus.js.map +1 -1
  220. package/dist/workflow/website-strategy.d.ts.map +1 -1
  221. package/dist/workflow/website-strategy.js +2 -29
  222. package/dist/workflow/website-strategy.js.map +1 -1
  223. package/dist/workflow/website-updater.d.ts.map +1 -1
  224. package/dist/workflow/website-updater.js +3 -2
  225. package/dist/workflow/website-updater.js.map +1 -1
  226. package/package.json +1 -1
  227. package/src/adapters/gemini.ts +51 -6
  228. package/src/adapters/grok.ts +51 -6
  229. package/src/adapters/openai.ts +53 -5
  230. package/src/cli/commands/create.ts +1 -1
  231. package/src/cli/interactive.ts +333 -19
  232. package/src/generators/all.ts +3 -2
  233. package/src/generators/doc-parser.ts +75 -15
  234. package/src/generators/templates/fullstack.ts +1 -1
  235. package/src/generators/templates/website-components.ts +1 -1
  236. package/src/generators/templates/website-config.ts +23 -11
  237. package/src/generators/templates/website-conversion.ts +1 -1
  238. package/src/generators/templates/website-landing.ts +1 -1
  239. package/src/generators/templates/website-layout.ts +491 -23
  240. package/src/generators/templates/website-pricing.ts +1 -1
  241. package/src/generators/templates/website-sections.ts +1 -1
  242. package/src/generators/templates/website-seo.ts +4 -1
  243. package/src/generators/templates/website.ts +3 -0
  244. package/src/generators/website-content-ai.ts +186 -0
  245. package/src/generators/website-content-scanner.ts +113 -1
  246. package/src/generators/website-context.ts +151 -12
  247. package/src/generators/website-debug.ts +26 -0
  248. package/src/generators/website.ts +28 -3
  249. package/src/pipeline/auto-recovery.ts +283 -0
  250. package/src/pipeline/change-request.ts +63 -1
  251. package/src/pipeline/check-runner.ts +141 -2
  252. package/src/pipeline/command-resolver.ts +34 -2
  253. package/src/pipeline/consensus/arbitrator-query.ts +101 -0
  254. package/src/pipeline/consensus/consensus-runner.ts +1099 -42
  255. package/src/pipeline/cr-lifecycle.ts +103 -0
  256. package/src/pipeline/gate-engine.ts +35 -7
  257. package/src/pipeline/orchestrator.ts +361 -16
  258. package/src/pipeline/packets/consensus-packet-builder.ts +44 -18
  259. package/src/pipeline/phases/architecture.ts +6 -3
  260. package/src/pipeline/phases/audit.ts +6 -3
  261. package/src/pipeline/phases/consensus-architecture.ts +10 -1
  262. package/src/pipeline/phases/consensus-master-plan.ts +10 -3
  263. package/src/pipeline/phases/consensus-role-plans.ts +10 -1
  264. package/src/pipeline/phases/done.ts +15 -4
  265. package/src/pipeline/phases/intake.ts +7 -3
  266. package/src/pipeline/phases/phase-context.ts +6 -1
  267. package/src/pipeline/phases/production-gate.ts +41 -3
  268. package/src/pipeline/phases/qa-validation.ts +51 -5
  269. package/src/pipeline/phases/recovery-loop.ts +229 -7
  270. package/src/pipeline/phases/review.ts +73 -30
  271. package/src/pipeline/phases/role-planning.ts +21 -2
  272. package/src/pipeline/phases/stuck.ts +10 -0
  273. package/src/pipeline/repo-snapshot.ts +3 -0
  274. package/src/pipeline/role-execution-adapter.ts +30 -4
  275. package/src/pipeline/skill-loader.ts +33 -0
  276. package/src/pipeline/skills/coverage-gate.ts +199 -0
  277. package/src/pipeline/skills/usage-registry.ts +87 -0
  278. package/src/pipeline/strategy-context.ts +60 -0
  279. package/src/pipeline/type-defs/artifacts.ts +4 -0
  280. package/src/pipeline/type-defs/checks.ts +4 -0
  281. package/src/pipeline/type-defs/packets.ts +18 -1
  282. package/src/pipeline/type-defs/state.ts +26 -1
  283. package/src/shared/text-utils.ts +70 -0
  284. package/src/shared/website-strategy-format.ts +56 -0
  285. package/src/state/index.ts +60 -8
  286. package/src/types/consensus.ts +1 -0
  287. package/src/types/workflow.ts +6 -0
  288. package/src/upgrade/handlers.ts +9 -3
  289. package/src/workflow/consensus.ts +1 -0
  290. package/src/workflow/website-strategy.ts +2 -36
  291. package/src/workflow/website-updater.ts +4 -2
  292. package/tests/adapters/gemini.test.ts +165 -0
  293. package/tests/adapters/grok.test.ts +137 -0
  294. package/tests/adapters/openai.test.ts +128 -0
  295. package/tests/generators/doc-parser.test.ts +88 -9
  296. package/tests/generators/quality-gate.test.ts +19 -3
  297. package/tests/generators/website-components.test.ts +34 -0
  298. package/tests/generators/website-content-ai.test.ts +308 -0
  299. package/tests/generators/website-content-scanner.test.ts +86 -0
  300. package/tests/generators/website-context.test.ts +3 -2
  301. package/tests/integration/smokestack-scaffold.test.ts +385 -0
  302. package/tests/pipeline/auto-recovery.test.ts +337 -0
  303. package/tests/pipeline/change-request.test.ts +70 -0
  304. package/tests/pipeline/command-resolver.test.ts +42 -0
  305. package/tests/pipeline/consensus/arbitrator-query.test.ts +107 -0
  306. package/tests/pipeline/consensus-runner.test.ts +1333 -10
  307. package/tests/pipeline/consensus-scoring.test.ts +602 -18
  308. package/tests/pipeline/gate-engine.test.ts +34 -0
  309. package/tests/pipeline/install-check.test.ts +261 -0
  310. package/tests/pipeline/orchestrator.test.ts +1506 -15
  311. package/tests/pipeline/packets/builders.test.ts +29 -6
  312. package/tests/pipeline/phases/role-planning.strategy.test.ts +204 -0
  313. package/tests/pipeline/pipeline-persistence.test.ts +230 -0
  314. package/tests/pipeline/recovery-loop-guidance.test.ts +280 -0
  315. package/tests/pipeline/role-execution-adapter.test.ts +88 -0
  316. package/tests/pipeline/skills/coverage-gate.test.ts +370 -0
  317. package/tests/pipeline/skills/usage-registry.test.ts +114 -0
  318. package/tests/pipeline/strategy-context.test.ts +148 -0
  319. package/tests/shared/text-utils.test.ts +155 -0
  320. package/tests/state/progress-analysis.test.ts +375 -0
  321. package/tests/upgrade/handlers.test.ts +33 -2
  322. package/tests/workflow/consensus.test.ts +6 -0
  323. 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;
@@ -99,6 +108,15 @@ export async function runPipeline(options) {
99
108
  if (!result.success) {
100
109
  onProgress?.(`Phase ${phase} FAILED: ${result.message}${result.error ? ` — ${result.error}` : ''}`);
101
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
+ }
102
120
  // v1.1: Verify constitution integrity before evaluating gate
103
121
  const constitutionCheck = verifyConstitution(pipeline, projectDir);
104
122
  // Evaluate gate with constitution verification result
@@ -110,48 +128,168 @@ export async function runPipeline(options) {
110
128
  mergeGateResult(pipeline, phase, gateResult);
111
129
  if (gateResult.pass) {
112
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
+ }
113
142
  // v1.1: Check for pending CRs after REVIEW/AUDIT — route to consensus before continuing
114
143
  if (CR_CHECK_PHASES.has(phase)) {
115
144
  const crRoute = getNextCRRoute(pipeline);
116
145
  if (crRoute) {
117
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;
118
154
  phase = crRoute.target_phase;
119
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 */ }
120
166
  continue;
121
167
  }
122
168
  }
123
169
  if (phase === 'RECOVERY_LOOP') {
124
170
  // Recovery succeeded. RCA may specify rewind target.
125
171
  const rca = getLatestRCA(pipeline, projectDir);
126
- if (rca?.requires_phase_rewind_to) {
127
- 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;
128
181
  }
129
- else {
130
- // Retest the phase that failed
131
- 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];
132
191
  }
133
192
  failedPhase = null;
134
193
  }
135
194
  else {
136
195
  // Normal progression
137
- 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;
138
209
  }
139
210
  }
140
211
  else {
141
212
  // ─── FAIL ────────────────────────────────────────
142
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
+ }
143
224
  if (pipeline.recoveryCount >= pipeline.maxRecoveryIterations) {
144
- 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
+ }
145
266
  }
146
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
+ }
147
274
  failedPhase = phase;
148
275
  pipeline.failedPhase = phase;
149
276
  phase = 'RECOVERY_LOOP';
150
277
  pipeline.recoveryCount++;
151
278
  }
152
279
  }
280
+ // v2.5.0: Stagnation detection — shared helper checks rolling signature window
281
+ if (checkStagnation(pipeline, onProgress)) {
282
+ phase = 'STUCK';
283
+ }
153
284
  // Update pipeline phase in state
154
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
+ }
155
293
  onProgress?.(`Transitioning to: ${phase}`);
156
294
  }
157
295
  // ─── Terminal State ────────────────────────────────────
@@ -167,6 +305,13 @@ export async function runPipeline(options) {
167
305
  }
168
306
  }
169
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
+ }
170
315
  return {
171
316
  success: phase === 'DONE',
172
317
  finalPhase: phase,
@@ -177,9 +322,153 @@ export async function runPipeline(options) {
177
322
  : undefined,
178
323
  };
179
324
  }
180
- /** Resume pipeline from saved state */
325
+ /** Resume pipeline from saved state — with STUCK recovery (v2.4.5) */
181
326
  export async function resumePipeline(options) {
182
- // 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
+ }
183
472
  return runPipeline(options);
184
473
  }
185
474
  // ─── Helpers ─────────────────────────────────────────────
@@ -190,12 +479,13 @@ export async function resumePipeline(options) {
190
479
  */
191
480
  function mergeGateResult(pipeline, phase, gateResult) {
192
481
  const existing = pipeline.gateResults[phase];
193
- if (existing?.score !== undefined || existing?.consensusScore !== undefined) {
194
- // 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
195
484
  pipeline.gateResults[phase] = {
196
485
  ...gateResult,
197
486
  score: existing.score ?? gateResult.score,
198
487
  consensusScore: existing.consensusScore ?? gateResult.consensusScore,
488
+ finalStatus: existing.finalStatus ?? gateResult.finalStatus, // v2.4.3
199
489
  };
200
490
  }
201
491
  else {
@@ -213,7 +503,7 @@ function getNextCRRoute(pipeline) {
213
503
  const nextCR = pending.find((cr) => cr.status === 'proposed');
214
504
  if (!nextCR)
215
505
  return undefined;
216
- // Mark as approved (it has been routed to the consensus phase)
506
+ // Mark as routed/in-flight (kept as 'approved' for backward compatibility)
217
507
  nextCR.status = 'approved';
218
508
  return {
219
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