vestige/README.md
Sam Valladares 29130c3068 fix: accurate science claims, security docs, remove hardcoded path
## Changes

### README.md
- Fix FSRS-6 formula: power law (not exponential Ebbinghaus)
- Correct formula: R(t,S) = (1 + factor × t/S)^(-w₂₀)
- Honest "The Science" table showing what's fully implemented vs inspired
- Added / indicators for implementation accuracy
- Transparency note about honest marketing

### demo.sh
- Remove hardcoded /Users/entity002 path (security/privacy)
- Use relative path with fallback: ${VESTIGE:-$(dirname "$0")/...}

### SECURITY.md (new)
- Document trust model and security boundaries
- Explain data storage locations
- List input validation measures
- Security contact process

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 20:29:37 -06:00

395 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Vestige
**Memory that fades like yours does.**
The only MCP memory server built on cognitive science. FSRS-6 spaced repetition, spreading activation, synaptic tagging—all running 100% local.
[![GitHub stars](https://img.shields.io/github/stars/samvallad33/vestige?style=social)](https://github.com/samvallad33/vestige)
[![License](https://img.shields.io/badge/license-MIT%2FApache--2.0-blue)](LICENSE)
[![MCP Compatible](https://img.shields.io/badge/MCP-compatible-green)](https://modelcontextprotocol.io)
---
## Why Vestige?
| Problem | How Vestige Solves It |
|---------|----------------------|
| AI forgets everything between sessions | Persistent memory with intelligent retrieval |
| RAG dumps irrelevant context | **Prediction Error Gating** auto-decides CREATE/UPDATE/SUPERSEDE |
| Memory bloat eats your token budget | **FSRS-6 decay** naturally fades unused memories |
| No idea what AI "knows" | `recall`, `semantic_search`, `hybrid_search` let you query |
| Context pollution confuses the model | **29 atomic tools** > 1 overloaded tool with 15 parameters |
---
## Quick Start
### 1. Install
```bash
git clone https://github.com/samvallad33/vestige
cd vestige
cargo build --release
```
Add to your PATH:
```bash
# macOS/Linux
sudo cp target/release/vestige-mcp /usr/local/bin/
# Or add to ~/.bashrc / ~/.zshrc
export PATH="$PATH:/path/to/vestige/target/release"
```
### 2. Configure Claude
**Option A: One-liner (Recommended)**
```bash
claude mcp add vestige vestige-mcp
```
**Option B: Manual Config**
<details>
<summary>Claude Code (~/.claude/settings.json)</summary>
```json
{
"mcpServers": {
"vestige": {
"command": "vestige-mcp"
}
}
}
```
</details>
<details>
<summary>Claude Desktop (macOS)</summary>
Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
```json
{
"mcpServers": {
"vestige": {
"command": "vestige-mcp"
}
}
}
```
</details>
<details>
<summary>Claude Desktop (Windows)</summary>
Add to `%APPDATA%\Claude\claude_desktop_config.json`:
```json
{
"mcpServers": {
"vestige": {
"command": "vestige-mcp"
}
}
}
```
</details>
### 3. Restart Claude
Restart Claude Code or Desktop. You should see **29 Vestige tools** available.
### 4. Test It
Ask Claude:
> "Remember that I prefer TypeScript over JavaScript"
Then in a new session:
> "What are my coding preferences?"
It remembers.
---
## Important Notes
### First-Run Network Requirement
Vestige downloads the **Nomic Embed Text v1.5** model (~130MB) from Hugging Face on first use for semantic search.
**All subsequent runs are fully offline.**
Model cache location:
- macOS/Linux: `~/.cache/huggingface/`
- Windows: `%USERPROFILE%\.cache\huggingface\`
### Data Storage & Backup
All memories are stored in a **single local SQLite file**:
| Platform | Database Location |
|----------|------------------|
| macOS | `~/Library/Application Support/com.vestige.core/vestige.db` |
| Linux | `~/.local/share/vestige/core/vestige.db` |
| Windows | `%APPDATA%\vestige\core\vestige.db` |
**⚠️ There is no cloud sync, no redundancy, and no automatic backup.**
If that file gets:
- Accidentally deleted
- Corrupted (disk failure, power loss mid-write)
- Lost (laptop stolen, hard drive dies)
...the memories are **gone**.
---
**For AI memory = Totally Fine**
If you lose your Claude memories, you just start over. Annoying but not catastrophic.
**For critical data = Not Fine**
Don't store medical records, financial transactions, or legal documents in Vestige.
---
**Backup Options:**
*Manual (one-time):*
```bash
# macOS
cp ~/Library/Application\ Support/com.vestige.core/vestige.db ~/vestige-backup.db
# Linux
cp ~/.local/share/vestige/core/vestige.db ~/vestige-backup.db
```
*Automated (cron job):*
```bash
# Add to crontab - backs up every hour
0 * * * * cp ~/Library/Application\ Support/com.vestige.core/vestige.db ~/.vestige-backups/vestige-$(date +\%Y\%m\%d-\%H\%M).db
```
*Or just use **Time Machine** (macOS) / **Windows Backup** / **rsync** — they'll catch the file automatically.*
> For personal use with Claude? Don't overthink it. The memories aren't that precious.
---
## All 29 Tools
### Core Memory
| Tool | Description |
|------|-------------|
| `ingest` | Add new knowledge to memory |
| `smart_ingest` | **Intelligent ingestion** with Prediction Error Gating—auto-decides CREATE/UPDATE/SUPERSEDE |
| `recall` | Search by keywords, ranked by retention strength |
| `semantic_search` | Find conceptually related content via embeddings |
| `hybrid_search` | Combined keyword + semantic with RRF fusion |
| `get_knowledge` | Retrieve specific memory by ID |
| `delete_knowledge` | Remove a memory |
| `mark_reviewed` | FSRS review with rating (1=Again, 2=Hard, 3=Good, 4=Easy) |
### Feedback System
| Tool | Description |
|------|-------------|
| `promote_memory` | Thumbs up—memory led to good outcome |
| `demote_memory` | Thumbs down—memory was wrong or unhelpful |
| `request_feedback` | Ask user if a memory was helpful |
### Stats & Maintenance
| Tool | Description |
|------|-------------|
| `get_stats` | Memory system statistics |
| `health_check` | System health status |
| `run_consolidation` | Trigger decay cycle, generate embeddings |
### Codebase Memory
| Tool | Description |
|------|-------------|
| `remember_pattern` | Save code patterns/conventions |
| `remember_decision` | Save architectural decisions with rationale |
| `get_codebase_context` | Retrieve patterns/decisions for current project |
### Prospective Memory (Intentions)
| Tool | Description |
|------|-------------|
| `set_intention` | "Remind me to X when Y" |
| `check_intentions` | Check triggered intentions for current context |
| `complete_intention` | Mark intention as fulfilled |
| `snooze_intention` | Delay an intention |
| `list_intentions` | View all intentions |
### Neuroscience Layer
| Tool | Description |
|------|-------------|
| `get_memory_state` | Check if memory is Active/Dormant/Silent/Unavailable |
| `list_by_state` | List memories grouped by cognitive state |
| `state_stats` | Distribution of memory states |
| `trigger_importance` | Retroactively strengthen recent memories (Synaptic Tagging) |
| `find_tagged` | Find high-retention memories |
| `tagging_stats` | Synaptic tagging statistics |
| `match_context` | Context-dependent retrieval (Encoding Specificity) |
---
## How It Works
### Prediction Error Gating
When you call `smart_ingest`, Vestige compares new content against existing memories:
| Similarity | Action | Why |
|------------|--------|-----|
| > 0.92 | **REINFORCE** existing | Almost identical—just strengthen |
| > 0.75 | **UPDATE** existing | Related—merge the information |
| < 0.75 | **CREATE** new | Noveladd as new memory |
This prevents duplicate memories and keeps your knowledge base clean.
### FSRS-6 Spaced Repetition
Memories decay over time following a **power law forgetting curve** (not exponential):
```
R(t, S) = (1 + factor × t / S)^(-w₂₀)
where factor = 0.9^(-1/w₂₀) - 1
```
- `R` = retrievability (probability of recall)
- `t` = time since last review
- `S` = stability (time for R to drop to 90%)
- `w₂₀` = personalized decay parameter (0.1-0.8)
FSRS-6 uses 21 parameters optimized on 700M+ Anki reviews[30% more efficient than SM-2](https://github.com/open-spaced-repetition/srs-benchmark).
### Memory States
Based on accessibility, memories exist in four states:
| State | Description |
|-------|-------------|
| **Active** | High retention, immediately retrievable |
| **Dormant** | Medium retention, retrievable with effort |
| **Silent** | Low retention, rarely surfaces |
| **Unavailable** | Below threshold, effectively forgotten |
---
## The Science
Vestige is **inspired by** memory research. Here's what's actually implemented:
| Feature | Research Basis | Implementation |
|---------|----------------|----------------|
| **Spaced repetition** | [FSRS-6](https://github.com/open-spaced-repetition/fsrs4anki) | Fully implemented (21-parameter power law model) |
| **Context-dependent retrieval** | [Tulving & Thomson, 1973](https://psycnet.apa.org/record/1973-31800-001) | Fully implemented (temporal, topical, emotional context matching) |
| **Dual-strength model** | [Bjork & Bjork, 1992](https://bjorklab.psych.ucla.edu/wp-content/uploads/sites/13/2016/07/RBjork_EBjork_1992.pdf) | Simplified (storage + retrieval strength tracked separately) |
| **Retroactive importance** | [Frey & Morris, 1997](https://www.nature.com/articles/385533a0) | Inspired (temporal window capture, not actual synaptic biochemistry) |
| **Memory states** | Multi-store memory models | Heuristic (accessibility-based state machine) |
> **Transparency**: The ✅ features closely follow published algorithms. The ⚡ features are engineering heuristics *inspired by* the research—useful approximations, not literal neuroscience. We believe in honest marketing.
---
## Configuration
Environment variables:
| Variable | Default | Description |
|----------|---------|-------------|
| `VESTIGE_DATA_DIR` | Platform default | Custom database location |
| `VESTIGE_LOG_LEVEL` | `info` | Logging verbosity |
| `RUST_LOG` | - | Detailed tracing output |
Command-line options:
```bash
vestige-mcp --data-dir /custom/path
vestige-mcp --help
```
---
## Troubleshooting
### "Command not found" after installation
Make sure `vestige-mcp` is in your PATH:
```bash
which vestige-mcp
# Should output: /usr/local/bin/vestige-mcp
```
If not found:
```bash
# Use full path in Claude config
claude mcp add vestige /full/path/to/vestige-mcp
```
### Model download fails
First run requires internet to download the embedding model. If behind a proxy:
```bash
export HTTPS_PROXY=your-proxy:port
```
### "Tools not showing" in Claude
1. Check config file syntax (valid JSON)
2. Restart Claude completely (not just reload)
3. Check logs: `tail -f ~/.claude/logs/mcp.log`
### Database locked errors
Vestige uses SQLite with WAL mode. If you see lock errors:
```bash
# Only one instance should run at a time
pkill vestige-mcp
```
---
## Development
```bash
# Run tests
cargo test --all-features
# Run with logging
RUST_LOG=debug cargo run --release
# Build optimized binary
cargo build --release --all-features
```
---
## Updating
```bash
cd vestige
git pull
cargo build --release
sudo cp target/release/vestige-mcp /usr/local/bin/
```
Then restart Claude.
---
## License
MIT OR Apache-2.0 (dual-licensed)
---
## Contributing
Issues and PRs welcome! See [CONTRIBUTING.md](CONTRIBUTING.md).
---
<p align="center">
<i>Built by <a href="https://github.com/samvallad33">@samvallad33</a></i>
</p>