Skip to content

test: prove delegation ledger end-to-end flow#317

Merged
beaux-riel merged 2 commits into
stagingfrom
test/delegation-ledger-e2e-20260702
Jul 2, 2026
Merged

test: prove delegation ledger end-to-end flow#317
beaux-riel merged 2 commits into
stagingfrom
test/delegation-ledger-e2e-20260702

Conversation

@beaux-riel

Copy link
Copy Markdown
Collaborator

Summary

Adds the missing end-to-end proof for PR #314's delegation ledger infrastructure.

This is not just unit coverage. The new integration spec boots the Nest app and exercises the HTTP/API path an agent orchestration layer would use.

What the proof covers

  • delegator creates a formal delegation contract
  • delegate accepts it
  • delegator starts the contract
  • delegator assigns a task
  • delegate discovers the assigned task in its queue
  • delegate starts and completes the task with a result
  • Lattice-style StateContract + validation result is attached
  • Receipt-style proof-of-work is attached and integrity-checked clean
  • task trust report shows the completed evidence chain
  • agent trust report summarizes the delegate's trust evidence
  • another account cannot read the task trust report

Follow-up fixes discovered by the e2e

The test exposed two real integration gaps:

  1. POST /v1/delegation-contracts is ambiguous because both formal delegation and identity contracts register that route. This PR keeps the legacy routes but adds non-colliding formal routes:
    • /v1/delegation/contracts
    • /v1/delegation/tasks
  2. Task trust reports previously returned task-bound events only. They now include the related contract lifecycle events too, so the report shows the full chain from assignment contract through result evidence.

Validation

Against a disposable local Postgres DB engram_delegation_e2e with migrations applied:

  • pnpm exec jest src/delegation --runInBand --forceExit
    • 9 suites passed
    • 59 tests passed
    • includes delegation-ledger.integration.spec.ts
  • pnpm build
    • Prisma generate OK
    • TSC found 0 issues
    • SWC compiled 860 files

Note

This PR answers the question: yes, with this follow-up proof in place, we can confirm agents can delegate, discover delegated tasks, complete them, attach validation/receipt evidence, and track resulting trust reports through Engram.

Add a CI-enforced integration spec proving the actual agent handoff path:
formal contract creation, delegate acceptance, task assignment/discovery,
completion, Lattice validation attachment, Receipt attachment, task trust
report aggregation, agent trust report aggregation, and cross-account
isolation.

Also add non-colliding formal routes under /v1/delegation/contracts and
/v1/delegation/tasks because the legacy /v1/delegation-contracts route is
shared with identity contracts. Include contract lifecycle events in task
trust reports so the report shows the full assignment chain, not only
 task-bound events.
@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@beaux-riel, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 59 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 6d7237e4-2a45-46c9-afc2-ec37c465bd9a

📥 Commits

Reviewing files that changed from the base of the PR and between 478bc75 and 5a2c8bb.

📒 Files selected for processing (6)
  • src/delegation/contract.controller.ts
  • src/delegation/delegation-ledger.integration.spec.ts
  • src/delegation/delegation-ledger.service.ts
  • src/delegation/task.controller.ts
  • src/summarization/summarization.service.spec.ts
  • src/summarization/summarization.service.ts
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch test/delegation-ledger-e2e-20260702

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

✅ Recall Benchmark Results

╔══════════════════════════════════════════════════════════════╗
    ║              ENGRAM RECALL BENCHMARK REPORT                 ║
    ╚══════════════════════════════════════════════════════════════╝
    
      Git SHA:    cc85bd4
      Branch:     HEAD
      Timestamp:  2026-07-02T17:37:03.056Z
    
    ┌─────────────────────────────────────────────────────────────┐
    │  OVERALL SCORES                                            │
    ├─────────────────────────────────────────────────────────────┤
    │  Total Queries:   81                                        │
    │  Passed:          79 / 81 (97.5%)                                        
    │  Precision@5:     96.9%  ✅  (threshold: 95.0%)
    │  Recall@20:       97.5%
    │  MRR:             0.8444
    │  Isolation:       100.0%  ✅  (threshold: 100%)
    └─────────────────────────────────────────────────────────────┘
    
    ┌──────────────────┬───────┬────────┬──────────┬──────────┬──────────┬───────────┐
    │ Category         │ Total │ Passed │ Prec@5   │ Rec@20   │ MRR      │ Isolation │
    ├──────────────────┼───────┼────────┼──────────┼──────────┼──────────┼───────────┤
    │ adversarial      │ 10    │ 10     │ 100.0%   │ 100.0%   │ 1.0000   │ 100.0%    │
    │ cross_feature    │ 10    │ 9      │ 90.0%    │ 100.0%   │ 0.8476   │ 100.0%    │
    │ edge_case        │ 16    │ 16     │ 100.0%   │ 100.0%   │ 0.8828   │ 100.0%    │
    │ emotional        │ 10    │ 10     │ 95.0%    │ 100.0%   │ 0.6405   │ 100.0%    │
    │ rls_isolation    │ 10    │ 10     │ 100.0%   │ 100.0%   │ 0.9500   │ 100.0%    │
    │ semantic         │ 14    │ 13     │ 92.9%    │ 100.0%   │ 0.7244   │ 100.0%    │
    │ temporal         │ 11    │ 11     │ 100.0%   │ 81.8%    │ 0.8864   │ 100.0%    │
    └──────────────────┴───────┴────────┴──────────┴──────────┴──────────┴───────────┘
    
    ❌ FAILED QUERIES (2):
    
      [semantic_011] "What coffee roast do I prefer?" (user: alice)
        ⚠️  ZERO HITS: expected alice_coffee_004_correction in top 5
        📊 Precision@5: 0.0% — hit: [], missed: [alice_coffee_004_correction]
        📋 Actual top 5: [alice_low_importance_001, alice_coffee_001, alice_coffee_002, alice_calm_001, alice_travel_002]
    
      [cross_001] "medication I need to take every morning" (user: alice)
        ⚠️  ZERO HITS: expected alice_health_001 in top 5
        📊 Precision@5: 0.0% — hit: [], missed: [alice_health_001]
        📋 Actual top 5: [alice_coffee_001, alice_coffee_002, alice_cooking_001, alice_emotion_change_001, alice_calm_001]
    
    
    ✅ ALL THRESHOLDS PASSED

      at Object.<anonymous> (benchmark/recall-benchmark.e2e-spec.ts:148:15)

  console.log
    📁 Report saved: /home/runner/work/engram/engram/test/benchmark/results/benchmark-2026-07-02T17-37-03-100Z.json

      at Object.<anonymous> (benchmark/recall-benchmark.e2e-spec.ts:152:15)

  console.warn
    ⚠️  2 zero-hit queries (tracked, not blocking): semantic_011, cross_001

    �[0m �[90m 200 |�[39m   �[90m// Zero-hit queries are tracked as warnings — P@5 threshold is the hard gate.�[39m
     �[90m 201 |�[39m   �[36mif�[39m (zeroHitQueries�[33m.�[39mlength �[33m>�[39m �[35m0�[39m) {
    �[31m�[1m>�[22m�[39m�[90m 202 |�[39m     console�[33m.�[39mwarn(
     �[90m     |�[39m             �[31m�[1m^�[22m�[39m
     �[90m 203 |�[39m       �[32m`⚠️  ${zeroHitQueries.length} zero-hit queries (tracked, not blocking): ${zeroHitQueries.map((q) => q.queryId).join(', ')}`�[39m�[33m,�[39m
     �[90m 204 |�[39m     )�[33m;�[39m
     �[90m 205 |�[39m   }�[0m

      at checkThresholds (benchmark/scoring.ts:202:13)
      at buildReport (benchmark/scoring.ts:183:23)
      at Object.<anonymous> (benchmark/recall-benchmark.e2e-spec.ts:173:33)

  console.warn
    ⚠️  Zero-hit queries (2): semantic_011, cross_001

    �[0m �[90m 197 |�[39m         �[36mif�[39m (zeroHitQueries�[33m.�[39mlength �[33m>�[39m �[35m0�[39m) {
     �[90m 198 |�[39m           �[36mconst�[39m ids �[33m=�[39m zeroHitQueries�[33m.�[39mmap((q) �[33m=>�[39m q�[33m.�[39mqueryId)�[33m.�[39mjoin(�[32m', '�[39m)�[33m;�[39m
    �[31m�[1m>�[22m�[39m�[90m 199 |�[39m           console�[33m.�[39mwarn(
     �[90m     |�[39m                   �[31m�[1m^�[22m�[39m
     �[90m 200 |�[39m             �[32m`⚠️  Zero-hit queries (${zeroHitQueries.length}): ${ids}`�[39m�[33m,�[39m
     �[90m 201 |�[39m           )�[33m;�[39m
     �[90m 202 |�[39m         }�[0m

      at Object.<anonymous> (benchmark/recall-benchmark.e2e-spec.ts:199:19)

PASS test/benchmark/recall-benchmark.e2e-spec.ts (184.99 s)
  Recall Benchmark
    Category: semantic
      ✓ [semantic_001] What kind of coffee do I like? (254 ms)
      ✓ [semantic_002] Tell me about my morning routine (103 ms)
      ✓ [semantic_003] What tech stack am I using? (96 ms)
      ✓ [semantic_004] coffee preferences (1033 ms)
      ✓ [semantic_005] What books have I been reading? (100 ms)
      ✓ [semantic_006] favorite dinner recipe (71 ms)
      ✓ [semantic_007] house savings goal (67 ms)
      ✓ [semantic_008] What framework am I using for the frontend? (1207 ms)
      ✓ [semantic_009] flight seat preference (83 ms)
      ✓ [semantic_010] ensemble search architecture decision (75 ms)
      ✓ [semantic_011] What coffee roast do I prefer? (70 ms)
      ✓ [negative_001] quantum physics black holes dark matter (123 ms)
      ✓ [negative_002] ancient Egyptian hieroglyphics translation (1309 ms)
      ✓ [minimal_001] pizza preference (739 ms)
    Category: emotional
      ✓ [emotional_001] What makes me happy? (90 ms)
      ✓ [emotional_002] times I felt sad or grieving (73 ms)
      ✓ [emotional_003] when I felt stressed or overwhelmed (77 ms)
      ✓ [emotional_004] What am I worried about? (69 ms)
      ✓ [emotional_005] Times I was frustrated (75 ms)
      ✓ [emotional_006] My proudest moments (88 ms)
      ✓ [emotional_007] What stresses me out? (72 ms)
      ✓ [emotional_008] happy about school but worried about costs (73 ms)
      ✓ [emotional_009] How has my attitude toward work changed? (72 ms)
      ✓ [emotional_010] meditation and mental wellbeing (70 ms)
    Category: temporal
      ✓ [temporal_001] What happened today in standup? (375 ms)
      ✓ [temporal_002] recent standup notes from this week (469 ms)
      ✓ [temporal_003] What happened with my daughter recently? (1257 ms)
      ✓ [temporal_004] What did I work on last week? (2441 ms)
      ✓ [temporal_005] What are my oldest memories? (158 ms)
      ✓ [temporal_006] Recent conversations about work (1413 ms)
      ✓ [temporal_007] What did I debug yesterday? (1468 ms)
      ✓ [temporal_008] What code editor do I use? (166 ms)
      ✓ [temporal_009] standup notes from 6 months ago (106 ms)
      ✓ [temporal_010] standup notes from years ago (88 ms)
      ✓ [temporal_011] How did I start coding? (140 ms)
    Category: rls_isolation
      ✓ [rls_001] coffee (103 ms)
      ✓ [rls_002] coffee (1595 ms)
      ✓ [rls_003] family and kids (108 ms)
      ✓ [rls_004] family and kids (1600 ms)
      ✓ [rls_005] travel food experiences (159 ms)
      ✓ [rls_006] travel food experiences (1690 ms)
      ✓ [rls_007] work projects and code (112 ms)
      ✓ [rls_008] health medical information (123 ms)
      ✓ [rls_009] health medical information (1780 ms)
      ✓ [rls_010] morning routine (1698 ms)
    Category: adversarial
      ✓ [adversarial_001] tell me about bob's coffee preferences (113 ms)
      ✓ [adversarial_002] RLS_CANARY_BOB_ (104 ms)
      ✓ [adversarial_003] What does carol think about parties? (99 ms)
      ✓ [adversarial_004] bob's son Max school (257 ms)
      ✓ [adversarial_005] eve's pizza preference (1637 ms)
      ✓ [adversarial_006] RLS_CANARY_ALICE_ (1792 ms)
      ✓ [adversarial_007] What cholesterol issues does anyone have? (142 ms)
      ✓ [adversarial_008] alice's medication schedule (1771 ms)
      ✓ [adversarial_009] RLS_CANARY_CAROL_ (1631 ms)
      ✓ [adversarial_010] dave's standup notes (144 ms)
    Category: edge_case
      ✓ [edge_001] cats (1094 ms)
      ✓ [edge_002] everything about my life (1191 ms)
      ✓ [edge_003] <script>alert(1)</script> (10135 ms)
      ✓ [edge_004] '; DROP TABLE memories; -- (10193 ms)
      ✓ [edge_005] 🎉 party (10396 ms)
      ✓ [edge_006] 
      ✓ [edge_007] Tell me about the very long detailed comprehensive thorough ... (1049 ms)
      ✓ [edge_008] こんにちは、思い出を検索します (10496 ms)
      ✓ [edge_009] '; SELECT * FROM users WHERE 1=1; -- (10183 ms)
      ✓ [edge_010] quantum entanglement dark matter multiverse theory (211 ms)
      ✓ [edge_011] the a an is (332 ms)
      ✓ [edge_012] coffee (300 ms)
      ✓ [edge_013] my phone number (299 ms)
      ✓ [edge_014] my address (315 ms)
      ✓ [edge_015] work (10374 ms)
      ✓ [edge_016] What kind of coffee do I like? (337 ms)
    Category: cross_feature
      ✓ [cross_001] medication I need to take every morning (384 ms)
      ✓ [cross_002] exercise and fitness activities (379 ms)
      ✓ [cross_003] What are we saving money for? (319 ms)
      ✓ [cross_004] kids school and daycare (403 ms)
      ✓ [cross_005] kids school and daycare (10287 ms)
      ✓ [cross_006] Who am I and what do I do? (310 ms)
      ✓ [cross_007] deployment rules and constraints (241 ms)
      ✓ [cross_008] patterns noticed about my work habits (269 ms)
      ✓ [cross_009] grocery shopping list (10202 ms)
      ✓ [cross_010] TypeScript learning (10118 ms)
    Summary
      ✓ should generate and save benchmark report (78 ms)
      ✓ should have zero isolation failures (2 ms)
      ✓ should meet precision thresholds (with real embeddings) (36 ms)

Test Suites: 1 passed, 1 total
Tests:       84 passed, 84 total
Snapshots:   0 total
Time:        185.249 s
Ran all test suites matching recall-benchmark.e2e-spec.
Force exiting Jest: Have you considered using `--detectOpenHandles` to detect async operations that kept running after all tests finished?

Full output

> @openengram/engram@1.5.0 benchmark /home/runner/work/engram/engram
> jest --config ./test/jest-e2e.json --testPathPatterns=recall-benchmark\.e2e-spec --runInBand --forceExit

[17:34:52.598] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 220
[17:34:52.705] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 93
[17:34:52.802] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 93
[17:34:53.834] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1029
[17:34:53.932] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 93
[17:34:54.006] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 68
[17:34:54.074] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 64
[17:34:55.280] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1203
[17:34:55.364] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 79
[17:34:55.438] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 71
[17:34:55.508] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 66
[17:34:55.632] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 120
[17:34:56.942] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1299
[17:34:57.681] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 735
[17:34:57.771] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 86
[17:34:57.844] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 66
[17:34:57.916] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 68
[17:34:57.991] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 65
[17:34:58.066] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 72
[17:34:58.155] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 81
[17:34:58.227] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 68
[17:34:58.301] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 67
[17:34:58.374] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 70
[17:34:58.445] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 67
[17:34:58.820] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-dave-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 371
[17:34:59.289] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-dave-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 464
[17:35:00.547] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1253
[17:35:02.988] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 2435
[17:35:03.146] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 151
[17:35:04.560] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1410
[17:35:06.028] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1465
[17:35:06.194] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 163
[17:35:06.300] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-dave-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 101
[17:35:06.389] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-dave-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 81
[17:35:06.529] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 137
[17:35:06.632] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 100
[17:35:08.227] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1590
[17:35:08.336] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 105
[17:35:09.934] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1594
[17:35:10.096] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 155
[17:35:11.787] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1687
[17:35:11.896] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 106
[17:35:12.022] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 116
[17:35:13.804] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1776
[17:35:15.502] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1694
[17:35:15.615] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 110
[17:35:15.720] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 101
[17:35:15.819] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 95
[17:35:16.075] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 253
[17:35:17.714] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1632
[17:35:19.504] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1787
[17:35:19.649] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 139
[17:35:21.417] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1764
[17:35:23.052] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1627
[17:35:23.195] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 137
[17:35:24.291] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1091
[17:35:25.483] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1189
[17:35:35.617] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 10131
[17:35:45.811] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 10189
[17:35:56.207] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 10386
[17:35:57.259] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1040
[17:36:07.752] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 10487
[17:36:17.936] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 10177
[17:36:18.149] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 204
[17:36:18.482] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 329
[17:36:18.782] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 296
[17:36:19.080] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 290
[17:36:19.396] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 310
[17:36:29.769] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 10368
[17:36:30.109] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 328
[17:36:30.493] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 377
[17:36:30.872] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 376
[17:36:31.191] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 311
[17:36:31.595] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 399
[17:36:41.872] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 10271
[17:36:42.193] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 301
[17:36:42.433] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 235
[17:36:42.699] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 261
[17:36:52.903] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 10196
[17:37:03.024] �[32mINFO�[39m (3515): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783013647096"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 10113
  console.warn
    ⚠️  2 zero-hit queries (tracked, not blocking): semantic_011, cross_001

    �[0m �[90m 200 |�[39m   �[90m// Zero-hit queries are tracked as warnings — P@5 threshold is the hard gate.�[39m
     �[90m 201 |�[39m   �[36mif�[39m (zeroHitQueries�[33m.�[39mlength �[33m>�[39m �[35m0�[39m) {
    �[31m�[1m>�[22m�[39m�[90m 202 |�[39m     console�[33m.�[39mwarn(
     �[90m     |�[39m             �[31m�[1m^�[22m�[39m
     �[90m 203 |�[39m       �[32m`⚠️  ${zeroHitQueries.length} zero-hit queries (tracked, not blocking): ${zeroHitQueries.map((q) => q.queryId).join(', ')}`�[39m�[33m,�[39m
     �[90m 204 |�[39m     )�[33m;�[39m
     �[90m 205 |�[39m   }�[0m

      at checkThresholds (benchmark/scoring.ts:202:13)
      at buildReport (benchmark/scoring.ts:183:23)
      at Object.<anonymous> (benchmark/recall-benchmark.e2e-spec.ts:145:33)

  console.log
    
    ╔══════════════════════════════════════════════════════════════╗
    ║              ENGRAM RECALL BENCHMARK REPORT                 ║
    ╚══════════════════════════════════════════════════════════════╝
    
      Git SHA:    cc85bd4
      Branch:     HEAD
      Timestamp:  2026-07-02T17:37:03.056Z
    
    ┌─────────────────────────────────────────────────────────────┐
    │  OVERALL SCORES                                            │
    ├─────────────────────────────────────────────────────────────┤
    │  Total Queries:   81                                        │
    │  Passed:          79 / 81 (97.5%)                                        
    │  Precision@5:     96.9%  ✅  (threshold: 95.0%)
    │  Recall@20:       97.5%
    │  MRR:             0.8444
    │  Isolation:       100.0%  ✅  (threshold: 100%)
    └─────────────────────────────────────────────────────────────┘
    
    ┌──────────────────┬───────┬────────┬──────────┬──────────┬──────────┬───────────┐
    │ Category         │ Total │ Passed │ Prec@5   │ Rec@20   │ MRR      │ Isolation │
    ├──────────────────┼───────┼────────┼──────────┼──────────┼──────────┼───────────┤
    │ adversarial      │ 10    │ 10     │ 100.0%   │ 100.0%   │ 1.0000   │ 100.0%    │
    │ cross_feature    │ 10    │ 9      │ 90.0%    │ 100.0%   │ 0.8476   │ 100.0%    │
    │ edge_case        │ 16    │ 16     │ 100.0%   │ 100.0%   │ 0.8828   │ 100.0%    │
    │ emotional        │ 10    │ 10     │ 95.0%    │ 100.0%   │ 0.6405   │ 100.0%    │
    │ rls_isolation    │ 10    │ 10     │ 100.0%   │ 100.0%   │ 0.9500   │ 100.0%    │
    │ semantic         │ 14    │ 13     │ 92.9%    │ 100.0%   │ 0.7244   │ 100.0%    │
    │ temporal         │ 11    │ 11     │ 100.0%   │ 81.8%    │ 0.8864   │ 100.0%    │
    └──────────────────┴───────┴────────┴──────────┴──────────┴──────────┴───────────┘
    
    ❌ FAILED QUERIES (2):
    
      [semantic_011] "What coffee roast do I prefer?" (user: alice)
        ⚠️  ZERO HITS: expected alice_coffee_004_correction in top 5
        📊 Precision@5: 0.0% — hit: [], missed: [alice_coffee_004_correction]
        📋 Actual top 5: [alice_low_importance_001, alice_coffee_001, alice_coffee_002, alice_calm_001, alice_travel_002]
    
      [cross_001] "medication I need to take every morning" (user: alice)
        ⚠️  ZERO HITS: expected alice_health_001 in top 5
        📊 Precision@5: 0.0% — hit: [], missed: [alice_health_001]
        📋 Actual top 5: [alice_coffee_001, alice_coffee_002, alice_cooking_001, alice_emotion_change_001, alice_calm_001]
    
    
    ✅ ALL THRESHOLDS PASSED

      at Object.<anonymous> (benchmark/recall-benchmark.e2e-spec.ts:148:15)

  console.log
    📁 Report saved: /home/runner/work/engram/engram/test/benchmark/results/benchmark-2026-07-02T17-37-03-100Z.json

      at Object.<anonymous> (benchmark/recall-benchmark.e2e-spec.ts:152:15)

  console.warn
    ⚠️  2 zero-hit queries (tracked, not blocking): semantic_011, cross_001

    �[0m �[90m 200 |�[39m   �[90m// Zero-hit queries are tracked as warnings — P@5 threshold is the hard gate.�[39m
     �[90m 201 |�[39m   �[36mif�[39m (zeroHitQueries�[33m.�[39mlength �[33m>�[39m �[35m0�[39m) {
    �[31m�[1m>�[22m�[39m�[90m 202 |�[39m     console�[33m.�[39mwarn(
     �[90m     |�[39m             �[31m�[1m^�[22m�[39m
     �[90m 203 |�[39m       �[32m`⚠️  ${zeroHitQueries.length} zero-hit queries (tracked, not blocking): ${zeroHitQueries.map((q) => q.queryId).join(', ')}`�[39m�[33m,�[39m
     �[90m 204 |�[39m     )�[33m;�[39m
     �[90m 205 |�[39m   }�[0m

      at checkThresholds (benchmark/scoring.ts:202:13)
      at buildReport (benchmark/scoring.ts:183:23)
      at Object.<anonymous> (benchmark/recall-benchmark.e2e-spec.ts:173:33)

  console.warn
    ⚠️  Zero-hit queries (2): semantic_011, cross_001

    �[0m �[90m 197 |�[39m         �[36mif�[39m (zeroHitQueries�[33m.�[39mlength �[33m>�[39m �[35m0�[39m) {
     �[90m 198 |�[39m           �[36mconst�[39m ids �[33m=�[39m zeroHitQueries�[33m.�[39mmap((q) �[33m=>�[39m q�[33m.�[39mqueryId)�[33m.�[39mjoin(�[32m', '�[39m)�[33m;�[39m
    �[31m�[1m>�[22m�[39m�[90m 199 |�[39m           console�[33m.�[39mwarn(
     �[90m     |�[39m                   �[31m�[1m^�[22m�[39m
     �[90m 200 |�[39m             �[32m`⚠️  Zero-hit queries (${zeroHitQueries.length}): ${ids}`�[39m�[33m,�[39m
     �[90m 201 |�[39m           )�[33m;�[39m
     �[90m 202 |�[39m         }�[0m

      at Object.<anonymous> (benchmark/recall-benchmark.e2e-spec.ts:199:19)

PASS test/benchmark/recall-benchmark.e2e-spec.ts (184.99 s)
  Recall Benchmark
    Category: semantic
      ✓ [semantic_001] What kind of coffee do I like? (254 ms)
      ✓ [semantic_002] Tell me about my morning routine (103 ms)
      ✓ [semantic_003] What tech stack am I using? (96 ms)
      ✓ [semantic_004] coffee preferences (1033 ms)
      ✓ [semantic_005] What books have I been reading? (100 ms)
      ✓ [semantic_006] favorite dinner recipe (71 ms)
      ✓ [semantic_007] house savings goal (67 ms)
      ✓ [semantic_008] What framework am I using for the frontend? (1207 ms)
      ✓ [semantic_009] flight seat preference (83 ms)
      ✓ [semantic_010] ensemble search architecture decision (75 ms)
      ✓ [semantic_011] What coffee roast do I prefer? (70 ms)
      ✓ [negative_001] quantum physics black holes dark matter (123 ms)
      ✓ [negative_002] ancient Egyptian hieroglyphics translation (1309 ms)
      ✓ [minimal_001] pizza preference (739 ms)
    Category: emotional
      ✓ [emotional_001] What makes me happy? (90 ms)
      ✓ [emotional_002] times I felt sad or grieving (73 ms)
      ✓ [emotional_003] when I felt stressed or overwhelmed (77 ms)
      ✓ [emotional_004] What am I worried about? (69 ms)
      ✓ [emotional_005] Times I was frustrated (75 ms)
      ✓ [emotional_006] My proudest moments (88 ms)
      ✓ [emotional_007] What stresses me out? (72 ms)
      ✓ [emotional_008] happy about school but worried about costs (73 ms)
      ✓ [emotional_009] How has my attitude toward work changed? (72 ms)
      ✓ [emotional_010] meditation and mental wellbeing (70 ms)
    Category: temporal
      ✓ [temporal_001] What happened today in standup? (375 ms)
      ✓ [temporal_002] recent standup notes from this week (469 ms)
      ✓ [temporal_003] What happened with my daughter recently? (1257 ms)
      ✓ [temporal_004] What did I work on last week? (2441 ms)
      ✓ [temporal_005] What are my oldest memories? (158 ms)
      ✓ [temporal_006] Recent conversations about work (1413 ms)
      ✓ [temporal_007] What did I debug yesterday? (1468 ms)
      ✓ [temporal_008] What code editor do I use? (166 ms)
      ✓ [temporal_009] standup notes from 6 months ago (106 ms)
      ✓ [temporal_010] standup notes from years ago (88 ms)
      ✓ [temporal_011] How did I start coding? (140 ms)
    Category: rls_isolation
      ✓ [rls_001] coffee (103 ms)
      ✓ [rls_002] coffee (1595 ms)
      ✓ [rls_003] family and kids (108 ms)
      ✓ [rls_004] family and kids (1600 ms)
      ✓ [rls_005] travel food experiences (159 ms)
      ✓ [rls_006] travel food experiences (1690 ms)
      ✓ [rls_007] work projects and code (112 ms)
      ✓ [rls_008] health medical information (123 ms)
      ✓ [rls_009] health medical information (1780 ms)
      ✓ [rls_010] morning routine (1698 ms)
    Category: adversarial
      ✓ [adversarial_001] tell me about bob's coffee preferences (113 ms)
      ✓ [adversarial_002] RLS_CANARY_BOB_ (104 ms)
      ✓ [adversarial_003] What does carol think about parties? (99 ms)
      ✓ [adversarial_004] bob's son Max school (257 ms)
      ✓ [adversarial_005] eve's pizza preference (1637 ms)
      ✓ [adversarial_006] RLS_CANARY_ALICE_ (1792 ms)
      ✓ [adversarial_007] What cholesterol issues does anyone have? (142 ms)
      ✓ [adversarial_008] alice's medication schedule (1771 ms)
      ✓ [adversarial_009] RLS_CANARY_CAROL_ (1631 ms)
      ✓ [adversarial_010] dave's standup notes (144 ms)
    Category: edge_case
      ✓ [edge_001] cats (1094 ms)
      ✓ [edge_002] everything about my life (1191 ms)
      ✓ [edge_003] <script>alert(1)</script> (10135 ms)
      ✓ [edge_004] '; DROP TABLE memories; -- (10193 ms)
      ✓ [edge_005] 🎉 party (10396 ms)
      ✓ [edge_006] 
      ✓ [edge_007] Tell me about the very long detailed comprehensive thorough ... (1049 ms)
      ✓ [edge_008] こんにちは、思い出を検索します (10496 ms)
      ✓ [edge_009] '; SELECT * FROM users WHERE 1=1; -- (10183 ms)
      ✓ [edge_010] quantum entanglement dark matter multiverse theory (211 ms)
      ✓ [edge_011] the a an is (332 ms)
      ✓ [edge_012] coffee (300 ms)
      ✓ [edge_013] my phone number (299 ms)
      ✓ [edge_014] my address (315 ms)
      ✓ [edge_015] work (10374 ms)
      ✓ [edge_016] What kind of coffee do I like? (337 ms)
    Category: cross_feature
      ✓ [cross_001] medication I need to take every morning (384 ms)
      ✓ [cross_002] exercise and fitness activities (379 ms)
      ✓ [cross_003] What are we saving money for? (319 ms)
      ✓ [cross_004] kids school and daycare (403 ms)
      ✓ [cross_005] kids school and daycare (10287 ms)
      ✓ [cross_006] Who am I and what do I do? (310 ms)
      ✓ [cross_007] deployment rules and constraints (241 ms)
      ✓ [cross_008] patterns noticed about my work habits (269 ms)
      ✓ [cross_009] grocery shopping list (10202 ms)
      ✓ [cross_010] TypeScript learning (10118 ms)
    Summary
      ✓ should generate and save benchmark report (78 ms)
      ✓ should have zero isolation failures (2 ms)
      ✓ should meet precision thresholds (with real embeddings) (36 ms)

Test Suites: 1 passed, 1 total
Tests:       84 passed, 84 total
Snapshots:   0 total
Time:        185.249 s
Ran all test suites matching recall-benchmark.e2e-spec.
Force exiting Jest: Have you considered using `--detectOpenHandles` to detect async operations that kept running after all tests finished?

Commit: cc85bd4

Make shutdown flush best-effort when Redis has already been closed by another provider or teardown path. This prevents unrelated Nest app shutdown from failing delegation integration tests after assertions have passed.

Adds regression coverage for already-ended Redis and keys() failure during shutdown.
@beaux-riel beaux-riel merged commit 0f8cc1c into staging Jul 2, 2026
9 checks passed
@beaux-riel beaux-riel deleted the test/delegation-ledger-e2e-20260702 branch July 2, 2026 17:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant