@rse/specbook 0.9.8 → 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.
- package/README.md +14 -13
- package/dst/specbook-api.d.ts +5 -4
- package/dst/specbook-api.js +14 -10
- package/dst/specbook-cli.js +3 -2
- package/dst/specbook-cmd-describe.js +3 -6
- package/dst/specbook-cmd-lint.js +1 -1
- package/dst/specbook-format.md +6 -4
- package/dst/specbook-format.yaml +1484 -0
- package/dst/specbook-mcp.js +6 -3
- package/package.json +1 -1
|
@@ -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
|
+
|