Skip to content

Versioned facts + anti-entropy reconciliation (kills first-write-wins) - #323

Merged
heybeaux merged 2 commits into
stagingfrom
versioned-facts-anti-entropy
Jul 5, 2026
Merged

heybeaux merged 2 commits into
stagingfrom
versioned-facts-anti-entropy

Conversation

@heybeaux

@heybeaux heybeaux commented Jul 5, 2026

Copy link
Copy Markdown
Owner

Summary

  • New src/reconciliation/ module: VersionedFact (provenance + version vector), reconcile (verified-copy wins, no first-write-wins), and anti-entropy gossip repair
  • Adopt-then-heal fix so empty nodes converge in a gossip mesh
  • 7/7 jest tests green; builds to importable CommonJS

Exp-08 retest evidence (swarmlab, real package linked, 30 trials/cell, seed rumor-mill-v1)

metric baseline engram target
coverageOutrunsTruth 19/36 0/36 0
worst-cell fidelity 0.574 1.000 ≥0.99
telephoneGradient 0.113 0.000 ≤0.01
coverage/saturation 1.00 1.00 no regression

Healing accounting: ~279 healed / ~2768 rejected_corrupt per trial (0/0 in noiseless column) — fidelity recovers by verified copies overwriting corrupt ones, not by throttling spread.

Honest caveat: anti-entropy over live edges is also a propagation channel — TTS dropped sharply (e.g. 17.27→1.10 rounds). No regression, but this is repair plus accelerated diffusion, not spread-neutral.

Run IDs: baseline rm-baseline-mr7uziwl, engram rm-engram-mr7uzjds (both replay-verified).

🤖 Generated with Claude Code

@coderabbitai

coderabbitai Bot commented Jul 5, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

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

Next review available in: 3 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: cbce8b38-0712-4d76-8810-0eae6dcc04f6

📥 Commits

Reviewing files that changed from the base of the PR and between 46b2a00 and 3586f5d.

📒 Files selected for processing (7)
  • src/reconciliation/anti-entropy.ts
  • src/reconciliation/index.ts
  • src/reconciliation/package.json
  • src/reconciliation/reconcile.ts
  • src/reconciliation/reconciliation.spec.ts
  • src/reconciliation/tsconfig.build.json
  • src/reconciliation/versioned-fact.ts
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch versioned-facts-anti-entropy

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.

beaux-riel and others added 2 commits July 5, 2026 07:19
Content-addressed VersionedFact with verifyFact, reconcile() that kills
first-write-wins (kept/adopted/healed/rejected_corrupt outcomes), and
antiEntropySync() for pairwise neighbor repair. Pure TS, no NestJS deps,
buildable to an importable CommonJS artifact for external harnesses.

Tests cover the five Spec 16 A4 cases: heal early-hop corruption, corrupt
never overwrites verified, anti-entropy repair+count, digest breaks on any
single-token mutation, higher verified version supersedes.

Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
An empty node now adopts any arrival (verified or a provisional corrupt copy)
so it becomes informed and stays healable, instead of refusing corrupt copies
to null. rejected_corrupt is reserved for Rule 3 (holding a verified copy,
refusing a corrupt one). This makes fidelity recover BY HEALING in the exp-08
retest rather than by damping spread, and keeps coverage/saturation intact.

Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
@heybeaux
heybeaux force-pushed the versioned-facts-anti-entropy branch from 0a4910d to 3586f5d Compare July 5, 2026 14:20
@heybeaux
heybeaux merged commit 7af144b into staging Jul 5, 2026
4 checks passed
@heybeaux
heybeaux deleted the versioned-facts-anti-entropy branch July 5, 2026 14:20
@github-actions

github-actions Bot commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

✅ Recall Benchmark Results

╔══════════════════════════════════════════════════════════════╗
    ║              ENGRAM RECALL BENCHMARK REPORT                 ║
    ╚══════════════════════════════════════════════════════════════╝
    
      Git SHA:    f507dd3
      Branch:     HEAD
      Timestamp:  2026-07-05T14:25:28.638Z
    
    ┌─────────────────────────────────────────────────────────────┐
    │  OVERALL SCORES                                            │
    ├─────────────────────────────────────────────────────────────┤
    │  Total Queries:   81                                        │
    │  Passed:          79 / 81 (97.5%)                                        
    │  Precision@5:     96.9%  ✅  (threshold: 95.0%)
    │  Recall@20:       97.5%
    │  MRR:             0.8588
    │  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.8643   │ 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.7423   │ 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-05T14-25-28-670Z.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 (149.311 s)
  Recall Benchmark
    Category: semantic
      ✓ [semantic_001] What kind of coffee do I like? (237 ms)
      ✓ [semantic_002] Tell me about my morning routine (102 ms)
      ✓ [semantic_003] What tech stack am I using? (79 ms)
      ✓ [semantic_004] coffee preferences (1007 ms)
      ✓ [semantic_005] What books have I been reading? (170 ms)
      ✓ [semantic_006] favorite dinner recipe (81 ms)
      ✓ [semantic_007] house savings goal (69 ms)
      ✓ [semantic_008] What framework am I using for the frontend? (1239 ms)
      ✓ [semantic_009] flight seat preference (86 ms)
      ✓ [semantic_010] ensemble search architecture decision (69 ms)
      ✓ [semantic_011] What coffee roast do I prefer? (69 ms)
      ✓ [negative_001] quantum physics black holes dark matter (65 ms)
      ✓ [negative_002] ancient Egyptian hieroglyphics translation (1263 ms)
      ✓ [minimal_001] pizza preference (697 ms)
    Category: emotional
      ✓ [emotional_001] What makes me happy? (83 ms)
      ✓ [emotional_002] times I felt sad or grieving (71 ms)
      ✓ [emotional_003] when I felt stressed or overwhelmed (63 ms)
      ✓ [emotional_004] What am I worried about? (66 ms)
      ✓ [emotional_005] Times I was frustrated (69 ms)
      ✓ [emotional_006] My proudest moments (80 ms)
      ✓ [emotional_007] What stresses me out? (67 ms)
      ✓ [emotional_008] happy about school but worried about costs (89 ms)
      ✓ [emotional_009] How has my attitude toward work changed? (70 ms)
      ✓ [emotional_010] meditation and mental wellbeing (84 ms)
    Category: temporal
      ✓ [temporal_001] What happened today in standup? (421 ms)
      ✓ [temporal_002] recent standup notes from this week (415 ms)
      ✓ [temporal_003] What happened with my daughter recently? (860 ms)
      ✓ [temporal_004] What did I work on last week? (1450 ms)
      ✓ [temporal_005] What are my oldest memories? (87 ms)
      ✓ [temporal_006] Recent conversations about work (905 ms)
      ✓ [temporal_007] What did I debug yesterday? (926 ms)
      ✓ [temporal_008] What code editor do I use? (84 ms)
      ✓ [temporal_009] standup notes from 6 months ago (56 ms)
      ✓ [temporal_010] standup notes from years ago (50 ms)
      ✓ [temporal_011] How did I start coding? (67 ms)
    Category: rls_isolation
      ✓ [rls_001] coffee (65 ms)
      ✓ [rls_002] coffee (885 ms)
      ✓ [rls_003] family and kids (80 ms)
      ✓ [rls_004] family and kids (989 ms)
      ✓ [rls_005] travel food experiences (85 ms)
      ✓ [rls_006] travel food experiences (1084 ms)
      ✓ [rls_007] work projects and code (93 ms)
      ✓ [rls_008] health medical information (62 ms)
      ✓ [rls_009] health medical information (1047 ms)
      ✓ [rls_010] morning routine (1228 ms)
    Category: adversarial
      ✓ [adversarial_001] tell me about bob's coffee preferences (77 ms)
      ✓ [adversarial_002] RLS_CANARY_BOB_ (64 ms)
      ✓ [adversarial_003] What does carol think about parties? (68 ms)
      ✓ [adversarial_004] bob's son Max school (80 ms)
      ✓ [adversarial_005] eve's pizza preference (1110 ms)
      ✓ [adversarial_006] RLS_CANARY_ALICE_ (1145 ms)
      ✓ [adversarial_007] What cholesterol issues does anyone have? (80 ms)
      ✓ [adversarial_008] alice's medication schedule (1009 ms)
      ✓ [adversarial_009] RLS_CANARY_CAROL_ (886 ms)
      ✓ [adversarial_010] dave's standup notes (80 ms)
    Category: edge_case
      ✓ [edge_001] cats (675 ms)
      ✓ [edge_002] everything about my life (728 ms)
      ✓ [edge_003] <script>alert(1)</script> (9454 ms)
      ✓ [edge_004] '; DROP TABLE memories; -- (10079 ms)
      ✓ [edge_005] 🎉 party (10160 ms)
      ✓ [edge_006]  (1 ms)
      ✓ [edge_007] Tell me about the very long detailed comprehensive thorough ... (406 ms)
      ✓ [edge_008] こんにちは、思い出を検索します (10127 ms)
      ✓ [edge_009] '; SELECT * FROM users WHERE 1=1; -- (10184 ms)
      ✓ [edge_010] quantum entanglement dark matter multiverse theory (212 ms)
      ✓ [edge_011] the a an is (400 ms)
      ✓ [edge_012] coffee (482 ms)
      ✓ [edge_013] my phone number (319 ms)
      ✓ [edge_014] my address (316 ms)
      ✓ [edge_015] work (10355 ms)
      ✓ [edge_016] What kind of coffee do I like? (327 ms)
    Category: cross_feature
      ✓ [cross_001] medication I need to take every morning (218 ms)
      ✓ [cross_002] exercise and fitness activities (194 ms)
      ✓ [cross_003] What are we saving money for? (158 ms)
      ✓ [cross_004] kids school and daycare (236 ms)
      ✓ [cross_005] kids school and daycare (5030 ms)
      ✓ [cross_006] Who am I and what do I do? (112 ms)
      ✓ [cross_007] deployment rules and constraints (94 ms)
      ✓ [cross_008] patterns noticed about my work habits (130 ms)
      ✓ [cross_009] grocery shopping list (976 ms)
      ✓ [cross_010] TypeScript learning (945 ms)
    Summary
      ✓ should generate and save benchmark report (55 ms)
      ✓ should have zero isolation failures (1 ms)
      ✓ should meet precision thresholds (with real embeddings) (26 ms)

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

[14:23:54.982] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 196
[14:23:55.097] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 95
[14:23:55.175] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 75
[14:23:56.183] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1003
[14:23:56.352] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 160
[14:23:56.435] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 77
[14:23:56.505] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 66
[14:23:57.745] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1236
[14:23:57.831] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 82
[14:23:57.900] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 65
[14:23:57.970] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 63
[14:23:58.033] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 60
[14:23:59.298] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1260
[14:23:59.995] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 694
[14:24:00.080] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 80
[14:24:00.152] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 61
[14:24:00.215] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 60
[14:24:00.282] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 63
[14:24:00.351] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 66
[14:24:00.431] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 76
[14:24:00.498] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 64
[14:24:00.587] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 86
[14:24:00.657] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 67
[14:24:00.741] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 79
[14:24:01.162] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-dave-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 418
[14:24:01.578] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-dave-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 407
[14:24:02.439] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 858
[14:24:03.888] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1446
[14:24:03.976] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 84
[14:24:04.881] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 902
[14:24:05.807] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 923
[14:24:05.891] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 81
[14:24:05.948] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-dave-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 54
[14:24:06.000] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-dave-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 47
[14:24:06.067] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 64
[14:24:06.132] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 61
[14:24:07.017] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 882
[14:24:07.097] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 77
[14:24:08.086] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 986
[14:24:08.171] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 82
[14:24:09.255] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1081
[14:24:09.348] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 90
[14:24:09.411] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 60
[14:24:10.450] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1037
[14:24:11.687] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1215
[14:24:11.765] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 74
[14:24:11.829] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 61
[14:24:11.897] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 61
[14:24:11.977] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 77
[14:24:13.086] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1106
[14:24:14.233] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1141
[14:24:14.313] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 77
[14:24:15.323] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1006
[14:24:16.208] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 883
[14:24:16.288] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 76
[14:24:16.964] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 672
[14:24:17.691] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 724
[14:24:27.147] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 9451
[14:24:37.226] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 10075
[14:24:47.387] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 10150
[14:24:47.793] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 401
[14:24:57.921] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 10122
[14:25:08.108] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 10175
[14:25:08.317] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 206
[14:25:08.709] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 384
[14:25:09.203] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 463
[14:25:09.514] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 306
[14:25:09.838] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 312
[14:25:20.191] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 10349
[14:25:20.521] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 319
[14:25:20.739] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 208
[14:25:20.933] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 189
[14:25:21.092] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 154
[14:25:21.326] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 230
[14:25:26.359] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 5027
[14:25:26.469] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 105
[14:25:26.565] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 90
[14:25:26.695] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 127
[14:25:27.669] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 971
[14:25:28.615] �[32mINFO�[39m (3578): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1783261388858"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 940
  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:    f507dd3
      Branch:     HEAD
      Timestamp:  2026-07-05T14:25:28.638Z
    
    ┌─────────────────────────────────────────────────────────────┐
    │  OVERALL SCORES                                            │
    ├─────────────────────────────────────────────────────────────┤
    │  Total Queries:   81                                        │
    │  Passed:          79 / 81 (97.5%)                                        
    │  Precision@5:     96.9%  ✅  (threshold: 95.0%)
    │  Recall@20:       97.5%
    │  MRR:             0.8588
    │  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.8643   │ 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.7423   │ 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-05T14-25-28-670Z.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 (149.311 s)
  Recall Benchmark
    Category: semantic
      ✓ [semantic_001] What kind of coffee do I like? (237 ms)
      ✓ [semantic_002] Tell me about my morning routine (102 ms)
      ✓ [semantic_003] What tech stack am I using? (79 ms)
      ✓ [semantic_004] coffee preferences (1007 ms)
      ✓ [semantic_005] What books have I been reading? (170 ms)
      ✓ [semantic_006] favorite dinner recipe (81 ms)
      ✓ [semantic_007] house savings goal (69 ms)
      ✓ [semantic_008] What framework am I using for the frontend? (1239 ms)
      ✓ [semantic_009] flight seat preference (86 ms)
      ✓ [semantic_010] ensemble search architecture decision (69 ms)
      ✓ [semantic_011] What coffee roast do I prefer? (69 ms)
      ✓ [negative_001] quantum physics black holes dark matter (65 ms)
      ✓ [negative_002] ancient Egyptian hieroglyphics translation (1263 ms)
      ✓ [minimal_001] pizza preference (697 ms)
    Category: emotional
      ✓ [emotional_001] What makes me happy? (83 ms)
      ✓ [emotional_002] times I felt sad or grieving (71 ms)
      ✓ [emotional_003] when I felt stressed or overwhelmed (63 ms)
      ✓ [emotional_004] What am I worried about? (66 ms)
      ✓ [emotional_005] Times I was frustrated (69 ms)
      ✓ [emotional_006] My proudest moments (80 ms)
      ✓ [emotional_007] What stresses me out? (67 ms)
      ✓ [emotional_008] happy about school but worried about costs (89 ms)
      ✓ [emotional_009] How has my attitude toward work changed? (70 ms)
      ✓ [emotional_010] meditation and mental wellbeing (84 ms)
    Category: temporal
      ✓ [temporal_001] What happened today in standup? (421 ms)
      ✓ [temporal_002] recent standup notes from this week (415 ms)
      ✓ [temporal_003] What happened with my daughter recently? (860 ms)
      ✓ [temporal_004] What did I work on last week? (1450 ms)
      ✓ [temporal_005] What are my oldest memories? (87 ms)
      ✓ [temporal_006] Recent conversations about work (905 ms)
      ✓ [temporal_007] What did I debug yesterday? (926 ms)
      ✓ [temporal_008] What code editor do I use? (84 ms)
      ✓ [temporal_009] standup notes from 6 months ago (56 ms)
      ✓ [temporal_010] standup notes from years ago (50 ms)
      ✓ [temporal_011] How did I start coding? (67 ms)
    Category: rls_isolation
      ✓ [rls_001] coffee (65 ms)
      ✓ [rls_002] coffee (885 ms)
      ✓ [rls_003] family and kids (80 ms)
      ✓ [rls_004] family and kids (989 ms)
      ✓ [rls_005] travel food experiences (85 ms)
      ✓ [rls_006] travel food experiences (1084 ms)
      ✓ [rls_007] work projects and code (93 ms)
      ✓ [rls_008] health medical information (62 ms)
      ✓ [rls_009] health medical information (1047 ms)
      ✓ [rls_010] morning routine (1228 ms)
    Category: adversarial
      ✓ [adversarial_001] tell me about bob's coffee preferences (77 ms)
      ✓ [adversarial_002] RLS_CANARY_BOB_ (64 ms)
      ✓ [adversarial_003] What does carol think about parties? (68 ms)
      ✓ [adversarial_004] bob's son Max school (80 ms)
      ✓ [adversarial_005] eve's pizza preference (1110 ms)
      ✓ [adversarial_006] RLS_CANARY_ALICE_ (1145 ms)
      ✓ [adversarial_007] What cholesterol issues does anyone have? (80 ms)
      ✓ [adversarial_008] alice's medication schedule (1009 ms)
      ✓ [adversarial_009] RLS_CANARY_CAROL_ (886 ms)
      ✓ [adversarial_010] dave's standup notes (80 ms)
    Category: edge_case
      ✓ [edge_001] cats (675 ms)
      ✓ [edge_002] everything about my life (728 ms)
      ✓ [edge_003] <script>alert(1)</script> (9454 ms)
      ✓ [edge_004] '; DROP TABLE memories; -- (10079 ms)
      ✓ [edge_005] 🎉 party (10160 ms)
      ✓ [edge_006]  (1 ms)
      ✓ [edge_007] Tell me about the very long detailed comprehensive thorough ... (406 ms)
      ✓ [edge_008] こんにちは、思い出を検索します (10127 ms)
      ✓ [edge_009] '; SELECT * FROM users WHERE 1=1; -- (10184 ms)
      ✓ [edge_010] quantum entanglement dark matter multiverse theory (212 ms)
      ✓ [edge_011] the a an is (400 ms)
      ✓ [edge_012] coffee (482 ms)
      ✓ [edge_013] my phone number (319 ms)
      ✓ [edge_014] my address (316 ms)
      ✓ [edge_015] work (10355 ms)
      ✓ [edge_016] What kind of coffee do I like? (327 ms)
    Category: cross_feature
      ✓ [cross_001] medication I need to take every morning (218 ms)
      ✓ [cross_002] exercise and fitness activities (194 ms)
      ✓ [cross_003] What are we saving money for? (158 ms)
      ✓ [cross_004] kids school and daycare (236 ms)
      ✓ [cross_005] kids school and daycare (5030 ms)
      ✓ [cross_006] Who am I and what do I do? (112 ms)
      ✓ [cross_007] deployment rules and constraints (94 ms)
      ✓ [cross_008] patterns noticed about my work habits (130 ms)
      ✓ [cross_009] grocery shopping list (976 ms)
      ✓ [cross_010] TypeScript learning (945 ms)
    Summary
      ✓ should generate and save benchmark report (55 ms)
      ✓ should have zero isolation failures (1 ms)
      ✓ should meet precision thresholds (with real embeddings) (26 ms)

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

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