@principles/core 1.237.0 → 1.239.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 (35) hide show
  1. package/dist/runtime-v2/__tests__/artificer-runner-vslice.test.js +839 -0
  2. package/dist/runtime-v2/__tests__/artificer-runner-vslice.test.js.map +1 -1
  3. package/dist/runtime-v2/__tests__/evaluator-repair-loop.test.d.ts +2 -0
  4. package/dist/runtime-v2/__tests__/evaluator-repair-loop.test.d.ts.map +1 -0
  5. package/dist/runtime-v2/__tests__/evaluator-repair-loop.test.js +562 -0
  6. package/dist/runtime-v2/__tests__/evaluator-repair-loop.test.js.map +1 -0
  7. package/dist/runtime-v2/__tests__/pitask-metadata.test.js +150 -0
  8. package/dist/runtime-v2/__tests__/pitask-metadata.test.js.map +1 -1
  9. package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +32 -0
  10. package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
  11. package/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  12. package/dist/runtime-v2/feature-flags/feature-flag-contract.js +7 -0
  13. package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  14. package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js +133 -0
  15. package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js.map +1 -1
  16. package/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts +42 -1
  17. package/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts.map +1 -1
  18. package/dist/runtime-v2/internalization/artificer-prompt-builder.js +20 -0
  19. package/dist/runtime-v2/internalization/artificer-prompt-builder.js.map +1 -1
  20. package/dist/runtime-v2/internalization/artificer-runner.d.ts +22 -0
  21. package/dist/runtime-v2/internalization/artificer-runner.d.ts.map +1 -1
  22. package/dist/runtime-v2/internalization/artificer-runner.js +188 -2
  23. package/dist/runtime-v2/internalization/artificer-runner.js.map +1 -1
  24. package/dist/runtime-v2/internalization/evaluator-runner.d.ts +85 -0
  25. package/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
  26. package/dist/runtime-v2/internalization/evaluator-runner.js +223 -0
  27. package/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
  28. package/dist/runtime-v2/internalization/peer-runner-contracts.d.ts +3 -0
  29. package/dist/runtime-v2/internalization/peer-runner-contracts.d.ts.map +1 -1
  30. package/dist/runtime-v2/internalization/peer-runner-contracts.js.map +1 -1
  31. package/dist/runtime-v2/internalization/pitask-metadata.d.ts +34 -0
  32. package/dist/runtime-v2/internalization/pitask-metadata.d.ts.map +1 -1
  33. package/dist/runtime-v2/internalization/pitask-metadata.js +64 -0
  34. package/dist/runtime-v2/internalization/pitask-metadata.js.map +1 -1
  35. 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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"}