11 KiB
11 KiB
Phase 0 End-to-End Test Plan
Overview
This test plan validates the complete claude-mem pipeline from session start through context injection in a new session. The test verifies that logging, worker processes, database updates, and context retrieval all function correctly.
Section 1: Pre-Test Checklist
Current Database State (as of 2025-10-16)
- Database Location:
~/.claude-mem/claude-mem.db - Total SDK Sessions: 37 sessions recorded
- Active Sessions: 0 (all sessions properly closed)
- Completed Sessions: 22
- Session Summaries: 0 (ISSUE: No summaries despite completed sessions)
- Recent Sessions:
ID 37: completed at 2025-10-16T21:39:18.888Z, project: claude-mem ID 36: completed at 2025-10-16T21:24:30.850Z, project: claude-mem ID 35: completed at 2025-10-16T21:11:12.929Z, project: claude-mem-test ID 34: completed at 2025-10-16T20:59:43.438Z, project: claude-mem-test ID 33: completed at 2025-10-16T20:55:15.426Z, project: claude-mem-test
Current Worker State
- Running Workers: None detected
- Socket Files: No active sockets in /tmp/
- Command Used:
ps aux | grep claude-mem-worker | grep -v grep
Logging Verification in Compiled Files
- summary-hook.js: Contains 3 instances of
[claude-mem summary]logging - context-hook.js: Contains 3 instances of
[claude-mem context]logging - worker.js: Contains multiple instances of
[claude-mem worker]logging - Status: CONFIRMED - All logging survived the build process
Pre-Test Issues Identified
- Zero session_summaries despite 22 completed SDK sessions - suggests summary generation may not be working
- No active workers or sockets - clean state for testing
Section 2: Test Execution Steps
Step 1: Clean Slate (Optional - if you want to start fresh)
# Backup current database
cp ~/.claude-mem/claude-mem.db ~/.claude-mem/backups/claude-mem-backup-$(date +%Y%m%d-%H%M%S).db
# Optional: Clear old sessions if desired
# sqlite3 ~/.claude-mem/claude-mem.db "DELETE FROM sdk_sessions WHERE status = 'completed'"
# sqlite3 ~/.claude-mem/claude-mem.db "DELETE FROM session_summaries"
Step 2: Start Claude Code Session 1
# Navigate to the test project
cd /Users/alexnewman/Scripts/claude-mem
# Start Claude Code
# Logs will show context-hook.js firing
# Expected: "[claude-mem context] Hook fired with input:"
claude
Step 3: Do Some Work in Session 1
Within the Claude Code session, ask Claude to perform meaningful work:
Please help me:
1. Read the README.md file
2. Analyze the project structure
3. List the main TypeScript files in src/
4. Create a simple test file at test/example.test.ts with a placeholder test
Wait for Claude to complete all tasks.
Step 4: Exit Session 1
# Type exit or Ctrl+D to end the session
# Expected: summary-hook.js will fire
# Expected: "[claude-mem summary] Hook fired" message
# Expected: Worker will process and generate summary
exit
Step 5: Check Database for Summary
# Wait 5-10 seconds for worker to complete processing
sleep 10
# Check if a new SDK session was created
sqlite3 ~/.claude-mem/claude-mem.db "SELECT id, status, started_at, project FROM sdk_sessions ORDER BY started_at_epoch DESC LIMIT 3"
# Check if summary was generated
sqlite3 ~/.claude-mem/claude-mem.db "SELECT id, request, completed, created_at FROM session_summaries ORDER BY created_at_epoch DESC LIMIT 1"
# Check observations
sqlite3 ~/.claude-mem/claude-mem.db "SELECT COUNT(*) FROM observations WHERE sdk_session_id = (SELECT sdk_session_id FROM sdk_sessions ORDER BY started_at_epoch DESC LIMIT 1)"
Step 6: Start Claude Code Session 2
# Start a new session in the same project
cd /Users/alexnewman/Scripts/claude-mem
claude
Step 7: Ask Claude About Previous Session
Within Session 2, ask:
What did we work on in the previous session? What files were modified?
Claude should reference the previous session context that was injected.
Step 8: Collect All Logs
# Exit session 2
exit
# Collect logs (location depends on your Claude Code setup)
# Check stderr output from both sessions
# Filter for claude-mem messages
Section 3: What to Look For
Expected Log Sequence from Summary Hook
[claude-mem summary] Hook fired
[claude-mem summary] Searching for active SDK session
[claude-mem summary] Active SDK session found
[claude-mem summary] Attempting to send FINALIZE message to worker socket
[claude-mem summary] Socket connection established, sending message
[claude-mem summary] Socket connection closed successfully
Expected Log Sequence from Worker
[claude-mem worker] Worker instance created
[claude-mem worker] Worker run() started
[claude-mem worker] Session loaded successfully
[claude-mem worker] Socket server started successfully
[claude-mem worker] Starting SDK agent
[claude-mem worker] SDK session initialized
[claude-mem worker] SDK agent response received
[claude-mem worker] Parsing agent message for observations and summary
[claude-mem worker] Summary parsed successfully
[claude-mem worker] Storing summary in database
[claude-mem worker] Summary stored successfully in database
[claude-mem worker] SDK agent completed, marking session as completed
[claude-mem worker] Cleaning up worker resources
Expected Log Sequence from Context Hook
[claude-mem context] Hook fired with input:
[claude-mem context] Source check passed - proceeding with context load
[claude-mem context] Extracted project name: claude-mem from cwd: /Users/alexnewman/Scripts/claude-mem
[claude-mem context] Querying database for recent summaries...
[claude-mem context] Database query complete - found X summaries
[claude-mem context] Building markdown context from summaries...
[claude-mem context] Markdown built successfully
[claude-mem context] Outputting context to stdout for Claude Code injection
[claude-mem context] Context hook completed successfully
How to Verify Summary in Database
After Session 1 exits, the summary should contain:
- request: Description of what was asked
- investigated: Files/areas examined
- learned: Key findings
- completed: What was accomplished
- next_steps: Recommendations
- files_read: JSON array of files read
- files_edited: JSON array of files modified (should include test/example.test.ts)
How to Verify Context Was Loaded
In Session 2:
- Claude should reference the previous session without being told
- The context-hook.js logs should show summaries were found and loaded
- Claude's response should mention specific files or tasks from Session 1
Section 4: Log Collection Commands
Filter Logs for Summary Hook
# From Claude Code stderr output
grep "\[claude-mem summary\]" ~/.claude-code/logs/*.log 2>/dev/null || echo "Check your Claude Code log location"
# Alternative: redirect stderr during session
claude 2>&1 | tee /tmp/claude-session.log
# Then: grep "\[claude-mem summary\]" /tmp/claude-session.log
Filter Logs for Context Hook
grep "\[claude-mem context\]" /tmp/claude-session.log
Filter Logs for Worker
grep "\[claude-mem worker\]" /tmp/claude-session.log
Search for Errors
# Search for any errors in the logs
grep -i "error\|fail\|exception" /tmp/claude-session.log | grep claude-mem
# Check for database errors
grep "sqlite\|database" /tmp/claude-session.log | grep -i error
Verify Each Step of the Pipeline
# 1. Verify session was created
sqlite3 ~/.claude-mem/claude-mem.db "SELECT * FROM sdk_sessions WHERE id = (SELECT MAX(id) FROM sdk_sessions)"
# 2. Verify worker socket was created (during session)
ls -la /tmp/claude-mem-worker-*.sock
# 3. Verify observations were recorded
sqlite3 ~/.claude-mem/claude-mem.db "SELECT type, text FROM observations WHERE sdk_session_id = (SELECT sdk_session_id FROM sdk_sessions ORDER BY started_at_epoch DESC LIMIT 1)"
# 4. Verify summary was created
sqlite3 ~/.claude-mem/claude-mem.db "SELECT request, completed, files_edited FROM session_summaries ORDER BY created_at_epoch DESC LIMIT 1"
Monitor Worker Process
# During session, check if worker is running
watch -n 1 "ps aux | grep claude-mem-worker | grep -v grep"
# Check worker socket
watch -n 1 "ls -la /tmp/claude-mem-worker-*.sock 2>/dev/null"
Section 5: Success Criteria
Must Pass (Critical)
- Session 1 creates an entry in sdk_sessions with status='active'
- Context hook fires at Session 1 start and logs show it ran
- Summary hook fires at Session 1 exit and logs show it ran
- Worker process starts and creates a socket file
- Worker receives FINALIZE message from summary hook
- Summary is successfully parsed and stored in session_summaries table
- Session status changes from 'active' to 'completed'
- Socket file is cleaned up after worker exits
- Session 2 starts and context hook fires
- Context hook finds summaries and injects them as markdown
- Claude references previous session in Session 2
Should Pass (Important)
- Observations are recorded in the observations table
- files_read and files_edited are populated in summary
- No error messages in logs
- Worker process exits cleanly
- No zombie workers or stale sockets remain
Nice to Have
- All log messages are clear and informative
- Timing is reasonable (summary generation < 30 seconds)
- Multiple sessions can be loaded in context
- Context markdown is well-formatted
Known Issues to Monitor
- Zero summaries in current database despite 22 completed sessions - needs investigation
- Verify worker is actually spawned (new-hook.js responsible for this)
- Confirm SDK session ID is properly set
Troubleshooting Guide
If Summary Hook Doesn't Fire
- Check that hooks are properly configured in ~/.claude/hooks.json
- Verify summary-hook.js has execute permissions
- Check Claude Code version supports hooks
If Worker Doesn't Start
- Check new-hook.js logs - it should spawn the worker
- Verify worker.js has execute permissions
- Check for port/socket conflicts
If Summary Is Not Generated
- Check worker logs for parsing errors
- Verify SDK agent is responding with expected XML format
- Check database write permissions
If Context Doesn't Load
- Verify summaries exist in database
- Check context-hook.js logs for query results
- Verify project name extraction is correct
Next Steps After Test
- If test passes: Proceed to Phase 1 (advanced features)
- If test fails: Collect all logs and diagnostic info
- Document any issues found
- Update code as needed
- Re-run test until success criteria met