--- name: test-memory-system description: Comprehensive testing playbook for Local Brain Search memory improvements (Phases 1, 3, 4) automation: manual allowed-tools: - Bash - Read - Write - Glob - Grep user-invocable: true metadata: version: "1.0" created: 2026-02-18 author: Cornelius related-systems: - local-brain-search - SYNAPSE-memory-architecture --- # Test Memory System ## Purpose Comprehensively test the new memory improvements implemented in Local Brain Search: - **Phase 1:** Intent Classification - **Phase 3:** Spreading Activation - **Phase 4:** Usage-Based Learning (Q-values) ## State Dependencies | Source | Location | Read | Write | Description | |--------|----------|------|-------|-------------| | Memory Config | `resources/local-brain-search/memory_config.py` | ✓ | | Central configuration | | Q-Values | `resources/local-brain-search/data/q_values.json` | ✓ | | Learned preferences | | Usage History | `resources/local-brain-search/data/usage_history.jsonl` | ✓ | | Event tracking | | FAISS Index | `resources/local-brain-search/data/brain.faiss` | ✓ | | Vector index | | Graph | `resources/local-brain-search/data/brain_graph.pkl` | ✓ | | Note graph | | Test Report | `resources/memory-test-reports/` | | ✓ | Output location | ## Prerequisites - Virtual environment activated: `source resources/local-brain-search/venv/bin/activate` - FAISS index built: `data/brain.faiss` exists - Graph built: `data/brain_graph.pkl` exists - Dependencies installed: `pip install -r requirements.txt` ## Inputs - None (runs full test suite) --- ## Process ### Step 1: Environment Verification Verify all components are installed and accessible. ```bash cd resources/local-brain-search source venv/bin/activate # Check files exist ls -la data/brain.faiss data/brain_metadata.pkl data/brain_graph.pkl # Check Python dependencies python -c "import faiss; import networkx; import sentence_transformers; print('All dependencies OK')" # Check new modules exist python -c "from intent import classify_intent; from spreading import spreading_activation; from learning import get_learning_stats; print('All new modules OK')" ``` **Expected:** All files exist, all imports succeed. --- ### Step 2: Test Intent Classification Test that queries are correctly classified into four intent types. ```bash cd resources/local-brain-search source venv/bin/activate python intent.py ``` **Test Cases:** | Query | Expected Intent | Confidence | |-------|-----------------|------------| | "What is dopamine?" | factual | >70% | | "How does motivation work?" | conceptual | >70% | | "Connect dopamine and Buddhism" | synthesis | >70% | | "Recent notes about AI agents" | temporal | >70% | | "Dopamine" | factual | >50% | | "relationship between identity and belief" | synthesis | >70% | | "patterns across neuroscience and AI" | synthesis | >80% | **Record Results:** - Total queries tested: X - Correctly classified: Y - Accuracy: Y/X % --- ### Step 3: Test Static vs Spreading Search Compare results between static (traditional) and spreading activation modes. ```bash cd resources/local-brain-search # Test 1: Static search ./run_search.sh "dopamine and motivation" --mode static --limit 5 --json | python -m json.tool # Test 2: Spreading search (same query) ./run_search.sh "dopamine and motivation" --mode spreading --limit 5 --json | python -m json.tool # Test 3: Synthesis query (where spreading should excel) ./run_search.sh "connect Buddhism neuroscience consciousness" --mode static --limit 5 --json ./run_search.sh "connect Buddhism neuroscience consciousness" --mode spreading --limit 5 --json ``` **Expected Results:** - Static and spreading should produce DIFFERENT result sets - Spreading mode should find cross-domain connections - Spreading should reduce "hub dominance" (e.g., Dopamine note appearing in everything) **Record:** - Result overlap: X out of 5 (should be 0-2 for synthesis queries) - Spreading iterations: usually 3-5 - Did spreading find non-obvious connections? Y/N --- ### Step 4: Test Intent-Adaptive Spreading Verify that different intents produce different spreading parameters. ```bash cd resources/local-brain-search # Factual query (should use minimal spreading) ./run_search.sh "What is dopamine?" --mode spreading --json 2>&1 | grep -E "(iterations|Intent)" # Synthesis query (should use maximum spreading) ./run_search.sh "connect dopamine Buddhism identity" --mode spreading --json 2>&1 | grep -E "(iterations|Intent)" ``` **Expected:** - Factual: max_iterations=2, inhibition_strength=0.5 - Conceptual: max_iterations=5, inhibition_strength=0.2 - Synthesis: max_iterations=7, inhibition_strength=0.1 - Temporal: max_iterations=3, temporal_decay=0.7 --- ### Step 5: Test Lateral Inhibition Verify that hub notes don't dominate results. > **Scope note:** `Dopamine.md` was the canonical hub example *on the whole-graph > fingerprint* (DI-inflated). Scope enforcement is now ON (since 2026-06-25; see > SCOPE-IMPLEMENTATION-PLAN.md), so the core-scoped hubs are MOC - Eight-Circuit > / Decision Making / Gilbert / Tetlock - use one of those as the "known hub" > probe. Dopamine remains a valid permanent note and search target either way - > only its *centrality ranking* changed (it is no longer a top hub). ```bash cd resources/local-brain-search # Search for topic where Dopamine.md is a known hub ./run_search.sh "motivation reward behavior" --mode spreading --limit 10 --json # Check if Dopamine.md dominates or if diverse results appear ``` **Expected:** - Top 10 results should include notes beyond the immediate Dopamine cluster - Lateral inhibition suppresses over-represented clusters - Results should show diversity across topics **Record:** - Number of results from Dopamine cluster: X/10 - Number of distinct topic clusters represented: Y --- ### Step 6: Test Usage-Based Learning Status Check current learning system state. ```bash cd resources/local-brain-search # Check learning status ./run_learning.sh status # View top notes by Q-value ./run_learning.sh top --limit 10 # Export full learning data ./run_learning.sh export --output /tmp/learning_export.json ``` **Expected:** - Learning enabled: True - Events tracked with proper structure - Q-values in reasonable range (-1.0 to 2.0) **Record:** - Total events tracked: X - Unique notes with Q-values: Y - Average Q-value: Z --- ### Step 7: Test Usage Event Tracking Verify that search operations are being tracked. ```bash cd resources/local-brain-search # Count events before BEFORE=$(wc -l < data/usage_history.jsonl) # Run a search ./run_search.sh "test query for tracking" --mode spreading --limit 5 # Count events after AFTER=$(wc -l < data/usage_history.jsonl) echo "Events before: $BEFORE, after: $AFTER, new: $((AFTER - BEFORE))" # Verify event structure tail -5 data/usage_history.jsonl | python -m json.tool ``` **Expected:** - New events should be logged (5 for limit=5) - Events should have: timestamp, note_id, query, query_intent, event_type, position, session_id, mode --- ### Step 8: Test Q-Value Updates Verify that different event types produce appropriate Q-value changes. ```bash cd resources/local-brain-search # Get current Q-value for a test note cat data/q_values.json | python -c "import json,sys; d=json.load(sys.stdin); print(d.get('02-Permanent/Dopamine.md', 'not found'))" # Log a read event ./run_learning.sh log read "02-Permanent/Dopamine.md" --query "test" # Check Q-value increased cat data/q_values.json | python -c "import json,sys; d=json.load(sys.stdin); print(d.get('02-Permanent/Dopamine.md', 'not found'))" ``` **Expected Q-value changes:** - retrieved: +0.0 (no change) - read: +0.5 base reward - referenced: +1.0 base reward - linked: +1.5 base reward **Note:** Actual changes are modulated by learning_rate (0.1) and position factor. --- ### Step 9: Test Q-Value Ranking Adjustment Verify that Q-values influence search result ranking. ```bash cd resources/local-brain-search # First, artificially boost a note's Q-value python -c " import json with open('data/q_values.json', 'r') as f: q = json.load(f) q['02-Permanent/Identity.md'] = 1.5 # High Q-value with open('data/q_values.json', 'w') as f: json.dump(q, f, indent=2) print('Q-value set for Identity.md') " # Search for something where Identity.md is somewhat relevant ./run_search.sh "belief systems self" --mode spreading --limit 10 --json # Check if Identity.md ranks higher due to Q-value boost ``` **Expected:** - Notes with high Q-values should rank higher (30% weight by default) - Q-value boost = 1.0 + (q_value * 0.3) --- ### Step 10: Test No-Track Mode Verify that --no-track flag prevents usage logging. ```bash cd resources/local-brain-search # Count events before BEFORE=$(wc -l < data/usage_history.jsonl) # Run search with --no-track ./run_search.sh "no track test" --mode static --no-track # Count events after AFTER=$(wc -l < data/usage_history.jsonl) echo "Events should be same: before=$BEFORE, after=$AFTER" ``` **Expected:** No new events logged when --no-track is used. --- ### Step 11: Test Configuration Loading Verify memory_config.py is the single source of truth. ```bash cd resources/local-brain-search # Print current configuration python memory_config.py # Verify spreading uses config python -c " from memory_config import MEMORY_CONFIG print('Spreading max_iterations:', MEMORY_CONFIG['spreading']['max_iterations']) print('Learning enabled:', MEMORY_CONFIG['learning']['enabled']) print('Q-weight:', MEMORY_CONFIG['learning']['q_weight']) " ``` **Expected:** - All configuration centralized in memory_config.py - No hardcoded values in search.py, spreading.py, learning.py --- ### Step 12: Performance Benchmarks Measure search latency for both modes. ```bash cd resources/local-brain-search # Benchmark static search time (for i in {1..5}; do ./run_search.sh "dopamine" --mode static --limit 10 --no-track > /dev/null; done) # Benchmark spreading search time (for i in {1..5}; do ./run_search.sh "dopamine" --mode spreading --limit 10 --no-track > /dev/null; done) ``` **Expected:** - Static search: ~100-200ms per query - Spreading search: ~300-500ms per query - Spreading should be <2x slower than static --- ### Step 13: Edge Case Testing Test boundary conditions. ```bash cd resources/local-brain-search # Empty query ./run_search.sh "" --mode spreading --limit 5 2>&1 # Very long query ./run_search.sh "$(python -c 'print("dopamine " * 100)')" --mode spreading --limit 5 2>&1 # Non-existent topic ./run_search.sh "xyznonexistenttopicxyz" --mode spreading --limit 5 --json # Unicode query ./run_search.sh "意識 consciousness" --mode spreading --limit 5 --json ``` **Expected:** - Empty query: Graceful error or default behavior - Long query: Should truncate or handle gracefully - Non-existent: Return empty or low-confidence results - Unicode: Should not crash --- ## Generate Test Report After running all tests, generate a comprehensive report. ```bash REPORT_DIR="resources/memory-test-reports" REPORT_FILE="$REPORT_DIR/test-report-$(date +%Y-%m-%d-%H%M).md" mkdir -p "$REPORT_DIR" ``` ### Report Template ```markdown # Memory System Test Report **Date:** YYYY-MM-DD HH:MM **Tester:** [name] **System Version:** Cornelius v01.25 ## Summary | Component | Status | Notes | |-----------|--------|-------| | Intent Classification | ✓/✗ | | | Spreading Activation | ✓/✗ | | | Lateral Inhibition | ✓/✗ | | | Usage Tracking | ✓/✗ | | | Q-Value Learning | ✓/✗ | | | Configuration Loading | ✓/✗ | | | Performance | ✓/✗ | | ## Detailed Results ### Intent Classification - Accuracy: X% - Failures: [list] ### Spreading vs Static - Result overlap: X/5 - Spreading found cross-domain connections: Y/N - Example good result: [describe] ### Lateral Inhibition - Hub dominance reduced: Y/N - Diversity improved: Y/N ### Learning System - Events tracked: X - Q-values updated correctly: Y/N - Ranking adjustment working: Y/N ### Performance - Static search avg: Xms - Spreading search avg: Xms - Acceptable: Y/N ## Issues Found 1. [Issue description] - Severity: High/Medium/Low - Steps to reproduce: [steps] - Suggested fix: [suggestion] ## Recommendations 1. [Recommendation] 2. [Recommendation] ## Next Steps - [ ] Address issues found - [ ] Move to Phase 2 (Extended Graph) if all passes - [ ] Enable spreading as default mode if stable ``` --- ## Completion Checklist - [ ] Step 1: Environment verified - [ ] Step 2: Intent classification tested (>85% accuracy) - [ ] Step 3: Static vs spreading compared - [ ] Step 4: Intent-adaptive spreading verified - [ ] Step 5: Lateral inhibition working - [ ] Step 6: Learning status checked - [ ] Step 7: Usage tracking verified - [ ] Step 8: Q-value updates working - [ ] Step 9: Ranking adjustment confirmed - [ ] Step 10: No-track mode verified - [ ] Step 11: Configuration centralized - [ ] Step 12: Performance acceptable - [ ] Step 13: Edge cases handled - [ ] Test report generated and saved ## Error Recovery If tests fail: 1. **Import errors:** Check `requirements.txt` installed in venv 2. **File not found:** Run `python index_brain.py` to rebuild index 3. **Learning errors:** Run `./run_learning.sh reset --confirm` to reset 4. **Config errors:** Check `memory_config.py` syntax ## Related Skills - [/refresh-index](../refresh-index/) - Rebuild FAISS index - [/search-vault](../search-vault/) - Production search interface - [/recall](../recall/) - 3-layer semantic retrieval