Skip to content

fix(awareness): correct waking cycle schedule#280

Merged
heybeaux merged 1 commit into
stagingfrom
fix/waking-cycle-schedule
Jun 20, 2026
Merged

fix(awareness): correct waking cycle schedule#280
heybeaux merged 1 commit into
stagingfrom
fix/waking-cycle-schedule

Conversation

@heybeaux

@heybeaux heybeaux commented Jun 20, 2026

Copy link
Copy Markdown
Owner

Summary

  • fix the default waking-cycle cron schedule so it runs at 08:00, 12:00, 16:00, and 20:00 instead of every 4 minutes
  • export the default schedule constant and log the resolved Awareness schedule at service startup
  • update the waking-cycle spec with the six-field cron expression and add regression coverage for the next run hours

Verification

  • pnpm jest --forceExit --detectOpenHandles --maxWorkers=2 --runTestsByPath src/awareness/config/awareness.config.spec.ts src/awareness/waking-cycle.service.spec.ts
  • pnpm build

Production mitigation already applied

  • Railway production currently has AWARENESS_ENABLED=false as an emergency brake
  • AWARENESS_SCHEDULE is set to 0 0 8,12,16,20 * * *
  • Verified API health and no new Waking Cycle starts across a full 4-minute boundary after mitigation

Summary by CodeRabbit

  • New Features

    • Updated Waking Cycle scheduling to run at fixed times (8 AM, 12 PM, 4 PM, 8 PM) instead of every 4 hours during business hours.
  • Tests

    • Added comprehensive test suite for schedule configuration verification and environment override behavior.
  • Chores

    • Added initialization logging to track awareness configuration status.

@coderabbitai

coderabbitai Bot commented Jun 20, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The default awareness cron expression is changed from '0 */4 8-23 * * *' (every 4 hours) to '0 0 8,12,16,20 * * *' (fixed at 08:00, 12:00, 16:00, 20:00). A new exported constant DEFAULT_AWARENESS_SCHEDULE holds this value. The WakingCycleService constructor now logs the configured enabled and schedule values. A new Jest spec validates default and override schedule behavior.

Changes

Awareness Schedule Default Update

Layer / File(s) Summary
AwarenessConfig schedule constant and default
src/awareness/config/awareness.config.ts
Exports DEFAULT_AWARENESS_SCHEDULE ('0 0 8,12,16,20 * * *') and updates AwarenessConfig.schedule to use it as the fallback, replacing '0 */4 8-23 * * *', with refreshed cron-field inline docs.
WakingCycleService startup logging
src/awareness/waking-cycle.service.ts
Constructor body changed from empty to logging the current AwarenessConfig.enabled and AwarenessConfig.schedule values at service instantiation.
Jest spec and spec doc update
src/awareness/config/awareness.config.spec.ts, specs/waking-cycle-spec.md
New Jest suite asserts the default schedule constant and validates computed next-run hours as [8, 12, 16, 20], tests env-var override, and updates the spec doc cron example to match the new default.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • heybeaux/engram#8: The status controller reads AwarenessConfig, so changes to AwarenessConfig.schedule and its exported constant directly affect what that endpoint reports.

Poem

🐇 Tick-tock, the schedule's neat,
No more "every four" — now fixed beats!
At eight, twelve, sixteen, twenty too,
The waking cycle wakes on cue.
With logs and tests to prove it right,
The rabbit hops at morning light! 🌅

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title accurately summarizes the main change: fixing the waking cycle schedule from an incorrect cron expression to the correct one with proper timing (08:00, 12:00, 16:00, 20:00).
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/waking-cycle-schedule

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 and usage tips.

@github-actions

Copy link
Copy Markdown
Contributor

✅ Recall Benchmark Results

╔══════════════════════════════════════════════════════════════╗
    ║              ENGRAM RECALL BENCHMARK REPORT                 ║
    ╚══════════════════════════════════════════════════════════════╝
    
      Git SHA:    a76c873
      Branch:     HEAD
      Timestamp:  2026-06-20T17:10:19.718Z
    
    ┌─────────────────────────────────────────────────────────────┐
    │  OVERALL SCORES                                            │
    ├─────────────────────────────────────────────────────────────┤
    │  Total Queries:   81                                        │
    │  Passed:          78 / 81 (96.3%)                                        
    │  Precision@5:     95.7%  ✅  (threshold: 70%)
    │  Recall@20:       97.5%
    │  MRR:             0.8215
    │  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    │ 8      │ 80.0%    │ 100.0%   │ 0.6643   │ 100.0%    │
    │ edge_case        │ 16    │ 16     │ 100.0%   │ 100.0%   │ 0.9323   │ 100.0%    │
    │ emotional        │ 10    │ 10     │ 95.0%    │ 100.0%   │ 0.7238   │ 100.0%    │
    │ rls_isolation    │ 10    │ 10     │ 100.0%   │ 100.0%   │ 0.8083   │ 100.0%    │
    │ semantic         │ 14    │ 13     │ 92.9%    │ 100.0%   │ 0.7077   │ 100.0%    │
    │ temporal         │ 11    │ 11     │ 100.0%   │ 81.8%    │ 0.8864   │ 100.0%    │
    └──────────────────┴───────┴────────┴──────────┴──────────┴──────────┴───────────┘
    
    ❌ FAILED QUERIES (3):
    
      [semantic_002] "Tell me about my morning routine" (user: alice)
        ⚠️  ZERO HITS: expected alice_coffee_002 in top 5
        📊 Precision@5: 0.0% — hit: [], missed: [alice_coffee_002]
        📋 Actual top 5: [alice_family_001, alice_health_001, alice_last_week_work_001, alice_recent_convo_001, alice_anxiety_001]
    
      [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_emotion_change_001, alice_cooking_001, alice_calm_001]
    
      [cross_006] "Who am I and what do I do?" (user: alice)
        ⚠️  ZERO HITS: expected alice_identity_project_001 in top 5
        📊 Precision@5: 0.0% — hit: [], missed: [alice_identity_project_001]
        📋 Actual top 5: [alice_anxiety_001, alice_stress_001, alice_oldest_memory_001, alice_calm_001, alice_work_002]
    
    
    ✅ ALL THRESHOLDS PASSED

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

  console.log
    📁 Report saved: /home/runner/work/engram/engram/test/benchmark/results/benchmark-2026-06-20T17-10-19-738Z.json

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

  console.warn
    ⚠️  3 zero-hit queries (tracked, not blocking): semantic_002, cross_001, cross_006

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

      at checkThresholds (benchmark/scoring.ts:200:13)
      at buildReport (benchmark/scoring.ts:181:23)
      at Object.<anonymous> (benchmark/recall-benchmark.e2e-spec.ts:172:33)

  console.warn
    ⚠️  Zero-hit queries (3): semantic_002, cross_001, cross_006

    �[0m �[90m 194 |�[39m         �[36mif�[39m (zeroHitQueries�[33m.�[39mlength �[33m>�[39m �[35m0�[39m) {
     �[90m 195 |�[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 196 |�[39m           console�[33m.�[39mwarn(
     �[90m     |�[39m                   �[31m�[1m^�[22m�[39m
     �[90m 197 |�[39m             �[32m`⚠️  Zero-hit queries (${zeroHitQueries.length}): ${ids}`�[39m�[33m,�[39m
     �[90m 198 |�[39m           )�[33m;�[39m
     �[90m 199 |�[39m         }�[0m

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

PASS test/benchmark/recall-benchmark.e2e-spec.ts (93.735 s)
  Recall Benchmark
    Category: semantic
      ✓ [semantic_001] What kind of coffee do I like? (161 ms)
      ✓ [semantic_002] Tell me about my morning routine (73 ms)
      ✓ [semantic_003] What tech stack am I using? (67 ms)
      ✓ [semantic_004] coffee preferences (535 ms)
      ✓ [semantic_005] What books have I been reading? (66 ms)
      ✓ [semantic_006] favorite dinner recipe (49 ms)
      ✓ [semantic_007] house savings goal (55 ms)
      ✓ [semantic_008] What framework am I using for the frontend? (651 ms)
      ✓ [semantic_009] flight seat preference (57 ms)
      ✓ [semantic_010] ensemble search architecture decision (54 ms)
      ✓ [semantic_011] What coffee roast do I prefer? (317 ms)
      ✓ [negative_001] quantum physics black holes dark matter (47 ms)
      ✓ [negative_002] ancient Egyptian hieroglyphics translation (799 ms)
      ✓ [minimal_001] pizza preference (397 ms)
    Category: emotional
      ✓ [emotional_001] What makes me happy? (90 ms)
      ✓ [emotional_002] times I felt sad or grieving (51 ms)
      ✓ [emotional_003] when I felt stressed or overwhelmed (52 ms)
      ✓ [emotional_004] What am I worried about? (47 ms)
      ✓ [emotional_005] Times I was frustrated (196 ms)
      ✓ [emotional_006] My proudest moments (50 ms)
      ✓ [emotional_007] What stresses me out? (44 ms)
      ✓ [emotional_008] happy about school but worried about costs (46 ms)
      ✓ [emotional_009] How has my attitude toward work changed? (49 ms)
      ✓ [emotional_010] meditation and mental wellbeing (63 ms)
    Category: temporal
      ✓ [temporal_001] What happened today in standup? (272 ms)
      ✓ [temporal_002] recent standup notes from this week (236 ms)
      ✓ [temporal_003] What happened with my daughter recently? (442 ms)
      ✓ [temporal_004] What did I work on last week? (797 ms)
      ✓ [temporal_005] What are my oldest memories? (69 ms)
      ✓ [temporal_006] Recent conversations about work (576 ms)
      ✓ [temporal_007] What did I debug yesterday? (467 ms)
      ✓ [temporal_008] What code editor do I use? (57 ms)
      ✓ [temporal_009] standup notes from 6 months ago (44 ms)
      ✓ [temporal_010] standup notes from years ago (35 ms)
      ✓ [temporal_011] How did I start coding? (46 ms)
    Category: rls_isolation
      ✓ [rls_001] coffee (40 ms)
      ✓ [rls_002] coffee (574 ms)
      ✓ [rls_003] family and kids (54 ms)
      ✓ [rls_004] family and kids (534 ms)
      ✓ [rls_005] travel food experiences (60 ms)
      ✓ [rls_006] travel food experiences (548 ms)
      ✓ [rls_007] work projects and code (56 ms)
      ✓ [rls_008] health medical information (48 ms)
      ✓ [rls_009] health medical information (559 ms)
      ✓ [rls_010] morning routine (521 ms)
    Category: adversarial
      ✓ [adversarial_001] tell me about bob's coffee preferences (269 ms)
      ✓ [adversarial_002] RLS_CANARY_BOB_ (47 ms)
      ✓ [adversarial_003] What does carol think about parties? (48 ms)
      ✓ [adversarial_004] bob's son Max school (62 ms)
      ✓ [adversarial_005] eve's pizza preference (586 ms)
      ✓ [adversarial_006] RLS_CANARY_ALICE_ (578 ms)
      ✓ [adversarial_007] What cholesterol issues does anyone have? (64 ms)
      ✓ [adversarial_008] alice's medication schedule (590 ms)
      ✓ [adversarial_009] RLS_CANARY_CAROL_ (479 ms)
      ✓ [adversarial_010] dave's standup notes (73 ms)
    Category: edge_case
      ✓ [edge_001] cats (488 ms)
      ✓ [edge_002] everything about my life (400 ms)
      ✓ [edge_003] <script>alert(1)</script> (5644 ms)
      ✓ [edge_004] '; DROP TABLE memories; -- (6392 ms)
      ✓ [edge_005] 🎉 party (5450 ms)
      ✓ [edge_006] 
      ✓ [edge_007] Tell me about the very long detailed comprehensive thorough ... (127 ms)
      ✓ [edge_008] こんにちは、思い出を検索します (8792 ms)
      ✓ [edge_009] '; SELECT * FROM users WHERE 1=1; -- (8599 ms)
      ✓ [edge_010] quantum entanglement dark matter multiverse theory (170 ms)
      ✓ [edge_011] the a an is (92 ms)
      ✓ [edge_012] coffee (248 ms)
      ✓ [edge_013] my phone number (61 ms)
      ✓ [edge_014] my address (205 ms)
      ✓ [edge_015] work (595 ms)
      ✓ [edge_016] What kind of coffee do I like? (151 ms)
    Category: cross_feature
      ✓ [cross_001] medication I need to take every morning (132 ms)
      ✓ [cross_002] exercise and fitness activities (92 ms)
      ✓ [cross_003] What are we saving money for? (116 ms)
      ✓ [cross_004] kids school and daycare (60 ms)
      ✓ [cross_005] kids school and daycare (1008 ms)
      ✓ [cross_006] Who am I and what do I do? (139 ms)
      ✓ [cross_007] deployment rules and constraints (55 ms)
      ✓ [cross_008] patterns noticed about my work habits (77 ms)
      ✓ [cross_009] grocery shopping list (608 ms)
      ✓ [cross_010] TypeScript learning (785 ms)
    Summary
      ✓ should generate and save benchmark report (37 ms)
      ✓ should have zero isolation failures (1 ms)
      ✓ should meet precision thresholds (with real embeddings) (16 ms)

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

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

[17:09:26.502] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 139
[17:09:26.580] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 69
[17:09:26.648] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 63
[17:09:27.182] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 529
[17:09:27.249] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 63
[17:09:27.297] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 45
[17:09:27.353] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 52
[17:09:28.004] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 649
[17:09:28.062] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 54
[17:09:28.117] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 51
[17:09:28.434] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 314
[17:09:28.481] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 44
[17:09:29.280] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 796
[17:09:29.678] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 394
[17:09:29.768] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 86
[17:09:29.822] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 49
[17:09:29.874] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 49
[17:09:29.921] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 45
[17:09:30.115] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 191
[17:09:30.167] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 48
[17:09:30.211] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 42
[17:09:30.257] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 43
[17:09:30.306] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 46
[17:09:30.370] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 61
[17:09:30.642] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-dave-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 270
[17:09:30.879] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-dave-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 234
[17:09:31.322] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 441
[17:09:32.119] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 795
[17:09:32.188] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 66
[17:09:32.764] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 573
[17:09:33.232] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 466
[17:09:33.289] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 55
[17:09:33.333] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-dave-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 41
[17:09:33.369] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-dave-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 34
[17:09:33.415] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 42
[17:09:33.455] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 38
[17:09:34.029] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 572
[17:09:34.085] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 50
[17:09:34.620] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 533
[17:09:34.680] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 58
[17:09:35.229] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 547
[17:09:35.284] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 52
[17:09:35.333] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 46
[17:09:35.891] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 556
[17:09:36.412] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 511
[17:09:36.682] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 268
[17:09:36.729] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 45
[17:09:36.778] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 47
[17:09:36.840] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 61
[17:09:37.426] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 584
[17:09:38.004] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 576
[17:09:38.068] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 62
[17:09:38.658] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 587
[17:09:39.134] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 473
[17:09:39.211] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 69
[17:09:39.698] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 485
[17:09:40.099] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 398
[17:09:45.743] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 5641
[17:09:52.133] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 6386
[17:09:57.585] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 5447
[17:09:57.713] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 126
[17:10:06.503] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 8788
[17:10:15.104] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-carol-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 8594
[17:10:15.273] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 166
[17:10:15.366] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 89
[17:10:15.614] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 245
[17:10:15.676] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 58
[17:10:15.881] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 203
[17:10:16.474] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 590
[17:10:16.627] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 148
[17:10:16.760] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 130
[17:10:16.850] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 87
[17:10:16.968] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 113
[17:10:17.027] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 57
[17:10:18.036] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-bob-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 1004
[17:10:18.175] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 130
[17:10:18.231] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 53
[17:10:18.307] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-alice-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 74
[17:10:18.917] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 603
[17:10:19.702] �[32mINFO�[39m (3352): �[36mrequest completed�[39m
    �[35mreq�[39m: {
      "method": "POST",
      "url": "/v1/memories/query"
    }
    �[35maccountId�[39m: "eng_test..."
    �[35muserId�[39m: "test-corpus-user-eve-1781975331064"
    �[35mres�[39m: {
      "statusCode": 201
    }
    �[35mresponseTime�[39m: 782
  console.warn
    ⚠️  3 zero-hit queries (tracked, not blocking): semantic_002, cross_001, cross_006

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

      at checkThresholds (benchmark/scoring.ts:200:13)
      at buildReport (benchmark/scoring.ts:181:23)
      at Object.<anonymous> (benchmark/recall-benchmark.e2e-spec.ts:144:33)

  console.log
    
    ╔══════════════════════════════════════════════════════════════╗
    ║              ENGRAM RECALL BENCHMARK REPORT                 ║
    ╚══════════════════════════════════════════════════════════════╝
    
      Git SHA:    a76c873
      Branch:     HEAD
      Timestamp:  2026-06-20T17:10:19.718Z
    
    ┌─────────────────────────────────────────────────────────────┐
    │  OVERALL SCORES                                            │
    ├─────────────────────────────────────────────────────────────┤
    │  Total Queries:   81                                        │
    │  Passed:          78 / 81 (96.3%)                                        
    │  Precision@5:     95.7%  ✅  (threshold: 70%)
    │  Recall@20:       97.5%
    │  MRR:             0.8215
    │  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    │ 8      │ 80.0%    │ 100.0%   │ 0.6643   │ 100.0%    │
    │ edge_case        │ 16    │ 16     │ 100.0%   │ 100.0%   │ 0.9323   │ 100.0%    │
    │ emotional        │ 10    │ 10     │ 95.0%    │ 100.0%   │ 0.7238   │ 100.0%    │
    │ rls_isolation    │ 10    │ 10     │ 100.0%   │ 100.0%   │ 0.8083   │ 100.0%    │
    │ semantic         │ 14    │ 13     │ 92.9%    │ 100.0%   │ 0.7077   │ 100.0%    │
    │ temporal         │ 11    │ 11     │ 100.0%   │ 81.8%    │ 0.8864   │ 100.0%    │
    └──────────────────┴───────┴────────┴──────────┴──────────┴──────────┴───────────┘
    
    ❌ FAILED QUERIES (3):
    
      [semantic_002] "Tell me about my morning routine" (user: alice)
        ⚠️  ZERO HITS: expected alice_coffee_002 in top 5
        📊 Precision@5: 0.0% — hit: [], missed: [alice_coffee_002]
        📋 Actual top 5: [alice_family_001, alice_health_001, alice_last_week_work_001, alice_recent_convo_001, alice_anxiety_001]
    
      [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_emotion_change_001, alice_cooking_001, alice_calm_001]
    
      [cross_006] "Who am I and what do I do?" (user: alice)
        ⚠️  ZERO HITS: expected alice_identity_project_001 in top 5
        📊 Precision@5: 0.0% — hit: [], missed: [alice_identity_project_001]
        📋 Actual top 5: [alice_anxiety_001, alice_stress_001, alice_oldest_memory_001, alice_calm_001, alice_work_002]
    
    
    ✅ ALL THRESHOLDS PASSED

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

  console.log
    📁 Report saved: /home/runner/work/engram/engram/test/benchmark/results/benchmark-2026-06-20T17-10-19-738Z.json

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

  console.warn
    ⚠️  3 zero-hit queries (tracked, not blocking): semantic_002, cross_001, cross_006

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

      at checkThresholds (benchmark/scoring.ts:200:13)
      at buildReport (benchmark/scoring.ts:181:23)
      at Object.<anonymous> (benchmark/recall-benchmark.e2e-spec.ts:172:33)

  console.warn
    ⚠️  Zero-hit queries (3): semantic_002, cross_001, cross_006

    �[0m �[90m 194 |�[39m         �[36mif�[39m (zeroHitQueries�[33m.�[39mlength �[33m>�[39m �[35m0�[39m) {
     �[90m 195 |�[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 196 |�[39m           console�[33m.�[39mwarn(
     �[90m     |�[39m                   �[31m�[1m^�[22m�[39m
     �[90m 197 |�[39m             �[32m`⚠️  Zero-hit queries (${zeroHitQueries.length}): ${ids}`�[39m�[33m,�[39m
     �[90m 198 |�[39m           )�[33m;�[39m
     �[90m 199 |�[39m         }�[0m

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

PASS test/benchmark/recall-benchmark.e2e-spec.ts (93.735 s)
  Recall Benchmark
    Category: semantic
      ✓ [semantic_001] What kind of coffee do I like? (161 ms)
      ✓ [semantic_002] Tell me about my morning routine (73 ms)
      ✓ [semantic_003] What tech stack am I using? (67 ms)
      ✓ [semantic_004] coffee preferences (535 ms)
      ✓ [semantic_005] What books have I been reading? (66 ms)
      ✓ [semantic_006] favorite dinner recipe (49 ms)
      ✓ [semantic_007] house savings goal (55 ms)
      ✓ [semantic_008] What framework am I using for the frontend? (651 ms)
      ✓ [semantic_009] flight seat preference (57 ms)
      ✓ [semantic_010] ensemble search architecture decision (54 ms)
      ✓ [semantic_011] What coffee roast do I prefer? (317 ms)
      ✓ [negative_001] quantum physics black holes dark matter (47 ms)
      ✓ [negative_002] ancient Egyptian hieroglyphics translation (799 ms)
      ✓ [minimal_001] pizza preference (397 ms)
    Category: emotional
      ✓ [emotional_001] What makes me happy? (90 ms)
      ✓ [emotional_002] times I felt sad or grieving (51 ms)
      ✓ [emotional_003] when I felt stressed or overwhelmed (52 ms)
      ✓ [emotional_004] What am I worried about? (47 ms)
      ✓ [emotional_005] Times I was frustrated (196 ms)
      ✓ [emotional_006] My proudest moments (50 ms)
      ✓ [emotional_007] What stresses me out? (44 ms)
      ✓ [emotional_008] happy about school but worried about costs (46 ms)
      ✓ [emotional_009] How has my attitude toward work changed? (49 ms)
      ✓ [emotional_010] meditation and mental wellbeing (63 ms)
    Category: temporal
      ✓ [temporal_001] What happened today in standup? (272 ms)
      ✓ [temporal_002] recent standup notes from this week (236 ms)
      ✓ [temporal_003] What happened with my daughter recently? (442 ms)
      ✓ [temporal_004] What did I work on last week? (797 ms)
      ✓ [temporal_005] What are my oldest memories? (69 ms)
      ✓ [temporal_006] Recent conversations about work (576 ms)
      ✓ [temporal_007] What did I debug yesterday? (467 ms)
      ✓ [temporal_008] What code editor do I use? (57 ms)
      ✓ [temporal_009] standup notes from 6 months ago (44 ms)
      ✓ [temporal_010] standup notes from years ago (35 ms)
      ✓ [temporal_011] How did I start coding? (46 ms)
    Category: rls_isolation
      ✓ [rls_001] coffee (40 ms)
      ✓ [rls_002] coffee (574 ms)
      ✓ [rls_003] family and kids (54 ms)
      ✓ [rls_004] family and kids (534 ms)
      ✓ [rls_005] travel food experiences (60 ms)
      ✓ [rls_006] travel food experiences (548 ms)
      ✓ [rls_007] work projects and code (56 ms)
      ✓ [rls_008] health medical information (48 ms)
      ✓ [rls_009] health medical information (559 ms)
      ✓ [rls_010] morning routine (521 ms)
    Category: adversarial
      ✓ [adversarial_001] tell me about bob's coffee preferences (269 ms)
      ✓ [adversarial_002] RLS_CANARY_BOB_ (47 ms)
      ✓ [adversarial_003] What does carol think about parties? (48 ms)
      ✓ [adversarial_004] bob's son Max school (62 ms)
      ✓ [adversarial_005] eve's pizza preference (586 ms)
      ✓ [adversarial_006] RLS_CANARY_ALICE_ (578 ms)
      ✓ [adversarial_007] What cholesterol issues does anyone have? (64 ms)
      ✓ [adversarial_008] alice's medication schedule (590 ms)
      ✓ [adversarial_009] RLS_CANARY_CAROL_ (479 ms)
      ✓ [adversarial_010] dave's standup notes (73 ms)
    Category: edge_case
      ✓ [edge_001] cats (488 ms)
      ✓ [edge_002] everything about my life (400 ms)
      ✓ [edge_003] <script>alert(1)</script> (5644 ms)
      ✓ [edge_004] '; DROP TABLE memories; -- (6392 ms)
      ✓ [edge_005] 🎉 party (5450 ms)
      ✓ [edge_006] 
      ✓ [edge_007] Tell me about the very long detailed comprehensive thorough ... (127 ms)
      ✓ [edge_008] こんにちは、思い出を検索します (8792 ms)
      ✓ [edge_009] '; SELECT * FROM users WHERE 1=1; -- (8599 ms)
      ✓ [edge_010] quantum entanglement dark matter multiverse theory (170 ms)
      ✓ [edge_011] the a an is (92 ms)
      ✓ [edge_012] coffee (248 ms)
      ✓ [edge_013] my phone number (61 ms)
      ✓ [edge_014] my address (205 ms)
      ✓ [edge_015] work (595 ms)
      ✓ [edge_016] What kind of coffee do I like? (151 ms)
    Category: cross_feature
      ✓ [cross_001] medication I need to take every morning (132 ms)
      ✓ [cross_002] exercise and fitness activities (92 ms)
      ✓ [cross_003] What are we saving money for? (116 ms)
      ✓ [cross_004] kids school and daycare (60 ms)
      ✓ [cross_005] kids school and daycare (1008 ms)
      ✓ [cross_006] Who am I and what do I do? (139 ms)
      ✓ [cross_007] deployment rules and constraints (55 ms)
      ✓ [cross_008] patterns noticed about my work habits (77 ms)
      ✓ [cross_009] grocery shopping list (608 ms)
      ✓ [cross_010] TypeScript learning (785 ms)
    Summary
      ✓ should generate and save benchmark report (37 ms)
      ✓ should have zero isolation failures (1 ms)
      ✓ should meet precision thresholds (with real embeddings) (16 ms)

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@specs/waking-cycle-spec.md`:
- Line 137: The comment on line 137 describing the default schedule as "every 4
hours during waking hours" does not match the actual cron expression default
shown on line 138, which specifies fixed times at 8, 12, 16, and 20. Update the
comment text to accurately reflect that the default uses fixed-hour scheduling
at those four specific times rather than describing a repeating 4-hour interval.

In `@src/awareness/config/awareness.config.spec.ts`:
- Line 15: The test name 'defaults to every 4 hours, not every 4 minutes' is
misleading because the test validates fixed run times at specific hours
[8,12,16,20], not a repeating every-4-hours pattern. Rename the test to
accurately reflect that it defaults to fixed-run times at those specific hours
rather than using the misleading "every 4 hours" language that suggests a
recurring interval.
- Line 18: The destructured require statement for DEFAULT_AWARENESS_SCHEDULE and
AwarenessConfig violates Prettier formatting rules by being on a single line.
Reformat the destructuring to be multiline by placing the opening brace and each
destructured variable on separate lines, with the closing brace on its own line
before the require function call. This will comply with Prettier's line length
and formatting standards.
- Around line 35-40: The test helper nextRunHours uses getHours() which returns
the hour in the local timezone of the test runner, causing timezone-dependent
test failures in CI environments. Change the return statement from returning
next.getHours() to returning next.getUTCHours() to ensure the function
consistently returns hours in UTC, making the test timezone-independent and
stable across all environments.

In `@src/awareness/config/awareness.config.ts`:
- Line 15: Update the doc string for the default schedule configuration in the
awareness.config.ts file. The current comment states "every 4 hours during
waking hours" but this does not match the actual default cron expression which
is fixed at specific times (08:00, 12:00, 16:00, 20:00). Replace the comment
describing the schedule frequency to accurately reflect that the default
schedule runs at these four specific fixed times throughout the day rather than
at 4-hour intervals.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 214214bc-d869-4ac2-bf34-d8df1e9ed7ef

📥 Commits

Reviewing files that changed from the base of the PR and between 3e409b3 and 62f03ec.

📒 Files selected for processing (4)
  • specs/waking-cycle-spec.md
  • src/awareness/config/awareness.config.spec.ts
  • src/awareness/config/awareness.config.ts
  • src/awareness/waking-cycle.service.ts


# Schedule (cron expression, default every 4 hours during waking hours)
AWARENESS_SCHEDULE=0 */4 8-23 * * *
# Schedule (six-field cron expression, default every 4 hours during waking hours)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Update the comment text to match the fixed-hour default shown on the next line.

Line 137 still describes an every-4-hours schedule, but Line 138 is fixed times (8,12,16,20).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@specs/waking-cycle-spec.md` at line 137, The comment on line 137 describing
the default schedule as "every 4 hours during waking hours" does not match the
actual cron expression default shown on line 138, which specifies fixed times at
8, 12, 16, and 20. Update the comment text to accurately reflect that the
default uses fixed-hour scheduling at those four specific times rather than
describing a repeating 4-hour interval.

}
});

it('defaults to every 4 hours, not every 4 minutes', () => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Rename the test to reflect fixed-run times instead of “every 4 hours.”

The assertion validates fixed hours [8,12,16,20], so the title should match that behavior.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/awareness/config/awareness.config.spec.ts` at line 15, The test name
'defaults to every 4 hours, not every 4 minutes' is misleading because the test
validates fixed run times at specific hours [8,12,16,20], not a repeating
every-4-hours pattern. Rename the test to accurately reflect that it defaults to
fixed-run times at those specific hours rather than using the misleading "every
4 hours" language that suggests a recurring interval.

it('defaults to every 4 hours, not every 4 minutes', () => {
delete process.env.AWARENESS_SCHEDULE;

const { DEFAULT_AWARENESS_SCHEDULE, AwarenessConfig } = require('./awareness.config');

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix the Prettier violation in the destructured require.

This line is flagged by ESLint/Prettier and should be multiline-formatted.

Suggested patch
-    const { DEFAULT_AWARENESS_SCHEDULE, AwarenessConfig } = require('./awareness.config');
+    const {
+      DEFAULT_AWARENESS_SCHEDULE,
+      AwarenessConfig,
+    } = require('./awareness.config');
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const { DEFAULT_AWARENESS_SCHEDULE, AwarenessConfig } = require('./awareness.config');
const {
DEFAULT_AWARENESS_SCHEDULE,
AwarenessConfig,
} = require('./awareness.config');
🧰 Tools
🪛 ESLint

[error] 18-18: Replace ·DEFAULT_AWARENESS_SCHEDULE,·AwarenessConfig with ⏎······DEFAULT_AWARENESS_SCHEDULE,⏎······AwarenessConfig,⏎···

(prettier/prettier)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/awareness/config/awareness.config.spec.ts` at line 18, The destructured
require statement for DEFAULT_AWARENESS_SCHEDULE and AwarenessConfig violates
Prettier formatting rules by being on a single line. Reformat the destructuring
to be multiline by placing the opening brace and each destructured variable on
separate lines, with the closing brace on its own line before the require
function call. This will comply with Prettier's line length and formatting
standards.

Source: Linters/SAST tools

Comment on lines +35 to +40
let cursor = new Date('2026-06-20T07:59:59-07:00');

return Array.from({ length: 4 }, () => {
const next = cron.getNextDateFrom(cursor).toJSDate();
cursor = new Date(next.getTime() + 1000);
return next.getHours();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🌐 Web query:

For cron version 4.4.0, what is the exact CronTime constructor signature, and what is the recommended way to force UTC when using getNextDateFrom?

💡 Result:

In cron version 4.4.0, the CronTime constructor has the following signature [1][2][3]: constructor(time: string | Date, zone?: string, utcOffset?: number) The parameters are: - time: [REQUIRED] The cron expression string or a JavaScript Date object [1][3]. - zone: [OPTIONAL] A timezone string (e.g., 'America/Los_Angeles'). This cannot be used simultaneously with utcOffset [1][4]. - utcOffset: [OPTIONAL] A numeric UTC offset in minutes [1][4]. To force UTC when using getNextDateFrom, the recommended approach is to pass the 'UTC' zone string as the second argument to the method [5][4]. The method signature for getNextDateFrom is defined as [4]: getNextDateFrom(start: Date | DateTime, timeZone?: string): DateTime When you provide 'UTC' as the timeZone argument, the library ensures the calculation is performed within the UTC context [5][4]. Example usage: const cronTime = new CronTime('0 0 * * *'); const nextDate = cronTime.getNextDateFrom(new Date, 'UTC');

Citations:


🏁 Script executed:

find . -name "awareness.config.spec.ts" -type f

Repository: heybeaux/engram

Length of output: 107


🏁 Script executed:

head -50 ./src/awareness/config/awareness.config.spec.ts | tail -25

Repository: heybeaux/engram

Length of output: 898


Fix timezone instability in nextRunHours to prevent flaky CI tests.

The test helper uses new Date('2026-06-20T07:59:59-07:00') and getHours(), which depend on the runner's local timezone. Expected hours [8, 12, 16, 20] will fail in CI environments with different timezone settings.

Apply this fix
 function nextRunHours(schedule: string): number[] {
-  const cron = new CronTime(schedule);
-  let cursor = new Date('2026-06-20T07:59:59-07:00');
+  const cron = new CronTime(schedule, 'UTC');
+  let cursor = new Date('2026-06-20T07:59:59Z');

   return Array.from({ length: 4 }, () => {
     const next = cron.getNextDateFrom(cursor).toJSDate();
     cursor = new Date(next.getTime() + 1000);
-    return next.getHours();
+    return next.getUTCHours();
   });
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
let cursor = new Date('2026-06-20T07:59:59-07:00');
return Array.from({ length: 4 }, () => {
const next = cron.getNextDateFrom(cursor).toJSDate();
cursor = new Date(next.getTime() + 1000);
return next.getHours();
function nextRunHours(schedule: string): number[] {
const cron = new CronTime(schedule, 'UTC');
let cursor = new Date('2026-06-20T07:59:59Z');
return Array.from({ length: 4 }, () => {
const next = cron.getNextDateFrom(cursor).toJSDate();
cursor = new Date(next.getTime() + 1000);
return next.getUTCHours();
});
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/awareness/config/awareness.config.spec.ts` around lines 35 - 40, The test
helper nextRunHours uses getHours() which returns the hour in the local timezone
of the test runner, causing timezone-dependent test failures in CI environments.
Change the return statement from returning next.getHours() to returning
next.getUTCHours() to ensure the function consistently returns hours in UTC,
making the test timezone-independent and stable across all environments.

/**
* Cron expression for the Waking Cycle scheduler.
* Default: every 4 hours during waking hours (08:00–23:00).
* Default: every 4 hours during waking hours.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Update the default-schedule doc string to match the new fixed-hours cron.

Line 15 says the default is “every 4 hours,” but the exported default is fixed at 08:00,12:00,16:00,20:00. Please align the comment with the actual value.

Suggested patch
-   * Default: every 4 hours during waking hours.
+   * Default: runs at 08:00, 12:00, 16:00, and 20:00.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
* Default: every 4 hours during waking hours.
* Default: runs at 08:00, 12:00, 16:00, and 20:00.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/awareness/config/awareness.config.ts` at line 15, Update the doc string
for the default schedule configuration in the awareness.config.ts file. The
current comment states "every 4 hours during waking hours" but this does not
match the actual default cron expression which is fixed at specific times
(08:00, 12:00, 16:00, 20:00). Replace the comment describing the schedule
frequency to accurately reflect that the default schedule runs at these four
specific fixed times throughout the day rather than at 4-hour intervals.

@heybeaux heybeaux merged commit 7e84d83 into staging Jun 20, 2026
9 of 10 checks passed
@heybeaux heybeaux deleted the fix/waking-cycle-schedule branch June 20, 2026 17:43
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