Decision record

ADR-0012: Records append, they do not rewrite

Written by

ADR-0012: A decision records what it assumed, a runbook records its runs, and both append rather than rewrite

Status: accepted · 2026-09-15

Context

Two kinds of page were losing their most useful information because they had nowhere to put it.

An ADR captured Context, Decision and Consequences at the moment of deciding. Six months on, when the decision bit, the only place to record that was the Consequences paragraph — which meant editing prose written before the outcome was known, and losing the record of what was believed at the time. ADR-0009 in this repository carries the 2026-09-10 lost-writes incident in its Context because that was the section that existed. Nothing recorded which assumption had broken, because assumptions were never written down as such. And nothing distinguished a decision that could be reverted with one commit from one with a migration behind it; both got the same three sections.

A runbook was a page with a runbook badge. Whether the procedure had ever been followed, when, by whom, and where it stopped lived in nobody’s memory — docs/runbooks/firestore-restore.md has a rehearsal-log table that has been empty since it was written. The one property a runbook needs — that it works — was unknowable from the page.

The dead ends between decisions — “spent two days on X because the library docs lied” — had no home cheap enough that anyone wrote them. Plans carry a progress log, but a plan is ceremony; a dead end is not.

Three shapes were weighed for the record. Structured fields on the page (Firestore) — queryable, but invisible in the Markdown an agent reads and an export carries. A separate log type per page — a second page to maintain per decision. Or an append-only section in the Markdown itself, written through a tool that adds one dated line and edits nothing.

Decision

Records are dated lines appended to a named section of the page, through a tool that never edits what is above them. Runs are additionally records under the page, because a run has structure a line cannot hold.

Assumptions

Invalidation triggers

Blast radius

Contained in packages/editor/src/frontmatter.ts (the line, the section helpers), packages/domain/src/entities.ts (door, the journal helpers, the required sections), apps/web/src/lib/server/pages/content-use-cases.ts (appendLine and its faces) and the MCP tools. Leaks into the ADR template in packages/domain/src/guidance.ts, which every new workspace is seeded with.

Alternatives rejected

Consequences

Escape plan

The ledgers are ordinary Markdown sections; removing the tools leaves the pages readable. door is one optional field; dropping the gate is one condition in two status paths. Run records are one subcollection.

What happened

Written and maintained by , who made this decision — about · GitHub.

← All decisions