Project memory for AI agents that knows when it's wrong — dated facts, verified against git. Local, zero dependencies.
Facto has 11 tools with complete JSON schemas and descriptions. Naming follows verb_noun convention (facto_status, facto_search, facto_add_fact). Descriptions are present (avg ~120 chars) and explain WHAT and WHEN. However, parameter descriptions are sparse or missing for many fields. Output schemas are not documented. Error handling guidance is absent. No tool annotations (readOnlyHint/destructiveHint). The server is domain-specific (project memory) with clear intent, but lacks production-grade polish in parameter guidance and error recovery.
Define a project AREA (a logical module) — writes it into facto.config.json. Use during SETUP, one call per area, AFTER the human confirmed the structure. slug = short semantic name (e.g. 'factory', not '01_generatore-siti-astro'); path = the real folder (may be nested, e.g. 'code/01_thing'); label = readable name.
Add a CRM entity: type = persona|cliente|milestone|risorsa|fonte, with a name and an optional note.
Record a new dated FACT in an area. type = stato|obiettivo|rotta|nota|operativo|bloccante|bug|decisione|vincolo|preferenza. The fact stays 'true now' until it gets closed.
Add a TASK in an area, with optional due date (YYYY-MM-DD) and status todo|doing|done.
Briefing of one area: the compass sections (goal, where we are, last handoff, next steps, how-we-work, blockers, bugs, decisions). Without 'area' it lists the available areas.
Close (NOT delete: history is kept) the open facts of a type in an area. 'contains' narrows by text.
Parameter descriptions missing or minimal. 'area', 'type', 'text', 'date', 'status', 'note' fields lack guidance on format, constraints, or valid values. LLMs cannot infer whether 'type' accepts 'stato|obiettivo|rotta' or free text.
No output schemas documented. Tools return results but LLMs cannot plan downstream calls or extract fields. E.g., facto_search returns 'matching facts' but structure is opaque.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Agents cannot distinguish safe reads from destructive writes without parsing descriptions. facto_add_fact, facto_close_fact, facto_handoff, facto_add_area, facto_remove_area, facto_add_entity, facto_add_task are all WRITE but unmarked.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Project CRM: entities (people, clients, milestones), tasks with status and overdue deadlines.
Save the end-of-session HANDOFF for an area: what was done + where you were heading, so the next session resumes exactly. Replaces the previous one (kept in history).
Remove an AREA from facto.config.json (e.g. a test area created by mistake). Its facts stay in history. Confirm with the human first.
Full-text search across the project memory. Returns matching facts, marking whether each is true NOW or historical.
Overview of ALL project areas: current state, trust light (green/yellow/red vs git) and open blockers. Use it to orient yourself.
No error handling guidance. Tools lack recovery hints (e.g., 'If area not found, call facto_add_area first'). No categorization of errors as retryable vs user-fixable.
facto_crm description is vague ('Project CRM: entities...tasks...'). Does not explain when to call it vs facto_add_entity or facto_add_task. No guidance on what structure it returns.