Files
claude-mem/docs/plans/phase0-test-plan.md
T

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

  1. Zero session_summaries despite 22 completed SDK sessions - suggests summary generation may not be working
  2. 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:

  1. Claude should reference the previous session without being told
  2. The context-hook.js logs should show summaries were found and loaded
  3. 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

  1. Check that hooks are properly configured in ~/.claude/hooks.json
  2. Verify summary-hook.js has execute permissions
  3. Check Claude Code version supports hooks

If Worker Doesn't Start

  1. Check new-hook.js logs - it should spawn the worker
  2. Verify worker.js has execute permissions
  3. Check for port/socket conflicts

If Summary Is Not Generated

  1. Check worker logs for parsing errors
  2. Verify SDK agent is responding with expected XML format
  3. Check database write permissions

If Context Doesn't Load

  1. Verify summaries exist in database
  2. Check context-hook.js logs for query results
  3. Verify project name extraction is correct

Next Steps After Test

  1. If test passes: Proceed to Phase 1 (advanced features)
  2. If test fails: Collect all logs and diagnostic info
  3. Document any issues found
  4. Update code as needed
  5. Re-run test until success criteria met