@rse/ase 0.9.0 → 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.
- package/dst/ase-bash.js +618 -0
- package/dst/ase-hook.js +27 -0
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.github/plugin/plugin.json +1 -1
- package/plugin/meta/ase-format-arch.md +882 -0
- package/plugin/meta/ase-format-meta.md +51 -0
- package/plugin/meta/ase-format-spec.md +1278 -0
- package/plugin/meta/ase-skill.md +8 -0
- package/plugin/package.json +1 -1
- package/plugin/skills/ase-code-craft/SKILL.md +4 -3
- package/plugin/skills/ase-code-refactor/SKILL.md +4 -3
- package/plugin/skills/ase-code-resolve/SKILL.md +4 -3
- package/plugin/skills/ase-meta-brainstorm/SKILL.md +2 -2
- package/plugin/skills/ase-task-condense/SKILL.md +267 -0
- package/plugin/skills/ase-task-condense/help.md +77 -0
- package/plugin/skills/ase-task-edit/SKILL.md +26 -26
- package/plugin/skills/ase-task-edit/help.md +10 -10
- package/plugin/skills/ase-task-grill/SKILL.md +8 -8
- package/plugin/.claude/settings.local.json +0 -7
- package/plugin/meta/ase-format-adr.md +0 -199
|
@@ -0,0 +1,882 @@
|
|
|
1
|
+
|
|
2
|
+
@./ase-format-meta.md
|
|
3
|
+
|
|
4
|
+
Architecture (ARCH)
|
|
5
|
+
===================
|
|
6
|
+
|
|
7
|
+
The **Artifact Set** **Architecture (ARCH)** specifies the "input"
|
|
8
|
+
and the "how" of the Software Engineering project.
|
|
9
|
+
|
|
10
|
+
Each **Artifact** of the **Artifact Set**
|
|
11
|
+
**Architecture (ARCH)** is stored under
|
|
12
|
+
`docs/arch/ARCH-<artifact-no/>-<artifact-id/>-<artifact-slug/>.md`,
|
|
13
|
+
relative to the project root directory, with <artifact-no/> being the
|
|
14
|
+
zero-padded, two-digit sequence number of the **Artifact** (starting at
|
|
15
|
+
`01`) according to the order of the **Artifact** list below, and with
|
|
16
|
+
<artifact-slug/> being derived from <artifact-name/> (see below) by
|
|
17
|
+
Pascal-casing each word (upper-casing its first letter) and using `-`
|
|
18
|
+
characters instead of spaces (e.g. `Context-View`).
|
|
19
|
+
|
|
20
|
+
Each **Artifact** file *MUST* begin with a single blank line before its
|
|
21
|
+
`#` heading and end with a single blank line after its last content line
|
|
22
|
+
(followed by the trailing newline), mirroring the blank lines shown
|
|
23
|
+
inside the `<format>` blocks below.
|
|
24
|
+
|
|
25
|
+
Each **Artifact** contains two timestamps: the <timestamp-created/>
|
|
26
|
+
is the timestamp when this **Artifact** was created. The
|
|
27
|
+
<timestamp-modified/> is the timestamp when this **Artifact** was last
|
|
28
|
+
modified. Both use an ISO-style format value. The value of both can be
|
|
29
|
+
determined by a call to the `ase_timestamp(format: "yyyy-LL-dd HH:mm")`
|
|
30
|
+
tool of the `ase` MCP server and use the `text` field of its response.
|
|
31
|
+
Whenever an **Artifact** is updated, the <timestamp-modified/> *MUST* be
|
|
32
|
+
updated, too.
|
|
33
|
+
|
|
34
|
+
The **Artifact Set** **Architecture (ARCH)** consists of the following
|
|
35
|
+
distinct **Artifact**s (listed under their <artifact-name/> and their
|
|
36
|
+
<artifact-id/>):
|
|
37
|
+
|
|
38
|
+
01. **Context View (CV)**:
|
|
39
|
+
The relationships, dependencies, and interactions between the solution
|
|
40
|
+
and its environment, defining the system's scope, external entities,
|
|
41
|
+
and boundaries.
|
|
42
|
+
|
|
43
|
+
02. **Functionality View (FV)**:
|
|
44
|
+
The functional components of the solution, their responsibilities,
|
|
45
|
+
interfaces, and primary interactions, describing *what* the system does
|
|
46
|
+
at runtime.
|
|
47
|
+
|
|
48
|
+
03. **Information View (IV)**:
|
|
49
|
+
The way the solution stores, manages, manipulates, and distributes
|
|
50
|
+
information, defining the static data structure and dynamic information
|
|
51
|
+
flow.
|
|
52
|
+
|
|
53
|
+
04. **Concurrency View (CO)**:
|
|
54
|
+
The concurrency structure of the solution, mapping functional components
|
|
55
|
+
to processes and threads, and defining how they coordinate and
|
|
56
|
+
communicate.
|
|
57
|
+
|
|
58
|
+
05. **Development View (DV)**:
|
|
59
|
+
The architecture supporting the software development process, defining
|
|
60
|
+
the module organization, build approach, and codeline conventions.
|
|
61
|
+
|
|
62
|
+
06. **Deployment View (DP)**:
|
|
63
|
+
The environment into which the solution is deployed, mapping software
|
|
64
|
+
elements to the runtime platform, hardware, and network topology.
|
|
65
|
+
|
|
66
|
+
07. **Operations View (OV)**:
|
|
67
|
+
The way the solution is operated, administered, and supported in
|
|
68
|
+
production, defining installation, monitoring, and management concerns.
|
|
69
|
+
|
|
70
|
+
08. **Quality Perspectives (QP)**:
|
|
71
|
+
How the Non-Functional Requirements (NR) are addressed.
|
|
72
|
+
|
|
73
|
+
09. **Decision Record (DR)**:
|
|
74
|
+
The major decisions related to the architecture, each recording the
|
|
75
|
+
forces at play, the chosen response, and the reasoning that justifies it.
|
|
76
|
+
|
|
77
|
+
The **Artifact**s have the following cross-references:
|
|
78
|
+
|
|
79
|
+
```text
|
|
80
|
+
ARCH-02-FV Functionality View ──(depends on)─► ARCH-02-FV Functionality View
|
|
81
|
+
ARCH-03-IV Information View ──(entity)─► SPEC-05-DM Data Model
|
|
82
|
+
ARCH-03-IV Information View ──(owner)─► ARCH-02-FV Functionality View
|
|
83
|
+
ARCH-04-CO Concurrency View ──(hosts)─► ARCH-02-FV Functionality View
|
|
84
|
+
ARCH-06-DP Deployment View ──(hosts)─► ARCH-02-FV Functionality View
|
|
85
|
+
ARCH-07-OV Operations View ──(element)─► ARCH-02-FV Functionality View
|
|
86
|
+
ARCH-07-OV Operations View ──(element)─► ARCH-06-DP Deployment View
|
|
87
|
+
ARCH-08-QP Quality Perspectives ──(addresses)─► SPEC-04-NR Non-Functional Requirements
|
|
88
|
+
ARCH-08-QP Quality Perspectives ──(affects)─► ARCH-02-FV Functionality View
|
|
89
|
+
ARCH-08-QP Quality Perspectives ──(affects)─► ARCH-06-DP Deployment View
|
|
90
|
+
ARCH-09-DR Decision Record ──(affects)─► ARCH-02-FV Functionality View
|
|
91
|
+
ARCH-09-DR Decision Record ──(affects)─► ARCH-06-DP Deployment View
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Context View (CV)
|
|
95
|
+
-----------------
|
|
96
|
+
|
|
97
|
+
The relationships, dependencies, and interactions between the solution
|
|
98
|
+
and its environment, defining the system's scope, external entities,
|
|
99
|
+
and boundaries.
|
|
100
|
+
|
|
101
|
+
- Format:
|
|
102
|
+
|
|
103
|
+
<format>
|
|
104
|
+
|
|
105
|
+
# ARCHITECTURE: CONTEXT VIEW (ARCH-CV)
|
|
106
|
+
|
|
107
|
+
✳ Created: **<timestamp-created/>**
|
|
108
|
+
✎ Modified: **<timestamp-modified/>**
|
|
109
|
+
|
|
110
|
+
<arch-cv-entity/>
|
|
111
|
+
<arch-cv-entity/>
|
|
112
|
+
[...]
|
|
113
|
+
|
|
114
|
+
</format>
|
|
115
|
+
|
|
116
|
+
- <arch-cv-entity/> format:
|
|
117
|
+
|
|
118
|
+
<format>
|
|
119
|
+
|
|
120
|
+
## ENTITY: <arch-cv-entity-name/> <a id="ARCH-CV-<arch-cv-entity-id/>"></a>
|
|
121
|
+
|
|
122
|
+
- Kind: <arch-cv-entity-kind/>
|
|
123
|
+
- Direction: <arch-cv-entity-direction/>
|
|
124
|
+
- Interface: <arch-cv-entity-interface/>
|
|
125
|
+
- Data: <arch-cv-entity-data/>
|
|
126
|
+
|
|
127
|
+
<arch-cv-entity-description/>,
|
|
128
|
+
**BECAUSE** <arch-cv-entity-rationale/>.
|
|
129
|
+
|
|
130
|
+
</format>
|
|
131
|
+
|
|
132
|
+
- <arch-cv-entity/> details:
|
|
133
|
+
|
|
134
|
+
- <arch-cv-entity-id/>: per-artifact unique "slug" of always 1-3
|
|
135
|
+
lower-cased words (concatenated with "-" characters and
|
|
136
|
+
in total not longer than 30 characters), derived from
|
|
137
|
+
<arch-cv-entity-name/>.
|
|
138
|
+
|
|
139
|
+
- <arch-cv-entity-name/> is a short (2-5 word) summary of the
|
|
140
|
+
external entity the solution interacts with (e.g. `Payment
|
|
141
|
+
Gateway`, `Identity Provider`, `End User`).
|
|
142
|
+
|
|
143
|
+
- <arch-cv-entity-kind/> is one of:
|
|
144
|
+
|
|
145
|
+
- `Person`: A human actor interacting with the solution.
|
|
146
|
+
- `System`: An external software system the solution integrates with.
|
|
147
|
+
- `Service`: A third-party or managed service the solution consumes.
|
|
148
|
+
- `Datastore`: An external data repository the solution reads from or writes to.
|
|
149
|
+
- `Device`: A physical device or sensor the solution communicates with.
|
|
150
|
+
- `Organization`: An external organizational party.
|
|
151
|
+
|
|
152
|
+
- <arch-cv-entity-direction/> is the flow of interaction relative to
|
|
153
|
+
the solution: `Inbound` (entity drives the solution), `Outbound`
|
|
154
|
+
(solution drives the entity), or `Bidirectional` (both directions).
|
|
155
|
+
|
|
156
|
+
- <arch-cv-entity-interface/> is how the interaction happens
|
|
157
|
+
(e.g. REST API, message queue, file exchange, web UI).
|
|
158
|
+
|
|
159
|
+
- <arch-cv-entity-data/> is the principal information exchanged
|
|
160
|
+
across the boundary with this entity.
|
|
161
|
+
|
|
162
|
+
- <arch-cv-entity-description/> is a concise paragraph (1-3
|
|
163
|
+
sentences) of prose describing the relationship and dependency
|
|
164
|
+
between the solution and the external entity.
|
|
165
|
+
|
|
166
|
+
- <arch-cv-entity-rationale/> is the 1-sentence rationale ("why")
|
|
167
|
+
for the entity being part of the system context.
|
|
168
|
+
|
|
169
|
+
- In case the rationale is not present, the
|
|
170
|
+
entire `, **BECAUSE** [...]` clause is omitted.
|
|
171
|
+
|
|
172
|
+
Functionality View (FV)
|
|
173
|
+
-----------------------
|
|
174
|
+
|
|
175
|
+
The functional components of the solution, their responsibilities,
|
|
176
|
+
interfaces, and primary interactions, describing *what* the system does
|
|
177
|
+
at runtime.
|
|
178
|
+
|
|
179
|
+
- Format:
|
|
180
|
+
|
|
181
|
+
<format>
|
|
182
|
+
|
|
183
|
+
# ARCHITECTURE: FUNCTIONALITY VIEW (ARCH-FV)
|
|
184
|
+
|
|
185
|
+
✳ Created: **<timestamp-created/>**
|
|
186
|
+
✎ Modified: **<timestamp-modified/>**
|
|
187
|
+
|
|
188
|
+
<arch-fv-component/>
|
|
189
|
+
<arch-fv-component/>
|
|
190
|
+
[...]
|
|
191
|
+
|
|
192
|
+
</format>
|
|
193
|
+
|
|
194
|
+
- <arch-fv-component/> format:
|
|
195
|
+
|
|
196
|
+
<format>
|
|
197
|
+
|
|
198
|
+
## COMPONENT: <arch-fv-component-name/> <a id="ARCH-FV-<arch-fv-component-id/>"></a>
|
|
199
|
+
|
|
200
|
+
- Kind: <arch-fv-component-kind/>
|
|
201
|
+
- Responsibility: <arch-fv-component-responsibility/>
|
|
202
|
+
- Interface: <arch-fv-component-interface/>
|
|
203
|
+
- Depends On: <arch-fv-component-dependency/>, [...]
|
|
204
|
+
|
|
205
|
+
<arch-fv-component-description/>,
|
|
206
|
+
**BECAUSE** <arch-fv-component-rationale/>.
|
|
207
|
+
|
|
208
|
+
</format>
|
|
209
|
+
|
|
210
|
+
- <arch-fv-component/> details:
|
|
211
|
+
|
|
212
|
+
- <arch-fv-component-id/>: per-artifact unique "slug" of always 1-3
|
|
213
|
+
lower-cased words (concatenated with "-" characters and
|
|
214
|
+
in total not longer than 30 characters), derived from
|
|
215
|
+
<arch-fv-component-name/>.
|
|
216
|
+
|
|
217
|
+
- <arch-fv-component-name/> is a short (2-5 word) summary of the
|
|
218
|
+
functional component (e.g. `Authentication Service`, `Order
|
|
219
|
+
Processor`, `Notification Dispatcher`).
|
|
220
|
+
|
|
221
|
+
- <arch-fv-component-kind/> is one of:
|
|
222
|
+
- `Component`: Cohesive unit of functionality with a defined interface.
|
|
223
|
+
- `Service`: Independently deployable provider of functionality.
|
|
224
|
+
- `Module`: Logical grouping of related functionality within a component.
|
|
225
|
+
- `Connector`: Mediator that conveys interactions between components (e.g. bus, gateway).
|
|
226
|
+
- `Subsystem`: Larger composite grouping several components.
|
|
227
|
+
|
|
228
|
+
- <arch-fv-component-responsibility/> is the 1-sentence statement of
|
|
229
|
+
the single, primary responsibility the component owns.
|
|
230
|
+
|
|
231
|
+
- <arch-fv-component-interface/> is how other components interact with
|
|
232
|
+
this component (e.g. REST API, library API, message topic, CLI).
|
|
233
|
+
|
|
234
|
+
- <arch-fv-component-dependency/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
235
|
+
reference to another functional component this component depends on
|
|
236
|
+
at runtime.
|
|
237
|
+
|
|
238
|
+
- <arch-fv-component-description/> is a concise paragraph (1-3
|
|
239
|
+
sentences) of prose describing *what* the component does and how it
|
|
240
|
+
collaborates with the components it depends on.
|
|
241
|
+
|
|
242
|
+
- <arch-fv-component-rationale/> is the 1-sentence rationale ("why")
|
|
243
|
+
for the component's existence and boundary.
|
|
244
|
+
|
|
245
|
+
- In case a component has no dependencies at all, the
|
|
246
|
+
entire `- Depends On:` bullet point is omitted.
|
|
247
|
+
|
|
248
|
+
- In case the rationale is not present, the
|
|
249
|
+
entire `, **BECAUSE** [...]` clause is omitted.
|
|
250
|
+
|
|
251
|
+
Information View (IV)
|
|
252
|
+
---------------------
|
|
253
|
+
|
|
254
|
+
The way the solution stores, manages, manipulates, and distributes
|
|
255
|
+
information, defining the static data structure and dynamic information
|
|
256
|
+
flow.
|
|
257
|
+
|
|
258
|
+
- Format:
|
|
259
|
+
|
|
260
|
+
<format>
|
|
261
|
+
|
|
262
|
+
# ARCHITECTURE: INFORMATION VIEW (ARCH-IV)
|
|
263
|
+
|
|
264
|
+
✳ Created: **<timestamp-created/>**
|
|
265
|
+
✎ Modified: **<timestamp-modified/>**
|
|
266
|
+
|
|
267
|
+
<arch-iv-aspect/>
|
|
268
|
+
<arch-iv-aspect/>
|
|
269
|
+
[...]
|
|
270
|
+
|
|
271
|
+
</format>
|
|
272
|
+
|
|
273
|
+
- <arch-iv-aspect/> format:
|
|
274
|
+
|
|
275
|
+
<format>
|
|
276
|
+
|
|
277
|
+
## ASPECT: <arch-iv-aspect-name/> <a id="ARCH-IV-<arch-iv-aspect-id/>"></a>
|
|
278
|
+
|
|
279
|
+
- Concern: <arch-iv-aspect-concern/>
|
|
280
|
+
- Entities: <arch-iv-aspect-entity/>, [...]
|
|
281
|
+
- Owner: <arch-iv-aspect-owner/>
|
|
282
|
+
- Lifecycle: <arch-iv-aspect-lifecycle/>
|
|
283
|
+
|
|
284
|
+
<arch-iv-aspect-description/>,
|
|
285
|
+
**BECAUSE** <arch-iv-aspect-rationale/>.
|
|
286
|
+
|
|
287
|
+
</format>
|
|
288
|
+
|
|
289
|
+
- <arch-iv-aspect/> details:
|
|
290
|
+
|
|
291
|
+
- <arch-iv-aspect-id/>: per-artifact unique "slug" of always 1-3
|
|
292
|
+
lower-cased words (concatenated with "-" characters and
|
|
293
|
+
in total not longer than 30 characters), derived from
|
|
294
|
+
<arch-iv-aspect-name/>.
|
|
295
|
+
|
|
296
|
+
- <arch-iv-aspect-name/> is a short (2-5 word) summary of the
|
|
297
|
+
information aspect (e.g. `Order Persistence`, `Event Stream`,
|
|
298
|
+
`Cache Coherency`).
|
|
299
|
+
|
|
300
|
+
- <arch-iv-aspect-concern/> is the information-handling concern the
|
|
301
|
+
aspect addresses, one of `Persistence`, `Flow`, `Ownership`,
|
|
302
|
+
`Consistency`, `Replication`, `Caching`, `Retention`, or
|
|
303
|
+
`Migration`.
|
|
304
|
+
|
|
305
|
+
- <arch-iv-aspect-entity/> is a `SPEC-DM-<spec-dm-entity-id/>`
|
|
306
|
+
reference to a corresponding entity of the Data Model **Artifact**
|
|
307
|
+
the aspect governs.
|
|
308
|
+
|
|
309
|
+
- <arch-iv-aspect-owner/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
310
|
+
reference to the functional component that owns this information.
|
|
311
|
+
|
|
312
|
+
- <arch-iv-aspect-lifecycle/> is how the information comes into
|
|
313
|
+
being, changes, and is disposed of (e.g. `created on order,
|
|
314
|
+
retained 7 years, then purged`).
|
|
315
|
+
|
|
316
|
+
- <arch-iv-aspect-description/> is a concise paragraph (1-3
|
|
317
|
+
sentences) of prose describing how the solution stores, manages,
|
|
318
|
+
or distributes the information and how its consistency is upheld.
|
|
319
|
+
|
|
320
|
+
- <arch-iv-aspect-rationale/> is the 1-sentence rationale ("why")
|
|
321
|
+
for handling the information this way.
|
|
322
|
+
|
|
323
|
+
- In case the entity or owner references are not present, the
|
|
324
|
+
respective bullet point is omitted.
|
|
325
|
+
|
|
326
|
+
- In case the rationale is not present, the
|
|
327
|
+
entire `, **BECAUSE** [...]` clause is omitted.
|
|
328
|
+
|
|
329
|
+
Concurrency View (CO)
|
|
330
|
+
---------------------
|
|
331
|
+
|
|
332
|
+
The concurrency structure of the solution, mapping functional components
|
|
333
|
+
to processes and threads, and defining how they coordinate and
|
|
334
|
+
communicate.
|
|
335
|
+
|
|
336
|
+
- Format:
|
|
337
|
+
|
|
338
|
+
<format>
|
|
339
|
+
|
|
340
|
+
# ARCHITECTURE: CONCURRENCY VIEW (ARCH-CO)
|
|
341
|
+
|
|
342
|
+
✳ Created: **<timestamp-created/>**
|
|
343
|
+
✎ Modified: **<timestamp-modified/>**
|
|
344
|
+
|
|
345
|
+
<arch-co-unit/>
|
|
346
|
+
<arch-co-unit/>
|
|
347
|
+
[...]
|
|
348
|
+
|
|
349
|
+
</format>
|
|
350
|
+
|
|
351
|
+
- <arch-co-unit/> format:
|
|
352
|
+
|
|
353
|
+
<format>
|
|
354
|
+
|
|
355
|
+
## UNIT: <arch-co-unit-name/> <a id="ARCH-CO-<arch-co-unit-id/>"></a>
|
|
356
|
+
|
|
357
|
+
- Kind: <arch-co-unit-kind/>
|
|
358
|
+
- Hosts: <arch-co-unit-element/>, [...]
|
|
359
|
+
- Multiplicity: <arch-co-unit-multiplicity/>
|
|
360
|
+
- Coordination: <arch-co-unit-coordination/>
|
|
361
|
+
|
|
362
|
+
<arch-co-unit-description/>,
|
|
363
|
+
**BECAUSE** <arch-co-unit-rationale/>.
|
|
364
|
+
|
|
365
|
+
</format>
|
|
366
|
+
|
|
367
|
+
- <arch-co-unit/> details:
|
|
368
|
+
|
|
369
|
+
- <arch-co-unit-id/>: per-artifact unique "slug" of always 1-3
|
|
370
|
+
lower-cased words (concatenated with "-" characters and
|
|
371
|
+
in total not longer than 30 characters), derived from
|
|
372
|
+
<arch-co-unit-name/>.
|
|
373
|
+
|
|
374
|
+
- <arch-co-unit-name/> is a short (2-5 word) summary of the
|
|
375
|
+
concurrency unit (e.g. `Web Worker Pool`, `Background Scheduler`,
|
|
376
|
+
`Ingest Queue Consumer`).
|
|
377
|
+
|
|
378
|
+
- <arch-co-unit-kind/> is one of:
|
|
379
|
+
|
|
380
|
+
- `Process`: An independent OS process with its own address space.
|
|
381
|
+
- `Thread`: A thread of execution within a process.
|
|
382
|
+
- `Pool`: A managed group of interchangeable workers.
|
|
383
|
+
- `Queue`: An asynchronous buffer decoupling producers and consumers.
|
|
384
|
+
- `EventLoop`: A single-threaded cooperative scheduler of tasks.
|
|
385
|
+
|
|
386
|
+
- <arch-co-unit-element/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
387
|
+
reference to a functional component that runs inside this
|
|
388
|
+
concurrency unit.
|
|
389
|
+
|
|
390
|
+
- <arch-co-unit-multiplicity/> is how many instances of the unit run
|
|
391
|
+
(e.g. `1`, `1 per CPU core`, `0..n auto-scaled`).
|
|
392
|
+
|
|
393
|
+
- <arch-co-unit-coordination/> is the mechanism by which the unit
|
|
394
|
+
coordinates or communicates with other units (e.g. `shared queue`,
|
|
395
|
+
`mutex`, `message passing`, `optimistic locking`).
|
|
396
|
+
|
|
397
|
+
- <arch-co-unit-description/> is a concise paragraph (1-3 sentences)
|
|
398
|
+
of prose describing how the unit executes and how it avoids or
|
|
399
|
+
manages contention, races, and deadlocks.
|
|
400
|
+
|
|
401
|
+
- <arch-co-unit-rationale/> is the 1-sentence rationale ("why") for
|
|
402
|
+
the chosen concurrency structure.
|
|
403
|
+
|
|
404
|
+
- In case the unit hosts no functional components, the
|
|
405
|
+
entire `- Hosts:` bullet point is omitted.
|
|
406
|
+
|
|
407
|
+
- In case the rationale is not present, the
|
|
408
|
+
entire `, **BECAUSE** [...]` clause is omitted.
|
|
409
|
+
|
|
410
|
+
Development View (DV)
|
|
411
|
+
---------------------
|
|
412
|
+
|
|
413
|
+
The architecture supporting the software development process, defining
|
|
414
|
+
the module organization, build approach, and codeline conventions.
|
|
415
|
+
|
|
416
|
+
- Format:
|
|
417
|
+
|
|
418
|
+
<format>
|
|
419
|
+
|
|
420
|
+
# ARCHITECTURE: DEVELOPMENT VIEW (ARCH-DV)
|
|
421
|
+
|
|
422
|
+
✳ Created: **<timestamp-created/>**
|
|
423
|
+
✎ Modified: **<timestamp-modified/>**
|
|
424
|
+
|
|
425
|
+
<arch-dv-aspect/>
|
|
426
|
+
<arch-dv-aspect/>
|
|
427
|
+
[...]
|
|
428
|
+
|
|
429
|
+
</format>
|
|
430
|
+
|
|
431
|
+
- <arch-dv-aspect/> format:
|
|
432
|
+
|
|
433
|
+
<format>
|
|
434
|
+
|
|
435
|
+
## ASPECT: <arch-dv-aspect-name/> <a id="ARCH-DV-<arch-dv-aspect-id/>"></a>
|
|
436
|
+
|
|
437
|
+
- Category: <arch-dv-aspect-category/>
|
|
438
|
+
|
|
439
|
+
<arch-dv-aspect-description/>,
|
|
440
|
+
**BECAUSE** <arch-dv-aspect-rationale/>.
|
|
441
|
+
|
|
442
|
+
</format>
|
|
443
|
+
|
|
444
|
+
- <arch-dv-aspect/> details:
|
|
445
|
+
|
|
446
|
+
- <arch-dv-aspect-id/>: per-artifact unique "slug" of always 1-3
|
|
447
|
+
lower-cased words (concatenated with "-" characters and
|
|
448
|
+
in total not longer than 30 characters), derived from
|
|
449
|
+
<arch-dv-aspect-name/>.
|
|
450
|
+
|
|
451
|
+
- <arch-dv-aspect-name/> is a short (2-5 word) summary of the
|
|
452
|
+
development aspect (e.g. `Module Layering`, `Build Pipeline`,
|
|
453
|
+
`Branching Model`).
|
|
454
|
+
|
|
455
|
+
- <arch-dv-aspect-category/> is the development concern the aspect
|
|
456
|
+
governs, one of `Structure` (module/package organization),
|
|
457
|
+
`Build` (compilation and packaging), `Dependency` (dependency
|
|
458
|
+
management and layering rules), `Codeline` (branching, merging,
|
|
459
|
+
versioning), `Standardization` (coding standards and conventions),
|
|
460
|
+
or `Tooling` (development tools and automation).
|
|
461
|
+
|
|
462
|
+
- <arch-dv-aspect-description/> is a concise paragraph (1-3
|
|
463
|
+
sentences) of prose describing the development convention or
|
|
464
|
+
structure and the rule developers must follow.
|
|
465
|
+
|
|
466
|
+
- <arch-dv-aspect-rationale/> is the 1-sentence rationale ("why")
|
|
467
|
+
for the development aspect.
|
|
468
|
+
|
|
469
|
+
- In case the rationale is not present, the
|
|
470
|
+
entire `, **BECAUSE** [...]` clause is omitted.
|
|
471
|
+
|
|
472
|
+
Deployment View (DP)
|
|
473
|
+
--------------------
|
|
474
|
+
|
|
475
|
+
The environment into which the solution is deployed, mapping software
|
|
476
|
+
elements to the runtime platform, hardware, and network topology.
|
|
477
|
+
|
|
478
|
+
- Format:
|
|
479
|
+
|
|
480
|
+
<format>
|
|
481
|
+
|
|
482
|
+
# ARCHITECTURE: DEPLOYMENT VIEW (ARCH-DP)
|
|
483
|
+
|
|
484
|
+
✳ Created: **<timestamp-created/>**
|
|
485
|
+
✎ Modified: **<timestamp-modified/>**
|
|
486
|
+
|
|
487
|
+
<arch-dp-node/>
|
|
488
|
+
<arch-dp-node/>
|
|
489
|
+
[...]
|
|
490
|
+
|
|
491
|
+
</format>
|
|
492
|
+
|
|
493
|
+
- <arch-dp-node/> format:
|
|
494
|
+
|
|
495
|
+
<format>
|
|
496
|
+
|
|
497
|
+
## NODE: <arch-dp-node-name/> <a id="ARCH-DP-<arch-dp-node-id/>"></a>
|
|
498
|
+
|
|
499
|
+
- Kind: <arch-dp-node-kind/>
|
|
500
|
+
- Platform: <arch-dp-node-platform/>
|
|
501
|
+
- Hosts: <arch-dp-node-element/>, [...]
|
|
502
|
+
- Network: <arch-dp-node-network/>
|
|
503
|
+
|
|
504
|
+
<arch-dp-node-description/>,
|
|
505
|
+
**BECAUSE** <arch-dp-node-rationale/>.
|
|
506
|
+
|
|
507
|
+
</format>
|
|
508
|
+
|
|
509
|
+
- <arch-dp-node/> details:
|
|
510
|
+
|
|
511
|
+
- <arch-dp-node-id/>: per-artifact unique "slug" of always 1-3
|
|
512
|
+
lower-cased words (concatenated with "-" characters and
|
|
513
|
+
in total not longer than 30 characters), derived from
|
|
514
|
+
<arch-dp-node-name/>.
|
|
515
|
+
|
|
516
|
+
- <arch-dp-node-name/> is a short (2-5 word) summary of the
|
|
517
|
+
deployment node (e.g. `Web Tier`, `Database Cluster`, `Edge CDN`).
|
|
518
|
+
|
|
519
|
+
- <arch-dp-node-kind/> is one of:
|
|
520
|
+
|
|
521
|
+
- `Server`: A physical or virtual machine.
|
|
522
|
+
- `Container`: A containerized runtime (e.g. Docker, OCI).
|
|
523
|
+
- `Cluster`: A managed group of nodes (e.g. Kubernetes cluster).
|
|
524
|
+
- `Function`: A serverless / function-as-a-service runtime.
|
|
525
|
+
- `Device`: An edge or client device.
|
|
526
|
+
- `Managed`: A managed cloud service (e.g. managed database, queue).
|
|
527
|
+
|
|
528
|
+
- <arch-dp-node-platform/> is the runtime platform of the node
|
|
529
|
+
(e.g. `Linux x86-64`, `Kubernetes 1.30`, `AWS Lambda (Node.js)`).
|
|
530
|
+
|
|
531
|
+
- <arch-dp-node-element/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
532
|
+
reference to a functional component deployed onto this node.
|
|
533
|
+
|
|
534
|
+
- <arch-dp-node-network/> is the network placement and connectivity
|
|
535
|
+
of the node (e.g. `public subnet, TLS 443`, `private VLAN`).
|
|
536
|
+
|
|
537
|
+
- <arch-dp-node-description/> is a concise paragraph (1-3 sentences)
|
|
538
|
+
of prose describing the node, its sizing, and its place in the
|
|
539
|
+
deployment topology.
|
|
540
|
+
|
|
541
|
+
- <arch-dp-node-rationale/> is the 1-sentence rationale ("why") for
|
|
542
|
+
the node's placement and platform choice.
|
|
543
|
+
|
|
544
|
+
- In case the node hosts no functional components, the
|
|
545
|
+
entire `- Hosts:` bullet point is omitted.
|
|
546
|
+
|
|
547
|
+
- In case the rationale is not present, the
|
|
548
|
+
entire `, **BECAUSE** [...]` clause is omitted.
|
|
549
|
+
|
|
550
|
+
Operations View (OV)
|
|
551
|
+
--------------------
|
|
552
|
+
|
|
553
|
+
The way the solution is operated, administered, and supported in
|
|
554
|
+
production, defining installation, monitoring, and management concerns.
|
|
555
|
+
|
|
556
|
+
- Format:
|
|
557
|
+
|
|
558
|
+
<format>
|
|
559
|
+
|
|
560
|
+
# ARCHITECTURE: OPERATIONS VIEW (ARCH-OV)
|
|
561
|
+
|
|
562
|
+
✳ Created: **<timestamp-created/>**
|
|
563
|
+
✎ Modified: **<timestamp-modified/>**
|
|
564
|
+
|
|
565
|
+
<arch-ov-concern/>
|
|
566
|
+
<arch-ov-concern/>
|
|
567
|
+
[...]
|
|
568
|
+
|
|
569
|
+
</format>
|
|
570
|
+
|
|
571
|
+
- <arch-ov-concern/> format:
|
|
572
|
+
|
|
573
|
+
<format>
|
|
574
|
+
|
|
575
|
+
## CONCERN: <arch-ov-concern-name/> <a id="ARCH-OV-<arch-ov-concern-id/>"></a>
|
|
576
|
+
|
|
577
|
+
- Category: <arch-ov-concern-category/>
|
|
578
|
+
- Element: <arch-ov-concern-element/>, [...]
|
|
579
|
+
|
|
580
|
+
<arch-ov-concern-description/>,
|
|
581
|
+
**BECAUSE** <arch-ov-concern-rationale/>.
|
|
582
|
+
|
|
583
|
+
</format>
|
|
584
|
+
|
|
585
|
+
- <arch-ov-concern/> details:
|
|
586
|
+
|
|
587
|
+
- <arch-ov-concern-id/>: per-artifact unique "slug" of always 1-3
|
|
588
|
+
lower-cased words (concatenated with "-" characters and
|
|
589
|
+
in total not longer than 30 characters), derived from
|
|
590
|
+
<arch-ov-concern-name/>.
|
|
591
|
+
|
|
592
|
+
- <arch-ov-concern-name/> is a short (2-5 word) summary of the
|
|
593
|
+
operational concern (e.g. `Rolling Deployment`, `Metrics
|
|
594
|
+
Collection`, `Backup and Restore`).
|
|
595
|
+
|
|
596
|
+
- <arch-ov-concern-category/> is the category of the concern,
|
|
597
|
+
one of `Installation`, `Configuration`, `Provisioning`,
|
|
598
|
+
`Monitoring`, `Logging`, `Alerting`, `Backup`, `Recovery`,
|
|
599
|
+
`Upgrade`, or `Support`.
|
|
600
|
+
|
|
601
|
+
- <arch-ov-concern-element/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
602
|
+
or `ARCH-DP-<arch-dp-node-id/>` reference to the functional
|
|
603
|
+
element or deployment node the concern applies to.
|
|
604
|
+
|
|
605
|
+
- <arch-ov-concern-description/> is a concise paragraph (1-3
|
|
606
|
+
sentences) of prose describing how the concern is handled in
|
|
607
|
+
production and which procedures or tools support it.
|
|
608
|
+
|
|
609
|
+
- <arch-ov-concern-rationale/> is the 1-sentence rationale ("why")
|
|
610
|
+
for the operational approach.
|
|
611
|
+
|
|
612
|
+
- In case the element reference is not present, the
|
|
613
|
+
entire `- Element:` bullet point is omitted.
|
|
614
|
+
|
|
615
|
+
- In case the rationale is not present, the
|
|
616
|
+
entire `, **BECAUSE** [...]` clause is omitted.
|
|
617
|
+
|
|
618
|
+
Quality Perspectives (QP)
|
|
619
|
+
-------------------------
|
|
620
|
+
|
|
621
|
+
How the Non-Functional Requirements (NR) are addressed.
|
|
622
|
+
|
|
623
|
+
- Format:
|
|
624
|
+
|
|
625
|
+
<format>
|
|
626
|
+
|
|
627
|
+
# ARCHITECTURE: QUALITY PERSPECTIVES (ARCH-QP)
|
|
628
|
+
|
|
629
|
+
✳ Created: **<timestamp-created/>**
|
|
630
|
+
✎ Modified: **<timestamp-modified/>**
|
|
631
|
+
|
|
632
|
+
<arch-qp-perspective/>
|
|
633
|
+
<arch-qp-perspective/>
|
|
634
|
+
[...]
|
|
635
|
+
|
|
636
|
+
</format>
|
|
637
|
+
|
|
638
|
+
- <arch-qp-perspective/> format:
|
|
639
|
+
|
|
640
|
+
<format>
|
|
641
|
+
|
|
642
|
+
## PERSPECTIVE: <arch-qp-perspective-name/> <a id="ARCH-QP-<arch-qp-perspective-id/>"></a>
|
|
643
|
+
|
|
644
|
+
- Quality: <arch-qp-perspective-quality/>
|
|
645
|
+
- Addresses: <arch-qp-perspective-requirement/>, [...]
|
|
646
|
+
- Tactic: <arch-qp-perspective-tactic/>
|
|
647
|
+
- Affects: <arch-qp-perspective-element/>, [...]
|
|
648
|
+
|
|
649
|
+
<arch-qp-perspective-description/>,
|
|
650
|
+
**BECAUSE** <arch-qp-perspective-rationale/>.
|
|
651
|
+
|
|
652
|
+
</format>
|
|
653
|
+
|
|
654
|
+
- <arch-qp-perspective/> details:
|
|
655
|
+
|
|
656
|
+
- <arch-qp-perspective-id/>: per-artifact unique "slug" of always
|
|
657
|
+
1-3 lower-cased words (concatenated with "-" characters and
|
|
658
|
+
in total not longer than 30 characters), derived from
|
|
659
|
+
<arch-qp-perspective-name/>.
|
|
660
|
+
|
|
661
|
+
- <arch-qp-perspective-name/> is a short (2-5 word) summary of the
|
|
662
|
+
quality perspective (e.g. `Horizontal Scaling`, `Defense in
|
|
663
|
+
Depth`, `Graceful Degradation`).
|
|
664
|
+
|
|
665
|
+
- <arch-qp-perspective-quality/> is the quality attribute the
|
|
666
|
+
perspective addresses, one of `Performance`, `Scalability`,
|
|
667
|
+
`Reliability`, `Availability`, `Security`, `Privacy`,
|
|
668
|
+
`Usability`, `Accessibility`, `Maintainability`, `Portability`,
|
|
669
|
+
`Compatibility`, or `Compliance` (aligned with the Non-Functional
|
|
670
|
+
Requirements categories).
|
|
671
|
+
|
|
672
|
+
- <arch-qp-perspective-requirement/> is a
|
|
673
|
+
`SPEC-NR-<spec-nr-requirement-id/>` reference to the corresponding
|
|
674
|
+
Non-Functional Requirement (NR) **Aspect** the perspective addresses.
|
|
675
|
+
|
|
676
|
+
- <arch-qp-perspective-tactic/> is the architectural tactic or
|
|
677
|
+
strategy applied to achieve the quality (e.g. `stateless
|
|
678
|
+
replication behind a load balancer`, `read-through cache`, `circuit
|
|
679
|
+
breaker`).
|
|
680
|
+
|
|
681
|
+
- <arch-qp-perspective-element/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
682
|
+
or `ARCH-DP-<arch-dp-node-id/>` reference to the functional
|
|
683
|
+
element or deployment node the tactic affects.
|
|
684
|
+
|
|
685
|
+
- <arch-qp-perspective-description/> is a concise paragraph (1-3
|
|
686
|
+
sentences) of prose describing how the architecture satisfies the
|
|
687
|
+
quality attribute across the affected elements.
|
|
688
|
+
|
|
689
|
+
- <arch-qp-perspective-rationale/> is the 1-sentence rationale
|
|
690
|
+
("why") for the chosen tactic over alternatives.
|
|
691
|
+
|
|
692
|
+
- In case the element reference is not present, the
|
|
693
|
+
entire `- Affects:` bullet point is omitted.
|
|
694
|
+
|
|
695
|
+
- In case the rationale is not present, the
|
|
696
|
+
entire `, **BECAUSE** [...]` clause is omitted.
|
|
697
|
+
|
|
698
|
+
Decision Record (DR)
|
|
699
|
+
--------------------
|
|
700
|
+
|
|
701
|
+
The major decisions related to the architecture, each recording the
|
|
702
|
+
forces at play, the chosen response, and the reasoning that justifies it.
|
|
703
|
+
|
|
704
|
+
- Format:
|
|
705
|
+
|
|
706
|
+
<format>
|
|
707
|
+
|
|
708
|
+
# ARCHITECTURE: DECISION RECORD (ARCH-DR)
|
|
709
|
+
|
|
710
|
+
✳ Created: **<timestamp-created/>**
|
|
711
|
+
✎ Modified: **<timestamp-modified/>**
|
|
712
|
+
|
|
713
|
+
<arch-dr-decision/>
|
|
714
|
+
<arch-dr-decision/>
|
|
715
|
+
[...]
|
|
716
|
+
|
|
717
|
+
</format>
|
|
718
|
+
|
|
719
|
+
- <arch-dr-decision/> format:
|
|
720
|
+
|
|
721
|
+
<format>
|
|
722
|
+
|
|
723
|
+
## DECISION: <arch-dr-decision-name/> <a id="ARCH-DR-<arch-dr-decision-id/>"></a>
|
|
724
|
+
|
|
725
|
+
- Status: <arch-dr-decision-status/>
|
|
726
|
+
- Affects: <arch-dr-decision-element/>, [...]
|
|
727
|
+
- Created: <arch-dr-decision-created/>
|
|
728
|
+
- Modified: <arch-dr-decision-modified/>
|
|
729
|
+
|
|
730
|
+
- WHEN (Context):
|
|
731
|
+
<arch-dr-decision-context/>
|
|
732
|
+
|
|
733
|
+
- WHAT (Decision):
|
|
734
|
+
<arch-dr-decision-decision/>
|
|
735
|
+
|
|
736
|
+
- WHY (Rationale):
|
|
737
|
+
<arch-dr-decision-rationale/>
|
|
738
|
+
|
|
739
|
+
- NOTES (Background):
|
|
740
|
+
<arch-dr-decision-notes/>
|
|
741
|
+
|
|
742
|
+
</format>
|
|
743
|
+
|
|
744
|
+
- <arch-dr-decision/> details:
|
|
745
|
+
|
|
746
|
+
- <arch-dr-decision-id/>: per-artifact unique "slug" of always 1-3
|
|
747
|
+
lower-cased words (concatenated with "-" characters and
|
|
748
|
+
in total not longer than 30 characters), derived from
|
|
749
|
+
<arch-dr-decision-name/>.
|
|
750
|
+
|
|
751
|
+
- <arch-dr-decision-name/> is a short summary of the
|
|
752
|
+
<arch-dr-decision-decision/>, not longer than 80 characters.
|
|
753
|
+
|
|
754
|
+
- <arch-dr-decision-status/> is one of `proposed`, `accepted`,
|
|
755
|
+
`deprecated`, or `superseded by ARCH-DR-<arch-dr-decision-id/>`.
|
|
756
|
+
|
|
757
|
+
- <arch-dr-decision-element/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
758
|
+
or `ARCH-DP-<arch-dp-node-id/>` reference to the functional
|
|
759
|
+
element or deployment node the decision affects.
|
|
760
|
+
|
|
761
|
+
- <arch-dr-decision-created/> is the timestamp when this decision was
|
|
762
|
+
created, and <arch-dr-decision-modified/> is the timestamp when
|
|
763
|
+
this decision was last modified, both in the same ISO-style format
|
|
764
|
+
as the **Artifact**'s own timestamps.
|
|
765
|
+
|
|
766
|
+
- <arch-dr-decision-context/> captures the situation that forces the
|
|
767
|
+
decision — the "why are we even talking about this" part. It
|
|
768
|
+
describes the situation as it is, before the decision is made. The
|
|
769
|
+
following usually goes into it: the problem or need (what's broken,
|
|
770
|
+
missing, or about to change that requires a decision); the forces at
|
|
771
|
+
play (technical constraints, business requirements, deadlines, team
|
|
772
|
+
skills, existing systems, regulatory/compliance pressures — often
|
|
773
|
+
competing, and that tension is the whole point); relevant facts
|
|
774
|
+
(current architecture, prior decisions, assumptions, what's known
|
|
775
|
+
and what's uncertain); and scope/boundaries (what this decision is
|
|
776
|
+
and isn't about). It is written neutrally and factually. It should
|
|
777
|
+
not contain the decision itself, nor advocate for an option — a
|
|
778
|
+
reader should be able to read it, pause, and arrive at the decision
|
|
779
|
+
themselves because the forces make it (nearly) inevitable.
|
|
780
|
+
|
|
781
|
+
- <arch-dr-decision-decision/> states what is actually going to be
|
|
782
|
+
done — the chosen response to the forces laid out in the context. It
|
|
783
|
+
is written in active, assertive voice, in the present or imperative
|
|
784
|
+
tense, as a committed position rather than a discussion. The
|
|
785
|
+
following usually goes into it: the choice itself (clearly and
|
|
786
|
+
unambiguously) and the essence of how (enough of the approach to
|
|
787
|
+
make the choice concrete — the mechanism, pattern, or technology —
|
|
788
|
+
but not a full implementation specification). It is a declaration,
|
|
789
|
+
not a deliberation, usually using the wording "We use..." or "We
|
|
790
|
+
do...", active, definite, owning the choice. Avoid hedging ("we
|
|
791
|
+
might", "we could consider") — the deliberation already happened,
|
|
792
|
+
the decision records the verdict.
|
|
793
|
+
|
|
794
|
+
- <arch-dr-decision-rationale/> is the reasoning that justifies the
|
|
795
|
+
decision — the bridge that explains why this choice, given those
|
|
796
|
+
forces. It answers "Of all the things we could have done, why was
|
|
797
|
+
this the right one?". Where the context states the forces and the
|
|
798
|
+
decision states the choice, the rationale is the logical connective
|
|
799
|
+
tissue between them — it shows that the decision actually follows
|
|
800
|
+
from the context. The following usually goes into it: the deciding
|
|
801
|
+
factors (which forces from the context carried the most weight, and
|
|
802
|
+
how the chosen option satisfies them best); the trade-off reasoning
|
|
803
|
+
(what was optimized for and what was knowingly sacrificed — naming
|
|
804
|
+
the trade-off is the heart of rationale); why the alternatives lost
|
|
805
|
+
(the comparative argument: "option B failed on X, option C cost too
|
|
806
|
+
much on Y"); and assumptions and evidence (benchmarks, prior
|
|
807
|
+
experience, constraints, or principles the reasoning rests on).
|
|
808
|
+
|
|
809
|
+
- <arch-dr-decision-notes/> is *OPTIONAL* and can be omitted when it
|
|
810
|
+
does not add genuine value — most decisions won't need it. The
|
|
811
|
+
following usually goes into it: information of the decision *process*
|
|
812
|
+
(e.g. a weighted decision matrix of considered alternatives);
|
|
813
|
+
consequences of the decision (but only when non-obvious downstream
|
|
814
|
+
effects need to be called out); and links to strongly related
|
|
815
|
+
decisions.
|
|
816
|
+
|
|
817
|
+
- <arch-dr-decision-context/>, <arch-dr-decision-decision/>, and
|
|
818
|
+
<arch-dr-decision-rationale/> are each just a single paragraph of
|
|
819
|
+
concise and brief prose text, usually comprised of just 1 to 3
|
|
820
|
+
sentences. The value of a decision is in recording *that* a decision
|
|
821
|
+
was made and *why* — not in filling out sections of a document.
|
|
822
|
+
|
|
823
|
+
- For the relationship between context, decision, and rationale, good
|
|
824
|
+
checks are: the "litmus test" is that context = forces, decision =
|
|
825
|
+
response to those forces, rationale = why the decision answers the
|
|
826
|
+
forces in the context. The decision should feel like the natural,
|
|
827
|
+
almost inevitable answer to the context — if a reader is surprised
|
|
828
|
+
by the decision, either the context is missing a force, or the
|
|
829
|
+
decision is under-justified. The rationale should make the decision
|
|
830
|
+
feel earned, not asserted — if you would delete the rationale and
|
|
831
|
+
the decision suddenly looks arbitrary, the rationale was doing its
|
|
832
|
+
job.
|
|
833
|
+
|
|
834
|
+
- In case the element reference is not present, the
|
|
835
|
+
entire `- Affects:` bullet point is omitted.
|
|
836
|
+
|
|
837
|
+
- In case the `NOTES (Background)` content is not present, the
|
|
838
|
+
entire `NOTES (Background)` chunk is omitted.
|
|
839
|
+
|
|
840
|
+
- A decision *MUST* qualify on all of the following three tenets:
|
|
841
|
+
|
|
842
|
+
- **Hard to Reverse**: the cost of changing it later is meaningful
|
|
843
|
+
("Oh my god, this would result in a dramatic refactoring!"). So,
|
|
844
|
+
if a decision is easy to reverse, just skip it.
|
|
845
|
+
|
|
846
|
+
- **Surprising without Context**: a future architect will look at
|
|
847
|
+
the code and wonder ("Why on earth did they do it this way?").
|
|
848
|
+
So, if a decision is not surprising, nobody will wonder why.
|
|
849
|
+
|
|
850
|
+
- **Result of a Real Trade-Off**: there were genuine alternatives
|
|
851
|
+
and one was picked for specific reasons ("We deliberately chose
|
|
852
|
+
this, because..."). So, if there was no real alternative,
|
|
853
|
+
there's nothing to record beyond "we did the obvious thing."
|
|
854
|
+
|
|
855
|
+
- The following typically qualify as a decision:
|
|
856
|
+
|
|
857
|
+
- **Architectural shape.** "We're using a monorepo." "The write
|
|
858
|
+
model is event-sourced, the read model is projected into PostgreSQL."
|
|
859
|
+
|
|
860
|
+
- **Integration patterns between contexts.** "Ordering and Billing
|
|
861
|
+
communicate via domain events, not synchronous HTTP."
|
|
862
|
+
|
|
863
|
+
- **Technology choices that carry lock-in.** Database, message bus,
|
|
864
|
+
auth provider, deployment target. Not every library — just the
|
|
865
|
+
ones that would take a quarter to swap out.
|
|
866
|
+
|
|
867
|
+
- **Boundary and scope decisions.** "Customer data is owned by the
|
|
868
|
+
Customer context; other contexts reference it by ID only." The explicit
|
|
869
|
+
no-s are as valuable as the yes-s.
|
|
870
|
+
|
|
871
|
+
- **Deliberate deviations from the obvious path.** "We're using
|
|
872
|
+
manual SQL instead of an ORM because X." Anything where a reasonable
|
|
873
|
+
reader would assume the opposite. These stop the next engineer from
|
|
874
|
+
"fixing" something that was deliberate.
|
|
875
|
+
|
|
876
|
+
- **Constraints not visible in the code.** "We can't use AWS because
|
|
877
|
+
of compliance requirements." "Response times must be under 200ms because
|
|
878
|
+
of the partner API contract."
|
|
879
|
+
|
|
880
|
+
- **Rejected alternatives when the rejection is non-obvious.** If
|
|
881
|
+
you considered GraphQL and picked REST for subtle reasons, record it —
|
|
882
|
+
otherwise someone will suggest GraphQL again in six months.
|