@principles/core 1.238.0 → 1.240.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.
- package/dist/runtime-v2/__tests__/artificer-runner-vslice.test.js +253 -0
- package/dist/runtime-v2/__tests__/artificer-runner-vslice.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/evaluator-repair-loop.test.d.ts +2 -0
- package/dist/runtime-v2/__tests__/evaluator-repair-loop.test.d.ts.map +1 -0
- package/dist/runtime-v2/__tests__/evaluator-repair-loop.test.js +562 -0
- package/dist/runtime-v2/__tests__/evaluator-repair-loop.test.js.map +1 -0
- package/dist/runtime-v2/__tests__/pitask-metadata.test.js +150 -0
- package/dist/runtime-v2/__tests__/pitask-metadata.test.js.map +1 -1
- package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +32 -0
- package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
- package/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
- package/dist/runtime-v2/feature-flags/feature-flag-contract.js +7 -0
- package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
- package/dist/runtime-v2/index.d.ts +1 -1
- package/dist/runtime-v2/index.d.ts.map +1 -1
- package/dist/runtime-v2/index.js.map +1 -1
- package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js +59 -0
- package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js.map +1 -1
- package/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts +13 -1
- package/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/artificer-prompt-builder.js +11 -0
- package/dist/runtime-v2/internalization/artificer-prompt-builder.js.map +1 -1
- package/dist/runtime-v2/internalization/artificer-runner.d.ts +13 -0
- package/dist/runtime-v2/internalization/artificer-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/artificer-runner.js +57 -2
- package/dist/runtime-v2/internalization/artificer-runner.js.map +1 -1
- package/dist/runtime-v2/internalization/evaluator-runner.d.ts +85 -0
- package/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/evaluator-runner.js +223 -0
- package/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
- package/dist/runtime-v2/internalization/peer-runner-contracts.d.ts +3 -0
- package/dist/runtime-v2/internalization/peer-runner-contracts.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/peer-runner-contracts.js.map +1 -1
- package/dist/runtime-v2/internalization/pitask-metadata.d.ts +34 -0
- package/dist/runtime-v2/internalization/pitask-metadata.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/pitask-metadata.js +64 -0
- package/dist/runtime-v2/internalization/pitask-metadata.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,562 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRI-509: Evaluator→Artificer Repair Loop — TDD tests (Slice 4 + 5).
|
|
3
|
+
*
|
|
4
|
+
* RED phase: tests define the expected contract for:
|
|
5
|
+
* - Slice 4: evaluator decision='needs_revision' + flag enabled → seed artificer
|
|
6
|
+
* repair task with repairPayload (repairIteration = priorRound + 1).
|
|
7
|
+
* - Slice 5: prior repairIteration >= 2 + flag enabled → mark evaluator task
|
|
8
|
+
* needs_human_review (fail loud, EP-03) + emit observable event (rc-9).
|
|
9
|
+
*
|
|
10
|
+
* Trust boundary (rc-1, rc-2): evaluator output is untrusted LLM output.
|
|
11
|
+
* requiredChanges / concerns are validated as unknown → string[] before being
|
|
12
|
+
* placed into repairPayload (no `as` casts that bypass validation).
|
|
13
|
+
*
|
|
14
|
+
* Loop state freshness (rc-7, EP-05, ERR-015/018/019): repairIteration is read
|
|
15
|
+
* from the dependency artificer task's repairPayload (written at task creation
|
|
16
|
+
* time, never inferred at read). Each evaluator round reads the CURRENT
|
|
17
|
+
* artificer's repairPayload — never a cached value.
|
|
18
|
+
*
|
|
19
|
+
* Fail loud (rc-3, rc-9, EP-03, ERR-002): when priorRepairIteration >= 2, the
|
|
20
|
+
* evaluator task is marked needs_human_review with a structured reason +
|
|
21
|
+
* nextAction event. No silent fallback.
|
|
22
|
+
*/
|
|
23
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
24
|
+
import { EvaluatorRunner } from '../internalization/evaluator-runner.js';
|
|
25
|
+
import { MemoryPIArtifactStore } from '../internalization/pi-artifact-store.js';
|
|
26
|
+
import { DefaultEvaluatorValidator } from '../internalization/evaluator-output.js';
|
|
27
|
+
import { createPITaskDiagnosticJson, } from '../internalization/pitask-metadata.js';
|
|
28
|
+
const ARTIFICER_TASK_ID = 'artificer-001';
|
|
29
|
+
const ARTIFICER_REPAIR_TASK_ID_PREFIX = 'artificer-repair-';
|
|
30
|
+
const SCRIBE_TASK_ID = 'scribe-001';
|
|
31
|
+
const EVALUATOR_TASK_ID = 'evaluator-001';
|
|
32
|
+
const ARTIFICER_ARTIFACT_ID = 'pi-art-artificer-001-run-001';
|
|
33
|
+
const SCRIBE_ARTIFACT_ID = 'pi-art-scribe-001';
|
|
34
|
+
// ── Test fixtures ─────────────────────────────────────────────────────────────
|
|
35
|
+
function makeScribeTask(overrides = {}) {
|
|
36
|
+
return {
|
|
37
|
+
taskId: SCRIBE_TASK_ID,
|
|
38
|
+
taskKind: 'scribe',
|
|
39
|
+
status: 'succeeded',
|
|
40
|
+
attemptCount: 1,
|
|
41
|
+
maxAttempts: 3,
|
|
42
|
+
resultRef: 'scribe://run-001',
|
|
43
|
+
createdAt: new Date().toISOString(),
|
|
44
|
+
updatedAt: new Date().toISOString(),
|
|
45
|
+
diagnosticJson: createPITaskDiagnosticJson({
|
|
46
|
+
dependencyTaskIds: [],
|
|
47
|
+
channel: 'prompt',
|
|
48
|
+
timeoutMs: 300_000,
|
|
49
|
+
inputArtifactRefs: [],
|
|
50
|
+
outputArtifactRefs: [{ artifactType: 'principle', ref: SCRIBE_ARTIFACT_ID }],
|
|
51
|
+
}),
|
|
52
|
+
...overrides,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function makeArtificerTask(overrides = {}) {
|
|
56
|
+
return {
|
|
57
|
+
taskId: ARTIFICER_TASK_ID,
|
|
58
|
+
taskKind: 'artificer',
|
|
59
|
+
status: 'succeeded',
|
|
60
|
+
attemptCount: 1,
|
|
61
|
+
maxAttempts: 3,
|
|
62
|
+
resultRef: 'artificer://run-001',
|
|
63
|
+
createdAt: new Date().toISOString(),
|
|
64
|
+
updatedAt: new Date().toISOString(),
|
|
65
|
+
diagnosticJson: createPITaskDiagnosticJson({
|
|
66
|
+
dependencyTaskIds: [SCRIBE_TASK_ID],
|
|
67
|
+
channel: 'prompt',
|
|
68
|
+
timeoutMs: 300_000,
|
|
69
|
+
inputArtifactRefs: [{ artifactType: 'principle', ref: SCRIBE_ARTIFACT_ID }],
|
|
70
|
+
outputArtifactRefs: [{ artifactType: 'principle', ref: ARTIFICER_ARTIFACT_ID }],
|
|
71
|
+
}),
|
|
72
|
+
...overrides,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function makeArtificerTaskWithRepairPayload(repairIteration) {
|
|
76
|
+
const repairPayload = {
|
|
77
|
+
requiredChanges: ['previous required change'],
|
|
78
|
+
concerns: ['previous concern'],
|
|
79
|
+
previousScore: 0.55,
|
|
80
|
+
repairIteration,
|
|
81
|
+
sourceArtificerArtifactId: 'pi-art-artificer-previous',
|
|
82
|
+
sourceEvaluatorTaskId: 'evaluator-previous',
|
|
83
|
+
};
|
|
84
|
+
return makeArtificerTask({
|
|
85
|
+
diagnosticJson: createPITaskDiagnosticJson({
|
|
86
|
+
dependencyTaskIds: [SCRIBE_TASK_ID],
|
|
87
|
+
channel: 'prompt',
|
|
88
|
+
timeoutMs: 300_000,
|
|
89
|
+
inputArtifactRefs: [{ artifactType: 'principle', ref: SCRIBE_ARTIFACT_ID }],
|
|
90
|
+
outputArtifactRefs: [{ artifactType: 'principle', ref: ARTIFICER_ARTIFACT_ID }],
|
|
91
|
+
repairPayload,
|
|
92
|
+
}),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function makeEvaluatorTask(overrides = {}) {
|
|
96
|
+
return {
|
|
97
|
+
taskId: EVALUATOR_TASK_ID,
|
|
98
|
+
taskKind: 'evaluator',
|
|
99
|
+
status: 'pending',
|
|
100
|
+
attemptCount: 0,
|
|
101
|
+
maxAttempts: 3,
|
|
102
|
+
createdAt: new Date().toISOString(),
|
|
103
|
+
updatedAt: new Date().toISOString(),
|
|
104
|
+
diagnosticJson: createPITaskDiagnosticJson({
|
|
105
|
+
dependencyTaskIds: [ARTIFICER_TASK_ID],
|
|
106
|
+
channel: 'prompt',
|
|
107
|
+
timeoutMs: 300_000,
|
|
108
|
+
inputArtifactRefs: [{ artifactType: 'principle', ref: ARTIFICER_ARTIFACT_ID }],
|
|
109
|
+
outputArtifactRefs: [],
|
|
110
|
+
}),
|
|
111
|
+
...overrides,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function makeScribeArtifact() {
|
|
115
|
+
return {
|
|
116
|
+
artifactId: SCRIBE_ARTIFACT_ID,
|
|
117
|
+
artifactKind: 'principle',
|
|
118
|
+
sourceTaskId: SCRIBE_TASK_ID,
|
|
119
|
+
lineageArtifactIds: [],
|
|
120
|
+
validationStatus: 'pending',
|
|
121
|
+
contentJson: JSON.stringify({
|
|
122
|
+
principleDraft: {
|
|
123
|
+
title: 'Always validate async input',
|
|
124
|
+
statement: 'Every async function must validate its input before processing.',
|
|
125
|
+
},
|
|
126
|
+
generatedAt: new Date().toISOString(),
|
|
127
|
+
}),
|
|
128
|
+
createdAt: new Date().toISOString(),
|
|
129
|
+
updatedAt: new Date().toISOString(),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function makeArtificerArtifact() {
|
|
133
|
+
return {
|
|
134
|
+
artifactId: ARTIFICER_ARTIFACT_ID,
|
|
135
|
+
artifactKind: 'principle',
|
|
136
|
+
sourceTaskId: ARTIFICER_TASK_ID,
|
|
137
|
+
lineageArtifactIds: [],
|
|
138
|
+
validationStatus: 'pending',
|
|
139
|
+
contentJson: JSON.stringify({
|
|
140
|
+
taskId: ARTIFICER_TASK_ID,
|
|
141
|
+
sourceScribeArtifactId: SCRIBE_ARTIFACT_ID,
|
|
142
|
+
implementationPlan: {
|
|
143
|
+
summary: 'Add input validation to all async operations',
|
|
144
|
+
targetSurface: 'src/async-ops/*.ts',
|
|
145
|
+
changes: ['Add try-catch to asyncOp1', 'Add error boundary to asyncOp2'],
|
|
146
|
+
tests: ['Unit test for asyncOp1 error handling'],
|
|
147
|
+
rolloutNotes: ['Deploy behind feature flag'],
|
|
148
|
+
confidence: 0.85,
|
|
149
|
+
},
|
|
150
|
+
sourceTrace: {
|
|
151
|
+
scribeArtifactId: SCRIBE_ARTIFACT_ID,
|
|
152
|
+
},
|
|
153
|
+
risks: ['May add latency'],
|
|
154
|
+
generatedAt: new Date().toISOString(),
|
|
155
|
+
}),
|
|
156
|
+
createdAt: new Date().toISOString(),
|
|
157
|
+
updatedAt: new Date().toISOString(),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function makeNeedsRevisionOutput(overrides = {}) {
|
|
161
|
+
return {
|
|
162
|
+
taskId: EVALUATOR_TASK_ID,
|
|
163
|
+
sourceArtificerArtifactId: ARTIFICER_ARTIFACT_ID,
|
|
164
|
+
evaluation: {
|
|
165
|
+
decision: 'needs_revision',
|
|
166
|
+
summary: 'Implementation has gaps in error handling coverage',
|
|
167
|
+
score: 0.65,
|
|
168
|
+
strengths: ['Clear structure'],
|
|
169
|
+
concerns: ['Missing timeout handling', 'No retry logic for transient failures'],
|
|
170
|
+
requiredChanges: [
|
|
171
|
+
'Add explicit timeout handling to asyncOp1',
|
|
172
|
+
'Implement retry with exponential backoff for transient failures',
|
|
173
|
+
],
|
|
174
|
+
},
|
|
175
|
+
sourceTrace: {
|
|
176
|
+
artificerArtifactId: ARTIFICER_ARTIFACT_ID,
|
|
177
|
+
scribeArtifactId: SCRIBE_ARTIFACT_ID,
|
|
178
|
+
},
|
|
179
|
+
risks: ['May need additional integration tests'],
|
|
180
|
+
generatedAt: new Date().toISOString(),
|
|
181
|
+
...overrides,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function makeApprovedOutput() {
|
|
185
|
+
return {
|
|
186
|
+
taskId: EVALUATOR_TASK_ID,
|
|
187
|
+
sourceArtificerArtifactId: ARTIFICER_ARTIFACT_ID,
|
|
188
|
+
evaluation: {
|
|
189
|
+
decision: 'approved',
|
|
190
|
+
summary: 'Implementation is well-structured and feasible',
|
|
191
|
+
score: 0.85,
|
|
192
|
+
strengths: ['Clear change descriptions', 'Good test coverage plan'],
|
|
193
|
+
concerns: [],
|
|
194
|
+
requiredChanges: [],
|
|
195
|
+
},
|
|
196
|
+
sourceTrace: {
|
|
197
|
+
artificerArtifactId: ARTIFICER_ARTIFACT_ID,
|
|
198
|
+
scribeArtifactId: SCRIBE_ARTIFACT_ID,
|
|
199
|
+
},
|
|
200
|
+
risks: [],
|
|
201
|
+
generatedAt: new Date().toISOString(),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
// ── Mock deps factory ────────────────────────────────────────────────────────
|
|
205
|
+
function createMockDeps(overrides) {
|
|
206
|
+
const artifactStore = overrides.artifactStore ?? new MemoryPIArtifactStore();
|
|
207
|
+
const evaluatorTask = makeEvaluatorTask();
|
|
208
|
+
const artificerTask = overrides.artificerTask ?? makeArtificerTask();
|
|
209
|
+
const scribeTask = makeScribeTask();
|
|
210
|
+
const stateManager = {
|
|
211
|
+
acquireLease: vi.fn().mockResolvedValue(evaluatorTask),
|
|
212
|
+
getTask: vi.fn().mockImplementation((id) => {
|
|
213
|
+
if (id === EVALUATOR_TASK_ID)
|
|
214
|
+
return Promise.resolve(evaluatorTask);
|
|
215
|
+
if (id === ARTIFICER_TASK_ID)
|
|
216
|
+
return Promise.resolve(artificerTask);
|
|
217
|
+
if (id === SCRIBE_TASK_ID)
|
|
218
|
+
return Promise.resolve(scribeTask);
|
|
219
|
+
return Promise.resolve(null);
|
|
220
|
+
}),
|
|
221
|
+
getRunsByTask: vi.fn().mockResolvedValue([{
|
|
222
|
+
runId: 'run-evaluator-001',
|
|
223
|
+
taskId: EVALUATOR_TASK_ID,
|
|
224
|
+
runtimeKind: 'evaluator',
|
|
225
|
+
startedAt: new Date().toISOString(),
|
|
226
|
+
}]),
|
|
227
|
+
getValidRunsByTaskTolerant: vi.fn().mockResolvedValue({
|
|
228
|
+
runs: [{ runId: 'run-evaluator-001', taskId: EVALUATOR_TASK_ID, runtimeKind: 'evaluator', startedAt: new Date().toISOString() }],
|
|
229
|
+
degradedRuns: [],
|
|
230
|
+
}),
|
|
231
|
+
updateRunOutput: vi.fn().mockResolvedValue(undefined),
|
|
232
|
+
markTaskSucceeded: vi.fn().mockResolvedValue(undefined),
|
|
233
|
+
markTaskFailed: vi.fn().mockResolvedValue(undefined),
|
|
234
|
+
markTaskRetryWait: vi.fn().mockResolvedValue(undefined),
|
|
235
|
+
updateTask: vi.fn().mockImplementation(async (taskId, patch) => ({
|
|
236
|
+
...evaluatorTask,
|
|
237
|
+
taskId,
|
|
238
|
+
...patch,
|
|
239
|
+
updatedAt: new Date().toISOString(),
|
|
240
|
+
})),
|
|
241
|
+
createTask: vi.fn().mockImplementation(async (record) => ({
|
|
242
|
+
...record,
|
|
243
|
+
createdAt: new Date().toISOString(),
|
|
244
|
+
updatedAt: new Date().toISOString(),
|
|
245
|
+
})),
|
|
246
|
+
getRetryPolicy: vi.fn().mockReturnValue({ shouldRetry: () => false }),
|
|
247
|
+
};
|
|
248
|
+
const runHandle = { runId: 'run-evaluator-001', runtimeKind: 'test-double', startedAt: new Date().toISOString() };
|
|
249
|
+
const succeededStatus = { status: 'succeeded', runId: 'run-evaluator-001' };
|
|
250
|
+
const runtimeAdapter = {
|
|
251
|
+
startRun: vi.fn().mockResolvedValue(runHandle),
|
|
252
|
+
pollRun: vi.fn().mockResolvedValue(succeededStatus),
|
|
253
|
+
fetchOutput: vi.fn().mockResolvedValue({
|
|
254
|
+
payload: overrides.evaluatorOutput ?? makeNeedsRevisionOutput(),
|
|
255
|
+
}),
|
|
256
|
+
cancelRun: vi.fn().mockResolvedValue(undefined),
|
|
257
|
+
};
|
|
258
|
+
const eventEmitter = {
|
|
259
|
+
emitTelemetry: vi.fn(),
|
|
260
|
+
};
|
|
261
|
+
const validator = new DefaultEvaluatorValidator();
|
|
262
|
+
// PRI-509: default seeder mock used when isRepairLoopEnabled is enabled.
|
|
263
|
+
// The test asserts against this mock's calls instead of stateManager.createTask
|
|
264
|
+
// because core peer runners delegate task creation to the plugin layer
|
|
265
|
+
// (architecture-regression.test.ts forbids 'createTask' string in evaluator-runner.ts).
|
|
266
|
+
const defaultSeedArtificerRepairTask = vi.fn().mockImplementation(async (params) => {
|
|
267
|
+
return `${ARTIFICER_REPAIR_TASK_ID_PREFIX}${params.repairPayload.repairIteration}-${Date.now()}`;
|
|
268
|
+
});
|
|
269
|
+
// Wrap any override in vi.fn() so the returned type is consistently Mock
|
|
270
|
+
// (a plain function vs vi.fn() Mock would otherwise produce an unassignable union).
|
|
271
|
+
const seederMock = overrides.seedArtificerRepairTask
|
|
272
|
+
? vi.fn(overrides.seedArtificerRepairTask)
|
|
273
|
+
: defaultSeedArtificerRepairTask;
|
|
274
|
+
// When omitSeeder is true, do NOT inject seedArtificerRepairTask even if
|
|
275
|
+
// isRepairLoopEnabled is provided — simulates a plugin-layer wiring bug
|
|
276
|
+
// where the flag is on but the seeder was never injected.
|
|
277
|
+
const shouldInjectSeeder = overrides.isRepairLoopEnabled !== undefined
|
|
278
|
+
&& overrides.omitSeeder !== true;
|
|
279
|
+
const deps = {
|
|
280
|
+
stateManager,
|
|
281
|
+
runtimeAdapter,
|
|
282
|
+
eventEmitter,
|
|
283
|
+
validator,
|
|
284
|
+
artifactStore,
|
|
285
|
+
...(overrides.isRepairLoopEnabled !== undefined
|
|
286
|
+
? { isRepairLoopEnabled: overrides.isRepairLoopEnabled }
|
|
287
|
+
: {}),
|
|
288
|
+
...(shouldInjectSeeder
|
|
289
|
+
? { seedArtificerRepairTask: seederMock }
|
|
290
|
+
: {}),
|
|
291
|
+
};
|
|
292
|
+
return {
|
|
293
|
+
deps,
|
|
294
|
+
stateManager,
|
|
295
|
+
artifactStore,
|
|
296
|
+
seedArtificerRepairTask: shouldInjectSeeder
|
|
297
|
+
? seederMock
|
|
298
|
+
: null,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
async function seedArtifacts(store) {
|
|
302
|
+
await store.upsertArtifact(makeScribeArtifact());
|
|
303
|
+
await store.upsertArtifact(makeArtificerArtifact());
|
|
304
|
+
}
|
|
305
|
+
// ── Tests ─────────────────────────────────────────────────────────────────────
|
|
306
|
+
describe('PRI-509: Evaluator→Artificer Repair Loop (Slice 4 + 5)', () => {
|
|
307
|
+
beforeEach(() => {
|
|
308
|
+
// Reset vi mocks between tests (defensive — createMockDeps returns fresh mocks each call)
|
|
309
|
+
vi.clearAllMocks();
|
|
310
|
+
});
|
|
311
|
+
// ── Slice 4: seed artificer repair task on needs_revision ───────────────────
|
|
312
|
+
describe('Slice 4: needs_revision → seed artificer repair task', () => {
|
|
313
|
+
it('flag enabled + no prior repairPayload → seeder called with repairIteration=1', async () => {
|
|
314
|
+
const store = new MemoryPIArtifactStore();
|
|
315
|
+
await seedArtifacts(store);
|
|
316
|
+
const { deps, stateManager, seedArtificerRepairTask } = createMockDeps({
|
|
317
|
+
artifactStore: store,
|
|
318
|
+
isRepairLoopEnabled: () => true,
|
|
319
|
+
artificerTask: makeArtificerTask(), // no repairPayload → priorRepairIteration = 0
|
|
320
|
+
evaluatorOutput: makeNeedsRevisionOutput(),
|
|
321
|
+
});
|
|
322
|
+
const runner = new EvaluatorRunner(deps, {
|
|
323
|
+
owner: 'test',
|
|
324
|
+
runtimeKind: 'evaluator',
|
|
325
|
+
pollIntervalMs: 10,
|
|
326
|
+
timeoutMs: 1000,
|
|
327
|
+
});
|
|
328
|
+
const result = await runner.run(EVALUATOR_TASK_ID);
|
|
329
|
+
expect(result.status).toBe('succeeded');
|
|
330
|
+
// Core peer runner delegates to the injected seeder instead of calling
|
|
331
|
+
// stateManager task-creation directly (architecture boundary enforced
|
|
332
|
+
// by architecture-regression.test.ts).
|
|
333
|
+
expect(seedArtificerRepairTask).not.toBeNull();
|
|
334
|
+
expect(seedArtificerRepairTask).toHaveBeenCalledTimes(1);
|
|
335
|
+
// Guard before property access (lint: no-non-null-assertion).
|
|
336
|
+
if (!seedArtificerRepairTask)
|
|
337
|
+
throw new Error('seeder unexpectedly null');
|
|
338
|
+
const seedCall = seedArtificerRepairTask.mock.calls[0]?.[0];
|
|
339
|
+
expect(seedCall).toBeDefined();
|
|
340
|
+
// After toBeDefined assertion, narrow the type explicitly (TS doesn't narrow via expect).
|
|
341
|
+
if (!seedCall)
|
|
342
|
+
throw new Error('seedCall unexpectedly undefined');
|
|
343
|
+
// repairPayload has the 6 required fields with repairIteration=1
|
|
344
|
+
const { repairPayload } = seedCall;
|
|
345
|
+
expect(repairPayload.repairIteration).toBe(1);
|
|
346
|
+
expect(repairPayload.requiredChanges).toEqual([
|
|
347
|
+
'Add explicit timeout handling to asyncOp1',
|
|
348
|
+
'Implement retry with exponential backoff for transient failures',
|
|
349
|
+
]);
|
|
350
|
+
expect(repairPayload.concerns).toEqual([
|
|
351
|
+
'Missing timeout handling',
|
|
352
|
+
'No retry logic for transient failures',
|
|
353
|
+
]);
|
|
354
|
+
expect(repairPayload.previousScore).toBe(0.65);
|
|
355
|
+
expect(repairPayload.sourceArtificerArtifactId).toBe(ARTIFICER_ARTIFACT_ID);
|
|
356
|
+
expect(repairPayload.sourceEvaluatorTaskId).toBe(EVALUATOR_TASK_ID);
|
|
357
|
+
// inheritedDependencyTaskIds come from the original artificer task (→ scribe)
|
|
358
|
+
expect(seedCall?.inheritedDependencyTaskIds).toEqual([SCRIBE_TASK_ID]);
|
|
359
|
+
// State manager was NOT called directly for task creation (boundary preserved)
|
|
360
|
+
expect(stateManager.createTask).not.toHaveBeenCalled();
|
|
361
|
+
});
|
|
362
|
+
it('flag disabled → seeder NOT called (backward compat)', async () => {
|
|
363
|
+
const store = new MemoryPIArtifactStore();
|
|
364
|
+
await seedArtifacts(store);
|
|
365
|
+
const { deps, stateManager, seedArtificerRepairTask } = createMockDeps({
|
|
366
|
+
artifactStore: store,
|
|
367
|
+
// isRepairLoopEnabled omitted = disabled (backward compat)
|
|
368
|
+
artificerTask: makeArtificerTask(),
|
|
369
|
+
evaluatorOutput: makeNeedsRevisionOutput(),
|
|
370
|
+
});
|
|
371
|
+
const runner = new EvaluatorRunner(deps, {
|
|
372
|
+
owner: 'test',
|
|
373
|
+
runtimeKind: 'evaluator',
|
|
374
|
+
pollIntervalMs: 10,
|
|
375
|
+
timeoutMs: 1000,
|
|
376
|
+
});
|
|
377
|
+
const result = await runner.run(EVALUATOR_TASK_ID);
|
|
378
|
+
expect(result.status).toBe('succeeded');
|
|
379
|
+
// No repair task seeded — backward compatible behavior
|
|
380
|
+
expect(seedArtificerRepairTask).toBeNull();
|
|
381
|
+
expect(stateManager.createTask).not.toHaveBeenCalled();
|
|
382
|
+
});
|
|
383
|
+
it('flag enabled + decision=approved → seeder NOT called', async () => {
|
|
384
|
+
const store = new MemoryPIArtifactStore();
|
|
385
|
+
await seedArtifacts(store);
|
|
386
|
+
const { deps, stateManager, seedArtificerRepairTask } = createMockDeps({
|
|
387
|
+
artifactStore: store,
|
|
388
|
+
isRepairLoopEnabled: () => true,
|
|
389
|
+
artificerTask: makeArtificerTask(),
|
|
390
|
+
evaluatorOutput: makeApprovedOutput(),
|
|
391
|
+
});
|
|
392
|
+
const runner = new EvaluatorRunner(deps, {
|
|
393
|
+
owner: 'test',
|
|
394
|
+
runtimeKind: 'evaluator',
|
|
395
|
+
pollIntervalMs: 10,
|
|
396
|
+
timeoutMs: 1000,
|
|
397
|
+
});
|
|
398
|
+
const result = await runner.run(EVALUATOR_TASK_ID);
|
|
399
|
+
expect(result.status).toBe('succeeded');
|
|
400
|
+
// approved never triggers repair seeding
|
|
401
|
+
expect(seedArtificerRepairTask).not.toBeNull();
|
|
402
|
+
expect(seedArtificerRepairTask).not.toHaveBeenCalled();
|
|
403
|
+
expect(stateManager.createTask).not.toHaveBeenCalled();
|
|
404
|
+
});
|
|
405
|
+
});
|
|
406
|
+
// ── Slice 5: max iterations → needs_human_review (fail loud) ───────────────
|
|
407
|
+
describe('Slice 5: priorRepairIteration >= 2 → needs_human_review', () => {
|
|
408
|
+
it('flag enabled + prior repairIteration=2 → mark needs_human_review + no seed', async () => {
|
|
409
|
+
const store = new MemoryPIArtifactStore();
|
|
410
|
+
await seedArtifacts(store);
|
|
411
|
+
const { deps, stateManager, seedArtificerRepairTask } = createMockDeps({
|
|
412
|
+
artifactStore: store,
|
|
413
|
+
isRepairLoopEnabled: () => true,
|
|
414
|
+
artificerTask: makeArtificerTaskWithRepairPayload(2), // prior round = 2 → max reached
|
|
415
|
+
evaluatorOutput: makeNeedsRevisionOutput(),
|
|
416
|
+
});
|
|
417
|
+
const runner = new EvaluatorRunner(deps, {
|
|
418
|
+
owner: 'test',
|
|
419
|
+
runtimeKind: 'evaluator',
|
|
420
|
+
pollIntervalMs: 10,
|
|
421
|
+
timeoutMs: 1000,
|
|
422
|
+
});
|
|
423
|
+
const result = await runner.run(EVALUATOR_TASK_ID);
|
|
424
|
+
// Runner returns succeeded (it produced a valid verdict) but the task
|
|
425
|
+
// itself is marked needs_human_review.
|
|
426
|
+
expect(result.status).toBe('succeeded');
|
|
427
|
+
// No 3rd repair task seeded — fail loud, not infinite loop
|
|
428
|
+
expect(seedArtificerRepairTask).not.toBeNull();
|
|
429
|
+
expect(seedArtificerRepairTask).not.toHaveBeenCalled();
|
|
430
|
+
expect(stateManager.createTask).not.toHaveBeenCalled();
|
|
431
|
+
// Task marked needs_human_review (fail loud, EP-03, ERR-002)
|
|
432
|
+
expect(stateManager.updateTask).toHaveBeenCalledWith(EVALUATOR_TASK_ID, expect.objectContaining({
|
|
433
|
+
status: 'needs_human_review',
|
|
434
|
+
}));
|
|
435
|
+
// Observable event emitted (rc-9 — no silent fallback).
|
|
436
|
+
// Convention: emitEvent prefixes with runnerName → 'evaluator_repair_loop_max_iterations'.
|
|
437
|
+
const eventEmitter = deps.eventEmitter;
|
|
438
|
+
const telemetryCalls = eventEmitter.emitTelemetry.mock.calls;
|
|
439
|
+
const maxIterationsCall = telemetryCalls.find((call) => typeof call[0] === 'object' && call[0] !== null
|
|
440
|
+
&& call[0].eventType === 'evaluator_repair_loop_max_iterations');
|
|
441
|
+
expect(maxIterationsCall).toBeDefined();
|
|
442
|
+
const eventPayload = maxIterationsCall?.[0]?.payload;
|
|
443
|
+
expect(eventPayload?.reason).toBe('max_repair_iterations_exceeded');
|
|
444
|
+
expect(eventPayload?.nextAction).toBe('owner_manual_review_required');
|
|
445
|
+
expect(eventPayload?.priorRepairIteration).toBe(2);
|
|
446
|
+
});
|
|
447
|
+
it('flag enabled + prior repairIteration=1 → seed repair task with repairIteration=2', async () => {
|
|
448
|
+
const store = new MemoryPIArtifactStore();
|
|
449
|
+
await seedArtifacts(store);
|
|
450
|
+
const { deps, stateManager, seedArtificerRepairTask } = createMockDeps({
|
|
451
|
+
artifactStore: store,
|
|
452
|
+
isRepairLoopEnabled: () => true,
|
|
453
|
+
artificerTask: makeArtificerTaskWithRepairPayload(1), // prior round = 1 → seed Round 2
|
|
454
|
+
evaluatorOutput: makeNeedsRevisionOutput(),
|
|
455
|
+
});
|
|
456
|
+
const runner = new EvaluatorRunner(deps, {
|
|
457
|
+
owner: 'test',
|
|
458
|
+
runtimeKind: 'evaluator',
|
|
459
|
+
pollIntervalMs: 10,
|
|
460
|
+
timeoutMs: 1000,
|
|
461
|
+
});
|
|
462
|
+
const result = await runner.run(EVALUATOR_TASK_ID);
|
|
463
|
+
expect(result.status).toBe('succeeded');
|
|
464
|
+
// Round 2 repair task seeded (NOT fail loud — only 1 prior round)
|
|
465
|
+
expect(seedArtificerRepairTask).not.toBeNull();
|
|
466
|
+
expect(seedArtificerRepairTask).toHaveBeenCalledTimes(1);
|
|
467
|
+
// Guard before property access (lint: no-non-null-assertion).
|
|
468
|
+
if (!seedArtificerRepairTask)
|
|
469
|
+
throw new Error('seeder unexpectedly null');
|
|
470
|
+
const seedCall = seedArtificerRepairTask.mock.calls[0]?.[0];
|
|
471
|
+
expect(seedCall?.repairPayload.repairIteration).toBe(2);
|
|
472
|
+
// Task NOT marked needs_human_review (only 1 prior round)
|
|
473
|
+
expect(stateManager.updateTask).not.toHaveBeenCalledWith(EVALUATOR_TASK_ID, expect.objectContaining({ status: 'needs_human_review' }));
|
|
474
|
+
});
|
|
475
|
+
});
|
|
476
|
+
// ── Regression: all max_iterations_reached paths must mark needs_human_review ──
|
|
477
|
+
//
|
|
478
|
+
// P1 bug fix: previously only the `priorRepairIteration >= 2` path called
|
|
479
|
+
// stateManager.updateTask; the other 3 paths (lineage missing, seeder missing,
|
|
480
|
+
// seeder throws) returned max_iterations_reached WITHOUT updating task state,
|
|
481
|
+
// leaving the task in 'leased' state → lease expiry → infinite re-evaluation.
|
|
482
|
+
//
|
|
483
|
+
// The fix unifies the updateTask call in the caller for ALL max_iterations_reached
|
|
484
|
+
// returns. These tests verify the 2 reachable degraded paths.
|
|
485
|
+
//
|
|
486
|
+
// Note: the lineage-missing path (sourceArtificerArtifactId unresolved) is
|
|
487
|
+
// defensively unreachable through normal flow — the validator requires
|
|
488
|
+
// sourceArtificerArtifactId to be a non-empty string, so output rejected by
|
|
489
|
+
// validation never reaches maybeSeedArtificerRepair. The defensive check
|
|
490
|
+
// remains in place for defense-in-depth.
|
|
491
|
+
describe('Regression: max_iterations_reached paths mark needs_human_review (P1 fix)', () => {
|
|
492
|
+
it('seeder not injected despite flag enabled → mark needs_human_review', async () => {
|
|
493
|
+
const store = new MemoryPIArtifactStore();
|
|
494
|
+
await seedArtifacts(store);
|
|
495
|
+
const { deps, stateManager, seedArtificerRepairTask } = createMockDeps({
|
|
496
|
+
artifactStore: store,
|
|
497
|
+
isRepairLoopEnabled: () => true,
|
|
498
|
+
omitSeeder: true, // simulate plugin-layer wiring bug: flag on, seeder missing
|
|
499
|
+
artificerTask: makeArtificerTask(), // priorRepairIteration = 0 (no payload)
|
|
500
|
+
evaluatorOutput: makeNeedsRevisionOutput(),
|
|
501
|
+
});
|
|
502
|
+
const runner = new EvaluatorRunner(deps, {
|
|
503
|
+
owner: 'test',
|
|
504
|
+
runtimeKind: 'evaluator',
|
|
505
|
+
pollIntervalMs: 10,
|
|
506
|
+
timeoutMs: 1000,
|
|
507
|
+
});
|
|
508
|
+
const result = await runner.run(EVALUATOR_TASK_ID);
|
|
509
|
+
expect(result.status).toBe('succeeded');
|
|
510
|
+
// No seeder was injected → no seeding happened
|
|
511
|
+
expect(seedArtificerRepairTask).toBeNull();
|
|
512
|
+
// P1 fix: task must be marked needs_human_review (not left in 'leased')
|
|
513
|
+
expect(stateManager.updateTask).toHaveBeenCalledWith(EVALUATOR_TASK_ID, expect.objectContaining({ status: 'needs_human_review' }));
|
|
514
|
+
// Observable event emitted (rc-9 — no silent fallback)
|
|
515
|
+
const eventEmitter = deps.eventEmitter;
|
|
516
|
+
const telemetryCalls = eventEmitter.emitTelemetry.mock.calls;
|
|
517
|
+
const seederMissingCall = telemetryCalls.find((call) => typeof call[0] === 'object' && call[0] !== null
|
|
518
|
+
&& call[0].eventType === 'evaluator_repair_loop_seeder_missing');
|
|
519
|
+
expect(seederMissingCall).toBeDefined();
|
|
520
|
+
// task_needs_human_review event also emitted (caller's fail-loud signal)
|
|
521
|
+
const reviewCall = telemetryCalls.find((call) => typeof call[0] === 'object' && call[0] !== null
|
|
522
|
+
&& call[0].eventType === 'evaluator_task_needs_human_review');
|
|
523
|
+
expect(reviewCall).toBeDefined();
|
|
524
|
+
});
|
|
525
|
+
it('seeder throws → mark needs_human_review (no silent swallow)', async () => {
|
|
526
|
+
const store = new MemoryPIArtifactStore();
|
|
527
|
+
await seedArtifacts(store);
|
|
528
|
+
const { deps, stateManager, seedArtificerRepairTask } = createMockDeps({
|
|
529
|
+
artifactStore: store,
|
|
530
|
+
isRepairLoopEnabled: () => true,
|
|
531
|
+
seedArtificerRepairTask: async () => {
|
|
532
|
+
throw new Error('plugin-layer seed failed: store unavailable');
|
|
533
|
+
},
|
|
534
|
+
artificerTask: makeArtificerTask(), // priorRepairIteration = 0 (no payload)
|
|
535
|
+
evaluatorOutput: makeNeedsRevisionOutput(),
|
|
536
|
+
});
|
|
537
|
+
const runner = new EvaluatorRunner(deps, {
|
|
538
|
+
owner: 'test',
|
|
539
|
+
runtimeKind: 'evaluator',
|
|
540
|
+
pollIntervalMs: 10,
|
|
541
|
+
timeoutMs: 1000,
|
|
542
|
+
});
|
|
543
|
+
const result = await runner.run(EVALUATOR_TASK_ID);
|
|
544
|
+
expect(result.status).toBe('succeeded');
|
|
545
|
+
// Seeder was invoked but threw
|
|
546
|
+
expect(seedArtificerRepairTask).not.toBeNull();
|
|
547
|
+
expect(seedArtificerRepairTask).toHaveBeenCalledTimes(1);
|
|
548
|
+
// P1 fix: task must be marked needs_human_review (not left in 'leased')
|
|
549
|
+
expect(stateManager.updateTask).toHaveBeenCalledWith(EVALUATOR_TASK_ID, expect.objectContaining({ status: 'needs_human_review' }));
|
|
550
|
+
// Observable events emitted: seed failure + needs_human_review
|
|
551
|
+
const eventEmitter = deps.eventEmitter;
|
|
552
|
+
const telemetryCalls = eventEmitter.emitTelemetry.mock.calls;
|
|
553
|
+
const seedFailedCall = telemetryCalls.find((call) => typeof call[0] === 'object' && call[0] !== null
|
|
554
|
+
&& call[0].eventType === 'evaluator_repair_task_seed_failed');
|
|
555
|
+
expect(seedFailedCall).toBeDefined();
|
|
556
|
+
const reviewCall = telemetryCalls.find((call) => typeof call[0] === 'object' && call[0] !== null
|
|
557
|
+
&& call[0].eventType === 'evaluator_task_needs_human_review');
|
|
558
|
+
expect(reviewCall).toBeDefined();
|
|
559
|
+
});
|
|
560
|
+
});
|
|
561
|
+
});
|
|
562
|
+
//# sourceMappingURL=evaluator-repair-loop.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator-repair-loop.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/evaluator-repair-loop.test.ts"],"names":[],"mappings":"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"}
|