Date: January 4, 2026 Component: AgentDB (Primary Memory System) Version: 2.0 (AgentDB Migration) Status: Specification
| ADR | Relationship |
|---|---|
| ADR-003: Memory Persistence | Authorizes this spec |
The Memory System is the foundational persistent storage and retrieval layer for the Cognitive Puzzle Solver POC. It bridges the gap between ephemeral working memory (active puzzle state) and long-term knowledge consolidation (dreaming pipeline).
Core Responsibilities:
- Experience Logging: Capture all solve attempts, moves, strategies, and outcomes during GRASP iterations
- Pattern Storage: Persist extracted patterns and consolidated knowledge from dreaming cycles
- Similarity Retrieval: Query similar past experiences to inform current solving decisions
- Knowledge Consolidation: Support the 5-phase dreaming pipeline with pattern distillation and abstraction
- Transfer Learning: Enable skill and strategy reuse across different puzzles and variants
┌─────────────────────────────────────────────────────────────┐
│ COGNITIVE PUZZLE SOLVER │
├─────────────────────────────────────────────────────────────┤
│ │
│ SOLVING PHASE (DAY) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ GRASP Loop → Working Memory (in-memory) │ │
│ │ ↓ │ │
│ │ Memory System: Experience logging & retrieval │ │
│ └─────────────────────────────────────────────────────┘ │
│ ↓ │
│ DREAMING PHASE (NIGHT) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Memory System: Pattern distillation & consolidation │ │
│ │ ↓ │ │
│ │ Abstraction Ladder → Consolidated Knowledge │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Upstream Dependencies (Memory System depends on):
- Puzzle Engine: Provides
PuzzleState,Grid,Movestructures - GRASP Loop: Generates
Experience,ValidationResultdata - Attention Mechanism: Supplies focus selection context
Downstream Dependencies (Components that depend on Memory System):
- GRASP Synthesize Phase: Queries similar experiences for insight generation
- Dreaming Pipeline: Reads all experiences for consolidation
- Benchmarking Framework: Analyzes stored metrics and learning curves
The Memory System uses a two-tier architecture to balance performance and persistence:
Purpose: Fast access to active solving state (sub-second read/write)
Storage Duration: Single puzzle solve session
Data Structures:
interface WorkingMemory {
// Current puzzle state
grid: number[][]; // 9x9 or 16x16 grid
candidates: Map<string, Set<number>>; // "row,col" → possible values
// Attention context
focus: Cell; // Current cell being examined
recentMoves: Move[]; // Last 5-10 moves (circular buffer)
// Active solving context
activeStrategy: string; // Current strategy being applied
lastVisited: Map<string, number>; // "row,col" → timestamp
}Operations:
updateGrid(cell: Cell, value: number): voidupdateCandidates(cell: Cell, candidates: Set<number>): voidsetFocus(cell: Cell): voidaddMove(move: Move): voidclear(): void- Called after puzzle completion
Performance Target: <1ms for all operations
Purpose: Long-term experience storage, pattern consolidation, cross-session learning
Storage Duration: Unlimited (until explicit cleanup)
Data Categories:
- Episodic Memory: Individual solve attempts and trajectories
- Semantic Memory: Extracted patterns and abstraction ladders
- Skill Library: Reusable strategies and techniques (AgentDB only)
- Reflexion Memory: Error-correction pairs (AgentDB only)
Operations (detailed in Section 2.3)
Primary System: AgentDB
- Implementation: Advanced vector database with RL capabilities (v2.0.0+)
- Status: Primary Production System
- Core Features:
- ReasoningBank: Semantic pattern matching
- ReflexionMemory: Episodic replay with self-critique
- SkillLibrary: Transformation of successful patterns into reusable, composable skills
- Causal Memory Graph: Tracking interventions and outcomes
Requirement: Capture all solving attempts with full context
interface ExperienceLogOperation {
// Basic logging (ReasoningBank)
logMove(move: Move, outcome: ValidationResult): Promise<void>;
logStrategy(strategy: string, result: ValidationResult): Promise<void>;
logInsight(insight: Insight): Promise<void>;
// Enhanced logging (AgentDB only)
storeReflexion(experience: {
trajectory: Move[];
outcome: ValidationResult;
error: Error | null;
correction: Move | null;
}): Promise<void>;
}Data to Capture:
- Move sequence (trajectory)
- Strategy applied at each step
- Validation outcome (success/failure/progress)
- Insights generated during synthesis
- Errors and corrections (AgentDB only)
- Timing and performance metrics
- Importance score (0-1, calculated at creation per Spec 03 formula)
- Grid context metrics (empty cells, constraint density)
- Reasoning depth proxy (character count)
Storage Format:
{
"experienceId": "uuid",
"sessionId": "session-uuid",
"puzzleId": "puzzle-uuid",
"timestamp": 1704384000000,
"trajectory": [
{
"cell": { "row": 0, "col": 4 },
"value": 7,
"strategy": "naked_single",
"timestamp": 1704384001000
}
],
"outcome": "solved",
"duration": 45000,
"importance": 0.9,
"context": {
"emptyCellsAtMove": 45,
"reasoningLength": 312,
"constraintDensity": 3.2
},
"insights": [
{
"type": "strategy",
"content": "Naked singles effective in early solving",
"confidence": 0.85
}
]
}Performance Target: <10ms per log operation
Requirement: Find similar past experiences to inform current solving
interface SimilarityRetrievalOperation {
// AgentDB Native Retrieval
retrieveWithReasoning(context: PuzzleState, options: {
k: number; // Top-k results
useMMR: boolean; // Maximal Marginal Relevance
synthesizeContext: boolean; // Rich context generation
domain: string; // Filter by domain
}): Promise<RichContext>;
}Similarity Criteria:
- Grid State Similarity: Percentage of cells filled, candidate set overlap
- Strategy Context: Previously successful strategies in similar states
- Difficulty Level: Prefer experiences from same difficulty tier
- Recency: Weight recent experiences higher (temporal decay)
Retrieval Algorithm (ReasoningBank):
1. Convert PuzzleState to feature vector
- Filled cells: 81 dimensions (binary)
- Candidate counts: 81 dimensions (integer)
- Strategy sequence: embedding vector
2. Query ReasoningBank pattern matching
- Find experiences with similar feature patterns
- Apply recency weighting
3. Return top-k (default k=10) experiences
Retrieval Algorithm (AgentDB - Enhanced):
1. Convert PuzzleState to embedding vector (384-dim)
- Use PatternMatcher agent for HNSW search
2. Apply Maximal Marginal Relevance (MMR) if enabled
- Balance relevance vs diversity
- Avoid redundant similar experiences
3. Use ContextSynthesizer agent to generate rich context
- Synthesize insights from multiple experiences
- Identify common success patterns
4. Filter by domain and apply skill library
- Match applicable skills from auto-consolidation
Performance Targets:
- ReasoningBank: <50ms for top-10 query
- AgentDB: <1ms for top-10 query (HNSW indexing)
Requirement: Extract reusable patterns from raw experiences
interface PatternDistillationOperation {
// Basic distillation (ReasoningBank)
distillPatterns(sessionId: string, options?: {
minImportance?: number;
compressionRatio?: number;
}): Promise<Pattern[]>;
// Enhanced distillation (AgentDB only)
consolidateSkills(filter: {
minSuccessRate: number;
domain: string;
minUsageCount?: number;
}): Promise<Skill[]>;
}Distillation Process (ReasoningBank):
1. TRIAGE: Filter experiences by importance
- Successful solves weighted higher
- Novel strategies prioritized
- Error patterns included for learning
2. CLUSTER: Group similar experiences
- K-means clustering on feature vectors
- Target: 10:1 compression ratio
3. EXTRACT: Generate pattern from each cluster
- Identify common strategy sequence
- Extract conditions and actions
- Calculate success rate
Distillation Process (AgentDB - Enhanced):
1. CURATE: ExperienceCurator agent filters by quality
- Automatic quality scoring
- Remove noise and outliers
2. OPTIMIZE: MemoryOptimizer consolidates patterns
- Graph-based pattern merging
- Quantization for 4-32x compression
3. AUTO-SKILL: Skill library auto-extraction
- Identify reusable techniques
- Track transferability scores
- Build skill dependency graph
Pattern Schema:
{
"patternId": "uuid",
"type": "strategy",
"name": "naked_single_detection",
"description": "When cell has only one candidate, place that digit",
"conditions": [
"cell.candidates.size === 1",
"grid[cell.row][cell.col] === 0"
],
"actions": [
"place digit in cell",
"update candidates in row/col/box"
],
"successRate": 0.95,
"usageCount": 47,
"examples": ["exp-uuid-1", "exp-uuid-2"]
}Performance Target: <5 seconds for session distillation (50-100 experiences)
Requirement: Generate multi-level abstraction hierarchy from patterns
interface AbstractionLadderOperation {
buildAbstractionLadder(patterns: Pattern[], options?: {
maxLevels?: number;
minPatternsPerLevel?: number;
}): Promise<AbstractionLadder>;
}Ladder Construction Algorithm:
INPUT: 47 patterns from distillation
TARGET: 4-level abstraction ladder
LEVEL 0 (Specific): Individual patterns
├── Pattern 1: "Naked single in R3C5"
├── Pattern 2: "Hidden single in box 7"
└── Pattern 3: "Pointing pair eliminates candidates"
(47 total)
LEVEL 1 (Techniques): Group by technique category
├── Technique 1: "Naked singles"
│ └── Subsumes: Pattern 1, Pattern 4, Pattern 9...
├── Technique 2: "Hidden singles"
│ └── Subsumes: Pattern 2, Pattern 7...
└── Technique 3: "Pointing pairs"
└── Subsumes: Pattern 3, Pattern 12...
(~12 techniques)
LEVEL 2 (Categories): Group techniques by approach
├── Category 1: "Elimination strategies"
│ └── Subsumes: Naked singles, Hidden singles, Pointing pairs...
├── Category 2: "Placement strategies"
│ └── Subsumes: Box/line reduction, Naked pairs...
└── Category 3: "Pattern recognition"
└── Subsumes: X-Wing, Swordfish...
(~5 categories)
LEVEL 3 (Principles): Abstract meta-strategies
├── Principle 1: "Constraint propagation"
│ └── Subsumes: All elimination and placement strategies
├── Principle 2: "Most constrained first"
│ └── Subsumes: Attention mechanisms, focus selection
└── Principle 3: "Consistency maintenance"
└── Subsumes: Validation, backtracking prevention
(~3 principles)
LEVEL 4 (Meta): Top-level generalization
└── Meta: "Iterative constraint satisfaction + informed search"
└── Subsumes: All principles
(1 meta-concept)
Abstraction Criteria:
- Vertical Consistency: Higher levels must subsume lower levels
- Horizontal Coherence: Items at same level have similar abstraction degree
- Groundedness: All abstractions traceable to specific experiences
Output Format:
{
"domain": "sudoku-solving",
"levels": [
{
"level": 0,
"name": "Specific Patterns",
"patterns": [ /* 47 patterns */ ],
"generalizations": []
},
{
"level": 1,
"name": "Techniques",
"patterns": [ /* 12 technique patterns */ ],
"generalizations": [
"Naked singles: when cell has one candidate",
"Hidden singles: when digit has one location in unit"
]
}
// ... levels 2-4
],
"createdAt": 1704384000000
}Performance Target: <30 seconds for 4-level ladder construction
Requirement: Integrate and verify consolidated knowledge
interface KnowledgeConsolidationOperation {
consolidate(experiences: Experience[]): Promise<ConsolidatedKnowledge>;
verify(knowledge: ConsolidatedKnowledge): Promise<boolean>;
}Consolidation Process:
1. INTEGRATE: Cross-connect patterns across abstraction levels
- Build pattern dependency graph
- Identify prerequisite relationships
- Mark mutually exclusive strategies
2. PRUNE: Remove redundant/contradictory patterns
- Similarity threshold: 0.95
- Keep higher success rate if duplicate
- Log conflicts for manual review
3. VERIFY: Consistency checking
- All patterns have grounded examples
- Abstraction ladder maintains vertical consistency
- No logical contradictions in strategy sequences
- Success rates consistent with examples
Verification Checks:
interface VerificationResult {
groundednessCheck: boolean; // All abstractions trace to experiences
consistencyCheck: boolean; // No logical contradictions
completenessCheck: boolean; // All experiences represented
qualityScore: number; // Overall consolidation quality (0-1)
issues: string[]; // List of detected problems
}Storage:
{
"consolidatedKnowledgeId": "uuid",
"sessionIds": ["session-1", "session-2"],
"patterns": [ /* 5 consolidated patterns */ ],
"abstractionLadder": { /* 4-level ladder */ },
"compressionRatio": 9.4,
"verificationStatus": "verified",
"timestamp": 1704384000000,
"metadata": {
"experienceCount": 47,
"patternCount": 5,
"verificationScore": 0.92
}
}| Operation | ReasoningBank | AgentDB | Requirement |
|---|---|---|---|
| Experience Logging | <10ms | <5ms | Real-time during GRASP |
| Similarity Query (k=10) | <50ms | <1ms | GRASP synthesis phase |
| Batch Insert (100) | ~1s | <10ms | Dreaming capture phase |
| Pattern Distillation | <5s | <2s | Dreaming compress phase |
| Abstraction Ladder | <30s | <10s | Dreaming abstract phase |
| Large Query (1M vectors) | ~100s | <10ms | Transfer learning tests |
| Memory Footprint | Baseline | 4-32x smaller | Large dataset handling |
POC Scale:
- 100 puzzle solves
- ~50 experiences per solve
- Total: 5,000 experiences
- Expected storage: 50-100MB (ReasoningBank), 10-25MB (AgentDB with quantization)
Future Scale (Beyond POC):
- 10,000+ puzzle solves
- 500,000+ experiences
- AgentDB required for performance at this scale
Data Integrity:
- ACID compliance for all writes
- No data loss on crashes (use transactions)
- Corruption detection and repair
Consistency:
- Pattern success rates match underlying experiences
- Abstraction ladders maintain vertical consistency
- No dangling references between patterns and experiences
Availability:
- 99.9% uptime during POC (3 weeks)
- Graceful degradation if memory system unavailable (fallback to working memory only)
- Backup strategy: Daily exports to JSON
API Stability:
- ReasoningBank: Stable, production-tested
- AgentDB: Alpha version - pin to v2.0.0-alpha.3.3
Backward Compatibility:
- AgentDB maintains 100% API compatibility with ReasoningBank
- Migration path from ReasoningBank to AgentDB must preserve all data
Monitoring:
- Log all memory operations
- Track performance metrics (latency, throughput)
- Alert on anomalies (high latency, errors)
export interface ReasoningBankAdapter {
// =========================================================================
// Initialization & Setup
// =========================================================================
/**
* Initialize ReasoningBank database
* @returns void
* CLI: npx claude-flow@alpha agent memory init
*/
initialize(): Promise<void>;
/**
* Get memory system status and statistics
* @returns Statistics including experience count, pattern count, storage size
* CLI: npx claude-flow@alpha agent memory status
*/
getStatus(): Promise<MemoryStatus>;
// =========================================================================
// Experience Logging (GRASP Absorb Phase)
// =========================================================================
/**
* Log a single move with its outcome
* @param move - Move made during solving
* @param outcome - Validation result (success/failure/progress)
* Called during: GRASP Absorb phase, every iteration
*/
logMove(move: Move, outcome: ValidationResult): Promise<void>;
/**
* Log strategy application with result
* @param strategy - Strategy name (e.g., "naked_single")
* @param result - Validation result
* Called during: GRASP Absorb phase, when strategy changes
*/
logStrategy(strategy: string, result: ValidationResult): Promise<void>;
/**
* Log insight generation event
* @param insight - Insight discovered during synthesis
* Called during: GRASP Synthesize phase, when insight occurs
*/
logInsight(insight: Insight): Promise<void>;
/**
* Log complete solve session
* @param experience - Full experience including trajectory, outcome, timing
* Called during: End of puzzle solve session
*/
logExperience(experience: Experience): Promise<void>;
// =========================================================================
// Similarity Retrieval (GRASP Synthesize Phase)
// =========================================================================
/**
* Query similar past experiences based on current puzzle state
* @param context - Current puzzle state
* @param options - Query options (limit, filters)
* @returns Top-k similar experiences
* Called during: GRASP Synthesize phase
* Performance: <50ms for k=10
*/
querySimilar(
context: PuzzleState,
options?: {
limit?: number; // Default: 10
minSimilarity?: number; // Default: 0.5
domain?: string; // Default: 'sudoku-solving'
}
): Promise<Experience[]>;
/**
* Query patterns by strategy name
* @param strategyName - Strategy identifier
* @returns Patterns matching strategy
*/
getPatternsByStrategy(strategyName: string): Promise<Pattern[]>;
/**
* Query experiences by outcome
* @param outcome - Outcome filter ('success' | 'failure' | 'timeout')
* @returns Filtered experiences
*/
getExperiencesByOutcome(
outcome: 'solved' | 'failed' | 'timeout'
): Promise<Experience[]>;
// =========================================================================
// Pattern Distillation (Dreaming Pipeline)
// =========================================================================
/**
* Extract patterns from session experiences
* @param sessionId - Session identifier
* @param options - Distillation configuration
* @returns Extracted patterns
* Called during: Dreaming Compress phase
* Performance: <5s for 50-100 experiences
*/
distillPatterns(
sessionId: string,
options?: {
minImportance?: number; // Default: 0.3
compressionRatio?: number; // Default: 10
maxPatterns?: number; // Default: unlimited
}
): Promise<Pattern[]>;
/**
* Build abstraction ladder from patterns
* @param patterns - Patterns to abstract
* @param options - Ladder configuration
* @returns Multi-level abstraction hierarchy
* Called during: Dreaming Abstract phase
* Performance: <30s for 4-level ladder
*/
buildAbstractionLadder(
patterns: Pattern[],
options?: {
maxLevels?: number; // Default: 4
minPatternsPerLevel?: number; // Default: 1
}
): Promise<AbstractionLadder>;
// =========================================================================
// Knowledge Consolidation (Dreaming Final Phase)
// =========================================================================
/**
* Consolidate experiences into verified knowledge
* @param experiences - Experiences to consolidate
* @returns Consolidated knowledge with verification status
* Called during: Dreaming Integrate/Verify phase
*/
consolidate(experiences: Experience[]): Promise<ConsolidatedKnowledge>;
/**
* Verify consolidated knowledge consistency
* @param knowledge - Knowledge to verify
* @returns Verification result (true if verified)
* Called during: Dreaming Verify phase
*/
verify(knowledge: ConsolidatedKnowledge): Promise<boolean>;
// =========================================================================
// Cleanup & Maintenance
// =========================================================================
/**
* Export memory database to JSON
* @param filepath - Export destination
*/
export(filepath: string): Promise<void>;
/**
* Import memory database from JSON
* @param filepath - Import source
*/
import(filepath: string): Promise<void>;
/**
* Clear all data (use with caution)
*/
clear(): Promise<void>;
}
// Supporting Types
interface MemoryStatus {
experienceCount: number;
patternCount: number;
storageSize: number; // bytes
lastUpdated: number; // timestamp
performanceMetrics: {
avgQueryTime: number; // ms
avgLogTime: number; // ms
};
}export interface AgentDBAdapter extends ReasoningBankAdapter {
// AgentDB includes ALL ReasoningBank operations (100% compatible)
// PLUS the following advanced capabilities:
// =========================================================================
// Reinforcement Learning (Decision Transformer)
// =========================================================================
/**
* Train RL model on collected experiences
* @param config - Training configuration
* @returns Training results
* Called during: Days 6-10 evaluation phase
*/
trainRL(config: {
algorithm: 'decision-transformer' | 'q-learning' | 'sarsa' |
'actor-critic' | 'active-learning' | 'adversarial-training' |
'curriculum-learning' | 'federated-learning' | 'multi-task';
epochs: number; // Default: 50
batchSize: number; // Default: 32
learningRate?: number; // Default: 0.001
}): Promise<{
convergenceEpochs: number;
finalSuccessRate: number;
averageReward: number;
}>;
/**
* Use trained RL model to select next action
* @param state - Current puzzle state
* @param availableActions - Legal moves
* @returns Recommended action with confidence
* Called during: GRASP Generate phase (if RL enabled)
*/
selectActionRL(
state: PuzzleState,
availableActions: Move[]
): Promise<RLAction>;
// =========================================================================
// Reflexion Memory (Error Learning)
// =========================================================================
/**
* Store error trajectory with correction
* @param reflexion - Error and correction pair
* Called during: GRASP Absorb phase, when error detected
*/
storeReflexion(reflexion: {
trajectory: Move[];
outcome: ValidationResult;
error: Error;
correction: Move;
}): Promise<void>;
/**
* Retrieve corrections for similar errors
* @param error - Error to match
* @returns Past corrections for similar errors
* Called during: GRASP Synthesize phase, after error
*/
getCorrections(error: Error): Promise<Move[]>;
/**
* Measure reflexion learning effectiveness
* @returns Metrics on error reduction
*/
getReflexionMetrics(): Promise<{
errorsDetected: number;
correctionsApplied: number;
repeatErrorRate: number;
improvementCurve: number[];
}>;
// =========================================================================
// Skill Library (Auto-Consolidation)
// =========================================================================
/**
* Auto-consolidate successful patterns into skills
* @param filter - Skill extraction criteria
* @returns Extracted skills
* Called during: Dreaming Compress phase
*/
consolidateSkills(filter: {
minSuccessRate: number; // Default: 0.7
domain: string; // e.g., 'sudoku-solving'
minUsageCount?: number; // Default: 3
}): Promise<Skill[]>;
/**
* Apply skill library to current state
* @param state - Current puzzle state
* @returns Applicable skill or null
* Called during: GRASP Generate phase
*/
applySkill(state: PuzzleState): Promise<Move | null>;
/**
* Get skill library statistics
*/
getSkillLibraryStats(): Promise<{
skillsExtracted: number;
avgSuccessRate: number;
reuseRate: number;
transferability: number;
}>;
// =========================================================================
// Advanced Reasoning (4 Agent Modules)
// =========================================================================
/**
* Retrieve with rich context synthesis
* Uses PatternMatcher + ContextSynthesizer agents
* @param state - Current puzzle state
* @param options - Retrieval configuration
* @returns Rich context with synthesized insights
* Called during: GRASP Synthesize phase (enhanced)
*/
retrieveWithReasoning(
state: PuzzleState,
options: {
k: number; // Top-k results (default: 10)
useMMR?: boolean; // Maximal Marginal Relevance (default: true)
synthesizeContext?: boolean; // Rich context generation (default: true)
domain: string; // Domain filter
}
): Promise<RichContext>;
/**
* Optimize memory (MemoryOptimizer agent)
* Auto-consolidates patterns, removes redundancies
* Called during: Dreaming Prune phase
*/
optimizeMemory(): Promise<{
patternsConsolidated: number;
redundanciesRemoved: number;
compressionRatio: number;
}>;
// =========================================================================
// Graph Database Queries
// =========================================================================
/**
* Execute Cypher query on knowledge graph
* @param query - Cypher query string
* @returns Query results
* Use case: Complex pattern relationship queries
*/
queryCypher(query: string): Promise<GraphResult[]>;
/**
* Build strategy dependency graph
* @returns Graph of prerequisite relationships
*/
buildStrategyGraph(): Promise<StrategyGraph>;
// =========================================================================
// Performance Features
// =========================================================================
/**
* Enable quantization for memory efficiency
* @param mode - Quantization mode
* Reduces memory usage by 4-32x
*/
enableQuantization(
mode: 'binary' | 'scalar' | 'product'
): Promise<void>;
/**
* Get performance statistics
*/
getPerformanceStats(): Promise<{
avgQueryTime: number; // μs (microseconds)
hnswIndexSize: number; // bytes
vectorCount: number;
quantizationRatio: number;
}>;
}
// Supporting Types
interface RLAction {
cell: Cell;
value: number;
confidence: number;
expectedReward: number;
}
interface Skill {
id: string;
name: string;
pattern: Pattern;
successRate: number;
applicationCount: number;
transferability: number;
prerequisites: string[]; // Skill IDs
}
interface RichContext {
similarExperiences: Experience[];
applicableSkills: Skill[];
synthesizedInsights: Insight[];
recommendedStrategies: string[];
confidenceScore: number;
}
interface GraphResult {
nodes: GraphNode[];
edges: GraphEdge[];
}
interface StrategyGraph {
strategies: Map<string, StrategyNode>;
dependencies: Map<string, string[]>; // strategy → prerequisites
}Setup (Day 2):
# Initialize ReasoningBank (5 minutes)
npx claude-flow@alpha agent memory init
# Verify setup
npx claude-flow@alpha agent memory status
# Test basic operations
npx claude-flow@alpha memory store "test_key" '{"strategy": "naked_single"}'
npx claude-flow@alpha memory query "naked_single"Integration Points:
// src/memory/reasoningbank-adapter.ts
import { exec } from 'child_process';
import { promisify } from 'util';
const execAsync = promisify(exec);
export class ReasoningBankAdapter implements ReasoningBankAdapter {
private dbPath: string = '.swarm/memory.db';
async logMove(move: Move, outcome: ValidationResult): Promise<void> {
const data = JSON.stringify({
type: 'move',
move,
outcome,
timestamp: Date.now()
});
await execAsync(
`npx claude-flow@alpha memory store "move_${move.timestamp}" '${data}'`
);
}
async querySimilar(context: PuzzleState): Promise<Experience[]> {
// Convert context to query string
const query = this.buildQuery(context);
const { stdout } = await execAsync(
`npx claude-flow@alpha memory query "${query}"`
);
return JSON.parse(stdout);
}
// ... additional methods
}Performance Optimization:
- Batch log operations during GRASP iterations
- Use in-memory buffer, flush every 5 iterations
- Cache frequent queries (similarity searches)
Limitations:
- No built-in RL learning
- Manual pattern distillation required
- Linear search for some queries
Setup (Day 6):
# Initialize AgentDB (10 minutes)
npx agentdb@latest init ./.agentdb/memory.db --preset large
# Start MCP server
npx agentdb@latest mcp
claude mcp add agentdb npx agentdb@latest mcp
# Create Decision Transformer plugin (30 minutes)
npx agentdb@latest create-plugin \
-t decision-transformer \
-n sudoku-solver \
--state-dim 81 \
--action-dim 729
# Migrate ReasoningBank data (30 minutes)
npx agentdb@latest migrate --source .swarm/memory.db
# Verify migration
npx agentdb@latest stats ./.agentdb/memory.dbIntegration Points:
// src/memory/agentdb-adapter.ts
import { AgentDB } from 'agentdb';
export class AgentDBAdapter implements AgentDBAdapter {
private db: AgentDB;
private rlPlugin: DecisionTransformerPlugin;
async initialize(): Promise<void> {
this.db = await AgentDB.init('./.agentdb/memory.db', {
preset: 'large',
quantization: 'scalar' // 4x memory reduction
});
this.rlPlugin = await this.db.loadPlugin('sudoku-solver');
}
async selectActionRL(
state: PuzzleState,
availableActions: Move[]
): Promise<RLAction> {
const stateVector = this.stateToVector(state);
const result = await this.rlPlugin.selectAction({
state: stateVector,
availableActions: availableActions.map(m => this.moveToAction(m)),
returnTokens: 128
});
return {
cell: result.action.cell,
value: result.action.value,
confidence: result.confidence,
expectedReward: result.reward
};
}
async consolidateSkills(filter: {
minSuccessRate: number;
domain: string;
}): Promise<Skill[]> {
// Use built-in skill library consolidation
return await this.db.skills.consolidate({
domain: filter.domain,
minSuccessRate: filter.minSuccessRate,
autoTransferability: true
});
}
// ... additional methods leveraging AgentDB features
}Performance Optimization:
- Enable HNSW indexing for <1ms queries
- Use scalar quantization for 4x memory reduction
- Batch RL training (daily, not per-puzzle)
- Cache skill library (reload only after consolidation)
Alpha Version Stability Monitoring:
// src/memory/stability-monitor.ts
export class StabilityMonitor {
private errorCount = 0;
private corruptionCount = 0;
private performanceSamples: number[] = [];
async checkStability(): Promise<boolean> {
// Check 1: No crashes during Days 6-10
if (this.errorCount > 5) return false;
// Check 2: No data corruption
if (this.corruptionCount > 0) return false;
// Check 3: Performance claims validated
const avgQueryTime = this.average(this.performanceSamples);
if (avgQueryTime > 10) return false; // Should be <1ms
// Check 4: RL convergence
const rlMetrics = await this.getRLMetrics();
if (rlMetrics.epochs > 50) return false;
return true; // All checks passed
}
}Purpose: Convert PuzzleState to embedding for similarity search
function stateToVector(state: PuzzleState): number[] {
const vector: number[] = [];
// Part 1: Grid state (81 dimensions for 9x9)
for (let row = 0; row < 9; row++) {
for (let col = 0; col < 9; col++) {
vector.push(state.grid[row][col] || 0);
}
}
// Part 2: Candidate counts (81 dimensions)
for (let row = 0; row < 9; row++) {
for (let col = 0; col < 9; col++) {
const key = `${row},${col}`;
const candidates = state.candidates.get(key);
vector.push(candidates ? candidates.size : 0);
}
}
// Part 3: Strategy embedding (128 dimensions)
const strategyEmbedding = embedStrategy(state.moveHistory.map(m => m.strategy));
vector.push(...strategyEmbedding);
// Total: 81 + 81 + 128 = 290 dimensions
return vector;
}Purpose: Group similar experiences for compression
async function clusterExperiences(
experiences: Experience[],
targetClusters: number
): Promise<Experience[][]> {
// Convert to vectors
const vectors = experiences.map(exp =>
stateToVector(exp.trajectory[0].state) // Use initial state
);
// K-means clustering
const kmeans = new KMeans(targetClusters);
const clusters = await kmeans.fit(vectors);
// Group experiences by cluster
const grouped: Experience[][] = Array(targetClusters).fill([]).map(() => []);
experiences.forEach((exp, i) => {
const cluster = clusters.labels[i];
grouped[cluster].push(exp);
});
return grouped;
}Purpose: Generate representative pattern from experience cluster
function extractPattern(cluster: Experience[]): Pattern {
// Find common strategy sequence
const strategyFreq = new Map<string, number>();
cluster.forEach(exp => {
exp.strategySequence.forEach(strategy => {
strategyFreq.set(strategy, (strategyFreq.get(strategy) || 0) + 1);
});
});
const topStrategy = Array.from(strategyFreq.entries())
.sort((a, b) => b[1] - a[1])[0][0];
// Calculate success rate
const successCount = cluster.filter(exp => exp.outcome === 'solved').length;
const successRate = successCount / cluster.length;
// Extract conditions (common puzzle state features)
const conditions = extractCommonConditions(cluster);
// Extract actions (common move patterns)
const actions = extractCommonActions(cluster);
return {
id: generateUUID(),
type: 'strategy',
name: topStrategy,
description: `Strategy: ${topStrategy}`,
conditions,
actions,
successRate,
usageCount: cluster.length,
examples: cluster.slice(0, 3).map(exp => exp.id)
};
}Empty Results:
async querySimilar(context: PuzzleState): Promise<Experience[]> {
const results = await this.performQuery(context);
// Edge case: No similar experiences found
if (results.length === 0) {
// Return empty array, GRASP will use random exploration
console.warn('No similar experiences found, using exploration mode');
return [];
}
return results;
}Corrupted Data:
async logExperience(experience: Experience): Promise<void> {
// Validate before storing
if (!this.validateExperience(experience)) {
throw new Error(`Invalid experience: ${JSON.stringify(experience)}`);
}
try {
await this.performLog(experience);
} catch (error) {
// Rollback on failure
await this.rollback();
throw error;
}
}Concurrent Access:
// Use transaction locking
async consolidate(experiences: Experience[]): Promise<ConsolidatedKnowledge> {
await this.db.transaction(async (tx) => {
// All consolidation operations within transaction
const patterns = await tx.distillPatterns(experiences);
const ladder = await tx.buildAbstractionLadder(patterns);
const knowledge = await tx.store(patterns, ladder);
// Atomic commit
return knowledge;
});
}Memory Overflow:
async distillPatterns(sessionId: string): Promise<Pattern[]> {
const experiences = await this.getExperiences(sessionId);
// Edge case: Too many experiences (>10,000)
if (experiences.length > 10000) {
// Batch process in chunks
const chunks = this.chunk(experiences, 1000);
const patterns: Pattern[] = [];
for (const chunk of chunks) {
patterns.push(...await this.distillChunk(chunk));
}
// Merge patterns
return this.mergePatterns(patterns);
}
return this.distillDirect(experiences);
}Unit Tests:
describe('ReasoningBankAdapter', () => {
it('should log move with outcome', async () => {
const adapter = new ReasoningBankAdapter();
const move: Move = { /* ... */ };
const outcome: ValidationResult = { /* ... */ };
await adapter.logMove(move, outcome);
const stored = await adapter.querySimilar(/* context */);
expect(stored).toContainMove(move);
});
it('should retrieve similar experiences', async () => {
const adapter = new ReasoningBankAdapter();
// Seed with test data
await seedTestExperiences(adapter);
const context: PuzzleState = { /* ... */ };
const similar = await adapter.querySimilar(context);
expect(similar.length).toBeGreaterThan(0);
expect(similar[0].similarity).toBeGreaterThan(0.7);
});
});Integration Tests:
describe('Memory System Integration', () => {
it('should complete full GRASP cycle with memory', async () => {
const solver = new CognitivePuzzleSolver();
const puzzle = loadTestPuzzle('easy-001');
const result = await solver.solve(puzzle);
expect(result.success).toBe(true);
expect(solver.memory.experienceCount).toBeGreaterThan(0);
});
it('should consolidate dreams after session', async () => {
const solver = new CognitivePuzzleSolver();
const puzzles = loadTestPuzzles(10);
for (const puzzle of puzzles) {
await solver.solve(puzzle);
}
const knowledge = await solver.dream();
expect(knowledge.patterns.length).toBeGreaterThan(0);
expect(knowledge.compressionRatio).toBeGreaterThan(5);
expect(knowledge.abstractionLadder.levels.length).toBe(4);
});
});Performance Tests:
describe('Memory Performance', () => {
it('should query in <50ms (ReasoningBank)', async () => {
const adapter = new ReasoningBankAdapter();
await seedLargeDataset(adapter, 1000);
const start = Date.now();
await adapter.querySimilar(testContext);
const elapsed = Date.now() - start;
expect(elapsed).toBeLessThan(50);
});
it('should query in <1ms (AgentDB)', async () => {
const adapter = new AgentDBAdapter();
await seedLargeDataset(adapter, 1000);
const start = performance.now();
await adapter.querySimilar(testContext);
const elapsed = performance.now() - start;
expect(elapsed).toBeLessThan(1);
});
});Phase 1 (ReasoningBank) - Days 1-5:
- Initialize ReasoningBank in <5 minutes
- Log 50+ experiences during baseline testing
- Retrieve similar experiences in <50ms
- Distill patterns with >5:1 compression ratio
- Build 4-level abstraction ladder
- Consolidate knowledge with verification
Phase 2 (AgentDB Evaluation) - Days 6-10:
- Migrate ReasoningBank data to AgentDB without loss
- RL training converges in <50 epochs
- Query performance <1ms (validate 150x claim)
- Reflexion memory reduces repeat errors by >30%
- Skill library auto-extracts >10 reusable patterns
- No crashes or data corruption during testing
Phase 3 (Final Demo) - Days 11-15:
- Select optimal memory system based on Day 10 results
- Benchmark both systems (if AgentDB stable)
- Generate comparison report
- Present data-driven recommendation
Performance:
- ReasoningBank: 46% faster than custom SQLite (claimed)
- AgentDB: >50x faster than ReasoningBank (validate claim)
- Zero data loss during 3-week POC
- <5% query failure rate
Reliability:
- 99.9% uptime during POC period
- ACID compliance for all writes
- Successful daily backup exports
Maintainability:
- Clear API documentation
- 100% test coverage for critical paths
- Performance monitoring dashboard
Test 1: End-to-End Memory Flow
test('E2E: Solve → Log → Dream → Transfer', async () => {
// 1. Solve easy puzzle, log experiences
const solver = new CognitivePuzzleSolver();
await solver.solve(easyPuzzle);
const experiences = await solver.memory.getExperiences('session-1');
expect(experiences.length).toBeGreaterThan(10);
// 2. Dream consolidation
const knowledge = await solver.dream();
expect(knowledge.patterns.length).toBeGreaterThan(3);
expect(knowledge.compressionRatio).toBeGreaterThan(5);
// 3. Transfer to hard puzzle
const hardResult = await solver.solve(hardPuzzle);
expect(hardResult.solveTime).toBeLessThan(baselineTime * 0.7);
});Test 2: Similarity Retrieval Accuracy
test('Similarity retrieval returns relevant experiences', async () => {
const adapter = new ReasoningBankAdapter();
// Seed with known similar and dissimilar experiences
await seedSimilarExperiences(adapter, 10, 'naked-single-heavy');
await seedDissimilarExperiences(adapter, 10, 'x-wing-heavy');
// Query with naked-single context
const context = createNakedSingleContext();
const results = await adapter.querySimilar(context, { limit: 5 });
// Verify all results are actually similar
results.forEach(exp => {
expect(exp.strategySequence).toContain('naked_single');
});
});Test 3: AgentDB RL Convergence
test('RL training converges in <50 epochs', async () => {
const adapter = new AgentDBAdapter();
// Train on easy puzzles
const result = await adapter.trainRL({
algorithm: 'decision-transformer',
epochs: 50,
batchSize: 32
});
expect(result.convergenceEpochs).toBeLessThanOrEqual(50);
expect(result.finalSuccessRate).toBeGreaterThan(0.7);
});Migration Script (Day 6):
#!/bin/bash
# migrate-to-agentdb.sh
# 1. Export ReasoningBank data
echo "Exporting ReasoningBank data..."
npx claude-flow@alpha memory export .swarm/export.json
# 2. Initialize AgentDB
echo "Initializing AgentDB..."
npx agentdb@latest init ./.agentdb/memory.db --preset large
# 3. Import data
echo "Importing to AgentDB..."
npx agentdb@latest migrate --source .swarm/memory.db
# 4. Verify migration
echo "Verifying migration..."
npx agentdb@latest stats ./.agentdb/memory.db
echo "Migration complete!"Data Validation:
async function validateMigration(): Promise<boolean> {
const rbAdapter = new ReasoningBankAdapter();
const adbAdapter = new AgentDBAdapter();
// Check counts match
const rbStatus = await rbAdapter.getStatus();
const adbStatus = await adbAdapter.getStatus();
if (rbStatus.experienceCount !== adbStatus.experienceCount) {
console.error('Experience count mismatch!');
return false;
}
// Spot check: Sample 10 experiences
const samples = await rbAdapter.getExperiences('session-1', { limit: 10 });
for (const sample of samples) {
const adbSample = await adbAdapter.getExperience(sample.id);
if (!deepEqual(sample, adbSample)) {
console.error(`Experience ${sample.id} differs after migration`);
return false;
}
}
return true;
}Decision Point (Day 10):
async function selectMemorySystem(): Promise<'reasoningbank' | 'agentdb'> {
const monitor = new StabilityMonitor();
// Check AgentDB stability
const isStable = await monitor.checkStability();
if (!isStable) {
console.warn('AgentDB stability check failed, falling back to ReasoningBank');
return 'reasoningbank';
}
// Check performance gains
const benchmark = await runComparativeBenchmark();
if (benchmark.agentdb.queryTime < benchmark.reasoningbank.queryTime * 0.5) {
// AgentDB is >2x faster, meets criteria
console.log('AgentDB performance validated, proceeding with AgentDB');
return 'agentdb';
} else {
console.warn('AgentDB performance gains not validated, using ReasoningBank');
return 'reasoningbank';
}
}Fallback Configuration:
// src/config/memory-config.ts
export const MEMORY_CONFIG = {
primary: process.env.MEMORY_SYSTEM || 'reasoningbank',
fallback: 'reasoningbank',
agentdb: {
enabled: false, // Set to true on Day 10 if criteria met
dataPath: './.agentdb/memory.db',
rlEnabled: true,
reflexionEnabled: true,
skillLibraryEnabled: true
},
reasoningbank: {
enabled: true, // Always enabled as fallback
dataPath: '.swarm/memory.db'
}
};ReasoningBank Commands:
# Initialize
npx claude-flow@alpha agent memory init
# Status
npx claude-flow@alpha agent memory status
# Store data
npx claude-flow@alpha memory store <key> <value>
# Query
npx claude-flow@alpha memory query <pattern>
# List all
npx claude-flow@alpha agent memory list
# Export
npx claude-flow@alpha memory export <filepath>AgentDB Commands:
# Initialize
npx agentdb@latest init <path> --preset large
# Start MCP server
npx agentdb@latest mcp
# Create plugin
npx agentdb@latest create-plugin -t decision-transformer -n <name>
# Train plugin
npx agentdb@latest train <plugin-name> --epochs 50
# Query
npx agentdb@latest query <path> <embedding> -k 10
# Statistics
npx agentdb@latest stats <path>
# Migrate
npx agentdb@latest migrate --source <source-db>#!/bin/bash
# benchmark-memory.sh
echo "Benchmarking Memory Systems..."
# ReasoningBank benchmarks
echo "=== ReasoningBank ==="
time npx claude-flow@alpha memory query "test_pattern" > /dev/null
time npx claude-flow@alpha memory store "bench_key" '{"data": "test"}' > /dev/null
# AgentDB benchmarks (if enabled)
if [ "$ENABLE_AGENTDB" = "true" ]; then
echo "=== AgentDB ==="
time npx agentdb@latest query ./.agentdb/memory.db "[0.1, 0.2, ...]" -k 10 > /dev/null
time npx agentdb@latest insert ./.agentdb/memory.db '{"data": "test"}' > /dev/null
fi
echo "Benchmark complete!"ReasoningBank Experience Schema:
{
"experienceId": "exp-uuid-001",
"sessionId": "session-uuid-001",
"puzzleId": "puzzle-uuid-001",
"timestamp": 1704384000000,
"trajectory": [
{
"cell": { "row": 0, "col": 4 },
"value": 7,
"strategy": "naked_single",
"timestamp": 1704384001000
}
],
"outcome": "solved",
"duration": 45000,
"strategySequence": ["naked_single", "hidden_single", "pointing_pair"],
"insights": [
{
"type": "strategy",
"content": "Naked singles effective early",
"confidence": 0.85,
"timestamp": 1704384005000
}
]
}AgentDB Skill Schema:
{
"skillId": "skill-uuid-001",
"name": "naked_single_detection",
"pattern": {
"id": "pattern-uuid-001",
"type": "strategy",
"description": "Detect and fill naked singles"
},
"successRate": 0.95,
"applicationCount": 142,
"transferability": 0.88,
"prerequisites": [],
"domain": "sudoku-solving"
}Document Status: DRAFT - Ready for Implementation Next Steps: Review with team, then proceed with Day 2 implementation