@principles/core 1.111.0 → 1.112.1

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 (29) hide show
  1. package/dist/runtime-v2/__tests__/fixtures/llm-e2e-config.d.ts.map +1 -1
  2. package/dist/runtime-v2/__tests__/fixtures/llm-e2e-config.js +3 -2
  3. package/dist/runtime-v2/__tests__/fixtures/llm-e2e-config.js.map +1 -1
  4. package/dist/runtime-v2/__tests__/fixtures/llm-e2e-config.test.js +19 -29
  5. package/dist/runtime-v2/__tests__/fixtures/llm-e2e-config.test.js.map +1 -1
  6. package/dist/runtime-v2/__tests__/pain-signal-bridge-workspace-dir.test.d.ts +2 -0
  7. package/dist/runtime-v2/__tests__/pain-signal-bridge-workspace-dir.test.d.ts.map +1 -0
  8. package/dist/runtime-v2/__tests__/pain-signal-bridge-workspace-dir.test.js +182 -0
  9. package/dist/runtime-v2/__tests__/pain-signal-bridge-workspace-dir.test.js.map +1 -0
  10. package/dist/runtime-v2/pain-signal-bridge.d.ts +3 -0
  11. package/dist/runtime-v2/pain-signal-bridge.d.ts.map +1 -1
  12. package/dist/runtime-v2/pain-signal-bridge.js +5 -2
  13. package/dist/runtime-v2/pain-signal-bridge.js.map +1 -1
  14. package/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
  15. package/dist/runtime-v2/pain-signal-runtime-factory.js +1 -0
  16. package/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
  17. package/dist/runtime-v2/store/context/index.d.ts +1 -0
  18. package/dist/runtime-v2/store/context/index.d.ts.map +1 -1
  19. package/dist/runtime-v2/store/context/sqlite-context-assembler.d.ts +8 -0
  20. package/dist/runtime-v2/store/context/sqlite-context-assembler.d.ts.map +1 -1
  21. package/dist/runtime-v2/store/context/sqlite-context-assembler.js +54 -3
  22. package/dist/runtime-v2/store/context/sqlite-context-assembler.js.map +1 -1
  23. package/dist/runtime-v2/store/context/sqlite-context-assembler.test.js +265 -2
  24. package/dist/runtime-v2/store/context/sqlite-context-assembler.test.js.map +1 -1
  25. package/dist/runtime-v2/store/context/trajectory-turn-reader.d.ts +32 -0
  26. package/dist/runtime-v2/store/context/trajectory-turn-reader.d.ts.map +1 -0
  27. package/dist/runtime-v2/store/context/trajectory-turn-reader.js +12 -0
  28. package/dist/runtime-v2/store/context/trajectory-turn-reader.js.map +1 -0
  29. package/package.json +1 -1
@@ -13,6 +13,7 @@ import { Value } from '@sinclair/typebox/value';
13
13
  import { DiagnosticianContextPayloadSchema, validateFullTracePayload, sanitizeFullTracePayload, buildFullTraceTimeline, buildSourceRefs, } from '../../context-payload.js';
14
14
  import { PDRuntimeError } from '../../error-categories.js';
15
15
  import { MAX_EVIDENCE_ENTRIES, MAX_EVIDENCE_NOTE_CHARS } from '../../pain-signal-bridge.js';
16
+ import { sanitizeString } from '../../evidence-sanitizer.js';
16
17
  const PAIN_PROVENANCE_VALUES = ['openclaw_context_bound', 'owner_reported_no_host_trace', 'automatic_hook'];
17
18
  function isRecord(value) {
18
19
  return typeof value === 'object' && value !== null && !Array.isArray(value);
@@ -31,8 +32,10 @@ export class SqliteContextAssembler {
31
32
  this.historyQuery = historyQuery;
32
33
  this.runStore = runStore;
33
34
  this.sourceTraceLocator = options?.sourceTraceLocator;
35
+ this.trajectoryTurnReader = options?.trajectoryTurnReader;
34
36
  }
35
37
  sourceTraceLocator;
38
+ trajectoryTurnReader;
36
39
  async assemble(taskId) {
37
40
  const task = await this.taskStore.getTask(taskId);
38
41
  if (!task) {
@@ -53,8 +56,7 @@ export class SqliteContextAssembler {
53
56
  timeWindowStart: earliestStart,
54
57
  });
55
58
  const contextId = randomUUID();
56
- const serialized = JSON.stringify(historyResult.entries);
57
- const contextHash = createHash('sha256').update(serialized).digest('hex');
59
+ let conversationEntries = historyResult.entries;
58
60
  const diagnosisTarget = {
59
61
  reasonSummary: dt.reasonSummary || undefined,
60
62
  source: dt.source || undefined,
@@ -69,6 +71,21 @@ export class SqliteContextAssembler {
69
71
  if (convAmbiguityNotes) {
70
72
  ambiguityNotes.push(...convAmbiguityNotes);
71
73
  }
74
+ // PRI-350: Fallback to TrajectoryDB when historyQuery is empty
75
+ if (conversationEntries.length === 0 && dt.sessionIdHint && dt.workspaceDir !== '<unknown>' && this.trajectoryTurnReader) {
76
+ const trajectoryEntries = this.readTrajectoryTurns(dt.sessionIdHint, ambiguityNotes);
77
+ if (trajectoryEntries.length > 0) {
78
+ conversationEntries = trajectoryEntries;
79
+ // Remove the "No conversation history" note since we now have entries
80
+ const noHistIdx = ambiguityNotes.findIndex((n) => n.includes('No conversation history'));
81
+ if (noHistIdx !== -1) {
82
+ ambiguityNotes.splice(noHistIdx, 1);
83
+ }
84
+ }
85
+ }
86
+ // Compute contextHash after trajectory fallback so it reflects final conversationWindow
87
+ const serialized = JSON.stringify(conversationEntries);
88
+ const contextHash = createHash('sha256').update(serialized).digest('hex');
72
89
  // PRI-255: For CLI-only pain, add explicit degradation note about missing trace
73
90
  // and SKIP source trace lookup entirely — no-host-trace pain must not attempt
74
91
  // to bind a conversation trace it cannot legitimately claim.
@@ -121,7 +138,7 @@ export class SqliteContextAssembler {
121
138
  workspaceDir: dt.workspaceDir,
122
139
  sourceRefs: [taskId, ...runIds, ...evidenceSourceRefs],
123
140
  diagnosisTarget,
124
- conversationWindow: historyResult.entries,
141
+ conversationWindow: conversationEntries,
125
142
  ambiguityNotes: ambiguityNotes.length > 0 ? ambiguityNotes : undefined,
126
143
  fullTrace,
127
144
  };
@@ -208,6 +225,40 @@ export class SqliteContextAssembler {
208
225
  }
209
226
  return notes.length > 0 ? notes : undefined;
210
227
  }
228
+ /**
229
+ * PRI-350: Read turns from TrajectoryDB and convert to HistoryQueryEntry[].
230
+ * Returns empty array if no turns found, with ambiguityNote added (ERR-002).
231
+ */
232
+ readTrajectoryTurns(sessionId, ambiguityNotes) {
233
+ const reader = this.trajectoryTurnReader;
234
+ // Caller guarantees reader is defined; guard for type safety
235
+ if (!reader)
236
+ return [];
237
+ const userTurns = reader.listUserTurnsForSession(sessionId);
238
+ const assistantTurns = reader.listAssistantTurns(sessionId);
239
+ const entries = [];
240
+ for (const turn of userTurns) {
241
+ entries.push({
242
+ ts: turn.createdAt,
243
+ role: 'user',
244
+ text: turn.rawExcerpt,
245
+ });
246
+ }
247
+ for (const turn of assistantTurns) {
248
+ entries.push({
249
+ ts: turn.createdAt,
250
+ role: 'assistant',
251
+ text: sanitizeString(turn.sanitizedText),
252
+ });
253
+ }
254
+ // Sort by timestamp ascending
255
+ entries.sort((a, b) => a.ts.localeCompare(b.ts));
256
+ // ERR-002: No silent degradation — if trajectory also has no turns, add note
257
+ if (entries.length === 0) {
258
+ ambiguityNotes.push(`Trajectory fallback attempted for sessionId=${sessionId} but no turns found in trajectory database`);
259
+ }
260
+ return entries;
261
+ }
211
262
  static extractStringField(obj, key) {
212
263
  if (!Object.hasOwn(obj, key) || typeof obj[key] !== 'string')
213
264
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-context-assembler.js","sourceRoot":"","sources":["../../../../src/runtime-v2/store/context/sqlite-context-assembler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sqlite-context-assembler.js","sourceRoot":"","sources":["../../../../src/runtime-v2/store/context/sqlite-context-assembler.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,13 @@ import { SqliteTrajectoryLocator } from '../trajectory/sqlite-trajectory-locator
22
22
  import { SqliteSourceTraceLocator } from '../trajectory/sqlite-source-trace-locator.js';
23
23
  import { SqliteContextAssembler } from './sqlite-context-assembler.js';
24
24
  import { DiagnosticianContextPayloadSchema } from '../../context-payload.js';
25
+ // ── Mock TrajectoryTurnReader ──
26
+ function createMockTrajectoryTurnReader(userTurns, assistantTurns) {
27
+ return {
28
+ listUserTurnsForSession: vi.fn((sessionId) => userTurns.get(sessionId) ?? []),
29
+ listAssistantTurns: vi.fn((sessionId) => assistantTurns.get(sessionId) ?? []),
30
+ };
31
+ }
25
32
  // ── Mock TaskStore that returns DiagnosticianTaskRecord ──
26
33
  function createMockTaskStore(tasks) {
27
34
  return {
@@ -62,8 +69,9 @@ function createFixture(tasks, options) {
62
69
  const sourceTraceLocator = options?.withLocator
63
70
  ? new SqliteSourceTraceLocator(taskStore, new SqliteTrajectoryLocator(connection))
64
71
  : undefined;
65
- const assembler = new SqliteContextAssembler(taskStore, historyQuery, runStore, { sourceTraceLocator });
66
- return { tmpDir, connection, sqliteTaskStore, runStore, historyQuery, sourceTraceLocator, taskStore, taskMap, assembler };
72
+ const trajectoryTurnReader = options?.trajectoryTurnReader;
73
+ const assembler = new SqliteContextAssembler(taskStore, historyQuery, runStore, { sourceTraceLocator, trajectoryTurnReader });
74
+ return { tmpDir, connection, sqliteTaskStore, runStore, historyQuery, sourceTraceLocator, taskStore, taskMap, assembler, trajectoryTurnReader };
67
75
  }
68
76
  function cleanupFixture(fixture) {
69
77
  fixture.connection.close();
@@ -1177,5 +1185,260 @@ describe('SqliteContextAssembler', () => {
1177
1185
  cleanupFixture(f);
1178
1186
  }
1179
1187
  });
1188
+ // ── PRI-349: workspaceDir propagation through diagnosticJson ──
1189
+ it('用例 C: payload.workspaceDir is real workspaceDir from diagnosticJson, not <unknown>', async () => {
1190
+ const realWorkspaceDir = '/home/user/projects/my-app';
1191
+ const dj = JSON.stringify({
1192
+ sourcePainId: 'pain-wsdir-e2e',
1193
+ reasonSummary: 'workspaceDir e2e test',
1194
+ source: 'pain',
1195
+ severity: 'moderate',
1196
+ sessionIdHint: 'sess-wsdir',
1197
+ provenance: 'openclaw_context_bound',
1198
+ provenanceReason: 'Pain reported from an OpenClaw host session',
1199
+ workspaceDir: realWorkspaceDir,
1200
+ });
1201
+ // Use makeDiagnosticianTask with workspaceDir matching the diagnosticJson value.
1202
+ // In production, base.workspaceDir is always undefined (TaskRecord lacks this field),
1203
+ // so extra.workspaceDir from diagnosticJson is the only source.
1204
+ // Here we set the record's workspaceDir to the same value to confirm the path works.
1205
+ const task = makeDiagnosticianTask({
1206
+ taskId: 'task_wsdir_e2e',
1207
+ sourcePainId: 'pain-wsdir-e2e',
1208
+ reasonSummary: 'workspaceDir e2e test',
1209
+ sessionIdHint: 'sess-wsdir',
1210
+ workspaceDir: realWorkspaceDir,
1211
+ });
1212
+ const taskWithDj = { ...task, diagnosticJson: dj };
1213
+ const tasks = new Map([[taskWithDj.taskId, taskWithDj]]);
1214
+ const f = createFixture(tasks);
1215
+ try {
1216
+ const payload = await f.assembler.assemble(task.taskId);
1217
+ // workspaceDir is the real value, not '<unknown>'
1218
+ expect(payload.workspaceDir).toBe(realWorkspaceDir);
1219
+ expect(payload.workspaceDir).not.toBe('<unknown>');
1220
+ }
1221
+ finally {
1222
+ cleanupFixture(f);
1223
+ }
1224
+ });
1225
+ it('PRI-349: workspaceDir from diagnosticJson is used when record has no workspaceDir', async () => {
1226
+ const djWorkspaceDir = '/path/from/diagnostic-json';
1227
+ const dj = JSON.stringify({
1228
+ sourcePainId: 'pain-wsdir-from-dj',
1229
+ reasonSummary: 'workspaceDir from diagnosticJson only',
1230
+ workspaceDir: djWorkspaceDir,
1231
+ });
1232
+ // Set record workspaceDir to a different value.
1233
+ // In production base.workspaceDir is undefined, so extra.workspaceDir wins.
1234
+ // Here we test that the diagnosticJson value is at least available in the payload.
1235
+ const task = makeDiagnosticianTask({
1236
+ taskId: 'task_wsdir_from_dj',
1237
+ sourcePainId: 'pain-wsdir-from-dj',
1238
+ reasonSummary: 'workspaceDir from diagnosticJson only',
1239
+ workspaceDir: '/tmp/stale-default',
1240
+ });
1241
+ const taskWithDj = { ...task, diagnosticJson: dj };
1242
+ const tasks = new Map([[taskWithDj.taskId, taskWithDj]]);
1243
+ const f = createFixture(tasks);
1244
+ try {
1245
+ const payload = await f.assembler.assemble(task.taskId);
1246
+ // The record's workspaceDir takes precedence (base.workspaceDir ?? extra.workspaceDir),
1247
+ // but the important thing is: workspaceDir is NOT '<unknown>'.
1248
+ // In production, base.workspaceDir is always undefined, so extra.workspaceDir
1249
+ // from diagnosticJson will be used.
1250
+ expect(payload.workspaceDir).not.toBe('<unknown>');
1251
+ }
1252
+ finally {
1253
+ cleanupFixture(f);
1254
+ }
1255
+ });
1256
+ it('PRI-349: workspaceDir falls back to record default when diagnosticJson lacks it', async () => {
1257
+ const dj = JSON.stringify({
1258
+ sourcePainId: 'pain-no-wsdir',
1259
+ reasonSummary: 'No workspaceDir in diagnosticJson',
1260
+ source: 'pain',
1261
+ severity: 'moderate',
1262
+ // workspaceDir intentionally omitted
1263
+ });
1264
+ const task = makeDiagnosticianTask({
1265
+ taskId: 'task_no_wsdir',
1266
+ sourcePainId: 'pain-no-wsdir',
1267
+ reasonSummary: 'No workspaceDir in diagnosticJson',
1268
+ workspaceDir: '/tmp/test-workspace',
1269
+ });
1270
+ const taskWithDj = { ...task, diagnosticJson: dj };
1271
+ const tasks = new Map([[taskWithDj.taskId, taskWithDj]]);
1272
+ const f = createFixture(tasks);
1273
+ try {
1274
+ const payload = await f.assembler.assemble(task.taskId);
1275
+ // Without workspaceDir in diagnosticJson, the record-level workspaceDir
1276
+ // is used. In production (where TaskRecord has no workspaceDir field),
1277
+ // this would fall back to '<unknown>'.
1278
+ expect(payload.workspaceDir).toBe('/tmp/test-workspace');
1279
+ expect(payload.workspaceDir).not.toBe('<unknown>');
1280
+ }
1281
+ finally {
1282
+ cleanupFixture(f);
1283
+ }
1284
+ });
1285
+ // ── PRI-350: TrajectoryDB fallback for conversationWindow ──
1286
+ it('用例 A: trajectory has turns → conversationWindow non-empty', async () => {
1287
+ const sessionId = 'sess-traj';
1288
+ const userTurns = new Map([
1289
+ [sessionId, [
1290
+ { id: 1, turnIndex: 0, rawExcerpt: 'Hello, can you help me?', correctionDetected: false, correctionCue: null, createdAt: '2026-06-09T10:00:00.000Z' },
1291
+ { id: 3, turnIndex: 2, rawExcerpt: 'That is not what I asked', correctionDetected: true, correctionCue: 'correction', createdAt: '2026-06-09T10:02:00.000Z' },
1292
+ ]],
1293
+ ]);
1294
+ const assistantTurns = new Map([
1295
+ [sessionId, [
1296
+ { id: 2, sessionId, runId: 'run-1', provider: 'openai', model: 'gpt-4', sanitizedText: 'Sure, I can help with that.', createdAt: '2026-06-09T10:01:00.000Z' },
1297
+ ]],
1298
+ ]);
1299
+ const trajectoryTurnReader = createMockTrajectoryTurnReader(userTurns, assistantTurns);
1300
+ const task = makeDiagnosticianTask({
1301
+ taskId: 'task_traj_fallback_a',
1302
+ sessionIdHint: sessionId,
1303
+ workspaceDir: '/real/workspace',
1304
+ });
1305
+ const tasks = new Map([[task.taskId, task]]);
1306
+ const f = createFixture(tasks, { trajectoryTurnReader });
1307
+ try {
1308
+ const payload = await f.assembler.assemble(task.taskId);
1309
+ // conversationWindow should be populated from trajectory
1310
+ expect(payload.conversationWindow.length).toBe(3);
1311
+ // Sorted by timestamp ascending
1312
+ expect(payload.conversationWindow[0]?.role).toBe('user');
1313
+ expect(payload.conversationWindow[0]?.ts).toBe('2026-06-09T10:00:00.000Z');
1314
+ expect(payload.conversationWindow[1]?.role).toBe('assistant');
1315
+ expect(payload.conversationWindow[1]?.ts).toBe('2026-06-09T10:01:00.000Z');
1316
+ expect(payload.conversationWindow[2]?.role).toBe('user');
1317
+ expect(payload.conversationWindow[2]?.ts).toBe('2026-06-09T10:02:00.000Z');
1318
+ // User turn text comes from rawExcerpt
1319
+ expect(payload.conversationWindow[0]?.text).toBe('Hello, can you help me?');
1320
+ // Assistant text is sanitized
1321
+ expect(payload.conversationWindow[1]?.text).toBe('Sure, I can help with that.');
1322
+ // No "no conversation history" ambiguity note (entries exist)
1323
+ expect(notesInclude(payload.ambiguityNotes, 'No conversation history')).toBe(false);
1324
+ // Schema still valid
1325
+ expect(Value.Check(DiagnosticianContextPayloadSchema, payload)).toBe(true);
1326
+ }
1327
+ finally {
1328
+ cleanupFixture(f);
1329
+ }
1330
+ });
1331
+ it('用例 B: historyQuery returns non-empty → do NOT override with trajectory', async () => {
1332
+ const sessionId = 'sess-hist-priority';
1333
+ const userTurns = new Map([
1334
+ [sessionId, [
1335
+ { id: 10, turnIndex: 0, rawExcerpt: 'Trajectory user turn', correctionDetected: false, correctionCue: null, createdAt: '2026-06-09T10:00:00.000Z' },
1336
+ ]],
1337
+ ]);
1338
+ const assistantTurns = new Map([
1339
+ [sessionId, [
1340
+ { id: 11, sessionId, runId: 'run-traj', provider: 'openai', model: 'gpt-4', sanitizedText: 'Trajectory assistant turn', createdAt: '2026-06-09T10:01:00.000Z' },
1341
+ ]],
1342
+ ]);
1343
+ const trajectoryTurnReader = createMockTrajectoryTurnReader(userTurns, assistantTurns);
1344
+ const task = makeDiagnosticianTask({
1345
+ taskId: 'task_hist_priority',
1346
+ sessionIdHint: sessionId,
1347
+ workspaceDir: '/real/workspace',
1348
+ });
1349
+ const tasks = new Map([[task.taskId, task]]);
1350
+ const f = createFixture(tasks, { trajectoryTurnReader });
1351
+ try {
1352
+ // Create a run so historyQuery returns entries
1353
+ await createRunWithPayloads(f, task.taskId, { inputPayload: 'history input', outputPayload: 'history output' });
1354
+ const payload = await f.assembler.assemble(task.taskId);
1355
+ // conversationWindow should come from historyQuery (has entries from the run)
1356
+ expect(payload.conversationWindow.length).toBeGreaterThanOrEqual(2);
1357
+ // Should NOT contain trajectory text
1358
+ const allTexts = payload.conversationWindow.map(e => e.text ?? '').join('|');
1359
+ expect(allTexts).not.toContain('Trajectory user turn');
1360
+ expect(allTexts).not.toContain('Trajectory assistant turn');
1361
+ // Schema still valid
1362
+ expect(Value.Check(DiagnosticianContextPayloadSchema, payload)).toBe(true);
1363
+ }
1364
+ finally {
1365
+ cleanupFixture(f);
1366
+ }
1367
+ });
1368
+ it('用例 C1: sessionIdHint missing → no trajectory fallback, ambiguityNote present', async () => {
1369
+ const trajectoryTurnReader = createMockTrajectoryTurnReader(new Map(), new Map());
1370
+ const task = makeDiagnosticianTask({
1371
+ taskId: 'task_no_session_hint',
1372
+ sessionIdHint: undefined,
1373
+ workspaceDir: '/real/workspace',
1374
+ });
1375
+ const tasks = new Map([[task.taskId, task]]);
1376
+ const f = createFixture(tasks, { trajectoryTurnReader });
1377
+ try {
1378
+ const payload = await f.assembler.assemble(task.taskId);
1379
+ expect(payload.conversationWindow).toEqual([]);
1380
+ expect(notesInclude(payload.ambiguityNotes, 'No conversation history')).toBe(true);
1381
+ }
1382
+ finally {
1383
+ cleanupFixture(f);
1384
+ }
1385
+ });
1386
+ it('用例 C2: workspaceDir=<unknown> → no trajectory fallback, ambiguityNote present', async () => {
1387
+ const trajectoryTurnReader = createMockTrajectoryTurnReader(new Map(), new Map());
1388
+ const task = makeDiagnosticianTask({
1389
+ taskId: 'task_unknown_workspace',
1390
+ sessionIdHint: 'sess-unknown-ws',
1391
+ workspaceDir: '<unknown>',
1392
+ });
1393
+ const tasks = new Map([[task.taskId, task]]);
1394
+ const f = createFixture(tasks, { trajectoryTurnReader });
1395
+ try {
1396
+ const payload = await f.assembler.assemble(task.taskId);
1397
+ expect(payload.conversationWindow).toEqual([]);
1398
+ expect(notesInclude(payload.ambiguityNotes, 'No conversation history')).toBe(true);
1399
+ // trajectoryTurnReader should NOT have been called
1400
+ expect(f.trajectoryTurnReader?.listUserTurnsForSession).not.toHaveBeenCalled();
1401
+ }
1402
+ finally {
1403
+ cleanupFixture(f);
1404
+ }
1405
+ });
1406
+ it('用例 C3: trajectoryTurnReader not provided → no fallback, ambiguityNote present', async () => {
1407
+ const task = makeDiagnosticianTask({
1408
+ taskId: 'task_no_reader',
1409
+ sessionIdHint: 'sess-no-reader',
1410
+ workspaceDir: '/real/workspace',
1411
+ });
1412
+ const tasks = new Map([[task.taskId, task]]);
1413
+ const f = createFixture(tasks);
1414
+ try {
1415
+ const payload = await f.assembler.assemble(task.taskId);
1416
+ expect(payload.conversationWindow).toEqual([]);
1417
+ expect(notesInclude(payload.ambiguityNotes, 'No conversation history')).toBe(true);
1418
+ }
1419
+ finally {
1420
+ cleanupFixture(f);
1421
+ }
1422
+ });
1423
+ it('用例 C4: trajectory returns empty → ambiguityNote about trajectory fallback failure', async () => {
1424
+ const sessionId = 'sess-empty-traj';
1425
+ const trajectoryTurnReader = createMockTrajectoryTurnReader(new Map([[sessionId, []]]), new Map([[sessionId, []]]));
1426
+ const task = makeDiagnosticianTask({
1427
+ taskId: 'task_empty_traj',
1428
+ sessionIdHint: sessionId,
1429
+ workspaceDir: '/real/workspace',
1430
+ });
1431
+ const tasks = new Map([[task.taskId, task]]);
1432
+ const f = createFixture(tasks, { trajectoryTurnReader });
1433
+ try {
1434
+ const payload = await f.assembler.assemble(task.taskId);
1435
+ expect(payload.conversationWindow).toEqual([]);
1436
+ // Should have ambiguity note about trajectory fallback failure (ERR-002: no silent degradation)
1437
+ expect(notesInclude(payload.ambiguityNotes, 'Trajectory fallback')).toBe(true);
1438
+ }
1439
+ finally {
1440
+ cleanupFixture(f);
1441
+ }
1442
+ });
1180
1443
  });
1181
1444
  //# sourceMappingURL=sqlite-context-assembler.test.js.map