Ram Farm pre-release

Agent memory that reconciles contradictions. An in-process library: npm i ramfarm, one SQLite file, no daemon.

The whole public surface

MethodLLM needed?
remember({subject, text, source?, context?, fast?})yes
recall({subject, query?})no
forget(filter)no
reflect(subject, {dryRun})yes
get(id) / stats(subject?)no
exportLines() / importLines()no

The asymmetry is the design: recall, stats, export and import need no key and no network. Only writing and reflecting call an LLM. The hot, frequent operation is free.

Use it as an MCP server

This config does not work yet, and will not until D2. Nothing is published to npm, so npx -y @ramfarm/mcp resolves to a 404 -- verified, not assumed. It is shown because it is the shape the package will ship with, and because a page that says "not published" in the footer while handing out an install command in the body is worse than one that says so at the point of use.
{
  "ramfarm": {
    "command": "npx",
    "args": ["-y", "@ramfarm/mcp"],
    "env": { "RAMFARM_DB": "~/.ramfarm/waremoto.db" }
  }
}

Five tools: remember, recall, forget, reflect, memory_stats.

Use it as a library

import { open } from "ramfarm";

const farm = await open("./memory.db", { strict: true });
await farm.remember({ subject: "user:julio", text: "prefers pnpm for this repo" });
const hits = await farm.recall({ subject: "user:julio", query: "package manager" });
strict: true is not optional in anything real. Without it open() silently falls back to HashEmbedProvider, which is deterministic but not semantic — and that breaks contradiction detection entirely.

A stored record

type · scope · basis (stated | inferred) · validFrom / validTo · supersedes[]. A non-null validTo means history, not garbage — superseded facts are kept with their lineage.