@cue-dev/retrieval-core 0.1.3

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.
@@ -0,0 +1,142 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { InMemoryQueryCache } from "@cue-dev/data-plane";
3
+ import { InMemoryIndexStore, RetrievalCore, type EmbeddingProvider } from "../src/index.js";
4
+
5
+ class TrackingEmbeddingProvider implements EmbeddingProvider {
6
+ in_flight = 0;
7
+ max_in_flight = 0;
8
+
9
+ reset(): void {
10
+ this.in_flight = 0;
11
+ this.max_in_flight = 0;
12
+ }
13
+
14
+ async embed(input: { texts: string[]; purpose: "index" | "query" }): Promise<number[][]> {
15
+ this.in_flight += 1;
16
+ this.max_in_flight = Math.max(this.max_in_flight, this.in_flight);
17
+ try {
18
+ await new Promise((resolve) => setTimeout(resolve, 15));
19
+ return input.texts.map(() => [0.1, 0.2, 0.3]);
20
+ } finally {
21
+ this.in_flight -= 1;
22
+ }
23
+ }
24
+ }
25
+
26
+ function startTrackingUpsertOrder(store: InMemoryIndexStore): {
27
+ order: string[];
28
+ restore: () => void;
29
+ } {
30
+ const order: string[] = [];
31
+ const original = store.upsertFile.bind(store);
32
+ store.upsertFile = async (input) => {
33
+ order.push(input.repo_path);
34
+ return original(input);
35
+ };
36
+ return {
37
+ order,
38
+ restore: () => {
39
+ store.upsertFile = original;
40
+ }
41
+ };
42
+ }
43
+
44
+ describe("retrieval-core index prep concurrency regression", () => {
45
+ it("bounds index prep concurrency and uses deterministic code-unit ordering for indexArtifact", async () => {
46
+ const store = new InMemoryIndexStore();
47
+ const embeddingProvider = new TrackingEmbeddingProvider();
48
+ const core = new RetrievalCore(store, new InMemoryQueryCache(), {
49
+ embeddingProvider,
50
+ embeddingDescriptor: {
51
+ provider: "test",
52
+ model: "tracking",
53
+ dimensions: 3
54
+ },
55
+ indexPrepConcurrency: 2,
56
+ indexPrepWindowSize: 2
57
+ });
58
+
59
+ await store.upsertWorkspace({
60
+ workspace_id: "ws-prep-a",
61
+ tenant_id: "tenant-prep",
62
+ name: "prep-a",
63
+ project_root_path: "/workspace/prep-a"
64
+ });
65
+
66
+ const tracker = startTrackingUpsertOrder(store);
67
+ try {
68
+ await core.indexArtifact({
69
+ tenant_id: "tenant-prep",
70
+ workspace_id: "ws-prep-a",
71
+ index_version: "idx-prep-a-v1",
72
+ files: [
73
+ { path: "src/a.ts", language: "typescript", content: "export const lowerA = 1;\n" },
74
+ { path: "src/B.ts", language: "typescript", content: "export const upperB = 2;\n" },
75
+ { path: "src/c.ts", language: "typescript", content: "export const lowerC = 3;\n" }
76
+ ]
77
+ });
78
+ } finally {
79
+ tracker.restore();
80
+ }
81
+
82
+ expect(embeddingProvider.max_in_flight).toBeGreaterThanOrEqual(2);
83
+ expect(embeddingProvider.max_in_flight).toBeLessThanOrEqual(2);
84
+ expect(tracker.order).toEqual(["src/B.ts", "src/a.ts", "src/c.ts"]);
85
+ });
86
+
87
+ it("applies the same bounded deterministic prep path for indexArtifactDelta", async () => {
88
+ const store = new InMemoryIndexStore();
89
+ const embeddingProvider = new TrackingEmbeddingProvider();
90
+ const core = new RetrievalCore(store, new InMemoryQueryCache(), {
91
+ embeddingProvider,
92
+ embeddingDescriptor: {
93
+ provider: "test",
94
+ model: "tracking",
95
+ dimensions: 3
96
+ },
97
+ indexPrepConcurrency: 2,
98
+ indexPrepWindowSize: 2
99
+ });
100
+
101
+ await store.upsertWorkspace({
102
+ workspace_id: "ws-prep-b",
103
+ tenant_id: "tenant-prep",
104
+ name: "prep-b",
105
+ project_root_path: "/workspace/prep-b"
106
+ });
107
+
108
+ await core.indexArtifact({
109
+ tenant_id: "tenant-prep",
110
+ workspace_id: "ws-prep-b",
111
+ index_version: "idx-prep-b-v1",
112
+ files: [
113
+ { path: "src/a.ts", language: "typescript", content: "export const lowerA = 1;\n" },
114
+ { path: "src/B.ts", language: "typescript", content: "export const upperB = 2;\n" },
115
+ { path: "src/c.ts", language: "typescript", content: "export const lowerC = 3;\n" }
116
+ ]
117
+ });
118
+
119
+ embeddingProvider.reset();
120
+ const tracker = startTrackingUpsertOrder(store);
121
+ try {
122
+ await core.indexArtifactDelta({
123
+ tenant_id: "tenant-prep",
124
+ workspace_id: "ws-prep-b",
125
+ index_version: "idx-prep-b-v2",
126
+ base_index_version: "idx-prep-b-v1",
127
+ upsert_files: [
128
+ { path: "src/a.ts", language: "typescript", content: "export const lowerA = 10;\n" },
129
+ { path: "src/Z.ts", language: "typescript", content: "export const upperZ = 20;\n" },
130
+ { path: "src/B.ts", language: "typescript", content: "export const upperB = 30;\n" }
131
+ ],
132
+ deleted_paths: []
133
+ });
134
+ } finally {
135
+ tracker.restore();
136
+ }
137
+
138
+ expect(embeddingProvider.max_in_flight).toBeGreaterThanOrEqual(2);
139
+ expect(embeddingProvider.max_in_flight).toBeLessThanOrEqual(2);
140
+ expect(tracker.order).toEqual(["src/B.ts", "src/Z.ts", "src/a.ts"]);
141
+ });
142
+ });
@@ -0,0 +1,508 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
2
+ import { newDb } from "pg-mem";
3
+ import { InMemoryQueryCache, PostgresIndexRepository } from "@cue-dev/data-plane";
4
+ import { DeterministicEmbeddingProvider, RetrievalCore, RetrievalError, type RerankerProvider } from "../src/index.js";
5
+
6
+ describe("retrieval-core postgres integration", () => {
7
+ let repository: PostgresIndexRepository;
8
+ let close: () => Promise<void>;
9
+
10
+ beforeEach(async () => {
11
+ const db = newDb({ autoCreateForeignKeyIndices: true });
12
+ const { Pool } = db.adapters.createPg();
13
+ const pool = new Pool();
14
+
15
+ repository = new PostgresIndexRepository(pool, {
16
+ preferPgVector: false,
17
+ chunkEmbeddingDimensions: 24
18
+ });
19
+ await repository.migrate();
20
+
21
+ close = async () => {
22
+ await pool.end();
23
+ };
24
+ });
25
+
26
+ afterEach(async () => {
27
+ await close();
28
+ });
29
+
30
+ async function seedRerankerFixture(): Promise<void> {
31
+ await repository.upsertWorkspace({
32
+ workspace_id: "ws-a",
33
+ tenant_id: "tenant-a",
34
+ name: "workspace-a",
35
+ project_root_path: "/workspace/a"
36
+ });
37
+
38
+ const writer = new RetrievalCore(repository, new InMemoryQueryCache());
39
+ await writer.indexArtifact({
40
+ tenant_id: "tenant-a",
41
+ workspace_id: "ws-a",
42
+ index_version: "idx-reranker",
43
+ files: [
44
+ {
45
+ path: "src/primary.ts",
46
+ language: "typescript",
47
+ content: "export function selectPrimaryTenant(id: string) { return `primary:${id}`; }"
48
+ },
49
+ {
50
+ path: "src/secondary.ts",
51
+ language: "typescript",
52
+ content: "export function selectSecondaryTenant(id: string) { return `secondary:${id}`; }"
53
+ },
54
+ {
55
+ path: "src/helper.ts",
56
+ language: "typescript",
57
+ content: "export function tenantLookupHelper(id: string) { return selectPrimaryTenant(id); }"
58
+ }
59
+ ]
60
+ });
61
+ }
62
+
63
+ it("handles indexing lifecycle with added/modified/deleted and secret exclusion", async () => {
64
+ await repository.upsertWorkspace({
65
+ workspace_id: "ws-a",
66
+ tenant_id: "tenant-a",
67
+ name: "workspace-a",
68
+ project_root_path: "/workspace/a"
69
+ });
70
+
71
+ const core = new RetrievalCore(repository, new InMemoryQueryCache());
72
+
73
+ const reportV1 = await core.indexArtifact({
74
+ tenant_id: "tenant-a",
75
+ workspace_id: "ws-a",
76
+ index_version: "idx-v1",
77
+ files: [
78
+ {
79
+ path: "src/app.ts",
80
+ language: "typescript",
81
+ content: "export function add(a: number, b: number) { return a + b; }"
82
+ },
83
+ {
84
+ path: "src/utils.ts",
85
+ language: "typescript",
86
+ content: "export function clamp(v: number) { return Math.max(0, v); }"
87
+ },
88
+ {
89
+ path: "src/secrets.env",
90
+ content: "AWS_ACCESS_KEY_ID=AKIAABCDEFGHIJKLMNOP"
91
+ }
92
+ ]
93
+ });
94
+
95
+ expect(reportV1.counts.added).toBe(2);
96
+ expect(reportV1.counts.skipped).toBe(1);
97
+ expect(reportV1.warnings[0]?.category).toBe("secret_exclusion");
98
+
99
+ const readyAfterV1 = await repository.getLatestReadyIndex({
100
+ tenant_id: "tenant-a",
101
+ workspace_id: "ws-a"
102
+ });
103
+ expect(readyAfterV1).toBeDefined();
104
+ const metadataV1 = await repository.getIndexMetadata?.({
105
+ tenant_id: "tenant-a",
106
+ index_id: readyAfterV1!.index_id
107
+ });
108
+ expect(metadataV1?.chunking_strategy).toBe("language_aware");
109
+ expect(metadataV1?.embedding_provider).toBe("deterministic");
110
+ expect(metadataV1?.embedding_model).toBe("pseudo-sha256");
111
+ expect(metadataV1?.embedding_dimensions).toBe(24);
112
+
113
+ const reportV2 = await core.indexArtifact({
114
+ tenant_id: "tenant-a",
115
+ workspace_id: "ws-a",
116
+ index_version: "idx-v2",
117
+ files: [
118
+ {
119
+ path: "src/app.ts",
120
+ language: "typescript",
121
+ content: "export function add(a: number, b: number) { return a + b + 1; }"
122
+ },
123
+ {
124
+ path: "src/new.ts",
125
+ language: "typescript",
126
+ content: "export function multiply(a: number, b: number) { return a * b; }"
127
+ },
128
+ {
129
+ path: "src/secrets.env",
130
+ content: "Bearer abcdefghijklmnopqrstuvwxyz12345"
131
+ }
132
+ ]
133
+ });
134
+
135
+ expect(reportV2.counts.modified).toBe(1);
136
+ expect(reportV2.counts.added).toBe(1);
137
+ expect(reportV2.counts.deleted).toBe(1);
138
+ expect(reportV2.counts.skipped).toBe(1);
139
+
140
+ const search = await core.searchContext({
141
+ trace_id: "trc-test",
142
+ tenant_id: "tenant-a",
143
+ workspace_id: "ws-a",
144
+ request: {
145
+ project_root_path: "/workspace/a",
146
+ query: "multiply function",
147
+ top_k: 8
148
+ }
149
+ });
150
+
151
+ expect(search.search_metadata.index_version).toBe("idx-v2");
152
+ expect(search.results.some((row) => row.path === "src/new.ts")).toBe(true);
153
+ });
154
+
155
+ it("serves retrieval from persisted index across retrieval-core instances", async () => {
156
+ await repository.upsertWorkspace({
157
+ workspace_id: "ws-a",
158
+ tenant_id: "tenant-a",
159
+ name: "workspace-a",
160
+ project_root_path: "/workspace/a"
161
+ });
162
+
163
+ const writer = new RetrievalCore(repository, new InMemoryQueryCache());
164
+ await writer.indexArtifact({
165
+ tenant_id: "tenant-a",
166
+ workspace_id: "ws-a",
167
+ index_version: "idx-v1",
168
+ files: [
169
+ {
170
+ path: "src/db.ts",
171
+ language: "typescript",
172
+ content: "export const DB_NAME = 'primary';"
173
+ }
174
+ ]
175
+ });
176
+
177
+ const reader = new RetrievalCore(repository, new InMemoryQueryCache());
178
+ const result = await reader.searchContext({
179
+ trace_id: "trc-read",
180
+ tenant_id: "tenant-a",
181
+ workspace_id: "ws-a",
182
+ request: {
183
+ project_root_path: "/workspace/a",
184
+ query: "DB_NAME",
185
+ top_k: 8
186
+ }
187
+ });
188
+
189
+ expect(result.results.length).toBeGreaterThan(0);
190
+ expect(result.results[0]?.path).toBe("src/db.ts");
191
+ });
192
+
193
+ it("enforces tenant isolation on retrieval", async () => {
194
+ await repository.upsertWorkspace({
195
+ workspace_id: "ws-a",
196
+ tenant_id: "tenant-a",
197
+ name: "workspace-a",
198
+ project_root_path: "/workspace/a"
199
+ });
200
+ await repository.upsertWorkspace({
201
+ workspace_id: "ws-b",
202
+ tenant_id: "tenant-b",
203
+ name: "workspace-b",
204
+ project_root_path: "/workspace/b"
205
+ });
206
+
207
+ const core = new RetrievalCore(repository, new InMemoryQueryCache());
208
+
209
+ await core.indexArtifact({
210
+ tenant_id: "tenant-a",
211
+ workspace_id: "ws-a",
212
+ index_version: "idx-a1",
213
+ files: [{ path: "src/a.ts", content: "export const TENANT_A = true;" }]
214
+ });
215
+
216
+ await core.indexArtifact({
217
+ tenant_id: "tenant-b",
218
+ workspace_id: "ws-b",
219
+ index_version: "idx-b1",
220
+ files: [{ path: "src/b.ts", content: "export const TENANT_B = true;" }]
221
+ });
222
+
223
+ const tenantBSearch = await core.searchContext({
224
+ trace_id: "trc-b",
225
+ tenant_id: "tenant-b",
226
+ workspace_id: "ws-b",
227
+ request: {
228
+ project_root_path: "/workspace/b",
229
+ query: "TENANT_B",
230
+ top_k: 8
231
+ }
232
+ });
233
+ expect(tenantBSearch.results[0]?.path).toBe("src/b.ts");
234
+
235
+ await expect(
236
+ core.searchContext({
237
+ trace_id: "trc-cross",
238
+ tenant_id: "tenant-b",
239
+ workspace_id: "ws-a",
240
+ request: {
241
+ project_root_path: "/workspace/a",
242
+ query: "TENANT_A",
243
+ top_k: 8
244
+ }
245
+ })
246
+ ).rejects.toMatchObject({
247
+ code: "NOT_FOUND"
248
+ } satisfies Partial<RetrievalError>);
249
+ });
250
+
251
+ it("persists configured embedding metadata on index finalize", async () => {
252
+ await repository.upsertWorkspace({
253
+ workspace_id: "ws-a",
254
+ tenant_id: "tenant-a",
255
+ name: "workspace-a",
256
+ project_root_path: "/workspace/a"
257
+ });
258
+
259
+ const core = new RetrievalCore(repository, new InMemoryQueryCache(), {
260
+ embeddingProvider: new DeterministicEmbeddingProvider({
261
+ model: "pseudo-sha256-custom",
262
+ dimensions: 32,
263
+ version: "v2"
264
+ })
265
+ });
266
+
267
+ await core.indexArtifact({
268
+ tenant_id: "tenant-a",
269
+ workspace_id: "ws-a",
270
+ index_version: "idx-meta",
271
+ files: [{ path: "src/a.ts", content: "export const A = 1;" }]
272
+ });
273
+
274
+ const latest = await repository.getLatestReadyIndex({
275
+ tenant_id: "tenant-a",
276
+ workspace_id: "ws-a"
277
+ });
278
+ expect(latest).toBeDefined();
279
+ const metadata = await repository.getIndexMetadata?.({
280
+ tenant_id: "tenant-a",
281
+ index_id: latest!.index_id
282
+ });
283
+ expect(metadata?.embedding_provider).toBe("deterministic");
284
+ expect(metadata?.embedding_model).toBe("pseudo-sha256-custom");
285
+ expect(metadata?.embedding_dimensions).toBe(32);
286
+ expect(metadata?.embedding_version).toBe("v2");
287
+ });
288
+
289
+ it("returns INVALID_ARGUMENT when query embedding config is incompatible with latest ready index", async () => {
290
+ await repository.upsertWorkspace({
291
+ workspace_id: "ws-a",
292
+ tenant_id: "tenant-a",
293
+ name: "workspace-a",
294
+ project_root_path: "/workspace/a"
295
+ });
296
+
297
+ const writer = new RetrievalCore(repository, new InMemoryQueryCache());
298
+ await writer.indexArtifact({
299
+ tenant_id: "tenant-a",
300
+ workspace_id: "ws-a",
301
+ index_version: "idx-v1",
302
+ files: [{ path: "src/a.ts", content: "export const A = 1;" }]
303
+ });
304
+
305
+ const request = {
306
+ trace_id: "trc-mismatch",
307
+ tenant_id: "tenant-a",
308
+ workspace_id: "ws-a",
309
+ request: {
310
+ project_root_path: "/workspace/a",
311
+ query: "A constant",
312
+ top_k: 5
313
+ }
314
+ } as const;
315
+
316
+ const cases = [
317
+ {
318
+ name: "provider mismatch",
319
+ options: {
320
+ embeddingDescriptor: {
321
+ provider: "openai_compatible",
322
+ model: "Qwen/Qwen3-Embedding-4B",
323
+ dimensions: 24
324
+ }
325
+ }
326
+ },
327
+ {
328
+ name: "model mismatch",
329
+ options: {
330
+ embeddingDescriptor: {
331
+ provider: "deterministic",
332
+ model: "pseudo-sha256-v2",
333
+ dimensions: 24
334
+ }
335
+ }
336
+ },
337
+ {
338
+ name: "dimension mismatch",
339
+ options: {
340
+ embeddingDescriptor: {
341
+ provider: "deterministic",
342
+ model: "pseudo-sha256",
343
+ dimensions: 64
344
+ }
345
+ }
346
+ }
347
+ ] as const;
348
+
349
+ for (const testCase of cases) {
350
+ const reader = new RetrievalCore(repository, new InMemoryQueryCache(), testCase.options);
351
+ await expect(reader.searchContext(request)).rejects.toMatchObject({
352
+ code: "INVALID_ARGUMENT"
353
+ } satisfies Partial<RetrievalError>);
354
+ await expect(reader.searchContext(request)).rejects.toThrow(/reindex required/i);
355
+ }
356
+ });
357
+
358
+ it("applies reranker ordering to top-N candidates and avoids cache collisions with deterministic mode", async () => {
359
+ await seedRerankerFixture();
360
+
361
+ const request = {
362
+ trace_id: "trc-rerank-success",
363
+ tenant_id: "tenant-a",
364
+ workspace_id: "ws-a",
365
+ request: {
366
+ project_root_path: "/workspace/a",
367
+ query: "select tenant helper",
368
+ top_k: 3
369
+ }
370
+ } as const;
371
+
372
+ const sharedCache = new InMemoryQueryCache();
373
+ const baselineCore = new RetrievalCore(repository, sharedCache);
374
+ const baseline = await baselineCore.searchContext(request);
375
+ expect(baseline.results.length).toBeGreaterThanOrEqual(2);
376
+
377
+ let rerankCalls = 0;
378
+ const rerankerProvider: RerankerProvider = {
379
+ describe: () => ({
380
+ provider: "test_stub",
381
+ model: "swap-top-two"
382
+ }),
383
+ rerank: async () => {
384
+ rerankCalls += 1;
385
+ return [
386
+ { index: 1, relevance_score: 0.99 },
387
+ { index: 0, relevance_score: 0.98 }
388
+ ];
389
+ }
390
+ };
391
+
392
+ const rerankCore = new RetrievalCore(repository, sharedCache, {
393
+ rerankerProvider,
394
+ rerankerTopN: 2
395
+ });
396
+ const reranked = await rerankCore.searchContext({
397
+ ...request,
398
+ trace_id: "trc-rerank-success-enabled"
399
+ });
400
+
401
+ expect(rerankCalls).toBe(1);
402
+ expect(reranked.results[0]?.path).toBe(baseline.results[1]?.path);
403
+ });
404
+
405
+ it("falls back to deterministic ranking on reranker timeout", async () => {
406
+ await seedRerankerFixture();
407
+
408
+ const request = {
409
+ trace_id: "trc-rerank-timeout",
410
+ tenant_id: "tenant-a",
411
+ workspace_id: "ws-a",
412
+ request: {
413
+ project_root_path: "/workspace/a",
414
+ query: "select tenant helper",
415
+ top_k: 3
416
+ }
417
+ } as const;
418
+
419
+ const baselineCore = new RetrievalCore(repository, new InMemoryQueryCache());
420
+ const baseline = await baselineCore.searchContext(request);
421
+
422
+ const timeoutReranker: RerankerProvider = {
423
+ describe: () => ({
424
+ provider: "test_stub",
425
+ model: "timeout"
426
+ }),
427
+ rerank: async () => {
428
+ throw new Error("request timed out after 250ms");
429
+ }
430
+ };
431
+ const rerankCore = new RetrievalCore(repository, new InMemoryQueryCache(), {
432
+ rerankerProvider: timeoutReranker,
433
+ rerankerTopN: 3
434
+ });
435
+ const timeoutResult = await rerankCore.searchContext({
436
+ ...request,
437
+ trace_id: "trc-rerank-timeout-enabled"
438
+ });
439
+
440
+ expect(timeoutResult.results.map((row) => row.path)).toEqual(baseline.results.map((row) => row.path));
441
+ });
442
+
443
+ it("falls back to deterministic ranking on reranker upstream failures", async () => {
444
+ await seedRerankerFixture();
445
+
446
+ const request = {
447
+ trace_id: "trc-rerank-upstream",
448
+ tenant_id: "tenant-a",
449
+ workspace_id: "ws-a",
450
+ request: {
451
+ project_root_path: "/workspace/a",
452
+ query: "select tenant helper",
453
+ top_k: 3
454
+ }
455
+ } as const;
456
+
457
+ const baselineCore = new RetrievalCore(repository, new InMemoryQueryCache());
458
+ const baseline = await baselineCore.searchContext(request);
459
+
460
+ const failingReranker: RerankerProvider = {
461
+ describe: () => ({
462
+ provider: "test_stub",
463
+ model: "upstream"
464
+ }),
465
+ rerank: async () => {
466
+ throw new Error("HTTP 503 service unavailable");
467
+ }
468
+ };
469
+ const rerankCore = new RetrievalCore(repository, new InMemoryQueryCache(), {
470
+ rerankerProvider: failingReranker,
471
+ rerankerTopN: 3
472
+ });
473
+ const failedResult = await rerankCore.searchContext({
474
+ ...request,
475
+ trace_id: "trc-rerank-upstream-enabled"
476
+ });
477
+
478
+ expect(failedResult.results.map((row) => row.path)).toEqual(baseline.results.map((row) => row.path));
479
+ });
480
+
481
+ it("keeps deterministic baseline behavior when reranker is disabled", async () => {
482
+ await seedRerankerFixture();
483
+
484
+ const request = {
485
+ trace_id: "trc-rerank-disabled",
486
+ tenant_id: "tenant-a",
487
+ workspace_id: "ws-a",
488
+ request: {
489
+ project_root_path: "/workspace/a",
490
+ query: "select tenant helper",
491
+ top_k: 3
492
+ }
493
+ } as const;
494
+
495
+ const baselineCore = new RetrievalCore(repository, new InMemoryQueryCache());
496
+ const baseline = await baselineCore.searchContext(request);
497
+
498
+ const disabledRerankCore = new RetrievalCore(repository, new InMemoryQueryCache(), {
499
+ rerankerTopN: 5
500
+ });
501
+ const disabled = await disabledRerankCore.searchContext({
502
+ ...request,
503
+ trace_id: "trc-rerank-disabled-explicit"
504
+ });
505
+
506
+ expect(disabled.results.map((row) => row.path)).toEqual(baseline.results.map((row) => row.path));
507
+ });
508
+ });