@principles/core 1.124.0 → 1.126.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/dist/runtime-v2/__tests__/architecture-regression.test.js +5 -1
  2. package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  3. package/dist/runtime-v2/__tests__/attack-e2e-pipeline-smoke.test.js +115 -21
  4. package/dist/runtime-v2/__tests__/attack-e2e-pipeline-smoke.test.js.map +1 -1
  5. package/dist/runtime-v2/__tests__/golden-path-diagnostician-e2e.test.js.map +1 -1
  6. package/dist/runtime-v2/__tests__/pain-signal-bridge-retried.test.js +7 -6
  7. package/dist/runtime-v2/__tests__/pain-signal-bridge-retried.test.js.map +1 -1
  8. package/dist/runtime-v2/__tests__/pain-signal-bridge-short-circuit.test.js.map +1 -1
  9. package/dist/runtime-v2/__tests__/pain-signal-bridge-workspace-dir.test.js.map +1 -1
  10. package/dist/runtime-v2/cli/diagnose.d.ts +2 -2
  11. package/dist/runtime-v2/cli/diagnose.d.ts.map +1 -1
  12. package/dist/runtime-v2/config/__tests__/pd-config-contract.test.js +3 -3
  13. package/dist/runtime-v2/config/__tests__/pd-config-contract.test.js.map +1 -1
  14. package/dist/runtime-v2/config/pd-config-defaults.js +2 -2
  15. package/dist/runtime-v2/config/pd-config-defaults.js.map +1 -1
  16. package/dist/runtime-v2/diagnostician-prompt-builder.d.ts +1 -64
  17. package/dist/runtime-v2/diagnostician-prompt-builder.d.ts.map +1 -1
  18. package/dist/runtime-v2/diagnostician-prompt-builder.js +0 -186
  19. package/dist/runtime-v2/diagnostician-prompt-builder.js.map +1 -1
  20. package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +17 -30
  21. package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
  22. package/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  23. package/dist/runtime-v2/feature-flags/feature-flag-contract.js +3 -8
  24. package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  25. package/dist/runtime-v2/index.d.ts +8 -7
  26. package/dist/runtime-v2/index.d.ts.map +1 -1
  27. package/dist/runtime-v2/index.js +8 -5
  28. package/dist/runtime-v2/index.js.map +1 -1
  29. package/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js +108 -105
  30. package/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js.map +1 -1
  31. package/dist/runtime-v2/internalization/__tests__/runnerkind-seam.test.js +3 -3
  32. package/dist/runtime-v2/internalization/__tests__/runnerkind-seam.test.js.map +1 -1
  33. package/dist/runtime-v2/internalization/split-diagnostician-runner.d.ts.map +1 -1
  34. package/dist/runtime-v2/internalization/split-diagnostician-runner.js +121 -52
  35. package/dist/runtime-v2/internalization/split-diagnostician-runner.js.map +1 -1
  36. package/dist/runtime-v2/observer/__tests__/empathy-observer.real-e2e.test.js +28 -21
  37. package/dist/runtime-v2/observer/__tests__/empathy-observer.real-e2e.test.js.map +1 -1
  38. package/dist/runtime-v2/pain-signal-runtime-factory.d.ts +10 -1
  39. package/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
  40. package/dist/runtime-v2/pain-signal-runtime-factory.js +42 -40
  41. package/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
  42. package/dist/runtime-v2/pain-to-principle-service.d.ts +1 -0
  43. package/dist/runtime-v2/pain-to-principle-service.d.ts.map +1 -1
  44. package/dist/runtime-v2/pain-to-principle-service.js.map +1 -1
  45. package/dist/runtime-v2/runner/__tests__/diagnose.test.js.map +1 -1
  46. package/package.json +1 -1
  47. package/dist/runtime-v2/__tests__/diagnostician-core-grounding.test.d.ts +0 -2
  48. package/dist/runtime-v2/__tests__/diagnostician-core-grounding.test.d.ts.map +0 -1
  49. package/dist/runtime-v2/__tests__/diagnostician-core-grounding.test.js +0 -122
  50. package/dist/runtime-v2/__tests__/diagnostician-core-grounding.test.js.map +0 -1
  51. package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.integration.test.d.ts +0 -2
  52. package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.integration.test.d.ts.map +0 -1
  53. package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.integration.test.js +0 -169
  54. package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.integration.test.js.map +0 -1
  55. package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.test.d.ts +0 -2
  56. package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.test.d.ts.map +0 -1
  57. package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.test.js +0 -462
  58. package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.test.js.map +0 -1
  59. package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.d.ts +0 -13
  60. package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.d.ts.map +0 -1
  61. package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.js +0 -97
  62. package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.js.map +0 -1
  63. package/dist/runtime-v2/runner/__tests__/diagnostician-runner.integration.test.d.ts +0 -2
  64. package/dist/runtime-v2/runner/__tests__/diagnostician-runner.integration.test.d.ts.map +0 -1
  65. package/dist/runtime-v2/runner/__tests__/diagnostician-runner.integration.test.js +0 -378
  66. package/dist/runtime-v2/runner/__tests__/diagnostician-runner.integration.test.js.map +0 -1
  67. package/dist/runtime-v2/runner/__tests__/diagnostician-runner.test.d.ts +0 -2
  68. package/dist/runtime-v2/runner/__tests__/diagnostician-runner.test.d.ts.map +0 -1
  69. package/dist/runtime-v2/runner/__tests__/diagnostician-runner.test.js +0 -682
  70. package/dist/runtime-v2/runner/__tests__/diagnostician-runner.test.js.map +0 -1
  71. package/dist/runtime-v2/runner/__tests__/diagnostician-telemetry.test.d.ts +0 -2
  72. package/dist/runtime-v2/runner/__tests__/diagnostician-telemetry.test.d.ts.map +0 -1
  73. package/dist/runtime-v2/runner/__tests__/diagnostician-telemetry.test.js +0 -286
  74. package/dist/runtime-v2/runner/__tests__/diagnostician-telemetry.test.js.map +0 -1
  75. package/dist/runtime-v2/runner/__tests__/dual-track-e2e.test.d.ts +0 -2
  76. package/dist/runtime-v2/runner/__tests__/dual-track-e2e.test.d.ts.map +0 -1
  77. package/dist/runtime-v2/runner/__tests__/dual-track-e2e.test.js +0 -320
  78. package/dist/runtime-v2/runner/__tests__/dual-track-e2e.test.js.map +0 -1
  79. package/dist/runtime-v2/runner/__tests__/lease-expiration-recovery.integration.test.d.ts +0 -2
  80. package/dist/runtime-v2/runner/__tests__/lease-expiration-recovery.integration.test.d.ts.map +0 -1
  81. package/dist/runtime-v2/runner/__tests__/lease-expiration-recovery.integration.test.js +0 -261
  82. package/dist/runtime-v2/runner/__tests__/lease-expiration-recovery.integration.test.js.map +0 -1
  83. package/dist/runtime-v2/runner/__tests__/m5-05-e2e.test.d.ts +0 -2
  84. package/dist/runtime-v2/runner/__tests__/m5-05-e2e.test.d.ts.map +0 -1
  85. package/dist/runtime-v2/runner/__tests__/m5-05-e2e.test.js +0 -405
  86. package/dist/runtime-v2/runner/__tests__/m5-05-e2e.test.js.map +0 -1
  87. package/dist/runtime-v2/runner/__tests__/m6-06-e2e.test.d.ts +0 -2
  88. package/dist/runtime-v2/runner/__tests__/m6-06-e2e.test.d.ts.map +0 -1
  89. package/dist/runtime-v2/runner/__tests__/m6-06-e2e.test.js +0 -347
  90. package/dist/runtime-v2/runner/__tests__/m6-06-e2e.test.js.map +0 -1
  91. package/dist/runtime-v2/runner/__tests__/m6-06-legacy.test.d.ts +0 -2
  92. package/dist/runtime-v2/runner/__tests__/m6-06-legacy.test.d.ts.map +0 -1
  93. package/dist/runtime-v2/runner/__tests__/m6-06-legacy.test.js +0 -186
  94. package/dist/runtime-v2/runner/__tests__/m6-06-legacy.test.js.map +0 -1
  95. package/dist/runtime-v2/runner/__tests__/m6-06-real-path.test.d.ts +0 -2
  96. package/dist/runtime-v2/runner/__tests__/m6-06-real-path.test.d.ts.map +0 -1
  97. package/dist/runtime-v2/runner/__tests__/m6-06-real-path.test.js +0 -355
  98. package/dist/runtime-v2/runner/__tests__/m6-06-real-path.test.js.map +0 -1
  99. package/dist/runtime-v2/runner/__tests__/m8-02-e2e.test.d.ts +0 -2
  100. package/dist/runtime-v2/runner/__tests__/m8-02-e2e.test.d.ts.map +0 -1
  101. package/dist/runtime-v2/runner/__tests__/m8-02-e2e.test.js +0 -486
  102. package/dist/runtime-v2/runner/__tests__/m8-02-e2e.test.js.map +0 -1
  103. package/dist/runtime-v2/runner/__tests__/m9-adapter-integration.test.d.ts +0 -2
  104. package/dist/runtime-v2/runner/__tests__/m9-adapter-integration.test.d.ts.map +0 -1
  105. package/dist/runtime-v2/runner/__tests__/m9-adapter-integration.test.js +0 -171
  106. package/dist/runtime-v2/runner/__tests__/m9-adapter-integration.test.js.map +0 -1
  107. package/dist/runtime-v2/runner/__tests__/m9-e2e.test.d.ts +0 -2
  108. package/dist/runtime-v2/runner/__tests__/m9-e2e.test.d.ts.map +0 -1
  109. package/dist/runtime-v2/runner/__tests__/m9-e2e.test.js +0 -175
  110. package/dist/runtime-v2/runner/__tests__/m9-e2e.test.js.map +0 -1
  111. package/dist/runtime-v2/runner/__tests__/max-attempts-exceeded.integration.test.d.ts +0 -2
  112. package/dist/runtime-v2/runner/__tests__/max-attempts-exceeded.integration.test.d.ts.map +0 -1
  113. package/dist/runtime-v2/runner/__tests__/max-attempts-exceeded.integration.test.js +0 -276
  114. package/dist/runtime-v2/runner/__tests__/max-attempts-exceeded.integration.test.js.map +0 -1
  115. package/dist/runtime-v2/runner/__tests__/retry-wait-recovery.integration.test.d.ts +0 -2
  116. package/dist/runtime-v2/runner/__tests__/retry-wait-recovery.integration.test.d.ts.map +0 -1
  117. package/dist/runtime-v2/runner/__tests__/retry-wait-recovery.integration.test.js +0 -272
  118. package/dist/runtime-v2/runner/__tests__/retry-wait-recovery.integration.test.js.map +0 -1
  119. package/dist/runtime-v2/runner/__tests__/start-run-input.test.d.ts +0 -2
  120. package/dist/runtime-v2/runner/__tests__/start-run-input.test.d.ts.map +0 -1
  121. package/dist/runtime-v2/runner/__tests__/start-run-input.test.js +0 -67
  122. package/dist/runtime-v2/runner/__tests__/start-run-input.test.js.map +0 -1
  123. package/dist/runtime-v2/runner/diagnostician-runner-options.d.ts +0 -57
  124. package/dist/runtime-v2/runner/diagnostician-runner-options.d.ts.map +0 -1
  125. package/dist/runtime-v2/runner/diagnostician-runner-options.js +0 -21
  126. package/dist/runtime-v2/runner/diagnostician-runner-options.js.map +0 -1
  127. package/dist/runtime-v2/runner/diagnostician-runner.d.ts +0 -89
  128. package/dist/runtime-v2/runner/diagnostician-runner.d.ts.map +0 -1
  129. package/dist/runtime-v2/runner/diagnostician-runner.js +0 -470
  130. package/dist/runtime-v2/runner/diagnostician-runner.js.map +0 -1
@@ -1,276 +0,0 @@
1
- /**
2
- * max_attempts_exceeded integration tests.
3
- *
4
- * Verifies DiagnosticianRunner correctly handles max attempts enforcement:
5
- * 1. Task fails with max_attempts_exceeded when RetryPolicy.shouldRetry returns false
6
- * 2. attemptCount correctly reflects total attempts at the boundary
7
- * 3. Subsequent acquireLease calls are rejected after max_attempts_exceeded
8
- */
9
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
10
- import * as fs from 'fs';
11
- import * as path from 'path';
12
- import * as os from 'os';
13
- import { RuntimeStateManager } from '../../store/runtime-state-manager.js';
14
- import { SqliteContextAssembler } from '../../store/context/sqlite-context-assembler.js';
15
- import { SqliteHistoryQuery } from '../../store/history/sqlite-history-query.js';
16
- import { StoreEventEmitter } from '../../store/event-emitter.js';
17
- import { DiagnosticianRunner } from '../diagnostician-runner.js';
18
- import { PassThroughValidator } from '../diagnostician-validator.js';
19
- import { PDRuntimeError } from '../../error-categories.js';
20
- /* eslint-disable @typescript-eslint/no-non-null-assertion */
21
- // -- Test fixtures --
22
- function makeDiagnosticianOutput(taskId) {
23
- return {
24
- valid: true,
25
- diagnosisId: `diag-${Date.now()}`,
26
- taskId,
27
- summary: 'Integration test diagnosis summary',
28
- rootCause: 'Test root cause analysis',
29
- violatedPrinciples: [],
30
- evidence: [],
31
- recommendations: [],
32
- confidence: 0.85,
33
- };
34
- }
35
- function makeDiagnosticianTaskInput(options) {
36
- const { taskId, workspaceDir, diagnostic, overrides } = options;
37
- const diagnosticJson = JSON.stringify({
38
- workspaceDir,
39
- reasonSummary: diagnostic?.reasonSummary ?? 'Integration test task',
40
- sourcePainId: diagnostic?.sourcePainId,
41
- severity: diagnostic?.severity,
42
- source: diagnostic?.source,
43
- });
44
- return {
45
- taskId,
46
- taskKind: 'diagnostician',
47
- status: 'pending',
48
- attemptCount: 0,
49
- maxAttempts: 3,
50
- ...overrides,
51
- diagnosticJson,
52
- };
53
- }
54
- // -- FailingValidator --
55
- class FailingValidator {
56
- errorCategory;
57
- errorMessages;
58
- constructor(errorCategory = 'output_invalid', errorMessages = ['Integration test validation failure']) {
59
- this.errorCategory = errorCategory;
60
- this.errorMessages = errorMessages;
61
- }
62
- async validate(_output, _taskId) {
63
- return {
64
- valid: false,
65
- errors: this.errorMessages,
66
- errorCategory: this.errorCategory,
67
- };
68
- }
69
- }
70
- // -- StubRuntimeAdapter --
71
- /* eslint-disable @typescript-eslint/class-methods-use-this */
72
- class StubRuntimeAdapter {
73
- kindValue;
74
- nextOutput = null;
75
- nextStatus = 'succeeded';
76
- constructor(kindValue = 'test-double') {
77
- this.kindValue = kindValue;
78
- }
79
- setOutput(output) {
80
- this.nextOutput = output;
81
- }
82
- setRunStatus(status) {
83
- this.nextStatus = status;
84
- }
85
- kind() {
86
- return this.kindValue;
87
- }
88
- async getCapabilities() {
89
- return {
90
- supportsStructuredJsonOutput: true,
91
- supportsToolUse: false,
92
- supportsWorkingDirectory: false,
93
- supportsModelSelection: false,
94
- supportsLongRunningSessions: false,
95
- supportsCancellation: true,
96
- supportsArtifactWriteBack: false,
97
- supportsConcurrentRuns: false,
98
- supportsStreaming: false,
99
- };
100
- }
101
- async healthCheck() {
102
- return {
103
- healthy: true,
104
- degraded: false,
105
- warnings: [],
106
- lastCheckedAt: new Date().toISOString(),
107
- };
108
- }
109
- async startRun(_input) {
110
- const runId = `stub-run-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
111
- return {
112
- runId,
113
- runtimeKind: this.kindValue,
114
- startedAt: new Date().toISOString(),
115
- };
116
- }
117
- async pollRun(runId) {
118
- return {
119
- runId,
120
- status: this.nextStatus,
121
- startedAt: new Date().toISOString(),
122
- endedAt: new Date().toISOString(),
123
- };
124
- }
125
- async cancelRun(_runId) { }
126
- async fetchOutput(runId) {
127
- if (this.nextOutput === null)
128
- return null;
129
- return { runId, payload: this.nextOutput };
130
- }
131
- async fetchArtifacts(_runId) {
132
- return [];
133
- }
134
- }
135
- /* eslint-enable @typescript-eslint/class-methods-use-this */
136
- // -- Integration test setup --
137
- const TMP_ROOT = path.join(os.tmpdir(), `pd-m4-04-max-attempts-${process.pid}`);
138
- describe('max_attempts_exceeded integration', () => {
139
- let testDir = '';
140
- let stateManager = null;
141
- let contextAssembler = null;
142
- let historyQuery = null;
143
- let eventEmitter = null;
144
- let runtimeAdapter = null;
145
- beforeEach(async () => {
146
- testDir = path.join(TMP_ROOT, `test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
147
- fs.mkdirSync(testDir, { recursive: true });
148
- stateManager = new RuntimeStateManager({ workspaceDir: testDir });
149
- await stateManager.initialize();
150
- const sqliteConn = stateManager.connection;
151
- historyQuery = new SqliteHistoryQuery(sqliteConn);
152
- const { taskStore } = stateManager;
153
- const { runStore } = stateManager;
154
- contextAssembler = new SqliteContextAssembler(taskStore, historyQuery, runStore);
155
- eventEmitter = new StoreEventEmitter();
156
- runtimeAdapter = new StubRuntimeAdapter();
157
- });
158
- afterEach(() => {
159
- stateManager.close();
160
- try {
161
- fs.rmSync(TMP_ROOT, { recursive: true, force: true });
162
- }
163
- catch {
164
- // ignore cleanup errors on Windows
165
- }
166
- });
167
- function createRunner(validator = new PassThroughValidator(), committer = { commit: async () => ({ commitId: "mock-commit-id", artifactId: "mock-artifact-id", candidateCount: 0 }) }) {
168
- return new DiagnosticianRunner({
169
- stateManager,
170
- contextAssembler,
171
- runtimeAdapter,
172
- eventEmitter,
173
- validator,
174
- committer,
175
- }, {
176
- owner: 'integration-test-runner',
177
- runtimeKind: 'test-double',
178
- pollIntervalMs: 50,
179
- timeoutMs: 2000,
180
- });
181
- }
182
- it('transitions to max_attempts_exceeded when attemptCount reaches maxAttempts', async () => {
183
- const taskId = 'max-attempts-task-001';
184
- // Create task with maxAttempts=2
185
- await stateManager.createTask(makeDiagnosticianTaskInput({
186
- taskId,
187
- workspaceDir: testDir,
188
- diagnostic: { reasonSummary: 'max attempts exceeded test' },
189
- overrides: { maxAttempts: 2 },
190
- }));
191
- // First attempt: acquire lease, then fail validation → retry_wait
192
- const output = makeDiagnosticianOutput(taskId);
193
- runtimeAdapter.setOutput(output);
194
- const failingValidator = new FailingValidator('output_invalid', ['Validation failure on attempt 1']);
195
- const runner = createRunner(failingValidator);
196
- const result1 = await runner.run(taskId);
197
- expect(result1.status).toBe('retried');
198
- expect(result1.attemptCount).toBe(1);
199
- let task = await stateManager.getTask(taskId);
200
- expect(task.status).toBe('retry_wait');
201
- expect(task.attemptCount).toBe(1);
202
- // Second attempt: runner re-acquires lease (attemptCount becomes 2), fails validation again
203
- // shouldRetry returns false because attemptCount (2) >= maxAttempts (2)
204
- const runner2 = createRunner(failingValidator);
205
- const result2 = await runner2.run(taskId);
206
- expect(result2.status).toBe('failed');
207
- expect(result2.errorCategory).toBe('max_attempts_exceeded');
208
- task = await stateManager.getTask(taskId);
209
- expect(task.status).toBe('failed');
210
- expect(task.lastError).toBe('max_attempts_exceeded');
211
- });
212
- it('rejects subsequent acquireLease after max_attempts_exceeded', async () => {
213
- const taskId = 'max-attempts-task-002';
214
- // Create task with maxAttempts=1 — single attempt then done
215
- await stateManager.createTask(makeDiagnosticianTaskInput({
216
- taskId,
217
- workspaceDir: testDir,
218
- diagnostic: { reasonSummary: 'single attempt max test' },
219
- overrides: { maxAttempts: 1 },
220
- }));
221
- // First attempt: acquire + fail validation
222
- runtimeAdapter.setOutput(makeDiagnosticianOutput(taskId));
223
- const runner = createRunner(new FailingValidator('output_invalid', ['Always fails']));
224
- const result = await runner.run(taskId);
225
- // With maxAttempts=1, shouldRetry returns false immediately → max_attempts_exceeded
226
- expect(result.status).toBe('failed');
227
- expect(result.errorCategory).toBe('max_attempts_exceeded');
228
- const task = await stateManager.getTask(taskId);
229
- expect(task.status).toBe('failed');
230
- // Subsequent acquireLease should throw lease_conflict (task is 'failed', not 'pending'/'retry_wait')
231
- await expect(stateManager.acquireLease({ taskId, owner: 'late-runner', runtimeKind: 'test-double' })).rejects.toThrow();
232
- try {
233
- await stateManager.acquireLease({ taskId, owner: 'late-runner', runtimeKind: 'test-double' });
234
- }
235
- catch (err) {
236
- expect(err).toBeInstanceOf(PDRuntimeError);
237
- expect(err.category).toBe('lease_conflict');
238
- }
239
- });
240
- it('tracks correct attemptCount at boundary with manual state transitions', async () => {
241
- const taskId = 'max-attempts-task-003';
242
- await stateManager.createTask(makeDiagnosticianTaskInput({
243
- taskId,
244
- workspaceDir: testDir,
245
- diagnostic: { reasonSummary: 'boundary attemptCount test' },
246
- overrides: { maxAttempts: 2 },
247
- }));
248
- // Manual cycle 1: acquire → retry_wait
249
- await stateManager.acquireLease({ taskId, owner: 'runner-1', runtimeKind: 'test-double' });
250
- let task = await stateManager.getTask(taskId);
251
- expect(task.attemptCount).toBe(1);
252
- await stateManager.markTaskRetryWait(taskId, 'execution_failed');
253
- task = await stateManager.getTask(taskId);
254
- expect(task.status).toBe('retry_wait');
255
- expect(task.attemptCount).toBe(1);
256
- // Manual cycle 2: acquire → attemptCount becomes 2
257
- await stateManager.acquireLease({ taskId, owner: 'runner-2', runtimeKind: 'test-double' });
258
- task = await stateManager.getTask(taskId);
259
- expect(task.attemptCount).toBe(2);
260
- // Mark retry_wait — shouldRetry returns false (2 >= 2)
261
- // The runner's retryOrFail would call markTaskFailed, but we test at stateManager level
262
- await stateManager.markTaskRetryWait(taskId, 'execution_failed');
263
- task = await stateManager.getTask(taskId);
264
- expect(task.status).toBe('retry_wait');
265
- expect(task.attemptCount).toBe(2);
266
- // Verify RetryPolicy correctly reports shouldRetry = false
267
- const shouldRetry = stateManager.getRetryPolicy().shouldRetry(task);
268
- expect(shouldRetry).toBe(false);
269
- // Verify 2 run records exist
270
- const runs = await stateManager.getRunsByTask(taskId);
271
- expect(runs).toHaveLength(2);
272
- expect(runs[0].attemptNumber).toBe(1);
273
- expect(runs[1].attemptNumber).toBe(2);
274
- });
275
- });
276
- //# sourceMappingURL=max-attempts-exceeded.integration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"max-attempts-exceeded.integration.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/runner/__tests__/max-attempts-exceeded.integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAgBrE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,6DAA6D;AAE7D,sBAAsB;AAEtB,SAAS,uBAAuB,CAAC,MAAc;IAC7C,OAAO;QACL,KAAK,EAAE,IAAI;QACX,WAAW,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE;QACjC,MAAM;QACN,OAAO,EAAE,oCAAoC;QAC7C,SAAS,EAAE,0BAA0B;QACrC,kBAAkB,EAAE,EAAE;QACtB,QAAQ,EAAE,EAAE;QACZ,eAAe,EAAE,EAAE;QACnB,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC;AAgBD,SAAS,0BAA0B,CACjC,OAA4B;IAE5B,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAChE,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC;QACpC,YAAY;QACZ,aAAa,EAAE,UAAU,EAAE,aAAa,IAAI,uBAAuB;QACnE,YAAY,EAAE,UAAU,EAAE,YAAY;QACtC,QAAQ,EAAE,UAAU,EAAE,QAAQ;QAC9B,MAAM,EAAE,UAAU,EAAE,MAAM;KAC3B,CAAC,CAAC;IAEH,OAAO;QACL,MAAM;QACN,QAAQ,EAAE,eAAe;QACzB,MAAM,EAAE,SAAS;QACjB,YAAY,EAAE,CAAC;QACf,WAAW,EAAE,CAAC;QACd,GAAG,SAAS;QACZ,cAAc;KACf,CAAC;AACJ,CAAC;AAED,yBAAyB;AAEzB,MAAM,gBAAgB;IAED;IACA;IAFnB,YACmB,gBAAiC,gBAAgB,EACjD,gBAAmC,CAAC,qCAAqC,CAAC;QAD1E,kBAAa,GAAb,aAAa,CAAoC;QACjD,kBAAa,GAAb,aAAa,CAA6D;IAC1F,CAAC;IAEJ,KAAK,CAAC,QAAQ,CACZ,OAA0D,EAC1D,OAAe;QAEf,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,IAAI,CAAC,aAAa;YAC1B,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC;IACJ,CAAC;CACF;AAED,2BAA2B;AAE3B,8DAA8D;AAC9D,MAAM,kBAAkB;IAIO;IAHrB,UAAU,GAAmC,IAAI,CAAC;IAClD,UAAU,GAAwB,WAAW,CAAC;IAEtD,YAA6B,YAAyB,aAAa;QAAtC,cAAS,GAAT,SAAS,CAA6B;IAAG,CAAC;IAEvE,SAAS,CAAC,MAAsC;QAC9C,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;IAC3B,CAAC;IAED,YAAY,CAAC,MAA2B;QACtC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;IAC3B,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO;YACL,4BAA4B,EAAE,IAAI;YAClC,eAAe,EAAE,KAAK;YACtB,wBAAwB,EAAE,KAAK;YAC/B,sBAAsB,EAAE,KAAK;YAC7B,2BAA2B,EAAE,KAAK;YAClC,oBAAoB,EAAE,IAAI;YAC1B,yBAAyB,EAAE,KAAK;YAChC,sBAAsB,EAAE,KAAK;YAC7B,iBAAiB,EAAE,KAAK;SACzB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO;YACL,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,EAAE;YACZ,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACxC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAqB;QAClC,MAAM,KAAK,GAAG,YAAY,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACjF,OAAO;YACL,KAAK;YACL,WAAW,EAAE,IAAI,CAAC,SAAS;YAC3B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAa;QACzB,OAAO;YACL,KAAK;YACL,MAAM,EAAE,IAAI,CAAC,UAAU;YACvB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAClC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAc,IAA+B,CAAC;IAE9D,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC1C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc;QACjC,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AACD,6DAA6D;AAE7D,+BAA+B;AAE/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,yBAAyB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAEhF,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,YAAY,GAAwB,IAAsC,CAAC;IAC/E,IAAI,gBAAgB,GAA2B,IAAyC,CAAC;IACzF,IAAI,YAAY,GAAuB,IAAqC,CAAC;IAC7E,IAAI,YAAY,GAAsB,IAAoC,CAAC;IAC3E,IAAI,cAAc,GAAuB,IAAqC,CAAC;IAE/E,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3F,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE3C,YAAY,GAAG,IAAI,mBAAmB,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;QAClE,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;QAEhC,MAAM,UAAU,GAAI,YAAmD,CAAC,UAAU,CAAC;QACnF,YAAY,GAAG,IAAI,kBAAkB,CAAC,UAAmB,CAAC,CAAC;QAE3D,MAAM,EAAE,SAAS,EAAE,GAAI,YAAkD,CAAC;QAC1E,MAAM,EAAE,QAAQ,EAAE,GAAI,YAAiD,CAAC;QACxE,gBAAgB,GAAG,IAAI,sBAAsB,CAC3C,SAAkB,EAClB,YAAY,EACZ,QAAiB,CAClB,CAAC;QAEF,YAAY,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACvC,cAAc,GAAG,IAAI,kBAAkB,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS,YAAY,CAAC,YAAoC,IAAI,oBAAoB,EAAE,EAClF,YAAoC,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE;QAC/I,OAAO,IAAI,mBAAmB,CAC5B;YACE,YAAY;YACZ,gBAAgB;YAChB,cAAc;YACd,YAAY;YACZ,SAAS;YACX,SAAS;SACR,EACD;YACE,KAAK,EAAE,yBAAyB;YAChC,WAAW,EAAE,aAAa;YAC1B,cAAc,EAAE,EAAE;YAClB,SAAS,EAAE,IAAI;SAChB,CACF,CAAC;IACJ,CAAC;IAED,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,MAAM,GAAG,uBAAuB,CAAC;QAEvC,iCAAiC;QACjC,MAAM,YAAY,CAAC,UAAU,CAC3B,0BAA0B,CAAC;YACzB,MAAM;YACN,YAAY,EAAE,OAAO;YACrB,UAAU,EAAE,EAAE,aAAa,EAAE,4BAA4B,EAAE;YAC3D,SAAS,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE;SAC9B,CAAC,CACH,CAAC;QAEF,kEAAkE;QAClE,MAAM,MAAM,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAC/C,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEjC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,EAAE,CAAC,iCAAiC,CAAC,CAAC,CAAC;QACrG,MAAM,MAAM,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAE9C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAErC,IAAI,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,CAAC,IAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnC,4FAA4F;QAC5F,wEAAwE;QACxE,MAAM,OAAO,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAE5D,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,IAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,MAAM,GAAG,uBAAuB,CAAC;QAEvC,4DAA4D;QAC5D,MAAM,YAAY,CAAC,UAAU,CAC3B,0BAA0B,CAAC;YACzB,MAAM;YACN,YAAY,EAAE,OAAO;YACrB,UAAU,EAAE,EAAE,aAAa,EAAE,yBAAyB,EAAE;YACxD,SAAS,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE;SAC9B,CAAC,CACH,CAAC;QAEF,2CAA2C;QAC3C,cAAc,CAAC,SAAS,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,gBAAgB,CAAC,gBAAgB,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QACtF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAExC,oFAAoF;QACpF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAE3D,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEpC,qGAAqG;QACrG,MAAM,MAAM,CACV,YAAY,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CACxF,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAEpB,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;QAChG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;YAC3C,MAAM,CAAE,GAAsB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,MAAM,GAAG,uBAAuB,CAAC;QAEvC,MAAM,YAAY,CAAC,UAAU,CAC3B,0BAA0B,CAAC;YACzB,MAAM;YACN,YAAY,EAAE,OAAO;YACrB,UAAU,EAAE,EAAE,aAAa,EAAE,4BAA4B,EAAE;YAC3D,SAAS,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE;SAC9B,CAAC,CACH,CAAC;QAEF,uCAAuC;QACvC,MAAM,YAAY,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;QAC3F,IAAI,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnC,MAAM,YAAY,CAAC,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QACjE,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,CAAC,IAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnC,mDAAmD;QACnD,MAAM,YAAY,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;QAC3F,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnC,uDAAuD;QACvD,wFAAwF;QACxF,MAAM,YAAY,CAAC,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QACjE,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,CAAC,IAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnC,2DAA2D;QAC3D,MAAM,WAAW,GAAG,YAAY,CAAC,cAAc,EAAE,CAAC,WAAW,CAAC,IAAK,CAAC,CAAC;QACrE,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEhC,6BAA6B;QAC7B,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=retry-wait-recovery.integration.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry-wait-recovery.integration.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/runner/__tests__/retry-wait-recovery.integration.test.ts"],"names":[],"mappings":""}
@@ -1,272 +0,0 @@
1
- /**
2
- * retry_wait recovery integration tests.
3
- *
4
- * Verifies DiagnosticianRunner correctly handles retry_wait → leased recovery:
5
- * 1. Task in retry_wait can be re-acquired via acquireLease
6
- * 2. attemptCount increments correctly on each lease acquisition
7
- * 3. Multiple RunRecords are created (one per lease cycle)
8
- * 4. Runner can complete the task after recovery
9
- */
10
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
11
- import * as fs from 'fs';
12
- import * as path from 'path';
13
- import * as os from 'os';
14
- import { RuntimeStateManager } from '../../store/runtime-state-manager.js';
15
- import { SqliteContextAssembler } from '../../store/context/sqlite-context-assembler.js';
16
- import { SqliteHistoryQuery } from '../../store/history/sqlite-history-query.js';
17
- import { StoreEventEmitter } from '../../store/event-emitter.js';
18
- import { DiagnosticianRunner } from '../diagnostician-runner.js';
19
- import { PassThroughValidator } from '../diagnostician-validator.js';
20
- /* eslint-disable @typescript-eslint/no-non-null-assertion */
21
- // -- Test fixtures --
22
- function makeDiagnosticianOutput(taskId) {
23
- return {
24
- valid: true,
25
- diagnosisId: `diag-${Date.now()}`,
26
- taskId,
27
- summary: 'Integration test diagnosis summary',
28
- rootCause: 'Test root cause analysis',
29
- violatedPrinciples: [],
30
- evidence: [],
31
- recommendations: [],
32
- confidence: 0.85,
33
- };
34
- }
35
- function makeDiagnosticianTaskInput(options) {
36
- const { taskId, workspaceDir, diagnostic, overrides } = options;
37
- const diagnosticJson = JSON.stringify({
38
- workspaceDir,
39
- reasonSummary: diagnostic?.reasonSummary ?? 'Integration test task',
40
- sourcePainId: diagnostic?.sourcePainId,
41
- severity: diagnostic?.severity,
42
- source: diagnostic?.source,
43
- });
44
- return {
45
- taskId,
46
- taskKind: 'diagnostician',
47
- status: 'pending',
48
- attemptCount: 0,
49
- maxAttempts: 3,
50
- ...overrides,
51
- diagnosticJson,
52
- };
53
- }
54
- // -- StubRuntimeAdapter --
55
- /* eslint-disable @typescript-eslint/class-methods-use-this */
56
- class StubRuntimeAdapter {
57
- kindValue;
58
- nextOutput = null;
59
- nextStatus = 'succeeded';
60
- constructor(kindValue = 'test-double') {
61
- this.kindValue = kindValue;
62
- }
63
- setOutput(output) {
64
- this.nextOutput = output;
65
- }
66
- setRunStatus(status) {
67
- this.nextStatus = status;
68
- }
69
- kind() {
70
- return this.kindValue;
71
- }
72
- async getCapabilities() {
73
- return {
74
- supportsStructuredJsonOutput: true,
75
- supportsToolUse: false,
76
- supportsWorkingDirectory: false,
77
- supportsModelSelection: false,
78
- supportsLongRunningSessions: false,
79
- supportsCancellation: true,
80
- supportsArtifactWriteBack: false,
81
- supportsConcurrentRuns: false,
82
- supportsStreaming: false,
83
- };
84
- }
85
- async healthCheck() {
86
- return {
87
- healthy: true,
88
- degraded: false,
89
- warnings: [],
90
- lastCheckedAt: new Date().toISOString(),
91
- };
92
- }
93
- async startRun(_input) {
94
- const runId = `stub-run-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
95
- return {
96
- runId,
97
- runtimeKind: this.kindValue,
98
- startedAt: new Date().toISOString(),
99
- };
100
- }
101
- async pollRun(runId) {
102
- return {
103
- runId,
104
- status: this.nextStatus,
105
- startedAt: new Date().toISOString(),
106
- endedAt: new Date().toISOString(),
107
- };
108
- }
109
- async cancelRun(_runId) { }
110
- async fetchOutput(runId) {
111
- if (this.nextOutput === null)
112
- return null;
113
- return { runId, payload: this.nextOutput };
114
- }
115
- async fetchArtifacts(_runId) {
116
- return [];
117
- }
118
- }
119
- /* eslint-enable @typescript-eslint/class-methods-use-this */
120
- // -- Integration test setup --
121
- const TMP_ROOT = path.join(os.tmpdir(), `pd-m4-04-retry-wait-${process.pid}`);
122
- describe('retry_wait recovery integration', () => {
123
- let testDir = '';
124
- let stateManager = null;
125
- let contextAssembler = null;
126
- let historyQuery = null;
127
- let eventEmitter = null;
128
- let runtimeAdapter = null;
129
- beforeEach(async () => {
130
- testDir = path.join(TMP_ROOT, `test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
131
- fs.mkdirSync(testDir, { recursive: true });
132
- stateManager = new RuntimeStateManager({ workspaceDir: testDir });
133
- await stateManager.initialize();
134
- const sqliteConn = stateManager.connection;
135
- historyQuery = new SqliteHistoryQuery(sqliteConn);
136
- const { taskStore } = stateManager;
137
- const { runStore } = stateManager;
138
- contextAssembler = new SqliteContextAssembler(taskStore, historyQuery, runStore);
139
- eventEmitter = new StoreEventEmitter();
140
- runtimeAdapter = new StubRuntimeAdapter();
141
- });
142
- afterEach(() => {
143
- stateManager.close();
144
- try {
145
- fs.rmSync(TMP_ROOT, { recursive: true, force: true });
146
- }
147
- catch {
148
- // ignore cleanup errors on Windows
149
- }
150
- });
151
- function createRunner(validator = new PassThroughValidator(), committer = { commit: async () => ({ commitId: "mock-commit-id", artifactId: "mock-artifact-id", candidateCount: 0 }) }) {
152
- return new DiagnosticianRunner({
153
- stateManager,
154
- contextAssembler,
155
- runtimeAdapter,
156
- eventEmitter,
157
- validator,
158
- committer,
159
- }, {
160
- owner: 'integration-test-runner',
161
- runtimeKind: 'test-double',
162
- pollIntervalMs: 50,
163
- timeoutMs: 2000,
164
- });
165
- }
166
- it('re-acquires task in retry_wait state and increments attemptCount', async () => {
167
- const taskId = 'retry-wait-task-001';
168
- // Create diagnostician task with maxAttempts=3
169
- await stateManager.createTask(makeDiagnosticianTaskInput({
170
- taskId,
171
- workspaceDir: testDir,
172
- diagnostic: { reasonSummary: 'retry_wait recovery test' },
173
- overrides: { maxAttempts: 3 },
174
- }));
175
- // First acquireLease — attemptCount becomes 1 (first run created)
176
- await stateManager.acquireLease({
177
- taskId,
178
- owner: 'first-runner',
179
- runtimeKind: 'test-double',
180
- });
181
- let task = await stateManager.getTask(taskId);
182
- expect(task).not.toBeNull();
183
- expect(task.status).toBe('leased');
184
- expect(task.attemptCount).toBe(1);
185
- // Mark task as retry_wait (simulates first attempt failure)
186
- await stateManager.markTaskRetryWait(taskId, 'execution_failed');
187
- task = await stateManager.getTask(taskId);
188
- expect(task).not.toBeNull();
189
- expect(task.status).toBe('retry_wait');
190
- expect(task.attemptCount).toBe(1);
191
- // Second acquireLease — task in retry_wait should be re-acquirable
192
- await stateManager.acquireLease({
193
- taskId,
194
- owner: 'second-runner',
195
- runtimeKind: 'test-double',
196
- });
197
- task = await stateManager.getTask(taskId);
198
- expect(task).not.toBeNull();
199
- expect(task.status).toBe('leased');
200
- expect(task.attemptCount).toBe(2);
201
- // Verify 2 RunRecords exist (one per lease acquisition)
202
- const runs = await stateManager.getRunsByTask(taskId);
203
- expect(runs).toHaveLength(2);
204
- expect(runs[0].attemptNumber).toBe(1);
205
- expect(runs[1].attemptNumber).toBe(2);
206
- });
207
- it('runner completes task after retry_wait recovery', async () => {
208
- const taskId = 'retry-wait-task-002';
209
- // Create task
210
- await stateManager.createTask(makeDiagnosticianTaskInput({
211
- taskId,
212
- workspaceDir: testDir,
213
- diagnostic: { reasonSummary: 'runner recovery test' },
214
- overrides: { maxAttempts: 3 },
215
- }));
216
- // First attempt: acquire → fail → retry_wait
217
- await stateManager.acquireLease({
218
- taskId,
219
- owner: 'first-runner',
220
- runtimeKind: 'test-double',
221
- });
222
- await stateManager.markTaskRetryWait(taskId, 'execution_failed');
223
- // Set up adapter for successful run on second attempt
224
- const output = makeDiagnosticianOutput(taskId);
225
- runtimeAdapter.setOutput(output);
226
- // Runner should re-acquire (retry_wait → leased) and complete successfully
227
- const runner = createRunner();
228
- const result = await runner.run(taskId);
229
- expect(result.status).toBe('succeeded');
230
- expect(result.taskId).toBe(taskId);
231
- // Verify final task state
232
- const task = await stateManager.getTask(taskId);
233
- expect(task).not.toBeNull();
234
- expect(task.status).toBe('succeeded');
235
- // Verify total runs: 1 (first failed attempt) + 1 (second attempt created by runner) = 2
236
- const runs = await stateManager.getRunsByTask(taskId);
237
- expect(runs).toHaveLength(2);
238
- });
239
- it('supports multiple retry_wait cycles with correct attemptCount tracking', async () => {
240
- const taskId = 'retry-wait-task-003';
241
- await stateManager.createTask(makeDiagnosticianTaskInput({
242
- taskId,
243
- workspaceDir: testDir,
244
- diagnostic: { reasonSummary: 'multi-cycle recovery test' },
245
- overrides: { maxAttempts: 5 },
246
- }));
247
- // Cycle 1: acquire → retry_wait
248
- await stateManager.acquireLease({ taskId, owner: 'runner-1', runtimeKind: 'test-double' });
249
- await stateManager.markTaskRetryWait(taskId, 'execution_failed');
250
- let task = await stateManager.getTask(taskId);
251
- expect(task.attemptCount).toBe(1);
252
- expect(task.status).toBe('retry_wait');
253
- // Cycle 2: re-acquire → retry_wait
254
- await stateManager.acquireLease({ taskId, owner: 'runner-2', runtimeKind: 'test-double' });
255
- await stateManager.markTaskRetryWait(taskId, 'execution_failed');
256
- task = await stateManager.getTask(taskId);
257
- expect(task.attemptCount).toBe(2);
258
- expect(task.status).toBe('retry_wait');
259
- // Cycle 3: re-acquire → succeed
260
- const output = makeDiagnosticianOutput(taskId);
261
- runtimeAdapter.setOutput(output);
262
- const runner = createRunner();
263
- const result = await runner.run(taskId);
264
- expect(result.status).toBe('succeeded');
265
- task = await stateManager.getTask(taskId);
266
- expect(task.status).toBe('succeeded');
267
- // Total runs: 2 (cycles 1+2) + 1 (runner in cycle 3) = 3
268
- const runs = await stateManager.getRunsByTask(taskId);
269
- expect(runs).toHaveLength(3);
270
- });
271
- });
272
- //# sourceMappingURL=retry-wait-recovery.integration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry-wait-recovery.integration.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/runner/__tests__/retry-wait-recovery.integration.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=start-run-input.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"start-run-input.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/runner/__tests__/start-run-input.test.ts"],"names":[],"mappings":""}
@@ -1,67 +0,0 @@
1
- /**
2
- * StartRunInput construction validation tests.
3
- *
4
- * Verifies that the StartRunInput built by DiagnosticianRunner.invokeRuntime()
5
- * conforms to StartRunInputSchema and contains the expected fields.
6
- *
7
- * Approach: Mirror the construction logic from invokeRuntime() in a helper function,
8
- * then validate the output against the TypeBox schema. This avoids wiring up the
9
- * full DiagnosticianRunner with mock stores.
10
- */
11
- import { describe, it, expect } from 'vitest';
12
- import { Value } from '@sinclair/typebox/value';
13
- import { DiagnosticianPromptBuilder } from '../../diagnostician-prompt-builder.js';
14
- import { StartRunInputSchema } from '../../runtime-protocol.js';
15
- /** Mirrors DiagnosticianRunner.invokeRuntime() construction logic exactly. */
16
- function buildStartRunInput(context, taskId, timeoutMs) {
17
- const builder = new DiagnosticianPromptBuilder();
18
- const { message } = builder.buildPrompt(context);
19
- return {
20
- agentSpec: { agentId: 'main', schemaVersion: 'v1' },
21
- taskRef: { taskId },
22
- inputPayload: message,
23
- contextItems: [],
24
- outputSchemaRef: 'diagnostician-output-v1',
25
- timeoutMs,
26
- };
27
- }
28
- /** Minimal DiagnosticianContextPayload for testing. */
29
- function makeTestContext() {
30
- return {
31
- contextId: 'ctx-test-001',
32
- contextHash: 'abc123',
33
- taskId: 'test-task-001',
34
- workspaceDir: '/tmp/test',
35
- sourceRefs: [],
36
- diagnosisTarget: { reasonSummary: 'Test diagnosis target', severity: 'medium' },
37
- conversationWindow: [],
38
- };
39
- }
40
- describe('StartRunInput construction from invokeRuntime()', () => {
41
- const context = makeTestContext();
42
- const taskId = 'test-task-001';
43
- const timeoutMs = 30000;
44
- const input = buildStartRunInput(context, taskId, timeoutMs);
45
- it('passes Value.Check against StartRunInputSchema', () => {
46
- expect(Value.Check(StartRunInputSchema, input)).toBe(true);
47
- });
48
- it('agentSpec field is { agentId: "main", schemaVersion: "v1" }', () => {
49
- expect(input.agentSpec).toEqual({ agentId: 'main', schemaVersion: 'v1' });
50
- });
51
- it('taskRef field is { taskId: "<taskId>" }', () => {
52
- expect(input.taskRef).toEqual({ taskId: 'test-task-001' });
53
- });
54
- it('outputSchemaRef is "diagnostician-output-v1"', () => {
55
- expect(input.outputSchemaRef).toBe('diagnostician-output-v1');
56
- });
57
- it('inputPayload is a JSON string containing taskId and diagnosticInstruction', () => {
58
- const payload = JSON.parse(input.inputPayload);
59
- expect(payload.taskId).toBe(taskId);
60
- expect(payload.diagnosticInstruction).toBeDefined();
61
- expect(payload.diagnosticInstruction.length).toBeGreaterThan(100);
62
- });
63
- it('contextItems is empty (instruction is embedded in inputPayload)', () => {
64
- expect(input.contextItems).toHaveLength(0);
65
- });
66
- });
67
- //# sourceMappingURL=start-run-input.test.js.map