@rse/specbook 0.9.7 → 0.9.9

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,1484 @@
1
+ ##
2
+ ## Specification Book (SpecBook)
3
+ ## Copyright (c) 2026 Dr. Ralf S. Engelschall <rse@engelschall.com>
4
+ ## Licensed under Apache 2.0 <https://spdx.org/licenses/Apache-2.0>
5
+ ##
6
+
7
+ - kind: META
8
+ name: Title
9
+ id: TI
10
+ file: META-01-TI-Title.md
11
+ desc: >
12
+ The top-level specification meta information.
13
+ Some of the information is rendered onto the title page.
14
+ props:
15
+ - name: LOGO
16
+ desc: The logo of the specification.
17
+ optional: true
18
+ - name: TITLE
19
+ desc: The title of the specification.
20
+ - name: SUBTITLE
21
+ desc: The subtitle of the specification.
22
+ optional: true
23
+ - name: AUTHOR
24
+ desc: The author of the specification.
25
+ optional: true
26
+ - name: VERSION
27
+ desc: The version of the specification.
28
+ optional: true
29
+ - name: LANG
30
+ desc: The language of the specification texts (ISO 639-1 code).
31
+ value: /^[a-z]{2}(-[A-Za-z0-9]+)?$/
32
+ optional: true
33
+ - name: CHARSET
34
+ desc: The character set the embedded fonts are subsetted to.
35
+ value: enum(US-ASCII,ISO-8859-1,ISO-Latin-1,ISO-8859-15,ISO-Latin-15,UTF-8)
36
+ optional: true
37
+ - name: PAPER-SIZE
38
+ desc: The paper size the print/PDF rendering is targeted at.
39
+ value: enum(A4,Letter,Legal)
40
+ optional: true
41
+ - name: THEME-STYLE
42
+ desc: The theme style.
43
+ value: enum(dark,light)
44
+ optional: true
45
+ - name: THEME-TONE
46
+ desc: The theme color tone.
47
+ value: /^#[0-9a-fA-F]{6}$/
48
+ optional: true
49
+
50
+ - kind: SPEC
51
+ name: Solution Vision
52
+ id: SV
53
+ file: SPEC-01-SV-Solution-Vision.md
54
+ desc: >
55
+ The high-level, aspirational description of the solution, capturing its purpose, value
56
+ proposition, and the desired future state it aims to achieve.
57
+ childs:
58
+ - kind: ASPECT
59
+ desc: >
60
+ A single vision aspect, named with a short (2-5 word) summary and described in a
61
+ concise (1-3 sentence) paragraph in an aspirational but unambiguous tone.
62
+
63
+ Recommended aspects are `Purpose` (why the solution exists), `Target Audience` (who
64
+ it serves), `Value Proposition` (the unique benefit offered), `Differentiators` (how
65
+ it stands apart from alternatives), and `Future State` (the desired outcome once
66
+ adopted).
67
+
68
+ - kind: SPEC
69
+ name: User Personas
70
+ id: UP
71
+ file: SPEC-02-UP-User-Personas.md
72
+ desc: >
73
+ The *archetypal* user profiles representing distinct user groups, capturing their goals,
74
+ needs, behaviors, and context.
75
+ format:
76
+ maxTableColumns: 5
77
+ childs:
78
+ - kind: PERSONA
79
+ desc: >
80
+ An archetypal user profile, named with a per-artifact unique first name of the
81
+ fictional person and carrying a short, bold first-person quote -- written in the
82
+ persona's own voice, like a "tagline", "mantra", or "defining statement" -- that
83
+ captures their core attitude, motivation, frustration, or need in a single memorable
84
+ line.
85
+ props:
86
+ - name: GENDER
87
+ desc: >
88
+ The gender of the persona: `male`, `female`, or `diverse`.
89
+ value: enum(male,female,diverse)
90
+ - name: AGE
91
+ desc: The age in years of the persona.
92
+ value: /^[0-9]+$/
93
+ - name: ROLE
94
+ desc: The role of the persona.
95
+
96
+ - kind: SPEC
97
+ name: User Journey
98
+ id: UJ
99
+ file: SPEC-03-UJ-User-Journey.md
100
+ desc: >
101
+ The end-to-end experience a user has while discovering, adopting, and using the solution,
102
+ mapping their steps, touchpoints, and emotions over time.
103
+ diagram:
104
+ type: grid
105
+ nodes: "[[SPEC:UJ.JOURNEY:*]]"
106
+ properties:
107
+ - ACTOR
108
+ childs:
109
+ - kind: JOURNEY
110
+ desc: >
111
+ The end-to-end journey of a single persona (or of multiple personas sharing the same
112
+ experience as role variants), named with a 2-5 word summary of the pursued scenario.
113
+ props:
114
+ - name: ACTOR
115
+ desc: >
116
+ Comma-separated references to the User Personas objects experiencing the
117
+ journey.
118
+ value: list([[SPEC:UP.PERSONA:*]])
119
+ childs:
120
+ - kind: STEP
121
+ desc: >
122
+ A single step of the journey, named with a 5-10 word summary of the step at
123
+ its touchpoint.
124
+ props:
125
+ - name: STAGE
126
+ desc: >
127
+ The journey stage the step belongs to: `Awareness` (the actor is not
128
+ aware of the solution, but has a need), `Consideration` (the actor
129
+ is aware of the solution and considers its use), `Decision` (the
130
+ actor wants to pick the solution), `Onboarding` (the actor starts
131
+ using the solution), `Retention` (the actor stays a user in the long
132
+ term), or `Advocacy` (the actor is a fan of the solution and tells
133
+ others).
134
+ value: enum(Awareness,Consideration,Decision,Onboarding,Retention,Advocacy)
135
+ - name: GOAL
136
+ desc: What the actor wants to achieve at this step.
137
+ - name: TOUCHPOINT
138
+ desc: >
139
+ Where or how the interaction happens (e.g. landing page, email,
140
+ support call).
141
+ - name: ACTION
142
+ desc: What the actor actually does at this step.
143
+ - name: EMOTION
144
+ desc: >
145
+ The **AS IS** felt state at this step, given as a word plus an
146
+ intensity on a 1-5 Likert scale (e.g. `Curious (4)`).
147
+ value: /^.+ \([1-5]\)$/
148
+ - name: PAIN-POINT
149
+ desc: >
150
+ The **AS IS** friction or frustration the actor encounters at this
151
+ step.
152
+ optional: true
153
+
154
+ - kind: SPEC
155
+ name: Functional Requirements
156
+ id: FR
157
+ file: SPEC-04-FR-Functional-Requirements.md
158
+ desc: >
159
+ The concrete behaviors and capabilities the solution must provide, describing *what* the
160
+ system does in terms of functions, features, and operations.
161
+ diagram:
162
+ type: grid
163
+ nodes: "[[SPEC:FR.REQUIREMENT:*]]"
164
+ properties:
165
+ - PRIORITY
166
+ config:
167
+ size-node-width-max: 440
168
+ grid-columns-max: 5
169
+ childs:
170
+ - kind: REQUIREMENT
171
+ desc: >
172
+ A single functional requirement, named with a short (3-8 word) summary and described
173
+ in a concise (1-3 sentence) paragraph as *what* the solution must do, written with
174
+ the keyword `MUST`, `SHOULD`, `COULD`, or `WONT` to indicate the obligation level,
175
+ plus a 1-sentence rationale ("why").
176
+ props:
177
+ - name: PRIORITY
178
+ desc: >
179
+ The MoSCoW priority of the requirement: `MUST`, `SHOULD`, `COULD`, or
180
+ `WONT`. The `WONT` priority records a requirement deliberately excluded from
181
+ the current scope ("won't have this time"), preserving the conscious
182
+ decision rather than silently dropping it.
183
+ value: enum(MUST,SHOULD,COULD,WONT)
184
+
185
+ - kind: SPEC
186
+ name: Non-Functional Requirements
187
+ id: NR
188
+ file: SPEC-05-NR-Non-Functional-Requirements.md
189
+ desc: >
190
+ The quality attributes and constraints the solution must satisfy, such as performance,
191
+ security, scalability, reliability, and usability.
192
+ diagram:
193
+ type: grid
194
+ nodes: "[[SPEC:NR.REQUIREMENT:*]]"
195
+ properties:
196
+ - PRIORITY
197
+ - CATEGORY
198
+ config:
199
+ size-node-width-max: 440
200
+ grid-columns-max: 5
201
+ childs:
202
+ - kind: REQUIREMENT
203
+ desc: >
204
+ A single non-functional requirement, named with a short (3-8 word) summary and
205
+ described in a concise (1-3 sentence) paragraph as the quality attribute or
206
+ constraint the solution must satisfy, plus a 1-sentence rationale ("why").
207
+
208
+ The description especially *MUST* contain a *METRIC* within the `CATEGORY`, which
209
+ (according to the SMART principle) is the *specific*, *measurable*, *achievable*,
210
+ *relevant*, and *time-bound* threshold or target by which the requirement is judged
211
+ satisfied (e.g. `p95 latency < 200ms`, `99.9% uptime`).
212
+ props:
213
+ - name: PRIORITY
214
+ desc: >
215
+ The MoSCoW priority of the requirement: `MUST`, `SHOULD`, `COULD`, or
216
+ `WONT`. The `WONT` priority records a requirement deliberately excluded from
217
+ the current scope ("won't have this time"), preserving the conscious
218
+ decision rather than silently dropping it.
219
+ value: enum(MUST,SHOULD,COULD,WONT)
220
+ - name: CATEGORY
221
+ desc: >
222
+ The quality attribute category the requirement addresses, according to the
223
+ top-level characteristics of the ISO/IEC 25010:2023 Software-Quality Model
224
+ (except for `Functional Suitability`, which is covered by the Functional
225
+ Requirements instead).
226
+ value: enum(Performance,Compatibility,Usability,Reliability,Security,Safety,Maintainability,Flexibility,Compliance)
227
+
228
+ - kind: SPEC
229
+ name: Business Rules
230
+ id: BR
231
+ file: SPEC-06-BR-Business-Rules.md
232
+ desc: >
233
+ The domain invariants, policies, and decision logic that must always hold true in the
234
+ problem domain, independent of any single feature, constraining the Functional and
235
+ Non-Functional Requirements.
236
+ diagram:
237
+ type: grid
238
+ nodes: "[[SPEC:BR.RULE:*]]"
239
+ properties:
240
+ - CATEGORY
241
+ config:
242
+ size-node-width-max: 440
243
+ grid-columns-max: 5
244
+ childs:
245
+ - kind: RULE
246
+ desc: >
247
+ A single business rule, named with a short (3-8 word) summary and described in a
248
+ concise (1-3 sentence) paragraph stating the rule declaratively as a condition that
249
+ must hold, written with the keyword `MUST`, `SHOULD`, or `MUST NOT` to indicate the
250
+ obligation level and naming the domain terms it governs (as defined in the
251
+ Glossary), plus a 1-sentence rationale ("why").
252
+ props:
253
+ - name: CATEGORY
254
+ desc: >
255
+ The kind of rule: `Invariant` (a condition that must always hold),
256
+ `Constraint` (a limit on allowed values or actions), `Derivation` (a value
257
+ computed from others), or `Policy` (a deliberate business decision or
258
+ guideline).
259
+ value: enum(Invariant,Constraint,Derivation,Policy)
260
+ - name: CONSTRAINS
261
+ desc: >
262
+ Comma-separated references to the FUNCTIONAL-REQUIREMENTS or
263
+ NON-FUNCTIONAL-REQUIREMENTS objects the rule constrains.
264
+ value: list([[SPEC:FR.*]], [[SPEC:NR.*]])
265
+ optional: true
266
+
267
+ - kind: SPEC
268
+ name: Data Model
269
+ id: DM
270
+ file: SPEC-07-DM-Data-Model.md
271
+ desc: >
272
+ The structure of named entities, with named attributes and directed relationships, of the
273
+ data the solution manages, defining how information is organized and connected.
274
+ diagram:
275
+ type: graph
276
+ nodes: "[[SPEC:DM.ENTITY:*]]"
277
+ edges: "[[SPEC:DM.ENTITY:*.RELATION:*]]"
278
+ childs:
279
+ - kind: ENTITY
280
+ name: "[A-Z][a-zA-Z0-9]*"
281
+ desc: >
282
+ A named entity of the data model, carrying a Pascal-cased, 1-3 word long,
283
+ per-artifact unique name, and described by a 1-sentence description ("what") plus a
284
+ 1-sentence rationale ("why").
285
+ diagram:
286
+ type: hub
287
+ center: self
288
+ nodes: "[[SPEC:DM.ENTITY:*]]"
289
+ edges: "[[SPEC:DM.ENTITY:*.RELATION:*]]"
290
+ config:
291
+ size-node-width-max: 440
292
+ childs:
293
+ - kind: ATTRIBUTE
294
+ name: "[a-z][a-zA-Z0-9]*"
295
+ desc: >
296
+ A named attribute of the entity, carrying a camel-cased, 1-3 word long,
297
+ per-entity unique identifier, and described by a 1-sentence description
298
+ ("what") plus a 1-sentence rationale ("why").
299
+ props:
300
+ - name: TYPE
301
+ desc: >
302
+ The type of the entity attribute, one of `boolean`, `string`,
303
+ `integer`, `float`, `uuid`, `bytes`, `date`, `time`, `datetime`, or
304
+ `enum(XXX,YYY[,...])`, optionally prefixed with the qualifier
305
+ `unique` to indicate inclusion into the primary key of the entity,
306
+ and optionally suffixed with `?` to indicate an optional (nullable)
307
+ value.
308
+ value: /^(?:unique\s+)?(?:boolean|string|integer|float|uuid|bytes|date|time|datetime|enum\((?:[A-Za-z0-9_]+)(?:,\s*[A-Za-z0-9_]+)*\))(?:\?)?$/
309
+ - name: DEFAULT
310
+ desc: The default value of the entity attribute.
311
+ value: /.*/
312
+ optional: true
313
+ - kind: RELATION
314
+ name: "[a-z][a-zA-Z0-9]*"
315
+ desc: >
316
+ A named directed relation of the entity, carrying a camel-cased, 1-3 word
317
+ long, per-entity unique identifier and targeting another entity, and
318
+ described by a 1-sentence description ("what") plus a 1-sentence rationale
319
+ ("why").
320
+ optional: true
321
+ props:
322
+ - name: TYPE
323
+ desc: Reference to the DATA-MODEL entity the directed relation targets.
324
+ value: "[[SPEC:DM.ENTITY:*]]"
325
+ - name: ARITY
326
+ desc: >
327
+ The arity (cardinality) of the relation at the target entity: `0..1`
328
+ or `?` for zero or one ("optional"), `1` for exactly one
329
+ ("mandatory"), `0..n` or `*` for zero or more, `1..n` or `+` for one
330
+ or more, or `{n}`/`{n,m}` for an exact number or range.
331
+ value: /^(?:\?|\*|\+|\{\d+(?:,\d+)?\}|1|0\.\.1|0\.\.n|1\.\.n)$/
332
+ optional: true
333
+
334
+ - kind: SPEC
335
+ name: State Model
336
+ id: SM
337
+ file: SPEC-08-SM-State-Model.md
338
+ desc: >
339
+ For each entity with a non-trivial lifecycle, the legal states it can occupy and the
340
+ permitted transitions between them over its lifetime, making the forbidden moves as explicit
341
+ as the allowed ones.
342
+ diagram:
343
+ type: grid
344
+ nodes: "[[SPEC:SM.LIFECYCLE:*]]"
345
+ properties:
346
+ - ENTITY
347
+ config:
348
+ size-node-width-max: 440
349
+ grid-columns-max: 5
350
+ childs:
351
+ - kind: LIFECYCLE
352
+ desc: >
353
+ The lifecycle of a single entity, named with the short (1-3 word) name of the
354
+ lifecycle, normally the name of the entity it governs.
355
+ diagram:
356
+ type: graph
357
+ edges: "[[SPEC:SM.LIFECYCLE:*.TRANSITION:*]]"
358
+ edgeSource: FROM
359
+ edgeTarget: TO
360
+ onlyConnected: true
361
+ properties:
362
+ - INITIAL
363
+ - FINAL
364
+ config:
365
+ size-node-width-max: 440
366
+ props:
367
+ - name: ENTITY
368
+ desc: >
369
+ Reference to the DATA-MODEL entity whose lifecycle this models.
370
+ value: "[[SPEC:DM.ENTITY:*]]"
371
+ childs:
372
+ - kind: STATE
373
+ name: "[A-Z][a-zA-Z0-9]*"
374
+ desc: >
375
+ A single state the entity can occupy, carrying a short, Pascal-cased,
376
+ per-lifecycle unique name (e.g. `Draft`, `Shipped`) and described by a
377
+ 1-sentence description of what holds true in it.
378
+
379
+ Every state used in a transition *MUST* be declared, and every state with no
380
+ outgoing transition *MUST* be final (a non-final state with no outgoing
381
+ transition would be a stuck dead-end). The converse does *not* hold: a final
382
+ state *MAY* still have outgoing transitions, modeling a resting state that
383
+ can later be left again (e.g. a `Closed` state with a `reopen` transition
384
+ back to `Active`). Thus the final states are a superset of, but not
385
+ necessarily equal to, the states without outgoing transitions.
386
+ props:
387
+ - name: INITIAL
388
+ desc: >
389
+ Whether the state is the initial one, i.e. the single state every
390
+ instance of the entity enters upon creation.
391
+ value: /^(?:true|false)$/
392
+ optional: true
393
+ - name: FINAL
394
+ desc: >
395
+ Whether the state is a final one, i.e. a terminal state in which the
396
+ entity may legally come to rest permanently.
397
+ value: /^(?:true|false)$/
398
+ optional: true
399
+ - kind: TRANSITION
400
+ name: "[a-z]+"
401
+ desc: >
402
+ A single permitted transition between two states, named with the short,
403
+ lower-cased verb of the triggering event or action (e.g. `submit`, `ship`,
404
+ `cancel`) and described by a 1-sentence description of its side effect
405
+ ("what happens"), followed by a ", **WHEN** `<guard>`" clause stating the
406
+ condition that must hold for the transition to be permitted. Any move not
407
+ listed as a transition is implicitly forbidden.
408
+ props:
409
+ - name: FROM
410
+ desc: The state the transition departs from.
411
+ value: "[[SPEC:SM.LIFECYCLE:*.STATE:*]]"
412
+ - name: TO
413
+ desc: The state the transition arrives at.
414
+ value: "[[SPEC:SM.LIFECYCLE:*.STATE:*]]"
415
+
416
+ - kind: SPEC
417
+ name: Glossary
418
+ id: GL
419
+ file: SPEC-09-GL-Glossary.md
420
+ desc: >
421
+ The ubiquitous language of the domain, defining the meaning of each domain term in business
422
+ language, together with its synonyms and the ambiguities to avoid, shared consistently
423
+ across all Artifacts.
424
+ diagram:
425
+ type: grid
426
+ nodes: "[[SPEC:GL.TERM:*]]"
427
+ config:
428
+ size-node-width-max: 440
429
+ grid-columns-max: 5
430
+ childs:
431
+ - kind: TERM
432
+ desc: >
433
+ A single domain term, named with its canonical, preferred form (capitalized as it
434
+ should appear in all artifacts) and defined in a concise (1-3 sentence) paragraph in
435
+ business language, independent of any implementation, referencing other terms by
436
+ their name where helpful.
437
+ props:
438
+ - name: SYNONYMS
439
+ desc: >
440
+ Comma-separated list of alternative names or abbreviations that refer to the
441
+ same term but are *not* the preferred form.
442
+ optional: true
443
+
444
+ - kind: SPEC
445
+ name: Use Cases
446
+ id: UC
447
+ file: SPEC-10-UC-Use-Cases.md
448
+ desc: >
449
+ The discrete goals users pursue with the solution, each describing an actor's interaction to
450
+ achieve a specific outcome, together with the concrete step-by-step flows for main,
451
+ alternative, and exceptional paths.
452
+ diagram:
453
+ type: grid
454
+ nodes: "[[SPEC:UC.USE-CASE:*]]"
455
+ childs:
456
+ - kind: USE-CASE
457
+ desc: >
458
+ A discrete goal a user pursues with the solution, named with a short (3-8 word)
459
+ summary phrased as an actor goal (e.g. `Reset Forgotten Password`) and described in
460
+ a concise (1-3 sentence) paragraph at a glance, without prescribing the step-by-step
461
+ flow (which belongs to its `SCENARIO` objects).
462
+ diagram:
463
+ type: hub
464
+ center: self
465
+ nodes: "[[SPEC:UC.USE-CASE:*]], [[SPEC:UP.PERSONA:*]], [[SPEC:FR.REQUIREMENT:*]]"
466
+ qualified: true
467
+ config:
468
+ size-node-width-max: 440
469
+ props:
470
+ - name: ACTOR
471
+ desc: >
472
+ Reference to the PERSONAS object denoting the primary actor pursuing the
473
+ goal.
474
+ value: "[[SPEC:UP.PERSONA:*]]"
475
+ - name: REQUIREMENTS
476
+ desc: >
477
+ Comma-separated references to the FUNCTIONAL-REQUIREMENTS objects the use
478
+ case realizes.
479
+ value: list([[SPEC:FR.*]])
480
+ optional: true
481
+ - name: GOAL
482
+ desc: >
483
+ The 1-sentence statement of what the actor wants to achieve through this use
484
+ case.
485
+ - name: PRE-CONDITION
486
+ desc: >
487
+ The condition that must hold before the use case can begin.
488
+ optional: true
489
+ - name: POST-CONDITION
490
+ desc: >
491
+ The condition that holds after the use case completes successfully.
492
+ optional: true
493
+ childs:
494
+ - kind: SCENARIO
495
+ desc: >
496
+ A concrete step-by-step flow of the use case, named with a short (3-8 word)
497
+ summary and comprised of sequentially numbered, imperative steps, each
498
+ naming the acting party (actor or system) and the action taken (e.g. `The
499
+ user submits the login form.`).
500
+ props:
501
+ - name: TYPE
502
+ desc: >
503
+ The path the scenario represents: `Main` (the primary, happy-path
504
+ flow), `Alternative` (a valid but secondary flow), or `Exceptional`
505
+ (an error or failure-handling flow).
506
+ value: enum(Main,Alternative,Exceptional)
507
+
508
+ - kind: SPEC
509
+ name: Test Cases
510
+ id: TC
511
+ file: SPEC-11-TC-Test-Cases.md
512
+ desc: >
513
+ The verifiable conditions and steps used to confirm that requirements are correctly
514
+ implemented, with mandatory defined inputs, mandatory expected outcomes, and optional pre-
515
+ and post-conditions.
516
+ diagram:
517
+ type: grid
518
+ nodes: "[[SPEC:TC.TEST-CASE:*]]"
519
+ childs:
520
+ - kind: TEST-CASE
521
+ desc: >
522
+ A single verifiable test case, named with a short (3-8 word) summary and defined by
523
+ its mandatory input and expected outcome plus its optional pre- and post-conditions.
524
+ diagram:
525
+ type: hub
526
+ center: self
527
+ nodes: "[[SPEC:TC.TEST-CASE:*]], [[SPEC:FR.REQUIREMENT:*]], [[SPEC:NR.REQUIREMENT:*]]"
528
+ qualified: true
529
+ config:
530
+ size-node-width-max: 440
531
+ props:
532
+ - name: VERIFIES
533
+ desc: >
534
+ Reference to the FUNCTIONAL-REQUIREMENTS or NON-FUNCTIONAL-REQUIREMENTS
535
+ object the test case verifies.
536
+ value: "[[SPEC:*.REQUIREMENT:*]]"
537
+ - name: PRE-CONDITION
538
+ desc: >
539
+ The state or setup that must hold before the test is executed.
540
+ optional: true
541
+ - name: INPUT
542
+ desc: >
543
+ The mandatory, concrete input data or actions applied during the test.
544
+ - name: EXPECTED
545
+ desc: >
546
+ The mandatory, concrete expected outcome or observable result that defines a
547
+ passing test.
548
+ - name: POST-CONDITION
549
+ desc: >
550
+ The state that must hold after the test completes.
551
+ optional: true
552
+
553
+ - kind: SPEC
554
+ name: Interaction Concept
555
+ id: IC
556
+ file: SPEC-12-IC-Interaction-Concept.md
557
+ desc: >
558
+ The overarching idea of how users interact with the solution, describing the intended
559
+ workflows and interaction philosophy (e.g. auto-save behavior).
560
+ childs:
561
+ - kind: PRINCIPLE
562
+ desc: >
563
+ A single interaction principle, named with a short (2-5 word) summary (e.g.
564
+ `Auto-Save`, `Optimistic Updates`, `Undo over Confirm`) and described in a concise
565
+ (1-3 sentence) paragraph by how it governs the user's experience across the
566
+ solution, plus a 1-sentence rationale ("why").
567
+ props:
568
+ - name: CATEGORY
569
+ desc: The aspect of interaction the principle governs.
570
+ value: enum(Onboarding,Navigation,Input,Feedback,Workflow,Personalization,Awareness,Resilience,Privacy)
571
+
572
+ - kind: SPEC
573
+ name: Language Conventions
574
+ id: LC
575
+ file: SPEC-13-LC-Language-Conventions.md
576
+ desc: >
577
+ The terminology, naming, tone, and wording standards used consistently across the solution
578
+ and its content.
579
+ childs:
580
+ - kind: CONVENTION
581
+ desc: >
582
+ A single language convention, named with a short (2-5 word) summary and described in
583
+ a concise (1-3 sentence) paragraph as the convention to be applied consistently
584
+ across the solution, optionally illustrated by a short, concrete example of the
585
+ convention in practice.
586
+ props:
587
+ - name: CATEGORY
588
+ desc: >
589
+ The aspect of language the convention governs: `Terminology` (preferred and
590
+ forbidden terms), `Naming` (naming patterns), `Tone` (voice and register),
591
+ `Capitalization`, `Punctuation`, or `Formatting`.
592
+ value: enum(Terminology,Naming,Tone,Capitalization,Punctuation,Formatting)
593
+
594
+ - kind: SPEC
595
+ name: Dialog Patterns
596
+ id: DP
597
+ file: SPEC-14-DP-Dialog-Patterns.md
598
+ desc: >
599
+ The reusable interaction structures governing how the system and user exchange information
600
+ across recurring conversational or UI flows (e.g. master-detail dialog).
601
+ childs:
602
+ - kind: PATTERN
603
+ desc: >
604
+ A single reusable dialog pattern, named with a short (2-5 word) summary (e.g.
605
+ `Master-Detail`, `Wizard`, `Inline Edit`) and described in a concise (1-3 sentence)
606
+ paragraph by the interaction structure and how the system and user exchange
607
+ information within it, plus a 1-sentence rationale ("why") stating why this
608
+ particular structure is worth adopting -- the benefit it secures or the trade-off it
609
+ wins.
610
+ props:
611
+ - name: CONTEXT
612
+ desc: >
613
+ The recurring situation or flow in which the pattern is applied.
614
+ - name: PROBLEM
615
+ desc: >
616
+ The 1-sentence tension or difficulty the pattern resolves ("why is the
617
+ pattern needed"), stated independently of its solution (which belongs to the
618
+ description) and of its rationale (which states why this particular solution
619
+ is worth adopting).
620
+
621
+ - kind: SPEC
622
+ name: Dialog Storyboard
623
+ id: DS
624
+ file: SPEC-15-DS-Dialog-Storyboard.md
625
+ desc: >
626
+ The sequenced visual or textual depiction of a specific dialog flow, illustrating how an
627
+ interaction unfolds screen by screen or turn by turn.
628
+ diagram:
629
+ type: grid
630
+ nodes: "[[SPEC:DS.STORYBOARD:*]]"
631
+ childs:
632
+ - kind: STORYBOARD
633
+ desc: >
634
+ A single depicted dialog flow, named with a short (3-8 word) summary of the flow and
635
+ comprised of sequentially numbered frames.
636
+ diagram:
637
+ type: hub
638
+ center: self
639
+ nodes: "[[SPEC:DS.STORYBOARD:*]], [[SPEC:UC.USE-CASE:*]],
640
+ [[SPEC:UC.USE-CASE:*.SCENARIO:*]], [[SPEC:DP.PATTERN:*]]"
641
+ qualified: true
642
+ config:
643
+ size-node-width-max: 440
644
+ props:
645
+ - name: USE-CASE
646
+ desc: >
647
+ Reference to the USE-CASES object the storyboard visualizes.
648
+ value: "[[SPEC:UC.USE-CASE:*]]"
649
+ optional: true
650
+ - name: SCENARIO
651
+ desc: >
652
+ Reference to the USE-CASES scenario object the storyboard visualizes.
653
+ value: "[[SPEC:UC.USE-CASE:*.SCENARIO:*]]"
654
+ optional: true
655
+ - name: PATTERN
656
+ desc: >
657
+ Reference to the DIALOG-PATTERNS object the storyboard instantiates.
658
+ value: "[[SPEC:DP.PATTERN:*]]"
659
+ optional: true
660
+ childs:
661
+ - kind: FRAME
662
+ desc: >
663
+ A single frame of the storyboard, named with a short (2-5 word) label for
664
+ the screen, turn, or state depicted and described in a concise (1-2
665
+ sentence) paragraph by what the user sees and does at this frame of the
666
+ interaction.
667
+
668
+ - kind: SPEC
669
+ name: Visual Design
670
+ id: VD
671
+ file: SPEC-16-VD-Visual-Design.md
672
+ desc: >
673
+ The aesthetic and layout aspects of the solution, defining colors, typography, spacing,
674
+ imagery, and overall look and feel.
675
+ childs:
676
+ - kind: ELEMENT
677
+ desc: >
678
+ A single visual design element, named with a short (2-5 word) summary and described
679
+ in a concise (1-3 sentence) paragraph specifying the concrete values, tokens, or
680
+ rules that define it (e.g. palette, font family, scale), plus a 1-sentence rationale
681
+ ("why").
682
+ props:
683
+ - name: CATEGORY
684
+ desc: The aspects of visual design the element governs.
685
+ value: tags(Color,Typography,Iconography,Imagery,Layout,Animation)
686
+
687
+ - kind: ARCH
688
+ name: Context View
689
+ id: CV
690
+ file: ARCH-01-CV-Context-View.md
691
+ desc: >
692
+ The relationships, dependencies, and interactions between the solution and its environment,
693
+ defining the system's scope, external entities, and boundaries.
694
+ diagram:
695
+ type: grid
696
+ nodes: "[[ARCH:CV.ENTITY:*]]"
697
+ properties:
698
+ - KIND
699
+ - DIRECTION
700
+ childs:
701
+ - kind: ENTITY
702
+ desc: >
703
+ A single external entity the solution interacts with, named with a short (2-5 word)
704
+ summary (e.g. `Payment Gateway`, `Identity Provider`, `End User`) and described in a
705
+ concise (1-3 sentence) paragraph by the relationship and dependency between the
706
+ solution and the entity, plus a 1-sentence rationale ("why") for the entity being
707
+ part of the system context.
708
+ props:
709
+ - name: KIND
710
+ desc: |
711
+ The kind of the external entity, one of:
712
+ - `Person`: A human actor interacting with the solution.
713
+ - `System`: An external software system the solution integrates
714
+ with.
715
+ - `Service`: A third-party or managed service the solution consumes.
716
+ - `Datastore`: An external data repository the solution reads from or
717
+ writes to.
718
+ - `Device`: A physical device or sensor the solution communicates
719
+ with.
720
+ - `Organization`: An external organizational party.
721
+ value: enum(Person,System,Service,Datastore,Device,Organization)
722
+ - name: DIRECTION
723
+ desc: >
724
+ The flow of interaction relative to the solution: `Inbound` (the entity
725
+ drives the solution), `Outbound` (the solution drives the entity), or
726
+ `Bidirectional` (both directions).
727
+ value: enum(Inbound,Outbound,Bidirectional)
728
+ - name: INTERFACE
729
+ desc: >
730
+ How the interaction happens (e.g. REST API, message queue, file exchange,
731
+ web UI).
732
+ - name: DATA
733
+ desc: >
734
+ The principal information exchanged across the boundary with this entity.
735
+
736
+ - kind: ARCH
737
+ name: Functionality View
738
+ id: FV
739
+ file: ARCH-02-FV-Functionality-View.md
740
+ desc: >
741
+ The functional components of the solution, their responsibilities, interfaces, and primary
742
+ interactions, describing *what* the system does at runtime.
743
+ diagram:
744
+ type: graph
745
+ nodes: "[[ARCH:FV.COMPONENT:*]]"
746
+ properties:
747
+ - KIND
748
+ childs:
749
+ - kind: COMPONENT
750
+ desc: >
751
+ A single functional component, named with a short (2-5 word) summary (e.g.
752
+ `Authentication Service`, `Order Processor`, `Notification Dispatcher`) and
753
+ described in a concise (1-3 sentence) paragraph by *what* it does and how it
754
+ collaborates with the components it depends on, plus a 1-sentence rationale ("why")
755
+ for the component's existence and boundary.
756
+ diagram:
757
+ type: hub
758
+ center: self
759
+ nodes: "[[ARCH:FV.COMPONENT:*]]"
760
+ properties:
761
+ - KIND
762
+ config:
763
+ size-node-width-max: 440
764
+ props:
765
+ - name: KIND
766
+ desc: |
767
+ The kind of the functional component, one of:
768
+ - `Component`: Cohesive unit of functionality with a defined interface.
769
+ - `Service`: Independently deployable provider of functionality.
770
+ - `Module`: Logical grouping of related functionality within a
771
+ component.
772
+ - `Connector`: Mediator that conveys interactions between components
773
+ (e.g. bus, gateway).
774
+ - `Subsystem`: Larger composite grouping several components.
775
+ value: enum(Component,Service,Module,Connector,Subsystem)
776
+ - name: RESPONSIBILITY
777
+ desc: >
778
+ The 1-sentence statement of the single, primary responsibility the component
779
+ owns.
780
+ - name: INTERFACE
781
+ desc: >
782
+ How other components interact with this component (e.g. REST API, library
783
+ API, message topic, CLI).
784
+ - name: DEPENDS-ON
785
+ desc: >
786
+ Comma-separated references to the FUNCTIONALITY-VIEW objects this component
787
+ depends on at runtime.
788
+ value: list([[ARCH:FV.COMPONENT:*]])
789
+ optional: true
790
+
791
+ - kind: ARCH
792
+ name: Information View
793
+ id: IV
794
+ file: ARCH-03-IV-Information-View.md
795
+ desc: >
796
+ The way the solution stores, manages, manipulates, and distributes information, defining the
797
+ static data structure and dynamic information flow.
798
+ diagram:
799
+ type: grid
800
+ nodes: "[[ARCH:IV.ASPECT:*]]"
801
+ properties:
802
+ - CONCERN
803
+ childs:
804
+ - kind: ASPECT
805
+ desc: >
806
+ A single information aspect, named with a short (2-5 word) summary (e.g. `Order
807
+ Persistence`, `Event Stream`, `Cache Coherency`) and described in a concise (1-3
808
+ sentence) paragraph by how the solution stores, manages, or distributes the
809
+ information and how its consistency is upheld, plus a 1-sentence rationale ("why")
810
+ for handling the information this way.
811
+ diagram:
812
+ type: hub
813
+ center: self
814
+ nodes: "[[ARCH:IV.ASPECT:*]], [[SPEC:DM.ENTITY:*]], [[ARCH:FV.COMPONENT:*]]"
815
+ qualified: true
816
+ properties:
817
+ - CONCERN
818
+ config:
819
+ size-node-width-max: 440
820
+ props:
821
+ - name: CONCERN
822
+ desc: >
823
+ The information-handling concern the aspect addresses: `Persistence`,
824
+ `Flow`, `Ownership`, `Consistency`, `Replication`, `Caching`, `Retention`,
825
+ or `Migration`.
826
+ value: enum(Persistence,Flow,Ownership,Consistency,Replication,Caching,Retention,Migration)
827
+ - name: ENTITIES
828
+ desc: >
829
+ Comma-separated references to the DATA-MODEL entities the aspect governs.
830
+ value: list([[SPEC:DM.ENTITY:*]])
831
+ optional: true
832
+ - name: OWNER
833
+ desc: >
834
+ Reference to the FUNCTIONALITY-VIEW object that owns this information.
835
+ value: "[[ARCH:FV.COMPONENT:*]]"
836
+ optional: true
837
+ - name: LIFECYCLE
838
+ desc: >
839
+ How the information comes into being, changes, and is disposed of (e.g.
840
+ `created on order, retained 7 years, then purged`).
841
+
842
+ - kind: ARCH
843
+ name: Concurrency View
844
+ id: CO
845
+ file: ARCH-04-CO-Concurrency-View.md
846
+ desc: >
847
+ The concurrency structure of the solution, mapping functional components to processes and
848
+ threads, and defining how they coordinate and communicate.
849
+ diagram:
850
+ type: grid
851
+ nodes: "[[ARCH:CO.UNIT:*]]"
852
+ properties:
853
+ - KIND
854
+ childs:
855
+ - kind: UNIT
856
+ desc: >
857
+ A single concurrency unit, named with a short (2-5 word) summary (e.g. `Web Worker
858
+ Pool`, `Background Scheduler`, `Ingest Queue Consumer`) and described in a concise
859
+ (1-3 sentence) paragraph by how it executes and how it avoids or manages contention,
860
+ races, and deadlocks, plus a 1-sentence rationale ("why") for the chosen concurrency
861
+ structure.
862
+ diagram:
863
+ type: hub
864
+ center: self
865
+ nodes: "[[ARCH:CO.UNIT:*]], [[ARCH:FV.COMPONENT:*]]"
866
+ qualified: true
867
+ properties:
868
+ - KIND
869
+ config:
870
+ size-node-width-max: 440
871
+ props:
872
+ - name: KIND
873
+ desc: |
874
+ The kind of the concurrency unit, one of:
875
+
876
+ - `Process`: An independent OS process with its own address space.
877
+ - `Thread`: A thread of execution within a process.
878
+ - `Pool`: A managed group of interchangeable workers.
879
+ - `Queue`: An asynchronous buffer decoupling producers and consumers.
880
+ - `EventLoop`: A single-threaded cooperative scheduler of tasks.
881
+ value: enum(Process,Thread,Pool,Queue,EventLoop)
882
+ - name: HOSTS
883
+ desc: >
884
+ Comma-separated references to the FUNCTIONALITY-VIEW objects that run inside
885
+ this concurrency unit.
886
+ value: list([[ARCH:FV.COMPONENT:*]])
887
+ optional: true
888
+ - name: MULTIPLICITY
889
+ desc: >
890
+ How many instances of the unit run (e.g. `1`, `1 per CPU core`, `0..n
891
+ auto-scaled`).
892
+ - name: COORDINATION
893
+ desc: >
894
+ The mechanism by which the unit coordinates or communicates with other units
895
+ (e.g. `shared queue`, `mutex`, `message passing`, `optimistic locking`).
896
+
897
+ - kind: ARCH
898
+ name: Development View
899
+ id: DV
900
+ file: ARCH-05-DV-Development-View.md
901
+ desc: >
902
+ The architecture supporting the software development process, defining the module
903
+ organization, build approach, and codeline conventions.
904
+ diagram:
905
+ type: grid
906
+ nodes: "[[ARCH:DV.ASPECT:*]]"
907
+ childs:
908
+ - kind: ASPECT
909
+ desc: >
910
+ A single development aspect, named with a short (2-5 word) summary (e.g. `Module
911
+ Layering`, `Build Pipeline`, `Branching Model`) and described in a concise (1-3
912
+ sentence) paragraph by the development convention or structure and the rule
913
+ developers must follow, plus a 1-sentence rationale ("why").
914
+ props:
915
+ - name: CATEGORY
916
+ desc: >
917
+ The development concern the aspect governs: `Structure` (module/package
918
+ organization), `Build` (compilation and packaging), `Dependency` (dependency
919
+ management and layering rules), `Codeline` (branching, merging, versioning),
920
+ `Standardization` (coding standards and conventions), or `Tooling`
921
+ (development tools and automation).
922
+ value: enum(Structure,Build,Dependency,Codeline,Standardization,Tooling)
923
+
924
+ - kind: ARCH
925
+ name: Deployment View
926
+ id: DP
927
+ file: ARCH-06-DP-Deployment-View.md
928
+ desc: >
929
+ The environment into which the solution is deployed, mapping software elements to the
930
+ runtime platform, hardware, and network topology.
931
+ diagram:
932
+ type: grid
933
+ nodes: "[[ARCH:DP.NODE:*]]"
934
+ properties:
935
+ - KIND
936
+ - PLATFORM
937
+ childs:
938
+ - kind: NODE
939
+ desc: >
940
+ A single deployment node, named with a short (2-5 word) summary (e.g. `Web Tier`,
941
+ `Database Cluster`, `Edge CDN`) and described in a concise (1-3 sentence) paragraph
942
+ by the node, its sizing, and its place in the deployment topology, plus a 1-sentence
943
+ rationale ("why") for the node's placement and platform choice.
944
+ diagram:
945
+ type: hub
946
+ center: self
947
+ nodes: "[[ARCH:DP.NODE:*]], [[ARCH:FV.COMPONENT:*]]"
948
+ qualified: true
949
+ properties:
950
+ - KIND
951
+ - PLATFORM
952
+ config:
953
+ size-node-width-max: 440
954
+ props:
955
+ - name: KIND
956
+ desc: |
957
+ The kind of the deployment node, one of:
958
+
959
+ - `Server`: A physical or virtual machine.
960
+ - `Container`: A containerized runtime (e.g. Docker, OCI).
961
+ - `Cluster`: A managed group of nodes (e.g. Kubernetes cluster).
962
+ - `Function`: A serverless / function-as-a-service runtime.
963
+ - `Device`: An edge or client device.
964
+ - `Managed`: A managed cloud service (e.g. managed database, queue).
965
+ value: enum(Server,Container,Cluster,Function,Device,Managed)
966
+ - name: PLATFORM
967
+ desc: >
968
+ The runtime platform of the node (e.g. `Linux x86-64`, `Kubernetes 1.30`,
969
+ `AWS Lambda (Node.js)`).
970
+ - name: HOSTS
971
+ desc: >
972
+ Comma-separated references to the FUNCTIONALITY-VIEW objects deployed onto
973
+ this node.
974
+ value: list([[ARCH:FV.COMPONENT:*]])
975
+ optional: true
976
+ - name: NETWORK
977
+ desc: >
978
+ The network placement and connectivity of the node (e.g. `public subnet, TLS
979
+ 443`, `private VLAN`).
980
+
981
+ - kind: ARCH
982
+ name: Operations View
983
+ id: OV
984
+ file: ARCH-07-OV-Operations-View.md
985
+ desc: >
986
+ The way the solution is operated, administered, and supported in production, defining
987
+ installation, monitoring, and management concerns.
988
+ diagram:
989
+ type: grid
990
+ nodes: "[[ARCH:OV.CONCERN:*]]"
991
+ properties:
992
+ - CATEGORY
993
+ childs:
994
+ - kind: CONCERN
995
+ desc: >
996
+ A single operational concern, named with a short (2-5 word) summary (e.g. `Rolling
997
+ Deployment`, `Metrics Collection`, `Backup and Restore`) and described in a concise
998
+ (1-3 sentence) paragraph by how it is handled in production and which procedures or
999
+ tools support it, plus a 1-sentence rationale ("why") for the operational approach.
1000
+ props:
1001
+ - name: CATEGORY
1002
+ desc: >
1003
+ The category of the concern: `Installation`, `Configuration`,
1004
+ `Provisioning`, `Monitoring`, `Logging`, `Alerting`, `Backup`, `Recovery`,
1005
+ `Upgrade`, or `Support`.
1006
+ value: enum(Installation,Configuration,Provisioning,Monitoring,Logging,Alerting,Backup,Recovery,Upgrade,Support)
1007
+ - name: ELEMENT
1008
+ desc: >
1009
+ Comma-separated references to the FUNCTIONALITY-VIEW or DEPLOYMENT-VIEW
1010
+ objects the concern applies to.
1011
+ value: list([[ARCH:FV.COMPONENT:*]], [[ARCH:DP.NODE:*]])
1012
+ optional: true
1013
+
1014
+ - kind: ARCH
1015
+ name: Quality Perspectives
1016
+ id: QP
1017
+ file: ARCH-08-QP-Quality-Perspectives.md
1018
+ desc: >
1019
+ How the Non-Functional Requirements (NR) are addressed.
1020
+ diagram:
1021
+ type: grid
1022
+ nodes: "[[ARCH:QP.PERSPECTIVE:*]]"
1023
+ properties:
1024
+ - QUALITY
1025
+ childs:
1026
+ - kind: PERSPECTIVE
1027
+ desc: >
1028
+ A single quality perspective, named with a short (2-5 word) summary (e.g.
1029
+ `Horizontal Scaling`, `Defense in Depth`, `Graceful Degradation`) and described in a
1030
+ concise (1-3 sentence) paragraph by how the architecture satisfies the quality
1031
+ attribute across the affected elements, plus a 1-sentence rationale ("why") for the
1032
+ chosen tactic over alternatives.
1033
+ diagram:
1034
+ type: hub
1035
+ center: self
1036
+ nodes: "[[ARCH:QP.PERSPECTIVE:*]], [[SPEC:NR.REQUIREMENT:*]], [[ARCH:FV.COMPONENT:*]], [[ARCH:DP.NODE:*]]"
1037
+ qualified: true
1038
+ properties:
1039
+ - QUALITY
1040
+ config:
1041
+ size-node-width-max: 440
1042
+ props:
1043
+ - name: QUALITY
1044
+ desc: >
1045
+ The quality attribute the perspective addresses, a solution-oriented
1046
+ refinement of the NON-FUNCTIONAL-REQUIREMENTS categories which intentionally
1047
+ differs from them.
1048
+
1049
+ The NR categories follow the ISO/IEC 25010:2023 top-level characteristics
1050
+ (and include `Safety` and `Flexibility`), whereas the perspective qualities
1051
+ decompose some of these into the finer-grained, architecturally actionable
1052
+ attributes `Scalability`, `Availability`, `Privacy`, `Accessibility`, and
1053
+ `Portability`. The quality therefore need not match the category of the
1054
+ requirements it addresses.
1055
+ value: enum(Performance,Scalability,Reliability,Availability,Security,Privacy,Usability,Accessibility,Maintainability,Portability,Compatibility,Compliance)
1056
+ - name: ADDRESSES
1057
+ desc: >
1058
+ Comma-separated references to the NON-FUNCTIONAL-REQUIREMENTS objects the
1059
+ perspective addresses.
1060
+ value: list([[SPEC:NR.*]])
1061
+ - name: TACTIC
1062
+ desc: >
1063
+ The architectural tactic or strategy applied to achieve the quality (e.g.
1064
+ `stateless replication behind a load balancer`, `read-through cache`,
1065
+ `circuit breaker`).
1066
+ - name: AFFECTS
1067
+ desc: >
1068
+ Comma-separated references to the FUNCTIONALITY-VIEW or DEPLOYMENT-VIEW
1069
+ objects the tactic affects.
1070
+ value: list([[ARCH:FV.COMPONENT:*]], [[ARCH:DP.NODE:*]])
1071
+ optional: true
1072
+
1073
+ - kind: ARCH
1074
+ name: Decision Record
1075
+ id: DR
1076
+ file: ARCH-09-DR-Decision-Record.md
1077
+ desc: >
1078
+ The major decisions related to the architecture, each recording the forces at play, the
1079
+ chosen response, and the reasoning that justifies it.
1080
+ diagram:
1081
+ type: grid
1082
+ nodes: "[[ARCH:DR.DECISION:*]]"
1083
+ properties:
1084
+ - STATUS
1085
+ config:
1086
+ size-node-width-max: 440
1087
+ grid-columns-max: 5
1088
+ childs:
1089
+ - kind: DECISION
1090
+ desc: |
1091
+ A single architecture decision, named with a short summary of the decision, not
1092
+ longer than 80 characters, and recorded as its context (`WHEN`), the decision
1093
+ itself (`WHAT`), its rationale (`WHY`), and optional background (`NOTES`).
1094
+
1095
+ A decision *MUST* qualify on all of the following three tenets:
1096
+
1097
+ - **Hard to Reverse**: the cost of changing it later is meaningful ("Oh my god,
1098
+ this would result in a dramatic refactoring!"). So, if a decision is easy to
1099
+ reverse, just skip it.
1100
+
1101
+ - **Surprising without Context**: a future architect will look at the code and
1102
+ wonder ("Why on earth did they do it this way?"). So, if a decision is not
1103
+ surprising, nobody will wonder why.
1104
+
1105
+ - **Result of a Real Trade-Off**: there were genuine alternatives and one was
1106
+ picked for specific reasons ("We deliberately chose this, because..."). So, if
1107
+ there was no real alternative, there's nothing to record beyond "we did the
1108
+ obvious thing."
1109
+
1110
+ The following typically qualify as a decision:
1111
+
1112
+ - **Architectural shape.** "We're using a monorepo." "The write model is
1113
+ event-sourced, the read model is projected into PostgreSQL."
1114
+
1115
+ - **Integration patterns between contexts.** "Ordering and Billing communicate
1116
+ via domain events, not synchronous HTTP."
1117
+
1118
+ - **Technology choices that carry lock-in.** Database, message bus, auth
1119
+ provider, deployment target. Not every library - just the ones that would take
1120
+ a quarter to swap out.
1121
+
1122
+ - **Boundary and scope decisions.** "Customer data is owned by the Customer
1123
+ context; other contexts reference it by ID only." The explicit no's are as
1124
+ valuable as the yes's.
1125
+
1126
+ - **Deliberate deviations from the obvious path.** "We're using manual SQL
1127
+ instead of an ORM because X." Anything where a reasonable reader would assume
1128
+ the opposite. These stop the next engineer from "fixing" something that was
1129
+ deliberate.
1130
+
1131
+ - **Constraints not visible in the code.** "We can't use AWS because of
1132
+ compliance requirements." "Response times must be under 200ms because of the
1133
+ partner API contract."
1134
+
1135
+ - **Rejected alternatives when the rejection is non-obvious.** If you considered
1136
+ GraphQL and picked REST for subtle reasons, record it - otherwise someone will
1137
+ suggest GraphQL again in six months.
1138
+
1139
+ `WHEN`, `WHAT`, and `WHY` are each just a single paragraph of concise and brief
1140
+ prose text, usually comprised of just 1 to 3 sentences. The value of a decision is
1141
+ in recording *that* a decision was made and *why* - not in filling out sections of
1142
+ a document.
1143
+
1144
+ For the relationship between context, decision, and rationale, good checks are:
1145
+ the "litmus test" is that context = forces, decision = response to those forces,
1146
+ rationale = why the decision answers the forces in the context. The decision
1147
+ should feel like the natural, almost inevitable answer to the context - if a reader
1148
+ is surprised by the decision, either the context is missing a force, or the
1149
+ decision is under-justified. The rationale should make the decision feel earned,
1150
+ not asserted - if you delete the rationale and the decision suddenly looks
1151
+ arbitrary, the rationale was doing its job.
1152
+ diagram:
1153
+ type: hub
1154
+ center: self
1155
+ nodes: "[[ARCH:DR.DECISION:*]], [[ARCH:FV.COMPONENT:*]], [[ARCH:DP.NODE:*]]"
1156
+ qualified: true
1157
+ properties:
1158
+ - STATUS
1159
+ config:
1160
+ size-node-width-max: 440
1161
+ props:
1162
+ - name: STATUS
1163
+ desc: >
1164
+ The status of the decision: `proposed`, `accepted`, `deprecated`, or
1165
+ `superseded`.
1166
+ value: enum(proposed,accepted,deprecated,superseded)
1167
+ - name: AFFECTS
1168
+ desc: >
1169
+ Comma-separated references to the FUNCTIONALITY-VIEW or DEPLOYMENT-VIEW
1170
+ objects the decision affects.
1171
+ value: list([[ARCH:FV.COMPONENT:*]], [[ARCH:DP.NODE:*]])
1172
+ optional: true
1173
+ - name: SUPERSEDED-BY
1174
+ desc: >
1175
+ Reference to the DECISION-RECORD object that supersedes this decision.
1176
+ Should be present if and only if `STATUS` is `superseded`.
1177
+ value: "[[ARCH:DR.DECISION:*]]"
1178
+ optional: true
1179
+ - name: WHEN
1180
+ desc: |
1181
+ The **Context** of the decision: it captures the situation that forces the
1182
+ decision - the "why are we even talking about this" part. It describes the
1183
+ situation as it is, before the decision is made. The following usually
1184
+ goes into it:
1185
+
1186
+ - the problem or need (what's broken, missing, or about to change that
1187
+ requires a decision);
1188
+ - the forces at play (technical constraints, business requirements,
1189
+ deadlines, team skills, existing systems, regulatory/compliance
1190
+ pressures - often competing, and that tension is the whole point);
1191
+ - relevant facts (current architecture, prior decisions, assumptions,
1192
+ what's known and what's uncertain); and
1193
+ - scope/boundaries (what this decision is and isn't about).
1194
+
1195
+ It is written neutrally and factually. It should not contain the decision
1196
+ itself, nor advocate for an option - a reader should be able to read it,
1197
+ pause, and arrive at the decision themselves because the forces make it
1198
+ (nearly) inevitable.
1199
+ - name: WHAT
1200
+ desc: |
1201
+ The **Decision** itself: it states what is actually going to be done - the
1202
+ chosen response to the forces laid out in the context. It is written in
1203
+ active, assertive voice, in the present or imperative tense, as a committed
1204
+ position rather than a discussion. The following usually goes into it:
1205
+
1206
+ - the choice itself (clearly and unambiguously); and
1207
+ - the essence of how (enough of the approach to make the choice concrete
1208
+ - the mechanism, pattern, or technology - but not a full implementation
1209
+ specification).
1210
+
1211
+ It is a declaration, not a deliberation, usually using the wording "We
1212
+ use..." or "We do...", active, definite, owning the choice. Avoid hedging
1213
+ ("we might", "we could consider") - the deliberation already happened, the
1214
+ decision records the verdict.
1215
+ - name: WHY
1216
+ desc: |
1217
+ The **Rationale** of the decision: it is the reasoning that justifies the
1218
+ decision - the bridge that explains why this choice, given those forces. It
1219
+ answers "Of all the things we could have done, why was this the right
1220
+ one?". Where the context states the forces and the decision states the
1221
+ choice, the rationale is the logical connective tissue between them - it
1222
+ shows that the decision actually follows from the context. The following
1223
+ usually goes into it:
1224
+
1225
+ - the deciding factors (which forces from the context carried the most
1226
+ weight, and how the chosen option satisfies them best);
1227
+ - the trade-off reasoning (what was optimized for and what was knowingly
1228
+ sacrificed - naming the trade-off is the heart of rationale);
1229
+ - why the alternatives lost (the comparative argument: "option B failed
1230
+ on X, option C cost too much on Y"); and
1231
+ - assumptions and evidence (benchmarks, prior experience, constraints, or
1232
+ principles the reasoning rests on).
1233
+ - name: NOTES
1234
+ desc: |
1235
+ The **Background** of the decision: it is *OPTIONAL* and can be omitted
1236
+ when it does not add genuine value - most decisions won't need it. The
1237
+ following usually goes into it:
1238
+
1239
+ - information about the decision *process* (e.g. a weighted decision
1240
+ matrix of considered alternatives);
1241
+ - consequences of the decision (but only when non-obvious downstream
1242
+ effects need to be called out); and
1243
+ - links to strongly related decisions.
1244
+ optional: true
1245
+
1246
+ - kind: ARCH
1247
+ name: Technology Stack
1248
+ id: TS
1249
+ file: ARCH-10-TS-Technology-Stack.md
1250
+ desc: >
1251
+ The concrete technology products the solution is built upon, organized by tier and lifecycle
1252
+ phase, recording for each component its chosen product, its purpose, and the alternatives
1253
+ that were considered but not chosen.
1254
+ diagram:
1255
+ type: grid
1256
+ nodes: "[[ARCH:TS.TIER:*]]"
1257
+ childs:
1258
+ - kind: TIER
1259
+ name: (?:Client|Server|Middleware|Database)
1260
+ desc: |
1261
+ The architectural tier grouping the technology components belonging to it, one of:
1262
+
1263
+ - `Client`: Runs on the client side (e.g. browser, desktop, mobile).
1264
+ - `Server`: Runs on the server side (e.g. backend, application, API).
1265
+ - `Middleware`: Runs between client and server (e.g. message broker, gateway).
1266
+ - `Database`: Runs as the data store (e.g. relational or document database).
1267
+ format:
1268
+ maxTableColumns: 5
1269
+ diagram:
1270
+ type: hub
1271
+ center: self
1272
+ hierarchy: true
1273
+ properties:
1274
+ - PRODUCT
1275
+ config:
1276
+ size-node-width-max: 440
1277
+ childs:
1278
+ - kind: COMPONENT
1279
+ desc: >
1280
+ A single technology component, named with a short (2-5 word) summary (e.g.
1281
+ `UI Framework`, `Web Server`, `Relational Database`) and described in a
1282
+ concise (1-3 sentence) paragraph by how the product is used within the
1283
+ solution and how it fits into the overall technology stack, plus a
1284
+ 1-sentence rationale ("why") for choosing this product over the
1285
+ alternatives.
1286
+ props:
1287
+ - name: PRODUCT
1288
+ desc: >
1289
+ The concrete product, library, or framework chosen for this
1290
+ component (e.g. `VueJS`, `Node.js`, `PostgreSQL`).
1291
+ - name: ALTERNATIVES
1292
+ desc: >
1293
+ Comma-separated names of products which would also fit this
1294
+ component but were not chosen (e.g. `React, Svelte`).
1295
+ optional: true
1296
+ - name: COVERAGE
1297
+ desc: |
1298
+ A comma-separated list of either one or more of the *Client
1299
+ Aspects* or one or more of the *Server Aspects* (or their
1300
+ sub-aspects) defined below. The general goal is to achieve a
1301
+ maximum coverage of all aspects per `TIER` with the minimum
1302
+ total number of `PRODUCT`s.
1303
+
1304
+ The known *Client Aspects* which usually have to be covered (at
1305
+ least for clients in a Rich-Client architecture):
1306
+
1307
+ - **Interface Theme**:
1308
+ Style Reset, Shape, Color, Gradient, Shadow, Font, Icon.
1309
+
1310
+ - **Interface Widgets**:
1311
+ Icon, Label, Text Paragraph, Image, Form, Text-Field,
1312
+ Text-Area, Date Picker, Toggle, Radio Button, Checkbox,
1313
+ Select List, Slider, Progress Bar, Hyperlink, Popup Menu,
1314
+ Dropdown Menu, Toolbar, Tooltip, Tab, Pill, Breadcrumb,
1315
+ Pagination, Badge, Alert, Panel, Modal, Table, Scrollbar,
1316
+ Carousel.
1317
+
1318
+ - **Interface Layouting**:
1319
+ Responsive Design, Media Query, Frame, Grid, Padding, Border,
1320
+ Margin, Alignment, Force, Magnetism.
1321
+
1322
+ - **Interface Effects**:
1323
+ Transition, Transformation, Keyframes, Easing Function, Sound
1324
+ Effect, Physics.
1325
+
1326
+ - **Interface Interactions**:
1327
+ Mouse, Keyboard, Touchscreen, Gesture, Clipboard, Drag & Drop.
1328
+
1329
+ - **Interface States**:
1330
+ Rendered, Enabled, Visible, Focused, Warning, Error, Floating.
1331
+
1332
+ - **Interface Mask**:
1333
+ Markup Loading, Markup Generation, Virtual DOM, Text, Bitmaps,
1334
+ Vectors, 2D/3D Canvas, Accessibility.
1335
+
1336
+ - **Interface Internationalization**:
1337
+ Text Internationalization (I18N).
1338
+
1339
+ - **Data Conversion**:
1340
+ Value Formatting, Value Parsing, Localization (L10N).
1341
+
1342
+ - **Data Binding**:
1343
+ Reactive, Observer, Unidirectional, Bidirectional, Incremental.
1344
+
1345
+ - **Presentation Model**:
1346
+ Parameter Value, Command Value, State Value, Data Value, Event
1347
+ Value, Value Validation, Presentation Logic.
1348
+
1349
+ - **Dialog Navigation**:
1350
+ Deep Linking, Routing, Dialog Flow.
1351
+
1352
+ - **Dialog Automation**:
1353
+ Dialog Macros, Click-Through, Smoke Testing.
1354
+
1355
+ - **Dialog Communication**:
1356
+ Service, Event, Model, Socket, Hooks.
1357
+
1358
+ - **Dialog Life-Cycle**:
1359
+ Component States, Component State Transitions.
1360
+
1361
+ - **Dialog Structure**:
1362
+ Component, Model/View/Controller Roles, Hierarchical
1363
+ Composition.
1364
+
1365
+ - **State Persistence**:
1366
+ Local Storage, Cookies, Caching.
1367
+
1368
+ - **Business Model**:
1369
+ Entity, Field, Relationship, Universally Unique Identifiers
1370
+ (UUID).
1371
+
1372
+ - **Use-Case Authorization**:
1373
+ User Experience, Dialog Restriction, User, Group, Role,
1374
+ Use-Case, Data, Access.
1375
+
1376
+ - **Client Networking**:
1377
+ Request/Response, Synchronization, Push, Pull, Pulled-Push,
1378
+ REST, GraphQL, Authentication, Session.
1379
+
1380
+ - **Environment Detection**:
1381
+ Runtime Detection, Feature Detection.
1382
+
1383
+ The known *Server Aspects* which usually have to be covered (at
1384
+ least for servers, sometimes called Thin-Servers, in a Rich-Client
1385
+ architecture):
1386
+
1387
+ - **Environment Detection**:
1388
+ Detect the run-time environment, like underlying operating
1389
+ system, execution platform, network topology, feature toggles,
1390
+ etc.
1391
+
1392
+ - **Argument Parsing**:
1393
+ Parse options and arguments of the Command-Line Interface
1394
+ (CLI) to bootstrap application parameters.
1395
+
1396
+ - **Configuration Parsing**:
1397
+ Load and parse directives from a configuration file to
1398
+ bootstrap application parameters.
1399
+
1400
+ - **Process Daemonizing**:
1401
+ Detach from the startup terminal and host process in order to
1402
+ run fully independently.
1403
+
1404
+ - **Process Management**:
1405
+ (Pre-)fork child processes and/or threads of execution and
1406
+ monitor and control them during the life-cycle of the
1407
+ application.
1408
+
1409
+ - **Component Management**:
1410
+ Structure the code into components, instantiate them at
1411
+ run-time and manage them in a stateful component life-cycle.
1412
+
1413
+ - **Component Communication**:
1414
+ Provide inter-component communication mechanisms like events,
1415
+ hooks, registry, etc.
1416
+
1417
+ - **Server Networking**:
1418
+ Listen to network sockets, accept connections and manage
1419
+ request/response and message communication.
1420
+
1421
+ - **Peer Information**:
1422
+ Determine unique identification and add-on information about
1423
+ the client peer.
1424
+
1425
+ - **Session Handling**:
1426
+ Manage secured per-connection sessions to keep state between
1427
+ communication requests and/or client sessions.
1428
+
1429
+ - **User Authentication**:
1430
+ Determine and validate the unique identity of the user
1431
+ communicating over the current network connection.
1432
+
1433
+ - **Request Validation**:
1434
+ Validate the syntactical and semantical compliance of the
1435
+ requests and sanitize the requests.
1436
+
1437
+ - **Request Processing**:
1438
+ Process the request by dispatching execution according to the
1439
+ provided request and determined context information.
1440
+
1441
+ - **Role Authorization**:
1442
+ Determine whether the role of the current user is allowed to
1443
+ execute the current request.
1444
+
1445
+ - **Client Networking**:
1446
+ Provide mechanisms to connect to peers over the network and
1447
+ perform request/response and/or publish/subscribe
1448
+ communication.
1449
+
1450
+ - **Task Scheduling**:
1451
+ Schedule and execute recurring tasks independent of regular
1452
+ I/O operations.
1453
+
1454
+ - **Execution Tracing**:
1455
+ Provide mechanisms for tracing the execution by logging event
1456
+ and measurement information at certain points of interest.
1457
+
1458
+ - **Database Access**:
1459
+ Map in-memory domain entities onto a data-store-dependent
1460
+ persistent data structure.
1461
+
1462
+ - **Database Connectivity**:
1463
+ Locally or remotely connect the database access layer to the
1464
+ underlying data store.
1465
+
1466
+ - **Database Schema**:
1467
+ Create, update or downgrade the data schema inside the
1468
+ underlying data store.
1469
+
1470
+ - **Database Bootstrapping**:
1471
+ Create, update or downgrade both mandatory bootstrapping and
1472
+ optional domain-specific data inside the underlying data
1473
+ store.
1474
+ optional: true
1475
+ - name: WHEN
1476
+ desc: |
1477
+ The lifecycle phase in which the component is relevant, one of:
1478
+
1479
+ - `Build-Time`: Used during development, compilation, or
1480
+ packaging.
1481
+ - `Run-Time`: Used while the solution executes in production.
1482
+ value: enum(Build-Time,Run-Time)
1483
+ optional: true
1484
+