Skip to content

chore: promote analytics dashboard fix to production#315

Merged
heybeaux merged 5 commits into
productionfrom
promote/staging-analytics-to-production-20260702
Jul 2, 2026
Merged

chore: promote analytics dashboard fix to production#315
heybeaux merged 5 commits into
productionfrom
promote/staging-analytics-to-production-20260702

Conversation

@beaux-riel

Copy link
Copy Markdown
Collaborator

Summary

Why

Authenticated production dashboard QA still shows /analytics returning 500s from:

  • GET /v1/analytics/summary
  • GET /v1/analytics/timeline
  • GET /v1/analytics/breakdown/type
  • GET /v1/analytics/breakdown/layer?includeTrend=true

Production is still at 11bb548 and contains the old repeated GROUP BY date_trunc(${intervalLiteral}, created_at) SQL. Staging is at 478bc75 and contains PR #313's bucket-subquery fix.

Verification

Safety

Normal protected promotion PR; do not bypass required reviews/checks.

…estion and trust reports

Introduce a first-class delegation ledger that unifies how tasks pass
between agents and how trust is earned from evidence rather than prose.

- schema: DelegationEvent (append-only lifecycle/AOP-Sonder log),
  DelegationValidation (Lattice StateContract + validation evidence),
  DelegationReceipt (Receipts proof-of-work + integrity status)
- migration incl. RLS policies + engram_app grants
- DelegationLedgerService: event recording, Lattice validation ingestion,
  receipt attach w/ SHA-256 payload integrity check, evidence-based trust
  signals, per-task and per-agent trust reports
- lifecycle hooks: contract/task create+status changes emit events
- API: /v1/delegation/events, /contracts/:id/validations,
  /tasks/:id/receipts, /tasks/:id/trust-report, /trust-reports/:agentId
- tests: 8 suites / 57 tests (ledger, controller, lifecycle, trust rules)
@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: af168ee7-837e-43ef-aabd-04c8714c0e53

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch promote/staging-analytics-to-production-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:    27e7f6f
      Branch:     HEAD
      Timestamp:  2026-07-02T15:35:32.252Z
    
    ┌─────────────────────────────────────────────────────────────┐
    │  OVERALL SCORES                                            │
    ├─────────────────────────────────────────────────────────────┤
    │  Total Queries:   81                                        │
    │  Passed:          79 / 81 (97.5%)                                        
    │  Precision@5:     96.9%  ✅  (threshold: 95.0%)
    │  Recall@20:       97.5%
    │  MRR:             0.8537
    │  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.9297   │ 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_calm_001, alice_emotion_change_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-02T15-35-32-303Z.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 (156.79 s)
  Recall Benchmark
    Category: semantic
      ✓ [semantic_001] What kind of coffee do I like? (216 ms)
      ✓ [semantic_002] Tell me about my morning routine (113 ms)
      ✓ [semantic_003] What tech stack am I using? (86 ms)
      ✓ [semantic_004] coffee preferences (1131 ms)
      ✓ [semantic_005] What books have I been reading? (97 ms)
      ✓ [semantic_006] favorite dinner recipe (68 ms)
      ✓ [semantic_007] house savings goal (74 ms)
      ✓ [semantic_008] What framework am I using for the frontend? (1349 ms)
      ✓ [semantic_009] flight seat preference (84 ms)
      ✓ [semantic_010] ensemble search architecture decision (65 ms)
      ✓ [semantic_011] What coffee roast do I prefer? (75 ms)
      ✓ [negative_001] quantum physics black holes dark matter (66 ms)
      ✓ [negative_002] ancient Egyptian hieroglyphics translation (1244 ms)
      ✓ [minimal_001] pizza preference (824 ms)
    Category: emotional
      ✓ [emotional_001] What makes me happy? (85 ms)
      ✓ [emotional_002] times I felt sad or grieving (74 ms)
      ✓ [emotional_003] when I felt stressed or overwhelmed (63 ms)
      ✓ [emotional_004] What am I worried about? (73 ms)
      ✓ [emotional_005] Times I was frustrated (76 ms)
      ✓ [emotional_006] My proudest moments (81 ms)
      ✓ [emotional_007] What stresses me out? (67 ms)
      ✓ [emotional_008] happy about school but worried about costs (70 ms)
      ✓ [emotional_009] How has my attitude toward work changed? (63 ms)
      ✓ [emotional_010] meditation and mental wellbeing (61 ms)
    Category: temporal
      ✓ [temporal_001] What happened today in standup? (460 ms)
      ✓ [temporal_002] recent standup notes from this week (438 ms)
      ✓ [temporal_003] What happened with my daughter recently? (1001 ms)
      ✓ [temporal_004] What did I work on last week? (1607 ms)
      ✓ [temporal_005] What are my oldest memories? (87 ms)
      ✓ [temporal_006] Recent conversations about work (847 ms)
      ✓ [temporal_007] What did I debug yesterday? (984 ms)
      ✓ [temporal_008] What code editor do I use? (86 ms)
      ✓ [temporal_009] standup notes from 6 months ago (64 ms)
      ✓ [temporal_010] standup notes from years ago (51 ms)
      ✓ [temporal_011] How did I start coding? (71 ms)
    Category: rls_isolation
      ✓ [rls_001] coffee (60 ms)
      ✓ [rls_002] coffee (1086 ms)
      ✓ [rls_003] family and kids (90 ms)
      ✓ [rls_004] family and kids (1039 ms)
      ✓ [rls_005] travel food experiences (88 ms)
      ✓ [rls_006] travel food experiences (1067 ms)
      ✓ [rls_007] work projects and code (83 ms)
      ✓ [rls_008] health medical information (64 ms)
      ✓ [rls_009] health medical information (1085 ms)
      ✓ [rls_010] morning routine (1033 ms)
    Category: adversarial
      ✓ [adversarial_001] tell me about bob's coffee preferences (86 ms)
      ✓ [adversarial_002] RLS_CANARY_BOB_ (75 ms)
      ✓ [adversarial_003] What does carol think about parties? (171 ms)
      ✓ [adversarial_004] bob's son Max school (72 ms)
      ✓ [adversarial_005] eve's pizza preference (1253 ms)
      ✓ [adversarial_006] RLS_CANARY_ALICE_ (1300 ms)
      ✓ [adversarial_007] What cholesterol issues does anyone have? (82 ms)
      ✓ [adversarial_008] alice's medication schedule (1166 ms)
      ✓ [adversarial_009] RLS_CANARY_CAROL_ (928 ms)
      ✓ [adversarial_010] dave's standup notes (81 ms)
    Category: edge_case
      ✓ [edge_001] cats (738 ms)
      ✓ [edge_002] everything about my life (783 ms)
      ✓ [edge_003] <script>alert(1)</script> (9993 ms)
      ✓ [edge_004] '; DROP TABLE memories; -- (10080 ms)
      ✓ [edge_005] 🎉 party (10141 ms)
      ✓ [edge_006] 
      ✓ [edge_007] Tell me about the very long detailed comprehensive thorough ... (737 ms)
      ✓ [edge_008] こんにちは、思い出を検索します (10301 ms)
      ✓ [edge_009] '; SELECT * FROM users WHERE 1=1; -- (10173 ms)
      ✓ [edge_010] quantum entanglement dark matter multiverse theory (135 ms)
      ✓ [edge_011] the a an is (243 ms)
      ✓ [edge_012] coffee (367 ms)
      ✓ [edge_013] my phone number (217 ms)
      ✓ [edge_014] my address (297 ms)
      ✓ [edge_015] work (10343 ms)
      ✓ [edge_016] What kind of coffee do I like? (267 ms)
    Category: cross_feature
      ✓ [cross_001] medication I need to take every morning (198 ms)
      ✓ [cross_002] exercise and fitness activities (222 ms)
      ✓ [cross_003] What are we saving money for? (178 ms)
      ✓ [cross_004] kids school and daycare (307 ms)
      ✓ [cross_005] kids school and daycare (9762 ms)
      ✓ [cross_006] Who am I and what do I do? (285 ms)
      ✓ [cross_007] deployment rules and constraints (98 ms)
      ✓ [cross_008] patterns noticed about my work habits (111 ms)
      ✓ [cross_009] grocery shopping list (1345 ms)
      ✓ [cross_010] TypeScript learning (1269 ms)
    Summary
      ✓ should generate and save benchmark report (91 ms)
      ✓ should have zero isolation failures (2 ms)
      ✓ should meet precision thresholds (with real embeddings) (82 ms)

Test Suites: 1 passed, 1 total
Tests:       84 passed, 84 total
Snapshots:   0 total
Time:        157.026 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

[15:33:50.991] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 179
[15:33:51.111] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 102
[15:33:51.200] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 82
[15:33:52.326] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1121
[15:33:52.428] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 92
[15:33:52.497] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 65
[15:33:52.572] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 71
[15:33:53.921] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1346
[15:33:54.006] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 80
[15:33:54.069] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 59
[15:33:54.144] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 70
[15:33:54.211] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 61
[15:33:55.451] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1236
[15:33:56.280] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 819
[15:33:56.366] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 82
[15:33:56.438] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 68
[15:33:56.505] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 60
[15:33:56.575] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 66
[15:33:56.654] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 73
[15:33:56.735] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 77
[15:33:56.803] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 61
[15:33:56.870] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 64
[15:33:56.936] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 60
[15:33:56.997] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 58
[15:33:57.458] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-dave-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 457
[15:33:57.897] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-dave-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 433
[15:33:58.897] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 998
[15:34:00.504] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1604
[15:34:00.591] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 84
[15:34:01.439] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 844
[15:34:02.424] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 979
[15:34:02.510] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 82
[15:34:02.572] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-dave-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 58
[15:34:02.626] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-dave-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 46
[15:34:02.694] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 65
[15:34:02.758] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 58
[15:34:03.844] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1083
[15:34:03.934] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 87
[15:34:04.973] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1036
[15:34:05.061] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 85
[15:34:06.128] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1064
[15:34:06.211] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 80
[15:34:06.275] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 61
[15:34:07.362] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1084
[15:34:08.394] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1029
[15:34:08.481] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 83
[15:34:08.551] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 67
[15:34:08.727] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 164
[15:34:08.799] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 69
[15:34:10.053] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1250
[15:34:11.353] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1296
[15:34:11.435] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 79
[15:34:12.601] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1163
[15:34:13.529] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 925
[15:34:13.609] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 76
[15:34:14.348] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 733
[15:34:15.132] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 781
[15:34:25.125] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 9989
[15:34:35.205] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 10076
[15:34:45.344] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 10132
[15:34:46.084] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 728
[15:34:56.386] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 10297
[15:35:06.559] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 10167
[15:35:06.695] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 131
[15:35:06.939] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 239
[15:35:07.303] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 358
[15:35:07.523] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 212
[15:35:07.821] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 294
[15:35:18.163] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 10331
[15:35:18.430] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 261
[15:35:18.628] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 189
[15:35:18.851] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 219
[15:35:19.026] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 168
[15:35:19.336] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 301
[15:35:29.100] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 9758
[15:35:29.386] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 283
[15:35:29.484] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 91
[15:35:29.596] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 107
[15:35:30.941] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1342
[15:35:32.208] �[32mINFO�[39m (3439): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783006383788"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1263
  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:    27e7f6f
      Branch:     HEAD
      Timestamp:  2026-07-02T15:35:32.252Z
    
    ┌─────────────────────────────────────────────────────────────┐
    │  OVERALL SCORES                                            │
    ├─────────────────────────────────────────────────────────────┤
    │  Total Queries:   81                                        │
    │  Passed:          79 / 81 (97.5%)                                        
    │  Precision@5:     96.9%  ✅  (threshold: 95.0%)
    │  Recall@20:       97.5%
    │  MRR:             0.8537
    │  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.9297   │ 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_calm_001, alice_emotion_change_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-02T15-35-32-303Z.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 (156.79 s)
  Recall Benchmark
    Category: semantic
      ✓ [semantic_001] What kind of coffee do I like? (216 ms)
      ✓ [semantic_002] Tell me about my morning routine (113 ms)
      ✓ [semantic_003] What tech stack am I using? (86 ms)
      ✓ [semantic_004] coffee preferences (1131 ms)
      ✓ [semantic_005] What books have I been reading? (97 ms)
      ✓ [semantic_006] favorite dinner recipe (68 ms)
      ✓ [semantic_007] house savings goal (74 ms)
      ✓ [semantic_008] What framework am I using for the frontend? (1349 ms)
      ✓ [semantic_009] flight seat preference (84 ms)
      ✓ [semantic_010] ensemble search architecture decision (65 ms)
      ✓ [semantic_011] What coffee roast do I prefer? (75 ms)
      ✓ [negative_001] quantum physics black holes dark matter (66 ms)
      ✓ [negative_002] ancient Egyptian hieroglyphics translation (1244 ms)
      ✓ [minimal_001] pizza preference (824 ms)
    Category: emotional
      ✓ [emotional_001] What makes me happy? (85 ms)
      ✓ [emotional_002] times I felt sad or grieving (74 ms)
      ✓ [emotional_003] when I felt stressed or overwhelmed (63 ms)
      ✓ [emotional_004] What am I worried about? (73 ms)
      ✓ [emotional_005] Times I was frustrated (76 ms)
      ✓ [emotional_006] My proudest moments (81 ms)
      ✓ [emotional_007] What stresses me out? (67 ms)
      ✓ [emotional_008] happy about school but worried about costs (70 ms)
      ✓ [emotional_009] How has my attitude toward work changed? (63 ms)
      ✓ [emotional_010] meditation and mental wellbeing (61 ms)
    Category: temporal
      ✓ [temporal_001] What happened today in standup? (460 ms)
      ✓ [temporal_002] recent standup notes from this week (438 ms)
      ✓ [temporal_003] What happened with my daughter recently? (1001 ms)
      ✓ [temporal_004] What did I work on last week? (1607 ms)
      ✓ [temporal_005] What are my oldest memories? (87 ms)
      ✓ [temporal_006] Recent conversations about work (847 ms)
      ✓ [temporal_007] What did I debug yesterday? (984 ms)
      ✓ [temporal_008] What code editor do I use? (86 ms)
      ✓ [temporal_009] standup notes from 6 months ago (64 ms)
      ✓ [temporal_010] standup notes from years ago (51 ms)
      ✓ [temporal_011] How did I start coding? (71 ms)
    Category: rls_isolation
      ✓ [rls_001] coffee (60 ms)
      ✓ [rls_002] coffee (1086 ms)
      ✓ [rls_003] family and kids (90 ms)
      ✓ [rls_004] family and kids (1039 ms)
      ✓ [rls_005] travel food experiences (88 ms)
      ✓ [rls_006] travel food experiences (1067 ms)
      ✓ [rls_007] work projects and code (83 ms)
      ✓ [rls_008] health medical information (64 ms)
      ✓ [rls_009] health medical information (1085 ms)
      ✓ [rls_010] morning routine (1033 ms)
    Category: adversarial
      ✓ [adversarial_001] tell me about bob's coffee preferences (86 ms)
      ✓ [adversarial_002] RLS_CANARY_BOB_ (75 ms)
      ✓ [adversarial_003] What does carol think about parties? (171 ms)
      ✓ [adversarial_004] bob's son Max school (72 ms)
      ✓ [adversarial_005] eve's pizza preference (1253 ms)
      ✓ [adversarial_006] RLS_CANARY_ALICE_ (1300 ms)
      ✓ [adversarial_007] What cholesterol issues does anyone have? (82 ms)
      ✓ [adversarial_008] alice's medication schedule (1166 ms)
      ✓ [adversarial_009] RLS_CANARY_CAROL_ (928 ms)
      ✓ [adversarial_010] dave's standup notes (81 ms)
    Category: edge_case
      ✓ [edge_001] cats (738 ms)
      ✓ [edge_002] everything about my life (783 ms)
      ✓ [edge_003] <script>alert(1)</script> (9993 ms)
      ✓ [edge_004] '; DROP TABLE memories; -- (10080 ms)
      ✓ [edge_005] 🎉 party (10141 ms)
      ✓ [edge_006] 
      ✓ [edge_007] Tell me about the very long detailed comprehensive thorough ... (737 ms)
      ✓ [edge_008] こんにちは、思い出を検索します (10301 ms)
      ✓ [edge_009] '; SELECT * FROM users WHERE 1=1; -- (10173 ms)
      ✓ [edge_010] quantum entanglement dark matter multiverse theory (135 ms)
      ✓ [edge_011] the a an is (243 ms)
      ✓ [edge_012] coffee (367 ms)
      ✓ [edge_013] my phone number (217 ms)
      ✓ [edge_014] my address (297 ms)
      ✓ [edge_015] work (10343 ms)
      ✓ [edge_016] What kind of coffee do I like? (267 ms)
    Category: cross_feature
      ✓ [cross_001] medication I need to take every morning (198 ms)
      ✓ [cross_002] exercise and fitness activities (222 ms)
      ✓ [cross_003] What are we saving money for? (178 ms)
      ✓ [cross_004] kids school and daycare (307 ms)
      ✓ [cross_005] kids school and daycare (9762 ms)
      ✓ [cross_006] Who am I and what do I do? (285 ms)
      ✓ [cross_007] deployment rules and constraints (98 ms)
      ✓ [cross_008] patterns noticed about my work habits (111 ms)
      ✓ [cross_009] grocery shopping list (1345 ms)
      ✓ [cross_010] TypeScript learning (1269 ms)
    Summary
      ✓ should generate and save benchmark report (91 ms)
      ✓ should have zero isolation failures (2 ms)
      ✓ should meet precision thresholds (with real embeddings) (82 ms)

Test Suites: 1 passed, 1 total
Tests:       84 passed, 84 total
Snapshots:   0 total
Time:        157.026 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: 27e7f6f

@heybeaux heybeaux merged commit 5f55d2f into production Jul 2, 2026
4 checks passed
@heybeaux heybeaux deleted the promote/staging-analytics-to-production-20260702 branch July 2, 2026 15:42
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.

2 participants