pakka / recall / the medical record

recall.

Cross-session memory. Ask pakka about a decision from three weeks ago.

What it does

A repo's memory of itself.

Most decisions in a coding session evaporate the moment the window closes. Recall watches the conversation for the parts that ought to outlive it — the why-we-chose, the why-not, the constraints — and writes them to a small, queryable, local store.

in detail

Recall is not a transcript log — those are too noisy to be useful. Recall extracts five categories of long-lived knowledge from the turn stream and indexes them into a small, queryable SQLite database on your machine.

If a decision can't be answered by recall in one query, it isn't a decision yet — it's a vibe.

/01

Local, by default.

SQLite FTS5 index — porter tokenizer, BM25 ranking — at $CLAUDE_PLUGIN_DATA/recall.db, falling back to ~/.pakka/recall.db. No embeddings, no API calls. Never leaves your machine.

/02

Indexed at session end.

Entries come from the audit JSONL trail. The SessionEnd hook indexes new entries into FTS5 — idempotent, no manual step. The database survives plugin updates.

/03

Always cited.

Each entry references the diff, the spec section, and the turn it was extracted from. No orphans, no folklore.

/04

Cross-session, cross-author.

The next contributor — or the next model — asks /pakka:recall why redis and the original turn surfaces in milliseconds.

What gets remembered

Five categories. One paragraph each.

Recall is opinionated about what counts. Anything outside these five is left in the transcript and compressed away.

/ 01

decisions

we chose this

The thing you committed to. Cites the diff. Distilled from the model's reasoning + the human's confirmation. One per material change.

~62%of all entries
/ 02

rejections

we tried that

The alternative that was on the table and got dropped. Cites the constraint that killed it. Saves the next contributor from re-litigating.

~18%of all entries
/ 03

constraints

load-bearing

Hard requirements that aren't in the code yet. "Must be idempotent at the billing boundary." Surfaces during gate as the spec.

~9%of all entries
/ 04

conventions

how we do it here

Repo-local style not in the linter: error wrapping pattern, observability key shape, where logs go. Updated, not appended.

~7%of all entries
/ 05

questions

unresolved

The thing nobody answered. Surfaces at the top of the next session until closed. Forces conversations rather than letting them rot.

~4%of all entries
Three queries

Ask, three weeks later.

Real queries from the rate-limit engagement, fired against the recall store after the engineer left the project for a sprint. Each returns the originating turn.

queries

why did we drop redis for the rate limiter?

recall · 0.12smatch · 0.91turn · 2026-03-04 / #07
Decision (rejection). Redis was on the table for the rate-limiter bucket store. Rejected after the architect agent flagged a hard constraint from the deploy spec: "single-region hot data, no cross-region replication." Redis Cluster was deemed disproportionate; settled on Postgres advisory locks against the existing primary. cited · diff #a2f1c · spec §deploy.2 · alt-considered 3

what's the idempotency key shape for webhooks?

recall · 0.09smatch · 0.94turn · 2026-04-22 / #14
Convention. Idempotency key is sha256(provider_event_id, account_id), truncated to 32 hex chars, stored in billing.idempotency_keys. Set on the request boundary, checked before any billing call. "Retries MUST be idempotent at the billing boundary" — spec §4.1. cited · diff #9c4ee · spec §4.1 · gate-finding #47

are there any open questions about the auth claim model?

recall · 0.10smatch · 0.86turn · 2026-04-30 / #03
Open question. Whether the actor claim should be propagated through the rate-limit middleware or only consulted at the route handler. Two engineers split. Surfaces at the top of every session until resolved. cited · spec §auth.3 · age 9 days