@principles/core 1.186.0 → 1.187.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__/architecture-regression.test.js +7 -1
- package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
- package/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js +134 -15
- package/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js.map +1 -1
- package/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.d.ts +18 -0
- package/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.d.ts.map +1 -0
- package/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.js +251 -0
- package/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.js.map +1 -0
- package/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js +73 -0
- package/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js.map +1 -1
- package/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts +90 -0
- package/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts.map +1 -1
- package/dist/runtime-v2/diagnostician/diag-rootcause-output.js +108 -0
- package/dist/runtime-v2/diagnostician/diag-rootcause-output.js.map +1 -1
- package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts +8 -0
- package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts.map +1 -1
- package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js +66 -3
- package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js.map +1 -1
- package/dist/runtime-v2/diagnostician-output.d.ts +23 -0
- package/dist/runtime-v2/diagnostician-output.d.ts.map +1 -1
- package/dist/runtime-v2/diagnostician-output.js +16 -0
- package/dist/runtime-v2/diagnostician-output.js.map +1 -1
- package/dist/runtime-v2/diagnostician-prompt-builder.d.ts +32 -0
- package/dist/runtime-v2/diagnostician-prompt-builder.d.ts.map +1 -1
- package/dist/runtime-v2/diagnostician-prompt-builder.js.map +1 -1
- package/dist/runtime-v2/index.d.ts +4 -2
- package/dist/runtime-v2/index.d.ts.map +1 -1
- package/dist/runtime-v2/index.js +5 -3
- package/dist/runtime-v2/index.js.map +1 -1
- package/dist/runtime-v2/intent/index.d.ts +1 -0
- package/dist/runtime-v2/intent/index.d.ts.map +1 -1
- package/dist/runtime-v2/intent/index.js +1 -0
- package/dist/runtime-v2/intent/index.js.map +1 -1
- package/dist/runtime-v2/intent/intent-doc-reader-port.d.ts +95 -0
- package/dist/runtime-v2/intent/intent-doc-reader-port.d.ts.map +1 -0
- package/dist/runtime-v2/intent/intent-doc-reader-port.js +43 -0
- package/dist/runtime-v2/intent/intent-doc-reader-port.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.d.ts +54 -0
- package/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.js +219 -0
- package/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.js +360 -0
- package/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.js +333 -0
- package/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.js +113 -0
- package/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.js.map +1 -0
- package/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts +13 -0
- package/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/diag-rootcause-runner.js +42 -0
- package/dist/runtime-v2/internalization/diag-rootcause-runner.js.map +1 -1
- package/dist/runtime-v2/internalization/diag-router-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/diag-router-runner.js +27 -0
- package/dist/runtime-v2/internalization/diag-router-runner.js.map +1 -1
- package/dist/runtime-v2/pain-signal-runtime-factory.d.ts +12 -0
- package/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
- package/dist/runtime-v2/pain-signal-runtime-factory.js +1 -1
- package/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
- package/dist/runtime-v2/pain-to-principle-service.d.ts +6 -0
- package/dist/runtime-v2/pain-to-principle-service.d.ts.map +1 -1
- package/dist/runtime-v2/pain-to-principle-service.js +2 -0
- package/dist/runtime-v2/pain-to-principle-service.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DiagRouterRunner — PRI-468 Stage C intentTension additive passthrough tests.
|
|
3
|
+
*
|
|
4
|
+
* Verifies SPEC §18 requirements:
|
|
5
|
+
* 1. Stage A has intentTension → Stage C passes it through
|
|
6
|
+
* 2. Stage A has NO intentTension → Stage C does NOT generate one
|
|
7
|
+
* 3. Stage A has NO intentTension + LLM hallucinated one → Stage C strips it
|
|
8
|
+
* 4. Stage A has intentTension + LLM also produced one → Stage A wins (source of truth)
|
|
9
|
+
*
|
|
10
|
+
* ERR entries considered:
|
|
11
|
+
* - EP-01 / ERR-001: context.rootCauseOutput is schema-validated before reaching here
|
|
12
|
+
* - EP-01 / ERR-013: Object.hasOwn used for field presence check (not `in`)
|
|
13
|
+
* - EP-02 / ERR-009: fail-loud on missing required fields via schema validation
|
|
14
|
+
* - EP-03 / ERR-002: stripping hallucinated intentTension emits telemetry (observable)
|
|
15
|
+
*/
|
|
16
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
17
|
+
import { DiagRouterRunner } from '../diag-router-runner.js';
|
|
18
|
+
import { MemoryPIArtifactStore } from '../pi-artifact-store.js';
|
|
19
|
+
import { createPITaskDiagnosticJson } from '../pitask-metadata.js';
|
|
20
|
+
import { MOCK_ROOT_CAUSE_OUTPUTS, MOCK_DISTILLER_OUTPUTS, MOCK_ROUTER_OUTPUTS } from './__fixtures__/split-pipeline-mock-outputs.js';
|
|
21
|
+
// ── Test fixtures ────────────────────────────────────────────────────────────
|
|
22
|
+
const ROUTER_TASK_ID = 'diag_router-001';
|
|
23
|
+
const ROOTCAUSE_TASK_ID = 'diag_rootcause-001';
|
|
24
|
+
const DISTILLER_TASK_ID = 'diag_distiller-001';
|
|
25
|
+
const RUN_ID = 'run-router-001';
|
|
26
|
+
const OWNER = 'test-router-intent-owner';
|
|
27
|
+
const RUNTIME_KIND = 'test-double';
|
|
28
|
+
const ROOTCAUSE_ARTIFACT_ID = 'pi-art-rc-001';
|
|
29
|
+
const DISTILLER_ARTIFACT_ID = 'pi-art-dist-001';
|
|
30
|
+
const VALID_INTENT_TENSION = {
|
|
31
|
+
source: 'action_drift',
|
|
32
|
+
evidenceStrength: 'moderate',
|
|
33
|
+
relatedIntentFields: ['current_strategic_focus', 'non_negotiables'],
|
|
34
|
+
evidence: [
|
|
35
|
+
'INTENT says current focus is validating the smallest Pain → Principle loop.',
|
|
36
|
+
'Agent designed a heavy dashboard.',
|
|
37
|
+
'Owner correction says the result increased review burden.',
|
|
38
|
+
],
|
|
39
|
+
explanation: 'The work may be useful later, but it optimized presentation completeness before validating the current learning loop.',
|
|
40
|
+
suggestedOwnerAction: 'confirm_drift',
|
|
41
|
+
intentDocHash: 'sha256:abc123',
|
|
42
|
+
};
|
|
43
|
+
function makeRootCauseTask(overrides = {}) {
|
|
44
|
+
return {
|
|
45
|
+
taskId: ROOTCAUSE_TASK_ID,
|
|
46
|
+
taskKind: 'diag_rootcause',
|
|
47
|
+
status: 'succeeded',
|
|
48
|
+
attemptCount: 1,
|
|
49
|
+
maxAttempts: 3,
|
|
50
|
+
resultRef: 'diag-rootcause://run-rc-001',
|
|
51
|
+
createdAt: new Date().toISOString(),
|
|
52
|
+
updatedAt: new Date().toISOString(),
|
|
53
|
+
diagnosticJson: '{}',
|
|
54
|
+
...overrides,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function makeDistillerTask(overrides = {}) {
|
|
58
|
+
return {
|
|
59
|
+
taskId: DISTILLER_TASK_ID,
|
|
60
|
+
taskKind: 'diag_distiller',
|
|
61
|
+
status: 'succeeded',
|
|
62
|
+
attemptCount: 1,
|
|
63
|
+
maxAttempts: 3,
|
|
64
|
+
resultRef: 'diag-distiller://run-dist-001',
|
|
65
|
+
createdAt: new Date().toISOString(),
|
|
66
|
+
updatedAt: new Date().toISOString(),
|
|
67
|
+
diagnosticJson: '{}',
|
|
68
|
+
...overrides,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function makeRouterTask(overrides = {}) {
|
|
72
|
+
return {
|
|
73
|
+
taskId: ROUTER_TASK_ID,
|
|
74
|
+
taskKind: 'diag_router',
|
|
75
|
+
status: 'pending',
|
|
76
|
+
attemptCount: 0,
|
|
77
|
+
maxAttempts: 3,
|
|
78
|
+
createdAt: new Date().toISOString(),
|
|
79
|
+
updatedAt: new Date().toISOString(),
|
|
80
|
+
diagnosticJson: createPITaskDiagnosticJson({
|
|
81
|
+
dependencyTaskIds: [ROOTCAUSE_TASK_ID, DISTILLER_TASK_ID],
|
|
82
|
+
channel: 'prompt',
|
|
83
|
+
timeoutMs: 300_000,
|
|
84
|
+
inputArtifactRefs: [],
|
|
85
|
+
outputArtifactRefs: [],
|
|
86
|
+
}),
|
|
87
|
+
...overrides,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function makeRootCauseOutput(intentTension) {
|
|
91
|
+
const base = {
|
|
92
|
+
...MOCK_ROOT_CAUSE_OUTPUTS.R6,
|
|
93
|
+
diagnosisId: 'diag-001',
|
|
94
|
+
taskId: ROOTCAUSE_TASK_ID,
|
|
95
|
+
};
|
|
96
|
+
return intentTension ? { ...base, intentTension } : base;
|
|
97
|
+
}
|
|
98
|
+
function makeDistillerOutput() {
|
|
99
|
+
return {
|
|
100
|
+
...MOCK_DISTILLER_OUTPUTS.R6,
|
|
101
|
+
taskId: DISTILLER_TASK_ID,
|
|
102
|
+
sourceRootCauseArtifactId: ROOTCAUSE_ARTIFACT_ID,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function makeRouterOutput(intentTension) {
|
|
106
|
+
const base = {
|
|
107
|
+
...MOCK_ROUTER_OUTPUTS.R6,
|
|
108
|
+
diagnosisId: 'diag-001',
|
|
109
|
+
};
|
|
110
|
+
if (intentTension !== undefined) {
|
|
111
|
+
return { ...base, intentTension: intentTension };
|
|
112
|
+
}
|
|
113
|
+
return base;
|
|
114
|
+
}
|
|
115
|
+
/** Pre-populate a MemoryPIArtifactStore with both predecessor artifacts. */
|
|
116
|
+
function populatePredecessorArtifacts(store, rootCauseOutput) {
|
|
117
|
+
store.upsertArtifact({
|
|
118
|
+
artifactId: ROOTCAUSE_ARTIFACT_ID,
|
|
119
|
+
artifactKind: 'principle',
|
|
120
|
+
sourceTaskId: ROOTCAUSE_TASK_ID,
|
|
121
|
+
lineageArtifactIds: [],
|
|
122
|
+
validationStatus: 'pending',
|
|
123
|
+
contentJson: JSON.stringify(rootCauseOutput),
|
|
124
|
+
createdAt: new Date().toISOString(),
|
|
125
|
+
updatedAt: new Date().toISOString(),
|
|
126
|
+
});
|
|
127
|
+
store.upsertArtifact({
|
|
128
|
+
artifactId: DISTILLER_ARTIFACT_ID,
|
|
129
|
+
artifactKind: 'principle',
|
|
130
|
+
sourceTaskId: DISTILLER_TASK_ID,
|
|
131
|
+
lineageArtifactIds: [ROOTCAUSE_ARTIFACT_ID],
|
|
132
|
+
validationStatus: 'pending',
|
|
133
|
+
contentJson: JSON.stringify(makeDistillerOutput()),
|
|
134
|
+
createdAt: new Date().toISOString(),
|
|
135
|
+
updatedAt: new Date().toISOString(),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
// ── Mock factory ─────────────────────────────────────────────────────────────
|
|
139
|
+
function createMockDeps(rootCauseOutput, routerOutput, overrides = {}) {
|
|
140
|
+
const taskRecord = makeRouterTask();
|
|
141
|
+
const _stateManager = {
|
|
142
|
+
acquireLease: vi.fn().mockResolvedValue(taskRecord),
|
|
143
|
+
getTask: vi.fn().mockImplementation((id) => {
|
|
144
|
+
if (id === ROUTER_TASK_ID)
|
|
145
|
+
return Promise.resolve(taskRecord);
|
|
146
|
+
if (id === ROOTCAUSE_TASK_ID)
|
|
147
|
+
return Promise.resolve(makeRootCauseTask());
|
|
148
|
+
if (id === DISTILLER_TASK_ID)
|
|
149
|
+
return Promise.resolve(makeDistillerTask());
|
|
150
|
+
return Promise.resolve(undefined);
|
|
151
|
+
}),
|
|
152
|
+
getRunsByTask: vi.fn().mockResolvedValue([{ runId: RUN_ID, taskId: ROUTER_TASK_ID }]),
|
|
153
|
+
getValidRunsByTaskTolerant: vi.fn().mockResolvedValue({
|
|
154
|
+
runs: [{ runId: RUN_ID, taskId: ROUTER_TASK_ID }],
|
|
155
|
+
degradedRuns: [],
|
|
156
|
+
}),
|
|
157
|
+
updateRunOutput: vi.fn().mockResolvedValue(undefined),
|
|
158
|
+
markTaskSucceeded: vi.fn().mockResolvedValue(undefined),
|
|
159
|
+
markTaskFailed: vi.fn().mockResolvedValue(undefined),
|
|
160
|
+
markTaskRetryWait: vi.fn().mockResolvedValue(undefined),
|
|
161
|
+
getRetryPolicy: vi.fn().mockReturnValue({ shouldRetry: () => false }),
|
|
162
|
+
};
|
|
163
|
+
const runHandle = { runId: RUN_ID, runtimeKind: RUNTIME_KIND, startedAt: new Date().toISOString() };
|
|
164
|
+
const succeededStatus = { status: 'succeeded', runId: RUN_ID };
|
|
165
|
+
const _runtimeAdapter = {
|
|
166
|
+
kind: vi.fn().mockReturnValue(RUNTIME_KIND),
|
|
167
|
+
getCapabilities: vi.fn(),
|
|
168
|
+
healthCheck: vi.fn(),
|
|
169
|
+
startRun: vi.fn().mockResolvedValue(runHandle),
|
|
170
|
+
pollRun: vi.fn().mockResolvedValue(succeededStatus),
|
|
171
|
+
fetchOutput: vi.fn().mockResolvedValue({ payload: routerOutput }),
|
|
172
|
+
cancelRun: vi.fn().mockResolvedValue(undefined),
|
|
173
|
+
fetchArtifacts: vi.fn(),
|
|
174
|
+
};
|
|
175
|
+
const commitResult = {
|
|
176
|
+
commitId: 'commit-001',
|
|
177
|
+
artifactId: 'art-001',
|
|
178
|
+
candidateCount: 1,
|
|
179
|
+
};
|
|
180
|
+
const _committer = {
|
|
181
|
+
commit: vi.fn().mockResolvedValue(commitResult),
|
|
182
|
+
};
|
|
183
|
+
const _eventEmitter = {
|
|
184
|
+
emitTelemetry: vi.fn(),
|
|
185
|
+
on: vi.fn(),
|
|
186
|
+
emit: vi.fn(),
|
|
187
|
+
};
|
|
188
|
+
const artifactStore = new MemoryPIArtifactStore();
|
|
189
|
+
populatePredecessorArtifacts(artifactStore, rootCauseOutput);
|
|
190
|
+
return {
|
|
191
|
+
stateManager: _stateManager,
|
|
192
|
+
runtimeAdapter: _runtimeAdapter,
|
|
193
|
+
eventEmitter: _eventEmitter,
|
|
194
|
+
artifactStore,
|
|
195
|
+
committer: _committer,
|
|
196
|
+
_stateManager,
|
|
197
|
+
_runtimeAdapter,
|
|
198
|
+
_committer,
|
|
199
|
+
_eventEmitter,
|
|
200
|
+
...overrides,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
function telemetryEventType(call) {
|
|
204
|
+
const event = call[0];
|
|
205
|
+
return event?.eventType;
|
|
206
|
+
}
|
|
207
|
+
function telemetryPayload(call) {
|
|
208
|
+
const event = call[0];
|
|
209
|
+
return event?.payload;
|
|
210
|
+
}
|
|
211
|
+
// ── Tests ────────────────────────────────────────────────────────────────────
|
|
212
|
+
describe('DiagRouterRunner — PRI-468 Stage C intentTension passthrough', () => {
|
|
213
|
+
it('Stage A has intentTension → Stage C passes it through', async () => {
|
|
214
|
+
const rootCause = makeRootCauseOutput(VALID_INTENT_TENSION);
|
|
215
|
+
const routerOut = makeRouterOutput(); // LLM did NOT produce intentTension
|
|
216
|
+
const deps = createMockDeps(rootCause, routerOut);
|
|
217
|
+
const runner = new DiagRouterRunner(deps, {
|
|
218
|
+
owner: OWNER,
|
|
219
|
+
runtimeKind: RUNTIME_KIND,
|
|
220
|
+
pollIntervalMs: 10,
|
|
221
|
+
timeoutMs: 1000,
|
|
222
|
+
});
|
|
223
|
+
const result = await runner.run(ROUTER_TASK_ID);
|
|
224
|
+
expect(result.status).toBe('succeeded');
|
|
225
|
+
// Verify the committed output has intentTension from Stage A
|
|
226
|
+
const commitMock = deps._committer.commit;
|
|
227
|
+
if (!commitMock)
|
|
228
|
+
throw new Error('commit mock not configured');
|
|
229
|
+
const [commitCall] = commitMock.mock.calls;
|
|
230
|
+
const committedOutput = commitCall?.[0]?.output;
|
|
231
|
+
expect(committedOutput.intentTension).toBeDefined();
|
|
232
|
+
expect(committedOutput.intentTension).toEqual(VALID_INTENT_TENSION);
|
|
233
|
+
});
|
|
234
|
+
it('Stage A has NO intentTension → Stage C does NOT generate one', async () => {
|
|
235
|
+
const rootCause = makeRootCauseOutput(); // No intentTension
|
|
236
|
+
const routerOut = makeRouterOutput(); // LLM also did not produce one
|
|
237
|
+
const deps = createMockDeps(rootCause, routerOut);
|
|
238
|
+
const runner = new DiagRouterRunner(deps, {
|
|
239
|
+
owner: OWNER,
|
|
240
|
+
runtimeKind: RUNTIME_KIND,
|
|
241
|
+
pollIntervalMs: 10,
|
|
242
|
+
timeoutMs: 1000,
|
|
243
|
+
});
|
|
244
|
+
const result = await runner.run(ROUTER_TASK_ID);
|
|
245
|
+
expect(result.status).toBe('succeeded');
|
|
246
|
+
// Verify the committed output does NOT have intentTension
|
|
247
|
+
const commitMock = deps._committer.commit;
|
|
248
|
+
if (!commitMock)
|
|
249
|
+
throw new Error('commit mock not configured');
|
|
250
|
+
const [commitCall] = commitMock.mock.calls;
|
|
251
|
+
const committedOutput = commitCall?.[0]?.output;
|
|
252
|
+
expect(committedOutput.intentTension).toBeUndefined();
|
|
253
|
+
});
|
|
254
|
+
it('Stage A has NO intentTension + LLM hallucinated one → Stage C strips it with telemetry', async () => {
|
|
255
|
+
const rootCause = makeRootCauseOutput(); // No intentTension
|
|
256
|
+
// LLM hallucinated an intentTension
|
|
257
|
+
const hallucinatedTension = {
|
|
258
|
+
source: 'healthy_tension',
|
|
259
|
+
evidenceStrength: 'weak',
|
|
260
|
+
relatedIntentFields: ['why'],
|
|
261
|
+
evidence: ['fake evidence'],
|
|
262
|
+
explanation: 'hallucinated',
|
|
263
|
+
suggestedOwnerAction: 'dismiss',
|
|
264
|
+
};
|
|
265
|
+
const routerOut = makeRouterOutput(hallucinatedTension);
|
|
266
|
+
const deps = createMockDeps(rootCause, routerOut);
|
|
267
|
+
const runner = new DiagRouterRunner(deps, {
|
|
268
|
+
owner: OWNER,
|
|
269
|
+
runtimeKind: RUNTIME_KIND,
|
|
270
|
+
pollIntervalMs: 10,
|
|
271
|
+
timeoutMs: 1000,
|
|
272
|
+
});
|
|
273
|
+
const result = await runner.run(ROUTER_TASK_ID);
|
|
274
|
+
expect(result.status).toBe('succeeded');
|
|
275
|
+
// Verify the committed output does NOT have intentTension (stripped)
|
|
276
|
+
const commitMock = deps._committer.commit;
|
|
277
|
+
if (!commitMock)
|
|
278
|
+
throw new Error('commit mock not configured');
|
|
279
|
+
const [commitCall] = commitMock.mock.calls;
|
|
280
|
+
const committedOutput = commitCall?.[0]?.output;
|
|
281
|
+
expect(committedOutput.intentTension).toBeUndefined();
|
|
282
|
+
// Verify telemetry was emitted for the strip (EP-03 / ERR-002: observable)
|
|
283
|
+
const telemetryCalls = deps._eventEmitter.emitTelemetry.mock.calls.filter((call) => telemetryEventType(call) === 'diag_router_invariant_override');
|
|
284
|
+
const intentTensionCall = telemetryCalls.find((call) => telemetryPayload(call)?.field === 'intentTension');
|
|
285
|
+
expect(intentTensionCall).toBeDefined();
|
|
286
|
+
if (!intentTensionCall)
|
|
287
|
+
return; // type narrowing after assertion
|
|
288
|
+
const payload = telemetryPayload(intentTensionCall);
|
|
289
|
+
expect(payload?.field).toBe('intentTension');
|
|
290
|
+
expect(payload?.reason).toContain('stripped');
|
|
291
|
+
});
|
|
292
|
+
it('Stage A has intentTension + LLM also produced one → Stage A wins (source of truth)', async () => {
|
|
293
|
+
const rootCause = makeRootCauseOutput(VALID_INTENT_TENSION);
|
|
294
|
+
// LLM produced a DIFFERENT intentTension
|
|
295
|
+
const llmTension = {
|
|
296
|
+
source: 'none',
|
|
297
|
+
evidenceStrength: 'weak',
|
|
298
|
+
relatedIntentFields: ['why'],
|
|
299
|
+
evidence: ['llm evidence'],
|
|
300
|
+
explanation: 'llm explanation',
|
|
301
|
+
suggestedOwnerAction: 'observe',
|
|
302
|
+
};
|
|
303
|
+
const routerOut = makeRouterOutput(llmTension);
|
|
304
|
+
const deps = createMockDeps(rootCause, routerOut);
|
|
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
|
+
// Verify the committed output has Stage A's intentTension (not LLM's)
|
|
314
|
+
const commitMock = deps._committer.commit;
|
|
315
|
+
if (!commitMock)
|
|
316
|
+
throw new Error('commit mock not configured');
|
|
317
|
+
const [commitCall] = commitMock.mock.calls;
|
|
318
|
+
const committedOutput = commitCall?.[0]?.output;
|
|
319
|
+
expect(committedOutput.intentTension).toEqual(VALID_INTENT_TENSION);
|
|
320
|
+
expect(committedOutput.intentTension).not.toEqual(llmTension);
|
|
321
|
+
// Verify telemetry was emitted for the override (filter to intentTension field —
|
|
322
|
+
// `evidence` is always overridden in postFetchTransform, so find() would match it first)
|
|
323
|
+
const telemetryCalls = deps._eventEmitter.emitTelemetry.mock.calls.filter((call) => telemetryEventType(call) === 'diag_router_invariant_override');
|
|
324
|
+
const intentTensionCall = telemetryCalls.find((call) => telemetryPayload(call)?.field === 'intentTension');
|
|
325
|
+
expect(intentTensionCall).toBeDefined();
|
|
326
|
+
if (!intentTensionCall)
|
|
327
|
+
return; // type narrowing after assertion
|
|
328
|
+
const payload = telemetryPayload(intentTensionCall);
|
|
329
|
+
expect(payload?.field).toBe('intentTension');
|
|
330
|
+
expect(payload?.reason).toContain('overridden');
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
//# sourceMappingURL=diag-router-intent-tension.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diag-router-intent-tension.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent-tension-cases.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/intent-tension-cases.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A/B Evaluation Cases fixtures test (SPEC §23.5–§23.8).
|
|
3
|
+
*
|
|
4
|
+
* Validates the offline evaluation dataset:
|
|
5
|
+
* - 10 total cases (4 positive + 4 negative + 2 intent_suspect)
|
|
6
|
+
* - Positive cases: source ∈ {action_drift, healthy_tension}, strength ≥ moderate
|
|
7
|
+
* - Negative cases: no intentTension expected (null)
|
|
8
|
+
* - intent_suspect cases: source = intent_suspect, action = revise_intent
|
|
9
|
+
* - All expected intentTension values pass the IntentTensionSchema
|
|
10
|
+
* - No case carries a `confidence` field (SPEC §16.3)
|
|
11
|
+
*
|
|
12
|
+
* ERR entries considered:
|
|
13
|
+
* - EP-01 / ERR-001: fixtures validated against TypeBox schema at runtime
|
|
14
|
+
* - EP-02 / ERR-009: composition counts asserted fail-loud
|
|
15
|
+
* - EP-03 / ERR-002: negative cases explicitly assert null (no silent skip)
|
|
16
|
+
*/
|
|
17
|
+
import { describe, it, expect } from 'vitest';
|
|
18
|
+
import { Value } from '@sinclair/typebox/value';
|
|
19
|
+
import { IntentTensionSchema } from '../../diagnostician/diag-rootcause-output.js';
|
|
20
|
+
import { INTENT_TENSION_CASES, INTENT_TENSION_CASE_COUNTS, } from './__fixtures__/intent-tension-cases.js';
|
|
21
|
+
describe('IntentTension A/B evaluation cases (SPEC §23.5)', () => {
|
|
22
|
+
it('has the required composition: 4 positive + 4 negative + 2 intent_suspect = 10', () => {
|
|
23
|
+
expect(INTENT_TENSION_CASE_COUNTS.total).toBe(10);
|
|
24
|
+
expect(INTENT_TENSION_CASE_COUNTS.positive).toBe(4);
|
|
25
|
+
expect(INTENT_TENSION_CASE_COUNTS.negative).toBe(4);
|
|
26
|
+
expect(INTENT_TENSION_CASE_COUNTS.intent_suspect).toBe(2);
|
|
27
|
+
});
|
|
28
|
+
it('every case id is unique', () => {
|
|
29
|
+
const ids = INTENT_TENSION_CASES.map((c) => c.id);
|
|
30
|
+
expect(new Set(ids).size).toBe(ids.length);
|
|
31
|
+
});
|
|
32
|
+
it('every flag-off diagnosis has intentTension === undefined (SPEC §3: no new output when flag off)', () => {
|
|
33
|
+
for (const c of INTENT_TENSION_CASES) {
|
|
34
|
+
expect(c.flagOffDiagnosis.intentTension).toBeUndefined();
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
describe('positive cases (§23.6)', () => {
|
|
38
|
+
const positives = INTENT_TENSION_CASES.filter((c) => c.category === 'positive');
|
|
39
|
+
it('all have expected intentTension (not null)', () => {
|
|
40
|
+
for (const c of positives) {
|
|
41
|
+
expect(c.flagOnExpectedIntentTension, `case ${c.id}`).not.toBeNull();
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
it('source is action_drift or healthy_tension', () => {
|
|
45
|
+
for (const c of positives) {
|
|
46
|
+
const src = c.flagOnExpectedIntentTension?.source;
|
|
47
|
+
expect(src, `case ${c.id}`).toMatch(/^(action_drift|healthy_tension)$/);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
it('evidenceStrength is at least moderate', () => {
|
|
51
|
+
for (const c of positives) {
|
|
52
|
+
const strength = c.flagOnExpectedIntentTension?.evidenceStrength;
|
|
53
|
+
expect(strength, `case ${c.id}`).toMatch(/^(moderate|strong)$/);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
it('all expected intentTension values pass IntentTensionSchema', () => {
|
|
57
|
+
for (const c of positives) {
|
|
58
|
+
const tension = c.flagOnExpectedIntentTension;
|
|
59
|
+
expect(tension, `case ${c.id}`).toBeDefined();
|
|
60
|
+
if (!tension)
|
|
61
|
+
continue; // type narrowing after assertion
|
|
62
|
+
expect(Value.Check(IntentTensionSchema, tension), `case ${c.id}`).toBe(true);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe('negative cases (§23.7)', () => {
|
|
67
|
+
const negatives = INTENT_TENSION_CASES.filter((c) => c.category === 'negative');
|
|
68
|
+
it('all expect NO intentTension even with flag on (null)', () => {
|
|
69
|
+
for (const c of negatives) {
|
|
70
|
+
expect(c.flagOnExpectedIntentTension, `case ${c.id}`).toBeNull();
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
describe('intent_suspect cases (§23.8)', () => {
|
|
75
|
+
const suspects = INTENT_TENSION_CASES.filter((c) => c.category === 'intent_suspect');
|
|
76
|
+
it('all have source = intent_suspect', () => {
|
|
77
|
+
for (const c of suspects) {
|
|
78
|
+
expect(c.flagOnExpectedIntentTension?.source, `case ${c.id}`).toBe('intent_suspect');
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
it('all suggest revise_intent', () => {
|
|
82
|
+
for (const c of suspects) {
|
|
83
|
+
expect(c.flagOnExpectedIntentTension?.suggestedOwnerAction, `case ${c.id}`).toBe('revise_intent');
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
it('all expected intentTension values pass IntentTensionSchema', () => {
|
|
87
|
+
for (const c of suspects) {
|
|
88
|
+
const tension = c.flagOnExpectedIntentTension;
|
|
89
|
+
expect(tension, `case ${c.id}`).toBeDefined();
|
|
90
|
+
if (!tension)
|
|
91
|
+
continue; // type narrowing after assertion
|
|
92
|
+
expect(Value.Check(IntentTensionSchema, tension), `case ${c.id}`).toBe(true);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
it('no expected intentTension carries a `confidence` field (SPEC §16.3)', () => {
|
|
97
|
+
for (const c of INTENT_TENSION_CASES) {
|
|
98
|
+
const tension = c.flagOnExpectedIntentTension;
|
|
99
|
+
if (tension === null)
|
|
100
|
+
continue;
|
|
101
|
+
expect(Object.hasOwn(tension, 'confidence'), `case ${c.id} must not carry confidence`).toBe(false);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
it('all non-null expected intentTension values pass the schema (cross-cut)', () => {
|
|
105
|
+
for (const c of INTENT_TENSION_CASES) {
|
|
106
|
+
const tension = c.flagOnExpectedIntentTension;
|
|
107
|
+
if (tension === null)
|
|
108
|
+
continue;
|
|
109
|
+
expect(Value.Check(IntentTensionSchema, tension), `case ${c.id}`).toBe(true);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=intent-tension-cases.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent-tension-cases.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/intent-tension-cases.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,7 @@ import type { DiagnosticianContextPayload } from '../context-payload.js';
|
|
|
25
25
|
import type { ContextAssembler } from '../store/context/context-assembler.js';
|
|
26
26
|
import type { TaskRecord } from '../task-status.js';
|
|
27
27
|
import type { EffectivePdConfig } from '../config/pd-config-types.js';
|
|
28
|
+
import type { IntentDocReader } from '../intent/intent-doc-reader-port.js';
|
|
28
29
|
import { type PDErrorCategory } from '../error-categories.js';
|
|
29
30
|
import { BasePeerRunner } from '../runner/base-peer-runner.js';
|
|
30
31
|
import type { PeerRunnerOptions, PeerRunnerDeps, PeerRunnerResult, PeerRunnerValidationResult } from '../runner/peer-runner-types.js';
|
|
@@ -37,6 +38,17 @@ interface DiagRootCauseContext {
|
|
|
37
38
|
export interface DiagRootCauseRunnerDeps extends PeerRunnerDeps {
|
|
38
39
|
readonly validator: DiagRootCauseValidator;
|
|
39
40
|
readonly contextAssembler: ContextAssembler;
|
|
41
|
+
/**
|
|
42
|
+
* PRI-468: Optional INTENT.md reader for Stage A intent tension check.
|
|
43
|
+
*
|
|
44
|
+
* When provided AND `intent_engineering` flag is on, the runner reads
|
|
45
|
+
* INTENT.md and injects it into the Stage A prompt as reference context
|
|
46
|
+
* for the LLM to optionally produce `intentTension`.
|
|
47
|
+
*
|
|
48
|
+
* When absent or flag off, the runner behaves as before (byte-identical
|
|
49
|
+
* prompt — EP-03: no silent fallback).
|
|
50
|
+
*/
|
|
51
|
+
readonly intentDocReader?: IntentDocReader;
|
|
40
52
|
}
|
|
41
53
|
export interface DiagRootCauseRunnerOptions extends PeerRunnerOptions {
|
|
42
54
|
/** Effective PD config for feature flag resolution (PRI-371). */
|
|
@@ -55,6 +67,7 @@ export declare class DiagRootCauseRunner extends BasePeerRunner<DiagRootCauseCon
|
|
|
55
67
|
private readonly validator;
|
|
56
68
|
private readonly contextAssembler;
|
|
57
69
|
private readonly effectiveConfig?;
|
|
70
|
+
private readonly intentDocReader?;
|
|
58
71
|
constructor(deps: DiagRootCauseRunnerDeps, options: DiagRootCauseRunnerOptions);
|
|
59
72
|
get permanentErrorCategories(): ReadonlySet<PDErrorCategory>;
|
|
60
73
|
buildContext(taskId: string): Promise<DiagRootCauseContext>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diag-rootcause-runner.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/diag-rootcause-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AAC/G,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,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,WAAW,EAAE,2BAA2B,CAAC;CACnD;AAID,MAAM,WAAW,uBAAwB,SAAQ,cAAc;IAC7D,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3C,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"diag-rootcause-runner.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/diag-rootcause-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AAC/G,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC3E,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,WAAW,EAAE,2BAA2B,CAAC;CACnD;AAID,MAAM,WAAW,uBAAwB,SAAQ,cAAc;IAC7D,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3C,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C;;;;;;;;;OASG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,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,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAoB;IACrD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAkB;gBAEvC,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,0BAA0B;IAgB9E,IAAI,wBAAwB,IAAI,WAAW,CAAC,eAAe,CAAC,CAE3D;IAEK,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAyC3D,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,SAAS,CAAC;IA+DhF,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;;;;OAIG;cAEgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,GAAG,IAAI;cAIlE,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,QAAQ,EAAE,oBAAoB,GAAG,IAAI;CAM7H"}
|
|
@@ -39,6 +39,7 @@ export class DiagRootCauseRunner extends BasePeerRunner {
|
|
|
39
39
|
validator;
|
|
40
40
|
contextAssembler;
|
|
41
41
|
effectiveConfig;
|
|
42
|
+
intentDocReader;
|
|
42
43
|
constructor(deps, options) {
|
|
43
44
|
super(deps, options, {
|
|
44
45
|
runnerName: 'diag_rootcause',
|
|
@@ -49,6 +50,7 @@ export class DiagRootCauseRunner extends BasePeerRunner {
|
|
|
49
50
|
this.validator = deps.validator;
|
|
50
51
|
this.contextAssembler = deps.contextAssembler;
|
|
51
52
|
this.effectiveConfig = options.effectiveConfig;
|
|
53
|
+
this.intentDocReader = deps.intentDocReader;
|
|
52
54
|
}
|
|
53
55
|
// ── Abstract implementations ───────────────────────────────────────────────
|
|
54
56
|
// eslint-disable-next-line @typescript-eslint/class-methods-use-this
|
|
@@ -92,14 +94,54 @@ export class DiagRootCauseRunner extends BasePeerRunner {
|
|
|
92
94
|
async invokeRuntime(taskId, context) {
|
|
93
95
|
// T-E (PRI-371): Read diagnostician_core_grounding flag from effective config.
|
|
94
96
|
let coreGrounding = false;
|
|
97
|
+
// PRI-468: Read intent_engineering flag from effective config.
|
|
98
|
+
let intentGrounding = false;
|
|
95
99
|
if (this.effectiveConfig) {
|
|
96
100
|
const featureFlags = computeFeatureFlagsFromConfig(this.effectiveConfig);
|
|
97
101
|
coreGrounding = isFeatureEnabled(featureFlags, 'diagnostician_core_grounding');
|
|
102
|
+
intentGrounding = isFeatureEnabled(featureFlags, 'intent_engineering');
|
|
103
|
+
}
|
|
104
|
+
// PRI-468: When intent_engineering is on AND a reader is configured,
|
|
105
|
+
// attempt to read INTENT.md. On any degraded path (not_found, oversized,
|
|
106
|
+
// read_error, flag_disabled, or no reader configured), intentGrounding
|
|
107
|
+
// is downgraded to false and the prompt is byte-identical to the
|
|
108
|
+
// pre-PRI-468 prompt (EP-03 / ERR-002: graceful degradation with
|
|
109
|
+
// observable telemetry).
|
|
110
|
+
let intentDoc;
|
|
111
|
+
if (intentGrounding && !this.intentDocReader) {
|
|
112
|
+
// Flag on but no reader wired — downgrade silently (factory misconfiguration
|
|
113
|
+
// is not a per-task event; it's a startup-time issue). The prompt stays
|
|
114
|
+
// byte-identical to pre-PRI-468.
|
|
115
|
+
intentGrounding = false;
|
|
116
|
+
}
|
|
117
|
+
else if (intentGrounding && this.intentDocReader) {
|
|
118
|
+
const readResult = this.intentDocReader.readIntentDoc();
|
|
119
|
+
if (readResult.ok && readResult.doc) {
|
|
120
|
+
intentDoc = {
|
|
121
|
+
raw: readResult.doc.raw,
|
|
122
|
+
contentHash: readResult.doc.contentHash,
|
|
123
|
+
path: readResult.doc.path,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// EP-03 / ERR-002: degrade gracefully but observably.
|
|
128
|
+
// Flag stays on in config, but we do not inject INTENT — emit
|
|
129
|
+
// telemetry so the operator can see why INTENT was not injected.
|
|
130
|
+
this.emitEvent('intent_doc_read_failed', taskId, {
|
|
131
|
+
reason: readResult.reason ?? 'unknown',
|
|
132
|
+
nextAction: readResult.nextAction ?? 'Check INTENT.md configuration.',
|
|
133
|
+
flagEnabled: readResult.flagEnabled,
|
|
134
|
+
found: readResult.found,
|
|
135
|
+
});
|
|
136
|
+
intentGrounding = false;
|
|
137
|
+
}
|
|
98
138
|
}
|
|
99
139
|
const builder = new RootCausePromptBuilder();
|
|
100
140
|
const { message } = builder.buildPrompt(context.painPayload, {
|
|
101
141
|
outputLanguage: this.resolvedOptions.outputLanguage,
|
|
102
142
|
coreGrounding,
|
|
143
|
+
intentGrounding,
|
|
144
|
+
intentDoc,
|
|
103
145
|
});
|
|
104
146
|
return this.runtimeAdapter.startRun({
|
|
105
147
|
agentSpec: { agentId: this.resolvedOptions.agentId, schemaVersion: 'v1' },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diag-rootcause-runner.js","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/diag-rootcause-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;
|
|
1
|
+
{"version":3,"file":"diag-rootcause-runner.js","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/diag-rootcause-runner.ts"],"names":[],"mappings":"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"}
|