karajan-code 4.70.4 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (390) hide show
  1. package/README.md +2 -2
  2. package/package.json +6 -14
  3. package/packages/hu-board/package.json +1 -1
  4. package/packages/hu-board/public/app.js +4 -18
  5. package/packages/hu-board/public/index.html +5 -2
  6. package/packages/hu-board/public/styles.css +26 -0
  7. package/packages/hu-board/public/utils/api.js +0 -74
  8. package/packages/hu-board/public/utils/board-tour.js +62 -0
  9. package/packages/hu-board/public/utils/board-view.js +49 -144
  10. package/packages/hu-board/public/utils/command-launcher.js +8 -70
  11. package/packages/hu-board/public/utils/formatters.js +10 -0
  12. package/packages/hu-board/public/utils/governance-view.js +13 -1
  13. package/packages/hu-board/public/utils/hu-actions.js +17 -68
  14. package/packages/hu-board/public/utils/init-listeners.js +7 -8
  15. package/packages/hu-board/public/utils/log-panel.js +3 -16
  16. package/packages/hu-board/public/utils/maggle-mode.js +2 -12
  17. package/packages/hu-board/public/utils/modals.js +7 -0
  18. package/packages/hu-board/public/utils/project-picker-view.js +1 -1
  19. package/packages/hu-board/public/utils/server-push.js +3 -22
  20. package/packages/hu-board/public/utils/shared-board-notice.js +33 -0
  21. package/packages/hu-board/public/utils/story-detail-view.js +5 -19
  22. package/packages/hu-board/src/cleanup-zombies.js +0 -1
  23. package/packages/hu-board/src/command-runner.js +36 -25
  24. package/packages/hu-board/src/db-connection.js +282 -0
  25. package/packages/hu-board/src/db-paths.js +113 -0
  26. package/packages/hu-board/src/db-queries.js +188 -0
  27. package/packages/hu-board/src/db-tombstones.js +51 -0
  28. package/packages/hu-board/src/db.js +28 -619
  29. package/packages/hu-board/src/ephemeral-cleaner.js +2 -3
  30. package/packages/hu-board/src/hu-zombie-reaper.js +5 -1
  31. package/packages/hu-board/src/plan-mutations.js +3 -153
  32. package/packages/hu-board/src/plans-service.js +55 -0
  33. package/packages/hu-board/src/routes/api/commands.js +122 -0
  34. package/packages/hu-board/src/routes/api/plans.js +55 -0
  35. package/packages/hu-board/src/routes/api/projects.js +267 -0
  36. package/packages/hu-board/src/routes/api/prompts.js +135 -0
  37. package/packages/hu-board/src/routes/api/sessions.js +95 -0
  38. package/packages/hu-board/src/routes/api/stories.js +183 -0
  39. package/packages/hu-board/src/routes/api/system.js +241 -0
  40. package/packages/hu-board/src/routes/api/tombstones.js +38 -0
  41. package/packages/hu-board/src/routes/api.js +24 -1371
  42. package/packages/hu-board/src/routes/governance.js +23 -1
  43. package/packages/hu-board/src/routes/lanes.js +40 -0
  44. package/packages/hu-board/src/routes/rag.js +4 -3
  45. package/packages/hu-board/src/server.js +20 -34
  46. package/packages/hu-board/src/sync-files.js +318 -0
  47. package/packages/hu-board/src/sync-project.js +99 -0
  48. package/packages/hu-board/src/sync.js +22 -566
  49. package/packages/hu-board/src/zombie-reaper.js +1 -1
  50. package/scripts/dual-publish.mjs +19 -3
  51. package/scripts/postinstall.js +15 -2
  52. package/scripts/verify-pack-mcp.mjs +11 -7
  53. package/scripts/verify-pack.mjs +4 -4
  54. package/src/audit/audit-history.js +3 -2
  55. package/src/audit/dead-exports.js +68 -59
  56. package/src/audit/deterministic-summary.js +33 -13
  57. package/src/audit/npm-signatures.js +41 -0
  58. package/src/audit/sbom.js +35 -0
  59. package/src/checks/agent-token.js +112 -0
  60. package/src/checks/dir-setup.js +34 -1
  61. package/src/checks/native-build.js +21 -39
  62. package/src/checks/runner.js +128 -142
  63. package/src/cli/advanced-commands.js +6 -6
  64. package/src/cli/register-meta.js +42 -82
  65. package/src/cli/register-pipeline.js +8 -143
  66. package/src/cli/register-plan.js +9 -100
  67. package/src/cli/register-roles-skills.js +1 -1
  68. package/src/cli/retired-commands.js +49 -0
  69. package/src/cli.js +18 -5
  70. package/src/commands/agent-run.js +40 -26
  71. package/src/commands/audit.js +127 -124
  72. package/src/commands/board.js +5 -9
  73. package/src/commands/check.js +29 -16
  74. package/src/commands/doctor.js +2 -0
  75. package/src/commands/env.js +176 -150
  76. package/src/commands/go.js +71 -53
  77. package/src/commands/harden.js +90 -81
  78. package/src/commands/hu-start.js +52 -0
  79. package/src/commands/hu.js +288 -221
  80. package/src/commands/identity.js +111 -78
  81. package/src/commands/init-atril.js +47 -0
  82. package/src/commands/init.js +11 -40
  83. package/src/commands/install-tools.js +70 -85
  84. package/src/commands/main-guard.js +78 -0
  85. package/src/commands/policy.js +226 -184
  86. package/src/commands/qmd.js +27 -21
  87. package/src/commands/rag.js +121 -55
  88. package/src/commands/review-gate.js +421 -341
  89. package/src/commands/skills.js +4 -1
  90. package/src/commands/start.js +4 -5
  91. package/src/commands/steward.js +96 -47
  92. package/src/commands/tournament.js +46 -37
  93. package/src/commands/worktree.js +107 -26
  94. package/src/config/defaults.js +1 -0
  95. package/src/config/loader.js +34 -17
  96. package/src/config/role-resolver.js +1 -0
  97. package/src/config/schema.js +1 -0
  98. package/src/config/secrets.js +36 -0
  99. package/src/config.js +1 -0
  100. package/src/environment/adr.js +16 -2
  101. package/src/git/karajan-label.js +20 -8
  102. package/src/guards/main-guard.js +54 -0
  103. package/src/harden/hook-templates.js +16 -1
  104. package/src/harden/sentinel/posttooluse.mjs +18 -6
  105. package/src/harden/sentinel/pretooluse-sentinel.mjs +64 -36
  106. package/src/harden/sentinel/sentinel-lib.mjs +129 -26
  107. package/src/harden/sentinel/sentinel-shell.mjs +5 -16
  108. package/src/harden/sentinel/sessionstart.mjs +3 -2
  109. package/src/harden/sentinel/stop.mjs +5 -4
  110. package/src/harden/workflow-templates.js +1 -1
  111. package/src/hu/board-lookup.js +29 -0
  112. package/src/hu/gh-identity.js +23 -0
  113. package/src/hu/github-board.js +4 -2
  114. package/src/hu/lane-prune.js +83 -13
  115. package/src/hu/lane-setup.js +65 -0
  116. package/src/hu/lanes.js +66 -0
  117. package/src/hu/team-board-mirror.js +3 -2
  118. package/src/infrastructure/command-runner.js +1 -1
  119. package/src/infrastructure/file-system-service.js +1 -1
  120. package/src/mcp/handlers/direct-handlers.js +2 -292
  121. package/src/mcp/handlers/hu-handlers.js +1 -35
  122. package/src/mcp/handlers/management-handlers.js +2 -42
  123. package/src/mcp/handlers/rag-handler.js +9 -1
  124. package/src/mcp/server-handlers.js +16 -22
  125. package/src/mcp/tools.js +1 -196
  126. package/src/plan/lane-plans.js +54 -0
  127. package/src/plan/plan-store.js +7 -4
  128. package/src/policy/add.js +26 -12
  129. package/src/policy/adr-number-check.js +31 -0
  130. package/src/prompts/audit.js +299 -339
  131. package/src/prompts/card-context.js +10 -5
  132. package/src/prompts/reviewer.js +5 -2
  133. package/src/rag/auto-update.js +71 -44
  134. package/src/rag/bootstrap-index.js +46 -54
  135. package/src/rag/indexer.js +9 -4
  136. package/src/rag/migrate.js +1 -1
  137. package/src/rag/onnx-fallback.js +2 -2
  138. package/src/rag/pid-lease.js +181 -0
  139. package/src/rag/project-store.js +2 -12
  140. package/src/review/card-first.js +57 -46
  141. package/src/review/gate-gitignore.js +23 -4
  142. package/src/review/gate-hook.js +12 -4
  143. package/src/review/one-shot-review.js +45 -35
  144. package/src/review/publish-pr.js +14 -2
  145. package/src/review/repo-docs.js +73 -0
  146. package/src/review/repo-stack.js +59 -0
  147. package/src/review/reviewer-fallback.js +19 -4
  148. package/src/review/seal-commit.js +29 -0
  149. package/src/review/sonar-pregate.js +59 -44
  150. package/src/review/third-party-review.js +90 -16
  151. package/src/review/third-party-size.js +43 -0
  152. package/src/review/third-party-skills.js +54 -0
  153. package/src/review/verify-pr.js +1 -24
  154. package/src/roles/audit-role.js +106 -125
  155. package/src/skills/atril-cli.js +19 -1
  156. package/src/skills/atril-skills.js +5 -4
  157. package/src/skills/skills-search.js +72 -0
  158. package/src/skills/translate.js +62 -0
  159. package/src/sonar/scanner.js +116 -101
  160. package/src/steward/invariants.js +5 -4
  161. package/src/steward/phantom-sweep.js +66 -0
  162. package/src/tournament/judge.js +60 -53
  163. package/src/utils/gh-account.js +37 -0
  164. package/src/utils/git.js +0 -13
  165. package/src/utils/home-migration.js +7 -1
  166. package/src/utils/main-checkout.js +53 -0
  167. package/src/utils/qmd-collection.js +3 -1
  168. package/src/utils/welcome.js +3 -3
  169. package/templates/{skills → atril/commands}/kj-architect.md +5 -0
  170. package/templates/{skills → atril/commands}/kj-audit.md +5 -0
  171. package/templates/{skills → atril/commands}/kj-board.md +5 -0
  172. package/templates/{skills → atril/commands}/kj-code.md +5 -0
  173. package/templates/{skills → atril/commands}/kj-csv-transform.md +5 -0
  174. package/templates/{skills → atril/commands}/kj-data-report.md +5 -0
  175. package/templates/{skills → atril/commands}/kj-discover.md +5 -0
  176. package/templates/{skills → atril/commands}/kj-rag-query.md +5 -0
  177. package/templates/{skills → atril/commands}/kj-review.md +5 -0
  178. package/templates/{skills → atril/commands}/kj-security.md +5 -0
  179. package/templates/{skills → atril/commands}/kj-sonar.md +5 -0
  180. package/templates/{skills → atril/commands}/kj-sql-analysis.md +5 -0
  181. package/templates/{skills → atril/commands}/kj-test.md +5 -0
  182. package/packages/hu-board/public/utils/run-launcher.js +0 -169
  183. package/packages/hu-board/src/run-tracker.js +0 -121
  184. package/src/activity-log.js +0 -59
  185. package/src/agents/host-agent.js +0 -38
  186. package/src/agents/model-registry.js +0 -142
  187. package/src/audit/plan-adherence.js +0 -224
  188. package/src/autonomy/arbiter-role.js +0 -71
  189. package/src/autonomy/arbiter.js +0 -22
  190. package/src/autonomy/decider.js +0 -18
  191. package/src/autonomy/decision-resolver.js +0 -58
  192. package/src/autonomy/outcome-report.js +0 -55
  193. package/src/autonomy/stage-ask.js +0 -30
  194. package/src/brain/decision-tracker.js +0 -125
  195. package/src/brain/decisor.js +0 -243
  196. package/src/brain/solomon-consult.js +0 -171
  197. package/src/brain/standby-scheduler.js +0 -8
  198. package/src/budget/comparison.js +0 -96
  199. package/src/canvas/parse-md.js +0 -238
  200. package/src/canvas/schema.js +0 -101
  201. package/src/canvas/to-flat.js +0 -85
  202. package/src/canvas/validate.js +0 -163
  203. package/src/ci/dispatch.js +0 -99
  204. package/src/ci/index.js +0 -3
  205. package/src/ci/pr-diff.js +0 -26
  206. package/src/cli/register-standby.js +0 -26
  207. package/src/commands/architect.js +0 -111
  208. package/src/commands/autorun.js +0 -49
  209. package/src/commands/researcher.js +0 -54
  210. package/src/commands/resume.js +0 -72
  211. package/src/commands/review.js +0 -89
  212. package/src/commands/run.js +0 -185
  213. package/src/commands/standby.js +0 -117
  214. package/src/commands/status.js +0 -36
  215. package/src/commands/triage.js +0 -78
  216. package/src/commands/undo.js +0 -62
  217. package/src/domains/domain-loader.js +0 -245
  218. package/src/domains/domain-registry.js +0 -140
  219. package/src/domains/domain-synthesizer.js +0 -129
  220. package/src/git/automation.js +0 -433
  221. package/src/git/coder-commit-guard.js +0 -40
  222. package/src/git/hu-automation.js +0 -243
  223. package/src/git/hu-snapshot.js +0 -10
  224. package/src/git/symlink-targets.js +0 -57
  225. package/src/golden/asserter.js +0 -92
  226. package/src/golden/loader.js +0 -52
  227. package/src/golden/runner.js +0 -92
  228. package/src/golden/schema.js +0 -41
  229. package/src/guards/duplicate-members.js +0 -86
  230. package/src/guards/intent-guard.js +0 -161
  231. package/src/guards/perf-guard.js +0 -126
  232. package/src/guards/policy-guard.js +0 -90
  233. package/src/guards/policy-resolver.js +0 -85
  234. package/src/guards/secret-redactor.js +0 -71
  235. package/src/hu/acceptance-runner.js +0 -138
  236. package/src/hu/lazy-planner.js +0 -109
  237. package/src/hu/parallel-executor.js +0 -94
  238. package/src/hu/routing-metrics.js +0 -17
  239. package/src/hu/split-validator.js +0 -143
  240. package/src/hu/splitting-detector.js +0 -158
  241. package/src/hu/splitting-generator.js +0 -175
  242. package/src/hu/store.js +0 -394
  243. package/src/infrastructure/mocks.js +0 -182
  244. package/src/mcp/handlers/run-handler.js +0 -318
  245. package/src/mcp/sovereignty-guard.js +0 -113
  246. package/src/mcp/tool-arg-normalizers.js +0 -16
  247. package/src/mutate/reviewer-signal.js +0 -76
  248. package/src/orchestrator/agent-fallback.js +0 -81
  249. package/src/orchestrator/brain-coordinator.js +0 -186
  250. package/src/orchestrator/ci-integration.js +0 -139
  251. package/src/orchestrator/config-init.js +0 -426
  252. package/src/orchestrator/direct-actions.js +0 -217
  253. package/src/orchestrator/drivers/error-recovery.js +0 -287
  254. package/src/orchestrator/drivers/init-context.js +0 -238
  255. package/src/orchestrator/drivers/iteration-loop.js +0 -382
  256. package/src/orchestrator/drivers/iteration-phases/coder-and-refactorer.js +0 -69
  257. package/src/orchestrator/drivers/iteration-phases/guards.js +0 -91
  258. package/src/orchestrator/drivers/iteration-phases/handle-approved.js +0 -29
  259. package/src/orchestrator/drivers/iteration-phases/quality-gates.js +0 -125
  260. package/src/orchestrator/drivers/iteration-phases/reviewer-gate.js +0 -62
  261. package/src/orchestrator/drivers/post-loop.js +0 -404
  262. package/src/orchestrator/drivers/pre-loop-phases/auto-hu-batch.js +0 -137
  263. package/src/orchestrator/drivers/pre-loop-phases/config-deprecations.js +0 -47
  264. package/src/orchestrator/drivers/pre-loop-phases/ensure-addyosmani-skills.js +0 -84
  265. package/src/orchestrator/drivers/pre-loop-phases/inject-loaded-plan.js +0 -393
  266. package/src/orchestrator/drivers/pre-loop.js +0 -524
  267. package/src/orchestrator/drivers/run-hu-batch.js +0 -468
  268. package/src/orchestrator/feedback-enrichment.js +0 -140
  269. package/src/orchestrator/feedback-queue.js +0 -151
  270. package/src/orchestrator/flow-control.js +0 -170
  271. package/src/orchestrator/flow-runner.js +0 -365
  272. package/src/orchestrator/fs-leak-detector.js +0 -228
  273. package/src/orchestrator/hu-scheduler.js +0 -114
  274. package/src/orchestrator/hu-sub-pipeline.js +0 -642
  275. package/src/orchestrator/iteration-gate.js +0 -73
  276. package/src/orchestrator/iteration-stages.js +0 -9
  277. package/src/orchestrator/parallel-limiter.js +0 -74
  278. package/src/orchestrator/pipeline-context.js +0 -72
  279. package/src/orchestrator/post-loop-stages.js +0 -468
  280. package/src/orchestrator/pre-loop-stages.js +0 -11
  281. package/src/orchestrator/preflight-checks.js +0 -487
  282. package/src/orchestrator/repair/repair-detector.js +0 -117
  283. package/src/orchestrator/repair/repair-runner.js +0 -142
  284. package/src/orchestrator/reviewer-fallback.js +0 -45
  285. package/src/orchestrator/role-output-compressor.js +0 -189
  286. package/src/orchestrator/session-journal.js +0 -308
  287. package/src/orchestrator/solomon-escalation.js +0 -331
  288. package/src/orchestrator/solomon-rules.js +0 -212
  289. package/src/orchestrator/stages/acceptance-coverage-stage.js +0 -47
  290. package/src/orchestrator/stages/architect-stage.js +0 -172
  291. package/src/orchestrator/stages/coder-stage.js +0 -506
  292. package/src/orchestrator/stages/domain-curator-stage.js +0 -82
  293. package/src/orchestrator/stages/format-stage.js +0 -61
  294. package/src/orchestrator/stages/hu-reviewer-phases/detect-and-apply-splits.js +0 -127
  295. package/src/orchestrator/stages/hu-reviewer-stage.js +0 -419
  296. package/src/orchestrator/stages/perf-stage.js +0 -140
  297. package/src/orchestrator/stages/planner-stage.js +0 -85
  298. package/src/orchestrator/stages/rag-context-stage.js +0 -80
  299. package/src/orchestrator/stages/rag-preload-decisor.js +0 -58
  300. package/src/orchestrator/stages/research-stage.js +0 -69
  301. package/src/orchestrator/stages/reviewer-stage.js +0 -431
  302. package/src/orchestrator/stages/sonar-stage.js +0 -439
  303. package/src/orchestrator/stages/stage-classes.js +0 -84
  304. package/src/orchestrator/stages/stage-executor.js +0 -155
  305. package/src/orchestrator/stages/suite-green-stage.js +0 -62
  306. package/src/orchestrator/stages/tdd-discipline-stage.js +0 -56
  307. package/src/orchestrator/stages/tool-judge-stage.js +0 -53
  308. package/src/orchestrator/stages/triage-stage.js +0 -172
  309. package/src/orchestrator/standby.js +0 -71
  310. package/src/orchestrator/verification-gate.js +0 -183
  311. package/src/orchestrator.js +0 -22
  312. package/src/plan/adr-generator.js +0 -170
  313. package/src/plan/adr-loader.js +0 -60
  314. package/src/plan/plan-executor.js +0 -100
  315. package/src/plan/plan-validation.js +0 -4
  316. package/src/prompts/acceptance-coverage.js +0 -32
  317. package/src/prompts/arbiter.js +0 -38
  318. package/src/prompts/architect.js +0 -103
  319. package/src/prompts/hu-reviewer.js +0 -244
  320. package/src/prompts/tool-correctness-judge.js +0 -31
  321. package/src/prompts/triage.js +0 -57
  322. package/src/rag/embedder.js +0 -2
  323. package/src/rag/embedders/_cloud-base.js +0 -2
  324. package/src/rag/embedders/cohere.js +0 -2
  325. package/src/rag/embedders/mistral.js +0 -2
  326. package/src/rag/embedders/onnx.js +0 -2
  327. package/src/rag/embedders/openai.js +0 -2
  328. package/src/rag/embedders/voyage.js +0 -2
  329. package/src/rag/rerank.js +0 -4
  330. package/src/rag/where-parser.js +0 -4
  331. package/src/repeat-detector.js +0 -88
  332. package/src/review/diff-generator.js +0 -112
  333. package/src/review/git-stash-helper.js +0 -104
  334. package/src/review/schema.js +0 -31
  335. package/src/review/scope-filter.js +0 -152
  336. package/src/review/snapshot-diff.js +0 -122
  337. package/src/review/tdd-discipline.js +0 -90
  338. package/src/review/tdd-policy.js +0 -69
  339. package/src/roles/acceptance-coverage-role.js +0 -78
  340. package/src/roles/architect-role.js +0 -77
  341. package/src/roles/coder-role.js +0 -113
  342. package/src/roles/commiter-role.js +0 -113
  343. package/src/roles/domain-curator-role.js +0 -134
  344. package/src/roles/hu-reviewer-role.js +0 -64
  345. package/src/roles/impeccable-role.js +0 -85
  346. package/src/roles/index.js +0 -18
  347. package/src/roles/karajan-brain-role.js +0 -134
  348. package/src/roles/perf-role.js +0 -122
  349. package/src/roles/planner-role.js +0 -151
  350. package/src/roles/refactorer-role.js +0 -30
  351. package/src/roles/repairer-role.js +0 -181
  352. package/src/roles/researcher-role.js +0 -70
  353. package/src/roles/reviewer-role.js +0 -115
  354. package/src/roles/security-role.js +0 -73
  355. package/src/roles/solomon-role.js +0 -271
  356. package/src/roles/sonar-role.js +0 -72
  357. package/src/roles/tester-role.js +0 -235
  358. package/src/roles/tool-correctness-judge-role.js +0 -78
  359. package/src/roles/triage-role.js +0 -99
  360. package/src/session/journal/decisions-writer.js +0 -200
  361. package/src/session/journal/iteration-logger.js +0 -194
  362. package/src/session/journal/summary-writer.js +0 -320
  363. package/src/session/journal/tree-writer.js +0 -164
  364. package/src/session/journal/write-all.js +0 -89
  365. package/src/session-cleanup.js +0 -116
  366. package/src/skills/semantic-detector.js +0 -167
  367. package/src/skills/skill-detector.js +0 -385
  368. package/src/sonar/cloud-scanner.js +0 -78
  369. package/src/tracker-bootstrap.js +0 -44
  370. package/src/types/index.js +0 -38
  371. package/src/types/policy.js +0 -43
  372. package/src/types/solomon.js +0 -87
  373. package/src/utils/async-lock.js +0 -31
  374. package/src/utils/budget.js +0 -229
  375. package/src/utils/cwd-confirm.js +0 -39
  376. package/src/utils/display/event-handlers.js +0 -403
  377. package/src/utils/display/formatters.js +0 -132
  378. package/src/utils/display/header.js +0 -47
  379. package/src/utils/display/session-summary.js +0 -118
  380. package/src/utils/display/solomon.js +0 -42
  381. package/src/utils/pricing.js +0 -29
  382. package/src/utils/quota-simulator.js +0 -56
  383. package/src/utils/role-assigner.js +0 -137
  384. package/src/utils/rtk-wrapper.js +0 -87
  385. package/src/utils/run-registry.js +0 -9
  386. package/src/utils/status-dashboard.js +0 -254
  387. package/src/utils/tool-call-extractor.js +0 -56
  388. package/src/webperf/devtools-detect.js +0 -112
  389. package/src/webperf/webperf-role-integration.js +0 -66
  390. package/templates/skills/kj-run.md +0 -73
@@ -1,382 +0,0 @@
1
- /**
2
- * Iteration-loop driver — extracted from src/orchestrator/flow-runner.js
3
- * in TSK-0335 (Oleada 3 of the v2.7.4 audit refactor).
4
- *
5
- * Everything inside the coder→reviewer loop:
6
- *
7
- * - runCoderAndRefactorerStages: coder (+ refactorer if enabled), with
8
- * standby handling per stage.
9
- * - runGuardStages: deterministic output/perf guards on the diff.
10
- * - runQualityGateStages: TDD check, Sonar (local + cloud), Impeccable.
11
- * - runReviewerGateStage: reviewer role, with standby handling.
12
- * - handleApprovedReview: wire post-loop stages + finalize session.
13
- * - runSingleIteration: one coder→reviewer cycle (the iteration body).
14
- * - runIterationLoop: the while loop, checkpoints, budget/time
15
- * gates, error recovery via Solomon,
16
- * max-iterations extension path.
17
- *
18
- * Extracted verbatim; no behavior change. flow-runner.js now imports these
19
- * instead of defining them. Part of breaking up the 2254-LOC god-module —
20
- * see docs/ARCHITECTURE.md and the TSK-0335 acceptance criteria.
21
- */
22
-
23
- import { emitProgress, makeEvent } from "../../utils/events.js";
24
- import { msg, getLang } from "../../utils/messages.js";
25
- import { saveSession, markSessionStatus } from "../../session/store.js";
26
- import {
27
- setReviewerFeedback, resetRetryCount,
28
- } from "../../session/mutators.js";
29
- import { invokeSolomon } from "../solomon-escalation.js";
30
- import { buildIterationReport, handleIterationGate } from "../iteration-gate.js";
31
- import {
32
- handleCiEarlyPrOrPush, handleCiReviewDispatch,
33
- } from "../ci-integration.js";
34
- import {
35
- handleCheckpoint, checkSessionTimeout, checkBudgetExceeded,
36
- takeCheckpointSnapshot,
37
- } from "../flow-control.js";
38
- import {
39
- handleSolomonCheck, handleReviewerRetryAndSolomon,
40
- } from "./error-recovery.js";
41
- import { handleMaxIterationsReached } from "./post-loop.js";
42
- import { runCoderAndRefactorerStages } from "./iteration-phases/coder-and-refactorer.js";
43
- import { runGuardStages } from "./iteration-phases/guards.js";
44
- import { runQualityGateStages } from "./iteration-phases/quality-gates.js";
45
- import { runReviewerGateStage } from "./iteration-phases/reviewer-gate.js";
46
- import { handleApprovedReview } from "./iteration-phases/handle-approved.js";
47
-
48
- // `runCoderAndRefactorerStages`, `runGuardStages`, `runQualityGateStages`,
49
- // `runReviewerGateStage` and `handleApprovedReview` were extracted to
50
- // ./iteration-phases/ in the v2.7.x audit follow-up (same pattern as
51
- // pre-loop-phases/). The back-compat re-exports were removed in
52
- // KJC-TSK-0354 PR-D — no caller imported them via this module.
53
-
54
- async function runSingleIteration(ctx) {
55
- // Use plannedTask (HU-scoped or planner-enriched) over the raw original task.
56
- // When running per-HU sub-pipelines, plannedTask is the HU's text, not the full spec.
57
- const { config, logger, emitter, eventBase, session, iteration: i } = ctx;
58
- const task = ctx.plannedTask || ctx.task;
59
-
60
- const iterStart = Date.now();
61
- const ciEnabled = Boolean(config.ci?.enabled) && ctx.gitCtx?.enabled;
62
- logger.setContext({ iteration: i, stage: "iteration" });
63
-
64
- const reviewerRetryCount = session.reviewer_retry_count || 0;
65
- const maxReviewerRetries = config.session.max_reviewer_retries ?? config.session.fail_fast_repeats;
66
- const iterLang = getLang(config);
67
- const iterMsg = msg("pipeline_iteration", iterLang, { current: i, max: config.max_iterations });
68
- emitProgress(emitter, makeEvent("iteration:start", { ...eventBase, stage: "iteration" }, {
69
- message: iterMsg,
70
- detail: { iteration: i, maxIterations: config.max_iterations, reviewerRetryCount, maxReviewerRetries }
71
- }));
72
- logger.info(iterMsg);
73
-
74
- const crResult = await runCoderAndRefactorerStages({
75
- coderRoleInstance: ctx.coderRoleInstance, coderRole: ctx.coderRole, refactorerRole: ctx.refactorerRole,
76
- pipelineFlags: ctx.pipelineFlags, config, logger, emitter, eventBase, session,
77
- plannedTask: ctx.plannedTask, trackBudget: ctx.trackBudget, i, brainCtx: ctx.brainCtx
78
- });
79
- if (crResult.action === "return" || crResult.action === "retry") return crResult;
80
-
81
- const guardResult = await runGuardStages({ config, logger, emitter, eventBase, session, iteration: i });
82
- if (guardResult.action === "return") return guardResult;
83
-
84
- const qgResult = await runQualityGateStages({
85
- config, logger, emitter, eventBase, session, trackBudget: ctx.trackBudget, i,
86
- askQuestion: ctx.askQuestion, repeatDetector: ctx.repeatDetector, budgetSummary: ctx.budgetSummary,
87
- sonarState: ctx.sonarState, task, stageResults: ctx.stageResults, coderRole: ctx.coderRole,
88
- pipelineFlags: ctx.pipelineFlags, brainCtx: ctx.brainCtx
89
- });
90
- if (qgResult.action === "return" || qgResult.action === "continue") return qgResult;
91
-
92
- await handleCiEarlyPrOrPush({
93
- ciEnabled, config, session, emitter, eventBase, gitCtx: ctx.gitCtx, task, logger,
94
- stageResults: ctx.stageResults, i
95
- });
96
-
97
- const revResult = await runReviewerGateStage({
98
- pipelineFlags: ctx.pipelineFlags, reviewerRole: ctx.reviewerRole, config, logger, emitter, eventBase,
99
- session, trackBudget: ctx.trackBudget, i, reviewRules: ctx.reviewRules, task,
100
- repeatDetector: ctx.repeatDetector, budgetSummary: ctx.budgetSummary, askQuestion: ctx.askQuestion,
101
- brainCtx: ctx.brainCtx
102
- });
103
- if (revResult.action === "return" || revResult.action === "retry") return revResult;
104
- const review = revResult.review;
105
-
106
- const iterDuration = Date.now() - iterStart;
107
- emitProgress(emitter, makeEvent("iteration:end", { ...eventBase, stage: "iteration" }, {
108
- message: `Iteration ${i} completed`, detail: { duration: iterDuration }
109
- }));
110
- resetRetryCount(session, "standby");
111
-
112
- // --- Journal: record iteration ---
113
- // Uses the richer iteration-logger from TSK-0286: captures blocking-issue
114
- // details, sonar counts and Solomon rulings in addition to summaries.
115
- if (ctx.journalIterations) {
116
- try {
117
- const { recordIteration, extractIterationData } = await import("../../session/journal/iteration-logger.js");
118
- const iterationData = extractIterationData({
119
- iteration: i,
120
- durationMs: iterDuration,
121
- stageResults: ctx.stageResults,
122
- session: ctx.session,
123
- });
124
- // Derive a richer reviewer summary if none was produced.
125
- if (!iterationData.reviewerSummary && review) {
126
- iterationData.reviewerSummary = review.approved
127
- ? `Approved: ${review.raw_summary || ""}`
128
- : `Rejected: ${(review?.blocking_issues || []).length} blocking issue(s)`;
129
- }
130
- if (!iterationData.blockingIssues || iterationData.blockingIssues.length === 0) {
131
- iterationData.blockingIssues = review?.blocking_issues || [];
132
- }
133
- recordIteration(ctx.session, iterationData);
134
- } catch (err) {
135
- logger.warn(`Iteration journal record failed (non-blocking): ${err.message}`);
136
- }
137
- }
138
-
139
- const solomonResult = await handleSolomonCheck({
140
- config, session, emitter, eventBase, logger, task, i, askQuestion: ctx.askQuestion,
141
- ciEnabled, blockingIssues: review?.blocking_issues, brainCtx: ctx.brainCtx
142
- });
143
- if (solomonResult.action === "pause") return { action: "return", result: solomonResult.result };
144
-
145
- await handleCiReviewDispatch({ ciEnabled, config, session, review, i, logger });
146
-
147
- if (review.approved) {
148
- const approvedResult = await handleApprovedReview({
149
- config, session, emitter, eventBase, coderRole: ctx.coderRole, trackBudget: ctx.trackBudget, i, task,
150
- stageResults: ctx.stageResults, pipelineFlags: ctx.pipelineFlags, askQuestion: ctx.askQuestion, logger,
151
- gitCtx: ctx.gitCtx, budgetSummary: ctx.budgetSummary, pgCard: ctx.pgCard, pgProject: ctx.pgProject, review,
152
- rtkTracker: ctx.rtkTracker, brainCtx: ctx.brainCtx
153
- });
154
- if (approvedResult.action === "return" || approvedResult.action === "continue") return approvedResult;
155
- }
156
-
157
- // Solomon already evaluated the rejection in runReviewerStage -> handleReviewerRejection
158
- // Only use retry counter as fallback if Solomon is disabled
159
- if (!config.pipeline?.solomon?.enabled) {
160
- const retryResult = await handleReviewerRetryAndSolomon({ config, session, emitter, eventBase, logger, review, task, i, askQuestion: ctx.askQuestion });
161
- if (retryResult.action === "return") return retryResult;
162
- } else {
163
- // Solomon is enabled — feed back the blocking issues for the next coder iteration
164
- setReviewerFeedback(session, review.blocking_issues
165
- .map((x) => {
166
- const parts = [`[${x.severity || "high"}] ${x.id || "ISSUE"}: ${x.description || "Missing description"}`];
167
- if (x.file) parts.push(` File: ${x.file}${x.line ? `:${x.line}` : ""}`);
168
- if (x.suggested_fix) parts.push(` Fix: ${x.suggested_fix}`);
169
- return parts.join("\n");
170
- })
171
- .join("\n\n"));
172
- await saveSession(session);
173
- }
174
-
175
- return { action: "next" };
176
- }
177
-
178
-
179
- /**
180
- * Run the standard iteration loop for a given task using the pipeline context.
181
- * Returns a result object with at least { approved: boolean }.
182
- * Used both as the main loop and as the per-HU callback in sub-pipeline mode.
183
- */
184
- export async function runIterationLoop(ctx, { task: loopTask, askQuestion, emitter, logger }) {
185
- ctx.plannedTask = loopTask;
186
-
187
- const checkpointIntervalMs = (ctx.config.session.checkpoint_interval_minutes ?? 5) * 60 * 1000;
188
- let lastCheckpointAt = Date.now();
189
- let checkpointDisabled = false;
190
- let lastCheckpointSnapshot = takeCheckpointSnapshot(ctx.session);
191
-
192
- let i = 0;
193
- while (i < ctx.config.max_iterations) {
194
- i += 1;
195
- const elapsedMinutes = (Date.now() - ctx.startedAt) / 60000;
196
-
197
- const cpResult = await handleCheckpoint({
198
- checkpointDisabled, askQuestion, lastCheckpointAt, checkpointIntervalMs, elapsedMinutes,
199
- i, config: ctx.config, budgetTracker: ctx.budgetTracker, stageResults: ctx.stageResults, emitter, eventBase: ctx.eventBase, session: ctx.session, budgetSummary: ctx.budgetSummary, lastCheckpointSnapshot
200
- });
201
- if (cpResult.action === "stop") {
202
- return cpResult.result;
203
- }
204
- checkpointDisabled = cpResult.checkpointDisabled;
205
- lastCheckpointAt = cpResult.lastCheckpointAt;
206
- if (cpResult.lastCheckpointSnapshot !== undefined) lastCheckpointSnapshot = cpResult.lastCheckpointSnapshot;
207
-
208
- await checkSessionTimeout({ askQuestion, elapsedMinutes, config: ctx.config, session: ctx.session, emitter, eventBase: ctx.eventBase, i, budgetSummary: ctx.budgetSummary });
209
- await checkBudgetExceeded({ budgetTracker: ctx.budgetTracker, config: ctx.config, session: ctx.session, emitter, eventBase: ctx.eventBase, i, budgetLimit: ctx.budgetLimit, budgetSummary: ctx.budgetSummary });
210
-
211
- ctx.eventBase.iteration = i;
212
- ctx.iteration = i;
213
- // KJC-TSK-1070 (MR-D2): an HU lane picks its coder's route per iteration.
214
- ctx.beforeIteration?.(i);
215
-
216
- let iterResult;
217
- try {
218
- iterResult = await runSingleIteration(ctx);
219
- } catch (stageError) {
220
- // ANY unhandled error in a stage = out of normal flow → Solomon decides
221
- logger.warn(`Stage error caught — escalating to Solomon: ${stageError.message}`);
222
- const solomonResult = await invokeSolomon({
223
- config: ctx.config, logger, emitter, eventBase: ctx.eventBase,
224
- stage: "stage_error", askQuestion, session: ctx.session, iteration: i,
225
- conflict: {
226
- stage: "stage_error",
227
- task: loopTask,
228
- iterationCount: i,
229
- maxIterations: ctx.config.max_iterations,
230
- budget_usd: ctx.budgetSummary()?.total_cost_usd || 0,
231
- history: [{ agent: "pipeline", feedback: `Stage threw: ${stageError.message}` }]
232
- }
233
- });
234
-
235
- if (solomonResult.action === "approve") {
236
- logger.info("Solomon approved despite stage error");
237
- return { approved: true, sessionId: ctx.session.id, reason: "solomon_approved_after_error" };
238
- }
239
- if (solomonResult.action === "continue") {
240
- if (solomonResult.humanGuidance) {
241
- setReviewerFeedback(ctx.session, `Solomon guidance: ${solomonResult.humanGuidance}`);
242
- }
243
- continue; // next iteration
244
- }
245
- if (solomonResult.action === "pause") {
246
- return { paused: true, sessionId: ctx.session.id, question: solomonResult.question, context: "stage_error" };
247
- }
248
- // Solomon couldn't resolve — fail
249
- await markSessionStatus(ctx.session, "failed");
250
- return { approved: false, sessionId: ctx.session.id, reason: "stage_error", error: stageError.message };
251
- }
252
-
253
- if (iterResult.action === "return") {
254
- return iterResult.result;
255
- }
256
- if (iterResult.action === "retry") { i -= 1; }
257
- else {
258
- await ensureIterationRecorded(ctx, i, logger);
259
- // Iteration gate (KJC-TSK-0628): opt-in pause with a report before the
260
- // next iteration; free-text answers become directives for the coder.
261
- const gate = await handleIterationGate({
262
- enabled: ctx.config.session?.iteration_gate === true,
263
- askQuestion, session: ctx.session, logger,
264
- report: buildIterationReport({
265
- i, maxIterations: ctx.config.max_iterations, stageResults: ctx.stageResults,
266
- budgetTracker: ctx.budgetTracker, maxBudgetUsd: ctx.config.max_budget_usd,
267
- }),
268
- });
269
- if (gate.action === "stop") {
270
- return { approved: false, sessionId: ctx.session.id, reason: "user_stopped_at_gate", iteration: i };
271
- }
272
- }
273
- }
274
-
275
- // Solomon decides whether to extend iterations or stop
276
- const maxIterResult = await handleMaxIterationsReached({ session: ctx.session, budgetSummary: ctx.budgetSummary, emitter, eventBase: ctx.eventBase, config: ctx.config, stageResults: ctx.stageResults, logger, askQuestion, task: loopTask, rtkTracker: ctx.rtkTracker, brainCtx: ctx.brainCtx });
277
-
278
- // Solomon said "continue" — extend iterations and keep going
279
- if (maxIterResult.reason === "max_iterations_extended") {
280
- const extra = maxIterResult.extraIterations || ctx.config.max_iterations;
281
- ctx.config.max_iterations += extra;
282
- logger.info(`Solomon extended pipeline by ${extra} iterations (new max: ${ctx.config.max_iterations})`);
283
-
284
- if (maxIterResult.humanGuidance) {
285
- setReviewerFeedback(ctx.session, `Solomon guidance: ${maxIterResult.humanGuidance}`);
286
- }
287
-
288
- // Continue the loop
289
- while (i < ctx.config.max_iterations) {
290
- i += 1;
291
- const elapsedMinutes = (Date.now() - ctx.startedAt) / 60000;
292
-
293
- const cpResult = await handleCheckpoint({
294
- checkpointDisabled, askQuestion, lastCheckpointAt, checkpointIntervalMs, elapsedMinutes,
295
- i, config: ctx.config, budgetTracker: ctx.budgetTracker, stageResults: ctx.stageResults, emitter, eventBase: ctx.eventBase, session: ctx.session, budgetSummary: ctx.budgetSummary, lastCheckpointSnapshot
296
- });
297
- if (cpResult.action === "stop") return cpResult.result;
298
- checkpointDisabled = cpResult.checkpointDisabled;
299
- lastCheckpointAt = cpResult.lastCheckpointAt;
300
- if (cpResult.lastCheckpointSnapshot !== undefined) lastCheckpointSnapshot = cpResult.lastCheckpointSnapshot;
301
-
302
- await checkSessionTimeout({ askQuestion, elapsedMinutes, config: ctx.config, session: ctx.session, emitter, eventBase: ctx.eventBase, i, budgetSummary: ctx.budgetSummary });
303
- await checkBudgetExceeded({ budgetTracker: ctx.budgetTracker, config: ctx.config, session: ctx.session, emitter, eventBase: ctx.eventBase, i, budgetLimit: ctx.budgetLimit, budgetSummary: ctx.budgetSummary });
304
-
305
- ctx.eventBase.iteration = i;
306
- ctx.iteration = i;
307
-
308
- const iterResult = await runSingleIteration(ctx);
309
- if (iterResult.action === "return") return iterResult.result;
310
- if (iterResult.action === "retry") { i -= 1; }
311
- else {
312
- await ensureIterationRecorded(ctx, i, logger);
313
- // Same iteration gate on Solomon-extended iterations (KJC-TSK-0628).
314
- const gate = await handleIterationGate({
315
- enabled: ctx.config.session?.iteration_gate === true,
316
- askQuestion, session: ctx.session, logger,
317
- report: buildIterationReport({
318
- i, maxIterations: ctx.config.max_iterations, stageResults: ctx.stageResults,
319
- budgetTracker: ctx.budgetTracker, maxBudgetUsd: ctx.config.max_budget_usd,
320
- }),
321
- });
322
- if (gate.action === "stop") {
323
- return { approved: false, sessionId: ctx.session.id, reason: "user_stopped_at_gate", iteration: i };
324
- }
325
- }
326
- }
327
-
328
- // Extended iterations also exhausted — final Solomon call
329
- const finalResult = await handleMaxIterationsReached({ session: ctx.session, budgetSummary: ctx.budgetSummary, emitter, eventBase: ctx.eventBase, config: ctx.config, stageResults: ctx.stageResults, logger, askQuestion, task: loopTask, rtkTracker: ctx.rtkTracker, brainCtx: ctx.brainCtx });
330
- return finalizeMaxIterationsApproval(ctx, finalResult, { task: loopTask, askQuestion, emitter, logger, i });
331
- }
332
-
333
- return finalizeMaxIterationsApproval(ctx, maxIterResult, { task: loopTask, askQuestion, emitter, logger, i });
334
- }
335
-
336
- // KJC-BUG-0117: iterations that end before the reviewer (TDD/sonar
337
- // "continue", guard retries) never reached the recordIteration call at
338
- // the end of runSingleIteration, so session._journalIterations stayed
339
- // empty and the journal read "Iterations: 0" after a 5-iteration run.
340
- export async function ensureIterationRecorded(ctx, i, logger) {
341
- if (!ctx.journalIterations) return;
342
- if ((ctx.session._journalIterations?.length || 0) >= i) return;
343
- try {
344
- const { recordIteration, extractIterationData } = await import("../../session/journal/iteration-logger.js");
345
- recordIteration(ctx.session, extractIterationData({
346
- iteration: i, durationMs: 0, stageResults: ctx.stageResults, session: ctx.session,
347
- }));
348
- } catch (err) {
349
- logger.warn(`Iteration journal record failed (non-blocking): ${err.message}`);
350
- }
351
- }
352
-
353
- // KJC-BUG-0116: an "approved" verdict at max_iterations (brain_approved,
354
- // brain_solomon_approved, solomon_approved) used to be returned as-is,
355
- // skipping the entire post-loop (tester/security/audit) AND git
356
- // automation (push/PR) that every reviewer-approved session gets — the
357
- // session read "approved" with zero verification and zero push. Route it
358
- // through the same handleApprovedReview path instead.
359
- export async function finalizeMaxIterationsApproval(ctx, maxIterResult, { task, askQuestion, emitter, logger, i }) {
360
- if (maxIterResult?.approved !== true) return maxIterResult;
361
-
362
- const review = {
363
- approved: true,
364
- raw_summary: `Finalized at max_iterations (${maxIterResult.reason || "approved"})`,
365
- blocking_issues: []
366
- };
367
- const fin = await handleApprovedReview({
368
- config: ctx.config, session: ctx.session, emitter, eventBase: ctx.eventBase,
369
- coderRole: ctx.coderRole, trackBudget: ctx.trackBudget, i, task,
370
- stageResults: ctx.stageResults, pipelineFlags: ctx.pipelineFlags, askQuestion, logger,
371
- gitCtx: ctx.gitCtx, budgetSummary: ctx.budgetSummary, pgCard: ctx.pgCard, pgProject: ctx.pgProject,
372
- review, rtkTracker: ctx.rtkTracker, brainCtx: ctx.brainCtx
373
- });
374
- if (fin.action === "return") return fin.result;
375
-
376
- // Post-loop demanded another coder pass but iterations are exhausted —
377
- // report honestly instead of a false green.
378
- logger.warn("Post-loop stages rejected the work at max_iterations — session NOT approved");
379
- await markSessionStatus(ctx.session, "failed");
380
- return { approved: false, sessionId: ctx.session.id, reason: "post_loop_rejected_at_max_iterations" };
381
- }
382
-
@@ -1,69 +0,0 @@
1
- /**
2
- * Iteration phase: coder (+ refactorer if enabled) with standby handling.
3
- *
4
- * Extracted verbatim from `src/orchestrator/drivers/iteration-loop.js` in
5
- * the v2.7.x audit follow-up to keep the iteration-loop driver under the
6
- * 600-LOC ceiling. Behaviour is byte-for-byte identical to the inlined
7
- * version. The extraction follows the same pattern as
8
- * `pre-loop-phases/` (see TSK-0337).
9
- *
10
- * Returns { action: "ok" | "return" | "retry", result? }.
11
- * - "ok" → caller continues to the next phase.
12
- * - "return" → caller returns `result` to its own caller (pause/abort).
13
- * - "retry" → caller decrements its iteration counter and retries.
14
- */
15
-
16
- import { runRefactorerStage } from "../../iteration-stages.js";
17
- import { stageRegistry } from "../../stages/stage-classes.js";
18
- import { runStage } from "../../stages/stage-executor.js";
19
- import { handleStandbyResult } from "../error-recovery.js";
20
-
21
- /**
22
- * A coder/refactorer stage hit a provider quota cap and Brain Recovery
23
- * hibernated the run. Turn it into a clean loop return carrying
24
- * `hibernated:true` — the iteration loop and flow-runner read that to
25
- * seal the session as `hibernated` (NOT `failed`) so it stays resumable.
26
- */
27
- function hibernateReturn(stageResult, session) {
28
- return {
29
- action: "return",
30
- result: {
31
- hibernated: true,
32
- sessionId: session?.id || null,
33
- reason: "quota_exhausted",
34
- standbyFile: stageResult.standbyFile || null,
35
- recovery: stageResult.recovery || null,
36
- },
37
- };
38
- }
39
-
40
- export async function runCoderAndRefactorerStages({ coderRoleInstance, coderRole, refactorerRole, pipelineFlags, config, logger, emitter, eventBase, session, plannedTask, trackBudget, i, brainCtx }) {
41
- // Coder via StageRegistry (TSK-0336). canRun = coderRequired !== false; in
42
- // analysis-only task types coderRequired is set to false by policy, so the
43
- // stage is never even entered — matches the previous guard at the top of
44
- // runFlow.
45
- const coderCtx = { coderRoleInstance, coderRole, config, logger, emitter, eventBase, session, plannedTask, trackBudget, iteration: i, brainCtx, pipelineFlags };
46
- const coderResult = await runStage(stageRegistry.get("coder"), coderCtx);
47
- if (coderResult?.action === "hibernate") return hibernateReturn(coderResult, session);
48
- if (coderResult?.action === "pause") return { action: "return", result: coderResult.result };
49
- const coderStandby = await handleStandbyResult({ stageResult: coderResult, session, emitter, eventBase, i, stage: "coder", logger, config });
50
- if (coderStandby.handled) {
51
- return coderStandby.action === "return"
52
- ? { action: "return", result: coderStandby.result }
53
- : { action: "retry" };
54
- }
55
-
56
- if (pipelineFlags.refactorerEnabled) {
57
- const refResult = await runRefactorerStage({ refactorerRole, config, logger, emitter, eventBase, session, plannedTask, trackBudget, iteration: i });
58
- if (refResult?.action === "hibernate") return hibernateReturn(refResult, session);
59
- if (refResult?.action === "pause") return { action: "return", result: refResult.result };
60
- const refStandby = await handleStandbyResult({ stageResult: refResult, session, emitter, eventBase, i, stage: "refactorer", logger, config });
61
- if (refStandby.handled) {
62
- return refStandby.action === "return"
63
- ? { action: "return", result: refStandby.result }
64
- : { action: "retry" };
65
- }
66
- }
67
-
68
- return { action: "ok" };
69
- }
@@ -1,91 +0,0 @@
1
- /**
2
- * Iteration phase: deterministic output / perf guards on the diff.
3
- *
4
- * Extracted verbatim from `src/orchestrator/drivers/iteration-loop.js` in
5
- * the v2.7.x audit follow-up to keep the iteration-loop driver under the
6
- * 600-LOC ceiling. Behaviour is byte-for-byte identical to the inlined
7
- * version.
8
- *
9
- * Returns { action: "ok" | "return", result? }.
10
- * - "ok" → caller continues to the next phase.
11
- * - "return" → caller returns `result` (output guard blocked on critical
12
- * violations).
13
- */
14
-
15
- import { emitProgress, makeEvent } from "../../../utils/events.js";
16
- import { markSessionStatus, addCheckpoint } from "../../../session/store.js";
17
- import { generateDiff, computeBaseRef } from "../../../review/diff-generator.js";
18
- import { scanDiff } from "../../../guards/output-guard.js";
19
- import { scanPerfDiff } from "../../../guards/perf-guard.js";
20
-
21
- export async function runGuardStages({ config, logger, emitter, eventBase, session, iteration }) {
22
- const outputEnabled = config.guards?.output?.enabled !== false;
23
- const perfEnabled = config.guards?.perf?.enabled !== false;
24
-
25
- if (!outputEnabled && !perfEnabled) return { action: "ok" };
26
-
27
- // KJC-BUG-0214 (issue #1733): los guards juzgan LO QUE HA HECHO ESTE RUN, no
28
- // la rama entera. Con el merge-base contra la base, cualquier linea anadida
29
- // en cualquier momento de la rama contaba como recien escrita, y una
30
- // ejecucion se bloqueo por codigo preexistente que el coder no toco. La
31
- // sesion ya guarda HEAD al arrancar precisamente para esto.
32
- const baseBranch = config.base_branch || "main";
33
- const runStart = session?.head_at_start || session?.session_start_sha || null;
34
- let diff;
35
- try {
36
- const baseRef = runStart || await computeBaseRef({ baseBranch });
37
- if (!runStart) logger.warn("Guards: sin punto de arranque del run, se juzga la rama entera contra la base");
38
- diff = await generateDiff({ baseRef, projectDir: config?.projectDir || null });
39
- } catch {
40
- logger.warn("Guards: could not generate diff, skipping");
41
- return { action: "ok" };
42
- }
43
-
44
- if (!diff) return { action: "ok" };
45
-
46
- if (outputEnabled) {
47
- const outputResult = scanDiff(diff, config);
48
- if (outputResult.violations.length > 0) {
49
- const critical = outputResult.violations.filter(v => v.severity === "critical");
50
- const warnings = outputResult.violations.filter(v => v.severity === "warning");
51
- emitProgress(emitter, makeEvent("guard:output", { ...eventBase, stage: "guard" }, {
52
- message: `Output guard: ${critical.length} critical, ${warnings.length} warnings`,
53
- detail: { violations: outputResult.violations, executorType: "local" }
54
- }));
55
- logger.info(`Output guard: ${outputResult.violations.length} violation(s) found`);
56
- for (const v of outputResult.violations) {
57
- logger.info(` [${v.severity}] ${v.file}:${v.line} — ${v.message}`);
58
- }
59
- await addCheckpoint(session, { stage: "guard-output", iteration, pass: outputResult.pass, violations: outputResult.violations.length });
60
-
61
- if (!outputResult.pass && config.guards.output.on_violation === "block") {
62
- await markSessionStatus(session, "failed");
63
- emitProgress(emitter, makeEvent("guard:blocked", { ...eventBase, stage: "guard" }, {
64
- message: "Output guard blocked: critical violations detected",
65
- detail: { violations: critical }
66
- }));
67
- return {
68
- action: "return",
69
- result: { approved: false, sessionId: session.id, reason: "guard_blocked", violations: critical }
70
- };
71
- }
72
- }
73
- }
74
-
75
- if (perfEnabled) {
76
- const perfResult = scanPerfDiff(diff, config);
77
- if (!perfResult.skipped && perfResult.violations.length > 0) {
78
- emitProgress(emitter, makeEvent("guard:perf", { ...eventBase, stage: "guard" }, {
79
- message: `Perf guard: ${perfResult.violations.length} issue(s)`,
80
- detail: { violations: perfResult.violations, executorType: "local" }
81
- }));
82
- logger.info(`Perf guard: ${perfResult.violations.length} issue(s) found`);
83
- for (const v of perfResult.violations) {
84
- logger.info(` [${v.severity}] ${v.file}:${v.line} — ${v.message}`);
85
- }
86
- await addCheckpoint(session, { stage: "guard-perf", iteration, pass: perfResult.pass, violations: perfResult.violations.length });
87
- }
88
- }
89
-
90
- return { action: "ok" };
91
- }
@@ -1,29 +0,0 @@
1
- /**
2
- * Iteration phase: post-loop wiring + session finalization when the
3
- * reviewer approves.
4
- *
5
- * Extracted verbatim from `src/orchestrator/drivers/iteration-loop.js` in
6
- * the v2.7.x audit follow-up to keep the iteration-loop driver under the
7
- * 600-LOC ceiling. Behaviour is byte-for-byte identical to the inlined
8
- * version.
9
- *
10
- * Returns { action: "return" | "continue", result? }.
11
- * - "return" → caller returns `result` (final approved session).
12
- * - "continue" → caller continues the iteration loop.
13
- */
14
-
15
- import { resetRetryCount } from "../../../session/mutators.js";
16
- import { handlePostLoopStages, finalizeApprovedSession } from "../post-loop.js";
17
-
18
- export async function handleApprovedReview({ config, session, emitter, eventBase, coderRole, trackBudget, i, task, stageResults, pipelineFlags, askQuestion, logger, gitCtx, budgetSummary, pgCard, pgProject, review, rtkTracker, brainCtx }) {
19
- resetRetryCount(session, "reviewer");
20
- const postLoopResult = await handlePostLoopStages({
21
- config, session, emitter, eventBase, coderRole, trackBudget, i, task, stageResults,
22
- ciEnabled: Boolean(config.ci?.enabled), testerEnabled: pipelineFlags.testerEnabled, securityEnabled: pipelineFlags.securityEnabled, askQuestion, logger, brainCtx
23
- });
24
- if (postLoopResult.action === "return") return { action: "return", result: postLoopResult.result };
25
- if (postLoopResult.action === "continue") return { action: "continue" };
26
-
27
- const result = await finalizeApprovedSession({ config, gitCtx, task, logger, session, stageResults, emitter, eventBase, budgetSummary, pgCard, pgProject, review, i, rtkTracker });
28
- return { action: "return", result };
29
- }