Git-native, Markdown-based memory layer for AI agents. Features bi-temporal fact ledgering, compliance-grade erasure, PII gating, hybrid search, and MCP integration.
MarkMem provides 7 tools with complete input schemas and descriptions. Naming follows verb_noun convention (wiki_search, wiki_read, wiki_ingest, etc.), which is clear. However, descriptions are terse (10-80 chars), lacking context on WHEN to use each tool, prerequisites, or error recovery guidance. Parameters have types and descriptions, but lack constraints (enums, ranges, patterns). Output schemas are not documented, responses are JSON strings without field-level documentation. Error handling is minimal; tools return plain strings on failure rather than structured error objects with recovery guidance. No tool annotations (readOnlyHint, destructiveHint) despite clear read/write distinctions. The wiki_supersede and wiki_review tools perform state mutations but lack confirmation/dry-run patterns.
Audit trail of one page (git log --follow).
Ingest raw content; wait=True compiles synchronously.
List pages — same content as index.md.
Read one page: full frontmatter (incl. claim ledger) + body.
List quarantined memory ops, or decide one (decision=accept|reject).
Search memory pages (BM25 + claim ledger). as_of=YYYY-MM-DD for point-in-time.
Close an existing claim and record the replacing fact (human-directed).
Output schemas not documented. Tools return JSON strings without field-level documentation. LLMs cannot plan downstream calls or extract structured data reliably.
Descriptions are terse (10-80 chars) and lack context on WHEN to use each tool, prerequisites, or error recovery. Pattern baseline is 194 chars average; these are 50-70% below baseline.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). wiki_supersede and wiki_review are destructive but unmarked; wiki_search, wiki_read, wiki_list are read-only but unmarked.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
Parameters lack constraints. 'type' and 'decision' accept free-form strings; no enums. 'top_k' and 'include_diff' lack min/max bounds. Invites hallucinated values.
Error handling returns plain strings ('no such page: {id}') instead of structured error objects with recovery guidance. LLM cannot classify errors as retryable, user-fixable, or fatal.