From RFC to ADR: Reaching the Decision and Keeping the Reasoning
An RFC is usually about reaching agreement; an ADR records the agreement once reached — and the reason ADRs rot is that the debate lives in chat and pull-request comments while the record is written afterwards, from memory, by one person. To run the RFC-to-ADR flow so the record falls out of the debate: state the proposal as a root claim (the future ADR's title); add context as separate pro-arguments so each force can be challenged individually; give every considered option its own sibling node with its own pros and cons — including the rejected ones; run the RFC comment round as chains (Q&A chains for clarification, Review chains for objections — each a four-turn dialogue between reviewer and option author, with N reviewers meaning N parallel chains; Compromise chains for reconciling splits, where a completed chain records the attempt whether or not it resolved); have decision-makers rate the options as evidence of where the room stood — the rating is not the decision, a named human still calls it; record accepted consequences as con-children of the chosen option; and model supersession by linking a later decision to the one it replaces, keeping the old one readable. Seeding from existing markdown ADRs or decision-heavy transcripts works via AI extraction with provenance stamped. Honest limits: this does not replace repo-tracked ADRs (export and commit the record); there is no built-in ADR status field, so proposed/accepted/superseded is a convention you maintain; a completed chain does not mean the parties agreed — which is precisely what makes disagree-and-commit legible.
An RFC is usually about reaching agreement; an ADR records the agreement once reached. ADRs rot because the agreement-reaching happens in chat and the recording happens later, from memory. Run both in one structure:
- The proposal is a root claim; context forces are separate, challengeable pro-arguments; every option — including rejected ones — gets its own node
- The RFC round is chains: Q&A to clarify, Review to object, Compromise to reconcile — four-turn dialogues, N reviewers = N parallel chains
- The rating is not the decision: decision-makers rate as evidence; a named human calls it — and writes why, especially against the room
- The ADR is the tree: nothing is transcribed, so nothing is lost in transcription — export to the repo if your org requires it
The decision nobody could reconstruct
The new tech lead asks a reasonable question: why does every service talk to the billing system through that queue? There is an ADR — ADR-014, four sentences, written eleven months ago. Context: "we needed reliable billing integration." Decision: "use the queue." Consequences: "some added latency." It is technically a record. It answers nothing.
You were there, so you know what ADR-014 doesn't say: the three-week argument across two Slack channels and a heated PR thread; the synchronous-API option that lost because of a rate limit that has since been raised; the staff engineer's objection that was answered with a benchmark nobody can find now. The debate happened. The record was written afterwards, from memory, by one person, on a Friday.
This is the documented, near-universal failure mode of a genuinely good practice. AWS's prescriptive guidance and Microsoft's Well-Architected docs both recommend ADRs — and both note the pain: keeping them current takes time, and managing them gets complex as teams and choices multiply. The root cause is structural: the debate and the record live in different places, so the record is always a lossy transcription. The fix is to make them the same place. Nor is the practice engineering-specific, or even ADR-specific. Google requires a design doc — problem, proposed approach, alternatives considered, trade-offs — written and reviewed before significant technical work begins, a practice set out in the company’s own Software Engineering at Google. It is the same discipline as an ADR, applied one step earlier: the ADR records the choice a design doc argued its way to. The two fail the same way for the same reason, and both are fixed by the same move — hold the argument where the record lives, rather than transcribing one into the other afterwards. Read every step below as covering both artifacts.
Why ADRs rot
One sentence from the ADR community's own material carries the whole diagnosis: an RFC is usually about reaching agreement; an ADR records the agreement once reached. Two artifacts, two moments — and everything between them leaks. The alternatives that were "obviously" wrong go unrecorded (until they stop being obvious). The objection that shaped the final design survives only as a PR comment on a closed thread. The context section gets written last, worst, by whoever lost the game of not-it. Meetings that should have produced decisions produce summaries instead, and the reasoning that makes a decision durable — the thing the whole decision quality chain depends on — is exactly what transcription drops.
What you need
One Argumentree discussion per RFC. If you have an existing corpus of markdown ADRs or a decision-heavy meeting transcript, upload it — AI extraction turns it into structured pro/con arguments with the source passages attached, stamped as extracted so imported claims are never mistaken for live ones (how extraction works).
Step 1–3: The proposal, the context, the options
- 1State the proposal as the root claim — the proposed decision, not a question: "We will route all billing writes through a durable queue." This sentence is the future ADR's title. Checkpoint: root exists, one sentence, authored by the proposer.
- 2Context as separate pro-arguments. Each force that makes the decision necessary — the reliability requirement, the billing-system rate limit, the audit mandate — is its own argument under the root. A monolithic "Context" paragraph cannot be challenged; three separate context claims can each be questioned, confirmed, or knocked down individually. Checkpoint: ≥2 context arguments, each one force.
- 3Every option gets its own node. The queue, the synchronous API, the batch job — sibling arguments, each with its own pro and con children. Pro/con is relative to the parent, so an option's drawbacks hang off that option, not off the decision. Include the options you expect to reject: the rejected sibling is what answers next year's "why didn't we just…". Checkpoint: every option a reader might ask about exists.
Step 4–6: The RFC round that leaves a record
Now the review round — normally the part that scatters across chat, comments and hallways. Here it runs as three kinds of structured exchange, each a four-turn dialogue between a reviewer and the option's author:
Q&A chain — clarify
"What happens to existing synchronous clients?" The option's author answers, the reviewer follows up, the author answers again — complete. No option should carry an unanswered question into the decision.
Review chain — object
A reviewer evaluates an option as unsound; the author responds; follow-up; response. N reviewers = N parallel chains on the same option — every objection is its own attributable exchange, not a lost comment in a shared thread.
Compromise chain — reconcile
Two camps split? One proposes the middle option to the other author. If it resolves, you have a new option node. If it doesn't, the completed chain is the record that it was tried — which is worth almost as much.
Completed ≠ agreed
A chain reaching completed means the exchange ran its course — question asked and answered twice — not that the parties agreed. Keep that distinction; it is about to matter.
Step 7: Deciding — and what the rating is not
Decision-makers rate the options: one labelled rating each. The distribution is genuine evidence — where the room stood, on the record, before the call. But the rating is not the decision. A named human still decides, and if the call goes against the distribution, the decision node is where that gets explained. (Who that named human should be, and how to assign the role before the debate rather than after, is its own discipline — see the decision-rights tutorial.)
The question for your team
Who decided your last architectural call — and can you prove it? Not who was in the meeting: who owned the decision, and where is their reasoning written?
Step 8–9: The ADR you did not have to write
Here is the payoff. The record is not a document you write afterwards — it is the chosen option's node plus everything already attached to it: the context arguments (Context), the rejected siblings (Options Considered), the completed chains (the discussion, with authors), the ratings (where the room stood), and the decision argument with its rationale (Decision). Nothing is transcribed, so nothing is lost in transcription.
- 1Record the consequences you are accepting. Known downsides — the added latency, the operational burden of the queue — go on as con-children of the chosen option, acknowledged by the decider. Writing them down is what makes it a decision rather than a preference. Checkpoint: ≥1 accepted consequence on the record.
- 2Export if your org requires repo-tracked ADRs. Many do, correctly — the markdown ADR next to the code stays the compliance artifact. Write the four-section summary from the tree (five minutes, not a Friday), link back to the discussion for the full debate. Checkpoint: the repo ADR cites the tree; the tree holds the reasoning.
Disagree and commit, on the record
The pattern Amazon made famous — disagree and commit — has a legibility problem: how does anyone later know the disagreement was real, heard, and answered, rather than steamrolled? The chain mechanics answer it. A Review chain that ran its full four turns and completed without agreement is precisely the receipt: the objection was made, answered, pressed, and answered again, on the record, before the dissenter committed. The dissenter is documented as having been heard — which is what makes committing afterwards reasonable rather than merely obedient.
Do not read completion as consensus
Completed means the exchange finished, not that anyone changed their mind. If you report chain completion as agreement, you will manufacture false consensus and burn the trust the mechanism exists to build. The honest reading: consulted, answered, still opposed, committed anyway — all four facts visible.
Step 10: Superseding without deleting
Decisions age. When the rate limit that killed the synchronous option gets raised, the right move is a new decision that references the one it replaces — a new argument linked to ADR-014's node, stating what changed. The old decision stays readable; its reasoning is exactly why the new decision knows what it is overturning.
One honest gap to manage explicitly: there is no built-in ADR status field. Proposed / accepted / superseded is not a first-class state on an argument — supersession is modelled by linking, and the convention is yours to maintain. State it in your team's working agreement rather than assuming the product enforces it.
Honest limitations
- ✗This does not replace ADRs in your repo if your org requires them version-controlled next to the code. Export and commit the summary; use the tree for the part markdown is bad at — the debate.
- ✗No ADR status field. Proposed/accepted/superseded is a linking convention you maintain, not something the product enforces.
- ✗A chain is four turns. Deep architectural disagreement will need a call; the chain is the record of what was already tried before it.
- ✗Ratings are a single labelled value, not weighted multi-criteria scoring.
- ✗It does not make anyone write good context. Structure lowers the cost of a good record; it does not supply the judgment.
Practical lessons
- ✓One RFC, one discussion. Resist the mega-tree covering the whole quarter's architecture — supersession links connect decisions better than nesting does.
- ✓Seed from what exists. A decision-heavy transcript or your old ADR folder, extracted, gives the debate a running start — labelled as imported, so live arguments stay distinguishable.
- ✓Put reviewers' names on their chains and leave them there. The attribution is the accountability; anonymous architectural objections age into folklore.
- ✓The consequences section is the decider's, nobody else's. Accepted downsides written by the person who accepted them carry a different weight than a reviewer's warnings.
ADR-014, the version that answers
Back to the new tech lead's question. In the rebuilt version, ADR-014 is a node: the queue decision with its rationale, three context forces (one now stale — visibly), a rejected synchronous-API sibling whose fatal con names the old rate limit, four completed Review chains including the staff engineer's, and the benchmark attached as evidence. The tech lead reads for ten minutes, sees the rate limit changed, and opens a superseding proposal linked to the old node. Nobody excavates Slack. That is the entire promise: the chains reach the agreement, the tree records it — and the record answers questions you didn't know it would be asked.
Sources & further reading
- Nygard, M. (2011). Documenting Architecture Decisions. Cognitect blog.The essay that popularized ADRs: context, decision, consequences, kept with the code.
- AWS Prescriptive Guidance — Architectural decision records.The RFC-vs-ADR framing and the documented maintenance pain this tutorial exists to fix.
- Microsoft Azure Well-Architected Framework — Architecture decision records.ADR practice in the Well-Architected review context.
- The ADR GitHub organization (adr.github.io).Templates, tooling and the community's accumulated conventions — including the status-field practice this tutorial models by linking.
Frequently Asked Questions
What is the difference between an RFC and an ADR?
An RFC (request for comments) is the process of reaching agreement: a proposal is circulated, alternatives argued, objections raised and answered. An ADR (architecture decision record) records the agreement once reached: context, options considered, decision, consequences, status. The failure mode of running them as separate artifacts is that everything between them leaks — the debate lives in chat and PR comments while the record is written afterwards from memory. Running the RFC as a structured argument tree makes the ADR fall out of the debate itself: nothing is transcribed, so nothing is lost in transcription.
Why do ADRs go stale or stop being written?
Because writing them is a transcription job. The genuine reasoning happens in Slack threads, review comments and meetings; afterwards one person reconstructs a Context section from memory, usually briefly and last. AWS's and Microsoft's own guidance notes the pain: ADRs take time to write and update, and management gets complex as decisions multiply. Teams don't stop believing in ADRs — they stop paying the transcription tax. Making the debate and the record the same structure removes the tax.
How do you run an RFC review round with a record?
Three structured moves, each a four-turn dialogue with the option's author. Q&A chains for clarification: question, answer, follow-up, answer. Review chains for objections: evaluation, response, follow-up, response — with N reviewers opening N parallel chains on the same option rather than one shared thread, so every objection stays attributable and answered. Compromise chains for splits: one side proposes the middle position to the other, and whether or not it resolves, the completed chain records that it was tried. The checkpoint before deciding: no option carries an unanswered question, and every substantive objection exists as a completed chain.
How does 'disagree and commit' work with decision records?
The chain mechanics make it legible. A Review chain that runs its full course — objection, response, follow-up, response — and completes without agreement is the receipt that the dissent was real, heard and answered before the dissenter committed. Critically, completed does not mean agreed: it means the exchange finished. Reporting completion as consensus manufactures false agreement and destroys the mechanism's value. The honest record shows four facts at once: consulted, answered, still opposed, committed anyway — which is exactly what makes commitment after disagreement reasonable.
Should decision records replace ADRs in the code repository?
No — and this tutorial says so explicitly. If your organization requires version-controlled ADRs next to the code (many do, correctly, for compliance and offline access), keep them: write the four-section markdown summary from the tree in five minutes and link it back to the discussion. The division of labor is clean: the repo ADR is the durable compliance artifact; the tree holds what markdown is bad at — the live debate, the rejected options with their reasoning, the objections and their answers, and the ratings.
How do you mark an ADR as superseded?
By convention, not by a field — and it is worth being honest that there is no built-in proposed/accepted/superseded status on an argument. Model supersession by creating the new decision as its own argument linked to the one it replaces, stating what changed (the raised rate limit, the new requirement). The old decision stays readable — deleting it would destroy exactly the reasoning the new decision needs to reference. State the convention in your team's working agreement so it is maintained deliberately.
Stop transcribing decisions. Start keeping them.
Run your next RFC as a tree: options with their reasoning, objections as answered chains, and an ADR that writes itself.
Start Free 14-Day Trial