Adaptive memory for AI agents. Quality-gated, refusal-first memory system with trust branching, vector search, and governance framing.
Demiurge demonstrates strong naming conventions (verb_noun pattern: memory_search, memory_add, review_decide) and comprehensive parameter schemas with type definitions and descriptions. All 17 tools have explicit descriptions and input schemas visible in src/mcp/tool-definitions.ts. However, output schemas are not documented, LLMs cannot predict response structure. Several tools lack actionable error guidance. Parameter descriptions are generally good (60-150 chars) but some are vague (e.g., 'Memory ID to retrieve' for memory_get). No tool annotations (readOnlyHint/destructiveHint) despite clear risk classifications. Composition is strong, tools are single-responsibility and chainable via IDs.
Export all memories as JSON array. Full brain backup.
Add a new memory. Goes through trust branching: auto-confirm, auto-store with spot-check, quarantine, or reject. Returns the result including trust class and review status.
Confirm a memory. Promotes to user-confirmed trust class. Use for explicit user corrections or statements.
Correct a memory claim. Creates version snapshot, updates claim, increments correction count.
Freeze a memory. Frozen memories skip decay but remain retrievable.
Get a single memory by ID with full metadata.
Output schemas not documented. LLMs cannot predict response structure for any tool, forcing them to guess at downstream field names and types. This breaks tool chaining and increases hallucination risk.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications. Tools like memory_reject, memory_correct, and brain_export are destructive but unmarked, preventing agents from reasoning about side effects.
Minimal error guidance. Tools return success/failure but do not guide LLM recovery. E.g., memory_get with invalid ID should suggest 'Try memory_search() to find the correct ID' rather than a bare error.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Get version history for a memory. Shows how it changed over time.
Get or set global pause state. When paused, no new memories are captured from LLM extraction.
Reject a memory. Marks as rejected trust class. Memory stays in store for audit but is excluded from retrieval.
Search memories and return ranked context for injection. Returns matching memories, formatted injection text, conflict flags, governance framing (recency, unresolved conflicts, per-fact confidence, abstention guidance), learned interaction preferences (steering), and optional answer-style guidance (off by default).
Search memories by tag.
Set a user interaction preference: how the user wants the assistant to respond. Stored as a memory with the dimension as subject, so a new value supersedes the old one for that dimension. Keep values terse (1-2 words). Common dimensions: verbosity, tone, response_format, technical_depth, preferred_language, units.
Get system statistics: total memories, counts by trust class and provenance, pending reviews, circuit breaker status.
Get or set tags on a memory.
Unfreeze a memory. Resumes normal decay.
Promote or reject a quarantined memory after review.
List memories pending human review (quarantined or spot-checked).
Parameter descriptions lack actionable constraints. E.g., memory_add's 'confidence' param says '0-1' but does not state whether 0.5 is valid or if only 0 and 1 are allowed. Numeric ranges should be explicit (min/max).
memory_search's 'injection' parameter is deeply nested with optional sub-fields. LLMs struggle with optional nested objects. Flatten or provide clear examples of valid combinations.