decision-record
Shape the thinking behind an architectural decision: list the
options, expose trade-offs, lock the chosen variant, and wire the
supersession chain. Hands off to adr-create
for file mechanics (numbering, index, frontmatter). This skill does
not write the ADR file itself.
When to use
- A team is about to commit to a non-trivial architectural choice and
wants the trade-offs on paper first.
- Two engineers disagree on an approach — surface the options and
consequences before one wins by attrition.
- A previous decision needs revisiting; the result must
supersede:
the older ADR with explicit rationale.
- German triggers: "lass uns das festzurren", "Trade-off-Matrix",
"welche Option ziehen wir?".
Do NOT use when:
- The file mechanics are the entire ask (numbering, regenerating the
index) — route directly to
adr-create.
- The decision is reversible and small (e.g. variable rename) — ADRs
are for choices that constrain future work.
- The user wants a feature plan, not a decision — route to the
planning command instead.
Cognition cluster
- Mental model 4 — Second-order thinking. Every decision unlocks
some futures and locks out others; the consequences block names
what becomes harder, not just what becomes easier. See
docs/contracts/mental-models.md § 4.
- Mental model 6 — Theory of constraints. A decision that does
not move the binding constraint is theatre; if the trade-off matrix
scores every option the same on the constraint that matters, the
options are fungible — surface and stop. See
mental-models.md § 6.
- Mental model 10 — Reversible vs irreversible. Two-way doors
get a one-page record; one-way doors get the full options +
consequences + supersession chain. The reversibility row of the
matrix decides which template fires. See
mental-models.md § 10.
Corollary — a shortcut through a one-way door is a decision, not a
defer. The cheap-and-simple option is preferred where the choice can
be walked back later. Where it cannot — a public API shape, a DB schema,
a migration, a wire format, a published identifier — "we can simplify
this later" is false, so it never ships as a deferred note; it lands
here as a recorded decision with its consequences named. The one-way
categories are enumerated so the call is not left to a judgement about
what feels important.
- Team context-spine slot. Read the team slot of the
context-spine to
capture who is bound by the decision (review groups, on-call
rotation). Skip if the consumer project has not filled it; note in
the record.
Procedure
1. State the decision in one sentence
"We need to decide X because Y." If you cannot, the decision
is not ripe — surface that and stop.
2. Identify and enumerate options (≥ 2, usually ≤ 4)
Each option gets:
- Name — short, descriptive, never "option A / B / C".
- Sketch — what it actually does in one paragraph.
- Cost / benefit — three to five bullets per side, concrete.
- Reversibility — easy / costly / one-way (Bezos two-way / one-way
door framing).
Add an explicit "do nothing" option whenever it is plausible —
forces the user to compare the change against the status quo.
3. Build the trade-off matrix
| Criterion |
Option 1 |
Option 2 |
... |
| Implementation cost |
|
|
|
| Operational cost |
|
|
|
| Reversibility |
|
|
|
| Blast radius |
|
|
|
| Time-to-value |
|
|
|
Pick criteria that separate the options. Criteria where every
option scores the same are noise — drop them.
4. Lock the choice + consequences
Write:
- Decision: "We pick
<Option name>."
- Consequences: what becomes true, what becomes harder, what
becomes impossible. At least one of each, or admit that nothing
becomes harder (rare; verify).
- Revisit-if: the condition that would reopen this decision — new
evidence class, a changed constraint the decision assumed, or an
age threshold. A lock recorded without this line reads as permanent
law instead of a decision under current conditions; see
decision-revisit-gate for
what happens when a later change is blocked by it without one.
It is an externally observable condition, never a cadence and never
permanence under a field name: terminal, none, "never" and "forever"
are invalid, and unclassified is legal only on an existing record
during the migration — never on the one you are locking now.
- Evidence + assumptions, split explicitly. Every load-bearing factual
claim in the rationale either points at a basis ref —
file:line, a URL, a
docs/CLAIMS.md claim id, a benchmark id — or is labelled an
assumption. There is no third state. Cite nothing and the record grades
E0, which is honest and publishable; a confident grade over no citations
is not. Agreement is not evidence: the council converging, or two
models liking the same option, is provenance: agentic with
agentic_mode: council — sources and measurements raise the grade,
consensus does not. A human product call records E0 plus
authority_basis: owner_intent rather than a faked grade. Vocabulary:
adr-layout § Provenance and evidence.
5. Wire the supersession chain (if any)
If this decision overrides a prior ADR:
- Cite the prior ADR id and one-line summary.
- State what changed in the world that justifies overriding —
not "we now think differently".
- Hand off the
supersedes: linkage to adr-create.
6. Admission gate — is this an ADR at all?
Classify before handing off. A locked choice earns an ADR only when it is
architecturally significant on at least one axis:
- Hard or costly to reverse — a one-way door: public API shape, DB schema,
wire format, published identifier, migration.
- Broadly constraining — it binds work outside the module that made it.
- Crosses a governed surface — consumer contract, API, security or privacy
floor, package structure.
None of the three → no ADR. The record still exists; it lands as a
decision note in agents/decisions/, a config value, a measurement record in
docs/CLAIMS.md, an experiment, or a roadmap item. Explicitly not ADRs: a
temporary numeric threshold · a benchmark value · a model mapping · one-off
release sequencing · a reversible local implementation detail.
The reference case is in this tree. ADR-002 encodes 25 000 → 26 000 and
a 4.0k override ceiling as architecture law (ADR-002:55, :62), and
ADR-114 then had to add another override while recording that 7 of 9 kernel
rules already carry them (ADR-114:74). The principle — a kernel budget
exists, is measured, and is capped — is the ADR. The numbers belong in a
versioned budget contract with a regression gate, so a recalibration stops
needing an architecture supersession.
7. Hand off to file mechanics
Gate passed → output the structured payload (below). The user — or
adr-create — turns it into the file.
Weighted-matrix mode (quantitative)
Optional numeric variant of step 3. Gate — fire only when ALL hold:
≥ 3 options · no single dominant criterion · costly / hard-to-reverse
decision · commensurable criteria (no values conflict). A 2-option or
reversible choice gets a one-line redirect: just decide, or use the
qualitative matrix above. Full procedure, anchors, worked example:
references/weighted-matrix.md.
- User states the decision + options.
- User lists criteria and weights (1-10) BEFORE any scoring — the AI
may append missed criteria afterward, each labeled
(AI-suggested).
Never propose criteria first (anchoring).
- Criteria hygiene: cap 4-8, merge near-synonyms (double-counting check).
- Score options 1-10 against fixed anchors (each criterion declares
what 1 and what 10 mean — never relative-to-best-in-set).
- Weighted sums, then the sensitivity block — the load-bearing gate:
close-call margin (< 10 % = "no clear winner — decide on unquantified
factors"), smallest weight change that flips the winner, ±1-score flip
test. A fragile winner is reported as fragile, never as "the rational
choice".
- Delegate the argue-against pass to
adversarial-review, scoped: "attack
the winner, using the losing options' strongest criteria" (the
premortem delegation pattern — never reimplemented inline).
Output appends matrix + sensitivity block + attack summary + the intuition
caveat (resistance to the result signals a wrong weight or unquantified
information — surface it, don't ignore it). The score is a structured
argument, not a verdict. Hand-off to adr-create is unchanged.
Related Skills
WHEN to use this
- The team is about to lock a non-trivial choice and the trade-offs
need to survive the conversation that produced them.
- A prior ADR is being overridden and the supersession chain needs
explicit "what changed in the world" rationale.
- A planning thread has surfaced ≥ 2 viable options and silence is
about to pick one by attrition.
WHEN NOT to use this
- The choice splits stakeholders along role lines (PO vs ops, eng vs
support) — start with
stakeholder-tradeoff;
this skill locks the choice after the human cost is mapped.
- The output is the ADR file itself (numbering, index regen) — route
to
adr-create; this skill produces the
payload, not the file.
- The risk shape is the dominant question — route to
risk-officer first, then return.
- MANY items to rank on the fixed R×I×C/E formula (backlog, feature
list) — route to
rice-prioritization;
the weighted-matrix mode here is for ONE choice on custom criteria.
- The decision is reversible and cheap — write a one-line note and
move on; ADRs are for irreversible or expensive constraints.
When the agent should load this
- "Lass uns das festzurren."
- "Welche Option ziehen wir und warum?"
- "Wir müssen ein ADR draus machen."
- "Trade-off-Matrix für X vs Y."
- "Diese Entscheidung überschreibt das alte ADR-NN."
- "Weighted decision matrix für die Optionen" / "score my options against
my criteria" — fires the weighted-matrix mode (gate permitting).
Output
Decision: <one sentence>
Options:
1. <name> — <sketch>
Pros: ...
Cons: ...
Reversibility: easy | costly | one-way
2. ...
N. Do nothing — <sketch>
Trade-off matrix:
| Criterion | <opt 1> | <opt 2> | ... |
| ...
Locked: <chosen option name>
Consequences:
+ <becomes true>
- <becomes harder>
✗ <becomes impossible>
Assumptions:
~ <load-bearing claim with no basis ref>
Evidence:
<basis ref> — file:line | URL | CLAIMS id | benchmark id (or: none — E0)
Provenance: human | agentic | mixed | unknown (agentic_mode: single | council | delegated)
Grade: E0 | E1 | E2 | E3 | E4 (authority_basis: evidence | owner_intent)
Supersedes: <ADR-XYZ "title"> (if any)
Trigger: <what changed> (if superseding)
Revisit-if: <observable condition>
Admission gate: ADR | decision note | config value | measurement | experiment | roadmap item
Next: /adr-create with the payload above (only when the gate says ADR)
Gotcha
- "We compared the options" is not a comparison. The matrix must
separate them on at least two criteria.
- Pros without cons is advocacy, not analysis. If you cannot find
cons for the chosen option, you have not understood it yet.
- A supersession with no "what changed in the world" is a vibe
pivot. Reject and ask.
- An unlabelled guess is worse than a labelled one. A claim with no basis ref
and no assumption label reads as established fact to the next reader.
- "The council agreed" is a provenance fact, not an evidence grade. If the
only support is agreement, the grade is
E0 — write it.
- Writing an ADR for a threshold is how a recalibration becomes an
architecture supersession. Run the admission gate first.
Do NOT
- Do NOT pick the option before listing them — the matrix is the
point, not the conclusion.
- Do NOT write the ADR file from this skill —
adr-create owns
filenames, numbering, and index regeneration.
- Do NOT pad option counts to look thorough; two real options beat
four straw men.
- Do NOT silently update an old ADR; supersession is explicit.
Runnable example
Replacing the in-house cron runner with a managed scheduler:
- Decision: "We need to decide between keeping the in-house cron
runner and migrating to the managed scheduler because the on-call
rotation has paged on missed-run incidents three times in 60 days."
- Options: (1) keep in-house + add monitoring; (2) migrate to
managed scheduler; (3) do nothing.
- Matrix rows that separate options: implementation cost,
operational load, blast radius on outage, reversibility.
- Locked: "We pick the managed scheduler."
- Consequences:
+ on-call gets paged on scheduler infra, not
application code. – job definitions move to a vendor format,
raising migration cost if we leave. ✗ we cannot run jobs in the
app process anymore — assumes vendor uptime.
- Supersedes: ADR-014 "in-house cron runner"; trigger = three
missed-run pages in 60 days now exceed the SLO budget.
- Next:
/adr-create with the payload, append supersedes: ADR-014.
1---2name: decision-record3description: Use when choosing between alternatives with trade-offs — X-or-Y decisions or a weighted decision matrix / gewichtete Entscheidungsmatrix ('score my options'); ADR via `adr-create`.4---56# decision-record78> Shape the **thinking** behind an architectural decision: list the9> options, expose trade-offs, lock the chosen variant, and wire the10> supersession chain. Hands off to [`adr-create`](../adr-create/SKILL.md)11> for file mechanics (numbering, index, frontmatter). This skill does12> not write the ADR file itself.1314## When to use1516- A team is about to commit to a non-trivial architectural choice and17 wants the trade-offs on paper first.18- Two engineers disagree on an approach — surface the options and19 consequences before one wins by attrition.20- A previous decision needs revisiting; the result must `supersede:`21 the older ADR with explicit rationale.22- German triggers: "lass uns das festzurren", "Trade-off-Matrix",23 "welche Option ziehen wir?".2425Do NOT use when:2627- The file mechanics are the entire ask (numbering, regenerating the28 index) — route directly to [`adr-create`](../adr-create/SKILL.md).29- The decision is reversible and small (e.g. variable rename) — ADRs30 are for choices that constrain future work.31- The user wants a feature plan, not a decision — route to the32 planning command instead.3334## Cognition cluster3536- **Mental model 4 — Second-order thinking.** Every decision unlocks37 some futures and locks out others; the consequences block names38 what becomes harder, not just what becomes easier. See39 [`docs/contracts/mental-models.md`](../../../docs/contracts/mental-models.md) § 4.40- **Mental model 6 — Theory of constraints.** A decision that does41 not move the binding constraint is theatre; if the trade-off matrix42 scores every option the same on the constraint that matters, the43 options are fungible — surface and stop. See `mental-models.md` § 6.44- **Mental model 10 — Reversible vs irreversible.** Two-way doors45 get a one-page record; one-way doors get the full options +46 consequences + supersession chain. The reversibility row of the47 matrix decides which template fires. See `mental-models.md` § 10.48 **Corollary — a shortcut through a one-way door is a decision, not a49 defer.** The cheap-and-simple option is *preferred* where the choice can50 be walked back later. Where it cannot — a public API shape, a DB schema,51 a migration, a wire format, a published identifier — "we can simplify52 this later" is false, so it never ships as a deferred note; it lands53 here as a recorded decision with its consequences named. The one-way54 categories are enumerated so the call is not left to a judgement about55 what feels important.56- **Team context-spine slot.** Read the **team** slot of the57 [context-spine](../../../docs/contracts/context-spine.md) to58 capture who is bound by the decision (review groups, on-call59 rotation). Skip if the consumer project has not filled it; note in60 the record.6162## Procedure6364### 1. State the decision in one sentence6566*"We need to decide `X` because `Y`."* If you cannot, the decision67is not ripe — surface that and stop.6869### 2. Identify and enumerate options (≥ 2, usually ≤ 4)7071Each option gets:7273- **Name** — short, descriptive, never "option A / B / C".74- **Sketch** — what it actually does in one paragraph.75- **Cost / benefit** — three to five bullets per side, concrete.76- **Reversibility** — easy / costly / one-way (Bezos two-way / one-way77 door framing).7879Add an **explicit "do nothing"** option whenever it is plausible —80forces the user to compare the change against the status quo.8182### 3. Build the trade-off matrix8384| Criterion | Option 1 | Option 2 | ... |85|---|---|---|---|86| Implementation cost | | | |87| Operational cost | | | |88| Reversibility | | | |89| Blast radius | | | |90| Time-to-value | | | |9192Pick criteria that *separate* the options. Criteria where every93option scores the same are noise — drop them.9495### 4. Lock the choice + consequences9697Write:9899- **Decision:** *"We pick `<Option name>`."*100- **Consequences:** what becomes true, what becomes harder, what101 becomes impossible. At least one of each, or admit that nothing102 becomes harder (rare; verify).103- **Revisit-if:** the condition that would reopen this decision — new104 evidence class, a changed constraint the decision assumed, or an105 age threshold. A lock recorded without this line reads as permanent106 law instead of a decision under current conditions; see107 [`decision-revisit-gate`](../../rules/decision-revisit-gate.md) for108 what happens when a later change is blocked by it without one.109 It is an externally observable **condition**, never a cadence and never110 permanence under a field name: `terminal`, `none`, "never" and "forever"111 are invalid, and `unclassified` is legal only on an *existing* record112 during the migration — never on the one you are locking now.113- **Evidence + assumptions, split explicitly.** Every load-bearing factual114 claim in the rationale either points at a basis ref — `file:line`, a URL, a115 `docs/CLAIMS.md` claim id, a benchmark id — or is **labelled an116 assumption**. There is no third state. Cite nothing and the record grades117 `E0`, which is honest and publishable; a confident grade over no citations118 is not. **Agreement is not evidence:** the council converging, or two119 models liking the same option, is `provenance: agentic` with120 `agentic_mode: council` — sources and measurements raise the grade,121 consensus does not. A human product call records `E0` plus122 `authority_basis: owner_intent` rather than a faked grade. Vocabulary:123 [`adr-layout § Provenance and evidence`](../../../docs/contracts/adr-layout.md).124125### 5. Wire the supersession chain (if any)126127If this decision overrides a prior ADR:128129- Cite the prior ADR id and one-line summary.130- State **what changed in the world** that justifies overriding —131 not "we now think differently".132- Hand off the `supersedes:` linkage to `adr-create`.133134### 6. Admission gate — is this an ADR at all?135136Classify **before** handing off. A locked choice earns an ADR only when it is137architecturally significant on at least one axis:138139- **Hard or costly to reverse** — a one-way door: public API shape, DB schema,140 wire format, published identifier, migration.141- **Broadly constraining** — it binds work outside the module that made it.142- **Crosses a governed surface** — consumer contract, API, security or privacy143 floor, package structure.144145None of the three → **no ADR**. The record still exists; it lands as a146decision note in `agents/decisions/`, a config value, a measurement record in147`docs/CLAIMS.md`, an experiment, or a roadmap item. Explicitly not ADRs: a148temporary numeric threshold · a benchmark value · a model mapping · one-off149release sequencing · a reversible local implementation detail.150151**The reference case is in this tree.** ADR-002 encodes `25 000 → 26 000` and152a `4.0k` override ceiling as architecture law (`ADR-002:55`, `:62`), and153ADR-114 then had to add another override while recording that 7 of 9 kernel154rules already carry them (`ADR-114:74`). The *principle* — a kernel budget155exists, is measured, and is capped — is the ADR. The numbers belong in a156versioned budget contract with a regression gate, so a recalibration stops157needing an architecture supersession.158159### 7. Hand off to file mechanics160161Gate passed → output the structured payload (below). The user — or162`adr-create` — turns it into the file.163164## Weighted-matrix mode (quantitative)165166Optional numeric variant of step 3. **Gate — fire only when ALL hold:**167≥ 3 options · no single dominant criterion · costly / hard-to-reverse168decision · commensurable criteria (no values conflict). A 2-option or169reversible choice gets a one-line redirect: just decide, or use the170qualitative matrix above. Full procedure, anchors, worked example:171[`references/weighted-matrix.md`](references/weighted-matrix.md).1721731. User states the decision + options.1742. **User lists criteria and weights (1-10) BEFORE any scoring** — the AI175 may append missed criteria afterward, each labeled `(AI-suggested)`.176 Never propose criteria first (anchoring).1773. Criteria hygiene: cap 4-8, merge near-synonyms (double-counting check).1784. Score options 1-10 against **fixed anchors** (each criterion declares179 what 1 and what 10 mean — never relative-to-best-in-set).1805. Weighted sums, then the **sensitivity block — the load-bearing gate**:181 close-call margin (< 10 % = "no clear winner — decide on unquantified182 factors"), smallest weight change that flips the winner, ±1-score flip183 test. A fragile winner is reported as fragile, never as "the rational184 choice".1856. Delegate the argue-against pass to186 [`adversarial-review`](../adversarial-review/SKILL.md), scoped: "attack187 the winner, using the losing options' strongest criteria" (the188 `premortem` delegation pattern — never reimplemented inline).189190Output appends matrix + sensitivity block + attack summary + the intuition191caveat (resistance to the result signals a wrong weight or unquantified192information — surface it, don't ignore it). **The score is a structured193argument, not a verdict.** Hand-off to `adr-create` is unchanged.194195## Related Skills196197**WHEN to use this**198199- The team is about to lock a non-trivial choice and the trade-offs200 need to survive the conversation that produced them.201- A prior ADR is being overridden and the supersession chain needs202 explicit "what changed in the world" rationale.203- A planning thread has surfaced ≥ 2 viable options and silence is204 about to pick one by attrition.205206**WHEN NOT to use this**207208- The choice splits stakeholders along role lines (PO vs ops, eng vs209 support) — start with [`stakeholder-tradeoff`](../stakeholder-tradeoff/SKILL.md);210 this skill locks the choice **after** the human cost is mapped.211- The output is the ADR file itself (numbering, index regen) — route212 to [`adr-create`](../adr-create/SKILL.md); this skill produces the213 payload, not the file.214- The risk shape is the dominant question — route to215 [`risk-officer`](../risk-officer/SKILL.md) first, then return.216- MANY items to rank on the fixed R×I×C/E formula (backlog, feature217 list) — route to [`rice-prioritization`](../rice-prioritization/SKILL.md);218 the weighted-matrix mode here is for ONE choice on custom criteria.219- The decision is reversible and cheap — write a one-line note and220 move on; ADRs are for irreversible or expensive constraints.221222## When the agent should load this223224- "Lass uns das festzurren."225- "Welche Option ziehen wir und warum?"226- "Wir müssen ein ADR draus machen."227- "Trade-off-Matrix für X vs Y."228- "Diese Entscheidung überschreibt das alte ADR-NN."229- "Weighted decision matrix für die Optionen" / "score my options against230 my criteria" — fires the weighted-matrix mode (gate permitting).231232## Output233234```235Decision: <one sentence>236237Options:238 1. <name> — <sketch>239 Pros: ...240 Cons: ...241 Reversibility: easy | costly | one-way242 2. ...243 N. Do nothing — <sketch>244245Trade-off matrix:246 | Criterion | <opt 1> | <opt 2> | ... |247 | ...248249Locked: <chosen option name>250251Consequences:252 + <becomes true>253 - <becomes harder>254 ✗ <becomes impossible>255256Assumptions:257 ~ <load-bearing claim with no basis ref>258259Evidence:260 <basis ref> — file:line | URL | CLAIMS id | benchmark id (or: none — E0)261262Provenance: human | agentic | mixed | unknown (agentic_mode: single | council | delegated)263Grade: E0 | E1 | E2 | E3 | E4 (authority_basis: evidence | owner_intent)264265Supersedes: <ADR-XYZ "title"> (if any)266Trigger: <what changed> (if superseding)267Revisit-if: <observable condition>268269Admission gate: ADR | decision note | config value | measurement | experiment | roadmap item270271Next: /adr-create with the payload above (only when the gate says ADR)272```273274## Gotcha275276- "We compared the options" is not a comparison. The matrix must277 separate them on at least two criteria.278- Pros without cons is advocacy, not analysis. If you cannot find279 cons for the chosen option, you have not understood it yet.280- A supersession with no "what changed in the world" is a vibe281 pivot. Reject and ask.282- An unlabelled guess is worse than a labelled one. A claim with no basis ref283 and no assumption label reads as established fact to the next reader.284- "The council agreed" is a provenance fact, not an evidence grade. If the285 only support is agreement, the grade is `E0` — write it.286- Writing an ADR for a threshold is how a recalibration becomes an287 architecture supersession. Run the admission gate first.288289## Do NOT290291- Do NOT pick the option before listing them — the matrix is the292 point, not the conclusion.293- Do NOT write the ADR file from this skill — `adr-create` owns294 filenames, numbering, and index regeneration.295- Do NOT pad option counts to look thorough; two real options beat296 four straw men.297- Do NOT silently update an old ADR; supersession is explicit.298299## Runnable example300301Replacing the in-house cron runner with a managed scheduler:302303- Decision: *"We need to decide between keeping the in-house cron304 runner and migrating to the managed scheduler because the on-call305 rotation has paged on missed-run incidents three times in 60 days."*306- Options: (1) keep in-house + add monitoring; (2) migrate to307 managed scheduler; (3) do nothing.308- Matrix rows that **separate** options: implementation cost,309 operational load, blast radius on outage, reversibility.310- Locked: *"We pick the managed scheduler."*311- Consequences: `+` on-call gets paged on scheduler infra, not312 application code. `–` job definitions move to a vendor format,313 raising migration cost if we leave. `✗` we cannot run jobs in the314 app process anymore — assumes vendor uptime.315- Supersedes: ADR-014 *"in-house cron runner"*; trigger = three316 missed-run pages in 60 days now exceed the SLO budget.317- Next: `/adr-create` with the payload, append `supersedes: ADR-014`.