@straiffi/archon 1.10.1 → 1.10.3

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 (182) hide show
  1. package/dist/client/assets/ActivityView-B00t5YvM.js +1 -0
  2. package/dist/client/assets/{GitHubActionsDialog-BABPYwJP.js → GitHubActionsDialog-DL1RASVT.js} +1 -1
  3. package/dist/client/assets/{VerificationDialog-LN87YY0r.js → VerificationDialog-CYCrlqmj.js} +1 -1
  4. package/dist/client/assets/{architectureDiagram-3BPJPVTR-DBXhcjPI.js → architectureDiagram-3BPJPVTR-D154Ue77.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-GPEHLZMM-c3auwNH7.js → blockDiagram-GPEHLZMM-Bczo8yL4.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-AAUBKEIU-DH2YznEQ.js → c4Diagram-AAUBKEIU-DhNO2xdU.js} +1 -1
  7. package/dist/client/assets/channel-UfTuRVnD.js +1 -0
  8. package/dist/client/assets/{chunk-2J33WTMH-D0_MoyXZ.js → chunk-2J33WTMH-C-9oXMQh.js} +1 -1
  9. package/dist/client/assets/{chunk-3OPIFGDE-DLvSp1DN.js → chunk-3OPIFGDE-C0WrA6dp.js} +1 -1
  10. package/dist/client/assets/{chunk-5ZQYHXKU-B4sX8Htk.js → chunk-5ZQYHXKU-DJ6o7jkk.js} +1 -1
  11. package/dist/client/assets/{chunk-727SXJPM-CkdnShG1.js → chunk-727SXJPM-MjJ8OutE.js} +1 -1
  12. package/dist/client/assets/{chunk-AQP2D5EJ-BdPfgkcs.js → chunk-AQP2D5EJ-HYanGaMO.js} +1 -1
  13. package/dist/client/assets/{chunk-CSCIHK7Q-CK-DpVF6.js → chunk-CSCIHK7Q-CNZTo9o2.js} +1 -1
  14. package/dist/client/assets/{chunk-KSCS5N6A-DSbTWVl2.js → chunk-KSCS5N6A-Dz-GLjci.js} +1 -1
  15. package/dist/client/assets/{chunk-L5ZTLDWV-DuQ4EPLl.js → chunk-L5ZTLDWV-DgLLQVzW.js} +1 -1
  16. package/dist/client/assets/{chunk-LZXEDZCA-CtpoXWMY.js → chunk-LZXEDZCA-Da9lwzEw.js} +2 -2
  17. package/dist/client/assets/{chunk-ND2GUHAM-CDfNOP6o.js → chunk-ND2GUHAM-BPnz-91H.js} +1 -1
  18. package/dist/client/assets/{chunk-NZK2D7GU-s6ReY4ev.js → chunk-NZK2D7GU-BfIcF7tV.js} +1 -1
  19. package/dist/client/assets/{chunk-O5CBEL6O-DxqYGKhS.js → chunk-O5CBEL6O-B3QOwsKP.js} +1 -1
  20. package/dist/client/assets/{chunk-WU5MYG2G-BvrhxyV8.js → chunk-WU5MYG2G-BBED6bLU.js} +1 -1
  21. package/dist/client/assets/classDiagram-4FO5ZUOK-D3uRQkFY.js +1 -0
  22. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Cf_xrP1l.js +1 -0
  23. package/dist/client/assets/{dagre-BM42HDAG-DEK_rftr.js → dagre-BM42HDAG-Cwumk4ZR.js} +1 -1
  24. package/dist/client/assets/{diagram-2AECGRRQ-CpobcZnv.js → diagram-2AECGRRQ-ClslRirB.js} +1 -1
  25. package/dist/client/assets/{diagram-5GNKFQAL-zL1D1L_8.js → diagram-5GNKFQAL-CzE9h3uR.js} +1 -1
  26. package/dist/client/assets/{diagram-KO2AKTUF-gyW-Vc7c.js → diagram-KO2AKTUF-Drs_bJ92.js} +1 -1
  27. package/dist/client/assets/{diagram-LMA3HP47-DDEYc8sh.js → diagram-LMA3HP47-CxxNSrFg.js} +1 -1
  28. package/dist/client/assets/{diagram-OG6HWLK6-BtUrfJnE.js → diagram-OG6HWLK6-BHHFOg_M.js} +1 -1
  29. package/dist/client/assets/{erDiagram-TEJ5UH35-qGrmpmmk.js → erDiagram-TEJ5UH35-CLYVwEgc.js} +1 -1
  30. package/dist/client/assets/{flowDiagram-I6XJVG4X-DO1Nm1FA.js → flowDiagram-I6XJVG4X-s3nCY3e0.js} +1 -1
  31. package/dist/client/assets/{ganttDiagram-6RSMTGT7-DGuMVCAc.js → ganttDiagram-6RSMTGT7-Bw1QcLzc.js} +1 -1
  32. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CehPAc8-.js → gitGraphDiagram-PVQCEYII-Bi7EO2ZX.js} +1 -1
  33. package/dist/client/assets/index-Bg3l17L3.css +2 -0
  34. package/dist/client/assets/index-XSKL8H3C.js +276 -0
  35. package/dist/client/assets/{infoDiagram-5YYISTIA-BkRaMDId.js → infoDiagram-5YYISTIA-BamFbqOO.js} +1 -1
  36. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-B45ubODJ.js → ishikawaDiagram-YF4QCWOH-DH43ZIY5.js} +1 -1
  37. package/dist/client/assets/{journeyDiagram-JHISSGLW-BLxrlitK.js → journeyDiagram-JHISSGLW-BPgBXUEQ.js} +1 -1
  38. package/dist/client/assets/{kanban-definition-UN3LZRKU-DmyeJDyy.js → kanban-definition-UN3LZRKU-CjMJrDcd.js} +1 -1
  39. package/dist/client/assets/{line-BhwjsX6t.js → line-Btqc-Cax.js} +1 -1
  40. package/dist/client/assets/{mermaid-parser.core-CPvivy_u.js → mermaid-parser.core-Bl51lVG0.js} +1 -1
  41. package/dist/client/assets/{mermaid.core-Dr0kld-g.js → mermaid.core-s9FJYhni.js} +3 -3
  42. package/dist/client/assets/{mindmap-definition-RKZ34NQL-dfudPzBR.js → mindmap-definition-RKZ34NQL-kakxNN97.js} +1 -1
  43. package/dist/client/assets/{pieDiagram-4H26LBE5-BhsIQVNX.js → pieDiagram-4H26LBE5-BQYRlP-G.js} +1 -1
  44. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-CAKxScLD.js → quadrantDiagram-W4KKPZXB-DGJRVtrA.js} +1 -1
  45. package/dist/client/assets/{requirementDiagram-4Y6WPE33-Br6jIbke.js → requirementDiagram-4Y6WPE33-BSUtkGbI.js} +1 -1
  46. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-BqujNgnY.js → sankeyDiagram-5OEKKPKP-CN9oFkiG.js} +1 -1
  47. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-Dr_VM_ei.js → sequenceDiagram-3UESZ5HK-Dv60bCDo.js} +1 -1
  48. package/dist/client/assets/{stateDiagram-AJRCARHV-CDbSbbTW.js → stateDiagram-AJRCARHV-C_YPsL77.js} +1 -1
  49. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-fcBW8vtz.js +1 -0
  50. package/dist/client/assets/{timeline-definition-PNZ67QCA-CnuLuWDs.js → timeline-definition-PNZ67QCA-Y5JAv2Im.js} +1 -1
  51. package/dist/client/assets/{vennDiagram-CIIHVFJN-CVAhxdBZ.js → vennDiagram-CIIHVFJN-CvVupaFs.js} +1 -1
  52. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-Dmczey27.js → wardleyDiagram-YWT4CUSO-CXPkAtzZ.js} +1 -1
  53. package/dist/client/assets/{xychartDiagram-2RQKCTM6-Bl6JGLCU.js → xychartDiagram-2RQKCTM6-BOrLRJbu.js} +1 -1
  54. package/dist/client/index.html +2 -2
  55. package/dist/server/db.js +640 -0
  56. package/dist/server/db.js.map +1 -1
  57. package/dist/server/index.js +787 -124
  58. package/dist/server/index.js.map +1 -1
  59. package/dist/server/lib/agentCatalog.js +35 -0
  60. package/dist/server/lib/agentCatalog.js.map +1 -0
  61. package/dist/server/lib/agentModelConfig.js +151 -0
  62. package/dist/server/lib/agentModelConfig.js.map +1 -0
  63. package/dist/server/lib/agentRuns.js +1 -0
  64. package/dist/server/lib/agentRuns.js.map +1 -1
  65. package/dist/server/lib/automationCheckGate.js +98 -9
  66. package/dist/server/lib/automationCheckGate.js.map +1 -1
  67. package/dist/server/lib/automationLoopAgentEvidence.js +42 -0
  68. package/dist/server/lib/automationLoopAgentEvidence.js.map +1 -0
  69. package/dist/server/lib/automationLoopProjection.js +339 -0
  70. package/dist/server/lib/automationLoopProjection.js.map +1 -0
  71. package/dist/server/lib/automationProgression.js +115 -6
  72. package/dist/server/lib/automationProgression.js.map +1 -1
  73. package/dist/server/lib/automationReconciliation.js +27 -11
  74. package/dist/server/lib/automationReconciliation.js.map +1 -1
  75. package/dist/server/lib/automationResumeDecision.js +55 -15
  76. package/dist/server/lib/automationResumeDecision.js.map +1 -1
  77. package/dist/server/lib/automationReviewGate.js +352 -26
  78. package/dist/server/lib/automationReviewGate.js.map +1 -1
  79. package/dist/server/lib/buildFlow.js +12 -0
  80. package/dist/server/lib/buildFlow.js.map +1 -1
  81. package/dist/server/lib/bundleReviewOperations.js +40 -23
  82. package/dist/server/lib/bundleReviewOperations.js.map +1 -1
  83. package/dist/server/lib/chatOperations.js +26 -4
  84. package/dist/server/lib/chatOperations.js.map +1 -1
  85. package/dist/server/lib/checkAutoFix.js +5 -4
  86. package/dist/server/lib/checkAutoFix.js.map +1 -1
  87. package/dist/server/lib/checkAutoFixDetails.js +54 -9
  88. package/dist/server/lib/checkAutoFixDetails.js.map +1 -1
  89. package/dist/server/lib/checkExecutionEnvironment.js +1 -1
  90. package/dist/server/lib/checkGateEvaluations.js +6 -1
  91. package/dist/server/lib/checkGateEvaluations.js.map +1 -1
  92. package/dist/server/lib/checkRepair.js +30 -0
  93. package/dist/server/lib/checkRepair.js.map +1 -1
  94. package/dist/server/lib/checkRunner.js +11 -6
  95. package/dist/server/lib/checkRunner.js.map +1 -1
  96. package/dist/server/lib/checkRuns.js +1 -1
  97. package/dist/server/lib/claudeAgentProvider.js +19 -0
  98. package/dist/server/lib/claudeAgentProvider.js.map +1 -1
  99. package/dist/server/lib/executionEnvironmentValidation.js +9 -3
  100. package/dist/server/lib/executionEnvironmentValidation.js.map +1 -1
  101. package/dist/server/lib/executionRuns.js +17 -3
  102. package/dist/server/lib/executionRuns.js.map +1 -1
  103. package/dist/server/lib/executionTimeline.js +3 -0
  104. package/dist/server/lib/executionTimeline.js.map +1 -1
  105. package/dist/server/lib/lightweightPrompt.js +13 -40
  106. package/dist/server/lib/lightweightPrompt.js.map +1 -1
  107. package/dist/server/lib/mobileAccess.js +47 -3
  108. package/dist/server/lib/mobileAccess.js.map +1 -1
  109. package/dist/server/lib/modelResolutionErrors.js +24 -0
  110. package/dist/server/lib/modelResolutionErrors.js.map +1 -0
  111. package/dist/server/lib/models.js +9 -9
  112. package/dist/server/lib/models.js.map +1 -1
  113. package/dist/server/lib/projectAutoConfig.js +15 -52
  114. package/dist/server/lib/projectAutoConfig.js.map +1 -1
  115. package/dist/server/lib/projectMemoryScan.js +15 -9
  116. package/dist/server/lib/projectMemoryScan.js.map +1 -1
  117. package/dist/server/lib/projects.js +59 -4
  118. package/dist/server/lib/projects.js.map +1 -1
  119. package/dist/server/lib/reviewRepairCompletion.js +126 -0
  120. package/dist/server/lib/reviewRepairCompletion.js.map +1 -0
  121. package/dist/server/lib/reviewRepairIterationRecords.js +149 -0
  122. package/dist/server/lib/reviewRepairIterationRecords.js.map +1 -0
  123. package/dist/server/lib/reviewRepairIterations.js +590 -0
  124. package/dist/server/lib/reviewRepairIterations.js.map +1 -0
  125. package/dist/server/lib/reviewRepairReconciliation.js +588 -0
  126. package/dist/server/lib/reviewRepairReconciliation.js.map +1 -0
  127. package/dist/server/lib/reviewerConfig.js +18 -7
  128. package/dist/server/lib/reviewerConfig.js.map +1 -1
  129. package/dist/server/lib/run.js +21 -20
  130. package/dist/server/lib/run.js.map +1 -1
  131. package/dist/server/lib/shell.js +13 -0
  132. package/dist/server/lib/shell.js.map +1 -1
  133. package/dist/server/lib/specArtifact.js +1 -1
  134. package/dist/server/lib/specArtifact.js.map +1 -1
  135. package/dist/server/lib/specGraphFeature.js +2 -2
  136. package/dist/server/lib/specGraphFeature.js.map +1 -1
  137. package/dist/server/lib/specOperations.js +26 -4
  138. package/dist/server/lib/specOperations.js.map +1 -1
  139. package/dist/server/lib/specRepositoryEvidenceFormatting.js +2 -2
  140. package/dist/server/lib/specRepositoryEvidenceFormatting.js.map +1 -1
  141. package/dist/server/lib/specRepositoryImpact.js +3 -3
  142. package/dist/server/lib/specRepositoryImpact.js.map +1 -1
  143. package/dist/server/lib/specReviewContext.js +7 -1
  144. package/dist/server/lib/specReviewContext.js.map +1 -1
  145. package/dist/server/lib/specReviewOperations.js +20 -7
  146. package/dist/server/lib/specReviewOperations.js.map +1 -1
  147. package/dist/server/lib/specSnapshotEvidence.js +3 -3
  148. package/dist/server/lib/specSnapshotEvidence.js.map +1 -1
  149. package/dist/server/lib/ticketAutomation.js +9 -11
  150. package/dist/server/lib/ticketAutomation.js.map +1 -1
  151. package/dist/server/lib/ticketAutomationCommit.js +21 -11
  152. package/dist/server/lib/ticketAutomationCommit.js.map +1 -1
  153. package/dist/server/lib/ticketFollowUpOperations.js +3 -1
  154. package/dist/server/lib/ticketFollowUpOperations.js.map +1 -1
  155. package/dist/server/lib/ticketSettingsOperations.js +9 -0
  156. package/dist/server/lib/ticketSettingsOperations.js.map +1 -1
  157. package/dist/server/lib/ticketWorkflowOperations.js +2 -6
  158. package/dist/server/lib/ticketWorkflowOperations.js.map +1 -1
  159. package/dist/server/lib/tickets.js +16 -6
  160. package/dist/server/lib/tickets.js.map +1 -1
  161. package/dist/server/lib/types.js +45 -0
  162. package/dist/server/lib/types.js.map +1 -1
  163. package/dist/server/workers/followUp.js +76 -1
  164. package/dist/server/workers/followUp.js.map +1 -1
  165. package/dist/server/workers/repositoryGraphAnalyzer.js +3 -2
  166. package/dist/server/workers/repositoryGraphAnalyzer.js.map +1 -1
  167. package/dist/server/workers/repositoryGraphAnalyzerBootstrap.js +20 -0
  168. package/dist/server/workers/repositoryGraphAnalyzerBootstrap.js.map +1 -0
  169. package/dist/server/workers/review.js +292 -60
  170. package/dist/server/workers/review.js.map +1 -1
  171. package/dist/server/workers/specReview.js +17 -8
  172. package/dist/server/workers/specReview.js.map +1 -1
  173. package/dist/server/workers/specSession.js +33 -23
  174. package/dist/server/workers/specSession.js.map +1 -1
  175. package/package.json +1 -1
  176. package/dist/client/assets/ActivityView-C5OrI0uK.js +0 -1
  177. package/dist/client/assets/channel-CYsnLOcX.js +0 -1
  178. package/dist/client/assets/classDiagram-4FO5ZUOK-CElk31Q4.js +0 -1
  179. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-lnAahwmt.js +0 -1
  180. package/dist/client/assets/index-1CokwSFm.css +0 -2
  181. package/dist/client/assets/index-DtefHOHC.js +0 -276
  182. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-p-kfFJi7.js +0 -1
@@ -0,0 +1,339 @@
1
+ import db from '../db.js';
2
+ import { listAutomationLoopAgentEvidence } from './automationLoopAgentEvidence.js';
3
+ import { getExecutionRunsByIds } from './executionRuns.js';
4
+ import { listReviewRepairIterationDecisionsByIterationIds, listReviewRepairIterationsByProgressionIds, } from './reviewRepairIterationRecords.js';
5
+ const CHECK_AUTO_FIX_MAX_ATTEMPTS = 3;
6
+ const validTimestamp = (value) => (value !== null && Number.isFinite(Date.parse(value)) ? value : null);
7
+ export const toAutomationLoopPresentationPhase = (phase) => {
8
+ if (phase === 'observed') {
9
+ return 'observing';
10
+ }
11
+ if (phase === 'action_claimed' || phase === 'action_active') {
12
+ return 'acting';
13
+ }
14
+ if (phase === 'gate_pending' || phase === 'gate_active') {
15
+ return 'gating';
16
+ }
17
+ if (phase === 'verification_pending' || phase === 'verification_active') {
18
+ return 'verifying';
19
+ }
20
+ return phase;
21
+ };
22
+ const getReviewSummaries = (progressionRunIds, iterations) => {
23
+ const summaries = new Map(progressionRunIds.map(id => [id, []]));
24
+ const grouped = new Map();
25
+ for (const iteration of iterations) {
26
+ const current = grouped.get(iteration.automation_progression_run_id) ?? [];
27
+ current.push(iteration);
28
+ grouped.set(iteration.automation_progression_run_id, current);
29
+ }
30
+ for (const [runId, progressionIterations] of grouped) {
31
+ const current = progressionIterations[progressionIterations.length - 1];
32
+ if (!current) {
33
+ continue;
34
+ }
35
+ summaries.set(runId, [{
36
+ kind: 'review_auto_fix',
37
+ owner_run_id: runId,
38
+ phase: toAutomationLoopPresentationPhase(current.phase),
39
+ iteration_count: progressionIterations.length,
40
+ current_iteration: current.ordinal,
41
+ historical_max_iterations: current.claim_effective_automation_config.reviewMaxIterations,
42
+ triggering_blocking_count: current.triggering_blocking_count,
43
+ resulting_blocking_count: current.resulting_blocking_count,
44
+ outcome: current.outcome,
45
+ stop_reason: current.stop_reason,
46
+ created_at: validTimestamp(progressionIterations[0]?.created_at ?? null),
47
+ updated_at: validTimestamp(current.updated_at),
48
+ completed_at: validTimestamp(current.terminal_at),
49
+ }]);
50
+ }
51
+ return summaries;
52
+ };
53
+ const getCheckSummaries = (projectId, checkLoopRunIds) => {
54
+ const ids = [...new Set(checkLoopRunIds)];
55
+ const summaries = new Map(ids.map(id => [id, []]));
56
+ if (ids.length === 0) {
57
+ return summaries;
58
+ }
59
+ const loops = db.prepare(`
60
+ SELECT loop.execution_run_id, run.status AS execution_status, loop.cancellation_requested,
61
+ loop.attempt_count, loop.terminal_reason, loop.created_at, loop.updated_at, run.completed_at
62
+ FROM check_auto_fix_loops loop
63
+ JOIN execution_runs run ON run.id = loop.execution_run_id AND run.project_id = loop.project_id
64
+ WHERE loop.project_id = ? AND run.kind = 'check_auto_fix'
65
+ AND loop.execution_run_id IN (${ids.map(() => '?').join(', ')})
66
+ `).all(projectId, ...ids);
67
+ const attempts = db.prepare(`
68
+ SELECT attempt.loop_run_id, child.status AS child_status, rerun.status AS rerun_status
69
+ FROM check_auto_fix_attempts attempt
70
+ JOIN check_auto_fix_loops loop ON loop.execution_run_id = attempt.loop_run_id
71
+ LEFT JOIN execution_runs child ON child.id = attempt.child_run_id AND child.project_id = loop.project_id
72
+ LEFT JOIN execution_runs rerun ON rerun.id = attempt.rerun_batch_run_id AND rerun.project_id = loop.project_id
73
+ WHERE loop.project_id = ? AND attempt.loop_run_id IN (${ids.map(() => '?').join(', ')})
74
+ AND attempt.ordinal = (
75
+ SELECT MAX(latest.ordinal) FROM check_auto_fix_attempts latest
76
+ WHERE latest.loop_run_id = attempt.loop_run_id
77
+ )
78
+ `).all(projectId, ...ids);
79
+ const attemptsByLoop = new Map(attempts.map(attempt => [attempt.loop_run_id, attempt]));
80
+ for (const loop of loops) {
81
+ const attempt = attemptsByLoop.get(loop.execution_run_id);
82
+ const phase = loop.terminal_reason
83
+ ? 'terminal'
84
+ : loop.cancellation_requested === 1
85
+ ? 'stopping'
86
+ : attempt?.rerun_status && !['completed', 'failed', 'cancelled', 'interrupted'].includes(attempt.rerun_status)
87
+ ? 'rerunning'
88
+ : attempt?.child_status && !['completed', 'failed', 'cancelled', 'interrupted'].includes(attempt.child_status)
89
+ ? 'repairing'
90
+ : 'dispatching';
91
+ summaries.set(loop.execution_run_id, [{
92
+ kind: 'check_auto_fix',
93
+ owner_run_id: loop.execution_run_id,
94
+ phase,
95
+ iteration_count: loop.attempt_count,
96
+ current_iteration: loop.attempt_count || null,
97
+ historical_max_iterations: CHECK_AUTO_FIX_MAX_ATTEMPTS,
98
+ triggering_blocking_count: null,
99
+ resulting_blocking_count: null,
100
+ outcome: loop.terminal_reason,
101
+ stop_reason: loop.terminal_reason,
102
+ created_at: validTimestamp(loop.created_at),
103
+ updated_at: validTimestamp(loop.updated_at),
104
+ completed_at: validTimestamp(loop.completed_at),
105
+ }]);
106
+ }
107
+ return summaries;
108
+ };
109
+ export const loadAutomationLoopSummaries = (projectId, runs) => {
110
+ const progressionRunIds = runs.filter(run => run.kind === 'automation_progression').map(run => run.id);
111
+ const checkLoopRunIds = runs.filter(run => run.kind === 'check_auto_fix').map(run => run.id);
112
+ const review = getReviewSummaries(progressionRunIds, listReviewRepairIterationsByProgressionIds(projectId, progressionRunIds));
113
+ const checks = getCheckSummaries(projectId, checkLoopRunIds);
114
+ return new Map(runs.map(run => [run.id, review.get(run.id) ?? checks.get(run.id) ?? []]));
115
+ };
116
+ const toRunEvidence = (runId, runsById, emptyState = 'not_started') => {
117
+ const run = runId ? runsById.get(runId) : null;
118
+ return {
119
+ run_id: runId,
120
+ state: !runId ? emptyState : run ? 'available' : 'unavailable',
121
+ status: run?.status ?? null,
122
+ domain_status: run?.domain_status ?? null,
123
+ created_at: validTimestamp(run?.created_at ?? null),
124
+ started_at: validTimestamp(run?.started_at ?? null),
125
+ completed_at: validTimestamp(run?.completed_at ?? null),
126
+ updated_at: validTimestamp(run?.updated_at ?? null),
127
+ };
128
+ };
129
+ const toReviewEvidence = (reviewRunId, reviewsById) => {
130
+ const review = reviewRunId ? reviewsById.get(reviewRunId) : null;
131
+ return {
132
+ review_run_id: reviewRunId,
133
+ state: !reviewRunId ? 'not_started' : review ? 'available' : 'unavailable',
134
+ status: review?.status ?? null,
135
+ model: review?.model ?? null,
136
+ variant: review?.variant ?? null,
137
+ created_at: validTimestamp(review?.created_at ?? null),
138
+ updated_at: validTimestamp(review?.updated_at ?? null),
139
+ };
140
+ };
141
+ const parseStringArray = (value) => {
142
+ try {
143
+ const parsed = JSON.parse(value);
144
+ return Array.isArray(parsed) ? parsed.filter((item) => typeof item === 'string') : [];
145
+ }
146
+ catch {
147
+ return [];
148
+ }
149
+ };
150
+ const getAvailableWorkspaceFingerprint = (value) => {
151
+ if (!value || typeof value !== 'object') {
152
+ return null;
153
+ }
154
+ const identity = value;
155
+ return identity.state === 'available' && typeof identity.fingerprint === 'string'
156
+ ? identity.fingerprint
157
+ : null;
158
+ };
159
+ const parseGateCheck = (value, gateSnapshot) => {
160
+ try {
161
+ const parsed = JSON.parse(value);
162
+ const snapshot = JSON.parse(gateSnapshot);
163
+ if (typeof parsed.execution_run_id !== 'string' || typeof parsed.definition_id !== 'string') {
164
+ return null;
165
+ }
166
+ const status = parsed.execution_status;
167
+ if (!['queued', 'running', 'waiting', 'completed', 'failed', 'cancelled', 'interrupted'].includes(String(status))) {
168
+ return null;
169
+ }
170
+ const initialFingerprint = getAvailableWorkspaceFingerprint(parsed.initial_workspace_identity);
171
+ const finalFingerprint = getAvailableWorkspaceFingerprint(parsed.final_workspace_identity);
172
+ const evaluatedFingerprint = getAvailableWorkspaceFingerprint(snapshot.workspaceIdentity);
173
+ const currency = parsed.currency === 'current' || parsed.currency === 'stale'
174
+ ? parsed.currency
175
+ : parsed.outcome === 'passed'
176
+ && initialFingerprint !== null
177
+ && initialFingerprint === finalFingerprint
178
+ && finalFingerprint === evaluatedFingerprint
179
+ ? 'current'
180
+ : 'stale';
181
+ return {
182
+ execution_run_id: parsed.execution_run_id,
183
+ definition_id: parsed.definition_id,
184
+ status: status,
185
+ outcome: typeof parsed.outcome === 'string' ? parsed.outcome : null,
186
+ currency,
187
+ };
188
+ }
189
+ catch {
190
+ return null;
191
+ }
192
+ };
193
+ const toGateEvidence = (iteration, gatesById, checksByGateId) => {
194
+ const gate = iteration.gate_evaluation_id ? gatesById.get(iteration.gate_evaluation_id) : null;
195
+ let policyStatus = null;
196
+ if (gate) {
197
+ try {
198
+ const snapshot = JSON.parse(gate.snapshot_json);
199
+ policyStatus = snapshot.policy?.status === 'valid' || snapshot.policy?.status === 'invalid'
200
+ ? snapshot.policy.status
201
+ : snapshot.policy ? 'valid' : null;
202
+ }
203
+ catch {
204
+ policyStatus = null;
205
+ }
206
+ }
207
+ const noGateRequired = iteration.workspace_evidence?.checksNotRequired === true;
208
+ return {
209
+ evaluation_id: iteration.gate_evaluation_id,
210
+ state: !iteration.gate_evaluation_id ? noGateRequired ? 'not_required' : 'not_started' : gate ? 'available' : 'unavailable',
211
+ decision: gate?.decision ?? null,
212
+ reason_codes: gate ? parseStringArray(gate.reason_codes_json) : [],
213
+ boundary: gate?.boundary_kind ?? null,
214
+ source_batch_run_id: gate?.source_batch_run_id ?? iteration.gate_source_batch_run_id,
215
+ policy_status: policyStatus,
216
+ required_checks: gate ? checksByGateId.get(gate.id) ?? [] : [],
217
+ created_at: validTimestamp(gate?.created_at ?? null),
218
+ };
219
+ };
220
+ const loadReviews = (projectId, reviewRunIds) => {
221
+ const ids = [...new Set(reviewRunIds)];
222
+ if (ids.length === 0) {
223
+ return new Map();
224
+ }
225
+ const rows = db.prepare(`
226
+ SELECT id, status, model, variant, created_at, updated_at
227
+ FROM review_runs
228
+ WHERE project_id = ? AND id IN (${ids.map(() => '?').join(', ')})
229
+ `).all(projectId, ...ids);
230
+ return new Map(rows.map(row => [row.id, row]));
231
+ };
232
+ const loadGates = (projectId, evaluationIds) => {
233
+ const ids = [...new Set(evaluationIds)];
234
+ if (ids.length === 0) {
235
+ return { gatesById: new Map(), checksByGateId: new Map() };
236
+ }
237
+ const gates = db.prepare(`
238
+ SELECT id, decision, reason_codes_json, snapshot_json, source_batch_run_id, boundary_kind, created_at
239
+ FROM check_gate_evaluations
240
+ WHERE project_id = ? AND id IN (${ids.map(() => '?').join(', ')})
241
+ `).all(projectId, ...ids);
242
+ const gateIds = gates.map(gate => gate.id);
243
+ const checksByGateId = new Map(gateIds.map(id => [id, []]));
244
+ if (gateIds.length > 0) {
245
+ const rows = db.prepare(`
246
+ SELECT attempt.evaluation_id, attempt.attempt_snapshot_json
247
+ FROM check_gate_evaluation_attempts attempt
248
+ JOIN check_gate_evaluations evaluation ON evaluation.id = attempt.evaluation_id
249
+ WHERE evaluation.project_id = ? AND attempt.evaluation_id IN (${gateIds.map(() => '?').join(', ')})
250
+ ORDER BY attempt.evaluation_id, attempt.ordinal
251
+ `).all(projectId, ...gateIds);
252
+ for (const row of rows) {
253
+ const gate = gates.find(candidate => candidate.id === row.evaluation_id);
254
+ const check = gate ? parseGateCheck(row.attempt_snapshot_json, gate.snapshot_json) : null;
255
+ if (check) {
256
+ checksByGateId.get(row.evaluation_id)?.push(check);
257
+ }
258
+ }
259
+ }
260
+ return { gatesById: new Map(gates.map(gate => [gate.id, gate])), checksByGateId };
261
+ };
262
+ export const loadReviewAutomationLoopDetails = (projectId, progressionRunId) => {
263
+ const iterations = listReviewRepairIterationsByProgressionIds(projectId, [progressionRunId]);
264
+ if (iterations.length === 0) {
265
+ return [];
266
+ }
267
+ const decisions = listReviewRepairIterationDecisionsByIterationIds(projectId, iterations.map(iteration => iteration.id));
268
+ const decisionsByIteration = new Map(iterations.map(iteration => [iteration.id, []]));
269
+ for (const decision of decisions) {
270
+ decisionsByIteration.get(decision.iteration_id)?.push(decision);
271
+ }
272
+ const runIds = iterations.flatMap(iteration => [
273
+ iteration.triggering_review_execution_run_id,
274
+ iteration.action_envelope_run_id,
275
+ iteration.action_run_id,
276
+ iteration.gate_batch_run_id,
277
+ iteration.gate_source_batch_run_id,
278
+ iteration.resulting_review_execution_run_id,
279
+ ]).concat(decisions.map(decision => decision.operation_run_id)).filter((id) => Boolean(id));
280
+ const runsById = new Map(getExecutionRunsByIds(projectId, runIds).map(run => [run.id, run]));
281
+ const reviewsById = loadReviews(projectId, iterations.flatMap(iteration => [
282
+ iteration.triggering_review_run_id,
283
+ iteration.resulting_review_run_id,
284
+ ]).filter((id) => Boolean(id)));
285
+ const { gatesById, checksByGateId } = loadGates(projectId, iterations.map(iteration => iteration.gate_evaluation_id).filter((id) => Boolean(id)));
286
+ const actionAgentsByRunId = listAutomationLoopAgentEvidence(projectId, iterations.map(iteration => iteration.action_run_id).filter((id) => Boolean(id)));
287
+ const details = iterations.map(iteration => {
288
+ const gateRunId = iteration.gate_source_batch_run_id ?? iteration.gate_batch_run_id;
289
+ const gateEmptyState = iteration.workspace_evidence?.checksNotRequired === true
290
+ ? 'not_required'
291
+ : 'not_started';
292
+ return {
293
+ id: iteration.id,
294
+ ordinal: iteration.ordinal,
295
+ authoritative_phase: iteration.phase,
296
+ phase: toAutomationLoopPresentationPhase(iteration.phase),
297
+ historical_max_iterations: iteration.claim_effective_automation_config.reviewMaxIterations,
298
+ triggering_blocking_count: iteration.triggering_blocking_count,
299
+ resulting_blocking_count: iteration.resulting_blocking_count,
300
+ outcome: iteration.outcome,
301
+ stop_reason: iteration.stop_reason,
302
+ claim_policy: iteration.claim_effective_automation_config,
303
+ runs: {
304
+ triggering_review: toRunEvidence(iteration.triggering_review_execution_run_id, runsById),
305
+ action_envelope: toRunEvidence(iteration.action_envelope_run_id, runsById),
306
+ action: toRunEvidence(iteration.action_run_id, runsById),
307
+ gate: toRunEvidence(gateRunId, runsById, gateEmptyState),
308
+ verification: toRunEvidence(iteration.resulting_review_execution_run_id, runsById),
309
+ },
310
+ triggering_review: toReviewEvidence(iteration.triggering_review_run_id, reviewsById),
311
+ resulting_review: toReviewEvidence(iteration.resulting_review_run_id, reviewsById),
312
+ gate_evidence: toGateEvidence(iteration, gatesById, checksByGateId),
313
+ action_agents: iteration.action_run_id ? actionAgentsByRunId.get(iteration.action_run_id) ?? [] : [],
314
+ decisions: (decisionsByIteration.get(iteration.id) ?? []).map(decision => ({
315
+ sequence: decision.sequence,
316
+ decision_point: decision.decision_point,
317
+ decision_code: decision.decision_code,
318
+ effective_automation_config: decision.effective_automation_config,
319
+ operation: toRunEvidence(decision.operation_run_id, runsById),
320
+ created_at: decision.created_at,
321
+ })),
322
+ timestamps: {
323
+ observed_at: validTimestamp(iteration.observed_at),
324
+ action_claimed_at: validTimestamp(iteration.action_claimed_at),
325
+ action_active_at: validTimestamp(iteration.action_active_at),
326
+ gate_pending_at: validTimestamp(iteration.gate_pending_at),
327
+ gate_active_at: validTimestamp(iteration.gate_active_at),
328
+ verification_pending_at: validTimestamp(iteration.verification_pending_at),
329
+ verification_active_at: validTimestamp(iteration.verification_active_at),
330
+ paused_at: validTimestamp(iteration.paused_at),
331
+ terminal_at: validTimestamp(iteration.terminal_at),
332
+ created_at: validTimestamp(iteration.created_at),
333
+ updated_at: validTimestamp(iteration.updated_at),
334
+ },
335
+ };
336
+ });
337
+ return [{ kind: 'review_auto_fix', owner_run_id: progressionRunId, iterations: details }];
338
+ };
339
+ //# sourceMappingURL=automationLoopProjection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automationLoopProjection.js","sourceRoot":"","sources":["../../../server/lib/automationLoopProjection.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import db from '../db.js';
2
2
  import { ActiveAutomationChildError, assertNoActiveAutomationChild } from './activeAutomationChild.js';
3
3
  import { getExecutionRun, listExecutionRunLinks, withExecutionRunTransaction, } from './executionRuns.js';
4
4
  import { claimBundleAutomationProgression, clearAutomationPause, getBundleAutomationState, recordAutomationPause, } from './ticketAutomation.js';
5
+ import { appendReviewRepairIterationDecisionInTransaction, compareAndSetReviewRepairIterationPhaseInTransaction, getActiveReviewRepairIteration, getReviewRepairIterationByAction, pauseReviewRepairIterationInTransaction, terminalizeReviewRepairIterationInTransaction, } from './reviewRepairIterations.js';
5
6
  const ACTIVE_STATUSES = new Set(['queued', 'running', 'waiting']);
6
7
  const INITIATING_KINDS = new Set(['build', 'build_follow_up', 'review']);
7
8
  const toExecutionContext = (run) => ({
@@ -83,7 +84,7 @@ const addTicketContextIfMissing = (transaction, projectId, runId, ticketId, tick
83
84
  });
84
85
  }
85
86
  };
86
- export const ensureAutomationProgression = ({ projectId, bundleId, ticketId, ticketTitle, parentRunId, workflowContext, broadcaster, }) => withExecutionRunTransaction(transaction => {
87
+ export const ensureAutomationProgressionInTransaction = (transaction, { projectId, bundleId, ticketId, ticketTitle, parentRunId, workflowContext, }) => {
87
88
  const existing = getAutomationProgression(projectId, bundleId);
88
89
  if (existing) {
89
90
  addTicketContextIfMissing(transaction, projectId, existing.id, ticketId, ticketTitle);
@@ -113,7 +114,8 @@ export const ensureAutomationProgression = ({ projectId, bundleId, ticketId, tic
113
114
  });
114
115
  claimBundleAutomationProgression(projectId, bundleId, progression.id);
115
116
  return toExecutionContext(getExecutionRun(projectId, progression.id) ?? progression);
116
- }, broadcaster);
117
+ };
118
+ export const ensureAutomationProgression = (input) => (withExecutionRunTransaction(transaction => ensureAutomationProgressionInTransaction(transaction, input), input.broadcaster));
117
119
  const assertNoActiveProgressionWorkerChild = (projectId, progressionRunId) => {
118
120
  assertNoActiveAutomationChild(projectId, progressionRunId);
119
121
  const activeWorkerChild = db.prepare(`
@@ -281,6 +283,33 @@ export const waitAutomationProgressionInTransaction = (transaction, { projectId,
281
283
  });
282
284
  };
283
285
  export const waitAutomationProgression = (input) => withExecutionRunTransaction(transaction => waitAutomationProgressionInTransaction(transaction, input), input.broadcaster);
286
+ export const pauseAutomationProgressionForManualTransition = ({ projectId, bundleId, progressionRunId, broadcaster, }) => withExecutionRunTransaction(transaction => {
287
+ const iteration = getActiveReviewRepairIteration(projectId, progressionRunId);
288
+ const currentRunId = iteration
289
+ ? iteration.resulting_review_execution_run_id
290
+ ?? iteration.gate_batch_run_id
291
+ ?? iteration.action_run_id
292
+ ?? iteration.action_envelope_run_id
293
+ : null;
294
+ waitAutomationProgressionInTransaction(transaction, {
295
+ projectId,
296
+ bundleId,
297
+ progressionRunId,
298
+ pauseCode: 'review',
299
+ pauseReason: 'manual transition',
300
+ reasonCode: 'manual_transition',
301
+ pausedStageRunId: currentRunId,
302
+ });
303
+ if (iteration && iteration.phase !== 'terminal' && iteration.phase !== 'paused') {
304
+ pauseReviewRepairIterationInTransaction(transaction, {
305
+ projectId,
306
+ iterationId: iteration.id,
307
+ expectedPhase: iteration.phase,
308
+ expectedCurrentRunId: currentRunId,
309
+ stopReason: 'manual_pause',
310
+ });
311
+ }
312
+ }, broadcaster, 'immediate');
284
313
  export const pauseAutomationProgression = ({ projectId, bundleId, pauseCode, pauseReason, reasonCode, pausedStageRunId, pausedBoundaryPurpose = null, broadcaster, }) => {
285
314
  const progressionRunId = getBundleAutomationState(projectId, bundleId)?.automation_progression_run_id;
286
315
  if (!progressionRunId) {
@@ -323,7 +352,7 @@ export const resolveProgressionForChild = ({ projectId, bundleId, childRunId, al
323
352
  }
324
353
  return progression;
325
354
  };
326
- export const createAutomationReviewFix = ({ projectId, bundleId, ticketId, ticketTitle, progressionRunId, workflowContext, triggeringReviewRunId, reviewFindingRunId, reviewSeverity, broadcaster, }) => withExecutionRunTransaction(transaction => {
355
+ export const createAutomationReviewFixInTransaction = (transaction, { projectId, bundleId, ticketId, ticketTitle, progressionRunId, workflowContext, triggeringReviewRunId, reviewFindingRunId, reviewSeverity, retryOfRunId, }) => {
327
356
  const progression = assertBundlePrimaryProgression(projectId, bundleId, progressionRunId);
328
357
  if (getBundleAutomationState(projectId, bundleId)?.automation_progression_run_id !== progression.id) {
329
358
  throw new Error('Automation progression does not own this bundle');
@@ -346,6 +375,7 @@ export const createAutomationReviewFix = ({ projectId, bundleId, ticketId, ticke
346
375
  links: [{ entityType: 'ticket', entityId: ticketId, relationship: 'context', label: ticketTitle }],
347
376
  initiatedBy: 'automation',
348
377
  parentRunId: progression.id,
378
+ retryOfRunId,
349
379
  metadata: {
350
380
  ...(workflowContext ?? {}),
351
381
  review_finding_run_id: reviewFindingRunId,
@@ -361,8 +391,9 @@ export const createAutomationReviewFix = ({ projectId, bundleId, ticketId, ticke
361
391
  eventType: 'automation_review_fix_started',
362
392
  });
363
393
  return toExecutionContext(getExecutionRun(projectId, reviewFix.id) ?? reviewFix);
364
- }, broadcaster);
365
- export const finishAutomationReviewFix = ({ projectId, reviewFixRunId, failedMessage, broadcaster, }) => withExecutionRunTransaction(transaction => {
394
+ };
395
+ export const createAutomationReviewFix = (input) => (withExecutionRunTransaction(transaction => createAutomationReviewFixInTransaction(transaction, input), input.broadcaster));
396
+ export const finishAutomationReviewFixInTransaction = (transaction, { projectId, reviewFixRunId, failedMessage, }) => {
366
397
  const reviewFix = getExecutionRun(projectId, reviewFixRunId);
367
398
  if (!reviewFix || reviewFix.kind !== 'automation_review_fix') {
368
399
  throw new Error(`Execution run ${reviewFixRunId} is not an automation review fix`);
@@ -378,7 +409,8 @@ export const finishAutomationReviewFix = ({ projectId, reviewFixRunId, failedMes
378
409
  ...(failedMessage ? { failure: { code: 'build_follow_up_failed', message: failedMessage } } : {}),
379
410
  eventType: failedMessage ? 'automation_review_fix_failed' : 'automation_review_fix_completed',
380
411
  });
381
- }, broadcaster);
412
+ };
413
+ export const finishAutomationReviewFix = (input) => (withExecutionRunTransaction(transaction => finishAutomationReviewFixInTransaction(transaction, input), input.broadcaster));
382
414
  export const completeAutomationProgressionInTransaction = (transaction, { projectId, bundleId, progressionRunId, domainStatus = 'completed', }) => {
383
415
  const progression = assertBundlePrimaryProgression(projectId, bundleId, progressionRunId);
384
416
  if (getBundleAutomationState(projectId, bundleId)?.automation_progression_run_id !== progression.id) {
@@ -404,6 +436,53 @@ export const completeAutomationProgressionInTransaction = (transaction, { projec
404
436
  WHERE project_id = ? AND worktree_bundle_id = ? AND automation_progression_run_id = ?
405
437
  `).run(projectId, bundleId, progression.id);
406
438
  };
439
+ export const completeAutomationReviewFixActionInTransaction = (transaction, { projectId, actionRunId, effectiveAutomationConfig, }) => {
440
+ const iteration = getReviewRepairIterationByAction(projectId, actionRunId);
441
+ if (!iteration) {
442
+ throw new Error('Completed Review repair action has no authoritative ledger iteration');
443
+ }
444
+ if (iteration.phase !== 'action_active') {
445
+ return iteration;
446
+ }
447
+ if (!iteration.action_envelope_run_id) {
448
+ throw new Error('Completed Review repair action has no action envelope');
449
+ }
450
+ finishAutomationReviewFixInTransaction(transaction, {
451
+ projectId,
452
+ reviewFixRunId: iteration.action_envelope_run_id,
453
+ });
454
+ appendReviewRepairIterationDecisionInTransaction(transaction, {
455
+ projectId,
456
+ iterationId: iteration.id,
457
+ decisionPoint: 'action_completion',
458
+ effectiveAutomationConfig,
459
+ decisionCode: 'action_completed',
460
+ });
461
+ if (effectiveAutomationConfig.depth === 'manual') {
462
+ terminalizeReviewRepairIterationInTransaction(transaction, {
463
+ projectId,
464
+ iterationId: iteration.id,
465
+ expectedPhase: 'action_active',
466
+ expectedCurrentRunId: actionRunId,
467
+ outcome: 'interrupted',
468
+ stopReason: 'configuration_changed',
469
+ });
470
+ completeAutomationProgressionInTransaction(transaction, {
471
+ projectId,
472
+ bundleId: iteration.worktree_bundle_id,
473
+ progressionRunId: iteration.automation_progression_run_id,
474
+ domainStatus: 'manual_boundary_reached',
475
+ });
476
+ return getReviewRepairIterationByAction(projectId, actionRunId);
477
+ }
478
+ return compareAndSetReviewRepairIterationPhaseInTransaction(transaction, {
479
+ projectId,
480
+ iterationId: iteration.id,
481
+ expectedPhase: 'action_active',
482
+ nextPhase: 'gate_pending',
483
+ expectedActionRunId: actionRunId,
484
+ });
485
+ };
407
486
  export const completeAutomationProgression = (input) => withExecutionRunTransaction(transaction => completeAutomationProgressionInTransaction(transaction, input), input.broadcaster);
408
487
  export const stopAutomationProgression = async ({ projectId, bundleId, broadcaster, stopLocalWorker, }) => {
409
488
  const progression = getAutomationProgression(projectId, bundleId);
@@ -472,6 +551,20 @@ export const stopAutomationProgression = async ({ projectId, bundleId, broadcast
472
551
  await waitForCheckBatch(projectId, activeCheckBatch.id);
473
552
  }
474
553
  withExecutionRunTransaction(transaction => {
554
+ const activeIteration = getActiveReviewRepairIteration(projectId, progression.id);
555
+ if (activeIteration && activeIteration.phase !== 'terminal') {
556
+ terminalizeReviewRepairIterationInTransaction(transaction, {
557
+ projectId,
558
+ iterationId: activeIteration.id,
559
+ expectedPhase: activeIteration.phase,
560
+ expectedCurrentRunId: activeIteration.resulting_review_execution_run_id
561
+ ?? activeIteration.gate_batch_run_id
562
+ ?? activeIteration.action_run_id
563
+ ?? activeIteration.action_envelope_run_id,
564
+ outcome: 'cancelled',
565
+ stopReason: 'cancelled',
566
+ });
567
+ }
475
568
  const current = getExecutionRun(projectId, progression.id);
476
569
  if (current && ACTIVE_STATUSES.has(current.status)) {
477
570
  transaction.transitionExecutionRun({
@@ -562,6 +655,22 @@ export const abandonAutomationPause = ({ projectId, bundleId, broadcaster, }) =>
562
655
  eventType: `${pausedStage.kind}_abandoned`,
563
656
  });
564
657
  }
658
+ if (state.automation_progression_run_id) {
659
+ const iteration = getActiveReviewRepairIteration(projectId, state.automation_progression_run_id);
660
+ if (iteration && iteration.phase !== 'terminal') {
661
+ terminalizeReviewRepairIterationInTransaction(transaction, {
662
+ projectId,
663
+ iterationId: iteration.id,
664
+ expectedPhase: iteration.phase,
665
+ expectedCurrentRunId: iteration.resulting_review_execution_run_id
666
+ ?? iteration.gate_batch_run_id
667
+ ?? iteration.action_run_id
668
+ ?? iteration.action_envelope_run_id,
669
+ outcome: 'cancelled',
670
+ stopReason: 'cancelled',
671
+ });
672
+ }
673
+ }
565
674
  db.prepare(`
566
675
  UPDATE bundle_automation_state
567
676
  SET automation_progression_run_id = NULL,