Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 34 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,38 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/).

## [Unreleased]

## [0.7.5] — 2026-04-10

### Added
- **Schema-driven fact extraction** (KS67): structured extraction pipeline replacing free-form LLM output
- **Entity unification** (KS73): EntityFrame, EntityId resolution, alias tracking, supersession rewrite
- **Configurable embedding** (KS75): EmbeddingProvider trait, 10 fastembed models, OpenAI API support
- **Universal prompt** (KS76): single consolidation prompt for all reader models (no per-model tuning)
- **Temporal boost** (KS76): recency-weighted scoring for time-sensitive queries
- **Importance scoring** (KS76): 5-signal importance scoring (entity density, temporal salience, novelty, info density, user signal)
- **Design system foundation** (KS77): design tokens, component spec for viz app
- **Negative recall benchmark**: 3/3 baseline for "I don't know" scenarios
- **Abstention benchmark**: 5/5 -- engine correctly abstains when no relevant memory exists

### Changed
- **Consolidation redesign** (KS69): child memory pipeline rewrite with quality gates, dedup, soft invalidation
- **Consolidation Tier 2** (KS71): subject fix, quality gate, dedup, soft invalidation
- **Child keyword labels** (KS72): labels assigned at child creation time
- **Default enrichment model**: switched to `qwen2.5:1.5b`
- **MCP server**: now exposes 12 tools (was 9) -- added `memory_graph`, `memory_related`, `memory_get`

### Fixed
- **KU-3 recall** (KS77): knowledge update scenario now passes in seeded benchmark
- **IE-3, TR-3, ME-4, PT-3 recall** (KS68): multiple recall fixes across LME categories
- **Temporal label dedup trap** (KS77): avoid adding temporal labels to children when parent has temporal content
- **Persistence format version**: format mismatch fix for MCP store/echo

### Performance
- Seeded micro-benchmark: 19/20 (up from 55% baseline)
- Abstention: 5/5
- Negative recall: 3/3
- LME-S baseline (GPT-4o judge): 24.2% overall

## [0.7.0] — 2026-04-02

### Added
Expand Down Expand Up @@ -153,8 +185,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/).
- Competitive scan update (MuninnDB, memU, Hindsight, NeuralMemory)

### Added — KS7: MCP Server
- **MCP Server** (`shrimpk-mcp`): 9 tools over JSON-RPC 2.0 stdio
- store, echo, stats, forget, dump, config_show, config_set, persist, status
- **MCP Server** (`shrimpk-mcp`): 12 tools over JSON-RPC 2.0 stdio
- store, echo, memory_graph, memory_related, memory_get, stats, forget, dump, config_show, config_set, persist, status
- Lazy engine init (fastembed loads on first tool call, not on handshake)
- Auto-persist after store/forget, stdout sacred (logs to stderr)
- Registered globally via `claude mcp add --scope user`
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ Unit tests run entirely in-memory and complete in seconds. Integration tests dow
| `shrimpk-security` | Sandbox, permissions | Planned (stub) |
| `shrimpk-kernel` | Integration facade | Stable |
| `shrimpk-python` | PyO3 bindings | Exists (untested in CI) |
| `shrimpk-mcp` | MCP server (9 tools) | Stable |
| `shrimpk-mcp` | MCP server (12 tools) | Stable |
| `shrimpk-daemon` | HTTP daemon + proxy | Stable |
| `shrimpk-tray` | System tray app | Stable |

Expand Down
4 changes: 2 additions & 2 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

| Version | Supported |
|---------|-----------|
| 0.5.x (latest) | Yes |
| < 0.5.0 | No |
| 0.7.x (latest) | Yes |
| < 0.7.0 | No |

Only the latest released version receives security fixes. If you are running an older version, please upgrade before reporting.

Expand Down
16 changes: 14 additions & 2 deletions crates/shrimpk-memory/src/echo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1624,6 +1624,15 @@ impl EchoEngine {
}
}

// 7c7. KS78: Recency tie-breaker (#13) — after all boosts and caps, add a
// negligible epsilon derived from created_at so newer memories win ties.
for result in &mut results {
if let Some(entry) = store.get(&result.memory_id) {
let recency_epsilon = (entry.created_at.timestamp_micros() as f64) * 1e-18;
result.final_score += recency_epsilon;
}
}

// 7d. Re-sort by final_score (similarity + hebbian boost)
results.sort_by(|a, b| {
b.final_score
Expand Down Expand Up @@ -3616,9 +3625,12 @@ mod tests {

assert!(results.len() >= 2, "Should have at least 2 results");

// Find both memories in results
// Find both memories in results (the Meta memory also mentions "Google",
// so match the Google-only memory by excluding results that mention "Meta")
let meta_result = results.iter().find(|r| r.content.contains("Meta"));
let google_result = results.iter().find(|r| r.content.contains("Google"));
let google_result = results
.iter()
.find(|r| r.content.contains("Google") && !r.content.contains("Meta"));

assert!(meta_result.is_some(), "Meta memory should surface");
assert!(google_result.is_some(), "Google memory should surface");
Expand Down
2 changes: 1 addition & 1 deletion docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -662,7 +662,7 @@ Integration layer that wires together `shrimpk-memory`, `shrimpk-context`, and `

### shrimpk-mcp

Model Context Protocol server. Exposes Echo Memory as MCP tools (`store`, `echo`, `stats`, `forget`, `status`, `config_show`, `dump`) via JSON-RPC 2.0 over stdio. Compatible with any MCP-aware AI client.
Model Context Protocol server. Exposes Echo Memory as 12 MCP tools (`store`, `echo`, `memory_graph`, `memory_related`, `memory_get`, `stats`, `forget`, `status`, `config_show`, `config_set`, `dump`, `persist`) via JSON-RPC 2.0 over stdio. Compatible with any MCP-aware AI client.

Key design: the `EchoEngine` is lazily initialized on first tool call. The server starts in milliseconds; fastembed model loading (a few seconds) is deferred until a memory operation is actually requested.

Expand Down
Loading
Loading