Add "lessons/patterns/startup-hooks-must-check-venv-cache-path-first"

2026-02-03 03:12:37 +00:00
parent b318ebde35
commit 726b5367a2

@@ -0,0 +1,96 @@
# Startup Hooks Must Check Venv Cache Path First
## Context
- **Date:** 2026-02-02
- **Time Wasted:** 4+ hours debugging across 3 devices
- **Severity:** Critical - blocks all MCP functionality
- **Components:** SessionStart hooks, MCP server venvs
## Problem
SessionStart hooks in `data-platform` and `pr-review` plugins were reporting "MCP venv missing" even though venvs existed and MCP servers worked fine.
The hooks checked the WRONG path:
```bash
# WRONG - checks marketplace directory (gets wiped on updates)
VENV_PATH="$MARKETPLACE_ROOT/mcp-servers/data-platform/.venv/bin/python"
```
But venvs actually live in the CACHE directory (survives updates):
```bash
# CORRECT - cache location
~/.cache/claude-mcp-venvs/leo-claude-mktplace/{server}/.venv/
```
## Root Cause
The `run.sh` scripts correctly check cache first, then local. But the startup hooks were written later and copied the wrong pattern - checking only the marketplace path.
**Inconsistency between:**
- `mcp-servers/*/run.sh` - checks cache first ✓
- `plugins/*/hooks/startup-check.sh` - only checked marketplace ✗
## Solution
Update startup hooks to match run.sh pattern:
```bash
# Check cache first (preferred), then local
CACHE_VENV="$HOME/.cache/claude-mcp-venvs/leo-claude-mktplace/{server}/.venv/bin/python"
LOCAL_VENV="$MARKETPLACE_ROOT/mcp-servers/{server}/.venv/bin/python"
if [[ -f "$CACHE_VENV" ]]; then
VENV_PATH="$CACHE_VENV"
elif [[ -f "$LOCAL_VENV" ]]; then
VENV_PATH="$LOCAL_VENV"
else
echo "$PREFIX MCP venv missing - run /initial-setup or setup.sh"
exit 0
fi
```
## Prevention
### 1. Canonical Venv Path Pattern
Add to `docs/CANONICAL-PATHS.md`:
```
MCP Server Venvs (ALWAYS check in this order):
1. Cache: ~/.cache/claude-mcp-venvs/leo-claude-mktplace/{server}/.venv/
2. Local: {marketplace}/mcp-servers/{server}/.venv/
```
### 2. Pre-Commit Check
Add validation script that ensures all hooks checking for venvs use the cache-first pattern.
### 3. Code Review Checklist
When reviewing hooks that check venv paths:
- [ ] Does it check cache path FIRST?
- [ ] Does it match the pattern in run.sh?
- [ ] Is the server name correct?
## Files Changed
1. `plugins/data-platform/hooks/startup-check.sh` - Fixed path checking
2. `plugins/pr-review/hooks/startup-check.sh` - Fixed path checking
## Why This Matters
- Venvs in marketplace get DELETED on every update/reinstall
- Cache directory SURVIVES updates - that's its entire purpose
- False "venv missing" errors cause hours of debugging
- User wastes time running setup scripts that don't fix anything
## Tags for Discovery
Search terms that should find this lesson:
- "venv missing"
- "MCP venv"
- "startup hook"
- "SessionStart"
- "cache path"
- "marketplace path"
- "run.sh"
---
**Tags:** venv, mcp, hooks, startup, cache, debugging, critical, path-mismatch