@principles/core 1.123.0 → 1.124.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 (121) hide show
  1. package/dist/runtime-v2/__tests__/architecture-regression.test.js +37 -73
  2. package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  3. package/dist/runtime-v2/adapter/pi-ai-runtime-adapter.d.ts.map +1 -1
  4. package/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js +4 -0
  5. package/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js.map +1 -1
  6. package/dist/runtime-v2/config/pd-config-types.d.ts +2 -0
  7. package/dist/runtime-v2/config/pd-config-types.d.ts.map +1 -1
  8. package/dist/runtime-v2/config/pd-config-types.js.map +1 -1
  9. package/dist/runtime-v2/diagnostician/__tests__/diag-distiller-output.test.d.ts +2 -0
  10. package/dist/runtime-v2/diagnostician/__tests__/diag-distiller-output.test.d.ts.map +1 -0
  11. package/dist/runtime-v2/diagnostician/__tests__/diag-distiller-output.test.js +45 -0
  12. package/dist/runtime-v2/diagnostician/__tests__/diag-distiller-output.test.js.map +1 -0
  13. package/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.d.ts +2 -0
  14. package/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.d.ts.map +1 -0
  15. package/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js +57 -0
  16. package/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js.map +1 -0
  17. package/dist/runtime-v2/diagnostician/__tests__/distiller-prompt-builder.test.d.ts +2 -0
  18. package/dist/runtime-v2/diagnostician/__tests__/distiller-prompt-builder.test.d.ts.map +1 -0
  19. package/dist/runtime-v2/diagnostician/__tests__/distiller-prompt-builder.test.js +39 -0
  20. package/dist/runtime-v2/diagnostician/__tests__/distiller-prompt-builder.test.js.map +1 -0
  21. package/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.d.ts +2 -0
  22. package/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.d.ts.map +1 -0
  23. package/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js +34 -0
  24. package/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js.map +1 -0
  25. package/dist/runtime-v2/diagnostician/__tests__/router-prompt-builder.test.d.ts +2 -0
  26. package/dist/runtime-v2/diagnostician/__tests__/router-prompt-builder.test.d.ts.map +1 -0
  27. package/dist/runtime-v2/diagnostician/__tests__/router-prompt-builder.test.js +57 -0
  28. package/dist/runtime-v2/diagnostician/__tests__/router-prompt-builder.test.js.map +1 -0
  29. package/dist/runtime-v2/diagnostician/diag-distiller-output.d.ts +80 -0
  30. package/dist/runtime-v2/diagnostician/diag-distiller-output.d.ts.map +1 -0
  31. package/dist/runtime-v2/diagnostician/diag-distiller-output.js +103 -0
  32. package/dist/runtime-v2/diagnostician/diag-distiller-output.js.map +1 -0
  33. package/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts +115 -0
  34. package/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts.map +1 -0
  35. package/dist/runtime-v2/diagnostician/diag-rootcause-output.js +166 -0
  36. package/dist/runtime-v2/diagnostician/diag-rootcause-output.js.map +1 -0
  37. package/dist/runtime-v2/diagnostician/distiller-prompt-builder.d.ts +134 -0
  38. package/dist/runtime-v2/diagnostician/distiller-prompt-builder.d.ts.map +1 -0
  39. package/dist/runtime-v2/diagnostician/distiller-prompt-builder.js +156 -0
  40. package/dist/runtime-v2/diagnostician/distiller-prompt-builder.js.map +1 -0
  41. package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts +96 -0
  42. package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts.map +1 -0
  43. package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js +216 -0
  44. package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js.map +1 -0
  45. package/dist/runtime-v2/diagnostician/router-prompt-builder.d.ts +127 -0
  46. package/dist/runtime-v2/diagnostician/router-prompt-builder.d.ts.map +1 -0
  47. package/dist/runtime-v2/diagnostician/router-prompt-builder.js +131 -0
  48. package/dist/runtime-v2/diagnostician/router-prompt-builder.js.map +1 -0
  49. package/dist/runtime-v2/index.d.ts +6 -3
  50. package/dist/runtime-v2/index.d.ts.map +1 -1
  51. package/dist/runtime-v2/index.js +1 -1
  52. package/dist/runtime-v2/index.js.map +1 -1
  53. package/dist/runtime-v2/internalization/__tests__/__fixtures__/split-pipeline-mock-outputs.d.ts +25 -0
  54. package/dist/runtime-v2/internalization/__tests__/__fixtures__/split-pipeline-mock-outputs.d.ts.map +1 -0
  55. package/dist/runtime-v2/internalization/__tests__/__fixtures__/split-pipeline-mock-outputs.js +123 -0
  56. package/dist/runtime-v2/internalization/__tests__/__fixtures__/split-pipeline-mock-outputs.js.map +1 -0
  57. package/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.d.ts +2 -0
  58. package/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.d.ts.map +1 -0
  59. package/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js +731 -0
  60. package/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js.map +1 -0
  61. package/dist/runtime-v2/internalization/__tests__/diag-distiller-runner.test.d.ts +2 -0
  62. package/dist/runtime-v2/internalization/__tests__/diag-distiller-runner.test.d.ts.map +1 -0
  63. package/dist/runtime-v2/internalization/__tests__/diag-distiller-runner.test.js +437 -0
  64. package/dist/runtime-v2/internalization/__tests__/diag-distiller-runner.test.js.map +1 -0
  65. package/dist/runtime-v2/internalization/__tests__/diag-rootcause-runner.test.d.ts +2 -0
  66. package/dist/runtime-v2/internalization/__tests__/diag-rootcause-runner.test.d.ts.map +1 -0
  67. package/dist/runtime-v2/internalization/__tests__/diag-rootcause-runner.test.js +336 -0
  68. package/dist/runtime-v2/internalization/__tests__/diag-rootcause-runner.test.js.map +1 -0
  69. package/dist/runtime-v2/internalization/__tests__/diag-router-runner.test.d.ts +2 -0
  70. package/dist/runtime-v2/internalization/__tests__/diag-router-runner.test.d.ts.map +1 -0
  71. package/dist/runtime-v2/internalization/__tests__/diag-router-runner.test.js +437 -0
  72. package/dist/runtime-v2/internalization/__tests__/diag-router-runner.test.js.map +1 -0
  73. package/dist/runtime-v2/internalization/diag-distiller-runner.d.ts +83 -0
  74. package/dist/runtime-v2/internalization/diag-distiller-runner.d.ts.map +1 -0
  75. package/dist/runtime-v2/internalization/diag-distiller-runner.js +274 -0
  76. package/dist/runtime-v2/internalization/diag-distiller-runner.js.map +1 -0
  77. package/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts +73 -0
  78. package/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts.map +1 -0
  79. package/dist/runtime-v2/internalization/diag-rootcause-runner.js +229 -0
  80. package/dist/runtime-v2/internalization/diag-rootcause-runner.js.map +1 -0
  81. package/dist/runtime-v2/internalization/diag-router-runner.d.ts +85 -0
  82. package/dist/runtime-v2/internalization/diag-router-runner.d.ts.map +1 -0
  83. package/dist/runtime-v2/internalization/diag-router-runner.js +353 -0
  84. package/dist/runtime-v2/internalization/diag-router-runner.js.map +1 -0
  85. package/dist/runtime-v2/internalization/evaluator-runner.d.ts +1 -1
  86. package/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
  87. package/dist/runtime-v2/internalization/evaluator-runner.js +1 -1
  88. package/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
  89. package/dist/runtime-v2/internalization/split-diagnostician-runner.d.ts +66 -0
  90. package/dist/runtime-v2/internalization/split-diagnostician-runner.d.ts.map +1 -0
  91. package/dist/runtime-v2/internalization/split-diagnostician-runner.js +172 -0
  92. package/dist/runtime-v2/internalization/split-diagnostician-runner.js.map +1 -0
  93. package/dist/runtime-v2/pain-signal-bridge.d.ts +22 -3
  94. package/dist/runtime-v2/pain-signal-bridge.d.ts.map +1 -1
  95. package/dist/runtime-v2/pain-signal-bridge.js +16 -7
  96. package/dist/runtime-v2/pain-signal-bridge.js.map +1 -1
  97. package/dist/runtime-v2/pain-signal-runtime-factory.d.ts +3 -0
  98. package/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
  99. package/dist/runtime-v2/pain-signal-runtime-factory.js +52 -24
  100. package/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
  101. package/dist/runtime-v2/runner/__tests__/base-peer-runner-trust-boundary.test.js +2 -2
  102. package/dist/runtime-v2/runner/__tests__/base-peer-runner-trust-boundary.test.js.map +1 -1
  103. package/dist/runtime-v2/runner/base-peer-runner.d.ts +3 -3
  104. package/dist/runtime-v2/runner/base-peer-runner.d.ts.map +1 -1
  105. package/dist/runtime-v2/runner/base-peer-runner.js +6 -6
  106. package/dist/runtime-v2/runner/base-peer-runner.js.map +1 -1
  107. package/dist/runtime-v2/runner/peer-runner-types.d.ts +3 -3
  108. package/dist/runtime-v2/runner/peer-runner-types.d.ts.map +1 -1
  109. package/dist/runtime-v2/store/candidate/sqlite-candidate-store.js +2 -2
  110. package/dist/runtime-v2/store/candidate/sqlite-candidate-store.js.map +1 -1
  111. package/dist/runtime-v2/types/principle-enums.d.ts +2 -2
  112. package/dist/runtime-v2/types/principle-enums.d.ts.map +1 -1
  113. package/dist/runtime-v2/types/principle-enums.js +1 -0
  114. package/dist/runtime-v2/types/principle-enums.js.map +1 -1
  115. package/dist/runtime-v2/types/principle-schema.d.ts +1 -1
  116. package/dist/runtime-v2/types/principle-tree-store.d.ts +1 -1
  117. package/dist/telemetry-event.d.ts +2 -2
  118. package/dist/telemetry-event.d.ts.map +1 -1
  119. package/dist/telemetry-event.js +1 -0
  120. package/dist/telemetry-event.js.map +1 -1
  121. package/package.json +1 -1
@@ -0,0 +1,437 @@
1
+ /**
2
+ * DiagRouterRunner — Stage C V-slice tests (PRI-372).
3
+ *
4
+ * Tests:
5
+ * 1. lease → succeed → commits candidates via DiagnosticianCommitter
6
+ * 2. dependency not succeeded → blocked
7
+ * 3. requires both rootcause and distiller predecessor dependencies
8
+ * 4. commit failure → task fails, no markTaskSucceeded
9
+ * 5. invalid output fails TypeBox schema validation
10
+ * 6. wrong taskKind fails closed
11
+ * 7. currentPhase transitions
12
+ *
13
+ * ERR entries considered:
14
+ * - ERR-001: Treat parsed JSON / LLM output as unknown
15
+ * - ERR-004: Lineage fields must be internally consistent
16
+ * - ERR-009: Required fields fail loud — TypeBox schema + semantic checks
17
+ */
18
+ import { describe, it, expect, vi } from 'vitest';
19
+ import { DiagRouterRunner } from '../diag-router-runner.js';
20
+ import { MemoryPIArtifactStore } from '../pi-artifact-store.js';
21
+ import { createPITaskDiagnosticJson } from '../pitask-metadata.js';
22
+ import { RunnerPhase } from '../../runner/runner-phase.js';
23
+ import { MOCK_ROOT_CAUSE_OUTPUTS, MOCK_DISTILLER_OUTPUTS, MOCK_ROUTER_OUTPUTS } from './__fixtures__/split-pipeline-mock-outputs.js';
24
+ // ── Test fixtures ──────────────────────────────────────────────────────────────
25
+ const ROUTER_TASK_ID = 'diag_router-001';
26
+ const ROOTCAUSE_TASK_ID = 'diag_rootcause-001';
27
+ const DISTILLER_TASK_ID = 'diag_distiller-001';
28
+ const RUN_ID = 'run-router-001';
29
+ const OWNER = 'test-router-owner';
30
+ const RUNTIME_KIND = 'test-double';
31
+ const ROOTCAUSE_ARTIFACT_ID = 'pi-art-rc-001';
32
+ const DISTILLER_ARTIFACT_ID = 'pi-art-dist-001';
33
+ function makeRootCauseTask(overrides = {}) {
34
+ return {
35
+ taskId: ROOTCAUSE_TASK_ID,
36
+ taskKind: 'diag_rootcause',
37
+ status: 'succeeded',
38
+ attemptCount: 1,
39
+ maxAttempts: 3,
40
+ resultRef: 'diag-rootcause://run-rc-001',
41
+ createdAt: new Date().toISOString(),
42
+ updatedAt: new Date().toISOString(),
43
+ diagnosticJson: '{}',
44
+ ...overrides,
45
+ };
46
+ }
47
+ function makeDistillerTask(overrides = {}) {
48
+ return {
49
+ taskId: DISTILLER_TASK_ID,
50
+ taskKind: 'diag_distiller',
51
+ status: 'succeeded',
52
+ attemptCount: 1,
53
+ maxAttempts: 3,
54
+ resultRef: 'diag-distiller://run-dist-001',
55
+ createdAt: new Date().toISOString(),
56
+ updatedAt: new Date().toISOString(),
57
+ diagnosticJson: '{}',
58
+ ...overrides,
59
+ };
60
+ }
61
+ function makeRouterTask(overrides = {}) {
62
+ return {
63
+ taskId: ROUTER_TASK_ID,
64
+ taskKind: 'diag_router',
65
+ status: 'pending',
66
+ attemptCount: 0,
67
+ maxAttempts: 3,
68
+ createdAt: new Date().toISOString(),
69
+ updatedAt: new Date().toISOString(),
70
+ diagnosticJson: createPITaskDiagnosticJson({
71
+ dependencyTaskIds: [ROOTCAUSE_TASK_ID, DISTILLER_TASK_ID],
72
+ channel: 'prompt',
73
+ timeoutMs: 300_000,
74
+ inputArtifactRefs: [],
75
+ outputArtifactRefs: [],
76
+ }),
77
+ ...overrides,
78
+ };
79
+ }
80
+ /** Happy-path output using cached real LLM data (R6 fixture) with test-local IDs. */
81
+ function makeRootCauseOutput() {
82
+ return {
83
+ ...MOCK_ROOT_CAUSE_OUTPUTS.R6,
84
+ diagnosisId: 'diag-001',
85
+ taskId: ROOTCAUSE_TASK_ID,
86
+ };
87
+ }
88
+ /** Happy-path output using cached real LLM data (R6 fixture) with test-local IDs. */
89
+ function makeDistillerOutput() {
90
+ return {
91
+ ...MOCK_DISTILLER_OUTPUTS.R6,
92
+ taskId: DISTILLER_TASK_ID,
93
+ sourceRootCauseArtifactId: ROOTCAUSE_ARTIFACT_ID,
94
+ };
95
+ }
96
+ /** Happy-path output using cached real LLM data (R6 fixture) with test-local IDs. */
97
+ function makeRouterOutput() {
98
+ return {
99
+ ...MOCK_ROUTER_OUTPUTS.R6,
100
+ diagnosisId: 'diag-001',
101
+ };
102
+ }
103
+ /** Pre-populate a MemoryPIArtifactStore with both predecessor artifacts. */
104
+ function populatePredecessorArtifacts(store) {
105
+ store.upsertArtifact({
106
+ artifactId: ROOTCAUSE_ARTIFACT_ID,
107
+ artifactKind: 'principle',
108
+ sourceTaskId: ROOTCAUSE_TASK_ID,
109
+ lineageArtifactIds: [],
110
+ validationStatus: 'pending',
111
+ contentJson: JSON.stringify(makeRootCauseOutput()),
112
+ createdAt: new Date().toISOString(),
113
+ updatedAt: new Date().toISOString(),
114
+ });
115
+ store.upsertArtifact({
116
+ artifactId: DISTILLER_ARTIFACT_ID,
117
+ artifactKind: 'principle',
118
+ sourceTaskId: DISTILLER_TASK_ID,
119
+ lineageArtifactIds: [ROOTCAUSE_ARTIFACT_ID],
120
+ validationStatus: 'pending',
121
+ contentJson: JSON.stringify(makeDistillerOutput()),
122
+ createdAt: new Date().toISOString(),
123
+ updatedAt: new Date().toISOString(),
124
+ });
125
+ }
126
+ // ── Mock factory ───────────────────────────────────────────────────────────────
127
+ function createMockDeps(overrides = {}) {
128
+ const taskRecord = makeRouterTask();
129
+ const output = makeRouterOutput();
130
+ const _stateManager = {
131
+ acquireLease: vi.fn().mockResolvedValue(taskRecord),
132
+ getTask: vi.fn().mockImplementation((id) => {
133
+ if (id === ROUTER_TASK_ID)
134
+ return Promise.resolve(taskRecord);
135
+ if (id === ROOTCAUSE_TASK_ID)
136
+ return Promise.resolve(makeRootCauseTask());
137
+ if (id === DISTILLER_TASK_ID)
138
+ return Promise.resolve(makeDistillerTask());
139
+ return Promise.resolve(undefined);
140
+ }),
141
+ getRunsByTask: vi.fn().mockResolvedValue([{ runId: RUN_ID, taskId: ROUTER_TASK_ID }]),
142
+ updateRunOutput: vi.fn().mockResolvedValue(undefined),
143
+ markTaskSucceeded: vi.fn().mockResolvedValue(undefined),
144
+ markTaskFailed: vi.fn().mockResolvedValue(undefined),
145
+ markTaskRetryWait: vi.fn().mockResolvedValue(undefined),
146
+ getRetryPolicy: vi.fn().mockReturnValue({ shouldRetry: () => false }),
147
+ };
148
+ const runHandle = { runId: RUN_ID, runtimeKind: RUNTIME_KIND, startedAt: new Date().toISOString() };
149
+ const succeededStatus = { status: 'succeeded', runId: RUN_ID };
150
+ const _runtimeAdapter = {
151
+ kind: vi.fn().mockReturnValue(RUNTIME_KIND),
152
+ getCapabilities: vi.fn(),
153
+ healthCheck: vi.fn(),
154
+ startRun: vi.fn().mockResolvedValue(runHandle),
155
+ pollRun: vi.fn().mockResolvedValue(succeededStatus),
156
+ fetchOutput: vi.fn().mockResolvedValue({ payload: output }),
157
+ cancelRun: vi.fn().mockResolvedValue(undefined),
158
+ fetchArtifacts: vi.fn(),
159
+ };
160
+ const commitResult = {
161
+ commitId: 'commit-001',
162
+ artifactId: 'art-001',
163
+ candidateCount: 1,
164
+ };
165
+ const _committer = {
166
+ commit: vi.fn().mockResolvedValue(commitResult),
167
+ };
168
+ const mockEventEmitter = {
169
+ emitTelemetry: vi.fn(),
170
+ on: vi.fn(),
171
+ emit: vi.fn(),
172
+ };
173
+ // Create store with predecessor artifacts pre-populated
174
+ const artifactStore = new MemoryPIArtifactStore();
175
+ populatePredecessorArtifacts(artifactStore);
176
+ return {
177
+ stateManager: _stateManager,
178
+ runtimeAdapter: _runtimeAdapter,
179
+ eventEmitter: mockEventEmitter,
180
+ artifactStore,
181
+ committer: _committer,
182
+ _stateManager,
183
+ _runtimeAdapter,
184
+ _committer,
185
+ ...overrides,
186
+ };
187
+ }
188
+ // ── Tests ──────────────────────────────────────────────────────────────────────
189
+ describe('DiagRouterRunner V-slice', () => {
190
+ it('lease → succeed → commits candidates via DiagnosticianCommitter', async () => {
191
+ const deps = createMockDeps();
192
+ const runner = new DiagRouterRunner(deps, {
193
+ owner: OWNER,
194
+ runtimeKind: RUNTIME_KIND,
195
+ pollIntervalMs: 10,
196
+ timeoutMs: 1000,
197
+ });
198
+ const result = await runner.run(ROUTER_TASK_ID);
199
+ expect(result.status).toBe('succeeded');
200
+ expect(result.taskId).toBe(ROUTER_TASK_ID);
201
+ // Verify committer was called
202
+ expect(deps._committer.commit).toHaveBeenCalledWith(expect.objectContaining({
203
+ runId: RUN_ID,
204
+ taskId: ROUTER_TASK_ID,
205
+ }));
206
+ // Verify markTaskSucceeded called with commit:// resultRef
207
+ expect(deps._stateManager.markTaskSucceeded).toHaveBeenCalledWith(ROUTER_TASK_ID, expect.stringContaining('commit://'));
208
+ });
209
+ it('dependency not succeeded → blocked', async () => {
210
+ // Empty artifact store — no distiller artifact
211
+ const emptyStore = new MemoryPIArtifactStore();
212
+ // Still need rootcause artifact
213
+ emptyStore.upsertArtifact({
214
+ artifactId: ROOTCAUSE_ARTIFACT_ID,
215
+ artifactKind: 'principle',
216
+ sourceTaskId: ROOTCAUSE_TASK_ID,
217
+ lineageArtifactIds: [],
218
+ validationStatus: 'pending',
219
+ contentJson: JSON.stringify(makeRootCauseOutput()),
220
+ createdAt: new Date().toISOString(),
221
+ updatedAt: new Date().toISOString(),
222
+ });
223
+ const deps = createMockDeps({ artifactStore: emptyStore });
224
+ // Make the distiller task still pending (not succeeded)
225
+ const pendingDistillerTask = makeDistillerTask({ status: 'pending', resultRef: undefined });
226
+ deps._stateManager.getTask.mockImplementation((id) => {
227
+ if (id === ROUTER_TASK_ID)
228
+ return Promise.resolve(makeRouterTask());
229
+ if (id === ROOTCAUSE_TASK_ID)
230
+ return Promise.resolve(makeRootCauseTask());
231
+ if (id === DISTILLER_TASK_ID)
232
+ return Promise.resolve(pendingDistillerTask);
233
+ return Promise.resolve(undefined);
234
+ });
235
+ const runner = new DiagRouterRunner(deps, {
236
+ owner: OWNER,
237
+ runtimeKind: RUNTIME_KIND,
238
+ pollIntervalMs: 10,
239
+ timeoutMs: 1000,
240
+ });
241
+ const result = await runner.run(ROUTER_TASK_ID);
242
+ // Should fail because distiller artifact is missing
243
+ expect(result.status).toBe('failed');
244
+ });
245
+ it('requires both rootcause and distiller predecessor dependencies', async () => {
246
+ const deps = createMockDeps();
247
+ // Create a router task with only one dependency
248
+ const singleDepTask = makeRouterTask({
249
+ diagnosticJson: createPITaskDiagnosticJson({
250
+ dependencyTaskIds: [ROOTCAUSE_TASK_ID],
251
+ channel: 'prompt',
252
+ timeoutMs: 300_000,
253
+ inputArtifactRefs: [],
254
+ outputArtifactRefs: [],
255
+ }),
256
+ });
257
+ deps._stateManager.acquireLease.mockResolvedValue(singleDepTask);
258
+ deps._stateManager.getTask.mockImplementation((id) => {
259
+ if (id === ROUTER_TASK_ID)
260
+ return Promise.resolve(singleDepTask);
261
+ if (id === ROOTCAUSE_TASK_ID)
262
+ return Promise.resolve(makeRootCauseTask());
263
+ return Promise.resolve(undefined);
264
+ });
265
+ const runner = new DiagRouterRunner(deps, {
266
+ owner: OWNER,
267
+ runtimeKind: RUNTIME_KIND,
268
+ pollIntervalMs: 10,
269
+ timeoutMs: 1000,
270
+ });
271
+ const result = await runner.run(ROUTER_TASK_ID);
272
+ // Should fail because only one predecessor dependency
273
+ expect(result.status).toBe('failed');
274
+ });
275
+ it('commit failure → task fails, no markTaskSucceeded', async () => {
276
+ const deps = createMockDeps();
277
+ deps._committer.commit.mockRejectedValue(new Error('Commit failed: DB error'));
278
+ const runner = new DiagRouterRunner(deps, {
279
+ owner: OWNER,
280
+ runtimeKind: RUNTIME_KIND,
281
+ pollIntervalMs: 10,
282
+ timeoutMs: 1000,
283
+ });
284
+ const result = await runner.run(ROUTER_TASK_ID);
285
+ expect(result.status).toBe('failed');
286
+ expect(deps._stateManager.markTaskSucceeded).not.toHaveBeenCalled();
287
+ });
288
+ it('invalid output fails TypeBox schema validation', async () => {
289
+ const deps = createMockDeps();
290
+ // Return invalid output that fails TypeBox validation
291
+ deps._runtimeAdapter.fetchOutput.mockResolvedValue({
292
+ payload: { invalid: true },
293
+ });
294
+ const runner = new DiagRouterRunner(deps, {
295
+ owner: OWNER,
296
+ runtimeKind: RUNTIME_KIND,
297
+ pollIntervalMs: 10,
298
+ timeoutMs: 1000,
299
+ });
300
+ const result = await runner.run(ROUTER_TASK_ID);
301
+ expect(result.status).toBe('failed');
302
+ });
303
+ it('currentPhase is Completed after successful run', async () => {
304
+ const deps = createMockDeps();
305
+ const runner = new DiagRouterRunner(deps, {
306
+ owner: OWNER,
307
+ runtimeKind: RUNTIME_KIND,
308
+ pollIntervalMs: 10,
309
+ timeoutMs: 1000,
310
+ });
311
+ const result = await runner.run(ROUTER_TASK_ID);
312
+ expect(result.status).toBe('succeeded');
313
+ expect(runner.currentPhase).toBe(RunnerPhase.Completed);
314
+ });
315
+ it('currentPhase is Failed after validation failure', async () => {
316
+ const deps = createMockDeps();
317
+ // Return invalid output that fails TypeBox validation
318
+ deps._runtimeAdapter.fetchOutput.mockResolvedValue({
319
+ payload: { invalid: true },
320
+ });
321
+ const runner = new DiagRouterRunner(deps, {
322
+ owner: OWNER,
323
+ runtimeKind: RUNTIME_KIND,
324
+ pollIntervalMs: 10,
325
+ timeoutMs: 1000,
326
+ });
327
+ const result = await runner.run(ROUTER_TASK_ID);
328
+ expect(result.status).toBe('failed');
329
+ expect(runner.currentPhase).toBe(RunnerPhase.Failed);
330
+ });
331
+ it('wrong taskKind fails closed', async () => {
332
+ const wrongKindTask = makeRouterTask({ taskKind: 'dreamer' });
333
+ const deps = createMockDeps();
334
+ deps._stateManager.acquireLease.mockResolvedValue(wrongKindTask);
335
+ const runner = new DiagRouterRunner(deps, {
336
+ owner: OWNER,
337
+ runtimeKind: RUNTIME_KIND,
338
+ pollIntervalMs: 10,
339
+ timeoutMs: 1000,
340
+ });
341
+ const result = await runner.run(ROUTER_TASK_ID);
342
+ expect(result.status).toBe('failed');
343
+ expect(result.errorCategory).toBe('input_invalid');
344
+ });
345
+ it('succeedTask calls updateRunOutput before commit', async () => {
346
+ const deps = createMockDeps();
347
+ const callOrder = [];
348
+ deps._stateManager.updateRunOutput.mockImplementation(() => {
349
+ callOrder.push('updateRunOutput');
350
+ return Promise.resolve();
351
+ });
352
+ deps._committer.commit.mockImplementation(() => {
353
+ callOrder.push('commit');
354
+ return Promise.resolve({ commitId: 'commit-001', artifactId: 'art-001', candidateCount: 1 });
355
+ });
356
+ const runner = new DiagRouterRunner(deps, {
357
+ owner: OWNER,
358
+ runtimeKind: RUNTIME_KIND,
359
+ pollIntervalMs: 10,
360
+ timeoutMs: 1000,
361
+ });
362
+ const result = await runner.run(ROUTER_TASK_ID);
363
+ expect(result.status).toBe('succeeded');
364
+ expect(callOrder.indexOf('updateRunOutput')).toBeLessThan(callOrder.indexOf('commit'));
365
+ });
366
+ it('corrupted rootcause artifact content fails schema validation (EP-01)', async () => {
367
+ // Write a corrupted rootcause artifact (missing required fields)
368
+ const corruptedStore = new MemoryPIArtifactStore();
369
+ corruptedStore.upsertArtifact({
370
+ artifactId: ROOTCAUSE_ARTIFACT_ID,
371
+ artifactKind: 'principle',
372
+ sourceTaskId: ROOTCAUSE_TASK_ID,
373
+ lineageArtifactIds: [],
374
+ validationStatus: 'pending',
375
+ contentJson: JSON.stringify({ invalid: true, missing: 'required fields' }),
376
+ createdAt: new Date().toISOString(),
377
+ updatedAt: new Date().toISOString(),
378
+ });
379
+ // Valid distiller artifact
380
+ corruptedStore.upsertArtifact({
381
+ artifactId: DISTILLER_ARTIFACT_ID,
382
+ artifactKind: 'principle',
383
+ sourceTaskId: DISTILLER_TASK_ID,
384
+ lineageArtifactIds: [ROOTCAUSE_ARTIFACT_ID],
385
+ validationStatus: 'pending',
386
+ contentJson: JSON.stringify(makeDistillerOutput()),
387
+ createdAt: new Date().toISOString(),
388
+ updatedAt: new Date().toISOString(),
389
+ });
390
+ const deps = createMockDeps({ artifactStore: corruptedStore });
391
+ const runner = new DiagRouterRunner(deps, {
392
+ owner: OWNER,
393
+ runtimeKind: RUNTIME_KIND,
394
+ pollIntervalMs: 10,
395
+ timeoutMs: 1000,
396
+ });
397
+ const result = await runner.run(ROUTER_TASK_ID);
398
+ expect(result.status).toBe('failed');
399
+ expect(result.errorCategory).toBe('input_invalid');
400
+ });
401
+ it('corrupted distiller artifact content fails schema validation (EP-01)', async () => {
402
+ // Valid rootcause artifact
403
+ const corruptedStore = new MemoryPIArtifactStore();
404
+ corruptedStore.upsertArtifact({
405
+ artifactId: ROOTCAUSE_ARTIFACT_ID,
406
+ artifactKind: 'principle',
407
+ sourceTaskId: ROOTCAUSE_TASK_ID,
408
+ lineageArtifactIds: [],
409
+ validationStatus: 'pending',
410
+ contentJson: JSON.stringify(makeRootCauseOutput()),
411
+ createdAt: new Date().toISOString(),
412
+ updatedAt: new Date().toISOString(),
413
+ });
414
+ // Corrupted distiller artifact
415
+ corruptedStore.upsertArtifact({
416
+ artifactId: DISTILLER_ARTIFACT_ID,
417
+ artifactKind: 'principle',
418
+ sourceTaskId: DISTILLER_TASK_ID,
419
+ lineageArtifactIds: [ROOTCAUSE_ARTIFACT_ID],
420
+ validationStatus: 'pending',
421
+ contentJson: JSON.stringify({ invalid: true, missing: 'required fields' }),
422
+ createdAt: new Date().toISOString(),
423
+ updatedAt: new Date().toISOString(),
424
+ });
425
+ const deps = createMockDeps({ artifactStore: corruptedStore });
426
+ const runner = new DiagRouterRunner(deps, {
427
+ owner: OWNER,
428
+ runtimeKind: RUNTIME_KIND,
429
+ pollIntervalMs: 10,
430
+ timeoutMs: 1000,
431
+ });
432
+ const result = await runner.run(ROUTER_TASK_ID);
433
+ expect(result.status).toBe('failed');
434
+ expect(result.errorCategory).toBe('input_invalid');
435
+ });
436
+ });
437
+ //# sourceMappingURL=diag-router-runner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diag-router-runner.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/diag-router-runner.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * DiagDistillerRunner — Stage B runner for the split diagnostician pipeline.
3
+ *
4
+ * Takes the root-cause artifact from Stage A and produces an abstracted,
5
+ * cross-scenario principle grounded on the T-01..T-10 core axiom registry.
6
+ *
7
+ * Extends BasePeerRunner following the DreamerRunner pattern (PRI-302).
8
+ * The shared lease → buildContext → invoke → poll → fetch → validate →
9
+ * succeed/fail pipeline is in the base class. This file only contains
10
+ * Stage B–specific logic.
11
+ *
12
+ * Key constraints:
13
+ * - Uses PDRuntimeAdapter for all LLM execution (no direct SDK calls)
14
+ * - No plugin-layer imports (core is infrastructure-agnostic)
15
+ * - Uses RuntimeStateManager for all state operations
16
+ * - NO candidate commit — only writes PIArtifact (like DreamerRunner)
17
+ * - Reads diagnostician_core_grounding flag from effectiveConfig (PRI-371)
18
+ * - Validates groundedOnCorePrincipleIds against registry (fabricated IDs fail)
19
+ * - Lineage integrity: output.sourceRootCauseArtifactId must match context
20
+ *
21
+ * @see PRI-372
22
+ * @see BasePeerRunner in runner/base-peer-runner.ts
23
+ */
24
+ import type { RunHandle } from '../runtime-protocol.js';
25
+ import type { DiagDistillerOutputV1, DiagDistillerValidator } from '../diagnostician/diag-distiller-output.js';
26
+ import type { DiagRootCauseOutputV1 } from '../diagnostician/diag-rootcause-output.js';
27
+ import type { TaskRecord } from '../task-status.js';
28
+ import type { EffectivePdConfig } from '../config/pd-config-types.js';
29
+ import { type PDErrorCategory } from '../error-categories.js';
30
+ import { BasePeerRunner } from '../runner/base-peer-runner.js';
31
+ import type { PeerRunnerOptions, PeerRunnerDeps, PeerRunnerResult, PeerRunnerValidationResult } from '../runner/peer-runner-types.js';
32
+ /** Context built by DiagDistillerRunner.buildContext() and consumed by invokeRuntime(). */
33
+ interface DiagDistillerContext {
34
+ readonly contextHash: string;
35
+ readonly contextRefs: string[];
36
+ readonly rootCauseArtifactId: string;
37
+ readonly rootCauseOutput: DiagRootCauseOutputV1;
38
+ readonly coreGrounding: boolean;
39
+ }
40
+ export interface DiagDistillerRunnerDeps extends PeerRunnerDeps {
41
+ readonly validator: DiagDistillerValidator;
42
+ }
43
+ export interface DiagDistillerRunnerOptions extends PeerRunnerOptions {
44
+ /** Effective PD config for feature flag resolution (PRI-371). */
45
+ readonly effectiveConfig?: EffectivePdConfig;
46
+ }
47
+ /**
48
+ * Stage B runner for the split diagnostician pipeline.
49
+ *
50
+ * Produces a DiagDistillerOutputV1 containing the abstracted principle,
51
+ * core axiom grounding, scope, and confidence. Does NOT commit candidates —
52
+ * that is the responsibility of Stage C (DiagRouterRunner).
53
+ *
54
+ * @see PRI-372
55
+ */
56
+ export declare class DiagDistillerRunner extends BasePeerRunner<DiagDistillerContext, DiagDistillerOutputV1> {
57
+ private readonly validator;
58
+ private readonly effectiveConfig?;
59
+ constructor(deps: DiagDistillerRunnerDeps, options: DiagDistillerRunnerOptions);
60
+ get permanentErrorCategories(): ReadonlySet<PDErrorCategory>;
61
+ buildContext(taskId: string): Promise<DiagDistillerContext>;
62
+ invokeRuntime(taskId: string, context: DiagDistillerContext): Promise<RunHandle>;
63
+ validateOutput(output: unknown, taskId: string, _context: DiagDistillerContext): Promise<PeerRunnerValidationResult>;
64
+ succeedTask(taskId: string, runId: string, output: DiagDistillerOutputV1, task: TaskRecord, contextHash: string, _context: DiagDistillerContext): Promise<PeerRunnerResult<DiagDistillerOutputV1>>;
65
+ /**
66
+ * Re-inject taskId and sourceRootCauseArtifactId if stripped by
67
+ * stripLineageFields (PRI-272 / ERR-008).
68
+ * Only fill when absent via Object.hasOwn — present-but-falsy values
69
+ * must reach validation and fail loud (Runtime Contract Rule 3).
70
+ */
71
+ protected postFetchTransform(taskId: string, untrustedOutput: unknown): void;
72
+ /**
73
+ * Check lineage strip contract invariant (EP-07).
74
+ *
75
+ * After validation passes, verify that the output's sourceRootCauseArtifactId
76
+ * matches the context's rootCauseArtifactId. If they mismatch, the LLM
77
+ * fabricated or altered the lineage field — emit telemetry and throw.
78
+ */
79
+ protected checkLineageIntegrity(taskId: string, output: DiagDistillerOutputV1, context: DiagDistillerContext): void;
80
+ protected emitSuccessTelemetry(taskId: string, output: DiagDistillerOutputV1, _context: DiagDistillerContext): void;
81
+ }
82
+ export {};
83
+ //# sourceMappingURL=diag-distiller-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diag-distiller-runner.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/diag-distiller-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AAC/G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAEvF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAK9E,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,0BAA0B,EAC3B,MAAM,gCAAgC,CAAC;AAIxC,2FAA2F;AAC3F,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAC/B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,qBAAqB,CAAC;IAChD,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAID,MAAM,WAAW,uBAAwB,SAAQ,cAAc;IAC7D,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;CAC5C;AAID,MAAM,WAAW,0BAA2B,SAAQ,iBAAiB;IACnE,iEAAiE;IACjE,QAAQ,CAAC,eAAe,CAAC,EAAE,iBAAiB,CAAC;CAC9C;AAID;;;;;;;;GAQG;AACH,qBAAa,mBAAoB,SAAQ,cAAc,CAAC,oBAAoB,EAAE,qBAAqB,CAAC;IAClG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IACnD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAoB;gBAEzC,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,0BAA0B;IAc9E,IAAI,wBAAwB,IAAI,WAAW,CAAC,eAAe,CAAC,CAE3D;IAEK,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAkE3D,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,SAAS,CAAC;IAwBhF,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAUpH,WAAW,CACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,qBAAqB,EAC7B,IAAI,EAAE,UAAU,EAChB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;IA+FnD;;;;;OAKG;cAEgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,GAAG,IAAI;IAOrF;;;;;;OAMG;cACgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,OAAO,EAAE,oBAAoB,GAAG,IAAI;cAWzG,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,QAAQ,EAAE,oBAAoB,GAAG,IAAI;CAO7H"}