dira decision memory for AI coding agents
$dira whydec-0028
qst-0003Does bulk-importing an existing ADR corpus produce a useful ledger, or a second pile?answered 2026-07-29
dec-0028Import measures a corpus before importing it, and offers indexing when the yield is nothingaccepted 2026-08-09
✗ Import without measuring firstSimpler and what a user expects.
✗ Do not build import at allThe cleanest promise - dira knows only what it captured.
qst-0003Does bulk-importing an existing ADR corpus produce a useful ledger, or a second pile?
dec-0028Import measures a corpus before importing it, and offers indexing when the yield is nothing
✗Import without measuring first
✗Do not build import at all
dec-0028 ◆ accepted 2026-08-09

Arising from qst-0003 — Does bulk-importing an existing ADR corpus produce a useful ledger, or a second pile?

Import measures a corpus before importing it, and offers indexing when the yield is nothing

`dira import <dir>` measures the corpus, reports what it found, and asks before writing anything.

The evidence this rests on

Five real corpora, four organisations, four house styles, measured by `qst-0003`'s experiment:

| corpus | documents recording a reasoned rejection | |---|---| | bbc/tams | **90%** | | kazi | 76% | | Sylius | 65% | | IRS direct-file | 11% | | **nulib/meadow** | **0%** |

The range is the finding. An importer that behaves the same at both ends of it is wrong at one end.

What the dry run must say

Counts, not adjectives, and the offer to do something else:

``` 49 documents scanned 44 record a rejected option with a reason 237 reasons found ```

and where the yield is nothing:

``` 31 documents scanned 0 record a rejected option with a reason

Importing these gives dira nothing it can enforce. Index them instead, so `dira why` can cite them without claiming them? ```

**Indexing is a real answer, not a consolation.** A document dira can point at is more useful than an entry dira cannot enforce, and it is honest about which is which.

One thing measurement already told us to build in

Terse option labels defeat lexical matching. In kazi's corpus 6% of options are two words or fewer — `Go`, `Rust`, `Redis` — and the reason under `Go` is three rich sentences while the handle is one word that is also an English verb. Expanding short labels is free at extraction time and expensive afterwards. It is **conditional**, not universal: the other four corpora ran 0-8%, so this is a repair the dry run detects the need for, not a rule.

Alternatives on record — 2

✗Import without measuring firstrefused Simpler and what a user expects.

It also fails silently on a whole class of repository: nulib/meadow is 31 documents of textbook Nygard with ZERO recorded rejected alternatives, and importing it yields 31 entries `dira check` can never cite. That is worse than an empty ledger, because it looks like it worked.

✗Do not build import at allrefused The cleanest promise - dira knows only what it captured.

Rejected because the measurement says the corpora are often rich: 90%, 76% and 65% of documents in three of the five carried a real reason for a rejected option, 237 of them in one repository. Refusing to read that is refusing the one thing a repo with history already has.

Every decision in this repo is recorded like this one.

Keep your own →