@principles/core 1.265.0 → 1.266.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__/pain-diagnosis-persistence.test.d.ts +2 -0
- package/dist/runtime-v2/__tests__/pain-diagnosis-persistence.test.d.ts.map +1 -0
- package/dist/runtime-v2/__tests__/pain-diagnosis-persistence.test.js +293 -0
- package/dist/runtime-v2/__tests__/pain-diagnosis-persistence.test.js.map +1 -0
- package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts +10 -0
- package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts.map +1 -1
- package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js +40 -4
- package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js.map +1 -1
- package/dist/runtime-v2/diagnostician-prompt-builder.d.ts +6 -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/feature-flags/__tests__/pain-diagnosis-persistence-flag.test.d.ts +2 -0
- package/dist/runtime-v2/feature-flags/__tests__/pain-diagnosis-persistence-flag.test.d.ts.map +1 -0
- package/dist/runtime-v2/feature-flags/__tests__/pain-diagnosis-persistence-flag.test.js +44 -0
- package/dist/runtime-v2/feature-flags/__tests__/pain-diagnosis-persistence-flag.test.js.map +1 -0
- package/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
- package/dist/runtime-v2/feature-flags/feature-flag-contract.js +10 -0
- package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
- package/dist/runtime-v2/index.d.ts +1 -0
- package/dist/runtime-v2/index.d.ts.map +1 -1
- package/dist/runtime-v2/index.js.map +1 -1
- package/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/diag-rootcause-runner.js +5 -0
- package/dist/runtime-v2/internalization/diag-rootcause-runner.js.map +1 -1
- package/dist/runtime-v2/pain-signal-bridge.d.ts +19 -0
- package/dist/runtime-v2/pain-signal-bridge.d.ts.map +1 -1
- package/dist/runtime-v2/pain-signal-bridge.js +61 -0
- package/dist/runtime-v2/pain-signal-bridge.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 +48 -2
- package/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
- package/dist/runtime-v2/store/pain-diagnosis/pain-diagnosis-store.d.ts +77 -0
- package/dist/runtime-v2/store/pain-diagnosis/pain-diagnosis-store.d.ts.map +1 -0
- package/dist/runtime-v2/store/pain-diagnosis/pain-diagnosis-store.js +40 -0
- package/dist/runtime-v2/store/pain-diagnosis/pain-diagnosis-store.js.map +1 -0
- package/dist/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.d.ts +9 -0
- package/dist/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.d.ts.map +1 -0
- package/dist/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.js +118 -0
- package/dist/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.js.map +1 -0
- package/dist/runtime-v2/store/runtime-state-manager.d.ts +11 -0
- package/dist/runtime-v2/store/runtime-state-manager.d.ts.map +1 -1
- package/dist/runtime-v2/store/runtime-state-manager.js +18 -0
- package/dist/runtime-v2/store/runtime-state-manager.js.map +1 -1
- package/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
- package/dist/runtime-v2/store/sqlite-connection.js +23 -0
- package/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
- package/dist/runtime-v2/types/event-types.d.ts +15 -0
- package/dist/runtime-v2/types/event-types.d.ts.map +1 -1
- package/dist/runtime-v2/types/event-types.js +5 -0
- package/dist/runtime-v2/types/event-types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pain-diagnosis-persistence.test.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/pain-diagnosis-persistence.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pain Diagnosis Persistence regression tests (Pain Diagnosis Persistence
|
|
3
|
+
* SPEC v1.1 §12).
|
|
4
|
+
*
|
|
5
|
+
* Coverage required by the SPEC:
|
|
6
|
+
* 1. Agent behavior failure → persisted diagnosis category People.
|
|
7
|
+
* 2. Environment failure → persisted diagnosis category Tooling.
|
|
8
|
+
* 3. Mixed failure → multiple diagnosis rows sharing one pain_id (no Mixed enum).
|
|
9
|
+
* 4. Principle pollution → a software-bug (Design/Tooling) diagnosis keeps its
|
|
10
|
+
* true category and cannot masquerade as an agent-behavior (People) narrative;
|
|
11
|
+
* the Stage A prompt only allows People with agent-behavior evidence.
|
|
12
|
+
*
|
|
13
|
+
* Plus flag-contract behavior: default off writes nothing; replay is idempotent;
|
|
14
|
+
* unparseable rootCause prefixes and store failures degrade observably (rc-9).
|
|
15
|
+
*
|
|
16
|
+
* Persistence goes through a REAL RuntimeStateManager on a temp workspace, so
|
|
17
|
+
* the schema migration (pain_diagnoses) and the sqlite round-trip are exercised.
|
|
18
|
+
*/
|
|
19
|
+
import fs from 'node:fs';
|
|
20
|
+
import os from 'node:os';
|
|
21
|
+
import path from 'node:path';
|
|
22
|
+
import { afterAll, describe, expect, it } from 'vitest';
|
|
23
|
+
import { PainSignalBridge } from '../pain-signal-bridge.js';
|
|
24
|
+
import { RuntimeStateManager as RuntimeStateManagerClass } from '../store/runtime-state-manager.js';
|
|
25
|
+
import { SqliteConnection } from '../store/sqlite-connection.js';
|
|
26
|
+
import { buildRootCauseProtocolInstruction } from '../diagnostician/rootcause-prompt-builder.js';
|
|
27
|
+
import { mapBridgeTelemetryToStoreEvent } from '../pain-signal-runtime-factory.js';
|
|
28
|
+
// ── Fixtures ─────────────────────────────────────────────────────────────────
|
|
29
|
+
const workspaces = [];
|
|
30
|
+
const managers = [];
|
|
31
|
+
async function makeStateManager() {
|
|
32
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-pain-diag-'));
|
|
33
|
+
workspaces.push(dir);
|
|
34
|
+
const mgr = new RuntimeStateManagerClass({ workspaceDir: dir });
|
|
35
|
+
await mgr.initialize();
|
|
36
|
+
managers.push(mgr);
|
|
37
|
+
return mgr;
|
|
38
|
+
}
|
|
39
|
+
afterAll(async () => {
|
|
40
|
+
for (const mgr of managers.splice(0)) {
|
|
41
|
+
try {
|
|
42
|
+
await mgr.close();
|
|
43
|
+
}
|
|
44
|
+
catch { /* best-effort cleanup */ }
|
|
45
|
+
}
|
|
46
|
+
for (const dir of workspaces.splice(0)) {
|
|
47
|
+
fs.rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 20 });
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
function makeOutput(rootCause, over = {}) {
|
|
51
|
+
return {
|
|
52
|
+
valid: true,
|
|
53
|
+
diagnosisId: 'diag-001',
|
|
54
|
+
summary: 'test diagnosis summary',
|
|
55
|
+
rootCause,
|
|
56
|
+
violatedPrinciples: [],
|
|
57
|
+
evidence: [{ sourceRef: 'tool_calls:1', note: 'agent action evidence' }],
|
|
58
|
+
recommendations: [{ kind: 'defer', description: 'no actionable principle' }],
|
|
59
|
+
confidence: 0.7,
|
|
60
|
+
...over,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function makeBridge(stateManager, opts) {
|
|
64
|
+
const ledgerAdapter = {
|
|
65
|
+
existsForCandidate: () => null,
|
|
66
|
+
writeProbationEntry: undefined,
|
|
67
|
+
};
|
|
68
|
+
return new PainSignalBridge({
|
|
69
|
+
stateManager,
|
|
70
|
+
runner: {
|
|
71
|
+
run: async (taskId) => ({ status: 'succeeded', taskId, attemptCount: 1 }),
|
|
72
|
+
},
|
|
73
|
+
intakeService: undefined,
|
|
74
|
+
ledgerAdapter,
|
|
75
|
+
autoIntakeEnabled: false,
|
|
76
|
+
diagnosisPersistenceEnabled: opts.persistenceEnabled,
|
|
77
|
+
eventEmitter: {
|
|
78
|
+
emitTelemetry: (event) => { opts.events.push({ eventType: event.eventType, payload: event.payload }); },
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
async function completeDiagnosis(bridge, opts) {
|
|
83
|
+
return bridge.onDiagnosisComplete({
|
|
84
|
+
taskId: opts.taskId,
|
|
85
|
+
diagnosticianOutput: opts.output,
|
|
86
|
+
painId: opts.painId,
|
|
87
|
+
provenance: 'automatic_hook',
|
|
88
|
+
inputEvidenceCount: 1,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
// ── SPEC §12: Agent Failure → People ────────────────────────────────────────
|
|
92
|
+
describe('pain diagnosis persistence (SPEC v1.1 §12 regression)', () => {
|
|
93
|
+
it('agent behavior failure (changed code without testing) persists category People', async () => {
|
|
94
|
+
const mgr = await makeStateManager();
|
|
95
|
+
const events = [];
|
|
96
|
+
const bridge = makeBridge(mgr, { persistenceEnabled: true, events });
|
|
97
|
+
await completeDiagnosis(bridge, {
|
|
98
|
+
painId: 'pain-agent-001',
|
|
99
|
+
taskId: 'diagnosis_pain-agent-001',
|
|
100
|
+
output: makeOutput('People: Agent modified code without running the tests first'),
|
|
101
|
+
});
|
|
102
|
+
const rows = await mgr.getDiagnosesByPainId('pain-agent-001');
|
|
103
|
+
expect(rows).toHaveLength(1);
|
|
104
|
+
expect(rows[0]?.category).toBe('People');
|
|
105
|
+
expect(rows[0]?.rootCause).toBe('People: Agent modified code without running the tests first');
|
|
106
|
+
expect(rows[0]?.diagnosisId).toBe('diag-001');
|
|
107
|
+
expect(rows[0]?.evidence).toEqual([{ sourceRef: 'tool_calls:1', note: 'agent action evidence' }]);
|
|
108
|
+
expect(rows[0]?.confidence).toBe(0.7);
|
|
109
|
+
expect(rows[0]?.artifactId).toBeNull();
|
|
110
|
+
expect(typeof rows[0]?.createdAt).toBe('string');
|
|
111
|
+
});
|
|
112
|
+
// ── SPEC §12: Environment Failure → Tooling ──────────────────────────────
|
|
113
|
+
it('environment failure (third-party API outage) persists category Tooling', async () => {
|
|
114
|
+
const mgr = await makeStateManager();
|
|
115
|
+
const bridge = makeBridge(mgr, { persistenceEnabled: true, events: [] });
|
|
116
|
+
await completeDiagnosis(bridge, {
|
|
117
|
+
painId: 'pain-env-001',
|
|
118
|
+
taskId: 'diagnosis_pain-env-001',
|
|
119
|
+
output: makeOutput('Tooling: third-party API returned 503 for every retry'),
|
|
120
|
+
});
|
|
121
|
+
const rows = await mgr.getDiagnosesByPainId('pain-env-001');
|
|
122
|
+
expect(rows).toHaveLength(1);
|
|
123
|
+
expect(rows[0]?.category).toBe('Tooling');
|
|
124
|
+
});
|
|
125
|
+
// ── SPEC §12: Mixed Failure → multiple rows per pain_id ──────────────────
|
|
126
|
+
it('mixed failure persists multiple diagnosis rows under one pain_id (no Mixed enum)', async () => {
|
|
127
|
+
const mgr = await makeStateManager();
|
|
128
|
+
const bridge = makeBridge(mgr, { persistenceEnabled: true, events: [] });
|
|
129
|
+
const painId = 'pain-mixed-001';
|
|
130
|
+
await completeDiagnosis(bridge, {
|
|
131
|
+
painId,
|
|
132
|
+
taskId: 'diagnosis_pain-mixed-001',
|
|
133
|
+
output: makeOutput('Tooling: unstable third-party API', { diagnosisId: 'diag-tooling' }),
|
|
134
|
+
});
|
|
135
|
+
await completeDiagnosis(bridge, {
|
|
136
|
+
painId,
|
|
137
|
+
taskId: 'diagnosis_pain-mixed-001-r2',
|
|
138
|
+
output: makeOutput('People: Agent added no fallback despite prior API instability', { diagnosisId: 'diag-people' }),
|
|
139
|
+
});
|
|
140
|
+
const rows = await mgr.getDiagnosesByPainId(painId);
|
|
141
|
+
expect(rows).toHaveLength(2);
|
|
142
|
+
// Same-millisecond writes make created_at tie-break on id — assert the
|
|
143
|
+
// category SET, order is not part of the contract.
|
|
144
|
+
expect([...rows.map((r) => r.category)].sort()).toEqual(['People', 'Tooling']);
|
|
145
|
+
expect(new Set(rows.map((r) => r.painId))).toEqual(new Set([painId]));
|
|
146
|
+
});
|
|
147
|
+
it('replaying the same diagnosis completion is idempotent', async () => {
|
|
148
|
+
const mgr = await makeStateManager();
|
|
149
|
+
const bridge = makeBridge(mgr, { persistenceEnabled: true, events: [] });
|
|
150
|
+
const call = {
|
|
151
|
+
painId: 'pain-replay-001',
|
|
152
|
+
taskId: 'diagnosis_pain-replay-001',
|
|
153
|
+
output: makeOutput('Design: missing validation gate'),
|
|
154
|
+
};
|
|
155
|
+
await completeDiagnosis(bridge, call);
|
|
156
|
+
await completeDiagnosis(bridge, call);
|
|
157
|
+
const rows = await mgr.getDiagnosesByPainId('pain-replay-001');
|
|
158
|
+
expect(rows).toHaveLength(1);
|
|
159
|
+
});
|
|
160
|
+
// ── SPEC §12: Principle Pollution ────────────────────────────────────────
|
|
161
|
+
it('software-bug diagnosis keeps its Design category — attribution cannot drift to People', async () => {
|
|
162
|
+
const mgr = await makeStateManager();
|
|
163
|
+
const bridge = makeBridge(mgr, { persistenceEnabled: true, events: [] });
|
|
164
|
+
// A bug in PD itself, which the agent legitimately worked around: the
|
|
165
|
+
// persisted attribution must remain Design so a future agent Principle
|
|
166
|
+
// cannot be justified by re-reading this pain's history as "agent error".
|
|
167
|
+
await completeDiagnosis(bridge, {
|
|
168
|
+
painId: 'pain-pollution-001',
|
|
169
|
+
taskId: 'diagnosis_pain-pollution-001',
|
|
170
|
+
output: makeOutput('Design: PD failed to close the DB handle before renaming the workspace', { confidence: 0.9 }),
|
|
171
|
+
});
|
|
172
|
+
const rows = await mgr.getDiagnosesByPainId('pain-pollution-001');
|
|
173
|
+
expect(rows).toHaveLength(1);
|
|
174
|
+
expect(rows[0]?.category).toBe('Design');
|
|
175
|
+
expect(rows[0]?.rootCause).not.toMatch(/^People:/);
|
|
176
|
+
});
|
|
177
|
+
it('prompt requires agent-behavior evidence for People — failure is not automatically an agent error', () => {
|
|
178
|
+
const prompt = buildRootCauseProtocolInstruction({ evidenceFirstAttribution: true });
|
|
179
|
+
expect(prompt).toContain('Evidence First Attribution');
|
|
180
|
+
expect(prompt).toContain('A failure event is NOT automatically an agent error');
|
|
181
|
+
expect(prompt).toContain('Never classify as People without evidence of an avoidable agent action');
|
|
182
|
+
// SPEC §6: the five People-leaning behaviors are stated explicitly.
|
|
183
|
+
expect(prompt).toContain('without investigating');
|
|
184
|
+
expect(prompt).toContain('skipped verification or testing');
|
|
185
|
+
expect(prompt).toContain('ignored an already-active principle');
|
|
186
|
+
expect(prompt).toContain('high-risk action without checking');
|
|
187
|
+
expect(prompt).toContain('repeated the same class of error');
|
|
188
|
+
});
|
|
189
|
+
it('prompt is byte-identical when the flag is off (default) — no attribution semantics ship by default', () => {
|
|
190
|
+
const off = buildRootCauseProtocolInstruction();
|
|
191
|
+
expect(off).toBe(buildRootCauseProtocolInstruction({ evidenceFirstAttribution: false }));
|
|
192
|
+
expect(off).not.toContain('Evidence First Attribution');
|
|
193
|
+
expect(off).not.toContain('automatically an agent error');
|
|
194
|
+
});
|
|
195
|
+
// ── Flag default / degradation contract ───────────────────────────────────
|
|
196
|
+
it('flag off (default) writes no diagnosis rows', async () => {
|
|
197
|
+
const mgr = await makeStateManager();
|
|
198
|
+
const bridge = makeBridge(mgr, { persistenceEnabled: false, events: [] });
|
|
199
|
+
await completeDiagnosis(bridge, {
|
|
200
|
+
painId: 'pain-off-001',
|
|
201
|
+
taskId: 'diagnosis_pain-off-001',
|
|
202
|
+
output: makeOutput('People: Agent modified code without running the tests first'),
|
|
203
|
+
});
|
|
204
|
+
expect(await mgr.getDiagnosesByPainId('pain-off-001')).toHaveLength(0);
|
|
205
|
+
});
|
|
206
|
+
it('unparseable rootCause prefix skips the write observably (rc-9)', async () => {
|
|
207
|
+
const mgr = await makeStateManager();
|
|
208
|
+
const events = [];
|
|
209
|
+
const bridge = makeBridge(mgr, { persistenceEnabled: true, events });
|
|
210
|
+
await completeDiagnosis(bridge, {
|
|
211
|
+
painId: 'pain-noprefix-001',
|
|
212
|
+
taskId: 'diagnosis_pain-noprefix-001',
|
|
213
|
+
output: makeOutput('Something went wrong with no category prefix'),
|
|
214
|
+
});
|
|
215
|
+
expect(await mgr.getDiagnosesByPainId('pain-noprefix-001')).toHaveLength(0);
|
|
216
|
+
const skipped = events.filter((e) => e.eventType === 'pain_diagnosis_persist_skipped');
|
|
217
|
+
expect(skipped).toHaveLength(1);
|
|
218
|
+
expect(skipped[0]?.payload.reason).toBe('unparseable_root_cause_prefix');
|
|
219
|
+
expect(typeof skipped[0]?.payload.nextAction).toBe('string');
|
|
220
|
+
});
|
|
221
|
+
it('store failure degrades observably and does not break the admission flow', async () => {
|
|
222
|
+
const mgr = await makeStateManager();
|
|
223
|
+
const events = [];
|
|
224
|
+
const failing = Object.assign(Object.create(Object.getPrototypeOf(mgr)), mgr, {
|
|
225
|
+
recordPainDiagnosis: async () => { throw new Error('injected store failure'); },
|
|
226
|
+
});
|
|
227
|
+
const bridge = makeBridge(failing, { persistenceEnabled: true, events });
|
|
228
|
+
await expect(completeDiagnosis(bridge, {
|
|
229
|
+
painId: 'pain-storefail-001',
|
|
230
|
+
taskId: 'diagnosis_pain-storefail-001',
|
|
231
|
+
output: makeOutput('Tooling: store unavailable'),
|
|
232
|
+
})).resolves.toBeDefined();
|
|
233
|
+
const failed = events.filter((e) => e.eventType === 'pain_diagnosis_persist_failed');
|
|
234
|
+
expect(failed).toHaveLength(1);
|
|
235
|
+
expect(String(failed[0]?.payload.reason)).toContain('injected store failure');
|
|
236
|
+
expect(typeof failed[0]?.payload.nextAction).toBe('string');
|
|
237
|
+
});
|
|
238
|
+
// ── Schema migration ──────────────────────────────────────────────────────
|
|
239
|
+
it('existing state.db gains the pain_diagnoses table on next open', async () => {
|
|
240
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-pain-diag-mig-'));
|
|
241
|
+
workspaces.push(dir);
|
|
242
|
+
const first = new SqliteConnection(dir);
|
|
243
|
+
const db = first.getDb();
|
|
244
|
+
expect(db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='pain_diagnoses'").get()).toBeDefined();
|
|
245
|
+
// Simulate a pre-feature database by dropping the table, then reopen.
|
|
246
|
+
db.prepare('DROP TABLE pain_diagnoses').run();
|
|
247
|
+
first.close();
|
|
248
|
+
const second = new SqliteConnection(dir);
|
|
249
|
+
const db2 = second.getDb();
|
|
250
|
+
expect(db2.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='pain_diagnoses'").get()).toBeDefined();
|
|
251
|
+
second.close();
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
// ── Factory telemetry wiring ─────────────────────────────────────────────────
|
|
255
|
+
describe('pain diagnosis persistence — factory telemetry forwarding', () => {
|
|
256
|
+
// The production factory (createPainSignalBridge) is the ONLY place the
|
|
257
|
+
// bridge gets an eventEmitter. Before this feature, no emitter was wired,
|
|
258
|
+
// so the bridge's pre-existing event sites (candidate_admission_decision,
|
|
259
|
+
// candidate_dreamer_task_seeded, …) were dormant. Wiring the emitter must
|
|
260
|
+
// not wake them up as degradation_triggered — routine admission decisions
|
|
261
|
+
// are not degradations, and flag-off behavior must stay identical to main.
|
|
262
|
+
it('maps persistence degradation events onto degradation_triggered with originalEventType preserved', () => {
|
|
263
|
+
const mapped = mapBridgeTelemetryToStoreEvent({
|
|
264
|
+
eventType: 'pain_diagnosis_persist_failed',
|
|
265
|
+
traceId: 'pain-1',
|
|
266
|
+
timestamp: '2026-08-24T00:00:00.000Z',
|
|
267
|
+
payload: { reason: 'boom', nextAction: 'inspect' },
|
|
268
|
+
});
|
|
269
|
+
expect(mapped).toEqual({
|
|
270
|
+
eventType: 'degradation_triggered',
|
|
271
|
+
traceId: 'pain-1',
|
|
272
|
+
timestamp: '2026-08-24T00:00:00.000Z',
|
|
273
|
+
sessionId: '',
|
|
274
|
+
payload: { component: 'PainSignalBridge', originalEventType: 'pain_diagnosis_persist_failed', reason: 'boom', nextAction: 'inspect' },
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
it('keeps pre-existing bridge events dormant — admission decisions are NOT degradation_triggered (negative control)', () => {
|
|
278
|
+
for (const eventType of [
|
|
279
|
+
'candidate_admission_decision',
|
|
280
|
+
'candidate_dreamer_task_seeded',
|
|
281
|
+
'candidate_dreamer_task_seed_failed',
|
|
282
|
+
'candidate_not_internalizable',
|
|
283
|
+
]) {
|
|
284
|
+
expect(mapBridgeTelemetryToStoreEvent({
|
|
285
|
+
eventType,
|
|
286
|
+
traceId: 'cand-1',
|
|
287
|
+
timestamp: '2026-08-24T00:00:00.000Z',
|
|
288
|
+
payload: { decision: 'accepted' },
|
|
289
|
+
})).toBeNull();
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
//# sourceMappingURL=pain-diagnosis-persistence.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pain-diagnosis-persistence.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/pain-diagnosis-persistence.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,6 +47,16 @@ export interface RootCausePromptBuilderOptions {
|
|
|
47
47
|
* byte-identical to the pre-PRI-468 prompt (EP-03: no silent fallback).
|
|
48
48
|
*/
|
|
49
49
|
intentGrounding?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Evidence First Attribution (Pain Diagnosis Persistence SPEC §2.2/§6,
|
|
52
|
+
* gated by the `pain_diagnosis_persistence` flag; default: false).
|
|
53
|
+
*
|
|
54
|
+
* When true, inserts attribution rules that constrain PHASE 3 classification
|
|
55
|
+
* to be evidence-driven (People only on agent-avoidable-behavior evidence,
|
|
56
|
+
* never as a default). When false/undefined, the prompt is byte-identical
|
|
57
|
+
* to the pre-feature prompt (EP-03: no silent fallback).
|
|
58
|
+
*/
|
|
59
|
+
evidenceFirstAttribution?: boolean;
|
|
50
60
|
}
|
|
51
61
|
/**
|
|
52
62
|
* Build the Stage A diagnostic protocol instruction (PHASE 1–3 + optional PHASE 3.5).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rootcause-prompt-builder.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/diagnostician/rootcause-prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG/E,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"rootcause-prompt-builder.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/diagnostician/rootcause-prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG/E,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,oCAAoC,CAAC;AA6F5C;;;;;;GAMG;AACH,MAAM,WAAW,6BAA6B;IAC5C,kEAAkE;IAClE,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,kFAAkF;IAClF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,+EAA+E;IAC/E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;;OAQG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,iCAAiC,CAC/C,IAAI,GAAE,6BAAkC,GACvC,MAAM,CA+ER;AAID;;;;;;;;;;GAUG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IAEjC,YAAY,IAAI,GAAE,6BAAkC,EAGnD;IAED;;;;;;;;OAQG;IACH,yBAAyB,CAAC,IAAI,GAAE,6BAAkC,GAAG,MAAM,CAS1E;IAED;;;;;;;;;;;OAWG;IACH,WAAW,CACT,OAAO,EAAE,2BAA2B,EACpC,IAAI,GAAE,kBAAuB,GAC5B,iBAAiB,CA6EnB;CACF"}
|
|
@@ -74,6 +74,36 @@ PD surfaces tension.
|
|
|
74
74
|
Owner decides value.
|
|
75
75
|
`;
|
|
76
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Build the Evidence First Attribution block (Pain Diagnosis Persistence SPEC §2.2/§6).
|
|
79
|
+
*
|
|
80
|
+
* When `evidenceFirstAttribution` is true, returns the attribution-rule text
|
|
81
|
+
* that constrains PHASE 3 classification to be evidence-driven: People only
|
|
82
|
+
* when the cited evidence shows agent-avoidable behavior, never as a default.
|
|
83
|
+
*
|
|
84
|
+
* When false/undefined, returns '' (empty string) so the assembled prompt is
|
|
85
|
+
* byte-identical to the pre-feature prompt (EP-03: no silent fallback).
|
|
86
|
+
*
|
|
87
|
+
* This is a pure function — no I/O, no side effects, never throws.
|
|
88
|
+
*/
|
|
89
|
+
function buildEvidenceFirstAttributionBlock(evidenceFirstAttribution) {
|
|
90
|
+
if (!evidenceFirstAttribution) {
|
|
91
|
+
return '';
|
|
92
|
+
}
|
|
93
|
+
return `
|
|
94
|
+
Evidence First Attribution (applies to PHASE 3):
|
|
95
|
+
A failure event is NOT automatically an agent error. Attribute strictly from the evidence you cited in PHASE 1-2.
|
|
96
|
+
- Prefer People ONLY when the evidence shows agent-avoidable behavior: changed code or behavior without investigating
|
|
97
|
+
first, skipped verification or testing of the change, ignored an already-active principle that covered this case,
|
|
98
|
+
performed a high-risk action without checking it, or repeated the same class of error after earlier evidence.
|
|
99
|
+
- Prefer Design when the evidence primarily shows a system or architecture defect (missing gate, unsafe default, process gap).
|
|
100
|
+
- Prefer Tooling when the evidence primarily shows a tool or environment limitation or misconfiguration.
|
|
101
|
+
- Prefer Assumption when the evidence primarily shows a wrong assumption (environment, version, dependency behavior).
|
|
102
|
+
Never classify as People without evidence of an avoidable agent action; never avoid People when the evidence shows one.
|
|
103
|
+
When both agent behavior and system or tooling factors contributed, classify the dominant evidenced cause and name the
|
|
104
|
+
secondary factor in ambiguityNotes.
|
|
105
|
+
`;
|
|
106
|
+
}
|
|
77
107
|
// ── Instruction builder ──────────────────────────────────────────────────────
|
|
78
108
|
/**
|
|
79
109
|
* Build the Stage A diagnostic protocol instruction (PHASE 1–3 + optional PHASE 3.5).
|
|
@@ -91,7 +121,7 @@ Owner decides value.
|
|
|
91
121
|
export function buildRootCauseProtocolInstruction(opts = {}) {
|
|
92
122
|
const adapter = opts.adapter ?? new DefaultSchemaPromptAdapter();
|
|
93
123
|
const schema = opts.schema ?? DiagRootCauseOutputV1Schema;
|
|
94
|
-
const { outputLanguage, coreGrounding, intentGrounding } = opts;
|
|
124
|
+
const { outputLanguage, coreGrounding, intentGrounding, evidenceFirstAttribution } = opts;
|
|
95
125
|
const example = adapter.generateExample(schema);
|
|
96
126
|
const constraints = adapter.generateConstraints(schema);
|
|
97
127
|
const languageDirective = buildLanguageDirective(outputLanguage);
|
|
@@ -106,8 +136,12 @@ export function buildRootCauseProtocolInstruction(opts = {}) {
|
|
|
106
136
|
outputLanguage,
|
|
107
137
|
fallback: '\n',
|
|
108
138
|
});
|
|
139
|
+
// Pain Diagnosis Persistence: Evidence First Attribution rules appended
|
|
140
|
+
// after the PHASE 3 category list. When off, '' keeps the prompt
|
|
141
|
+
// byte-identical to the pre-feature prompt (EP-03: no silent fallback).
|
|
142
|
+
const evidenceFirstBlock = buildEvidenceFirstAttributionBlock(evidenceFirstAttribution);
|
|
109
143
|
// PRI-468: When intentGrounding is true, insert PHASE 3.6.
|
|
110
|
-
// When false
|
|
144
|
+
// When false/undefined, output is byte-identical to the pre-PRI-468
|
|
111
145
|
// prompt (EP-03: no silent fallback). The fallback is '' (empty string)
|
|
112
146
|
// so that `${phase35Block}${phase36Block}CRITICAL:` produces the same
|
|
113
147
|
// string as `${phase35Block}CRITICAL:` when intentGrounding is off.
|
|
@@ -139,7 +173,7 @@ Classify into ONE: People | Design | Assumption | Tooling
|
|
|
139
173
|
- Design: architecture defects, missing gates, process gaps
|
|
140
174
|
- Assumption: wrong assumptions about env/versions/deps
|
|
141
175
|
- Tooling: tool misconfiguration, API changes
|
|
142
|
-
${phase35Block}${phase36Block}CRITICAL: Your ENTIRE response must be ONLY the JSON object below. Do NOT include any text before or after the JSON. Do NOT wrap the JSON in markdown code fences. Do NOT add explanatory prose. Output the raw JSON object and nothing else.
|
|
176
|
+
${evidenceFirstBlock}${phase35Block}${phase36Block}CRITICAL: Your ENTIRE response must be ONLY the JSON object below. Do NOT include any text before or after the JSON. Do NOT wrap the JSON in markdown code fences. Do NOT add explanatory prose. Output the raw JSON object and nothing else.
|
|
143
177
|
|
|
144
178
|
COMPLETE EXAMPLE OUTPUT (follow this exact structure):
|
|
145
179
|
${example}
|
|
@@ -193,6 +227,7 @@ export class RootCausePromptBuilder {
|
|
|
193
227
|
outputLanguage: opts.outputLanguage,
|
|
194
228
|
coreGrounding: opts.coreGrounding,
|
|
195
229
|
intentGrounding: opts.intentGrounding,
|
|
230
|
+
evidenceFirstAttribution: opts.evidenceFirstAttribution,
|
|
196
231
|
});
|
|
197
232
|
}
|
|
198
233
|
/**
|
|
@@ -209,7 +244,7 @@ export class RootCausePromptBuilder {
|
|
|
209
244
|
*/
|
|
210
245
|
buildPrompt(payload, opts = {}) {
|
|
211
246
|
const limits = opts.limits ?? DEFAULT_PROMPT_BUILDER_LIMITS;
|
|
212
|
-
const { outputLanguage, coreGrounding, intentGrounding, intentDoc } = opts;
|
|
247
|
+
const { outputLanguage, coreGrounding, intentGrounding, intentDoc, evidenceFirstAttribution } = opts;
|
|
213
248
|
const truncationWarnings = [];
|
|
214
249
|
// DPB-04: Apply truncation to conversationWindow to prevent token overflow
|
|
215
250
|
const rawWindow = summarizeConversationWindow(payload.conversationWindow);
|
|
@@ -236,6 +271,7 @@ export class RootCausePromptBuilder {
|
|
|
236
271
|
outputLanguage,
|
|
237
272
|
coreGrounding,
|
|
238
273
|
intentGrounding,
|
|
274
|
+
evidenceFirstAttribution,
|
|
239
275
|
});
|
|
240
276
|
// DPB-04: Explicit top-level fields at the prompt level
|
|
241
277
|
// PRI-468: Only include `intentDoc` when intentGrounding is on AND a doc
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rootcause-prompt-builder.js","sourceRoot":"","sources":["../../../src/runtime-v2/diagnostician/rootcause-prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAGzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAK7E,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,oCAAoC,CAAC;AAG5C,gFAAgF;AAEhF;;;;;;;;;;;;GAYG;AACH,SAAS,uBAAuB,CAAC,eAAyB;IACxD,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,6CAA6C;IAC7C,4DAA4D;IAC5D,0EAA0E;IAC1E,uEAAuE;IACvE,sDAAsD;IACtD,gDAAgD;IAChD,6CAA6C;IAC7C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;CAwBR,CAAC;AACF,CAAC;
|
|
1
|
+
{"version":3,"file":"rootcause-prompt-builder.js","sourceRoot":"","sources":["../../../src/runtime-v2/diagnostician/rootcause-prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAGzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAK7E,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,oCAAoC,CAAC;AAG5C,gFAAgF;AAEhF;;;;;;;;;;;;GAYG;AACH,SAAS,uBAAuB,CAAC,eAAyB;IACxD,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,6CAA6C;IAC7C,4DAA4D;IAC5D,0EAA0E;IAC1E,uEAAuE;IACvE,sDAAsD;IACtD,gDAAgD;IAChD,6CAA6C;IAC7C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;CAwBR,CAAC;AACF,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,kCAAkC,CAAC,wBAAkC;IAC5E,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO;;;;;;;;;;;;CAYR,CAAC;AACF,CAAC;AAsCD,gFAAgF;AAEhF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iCAAiC,CAC/C,IAAI,GAAkC,EAAE;IAExC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,0BAA0B,EAAE,CAAC;IACjE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,2BAA2B,CAAC;IAC1D,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,wBAAwB,EAAE,GAAG,IAAI,CAAC;IAE1F,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,cAAc,CAAC,CAAC;IAEjE,+DAA+D;IAC/D,oEAAoE;IACpE,+BAA+B;IAC/B,MAAM,YAAY,GAAG,mBAAmB,CAAC;QACvC,aAAa;QACb,YAAY,EAAE,mCAAmC;QACjD,WAAW,EACT,mFAAmF;YACnF,6DAA6D;QAC/D,cAAc;QACd,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,wEAAwE;IACxE,iEAAiE;IACjE,wEAAwE;IACxE,MAAM,kBAAkB,GAAG,kCAAkC,CAAC,wBAAwB,CAAC,CAAC;IAExF,2DAA2D;IAC3D,oEAAoE;IACpE,wEAAwE;IACxE,sEAAsE;IACtE,oEAAoE;IACpE,MAAM,YAAY,GAAG,uBAAuB,CAAC,eAAe,CAAC,CAAC;IAE9D,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BP,kBAAkB,GAAG,YAAY,GAAG,YAAY;;;EAGhD,OAAO;;;;;;;;;;;;;;EAcP,WAAW,GAAG,iBAAiB,EAAE,CAAC;AACpC,CAAC;AAED,gFAAgF;AAEhF;;;;;;;;;;GAUG;AACH,MAAM,OAAO,sBAAsB;IAChB,OAAO,CAAsB;IAC7B,MAAM,CAAU;IAEjC,YAAY,IAAI,GAAkC,EAAE;QAClD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,0BAA0B,EAAE,CAAC;QAChE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,2BAA2B,CAAC;IAC3D,CAAC;IAED;;;;;;;;OAQG;IACH,yBAAyB,CAAC,IAAI,GAAkC,EAAE;QAChE,OAAO,iCAAiC,CAAC;YACvC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;YACrC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM;YAClC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,wBAAwB,EAAE,IAAI,CAAC,wBAAwB;SACxD,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;OAWG;IACH,WAAW,CACT,OAAoC,EACpC,IAAI,GAAuB,EAAE;QAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,6BAA6B,CAAC;QAC5D,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,wBAAwB,EAAE,GAAG,IAAI,CAAC;QAErG,MAAM,kBAAkB,GAAa,EAAE,CAAC;QAExC,2EAA2E;QAC3E,MAAM,SAAS,GAAG,2BAA2B,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAC1E,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACxE,IAAI,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,sBAAsB,EAAE,CAAC;YACrD,kBAAkB,CAAC,IAAI,CACrB,qCAAqC,SAAS,CAAC,MAAM,OAAO,MAAM,CAAC,sBAAsB,UAAU,CACpG,CAAC;QACJ,CAAC;QAED,iCAAiC;QACjC,MAAM,kBAAkB,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACrD,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC;gBAC/D,OAAO;oBACL,GAAG,KAAK;oBACR,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,GAAG,gBAAgB;iBACvE,CAAC;YACJ,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,4EAA4E;QAC5E,MAAM,cAAc,GAAgC;YAClD,GAAG,OAAO;YACV,kBAAkB;SACnB,CAAC;QAEF,MAAM,qBAAqB,GAAG,IAAI,CAAC,yBAAyB,CAAC;YAC3D,cAAc;YACd,aAAa;YACb,eAAe;YACf,wBAAwB;SACzB,CAAC,CAAC;QAEH,wDAAwD;QACxD,yEAAyE;QACzE,sEAAsE;QACtE,sDAAsD;QACtD,MAAM,WAAW,GAAgB;YAC/B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,kBAAkB;YAClB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,OAAO,EAAE,cAAc;YACvB,qBAAqB;YACrB,GAAG,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,GAAG,CAAC,eAAe,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvD,CAAC;QAEF,wEAAwE;QACxE,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAE1C,0EAA0E;QAC1E,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;YAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC;YACxD,MAAM,WAAW,GAAG,qBAAqB,CAAC;YAE1C,gEAAgE;YAChE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,MAAM,GAAG,OAAO,GAAG,GAAG,CAAC,CAAC;YACrE,MAAM,oBAAoB,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;gBAC3D,qFAAqF,CAAC;YAExF,WAAW,CAAC,qBAAqB,GAAG,oBAAoB,CAAC;YACzD,WAAW,CAAC,kBAAkB,GAAG;gBAC/B,GAAG,kBAAkB;gBACrB,gDAAgD,OAAO,CAAC,MAAM,MAAM,MAAM,CAAC,eAAe,GAAG;aAC9F,CAAC;YACF,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -37,6 +37,12 @@ export interface BuildPromptOptions {
|
|
|
37
37
|
readonly contentHash: string;
|
|
38
38
|
readonly path: string;
|
|
39
39
|
};
|
|
40
|
+
/**
|
|
41
|
+
* Evidence First Attribution (Pain Diagnosis Persistence SPEC §2.2/§6).
|
|
42
|
+
* Injected only when the `pain_diagnosis_persistence` flag is on; when
|
|
43
|
+
* absent, the prompt is byte-identical to the pre-feature prompt.
|
|
44
|
+
*/
|
|
45
|
+
evidenceFirstAttribution?: boolean;
|
|
40
46
|
}
|
|
41
47
|
/**
|
|
42
48
|
* PromptInput — the JSON message sent to openclaw agent via --message flag.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostician-prompt-builder.d.ts","sourceRoot":"","sources":["../../src/runtime-v2/diagnostician-prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EACV,2BAA2B,EAC3B,iBAAiB,EACjB,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,wFAAwF;AACxF,MAAM,WAAW,kBAAkB;IACjC,qFAAqF;IACrF,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,gDAAgD;IAChD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,+EAA+E;IAC/E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yEAAyE;IACzE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,CAAC;
|
|
1
|
+
{"version":3,"file":"diagnostician-prompt-builder.d.ts","sourceRoot":"","sources":["../../src/runtime-v2/diagnostician-prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EACV,2BAA2B,EAC3B,iBAAiB,EACjB,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,wFAAwF;AACxF,MAAM,WAAW,kBAAkB;IACjC,qFAAqF;IACrF,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,gDAAgD;IAChD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,+EAA+E;IAC/E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yEAAyE;IACzE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,CAAC;IACF;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,eAAe,EAAE,eAAe,CAAC;IACjC;;;;OAIG;IACH,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC,0CAA0C;IAC1C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,kEAAkE;IAClE,OAAO,EAAE,2BAA2B,CAAC;IACrC;;;;;OAKG;IACH,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kFAAkF;IAClF,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B;;;;;;;;;;OAUG;IACH,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,+DAA+D;AAC/D,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,sBAAsB,EAAE,MAAM,CAAC;IAC/B,wDAAwD;IACxD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,wDAAwD;IACxD,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,6BAA6B,EAAE,mBAIlC,CAAC;AAEX;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,iBAAiB,EAAE,GAC3B,iBAAiB,EAAE,CAErB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostician-prompt-builder.js","sourceRoot":"","sources":["../../src/runtime-v2/diagnostician-prompt-builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"diagnostician-prompt-builder.js","sourceRoot":"","sources":["../../src/runtime-v2/diagnostician-prompt-builder.ts"],"names":[],"mappings":"AAmHA,MAAM,CAAC,MAAM,6BAA6B,GAAwB;IAChE,sBAAsB,EAAE,EAAE;IAC1B,iBAAiB,EAAE,IAAI;IACvB,eAAe,EAAE,MAAM;CACf,CAAC;AAeX;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAA4B;IAE5B,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pain-diagnosis-persistence-flag.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/feature-flags/__tests__/pain-diagnosis-persistence-flag.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { DEFAULT_FEATURE_FLAGS, computeEffectiveFlags } from '../feature-flag-contract.js';
|
|
3
|
+
import { computeFeatureFlagsFromConfig, isFeatureEnabled } from '../../config/pd-config-feature-flags.js';
|
|
4
|
+
const FLAG_ID = 'pain_diagnosis_persistence';
|
|
5
|
+
function findFlag() {
|
|
6
|
+
const flag = DEFAULT_FEATURE_FLAGS.find(f => f.id === FLAG_ID);
|
|
7
|
+
if (!flag) {
|
|
8
|
+
throw new Error(`${FLAG_ID} must be registered in DEFAULT_FEATURE_FLAGS`);
|
|
9
|
+
}
|
|
10
|
+
return flag;
|
|
11
|
+
}
|
|
12
|
+
function effectiveConfigWithFeatures(features) {
|
|
13
|
+
return { config: { features } };
|
|
14
|
+
}
|
|
15
|
+
describe('pain_diagnosis_persistence flag registration (Pain Diagnosis Persistence SPEC §11)', () => {
|
|
16
|
+
it('is registered in DEFAULT_FEATURE_FLAGS', () => { expect(findFlag()).toBeDefined(); });
|
|
17
|
+
it('has category "quiet" (MVP-Quiet per ADR-0014)', () => { expect(findFlag().category).toBe('quiet'); });
|
|
18
|
+
it('defaults to enabled=false', () => { expect(findFlag().enabled).toBe(false); });
|
|
19
|
+
it('has since field matching YYYY-MM-DD', () => { expect(/^\d{4}-\d{2}-\d{2}$/.test(findFlag().since)).toBe(true); });
|
|
20
|
+
it('is disabled by default with no overrides (contract loader)', () => {
|
|
21
|
+
const r = computeEffectiveFlags({}, DEFAULT_FEATURE_FLAGS, '/test/.pd/feature-flags.yaml');
|
|
22
|
+
expect(r.flags[FLAG_ID]?.enabled).toBe(false);
|
|
23
|
+
});
|
|
24
|
+
// Production loader path — this is the resolution createPainSignalBridge and
|
|
25
|
+
// DiagRootCauseRunner use (pd-config-feature-flags, not the legacy contract
|
|
26
|
+
// loader). Registration only counts when the production loader exercises it.
|
|
27
|
+
it('is disabled by default through the production loader (computeFeatureFlagsFromConfig)', () => {
|
|
28
|
+
const r = computeFeatureFlagsFromConfig(effectiveConfigWithFeatures({}));
|
|
29
|
+
expect(isFeatureEnabled(r, FLAG_ID)).toBe(false);
|
|
30
|
+
});
|
|
31
|
+
it('can be enabled via workspace config through the production loader', () => {
|
|
32
|
+
const r = computeFeatureFlagsFromConfig(effectiveConfigWithFeatures({
|
|
33
|
+
[FLAG_ID]: { category: 'quiet', enabled: true },
|
|
34
|
+
}));
|
|
35
|
+
expect(isFeatureEnabled(r, FLAG_ID)).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
it('can be explicitly disabled via config (single-flag rollback path)', () => {
|
|
38
|
+
const r = computeFeatureFlagsFromConfig(effectiveConfigWithFeatures({
|
|
39
|
+
[FLAG_ID]: { category: 'quiet', enabled: false },
|
|
40
|
+
}));
|
|
41
|
+
expect(isFeatureEnabled(r, FLAG_ID)).toBe(false);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=pain-diagnosis-persistence-flag.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pain-diagnosis-persistence-flag.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/feature-flags/__tests__/pain-diagnosis-persistence-flag.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-flag-contract.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/feature-flags/feature-flag-contract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,gBAAgB,YAAI,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,CAAU,CAAC;AACpF,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAIpE,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAC7C,MAAM,EAAE,UAAU,GAAG,gBAAgB,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,IAAI,CAAC;IACT,KAAK,EAAE,qBAAqB,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,gBAAgB,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AAExE,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAkDrF;AAED,eAAO,MAAM,qBAAqB,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"feature-flag-contract.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/feature-flags/feature-flag-contract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,gBAAgB,YAAI,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,CAAU,CAAC;AACpF,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAIpE,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAC7C,MAAM,EAAE,UAAU,GAAG,gBAAgB,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,IAAI,CAAC;IACT,KAAK,EAAE,qBAAqB,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,gBAAgB,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AAExE,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAkDrF;AAED,eAAO,MAAM,qBAAqB,EAAE,qBAAqB,EAwKxD,CAAC;AAEF,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,QAAQ,EAAE,qBAAqB,EAAE,EACjC,UAAU,EAAE,MAAM,GACjB,qBAAqB,CA2EvB"}
|
|
@@ -191,6 +191,16 @@ export const DEFAULT_FEATURE_FLAGS = [
|
|
|
191
191
|
// governs the P1-b write points. Default off; flag-off = byte-identical template.
|
|
192
192
|
{ id: 'principle_receipt_self_report', category: 'quiet', enabled: false, since: '2026-08-16', description: 'Principle Receipt P1-a — agent self-report 📌 line (injection instruction + capture, PRI-532). Default off; flag-off = directive template unchanged, no capture.' },
|
|
193
193
|
{ id: 'principle_governance_projection_v2', category: 'quiet', enabled: false, since: '2026-08-20', description: 'Read-only per-principle Owner governance projection (PRI-549). Default off; flag-off preserves the existing Principle Detail experience.' },
|
|
194
|
+
// Pain diagnosis persistence (SPEC: PD Pain Diagnosis Persistence Enhancement).
|
|
195
|
+
// Gates BOTH halves of one feature so the disable path is a single flag:
|
|
196
|
+
// 1. Stage A prompt gains the Evidence First Attribution block
|
|
197
|
+
// (People/Design/Assumption/Tooling chosen strictly from evidence).
|
|
198
|
+
// 2. PainSignalBridge.onDiagnosisComplete persists the diagnostician's
|
|
199
|
+
// root-cause attribution into state.db pain_diagnoses, keyed by the
|
|
200
|
+
// canonical pain_id (logical link — pain_events lives in trajectory.db).
|
|
201
|
+
// Default off; flag-off = no pain_diagnoses writes AND the Stage A prompt
|
|
202
|
+
// is byte-identical to the pre-feature prompt. Roll back = set enabled: false.
|
|
203
|
+
{ id: 'pain_diagnosis_persistence', category: 'quiet', enabled: false, since: '2026-08-23', description: 'Persist diagnostician root-cause attribution to pain_diagnoses (state.db, keyed by canonical pain_id) + Evidence First attribution rules in the Stage A prompt. Default off; flag-off = no writes, prompt byte-identical.' },
|
|
194
204
|
// MVP-Gone — permanently disabled, cannot be re-enabled
|
|
195
205
|
{ id: 'nocturnal', category: 'gone', enabled: false, since: '2026-05-24', description: 'Nocturnal trinity pipeline (retired)' },
|
|
196
206
|
{ id: 'idle_trigger', category: 'gone', enabled: false, since: '2026-05-24', description: 'Idle trigger for background processing (retired)' },
|