dira decision memory for AI coding agents
$dira whydec-0006
int-0001The why of a decision survives the session that made itactive 2026-07-29
dec-0006Tiers are fractal — one entry model, one join rule, one drift flag, at every levelaccepted 2026-07-29
✗ Distinct schemas per tier — a "bet" type for ventures, a "focus" type for the personThree schemas means three query engines, three UIs, and three sets of drift rules to keep consistent.
✗ A single global ledger with a scope field on each entryIt would force private personal context and public OSS ledgers into the same file tree, making cst-0003 unenforceable — the whole point is that repo ledgers ship publicly while the personal one never leaves the machine.
int-0001The why of a decision survives the session that made it
dec-0006Tiers are fractal — one entry model, one join rule, one drift flag, at every level
✗Distinct schemas per tier — a "bet" type for ventures, a "focus" type for the person
✗A single global ledger with a scope field on each entry
dec-0006 ◆ accepted 2026-07-29

Arising from int-0001 — The why of a decision survives the session that made it

Tiers are fractal — one entry model, one join rule, one drift flag, at every level

``` ~/.dira/ you — private git repo, syncs across machines └─ sire/.dira/ venture — derives_from: me:int-… └─ kazi/.dira/ repo — derives_from: sire:int-… └─ dira/.dira/ repo ```

The tier is metadata (`ledger.tier` in config), not a type system. What changes per tier is only which mix of the five kinds is idiomatic:

- **person** — intents as *directions* ("ship dira v0.1"), cross-project decisions ("parked X in March because Y"), personal constraints ("no new projects until dira ships"), portfolio-scope questions. - **workspace** — intents as *bets* ("kazi is the wedge product"), cross-cutting decisions no single repo owns, standing constraints every repo inherits. - **repo** — the technical decisions, alternatives, and questions of one codebase.

Two mechanisms make the tiers work, and they are the same mechanisms at every level: **namespaced refs** (`sire:int-0002`) resolved through `[parents]` in config, and **the orphan flag** — an active intent with no `derives_from` into a parent is surfaced as drift. At the repo tier that flag asks "why does this work exist?"; at the personal tier it asks the same question of a whole project.

The few-intents cap matters most at the top: a personal ledger holding twelve active intents *is* the absence of clarity, rendered legibly. dira's job there is to show that, not to fix it.

Alternatives on record — 2

✗Distinct schemas per tier — a "bet" type for ventures, a "focus" type for the personrefused Three schemas means three query engines, three UIs, and three sets of drift rules to keep consistent.

The fact that the personal and venture tiers needed no new entry kinds — only a different *mix* of the same five — is the evidence the model is right. Adding tier-specific types would discard that.

revisit ifa tier appears whose entries genuinely cannot be expressed as the five kinds

✗A single global ledger with a scope field on each entryrefused It would force private personal context and public OSS ledgers into the same file tree, making cst-0003 unenforceable — the whole point is that repo ledgers ship publicly while the personal one never leaves the machine.

It would force private personal context and public OSS ledgers into the same file tree, making cst-0003 unenforceable — the whole point is that repo ledgers ship publicly while the personal one never leaves the machine.

Every decision in this repo is recorded like this one.

Keep your own →