09 — Memory Consolidation
How approved material consolidates into organizational memory scopes with provenance.
Overview
The Memory Consolidator is a scheduled Cloudflare Worker that aggregates approved triage items into consolidated memories. It bridges the gap between individual triage candidates and durable organizational knowledge.
File: services/knowledge/src/memory-consolidator.ts
Schedules
| Schedule | Trigger | What It Does |
|---|---|---|
| Hourly | Cron (every hour) | Topic clustering of recent sessions |
| Daily | Cron (midnight UTC) | Deep user/account consolidation + health signals |
| Weekly | Cron (Sunday midnight UTC) | Cross-account pattern extraction + best practices |
Hourly Consolidation
- Fetch approved triage items from last hour
- Group by category/topic
- Generate topic summary using Think service (Workers AI fallback)
- Write
consolidated_memorieswith typetopic
Minimum threshold: 2+ sessions per topic.
Daily Consolidation
- Fetch approved triage items from last 24 hours
- User-level: Group by user, generate user summaries
- Account-level: Group by account, generate account summaries
- Send health signals for at-risk accounts
- Cleanup memories beyond retention period
Minimum threshold: 2+ sessions per user/account.
Weekly Consolidation
- Fetch consolidated memories from past week (topic + user + account types)
- Extract cross-cutting patterns using Think service
- Identify best practices
- Write pattern-type consolidated memory
- Update knowledge base with extracted patterns
Minimum threshold: 5+ consolidated memories.
Data Flow
Approved Triage Items
|
v
fetchApprovedTriageItems() — Knowledge Service API
|
v
Group by topic/user/account
|
v
Generate Summary (Think service / Workers AI)
|
v
storeConsolidatedMemory() — D1 direct write
|
v
consolidated_memories table
Lock Mechanism
The Consolidator uses a Durable Object lock to prevent duplicate processing:
acquire-lockwith TTL (3600 seconds)- Release after processing completes
- If lock not acquired, skip this cycle
Fallback Behavior
If the Think service is unavailable, the Consolidator uses a fallback summary:
function createFallbackSummary(sessions: SessionMemory[]): SummaryResult {
return {
summary: `Consolidated ${sessions.length} sessions`,
insights: allInsights.slice(0, 5),
themes: allEntities.slice(0, 5),
actions: [],
risk_level: avgSentiment < -0.3 ? "elevated" : "normal",
};
}
Retention
Old consolidated memories are cleaned up based on MEMORY_RETENTION_DAYS configuration. Default cleanup runs during daily consolidation.