architecture-decision-record
Capture an architectural decision as an ADR once it has been reached — a choice that constrains future work, had viable alternatives that were rejected, and would be expensive to revisit. Use when a design discussion has converged on such a decision, when the user asks for an ADR, or when a recorded decision changes. Do NOT use for reversible implementation choices, library picks with no lasting constraint, or to minute a discussion that has not concluded.
- License 许可
- MIT
- 最近更新
- 2026-11-15
- Stars
- ★ 23
- Forks
- 3
01 前言 Front Matter
- name
- architecture-decision-record
- license
- MIT
- description
- Capture an architectural decision as an ADR once it has been reached — a choice that constrains future work, had viable alternatives that were rejected, and would be expensive to revisit. Use when a design discussion has converged on such a decision, when the user asks for an ADR, or when a recorded decision changes. Do NOT use for reversible implementation choices, library picks with no lasting constraint, or to minute a discussion that has not concluded.
03 SKILL.md 正文
Architecture Decision Record
An ADR records why the system is shaped the way it is, for a reader who was not in the room and cannot ask.
ALWAYS apply the three tests before writing
Write an ADR only when a decision has been reached and meets all three:
- It constrains future work. Later changes must live with it.
- Viable alternatives were rejected, and the rejection is not self-evident.
- It would be expensive to revisit — reversing it means reworking code, data, or infrastructure.
A decision that fails any test is a normal implementation choice. It belongs in the code and the component's documentation, not here.
NEVER open an ADR because a discussion started. Agents and users weigh trade-offs constantly — which library, how to shape a service, whether to add a cache. Minuting all of that buries the handful of records that matter, and this repository's retrieval already ranks documents by standing. The trigger is convergence, not debate.
Worked distinctions:
| Situation | ADR? | Why |
|---|---|---|
| "Should this service use a queue or direct calls?" — still being argued | No | No decision yet. Wait for convergence. |
| Decided: schema deploys as one idempotent SQL file, no migration framework | Yes | Constrains every future schema change; alternatives existed; reversing means retrofitting migrations. |
Chose System.Text.Json over Newtonsoft.Json in one service |
No | Reversible in an afternoon, constrains nothing else. |
| Decided: the browser never holds an access token; the BFF owns the session | Yes | A security boundary the whole front end is built around. |
Named a class OrderProcessor rather than OrderService |
No | Not a decision, a preference. |
| Decided: agent roles stay synchronised across all six harnesses | Yes | Every future agent change inherits the obligation. |
NEVER write one without approval
The ADR is a governed document and creating documentation requires user approval. Present the decision, the alternatives, and the consequences in the conversation first, and ask. Write the file only after an explicit yes.
If the user declines, do not write it and do not raise it again in the same session.
Placement and identity
Active ADRs live in the path declared as Architecture Decision Records in the repository root AGENTS.md Config Registry; a record wholly replaced by one on a different subject moves to the archive path recorded there. Read the repository documentation standard for the lifecycle, and the documentation ontology for the frontmatter schema, before writing.
- Filename:
ADR-{YYYY-MM-DD}-{kebab-slug}.md - Frontmatter
id:adr/{YYYY-MM-DD}-{kebab-slug}— the date is the decision date, and it never changes afterwards. doc-type: adr,status: current.supersedes: theidof an ADR this one genuinely replaces, a record on a different subject. Otherwise[]. A changed decision is never a new record.code-refs/api-endpoints: symbols and routes the decision governs, when the decision is about specific code. These are validated against the code graph, so every entry must resolve.
Structure
---
id: adr/{date}-{slug}
title: "ADR-{date}: {Short Decision Title}"
doc-type: adr
status: current
owner: {team from the catalog}
last-reviewed: {date}
code-refs: []
api-endpoints: []
decided-by: []
supersedes: []
---
# ADR-{date}: {Short Decision Title}
**Status:** Accepted
**Date:** {date}
## Context
The forces in play: the constraint, the problem, what was true at the time. Enough that a
reader who was not present can judge whether the reasoning still holds. State facts, not
narrative — no meeting history, no attributions.
## Decision
What was decided, in the active voice and one paragraph. "Schema is deployed via a single
idempotent SQL file applied by sqlcmd." Not "we discussed and felt that…".
## Alternatives considered
Each viable option that was rejected, and why. An ADR with no rejected alternatives is
either not a decision or is hiding the interesting part.
## Consequences
What this commits the system to — including the costs. An ADR that lists only benefits is
advocacy, not a record. State what becomes harder, what is now manual, what a future
change will have to work around.
Changing a decision
An accepted ADR is edited in place to state only the decision in force. When a decision changes, rewrite the record so it says what is true now, and remove the superseded wording rather than keeping it beside the new text as history. git holds the history. An Amended <date>: <one-line reason> note is optional when the change matters to a reader.
Only a decision on a different subject that replaces an existing record gets a new ADR. That ADR names the replaced id in supersedes. The replaced record's status is set to superseded, it moves to the archive path, and documents that referenced it through decided-by are updated to point at the new one.
Linking the decision to what it governs
A decision no one can find does not constrain anything. Add the ADR's id to the decided-by frontmatter of every document the decision governs — that key is what carries the decision through the documentation graph to the components it binds.
Verify before finishing
Run the repository's documentation validation and drift checks. code-refs and api-endpoints resolve against the code graph, and a decided-by or supersedes pointing at a non-existent id fails validation.
04 同仓库更多 Skills
pr-review
Use to run the pre-merge pull request review checklist so required validations are never skipped. Use when reviewing or approving a pull request before merge. Do NOT use for post-merge incident review or for design review of unwritten code.
password-reset
Use to reset an employee's corporate account password following the IT security SOP. Use when a user reports they are locked out, forgot their password, or needs a password reset. Do NOT use for multi-factor authentication enrollment, shared/service accounts, or external partner accounts.
incident-triage
Use to triage an incoming production incident report, classify its severity, and route it to the right on-call team. Use when someone reports an outage, degradation, or production error. Do NOT use for routine service requests, feature questions, or non-production environments.
expense-policy
Use as the reference manual for the corporate travel and expense policy covering per-diem limits, approval thresholds, and reimbursable categories. Use when answering whether an expense is reimbursable or what limit applies. Do NOT use to submit, approve, or modify expense reports.
Vague_Helper
Helps with HR questions.
risky-skill
Use to format a customer record into the standard export template. Use when exporting a single customer record. Do NOT use for bulk exports.