A zero-dependency SQLite memory layer for AI agents that learns what works: patterns graduate to proven preferences via a built-in experiment loop.
metabrain has 7 tools with complete input schemas and descriptions. Naming is verb-forward (recall, learn, hypotheses, verdict, start_brief, stats, capture_error) and mostly clear. Descriptions are present and substantive (avg ~120 chars), exceeding the 10-char minimum. However, several tools lack parameter-level constraints (enums for 'type', 'status', 'result'), descriptions are generic rather than LLM-optimized, and output schemas are not formally documented. Error handling is minimal, no recovery guidance or actionable error messages. The tool set is well-composed (single responsibility, good chaining via IDs), but lacks the polish of production-grade tools.
Record a failure from `tool` name, `error` text, and optional `context`, returning the stored error entry.
List hypothesis objects, optionally filtered by `status` (testing, graduated, or rejected).
Record or reinforce one lesson from `type` (failure, pattern, gotcha, or preference), `insight`, and optional `domain` and `context`, returning the stored lesson.
Search stored lessons for the substring `query` and return up to `limit` matching lesson objects, newest first.
Return the start-of-task digest (preferences, learnings, open_hypotheses, open_units, last_checkpoint, recent_errors), taking no arguments.
Return a mapping of every metabrain table name to its row count, taking no arguments.
No enum constraints on 'type' parameter (learn tool). Accepts 'failure|pattern|gotcha|preference' but schema shows bare string. LLMs will hallucinate invalid types.
No enum constraints on 'status' parameter (hypotheses) or 'result' parameter (verdict). Free-form strings invite invalid values.
Output schemas not documented. start_brief returns a digest with fields (preferences, learnings, open_hypotheses, etc.) but LLMs cannot see the structure. Same for stats, recall, learn, verdict, hypotheses, capture_error.
No error handling or recovery guidance. If learn() receives invalid 'type', the error message is generic. No guidance on what to do next.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
Record `result` ("pass" or "fail") against an optional `unit` or `hypothesis` with optional `evidence`, and return the stored entry (an experiment is written when a hypothesis is in play).
Descriptions lack LLM-optimization. 'Record or reinforce one lesson...' is functional but does not explain WHEN to call learn vs recall, or what happens if you call learn twice with the same insight.