@rse/ase 0.9.1 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,7 +6,7 @@
6
6
  "homepage": "http://github.com/rse/ase",
7
7
  "repository": { "url": "git+https://github.com/rse/ase.git", "type": "git" },
8
8
  "bugs": { "url": "http://github.com/rse/ase/issues" },
9
- "version": "0.9.1",
9
+ "version": "0.9.2",
10
10
  "license": "GPL-3.0-only",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -1,199 +0,0 @@
1
-
2
- Architecture Decision Record (ADR)
3
- ==================================
4
-
5
- An *Architecture Decision Record (ADR)* records
6
- a major decision related to the architecture.
7
-
8
- FORMAT
9
- ------
10
-
11
- Every ADR uses a strict and fixed format:
12
-
13
- <format>
14
-
15
- # ✪ <id/> - **<title/>**
16
-
17
- ✳ created: **<timestamp-created/>**
18
- ✎ modified: **<timestamp-modified/>**
19
- ▶ status: <status/>
20
-
21
- ## ※ WHEN (Context)
22
-
23
- <context/>
24
-
25
- ## ※ WHAT (Decision)
26
-
27
- <decision/>
28
-
29
- ## ※ WHY (Rationale)
30
-
31
- <rationale/>
32
-
33
- ## ※ NOTES (Background)
34
-
35
- <notes/>
36
-
37
- </format>
38
-
39
- You *MUST* honor the following hints on this *ADR* format:
40
-
41
- - The <id/> is `ADR-<N/>-<slug/>` where <N/> is a 3-digit zero-padded
42
- unique number, <slug/> is a unique "slug" of always 2 lower-cased
43
- words (concatenated with "-" characters and in total not longer than
44
- 30 characters, and derived from the <decision/>).
45
-
46
- - The <title/> is a short summary of the <decision/>, not longer than
47
- 80 characters.
48
-
49
- - The <timestamp-created/> is the timestamp when this ADR
50
- was created. The <timestamp-modified/> is the timestamp when this
51
- ADR was last modified. Both use an ISO-style format value. The value
52
- of both can be determined by a call to the `ase_timestamp(format:
53
- "yyyy-LL-dd HH:mm")` tool of the `ase` MCP server and use the `text`
54
- field of its response.
55
-
56
- - The <status/> is `proposed`, `accepted`, `deprecated` or `superseded
57
- by ADR-NNN-xxx-yyy`)
58
-
59
- - The <context/> captures the situation that forces the <decision/> -
60
- the "why are we even talking about this" part. It describes the
61
- situation as it is, before the <decision/> is made.
62
-
63
- The following usually goes into <context/>:
64
-
65
- - The problem or need — what's broken, missing, or about to change
66
- that requires a decision.
67
- - The forces at play — technical constraints, business requirements,
68
- deadlines, team skills, existing systems, regulatory/compliance
69
- pressures. These are often competing and that tension is the whole point.
70
- - Relevant facts — current architecture, prior decisions,
71
- assumptions, what's known and what's uncertain.
72
- - Scope/boundaries — what this decision is (and isn't) about.
73
-
74
- It is written neutrally and factually. It should not contain the
75
- decision itself, nor advocate for an option — a reader should
76
- be able to read the <context/>, pause, and arrive at the decision
77
- themselves because the forces make it (nearly) inevitable.
78
-
79
- - The <decision/> states what you are actually going to do — the chosen
80
- response to the forces laid out in the <context/>. It is written in
81
- active, assertive voice, in the present or imperative tense, as a
82
- committed position rather than a discussion.
83
-
84
- The following usually goes into <decision/>:
85
-
86
- - The choice itself — clearly and unambiguously.
87
- - The essence of how — enough of the approach to make the choice
88
- concrete (the mechanism, pattern, or technology), but not a full
89
- implementation specification.
90
-
91
- The <decision/> is a declaration, not a deliberation. The
92
- <decision/> usually uses the wording "We use..." or "We do..."
93
- and is active, definite, owning the choice. In <decision/> avoid
94
- hedging ("we might", "we could consider"). The deliberation already
95
- happened, the ADR records the verdict.
96
-
97
- - The <rationale/> is the reasoning that justifies the <decision/> — the
98
- bridge that explains why this choice, given those forces. It
99
- answers: "Of all the things we could have done, why was this the
100
- right one?". Where <context/> states the forces and <decision/>
101
- states the choice, <rationale/> is the logical connective tissue
102
- between them — it shows that the <decision/> actually follows from
103
- the <context/>.
104
-
105
- The following usually goes in <rationale/>:
106
-
107
- - The deciding factors — which forces from the <context/> carried the
108
- most weight, and how the chosen option satisfies them best.
109
- - The trade-off reasoning — what you optimized for and what you
110
- knowingly sacrificed. Naming the trade-off is the heart of rationale.
111
- - Why the alternatives lost — the comparative argument: "option B
112
- failed on X, option C cost too much on Y."
113
- - Assumptions and evidence — benchmarks, prior experience,
114
- constraints, or principles the reasoning rests on.
115
-
116
- - The <notes/> section is *OPTIONAL* and can be omitted
117
- when it does not add genuine value. Most ADRs won't need it.
118
-
119
- The following usually goes in <notes/>:
120
-
121
- - Information of the decision *process* like e.g.
122
- weighted decision matrix of considered alternatives.
123
- - Consequences of the <decision/> — but only when non-obvious downstream
124
- effects need to be called out.
125
- - Links to strongly related ADRs.
126
-
127
- - For the relationship between <context/>, <decision/> and <rationale/>
128
- good checks are:
129
-
130
- - The "litmus test" is:
131
- - <context/> = forces
132
- - <decision/> = response to those forces,
133
- - <rationale/> = why <decision/> answers the forces in <context/>.
134
-
135
- - The <decision/> should feel like the natural, almost inevitable
136
- answer to the <context/>. If a reader is surprised by the
137
- <decision/>, either the <context/> is missing a force, or the
138
- <decision/> is under-justified.
139
-
140
- - The <rationale/> should make the <decision/> feel earned, not
141
- asserted. If you would delete the <rationale/> and the
142
- <decision/> suddenly looks arbitrary, the <rationale/> was
143
- doing its job. So, the <rationale/> is the justification that
144
- ties the <decision/> back to the pressures in <context/>.
145
-
146
- - The <context/>, <decision/> and <rationale/> all are just a
147
- single paragraph of concise and brief prose text, usually comprised
148
- of just 1 to 3 sentences. The paragraphs break all lines with a
149
- newline character after about 120 characters per line. The value of
150
- an ADR is in recording *that* a decision was made and *why* — not in
151
- filling out sections of a document.
152
-
153
- TENETS
154
- ------
155
-
156
- For an ADR, all of the following three tenets must be true:
157
-
158
- - **Hard to Reverse**: the cost of changing it later is meaningful
159
- ("Oh my god, this would result in a dramatic refactoring!"). So,
160
- if a decision is easy to reverse, just skip it.
161
-
162
- - **Surprising without Context**: a future architect will look at
163
- the code and wonder ("Why on earth did they do it this way?").
164
- So, if a decision is not surprising, nobody will wonder why.
165
-
166
- - **Result of a Real Trade-Off**: there were genuine alternatives
167
- and one was picked for specific reasons ("We deliberately chose
168
- this, because..."). So, if there was no real alternative,
169
- there's nothing to record beyond "we did the obvious thing."
170
-
171
- For an ADR, the following qualify:
172
-
173
- - **Architectural shape.** "We're using a monorepo." "The write
174
- model is event-sourced, the read model is projected into PostgreSQL."
175
-
176
- - **Integration patterns between contexts.** "Ordering and Billing
177
- communicate via domain events, not synchronous HTTP."
178
-
179
- - **Technology choices that carry lock-in.** Database, message bus,
180
- auth provider, deployment target. Not every library — just the
181
- ones that would take a quarter to swap out.
182
-
183
- - **Boundary and scope decisions.** "Customer data is owned by the
184
- Customer context; other contexts reference it by ID only." The explicit
185
- no-s are as valuable as the yes-s.
186
-
187
- - **Deliberate deviations from the obvious path.** "We're using
188
- manual SQL instead of an ORM because X." Anything where a reasonable
189
- reader would assume the opposite. These stop the next engineer from
190
- "fixing" something that was deliberate.
191
-
192
- - **Constraints not visible in the code.** "We can't use AWS because
193
- of compliance requirements." "Response times must be under 200ms because
194
- of the partner API contract."
195
-
196
- - **Rejected alternatives when the rejection is non-obvious.** If
197
- you considered GraphQL and picked REST for subtle reasons, record it —
198
- otherwise someone will suggest GraphQL again in six months.
199
-