Semantic search over a Markdown knowledge base, served over MCP.
When .xls support was withdrawn in v0.14.0, the reasoning survived in four
places — CHANGELOG.md, both READMEs, a 32-line doc comment in
parser/xlsx.rs, and a private note under .dev/knowledge/ — while the
intent to revisit it survived in none. The private backlog had no entry, and
.dev/feature-ideas.md still listed .xls as done, actively claiming the
opposite of what shipped. Reconstructing the decision a week later meant
reading four documents and noticing that a fifth was wrong.
That failure is not specific to .xls. A withdrawal PR treats the withdrawal
itself as the deliverable, so effort goes into explaining the change; recording
the option that was not taken looks out of scope and gets dropped. The same
applies to any decision where alternatives were weighed: the chosen path is
visible in the code, and the discarded ones are visible nowhere.
What is missing is a single canonical answer to “why is it this way, what else was considered, and what did it cost” — one that lives in version control, travels with a clone, and is reviewable in the pull request that makes the decision.
.dev/decisions/. Cheap and informal,
consistent with the existing private notes.docs/decisions/, following MADR. Tracked in git alongside the code.Chosen option: docs/decisions/, following MADR, because it is the only
option that puts the record under version control.
Option 1 is what produced the .xls situation. Option 2 fails on a property
that matters more than convenience: .dev/ is excluded via
.git/info/exclude, has no nested repository, and is not backed up — a
decision log kept there is not versioned, does not survive a clone, cannot be
referenced from public documentation, and is lost with the machine. The single
most valuable property of an ADR is durability, and option 2 removes it.
MADR with the optional sections dropped unless
they earn their place. Files are NNNN-title-with-dashes.md, numbered
consecutively from 0000, in docs/decisions/.
English and Japanese pairs — NNNN-slug.md and NNNN-slug.ja.md — matching
the convention already used for README and everything under docs/.
English-only was considered and rejected: the primary reader today is the
project owner, who reads Japanese. The usual objection to bilingual long-form
prose is drift, but it does not apply here — an ADR is superseded rather than
edited, so the text is written once and then left alone. Only the Status
line changes over time.
Write an ADR only when all three hold:
The dominant failure mode reported in practice is not too few ADRs but too
many: without a threshold, the log fills with routine choices and the
significant decisions become unfindable. When in doubt, a CHANGELOG entry is
enough.
An ADR is the canonical why. It absorbs rationale that would otherwise be duplicated, and it leaves the following alone:
| Location | Keeps |
|---|---|
CHANGELOG.md |
What changed in a release, and the upgrade impact |
README |
What a user can and cannot do today |
docs/ARCHITECTURE.md |
How the current system is put together |
| Source comments | Facts a reader needs at that line — measurements, invariants |
.dev/knowledge/ |
How an investigation went wrong, and traps to avoid repeating |
When an ADR is added, prose that merely restates its reasoning elsewhere should be cut down to a summary and a link.
An ADR is never edited to reflect a reversal and never deleted. To change a
decision, add a new ADR and set the old one’s status to
superseded by ADR-NNNN. The discarded reasoning is the point of the record.
Statuses used: proposed, accepted, rejected, deprecated,
superseded by ADR-NNNN.
CHANGELOG / README / source comments
can shrink to a summary and a link instead of each carrying the full
argument..dev/knowledge/, not here.# N. Short noun phrase
- Status: proposed | accepted | rejected | deprecated | superseded by ADR-NNNN
- Date: YYYY-MM-DD
- Deciders: who
## Context and Problem Statement
What forces are at play, stated neutrally. What breaks if nothing is done.
## Considered Options
1. ...
2. ...
## Decision Outcome
Chosen option: "...", because ...
### Consequences
What the resulting context looks like — including what got worse.
### Confirmation
How compliance is checked (a test, a CI step, a measurement).
## More Information
Links to the PR, the issue, measurements, related ADRs.