@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.
@@ -7,11 +7,20 @@ Architecture (ARCH)
7
7
  The **Artifact Set** **Architecture (ARCH)** specifies the "input"
8
8
  and the "how" of the Software Engineering project.
9
9
 
10
- Each **Artifact** of the **Artifact Set** **Architecture (ARCH)**
11
- is stored under `docs/arch/ARCH-<artifact-id/>-<artifact-slug/>.md`,
12
- relative to the project root directory, and with <artifact-slug/> being
13
- derived from <artifact-name/> (see below) by lower-casing and using `-`
14
- characters instead of spaces.
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.
15
24
 
16
25
  Each **Artifact** contains two timestamps: the <timestamp-created/>
17
26
  is the timestamp when this **Artifact** was created. The
@@ -26,41 +35,62 @@ The **Artifact Set** **Architecture (ARCH)** consists of the following
26
35
  distinct **Artifact**s (listed under their <artifact-name/> and their
27
36
  <artifact-id/>):
28
37
 
29
- - **Context View (CV)**:
38
+ 01. **Context View (CV)**:
30
39
  The relationships, dependencies, and interactions between the solution
31
40
  and its environment, defining the system's scope, external entities,
32
41
  and boundaries.
33
42
 
34
- - **Functionality View (FV)**:
35
- The functional elements of the solution, their responsibilities,
43
+ 02. **Functionality View (FV)**:
44
+ The functional components of the solution, their responsibilities,
36
45
  interfaces, and primary interactions, describing *what* the system does
37
46
  at runtime.
38
47
 
39
- - **Information View (IV)**:
48
+ 03. **Information View (IV)**:
40
49
  The way the solution stores, manages, manipulates, and distributes
41
50
  information, defining the static data structure and dynamic information
42
51
  flow.
43
52
 
44
- - **Concurrency View (CO)**:
45
- The concurrency structure of the solution, mapping functional elements
53
+ 04. **Concurrency View (CO)**:
54
+ The concurrency structure of the solution, mapping functional components
46
55
  to processes and threads, and defining how they coordinate and
47
56
  communicate.
48
57
 
49
- - **Development View (DV)**:
58
+ 05. **Development View (DV)**:
50
59
  The architecture supporting the software development process, defining
51
60
  the module organization, build approach, and codeline conventions.
52
61
 
53
- - **Deployment View (DP)**:
62
+ 06. **Deployment View (DP)**:
54
63
  The environment into which the solution is deployed, mapping software
55
64
  elements to the runtime platform, hardware, and network topology.
56
65
 
57
- - **Operations View (OV)**:
66
+ 07. **Operations View (OV)**:
58
67
  The way the solution is operated, administered, and supported in
59
68
  production, defining installation, monitoring, and management concerns.
60
69
 
61
- - **Quality Perspectives (QP)**:
70
+ 08. **Quality Perspectives (QP)**:
62
71
  How the Non-Functional Requirements (NR) are addressed.
63
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
+
64
94
  Context View (CV)
65
95
  -----------------
66
96
 
@@ -87,15 +117,15 @@ and boundaries.
87
117
 
88
118
  <format>
89
119
 
90
- ## ENTITY ARCH-CV-<arch-cv-entity-id/>: <arch-cv-entity-name/>
120
+ ## ENTITY: <arch-cv-entity-name/> <a id="ARCH-CV-<arch-cv-entity-id/>"></a>
91
121
 
92
122
  - Kind: <arch-cv-entity-kind/>
93
123
  - Direction: <arch-cv-entity-direction/>
94
124
  - Interface: <arch-cv-entity-interface/>
95
125
  - Data: <arch-cv-entity-data/>
96
126
 
97
- <arch-cv-entity-description/>
98
- (why: <arch-cv-entity-rationale/>)
127
+ <arch-cv-entity-description/>,
128
+ **BECAUSE** <arch-cv-entity-rationale/>.
99
129
 
100
130
  </format>
101
131
 
@@ -117,7 +147,7 @@ and boundaries.
117
147
  - `Service`: A third-party or managed service the solution consumes.
118
148
  - `Datastore`: An external data repository the solution reads from or writes to.
119
149
  - `Device`: A physical device or sensor the solution communicates with.
120
- - `Organization`: An external organizational party (e.g. regulator, vendor).
150
+ - `Organization`: An external organizational party.
121
151
 
122
152
  - <arch-cv-entity-direction/> is the flow of interaction relative to
123
153
  the solution: `Inbound` (entity drives the solution), `Outbound`
@@ -137,12 +167,12 @@ and boundaries.
137
167
  for the entity being part of the system context.
138
168
 
139
169
  - In case the rationale is not present, the
140
- entire `(why: [...])` chunk is omitted.
170
+ entire `, **BECAUSE** [...]` clause is omitted.
141
171
 
142
172
  Functionality View (FV)
143
173
  -----------------------
144
174
 
145
- The functional elements of the solution, their responsibilities,
175
+ The functional components of the solution, their responsibilities,
146
176
  interfaces, and primary interactions, describing *what* the system does
147
177
  at runtime.
148
178
 
@@ -155,69 +185,68 @@ at runtime.
155
185
  ✳ Created: **<timestamp-created/>**
156
186
  ✎ Modified: **<timestamp-modified/>**
157
187
 
158
- <arch-fv-element/>
159
- <arch-fv-element/>
188
+ <arch-fv-component/>
189
+ <arch-fv-component/>
160
190
  [...]
161
191
 
162
192
  </format>
163
193
 
164
- - <arch-fv-element/> format:
194
+ - <arch-fv-component/> format:
165
195
 
166
196
  <format>
167
197
 
168
- ## ELEMENT ARCH-FV-<arch-fv-element-id/>: <arch-fv-element-name/>
198
+ ## COMPONENT: <arch-fv-component-name/> <a id="ARCH-FV-<arch-fv-component-id/>"></a>
169
199
 
170
- - Kind: <arch-fv-element-kind/>
171
- - Responsibility: <arch-fv-element-responsibility/>
172
- - Interface: <arch-fv-element-interface/>
173
- - Depends On: <arch-fv-element-dependency/>, [...]
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/>, [...]
174
204
 
175
- <arch-fv-element-description/>
176
- (why: <arch-fv-element-rationale/>)
205
+ <arch-fv-component-description/>,
206
+ **BECAUSE** <arch-fv-component-rationale/>.
177
207
 
178
208
  </format>
179
209
 
180
- - <arch-fv-element/> details:
210
+ - <arch-fv-component/> details:
181
211
 
182
- - <arch-fv-element-id/>: per-artifact unique "slug" of always 1-3
212
+ - <arch-fv-component-id/>: per-artifact unique "slug" of always 1-3
183
213
  lower-cased words (concatenated with "-" characters and
184
214
  in total not longer than 30 characters), derived from
185
- <arch-fv-element-name/>.
215
+ <arch-fv-component-name/>.
186
216
 
187
- - <arch-fv-element-name/> is a short (2-5 word) summary of the
188
- functional element (e.g. `Authentication Service`, `Order
217
+ - <arch-fv-component-name/> is a short (2-5 word) summary of the
218
+ functional component (e.g. `Authentication Service`, `Order
189
219
  Processor`, `Notification Dispatcher`).
190
220
 
191
- - <arch-fv-element-kind/> is one of:
192
-
193
- - `Component`: A cohesive unit of functionality with a defined interface.
194
- - `Service`: An independently deployable provider of functionality.
195
- - `Module`: A logical grouping of related functionality within a component.
196
- - `Connector`: A mediator that conveys interactions between elements (e.g. bus, gateway).
197
- - `Subsystem`: A larger composite grouping several components.
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.
198
227
 
199
- - <arch-fv-element-responsibility/> is the 1-sentence statement of
200
- the single, primary responsibility the element owns.
228
+ - <arch-fv-component-responsibility/> is the 1-sentence statement of
229
+ the single, primary responsibility the component owns.
201
230
 
202
- - <arch-fv-element-interface/> is how other elements interact with
203
- this element (e.g. REST API, library API, message topic, CLI).
231
+ - <arch-fv-component-interface/> is how other components interact with
232
+ this component (e.g. REST API, library API, message topic, CLI).
204
233
 
205
- - <arch-fv-element-dependency/> is an `ARCH-FV-<arch-fv-element-id/>`
206
- reference to another functional element this element depends on
234
+ - <arch-fv-component-dependency/> is an `ARCH-FV-<arch-fv-component-id/>`
235
+ reference to another functional component this component depends on
207
236
  at runtime.
208
237
 
209
- - <arch-fv-element-description/> is a concise paragraph (1-3
210
- sentences) of prose describing *what* the element does and how it
211
- collaborates with the elements it depends on.
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.
212
241
 
213
- - <arch-fv-element-rationale/> is the 1-sentence rationale ("why")
214
- for the element's existence and boundary.
242
+ - <arch-fv-component-rationale/> is the 1-sentence rationale ("why")
243
+ for the component's existence and boundary.
215
244
 
216
- - In case an element has no dependencies at all, the
245
+ - In case a component has no dependencies at all, the
217
246
  entire `- Depends On:` bullet point is omitted.
218
247
 
219
248
  - In case the rationale is not present, the
220
- entire `(why: [...])` chunk is omitted.
249
+ entire `, **BECAUSE** [...]` clause is omitted.
221
250
 
222
251
  Information View (IV)
223
252
  ---------------------
@@ -245,15 +274,15 @@ flow.
245
274
 
246
275
  <format>
247
276
 
248
- ## ASPECT ARCH-IV-<arch-iv-aspect-id/>: <arch-iv-aspect-name/>
277
+ ## ASPECT: <arch-iv-aspect-name/> <a id="ARCH-IV-<arch-iv-aspect-id/>"></a>
249
278
 
250
279
  - Concern: <arch-iv-aspect-concern/>
251
280
  - Entities: <arch-iv-aspect-entity/>, [...]
252
281
  - Owner: <arch-iv-aspect-owner/>
253
282
  - Lifecycle: <arch-iv-aspect-lifecycle/>
254
283
 
255
- <arch-iv-aspect-description/>
256
- (why: <arch-iv-aspect-rationale/>)
284
+ <arch-iv-aspect-description/>,
285
+ **BECAUSE** <arch-iv-aspect-rationale/>.
257
286
 
258
287
  </format>
259
288
 
@@ -277,8 +306,8 @@ flow.
277
306
  reference to a corresponding entity of the Data Model **Artifact**
278
307
  the aspect governs.
279
308
 
280
- - <arch-iv-aspect-owner/> is an `ARCH-FV-<arch-fv-element-id/>`
281
- reference to the functional element that owns this information.
309
+ - <arch-iv-aspect-owner/> is an `ARCH-FV-<arch-fv-component-id/>`
310
+ reference to the functional component that owns this information.
282
311
 
283
312
  - <arch-iv-aspect-lifecycle/> is how the information comes into
284
313
  being, changes, and is disposed of (e.g. `created on order,
@@ -295,12 +324,12 @@ flow.
295
324
  respective bullet point is omitted.
296
325
 
297
326
  - In case the rationale is not present, the
298
- entire `(why: [...])` chunk is omitted.
327
+ entire `, **BECAUSE** [...]` clause is omitted.
299
328
 
300
329
  Concurrency View (CO)
301
330
  ---------------------
302
331
 
303
- The concurrency structure of the solution, mapping functional elements
332
+ The concurrency structure of the solution, mapping functional components
304
333
  to processes and threads, and defining how they coordinate and
305
334
  communicate.
306
335
 
@@ -323,15 +352,15 @@ communicate.
323
352
 
324
353
  <format>
325
354
 
326
- ## UNIT ARCH-CO-<arch-co-unit-id/>: <arch-co-unit-name/>
355
+ ## UNIT: <arch-co-unit-name/> <a id="ARCH-CO-<arch-co-unit-id/>"></a>
327
356
 
328
357
  - Kind: <arch-co-unit-kind/>
329
358
  - Hosts: <arch-co-unit-element/>, [...]
330
359
  - Multiplicity: <arch-co-unit-multiplicity/>
331
360
  - Coordination: <arch-co-unit-coordination/>
332
361
 
333
- <arch-co-unit-description/>
334
- (why: <arch-co-unit-rationale/>)
362
+ <arch-co-unit-description/>,
363
+ **BECAUSE** <arch-co-unit-rationale/>.
335
364
 
336
365
  </format>
337
366
 
@@ -354,8 +383,8 @@ communicate.
354
383
  - `Queue`: An asynchronous buffer decoupling producers and consumers.
355
384
  - `EventLoop`: A single-threaded cooperative scheduler of tasks.
356
385
 
357
- - <arch-co-unit-element/> is an `ARCH-FV-<arch-fv-element-id/>`
358
- reference to a functional element that runs inside this
386
+ - <arch-co-unit-element/> is an `ARCH-FV-<arch-fv-component-id/>`
387
+ reference to a functional component that runs inside this
359
388
  concurrency unit.
360
389
 
361
390
  - <arch-co-unit-multiplicity/> is how many instances of the unit run
@@ -372,11 +401,11 @@ communicate.
372
401
  - <arch-co-unit-rationale/> is the 1-sentence rationale ("why") for
373
402
  the chosen concurrency structure.
374
403
 
375
- - In case the unit hosts no functional elements, the
404
+ - In case the unit hosts no functional components, the
376
405
  entire `- Hosts:` bullet point is omitted.
377
406
 
378
407
  - In case the rationale is not present, the
379
- entire `(why: [...])` chunk is omitted.
408
+ entire `, **BECAUSE** [...]` clause is omitted.
380
409
 
381
410
  Development View (DV)
382
411
  ---------------------
@@ -403,12 +432,12 @@ the module organization, build approach, and codeline conventions.
403
432
 
404
433
  <format>
405
434
 
406
- ## ASPECT ARCH-DV-<arch-dv-aspect-id/>: <arch-dv-aspect-name/>
435
+ ## ASPECT: <arch-dv-aspect-name/> <a id="ARCH-DV-<arch-dv-aspect-id/>"></a>
407
436
 
408
437
  - Category: <arch-dv-aspect-category/>
409
438
 
410
- <arch-dv-aspect-description/>
411
- (why: <arch-dv-aspect-rationale/>)
439
+ <arch-dv-aspect-description/>,
440
+ **BECAUSE** <arch-dv-aspect-rationale/>.
412
441
 
413
442
  </format>
414
443
 
@@ -438,7 +467,7 @@ the module organization, build approach, and codeline conventions.
438
467
  for the development aspect.
439
468
 
440
469
  - In case the rationale is not present, the
441
- entire `(why: [...])` chunk is omitted.
470
+ entire `, **BECAUSE** [...]` clause is omitted.
442
471
 
443
472
  Deployment View (DP)
444
473
  --------------------
@@ -465,15 +494,15 @@ elements to the runtime platform, hardware, and network topology.
465
494
 
466
495
  <format>
467
496
 
468
- ## NODE ARCH-DP-<arch-dp-node-id/>: <arch-dp-node-name/>
497
+ ## NODE: <arch-dp-node-name/> <a id="ARCH-DP-<arch-dp-node-id/>"></a>
469
498
 
470
499
  - Kind: <arch-dp-node-kind/>
471
500
  - Platform: <arch-dp-node-platform/>
472
501
  - Hosts: <arch-dp-node-element/>, [...]
473
502
  - Network: <arch-dp-node-network/>
474
503
 
475
- <arch-dp-node-description/>
476
- (why: <arch-dp-node-rationale/>)
504
+ <arch-dp-node-description/>,
505
+ **BECAUSE** <arch-dp-node-rationale/>.
477
506
 
478
507
  </format>
479
508
 
@@ -499,8 +528,8 @@ elements to the runtime platform, hardware, and network topology.
499
528
  - <arch-dp-node-platform/> is the runtime platform of the node
500
529
  (e.g. `Linux x86-64`, `Kubernetes 1.30`, `AWS Lambda (Node.js)`).
501
530
 
502
- - <arch-dp-node-element/> is an `ARCH-FV-<arch-fv-element-id/>`
503
- reference to a functional element deployed onto this node.
531
+ - <arch-dp-node-element/> is an `ARCH-FV-<arch-fv-component-id/>`
532
+ reference to a functional component deployed onto this node.
504
533
 
505
534
  - <arch-dp-node-network/> is the network placement and connectivity
506
535
  of the node (e.g. `public subnet, TLS 443`, `private VLAN`).
@@ -512,11 +541,11 @@ elements to the runtime platform, hardware, and network topology.
512
541
  - <arch-dp-node-rationale/> is the 1-sentence rationale ("why") for
513
542
  the node's placement and platform choice.
514
543
 
515
- - In case the node hosts no functional elements, the
544
+ - In case the node hosts no functional components, the
516
545
  entire `- Hosts:` bullet point is omitted.
517
546
 
518
547
  - In case the rationale is not present, the
519
- entire `(why: [...])` chunk is omitted.
548
+ entire `, **BECAUSE** [...]` clause is omitted.
520
549
 
521
550
  Operations View (OV)
522
551
  --------------------
@@ -543,13 +572,13 @@ production, defining installation, monitoring, and management concerns.
543
572
 
544
573
  <format>
545
574
 
546
- ## CONCERN ARCH-OV-<arch-ov-concern-id/>: <arch-ov-concern-name/>
575
+ ## CONCERN: <arch-ov-concern-name/> <a id="ARCH-OV-<arch-ov-concern-id/>"></a>
547
576
 
548
577
  - Category: <arch-ov-concern-category/>
549
578
  - Element: <arch-ov-concern-element/>, [...]
550
579
 
551
- <arch-ov-concern-description/>
552
- (why: <arch-ov-concern-rationale/>)
580
+ <arch-ov-concern-description/>,
581
+ **BECAUSE** <arch-ov-concern-rationale/>.
553
582
 
554
583
  </format>
555
584
 
@@ -569,7 +598,7 @@ production, defining installation, monitoring, and management concerns.
569
598
  `Monitoring`, `Logging`, `Alerting`, `Backup`, `Recovery`,
570
599
  `Upgrade`, or `Support`.
571
600
 
572
- - <arch-ov-concern-element/> is an `ARCH-FV-<arch-fv-element-id/>`
601
+ - <arch-ov-concern-element/> is an `ARCH-FV-<arch-fv-component-id/>`
573
602
  or `ARCH-DP-<arch-dp-node-id/>` reference to the functional
574
603
  element or deployment node the concern applies to.
575
604
 
@@ -584,7 +613,7 @@ production, defining installation, monitoring, and management concerns.
584
613
  entire `- Element:` bullet point is omitted.
585
614
 
586
615
  - In case the rationale is not present, the
587
- entire `(why: [...])` chunk is omitted.
616
+ entire `, **BECAUSE** [...]` clause is omitted.
588
617
 
589
618
  Quality Perspectives (QP)
590
619
  -------------------------
@@ -610,15 +639,15 @@ How the Non-Functional Requirements (NR) are addressed.
610
639
 
611
640
  <format>
612
641
 
613
- ## PERSPECTIVE ARCH-QP-<arch-qp-perspective-id/>: <arch-qp-perspective-name/>
642
+ ## PERSPECTIVE: <arch-qp-perspective-name/> <a id="ARCH-QP-<arch-qp-perspective-id/>"></a>
614
643
 
615
644
  - Quality: <arch-qp-perspective-quality/>
616
645
  - Addresses: <arch-qp-perspective-requirement/>, [...]
617
646
  - Tactic: <arch-qp-perspective-tactic/>
618
647
  - Affects: <arch-qp-perspective-element/>, [...]
619
648
 
620
- <arch-qp-perspective-description/>
621
- (why: <arch-qp-perspective-rationale/>)
649
+ <arch-qp-perspective-description/>,
650
+ **BECAUSE** <arch-qp-perspective-rationale/>.
622
651
 
623
652
  </format>
624
653
 
@@ -649,7 +678,7 @@ How the Non-Functional Requirements (NR) are addressed.
649
678
  replication behind a load balancer`, `read-through cache`, `circuit
650
679
  breaker`).
651
680
 
652
- - <arch-qp-perspective-element/> is an `ARCH-FV-<arch-fv-element-id/>`
681
+ - <arch-qp-perspective-element/> is an `ARCH-FV-<arch-fv-component-id/>`
653
682
  or `ARCH-DP-<arch-dp-node-id/>` reference to the functional
654
683
  element or deployment node the tactic affects.
655
684
 
@@ -664,4 +693,190 @@ How the Non-Functional Requirements (NR) are addressed.
664
693
  entire `- Affects:` bullet point is omitted.
665
694
 
666
695
  - In case the rationale is not present, the
667
- entire `(why: [...])` chunk is omitted.
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.