dira decision memory for AI coding agents
$dira whydec-0003
int-0002Zero-ceremony operation — one binary, no server, no daemonactive 2026-07-29
dec-0003No model client in the binary — semantic extraction is delegated to the live sessionaccepted 2026-07-29
✗ Embed an LLM client so `dira sniff` can extract decisions semantically on its ownIt would require an API key to function, add a network round-trip to a hook in the latency path, impose a per-session cost the user did not ask for, and pin dira to one provider — breaking the BYOM neutrality kazi already holds.
✗ Regex-only extraction, no semantic tier at allRegex reliably catches decision *language* ("let's go with", "we're not doing") but cannot fill in the because, the rejected alternatives, or the parent intent — which are the fields that make an entry worth having.
int-0002Zero-ceremony operation — one binary, no server, no daemon
dec-0003No model client in the binary — semantic extraction is delegated to the live session
✗Embed an LLM client so `dira sniff` can extract decisions semantically on its own
✗Regex-only extraction, no semantic tier at all
dec-0003 ◆ accepted 2026-07-29

Arising from int-0002 — Zero-ceremony operation — one binary, no server, no daemon

No model client in the binary — semantic extraction is delegated to the live session

Capture is two-tier, and the tiers have different trust levels:

**Tier 1 — `dira sniff` (in the binary).** Pure pattern matching over the transcript. Cheap, offline, deterministic, and lossy. Anything it produces is written with `state: staged` and `source.tier: regex` — never accepted, because a regex has no business asserting rationale.

**Tier 2 — the skill (in the live session).** The already-running Claude session fills in the because, the alternatives with their why_nots, and the `derives_from` edge, then calls `dira log` with the complete entry. This costs no API key, no extra model call, and no vendor lock-in, because it rides the session that is already happening.

The binary therefore never sees a model, never holds a key, and works identically under any model the user has chosen. The consequence to accept honestly: **dira's capture quality is a function of the agent driving it.** With no agent, dira degrades to `dira log` typed by hand — still useful, but the automatic-capture promise of int-0001 belongs to the agent-driven path.

Alternatives on record — 2

✗Embed an LLM client so `dira sniff` can extract decisions semantically on its ownrefused It would require an API key to function, add a network round-trip to a hook in the latency path, impose a per-session cost the user did not ask for, and pin dira to one provider — breaking the BYOM neutrality kazi already holds.

It is also redundant: at the exact moment extraction is needed, a capable model is already running with the full transcript in context, for free.

revisit ifdira needs to extract from transcripts outside a live agent session

✗Regex-only extraction, no semantic tier at allrefused Regex reliably catches decision *language* ("let's go with", "we're not doing") but cannot fill in the because, the rejected alternatives, or the parent intent — which are the fields that make an entry worth having.

Regex alone would produce a ledger of titles, which is the ADR-pile failure again.

Every decision in this repo is recorded like this one.

Keep your own →