@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.
@@ -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.