@rse/ase 0.9.62 → 0.9.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dst/ase-artifact.js +19 -8
- package/dst/ase-config.js +12 -8
- package/dst/ase-hook.js +9 -1
- package/dst/ase-service.js +2 -0
- package/dst/ase-spec.js +281 -0
- package/dst/ase.js +2 -0
- package/package.json +10 -8
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/.github/plugin/plugin.json +1 -1
- package/plugin/etc/stx.conf +5 -3
- package/plugin/meta/ase-format-meta.md +23 -105
- package/plugin/meta/ase-format-spec.md +22 -1326
- package/plugin/meta/ase-tenets.md +63 -4
- package/plugin/package.json +6 -2
- package/plugin/skills/ase-arch-analyze/help.md +7 -0
- package/plugin/skills/ase-arch-discover/help.md +7 -0
- package/plugin/skills/ase-code-analyze/help.md +8 -0
- package/plugin/skills/ase-code-craft/help.md +7 -0
- package/plugin/skills/ase-code-dissect/help.md +7 -0
- package/plugin/skills/ase-code-edit/SKILL.md +14 -9
- package/plugin/skills/ase-code-edit/help.md +7 -0
- package/plugin/skills/ase-code-explain/help.md +7 -0
- package/plugin/skills/ase-code-insight/help.md +7 -0
- package/plugin/skills/ase-code-lint/help.md +8 -0
- package/plugin/skills/ase-code-refactor/help.md +7 -0
- package/plugin/skills/ase-code-resolve/help.md +7 -0
- package/plugin/skills/ase-docs-distill/help.md +7 -0
- package/plugin/skills/ase-docs-proofread/help.md +7 -0
- package/plugin/skills/ase-help-intent/SKILL.md +66 -43
- package/plugin/skills/ase-help-intent/help.md +27 -16
- package/plugin/skills/ase-help-skill/catalog.md +3 -0
- package/plugin/skills/ase-help-skill/help.md +7 -0
- package/plugin/skills/ase-meta-brainstorm/help.md +8 -0
- package/plugin/skills/ase-meta-changelog/help.md +6 -0
- package/plugin/skills/ase-meta-chat/help.md +6 -0
- package/plugin/skills/ase-meta-commit/help.md +6 -0
- package/plugin/skills/ase-meta-compat/help.md +6 -0
- package/plugin/skills/ase-meta-config/help.md +7 -0
- package/plugin/skills/ase-meta-diaboli/help.md +7 -0
- package/plugin/skills/ase-meta-diff/help.md +7 -0
- package/plugin/skills/ase-meta-eli5/help.md +6 -0
- package/plugin/skills/ase-meta-evaluate/help.md +7 -0
- package/plugin/skills/ase-meta-proximity/help.md +7 -0
- package/plugin/skills/ase-meta-quorum/help.md +6 -0
- package/plugin/skills/ase-meta-quotes/help.md +7 -0
- package/plugin/skills/ase-meta-review/help.md +8 -1
- package/plugin/skills/ase-meta-search/help.md +6 -0
- package/plugin/skills/ase-meta-steelman/help.md +6 -0
- package/plugin/skills/ase-meta-why/help.md +7 -0
- package/plugin/skills/ase-meta-workflow/help.md +7 -0
- package/plugin/skills/ase-spec-edit/SKILL.md +520 -0
- package/plugin/skills/ase-spec-edit/help.md +137 -0
- package/plugin/skills/ase-sync-export/SKILL.md +66 -110
- package/plugin/skills/ase-sync-export/help.md +43 -40
- package/plugin/skills/ase-sync-import/SKILL.md +37 -15
- package/plugin/skills/ase-sync-import/help.md +21 -10
- package/plugin/skills/ase-sync-reconcile/SKILL.md +37 -16
- package/plugin/skills/ase-sync-reconcile/help.md +26 -16
- package/plugin/skills/ase-task-condense/help.md +6 -0
- package/plugin/skills/ase-task-delete/help.md +6 -0
- package/plugin/skills/ase-task-dissect/help.md +7 -0
- package/plugin/skills/ase-task-edit/help.md +7 -0
- package/plugin/skills/ase-task-grill/SKILL.md +5 -4
- package/plugin/skills/ase-task-grill/help.md +7 -0
- package/plugin/skills/ase-task-id/help.md +6 -0
- package/plugin/skills/ase-task-implement/help.md +7 -0
- package/plugin/skills/ase-task-list/help.md +6 -0
- package/plugin/skills/ase-task-preflight/help.md +7 -0
- package/plugin/skills/ase-task-reboot/help.md +6 -0
- package/plugin/skills/ase-task-rename/help.md +6 -0
- package/plugin/skills/ase-task-view/help.md +6 -0
- package/plugin/meta/ase-format-arch.md +0 -1164
|
@@ -1,1164 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
@./ase-format-meta.md
|
|
3
|
-
|
|
4
|
-
Architecture (ARCH)
|
|
5
|
-
===================
|
|
6
|
-
|
|
7
|
-
The **Artifact Set** **Architecture (ARCH)** specifies the "input"
|
|
8
|
-
and the "how" of the Software Engineering project.
|
|
9
|
-
|
|
10
|
-
Each **Artifact** of the **Artifact Set**
|
|
11
|
-
**Architecture (ARCH)** is stored under
|
|
12
|
-
`<basedir/>/ARCH-<artifact-no/>-<artifact-id/>-<artifact-slug/>.md`,
|
|
13
|
-
relative to the project root directory, with <basedir/> being the
|
|
14
|
-
`project.artifact.arch.basedir` config variable, <artifact-no/> being
|
|
15
|
-
the zero-padded, two-digit sequence number of the **Artifact** (starting
|
|
16
|
-
at `01`) according to the order of the **Artifact** list below, and with
|
|
17
|
-
<artifact-slug/> being derived from <artifact-name/> (see below) by
|
|
18
|
-
Pascal-casing each word (upper-casing its first letter) and using `-`
|
|
19
|
-
characters instead of spaces (e.g. `Context-View`).
|
|
20
|
-
|
|
21
|
-
The **Artifact Set** **Architecture (ARCH)** consists of the following
|
|
22
|
-
distinct **Artifact**s (listed under their <artifact-name/> and their
|
|
23
|
-
<artifact-id/>):
|
|
24
|
-
|
|
25
|
-
01. **Context View (CV)**:
|
|
26
|
-
The relationships, dependencies, and interactions between the solution
|
|
27
|
-
and its environment, defining the system's scope, external entities,
|
|
28
|
-
and boundaries.
|
|
29
|
-
|
|
30
|
-
02. **Functionality View (FV)**:
|
|
31
|
-
The functional components of the solution, their responsibilities,
|
|
32
|
-
interfaces, and primary interactions, describing *what* the system does
|
|
33
|
-
at runtime.
|
|
34
|
-
|
|
35
|
-
03. **Information View (IV)**:
|
|
36
|
-
The way the solution stores, manages, manipulates, and distributes
|
|
37
|
-
information, defining the static data structure and dynamic information
|
|
38
|
-
flow.
|
|
39
|
-
|
|
40
|
-
04. **Concurrency View (CO)**:
|
|
41
|
-
The concurrency structure of the solution, mapping functional components
|
|
42
|
-
to processes and threads, and defining how they coordinate and
|
|
43
|
-
communicate.
|
|
44
|
-
|
|
45
|
-
05. **Development View (DV)**:
|
|
46
|
-
The architecture supporting the software development process, defining
|
|
47
|
-
the module organization, build approach, and codeline conventions.
|
|
48
|
-
|
|
49
|
-
06. **Deployment View (DP)**:
|
|
50
|
-
The environment into which the solution is deployed, mapping software
|
|
51
|
-
elements to the runtime platform, hardware, and network topology.
|
|
52
|
-
|
|
53
|
-
07. **Operations View (OV)**:
|
|
54
|
-
The way the solution is operated, administered, and supported in
|
|
55
|
-
production, defining installation, monitoring, and management concerns.
|
|
56
|
-
|
|
57
|
-
08. **Quality Perspectives (QP)**:
|
|
58
|
-
How the Non-Functional Requirements (NR) are addressed.
|
|
59
|
-
|
|
60
|
-
09. **Decision Record (DR)**:
|
|
61
|
-
The major decisions related to the architecture, each recording the
|
|
62
|
-
forces at play, the chosen response, and the reasoning that justifies it.
|
|
63
|
-
|
|
64
|
-
10. **Technology Stack (TS)**:
|
|
65
|
-
The concrete technology products the solution is built upon, organized
|
|
66
|
-
by tier and lifecycle phase, recording for each component its chosen
|
|
67
|
-
product, its purpose, and the alternatives that were considered but not
|
|
68
|
-
chosen.
|
|
69
|
-
|
|
70
|
-
The **Artifact**s have the following cross-references:
|
|
71
|
-
|
|
72
|
-
```text
|
|
73
|
-
ARCH-03-IV Information View ──(entity)─► SPEC-07-DM Data Model
|
|
74
|
-
ARCH-03-IV Information View ──(owner)─► ARCH-02-FV Functionality View
|
|
75
|
-
ARCH-04-CO Concurrency View ──(hosts)─► ARCH-02-FV Functionality View
|
|
76
|
-
ARCH-06-DP Deployment View ──(hosts)─► ARCH-02-FV Functionality View
|
|
77
|
-
ARCH-07-OV Operations View ──(element)─► ARCH-02-FV Functionality View
|
|
78
|
-
ARCH-07-OV Operations View ──(element)─► ARCH-06-DP Deployment View
|
|
79
|
-
ARCH-08-QP Quality Perspectives ──(addresses)─► SPEC-05-NR Non-Functional Requirements
|
|
80
|
-
ARCH-08-QP Quality Perspectives ──(affects)─► ARCH-02-FV Functionality View
|
|
81
|
-
ARCH-08-QP Quality Perspectives ──(affects)─► ARCH-06-DP Deployment View
|
|
82
|
-
ARCH-09-DR Decision Record ──(affects)─► ARCH-02-FV Functionality View
|
|
83
|
-
ARCH-09-DR Decision Record ──(affects)─► ARCH-06-DP Deployment View
|
|
84
|
-
ARCH-10-TS Technology Stack ──(realizes)─► ARCH-02-FV Functionality View
|
|
85
|
-
ARCH-10-TS Technology Stack ──(realizes)─► ARCH-06-DP Deployment View
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
Context View (CV)
|
|
89
|
-
-----------------
|
|
90
|
-
|
|
91
|
-
The relationships, dependencies, and interactions between the solution
|
|
92
|
-
and its environment, defining the system's scope, external entities,
|
|
93
|
-
and boundaries.
|
|
94
|
-
|
|
95
|
-
- Format:
|
|
96
|
-
|
|
97
|
-
<format>
|
|
98
|
-
|
|
99
|
-
# ARCHITECTURE: CONTEXT VIEW (ARCH-CV)
|
|
100
|
-
|
|
101
|
-
✳ Created: **<timestamp-created/>**
|
|
102
|
-
✎ Modified: **<timestamp-modified/>**
|
|
103
|
-
|
|
104
|
-
<arch-cv-entity/>
|
|
105
|
-
<arch-cv-entity/>
|
|
106
|
-
[...]
|
|
107
|
-
|
|
108
|
-
</format>
|
|
109
|
-
|
|
110
|
-
- <arch-cv-entity/> format:
|
|
111
|
-
|
|
112
|
-
<format>
|
|
113
|
-
|
|
114
|
-
## ENTITY: <arch-cv-entity-name/> <a id="ARCH-CV-<arch-cv-entity-id/>"></a>
|
|
115
|
-
|
|
116
|
-
- Kind: <arch-cv-entity-kind/>
|
|
117
|
-
- Direction: <arch-cv-entity-direction/>
|
|
118
|
-
- Interface: <arch-cv-entity-interface/>
|
|
119
|
-
- Data: <arch-cv-entity-data/>
|
|
120
|
-
|
|
121
|
-
<arch-cv-entity-description/>,
|
|
122
|
-
**BECAUSE** <arch-cv-entity-rationale/>.
|
|
123
|
-
|
|
124
|
-
</format>
|
|
125
|
-
|
|
126
|
-
- <arch-cv-entity/> details:
|
|
127
|
-
|
|
128
|
-
- <arch-cv-entity-id/>: per-artifact unique "slug" of always 1-3
|
|
129
|
-
lower-cased words (concatenated with "-" characters and
|
|
130
|
-
in total not longer than 30 characters), derived from
|
|
131
|
-
<arch-cv-entity-name/>.
|
|
132
|
-
|
|
133
|
-
- <arch-cv-entity-name/> is a short (2-5 word) summary of the
|
|
134
|
-
external entity the solution interacts with (e.g. `Payment
|
|
135
|
-
Gateway`, `Identity Provider`, `End User`).
|
|
136
|
-
|
|
137
|
-
- <arch-cv-entity-kind/> is one of:
|
|
138
|
-
|
|
139
|
-
- `Person`: A human actor interacting with the solution.
|
|
140
|
-
- `System`: An external software system the solution integrates with.
|
|
141
|
-
- `Service`: A third-party or managed service the solution consumes.
|
|
142
|
-
- `Datastore`: An external data repository the solution reads from or writes to.
|
|
143
|
-
- `Device`: A physical device or sensor the solution communicates with.
|
|
144
|
-
- `Organization`: An external organizational party.
|
|
145
|
-
|
|
146
|
-
- <arch-cv-entity-direction/> is the flow of interaction relative to
|
|
147
|
-
the solution: `Inbound` (entity drives the solution), `Outbound`
|
|
148
|
-
(solution drives the entity), or `Bidirectional` (both directions).
|
|
149
|
-
|
|
150
|
-
- <arch-cv-entity-interface/> is how the interaction happens
|
|
151
|
-
(e.g. REST API, message queue, file exchange, web UI).
|
|
152
|
-
|
|
153
|
-
- <arch-cv-entity-data/> is the principal information exchanged
|
|
154
|
-
across the boundary with this entity.
|
|
155
|
-
|
|
156
|
-
- <arch-cv-entity-description/> is a concise paragraph (1-3
|
|
157
|
-
sentences) of prose describing the relationship and dependency
|
|
158
|
-
between the solution and the external entity.
|
|
159
|
-
|
|
160
|
-
- <arch-cv-entity-rationale/> is the 1-sentence rationale ("why")
|
|
161
|
-
for the entity being part of the system context.
|
|
162
|
-
|
|
163
|
-
- In case the rationale is not present, the
|
|
164
|
-
entire `, **BECAUSE** [...]` clause is omitted.
|
|
165
|
-
|
|
166
|
-
Functionality View (FV)
|
|
167
|
-
-----------------------
|
|
168
|
-
|
|
169
|
-
The functional components of the solution, their responsibilities,
|
|
170
|
-
interfaces, and primary interactions, describing *what* the system does
|
|
171
|
-
at runtime.
|
|
172
|
-
|
|
173
|
-
- Format:
|
|
174
|
-
|
|
175
|
-
<format>
|
|
176
|
-
|
|
177
|
-
# ARCHITECTURE: FUNCTIONALITY VIEW (ARCH-FV)
|
|
178
|
-
|
|
179
|
-
✳ Created: **<timestamp-created/>**
|
|
180
|
-
✎ Modified: **<timestamp-modified/>**
|
|
181
|
-
|
|
182
|
-
<arch-fv-component/>
|
|
183
|
-
<arch-fv-component/>
|
|
184
|
-
[...]
|
|
185
|
-
|
|
186
|
-
</format>
|
|
187
|
-
|
|
188
|
-
- <arch-fv-component/> format:
|
|
189
|
-
|
|
190
|
-
<format>
|
|
191
|
-
|
|
192
|
-
## COMPONENT: <arch-fv-component-name/> <a id="ARCH-FV-<arch-fv-component-id/>"></a>
|
|
193
|
-
|
|
194
|
-
- Kind: <arch-fv-component-kind/>
|
|
195
|
-
- Responsibility: <arch-fv-component-responsibility/>
|
|
196
|
-
- Interface: <arch-fv-component-interface/>
|
|
197
|
-
- Depends On: <arch-fv-component-dependency/>[, ...]
|
|
198
|
-
|
|
199
|
-
<arch-fv-component-description/>,
|
|
200
|
-
**BECAUSE** <arch-fv-component-rationale/>.
|
|
201
|
-
|
|
202
|
-
</format>
|
|
203
|
-
|
|
204
|
-
- <arch-fv-component/> details:
|
|
205
|
-
|
|
206
|
-
- <arch-fv-component-id/>: per-artifact unique "slug" of always 1-3
|
|
207
|
-
lower-cased words (concatenated with "-" characters and
|
|
208
|
-
in total not longer than 30 characters), derived from
|
|
209
|
-
<arch-fv-component-name/>.
|
|
210
|
-
|
|
211
|
-
- <arch-fv-component-name/> is a short (2-5 word) summary of the
|
|
212
|
-
functional component (e.g. `Authentication Service`, `Order
|
|
213
|
-
Processor`, `Notification Dispatcher`).
|
|
214
|
-
|
|
215
|
-
- <arch-fv-component-kind/> is one of:
|
|
216
|
-
- `Component`: Cohesive unit of functionality with a defined interface.
|
|
217
|
-
- `Service`: Independently deployable provider of functionality.
|
|
218
|
-
- `Module`: Logical grouping of related functionality within a component.
|
|
219
|
-
- `Connector`: Mediator that conveys interactions between components (e.g. bus, gateway).
|
|
220
|
-
- `Subsystem`: Larger composite grouping several components.
|
|
221
|
-
|
|
222
|
-
- <arch-fv-component-responsibility/> is the 1-sentence statement of
|
|
223
|
-
the single, primary responsibility the component owns.
|
|
224
|
-
|
|
225
|
-
- <arch-fv-component-interface/> is how other components interact with
|
|
226
|
-
this component (e.g. REST API, library API, message topic, CLI).
|
|
227
|
-
|
|
228
|
-
- <arch-fv-component-dependency/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
229
|
-
reference to another functional component this component depends on
|
|
230
|
-
at runtime.
|
|
231
|
-
|
|
232
|
-
- <arch-fv-component-description/> is a concise paragraph (1-3
|
|
233
|
-
sentences) of prose describing *what* the component does and how it
|
|
234
|
-
collaborates with the components it depends on.
|
|
235
|
-
|
|
236
|
-
- <arch-fv-component-rationale/> is the 1-sentence rationale ("why")
|
|
237
|
-
for the component's existence and boundary.
|
|
238
|
-
|
|
239
|
-
- In case a component has no dependencies at all, the
|
|
240
|
-
entire `- Depends On:` bullet point is omitted.
|
|
241
|
-
|
|
242
|
-
- In case the rationale is not present, the
|
|
243
|
-
entire `, **BECAUSE** [...]` clause is omitted.
|
|
244
|
-
|
|
245
|
-
Information View (IV)
|
|
246
|
-
---------------------
|
|
247
|
-
|
|
248
|
-
The way the solution stores, manages, manipulates, and distributes
|
|
249
|
-
information, defining the static data structure and dynamic information
|
|
250
|
-
flow.
|
|
251
|
-
|
|
252
|
-
- Format:
|
|
253
|
-
|
|
254
|
-
<format>
|
|
255
|
-
|
|
256
|
-
# ARCHITECTURE: INFORMATION VIEW (ARCH-IV)
|
|
257
|
-
|
|
258
|
-
✳ Created: **<timestamp-created/>**
|
|
259
|
-
✎ Modified: **<timestamp-modified/>**
|
|
260
|
-
|
|
261
|
-
<arch-iv-aspect/>
|
|
262
|
-
<arch-iv-aspect/>
|
|
263
|
-
[...]
|
|
264
|
-
|
|
265
|
-
</format>
|
|
266
|
-
|
|
267
|
-
- <arch-iv-aspect/> format:
|
|
268
|
-
|
|
269
|
-
<format>
|
|
270
|
-
|
|
271
|
-
## ASPECT: <arch-iv-aspect-name/> <a id="ARCH-IV-<arch-iv-aspect-id/>"></a>
|
|
272
|
-
|
|
273
|
-
- Concern: <arch-iv-aspect-concern/>
|
|
274
|
-
- Entities: <arch-iv-aspect-entity/>[, ...]
|
|
275
|
-
- Owner: <arch-iv-aspect-owner/>
|
|
276
|
-
- Lifecycle: <arch-iv-aspect-lifecycle/>
|
|
277
|
-
|
|
278
|
-
<arch-iv-aspect-description/>,
|
|
279
|
-
**BECAUSE** <arch-iv-aspect-rationale/>.
|
|
280
|
-
|
|
281
|
-
</format>
|
|
282
|
-
|
|
283
|
-
- <arch-iv-aspect/> details:
|
|
284
|
-
|
|
285
|
-
- <arch-iv-aspect-id/>: per-artifact unique "slug" of always 1-3
|
|
286
|
-
lower-cased words (concatenated with "-" characters and
|
|
287
|
-
in total not longer than 30 characters), derived from
|
|
288
|
-
<arch-iv-aspect-name/>.
|
|
289
|
-
|
|
290
|
-
- <arch-iv-aspect-name/> is a short (2-5 word) summary of the
|
|
291
|
-
information aspect (e.g. `Order Persistence`, `Event Stream`,
|
|
292
|
-
`Cache Coherency`).
|
|
293
|
-
|
|
294
|
-
- <arch-iv-aspect-concern/> is the information-handling concern the
|
|
295
|
-
aspect addresses, one of `Persistence`, `Flow`, `Ownership`,
|
|
296
|
-
`Consistency`, `Replication`, `Caching`, `Retention`, or
|
|
297
|
-
`Migration`.
|
|
298
|
-
|
|
299
|
-
- <arch-iv-aspect-entity/> is a `SPEC-DM-<spec-dm-entity-id/>`
|
|
300
|
-
reference to a corresponding entity of the Data Model **Artifact**
|
|
301
|
-
the aspect governs.
|
|
302
|
-
|
|
303
|
-
- <arch-iv-aspect-owner/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
304
|
-
reference to the functional component that owns this information.
|
|
305
|
-
|
|
306
|
-
- <arch-iv-aspect-lifecycle/> is how the information comes into
|
|
307
|
-
being, changes, and is disposed of (e.g. `created on order,
|
|
308
|
-
retained 7 years, then purged`).
|
|
309
|
-
|
|
310
|
-
- <arch-iv-aspect-description/> is a concise paragraph (1-3
|
|
311
|
-
sentences) of prose describing how the solution stores, manages,
|
|
312
|
-
or distributes the information and how its consistency is upheld.
|
|
313
|
-
|
|
314
|
-
- <arch-iv-aspect-rationale/> is the 1-sentence rationale ("why")
|
|
315
|
-
for handling the information this way.
|
|
316
|
-
|
|
317
|
-
- In case the entity or owner references are not present, the
|
|
318
|
-
respective bullet point is omitted.
|
|
319
|
-
|
|
320
|
-
- In case the rationale is not present, the
|
|
321
|
-
entire `, **BECAUSE** [...]` clause is omitted.
|
|
322
|
-
|
|
323
|
-
Concurrency View (CO)
|
|
324
|
-
---------------------
|
|
325
|
-
|
|
326
|
-
The concurrency structure of the solution, mapping functional components
|
|
327
|
-
to processes and threads, and defining how they coordinate and
|
|
328
|
-
communicate.
|
|
329
|
-
|
|
330
|
-
- Format:
|
|
331
|
-
|
|
332
|
-
<format>
|
|
333
|
-
|
|
334
|
-
# ARCHITECTURE: CONCURRENCY VIEW (ARCH-CO)
|
|
335
|
-
|
|
336
|
-
✳ Created: **<timestamp-created/>**
|
|
337
|
-
✎ Modified: **<timestamp-modified/>**
|
|
338
|
-
|
|
339
|
-
<arch-co-unit/>
|
|
340
|
-
<arch-co-unit/>
|
|
341
|
-
[...]
|
|
342
|
-
|
|
343
|
-
</format>
|
|
344
|
-
|
|
345
|
-
- <arch-co-unit/> format:
|
|
346
|
-
|
|
347
|
-
<format>
|
|
348
|
-
|
|
349
|
-
## UNIT: <arch-co-unit-name/> <a id="ARCH-CO-<arch-co-unit-id/>"></a>
|
|
350
|
-
|
|
351
|
-
- Kind: <arch-co-unit-kind/>
|
|
352
|
-
- Hosts: <arch-co-unit-element/>[, ...]
|
|
353
|
-
- Multiplicity: <arch-co-unit-multiplicity/>
|
|
354
|
-
- Coordination: <arch-co-unit-coordination/>
|
|
355
|
-
|
|
356
|
-
<arch-co-unit-description/>,
|
|
357
|
-
**BECAUSE** <arch-co-unit-rationale/>.
|
|
358
|
-
|
|
359
|
-
</format>
|
|
360
|
-
|
|
361
|
-
- <arch-co-unit/> details:
|
|
362
|
-
|
|
363
|
-
- <arch-co-unit-id/>: per-artifact unique "slug" of always 1-3
|
|
364
|
-
lower-cased words (concatenated with "-" characters and
|
|
365
|
-
in total not longer than 30 characters), derived from
|
|
366
|
-
<arch-co-unit-name/>.
|
|
367
|
-
|
|
368
|
-
- <arch-co-unit-name/> is a short (2-5 word) summary of the
|
|
369
|
-
concurrency unit (e.g. `Web Worker Pool`, `Background Scheduler`,
|
|
370
|
-
`Ingest Queue Consumer`).
|
|
371
|
-
|
|
372
|
-
- <arch-co-unit-kind/> is one of:
|
|
373
|
-
|
|
374
|
-
- `Process`: An independent OS process with its own address space.
|
|
375
|
-
- `Thread`: A thread of execution within a process.
|
|
376
|
-
- `Pool`: A managed group of interchangeable workers.
|
|
377
|
-
- `Queue`: An asynchronous buffer decoupling producers and consumers.
|
|
378
|
-
- `EventLoop`: A single-threaded cooperative scheduler of tasks.
|
|
379
|
-
|
|
380
|
-
- <arch-co-unit-element/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
381
|
-
reference to a functional component that runs inside this
|
|
382
|
-
concurrency unit.
|
|
383
|
-
|
|
384
|
-
- <arch-co-unit-multiplicity/> is how many instances of the unit run
|
|
385
|
-
(e.g. `1`, `1 per CPU core`, `0..n auto-scaled`).
|
|
386
|
-
|
|
387
|
-
- <arch-co-unit-coordination/> is the mechanism by which the unit
|
|
388
|
-
coordinates or communicates with other units (e.g. `shared queue`,
|
|
389
|
-
`mutex`, `message passing`, `optimistic locking`).
|
|
390
|
-
|
|
391
|
-
- <arch-co-unit-description/> is a concise paragraph (1-3 sentences)
|
|
392
|
-
of prose describing how the unit executes and how it avoids or
|
|
393
|
-
manages contention, races, and deadlocks.
|
|
394
|
-
|
|
395
|
-
- <arch-co-unit-rationale/> is the 1-sentence rationale ("why") for
|
|
396
|
-
the chosen concurrency structure.
|
|
397
|
-
|
|
398
|
-
- In case the unit hosts no functional components, the
|
|
399
|
-
entire `- Hosts:` bullet point is omitted.
|
|
400
|
-
|
|
401
|
-
- In case the rationale is not present, the
|
|
402
|
-
entire `, **BECAUSE** [...]` clause is omitted.
|
|
403
|
-
|
|
404
|
-
Development View (DV)
|
|
405
|
-
---------------------
|
|
406
|
-
|
|
407
|
-
The architecture supporting the software development process, defining
|
|
408
|
-
the module organization, build approach, and codeline conventions.
|
|
409
|
-
|
|
410
|
-
- Format:
|
|
411
|
-
|
|
412
|
-
<format>
|
|
413
|
-
|
|
414
|
-
# ARCHITECTURE: DEVELOPMENT VIEW (ARCH-DV)
|
|
415
|
-
|
|
416
|
-
✳ Created: **<timestamp-created/>**
|
|
417
|
-
✎ Modified: **<timestamp-modified/>**
|
|
418
|
-
|
|
419
|
-
<arch-dv-aspect/>
|
|
420
|
-
<arch-dv-aspect/>
|
|
421
|
-
[...]
|
|
422
|
-
|
|
423
|
-
</format>
|
|
424
|
-
|
|
425
|
-
- <arch-dv-aspect/> format:
|
|
426
|
-
|
|
427
|
-
<format>
|
|
428
|
-
|
|
429
|
-
## ASPECT: <arch-dv-aspect-name/> <a id="ARCH-DV-<arch-dv-aspect-id/>"></a>
|
|
430
|
-
|
|
431
|
-
- Category: <arch-dv-aspect-category/>
|
|
432
|
-
|
|
433
|
-
<arch-dv-aspect-description/>,
|
|
434
|
-
**BECAUSE** <arch-dv-aspect-rationale/>.
|
|
435
|
-
|
|
436
|
-
</format>
|
|
437
|
-
|
|
438
|
-
- <arch-dv-aspect/> details:
|
|
439
|
-
|
|
440
|
-
- <arch-dv-aspect-id/>: per-artifact unique "slug" of always 1-3
|
|
441
|
-
lower-cased words (concatenated with "-" characters and
|
|
442
|
-
in total not longer than 30 characters), derived from
|
|
443
|
-
<arch-dv-aspect-name/>.
|
|
444
|
-
|
|
445
|
-
- <arch-dv-aspect-name/> is a short (2-5 word) summary of the
|
|
446
|
-
development aspect (e.g. `Module Layering`, `Build Pipeline`,
|
|
447
|
-
`Branching Model`).
|
|
448
|
-
|
|
449
|
-
- <arch-dv-aspect-category/> is the development concern the aspect
|
|
450
|
-
governs, one of `Structure` (module/package organization),
|
|
451
|
-
`Build` (compilation and packaging), `Dependency` (dependency
|
|
452
|
-
management and layering rules), `Codeline` (branching, merging,
|
|
453
|
-
versioning), `Standardization` (coding standards and conventions),
|
|
454
|
-
or `Tooling` (development tools and automation).
|
|
455
|
-
|
|
456
|
-
- <arch-dv-aspect-description/> is a concise paragraph (1-3
|
|
457
|
-
sentences) of prose describing the development convention or
|
|
458
|
-
structure and the rule developers must follow.
|
|
459
|
-
|
|
460
|
-
- <arch-dv-aspect-rationale/> is the 1-sentence rationale ("why")
|
|
461
|
-
for the development aspect.
|
|
462
|
-
|
|
463
|
-
- In case the rationale is not present, the
|
|
464
|
-
entire `, **BECAUSE** [...]` clause is omitted.
|
|
465
|
-
|
|
466
|
-
Deployment View (DP)
|
|
467
|
-
--------------------
|
|
468
|
-
|
|
469
|
-
The environment into which the solution is deployed, mapping software
|
|
470
|
-
elements to the runtime platform, hardware, and network topology.
|
|
471
|
-
|
|
472
|
-
- Format:
|
|
473
|
-
|
|
474
|
-
<format>
|
|
475
|
-
|
|
476
|
-
# ARCHITECTURE: DEPLOYMENT VIEW (ARCH-DP)
|
|
477
|
-
|
|
478
|
-
✳ Created: **<timestamp-created/>**
|
|
479
|
-
✎ Modified: **<timestamp-modified/>**
|
|
480
|
-
|
|
481
|
-
<arch-dp-node/>
|
|
482
|
-
<arch-dp-node/>
|
|
483
|
-
[...]
|
|
484
|
-
|
|
485
|
-
</format>
|
|
486
|
-
|
|
487
|
-
- <arch-dp-node/> format:
|
|
488
|
-
|
|
489
|
-
<format>
|
|
490
|
-
|
|
491
|
-
## NODE: <arch-dp-node-name/> <a id="ARCH-DP-<arch-dp-node-id/>"></a>
|
|
492
|
-
|
|
493
|
-
- Kind: <arch-dp-node-kind/>
|
|
494
|
-
- Platform: <arch-dp-node-platform/>
|
|
495
|
-
- Hosts: <arch-dp-node-element/>[, ...]
|
|
496
|
-
- Network: <arch-dp-node-network/>
|
|
497
|
-
|
|
498
|
-
<arch-dp-node-description/>,
|
|
499
|
-
**BECAUSE** <arch-dp-node-rationale/>.
|
|
500
|
-
|
|
501
|
-
</format>
|
|
502
|
-
|
|
503
|
-
- <arch-dp-node/> details:
|
|
504
|
-
|
|
505
|
-
- <arch-dp-node-id/>: per-artifact unique "slug" of always 1-3
|
|
506
|
-
lower-cased words (concatenated with "-" characters and
|
|
507
|
-
in total not longer than 30 characters), derived from
|
|
508
|
-
<arch-dp-node-name/>.
|
|
509
|
-
|
|
510
|
-
- <arch-dp-node-name/> is a short (2-5 word) summary of the
|
|
511
|
-
deployment node (e.g. `Web Tier`, `Database Cluster`, `Edge CDN`).
|
|
512
|
-
|
|
513
|
-
- <arch-dp-node-kind/> is one of:
|
|
514
|
-
|
|
515
|
-
- `Server`: A physical or virtual machine.
|
|
516
|
-
- `Container`: A containerized runtime (e.g. Docker, OCI).
|
|
517
|
-
- `Cluster`: A managed group of nodes (e.g. Kubernetes cluster).
|
|
518
|
-
- `Function`: A serverless / function-as-a-service runtime.
|
|
519
|
-
- `Device`: An edge or client device.
|
|
520
|
-
- `Managed`: A managed cloud service (e.g. managed database, queue).
|
|
521
|
-
|
|
522
|
-
- <arch-dp-node-platform/> is the runtime platform of the node
|
|
523
|
-
(e.g. `Linux x86-64`, `Kubernetes 1.30`, `AWS Lambda (Node.js)`).
|
|
524
|
-
|
|
525
|
-
- <arch-dp-node-element/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
526
|
-
reference to a functional component deployed onto this node.
|
|
527
|
-
|
|
528
|
-
- <arch-dp-node-network/> is the network placement and connectivity
|
|
529
|
-
of the node (e.g. `public subnet, TLS 443`, `private VLAN`).
|
|
530
|
-
|
|
531
|
-
- <arch-dp-node-description/> is a concise paragraph (1-3 sentences)
|
|
532
|
-
of prose describing the node, its sizing, and its place in the
|
|
533
|
-
deployment topology.
|
|
534
|
-
|
|
535
|
-
- <arch-dp-node-rationale/> is the 1-sentence rationale ("why") for
|
|
536
|
-
the node's placement and platform choice.
|
|
537
|
-
|
|
538
|
-
- In case the node hosts no functional components, the
|
|
539
|
-
entire `- Hosts:` bullet point is omitted.
|
|
540
|
-
|
|
541
|
-
- In case the rationale is not present, the
|
|
542
|
-
entire `, **BECAUSE** [...]` clause is omitted.
|
|
543
|
-
|
|
544
|
-
Operations View (OV)
|
|
545
|
-
--------------------
|
|
546
|
-
|
|
547
|
-
The way the solution is operated, administered, and supported in
|
|
548
|
-
production, defining installation, monitoring, and management concerns.
|
|
549
|
-
|
|
550
|
-
- Format:
|
|
551
|
-
|
|
552
|
-
<format>
|
|
553
|
-
|
|
554
|
-
# ARCHITECTURE: OPERATIONS VIEW (ARCH-OV)
|
|
555
|
-
|
|
556
|
-
✳ Created: **<timestamp-created/>**
|
|
557
|
-
✎ Modified: **<timestamp-modified/>**
|
|
558
|
-
|
|
559
|
-
<arch-ov-concern/>
|
|
560
|
-
<arch-ov-concern/>
|
|
561
|
-
[...]
|
|
562
|
-
|
|
563
|
-
</format>
|
|
564
|
-
|
|
565
|
-
- <arch-ov-concern/> format:
|
|
566
|
-
|
|
567
|
-
<format>
|
|
568
|
-
|
|
569
|
-
## CONCERN: <arch-ov-concern-name/> <a id="ARCH-OV-<arch-ov-concern-id/>"></a>
|
|
570
|
-
|
|
571
|
-
- Category: <arch-ov-concern-category/>
|
|
572
|
-
- Element: <arch-ov-concern-element/>[, ...]
|
|
573
|
-
|
|
574
|
-
<arch-ov-concern-description/>,
|
|
575
|
-
**BECAUSE** <arch-ov-concern-rationale/>.
|
|
576
|
-
|
|
577
|
-
</format>
|
|
578
|
-
|
|
579
|
-
- <arch-ov-concern/> details:
|
|
580
|
-
|
|
581
|
-
- <arch-ov-concern-id/>: per-artifact unique "slug" of always 1-3
|
|
582
|
-
lower-cased words (concatenated with "-" characters and
|
|
583
|
-
in total not longer than 30 characters), derived from
|
|
584
|
-
<arch-ov-concern-name/>.
|
|
585
|
-
|
|
586
|
-
- <arch-ov-concern-name/> is a short (2-5 word) summary of the
|
|
587
|
-
operational concern (e.g. `Rolling Deployment`, `Metrics
|
|
588
|
-
Collection`, `Backup and Restore`).
|
|
589
|
-
|
|
590
|
-
- <arch-ov-concern-category/> is the category of the concern,
|
|
591
|
-
one of `Installation`, `Configuration`, `Provisioning`,
|
|
592
|
-
`Monitoring`, `Logging`, `Alerting`, `Backup`, `Recovery`,
|
|
593
|
-
`Upgrade`, or `Support`.
|
|
594
|
-
|
|
595
|
-
- <arch-ov-concern-element/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
596
|
-
or `ARCH-DP-<arch-dp-node-id/>` reference to the functional
|
|
597
|
-
element or deployment node the concern applies to.
|
|
598
|
-
|
|
599
|
-
- <arch-ov-concern-description/> is a concise paragraph (1-3
|
|
600
|
-
sentences) of prose describing how the concern is handled in
|
|
601
|
-
production and which procedures or tools support it.
|
|
602
|
-
|
|
603
|
-
- <arch-ov-concern-rationale/> is the 1-sentence rationale ("why")
|
|
604
|
-
for the operational approach.
|
|
605
|
-
|
|
606
|
-
- In case the element reference is not present, the
|
|
607
|
-
entire `- Element:` bullet point is omitted.
|
|
608
|
-
|
|
609
|
-
- In case the rationale is not present, the
|
|
610
|
-
entire `, **BECAUSE** [...]` clause is omitted.
|
|
611
|
-
|
|
612
|
-
Quality Perspectives (QP)
|
|
613
|
-
-------------------------
|
|
614
|
-
|
|
615
|
-
How the Non-Functional Requirements (NR) are addressed.
|
|
616
|
-
|
|
617
|
-
- Format:
|
|
618
|
-
|
|
619
|
-
<format>
|
|
620
|
-
|
|
621
|
-
# ARCHITECTURE: QUALITY PERSPECTIVES (ARCH-QP)
|
|
622
|
-
|
|
623
|
-
✳ Created: **<timestamp-created/>**
|
|
624
|
-
✎ Modified: **<timestamp-modified/>**
|
|
625
|
-
|
|
626
|
-
<arch-qp-perspective/>
|
|
627
|
-
<arch-qp-perspective/>
|
|
628
|
-
[...]
|
|
629
|
-
|
|
630
|
-
</format>
|
|
631
|
-
|
|
632
|
-
- <arch-qp-perspective/> format:
|
|
633
|
-
|
|
634
|
-
<format>
|
|
635
|
-
|
|
636
|
-
## PERSPECTIVE: <arch-qp-perspective-name/> <a id="ARCH-QP-<arch-qp-perspective-id/>"></a>
|
|
637
|
-
|
|
638
|
-
- Quality: <arch-qp-perspective-quality/>
|
|
639
|
-
- Addresses: <arch-qp-perspective-requirement/>[, ...]
|
|
640
|
-
- Tactic: <arch-qp-perspective-tactic/>
|
|
641
|
-
- Affects: <arch-qp-perspective-element/>[, ...]
|
|
642
|
-
|
|
643
|
-
<arch-qp-perspective-description/>,
|
|
644
|
-
**BECAUSE** <arch-qp-perspective-rationale/>.
|
|
645
|
-
|
|
646
|
-
</format>
|
|
647
|
-
|
|
648
|
-
- <arch-qp-perspective/> details:
|
|
649
|
-
|
|
650
|
-
- <arch-qp-perspective-id/>: per-artifact unique "slug" of always
|
|
651
|
-
1-3 lower-cased words (concatenated with "-" characters and
|
|
652
|
-
in total not longer than 30 characters), derived from
|
|
653
|
-
<arch-qp-perspective-name/>.
|
|
654
|
-
|
|
655
|
-
- <arch-qp-perspective-name/> is a short (2-5 word) summary of the
|
|
656
|
-
quality perspective (e.g. `Horizontal Scaling`, `Defense in
|
|
657
|
-
Depth`, `Graceful Degradation`).
|
|
658
|
-
|
|
659
|
-
- <arch-qp-perspective-quality/> is the quality attribute the
|
|
660
|
-
perspective addresses, one of `Performance`, `Scalability`,
|
|
661
|
-
`Reliability`, `Availability`, `Security`, `Privacy`,
|
|
662
|
-
`Usability`, `Accessibility`, `Maintainability`, `Portability`,
|
|
663
|
-
`Compatibility`, or `Compliance`. This enumeration is a
|
|
664
|
-
solution-oriented refinement of the Non-Functional Requirements
|
|
665
|
-
(NR) categories and intentionally differs from them: the NR
|
|
666
|
-
categories follow the ISO/IEC 25010:2023 top-level characteristics
|
|
667
|
-
(and include `Safety` and `Flexibility`), whereas the perspective
|
|
668
|
-
qualities decompose some of these into the finer-grained,
|
|
669
|
-
architecturally actionable attributes `Scalability`,
|
|
670
|
-
`Availability`, `Privacy`, `Accessibility`, and `Portability`. A
|
|
671
|
-
perspective's quality therefore need not match the category of the
|
|
672
|
-
`SPEC-NR-<spec-nr-requirement-id/>` it addresses.
|
|
673
|
-
|
|
674
|
-
- <arch-qp-perspective-requirement/> is a
|
|
675
|
-
`SPEC-NR-<spec-nr-requirement-id/>` reference to the corresponding
|
|
676
|
-
Non-Functional Requirement (NR) **Aspect** the perspective addresses.
|
|
677
|
-
|
|
678
|
-
- <arch-qp-perspective-tactic/> is the architectural tactic or
|
|
679
|
-
strategy applied to achieve the quality (e.g. `stateless
|
|
680
|
-
replication behind a load balancer`, `read-through cache`, `circuit
|
|
681
|
-
breaker`).
|
|
682
|
-
|
|
683
|
-
- <arch-qp-perspective-element/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
684
|
-
or `ARCH-DP-<arch-dp-node-id/>` reference to the functional
|
|
685
|
-
element or deployment node the tactic affects.
|
|
686
|
-
|
|
687
|
-
- <arch-qp-perspective-description/> is a concise paragraph (1-3
|
|
688
|
-
sentences) of prose describing how the architecture satisfies the
|
|
689
|
-
quality attribute across the affected elements.
|
|
690
|
-
|
|
691
|
-
- <arch-qp-perspective-rationale/> is the 1-sentence rationale
|
|
692
|
-
("why") for the chosen tactic over alternatives.
|
|
693
|
-
|
|
694
|
-
- In case the element reference is not present, the
|
|
695
|
-
entire `- Affects:` bullet point is omitted.
|
|
696
|
-
|
|
697
|
-
- In case the rationale is not present, the
|
|
698
|
-
entire `, **BECAUSE** [...]` clause is omitted.
|
|
699
|
-
|
|
700
|
-
Decision Record (DR)
|
|
701
|
-
--------------------
|
|
702
|
-
|
|
703
|
-
The major decisions related to the architecture, each recording the
|
|
704
|
-
forces at play, the chosen response, and the reasoning that justifies it.
|
|
705
|
-
|
|
706
|
-
- Format:
|
|
707
|
-
|
|
708
|
-
<format>
|
|
709
|
-
|
|
710
|
-
# ARCHITECTURE: DECISION RECORD (ARCH-DR)
|
|
711
|
-
|
|
712
|
-
✳ Created: **<timestamp-created/>**
|
|
713
|
-
✎ Modified: **<timestamp-modified/>**
|
|
714
|
-
|
|
715
|
-
<arch-dr-decision/>
|
|
716
|
-
<arch-dr-decision/>
|
|
717
|
-
[...]
|
|
718
|
-
|
|
719
|
-
</format>
|
|
720
|
-
|
|
721
|
-
- <arch-dr-decision/> format:
|
|
722
|
-
|
|
723
|
-
<format>
|
|
724
|
-
|
|
725
|
-
## DECISION: <arch-dr-decision-name/> <a id="ARCH-DR-<arch-dr-decision-id/>"></a>
|
|
726
|
-
|
|
727
|
-
- Status: <arch-dr-decision-status/>
|
|
728
|
-
- Affects: <arch-dr-decision-element/>[, ...]
|
|
729
|
-
- Superseded-By: <arch-dr-decision-superseded-by/>
|
|
730
|
-
- Created: <arch-dr-decision-created/>
|
|
731
|
-
- Modified: <arch-dr-decision-modified/>
|
|
732
|
-
|
|
733
|
-
- WHEN (Context):
|
|
734
|
-
<arch-dr-decision-context/>
|
|
735
|
-
|
|
736
|
-
- WHAT (Decision):
|
|
737
|
-
<arch-dr-decision-decision/>
|
|
738
|
-
|
|
739
|
-
- WHY (Rationale):
|
|
740
|
-
<arch-dr-decision-rationale/>
|
|
741
|
-
|
|
742
|
-
- NOTES (Background):
|
|
743
|
-
<arch-dr-decision-notes/>
|
|
744
|
-
|
|
745
|
-
</format>
|
|
746
|
-
|
|
747
|
-
- <arch-dr-decision/> details:
|
|
748
|
-
|
|
749
|
-
- <arch-dr-decision-id/>: per-artifact unique "slug" of always 1-3
|
|
750
|
-
lower-cased words (concatenated with "-" characters and
|
|
751
|
-
in total not longer than 30 characters), derived from
|
|
752
|
-
<arch-dr-decision-name/>.
|
|
753
|
-
|
|
754
|
-
- <arch-dr-decision-name/> is a short summary of the
|
|
755
|
-
<arch-dr-decision-decision/>, not longer than 80 characters.
|
|
756
|
-
|
|
757
|
-
- <arch-dr-decision-status/> is one of `proposed`, `accepted`,
|
|
758
|
-
`deprecated`, or `superseded`.
|
|
759
|
-
|
|
760
|
-
- <arch-dr-decision-element/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
761
|
-
or `ARCH-DP-<arch-dp-node-id/>` reference to the functional
|
|
762
|
-
element or deployment node the decision affects.
|
|
763
|
-
|
|
764
|
-
- <arch-dr-decision-superseded-by/> is an
|
|
765
|
-
`ARCH-DR-<arch-dr-decision-id/>` reference to the decision that
|
|
766
|
-
supersedes this decision. It is present if and only if the
|
|
767
|
-
<arch-dr-decision-status/> is `superseded`.
|
|
768
|
-
|
|
769
|
-
- <arch-dr-decision-created/> is the timestamp when this decision was
|
|
770
|
-
created, and <arch-dr-decision-modified/> is the timestamp when
|
|
771
|
-
this decision was last modified, both in the same ISO-style format
|
|
772
|
-
as the **Artifact**'s own timestamps.
|
|
773
|
-
|
|
774
|
-
- <arch-dr-decision-context/> captures the situation that forces the
|
|
775
|
-
decision - the "why are we even talking about this" part. It
|
|
776
|
-
describes the situation as it is, before the decision is made. The
|
|
777
|
-
following usually goes into it: the problem or need (what's broken,
|
|
778
|
-
missing, or about to change that requires a decision); the forces at
|
|
779
|
-
play (technical constraints, business requirements, deadlines, team
|
|
780
|
-
skills, existing systems, regulatory/compliance pressures - often
|
|
781
|
-
competing, and that tension is the whole point); relevant facts
|
|
782
|
-
(current architecture, prior decisions, assumptions, what's known
|
|
783
|
-
and what's uncertain); and scope/boundaries (what this decision is
|
|
784
|
-
and isn't about). It is written neutrally and factually. It should
|
|
785
|
-
not contain the decision itself, nor advocate for an option - a
|
|
786
|
-
reader should be able to read it, pause, and arrive at the decision
|
|
787
|
-
themselves because the forces make it (nearly) inevitable.
|
|
788
|
-
|
|
789
|
-
- <arch-dr-decision-decision/> states what is actually going to be
|
|
790
|
-
done - the chosen response to the forces laid out in the context. It
|
|
791
|
-
is written in active, assertive voice, in the present or imperative
|
|
792
|
-
tense, as a committed position rather than a discussion. The
|
|
793
|
-
following usually goes into it: the choice itself (clearly and
|
|
794
|
-
unambiguously) and the essence of how (enough of the approach to
|
|
795
|
-
make the choice concrete - the mechanism, pattern, or technology -
|
|
796
|
-
but not a full implementation specification). It is a declaration,
|
|
797
|
-
not a deliberation, usually using the wording "We use..." or "We
|
|
798
|
-
do...", active, definite, owning the choice. Avoid hedging ("we
|
|
799
|
-
might", "we could consider") - the deliberation already happened,
|
|
800
|
-
the decision records the verdict.
|
|
801
|
-
|
|
802
|
-
- <arch-dr-decision-rationale/> is the reasoning that justifies the
|
|
803
|
-
decision - the bridge that explains why this choice, given those
|
|
804
|
-
forces. It answers "Of all the things we could have done, why was
|
|
805
|
-
this the right one?". Where the context states the forces and the
|
|
806
|
-
decision states the choice, the rationale is the logical connective
|
|
807
|
-
tissue between them - it shows that the decision actually follows
|
|
808
|
-
from the context. The following usually goes into it: the deciding
|
|
809
|
-
factors (which forces from the context carried the most weight, and
|
|
810
|
-
how the chosen option satisfies them best); the trade-off reasoning
|
|
811
|
-
(what was optimized for and what was knowingly sacrificed - naming
|
|
812
|
-
the trade-off is the heart of rationale); why the alternatives lost
|
|
813
|
-
(the comparative argument: "option B failed on X, option C cost too
|
|
814
|
-
much on Y"); and assumptions and evidence (benchmarks, prior
|
|
815
|
-
experience, constraints, or principles the reasoning rests on).
|
|
816
|
-
|
|
817
|
-
- <arch-dr-decision-notes/> is *OPTIONAL* and can be omitted when it
|
|
818
|
-
does not add genuine value - most decisions won't need it. The
|
|
819
|
-
following usually goes into it: information about the decision *process*
|
|
820
|
-
(e.g. a weighted decision matrix of considered alternatives);
|
|
821
|
-
consequences of the decision (but only when non-obvious downstream
|
|
822
|
-
effects need to be called out); and links to strongly related
|
|
823
|
-
decisions.
|
|
824
|
-
|
|
825
|
-
- <arch-dr-decision-context/>, <arch-dr-decision-decision/>, and
|
|
826
|
-
<arch-dr-decision-rationale/> are each just a single paragraph of
|
|
827
|
-
concise and brief prose text, usually comprised of just 1 to 3
|
|
828
|
-
sentences. The value of a decision is in recording *that* a decision
|
|
829
|
-
was made and *why* - not in filling out sections of a document.
|
|
830
|
-
|
|
831
|
-
- For the relationship between context, decision, and rationale, good
|
|
832
|
-
checks are: the "litmus test" is that context = forces, decision =
|
|
833
|
-
response to those forces, rationale = why the decision answers the
|
|
834
|
-
forces in the context. The decision should feel like the natural,
|
|
835
|
-
almost inevitable answer to the context - if a reader is surprised
|
|
836
|
-
by the decision, either the context is missing a force, or the
|
|
837
|
-
decision is under-justified. The rationale should make the decision
|
|
838
|
-
feel earned, not asserted - if you delete the rationale and
|
|
839
|
-
the decision suddenly looks arbitrary, the rationale was doing its
|
|
840
|
-
job.
|
|
841
|
-
|
|
842
|
-
- In case the element reference is not present, the
|
|
843
|
-
entire `- Affects:` bullet point is omitted.
|
|
844
|
-
|
|
845
|
-
- In case the <arch-dr-decision-status/> is not `superseded`, the
|
|
846
|
-
entire `- Superseded-By:` bullet point is omitted.
|
|
847
|
-
|
|
848
|
-
- In case the `NOTES (Background)` content is not present, the
|
|
849
|
-
entire `NOTES (Background)` chunk is omitted.
|
|
850
|
-
|
|
851
|
-
- A decision *MUST* qualify on all of the following three tenets:
|
|
852
|
-
|
|
853
|
-
- **Hard to Reverse**: the cost of changing it later is meaningful
|
|
854
|
-
("Oh my god, this would result in a dramatic refactoring!"). So,
|
|
855
|
-
if a decision is easy to reverse, just skip it.
|
|
856
|
-
|
|
857
|
-
- **Surprising without Context**: a future architect will look at
|
|
858
|
-
the code and wonder ("Why on earth did they do it this way?").
|
|
859
|
-
So, if a decision is not surprising, nobody will wonder why.
|
|
860
|
-
|
|
861
|
-
- **Result of a Real Trade-Off**: there were genuine alternatives
|
|
862
|
-
and one was picked for specific reasons ("We deliberately chose
|
|
863
|
-
this, because..."). So, if there was no real alternative,
|
|
864
|
-
there's nothing to record beyond "we did the obvious thing."
|
|
865
|
-
|
|
866
|
-
- The following typically qualify as a decision:
|
|
867
|
-
|
|
868
|
-
- **Architectural shape.** "We're using a monorepo." "The write
|
|
869
|
-
model is event-sourced, the read model is projected into PostgreSQL."
|
|
870
|
-
|
|
871
|
-
- **Integration patterns between contexts.** "Ordering and Billing
|
|
872
|
-
communicate via domain events, not synchronous HTTP."
|
|
873
|
-
|
|
874
|
-
- **Technology choices that carry lock-in.** Database, message bus,
|
|
875
|
-
auth provider, deployment target. Not every library - just the
|
|
876
|
-
ones that would take a quarter to swap out.
|
|
877
|
-
|
|
878
|
-
- **Boundary and scope decisions.** "Customer data is owned by the
|
|
879
|
-
Customer context; other contexts reference it by ID only." The explicit
|
|
880
|
-
no's are as valuable as the yes's.
|
|
881
|
-
|
|
882
|
-
- **Deliberate deviations from the obvious path.** "We're using
|
|
883
|
-
manual SQL instead of an ORM because X." Anything where a reasonable
|
|
884
|
-
reader would assume the opposite. These stop the next engineer from
|
|
885
|
-
"fixing" something that was deliberate.
|
|
886
|
-
|
|
887
|
-
- **Constraints not visible in the code.** "We can't use AWS because
|
|
888
|
-
of compliance requirements." "Response times must be under 200ms because
|
|
889
|
-
of the partner API contract."
|
|
890
|
-
|
|
891
|
-
- **Rejected alternatives when the rejection is non-obvious.** If
|
|
892
|
-
you considered GraphQL and picked REST for subtle reasons, record it -
|
|
893
|
-
otherwise someone will suggest GraphQL again in six months.
|
|
894
|
-
|
|
895
|
-
Technology Stack (TS)
|
|
896
|
-
---------------------
|
|
897
|
-
|
|
898
|
-
The concrete technology products the solution is built upon, organized by
|
|
899
|
-
tier and lifecycle phase, recording for each component its chosen product,
|
|
900
|
-
its purpose, and the alternatives that were considered but not chosen.
|
|
901
|
-
|
|
902
|
-
- Format:
|
|
903
|
-
|
|
904
|
-
<format>
|
|
905
|
-
|
|
906
|
-
# ARCHITECTURE: TECHNOLOGY STACK (ARCH-TS)
|
|
907
|
-
|
|
908
|
-
✳ Created: **<timestamp-created/>**
|
|
909
|
-
✎ Modified: **<timestamp-modified/>**
|
|
910
|
-
|
|
911
|
-
<arch-ts-component/>
|
|
912
|
-
<arch-ts-component/>
|
|
913
|
-
[...]
|
|
914
|
-
|
|
915
|
-
</format>
|
|
916
|
-
|
|
917
|
-
- <arch-ts-component/> format:
|
|
918
|
-
|
|
919
|
-
<format>
|
|
920
|
-
|
|
921
|
-
## COMPONENT: <arch-ts-component-name/> <a id="ARCH-TS-<arch-ts-component-id/>"></a>
|
|
922
|
-
|
|
923
|
-
- Product: <arch-ts-component-product/>
|
|
924
|
-
- Alternatives: <arch-ts-component-alternative/>[, ...]
|
|
925
|
-
- Coverage: <arch-ts-component-coverage/>
|
|
926
|
-
- Realizes: <arch-ts-component-element/>[, ...]
|
|
927
|
-
- Tier: <arch-ts-component-tier/>
|
|
928
|
-
- When: <arch-ts-component-when/>
|
|
929
|
-
|
|
930
|
-
<arch-ts-component-description/>,
|
|
931
|
-
**BECAUSE** <arch-ts-component-rationale/>.
|
|
932
|
-
|
|
933
|
-
</format>
|
|
934
|
-
|
|
935
|
-
- <arch-ts-component/> details:
|
|
936
|
-
|
|
937
|
-
- <arch-ts-component-id/>: per-artifact unique "slug" of always 1-3
|
|
938
|
-
lower-cased words (concatenated with "-" characters and
|
|
939
|
-
in total not longer than 30 characters), derived from
|
|
940
|
-
<arch-ts-component-name/>.
|
|
941
|
-
|
|
942
|
-
- <arch-ts-component-name/> is a short (2-5 word) summary of the
|
|
943
|
-
technology component (e.g. `UI Framework`, `Web Server`, `Relational
|
|
944
|
-
Database`).
|
|
945
|
-
|
|
946
|
-
- <arch-ts-component-product/> is the concrete product, library, or
|
|
947
|
-
framework chosen for this component (e.g. `VueJS`, `Node.js`,
|
|
948
|
-
`PostgreSQL`).
|
|
949
|
-
|
|
950
|
-
- <arch-ts-component-alternative/> is a product that would also fit
|
|
951
|
-
this component but was not chosen (e.g. `React`, `Svelte`).
|
|
952
|
-
|
|
953
|
-
- <arch-ts-component-coverage/> is either one or more of the
|
|
954
|
-
*Client Aspects* or one or more of the *Server Aspects* defined
|
|
955
|
-
below. The general goal is to achieve a maximum coverage of all
|
|
956
|
-
aspects per <arch-ts-component-tier/> with the minimum total
|
|
957
|
-
number of <arch-ts-component-product/>.
|
|
958
|
-
|
|
959
|
-
- <arch-ts-component-element/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
960
|
-
or `ARCH-DP-<arch-dp-node-id/>` reference to the functional element
|
|
961
|
-
or deployment node this product realizes.
|
|
962
|
-
|
|
963
|
-
- <arch-ts-component-tier/> is the architectural tier the component
|
|
964
|
-
belongs to, one of:
|
|
965
|
-
|
|
966
|
-
- `Client`: Runs on the client side (e.g. browser, desktop, mobile).
|
|
967
|
-
- `Server`: Runs on the server side (e.g. backend, application, API).
|
|
968
|
-
|
|
969
|
-
- <arch-ts-component-when/> is the lifecycle phase in which the
|
|
970
|
-
component is relevant, one of:
|
|
971
|
-
|
|
972
|
-
- `Build-Time`: Used during development, compilation, or packaging.
|
|
973
|
-
- `Run-Time`: Used while the solution executes in production.
|
|
974
|
-
|
|
975
|
-
- <arch-ts-component-description/> is a concise paragraph (1-3
|
|
976
|
-
sentences) of prose describing how the product is used within the
|
|
977
|
-
solution and how it fits into the overall technology stack.
|
|
978
|
-
|
|
979
|
-
- <arch-ts-component-rationale/> is the 1-sentence rationale ("why")
|
|
980
|
-
for choosing this product over the alternatives.
|
|
981
|
-
|
|
982
|
-
- In case the element reference is not present, the
|
|
983
|
-
entire `- Realizes:` bullet point is omitted.
|
|
984
|
-
|
|
985
|
-
- In case no alternatives were considered, the
|
|
986
|
-
entire `- Alternatives:` bullet point is omitted.
|
|
987
|
-
|
|
988
|
-
- In case the rationale is not present, the
|
|
989
|
-
entire `, **BECAUSE** [...]` clause is omitted.
|
|
990
|
-
|
|
991
|
-
- The known *Client Aspects* which usually have to be covered (at least for
|
|
992
|
-
clients in a Rich-Client architecture):
|
|
993
|
-
|
|
994
|
-
- **Interface Theme**:
|
|
995
|
-
Style Reset, Shape, Color, Gradient, Shadow, Font, Icon.
|
|
996
|
-
|
|
997
|
-
- **Interface Widgets**:
|
|
998
|
-
Icon, Label, Text Paragraph, Image, Form, Text-Field, Text-Area,
|
|
999
|
-
Date Picker, Toggle, Radio Button, Checkbox, Select List, Slider,
|
|
1000
|
-
Progress Bar, Hyperlink, Popup Menu, Dropdown Menu, Toolbar, Tooltip,
|
|
1001
|
-
Tab, Pill, Breadcrumb, Pagination, Badge, Alert, Panel, Modal, Table,
|
|
1002
|
-
Scrollbar, Carousel.
|
|
1003
|
-
|
|
1004
|
-
- **Interface Layouting**:
|
|
1005
|
-
Responsive Design, Media Query, Frame, Grid, Padding, Border,
|
|
1006
|
-
Margin, Alignment, Force, Magnetism.
|
|
1007
|
-
|
|
1008
|
-
- **Interface Effects**:
|
|
1009
|
-
Transition, Transformation, Keyframes, Easing Function, Sound
|
|
1010
|
-
Effect, Physics.
|
|
1011
|
-
|
|
1012
|
-
- **Interface Interactions**:
|
|
1013
|
-
Mouse, Keyboard, Touchscreen, Gesture, Clipboard, Drag & Drop.
|
|
1014
|
-
|
|
1015
|
-
- **Interface States**:
|
|
1016
|
-
Rendered, Enabled, Visible, Focused, Warning, Error, Floating.
|
|
1017
|
-
|
|
1018
|
-
- **Interface Mask**:
|
|
1019
|
-
Markup Loading, Markup Generation, Virtual DOM, Text, Bitmaps,
|
|
1020
|
-
Vectors, 2D/3D Canvas, Accessibility.
|
|
1021
|
-
|
|
1022
|
-
- **Interface Internationalization**:
|
|
1023
|
-
Text Internationalization (I18N).
|
|
1024
|
-
|
|
1025
|
-
- **Data Conversion**:
|
|
1026
|
-
Value Formatting, Value Parsing, Localization (L10N).
|
|
1027
|
-
|
|
1028
|
-
- **Data Binding**:
|
|
1029
|
-
Reactive, Observer, Unidirectional, Bidirectional, Incremental.
|
|
1030
|
-
|
|
1031
|
-
- **Presentation Model**:
|
|
1032
|
-
Parameter Value, Command Value, State Value, Data Value, Event
|
|
1033
|
-
Value, Value Validation, Presentation Logic.
|
|
1034
|
-
|
|
1035
|
-
- **Dialog Navigation**:
|
|
1036
|
-
Deep Linking, Routing, Dialog Flow.
|
|
1037
|
-
|
|
1038
|
-
- **Dialog Automation**:
|
|
1039
|
-
Dialog Macros, Click-Through, Smoke Testing.
|
|
1040
|
-
|
|
1041
|
-
- **Dialog Communication**:
|
|
1042
|
-
Service, Event, Model, Socket, Hooks.
|
|
1043
|
-
|
|
1044
|
-
- **Dialog Life-Cycle**:
|
|
1045
|
-
Component States, Component State Transitions.
|
|
1046
|
-
|
|
1047
|
-
- **Dialog Structure**:
|
|
1048
|
-
Component, Model/View/Controller Roles, Hierarchical Composition.
|
|
1049
|
-
|
|
1050
|
-
- **State Persistence**:
|
|
1051
|
-
Local Storage, Cookies, Caching.
|
|
1052
|
-
|
|
1053
|
-
- **Business Model**:
|
|
1054
|
-
Entity, Field, Relationship, Universally Unique Identifiers (UUID).
|
|
1055
|
-
|
|
1056
|
-
- **Use-Case Authorization**:
|
|
1057
|
-
User Experience, Dialog Restriction, User, Group, Role, Use-Case,
|
|
1058
|
-
Data, Access.
|
|
1059
|
-
|
|
1060
|
-
- **Client Networking**:
|
|
1061
|
-
Request/Response, Synchronization, Push, Pull, Pulled-Push,
|
|
1062
|
-
REST, GraphQL, Authentication, Session.
|
|
1063
|
-
|
|
1064
|
-
- **Environment Detection**:
|
|
1065
|
-
Runtime Detection, Feature Detection.
|
|
1066
|
-
|
|
1067
|
-
- The known *Server Aspects* which usually have to be covered (at least for
|
|
1068
|
-
servers, sometimes called Thin-Servers, in a Rich-Client architecture):
|
|
1069
|
-
|
|
1070
|
-
- **Environment Detection**:
|
|
1071
|
-
Detect the run-time environment, like underlying operating
|
|
1072
|
-
system, execution platform, network topology, feature toggles, etc.
|
|
1073
|
-
|
|
1074
|
-
- **Argument Parsing**:
|
|
1075
|
-
Parse options and arguments of the Command-Line Interface (CLI)
|
|
1076
|
-
to bootstrap application parameters.
|
|
1077
|
-
|
|
1078
|
-
- **Configuration Parsing**:
|
|
1079
|
-
Load and parse directives from a configuration file to bootstrap
|
|
1080
|
-
application parameters.
|
|
1081
|
-
|
|
1082
|
-
- **Process Daemonizing**:
|
|
1083
|
-
Detach from the startup terminal and host process in order to run
|
|
1084
|
-
fully independently.
|
|
1085
|
-
|
|
1086
|
-
- **Process Management**:
|
|
1087
|
-
(Pre-)fork child processes and/or threads of execution and monitor
|
|
1088
|
-
and control them during the life-cycle of the application.
|
|
1089
|
-
|
|
1090
|
-
- **Component Management**:
|
|
1091
|
-
Structure the code into components, instantiate them at run-time
|
|
1092
|
-
and manage them in a stateful component life-cycle.
|
|
1093
|
-
|
|
1094
|
-
- **Component Communication**:
|
|
1095
|
-
Provide inter-component communication mechanisms like events, hooks,
|
|
1096
|
-
registry, etc.
|
|
1097
|
-
|
|
1098
|
-
- **Server Networking**:
|
|
1099
|
-
Listen to network sockets, accept connections and manage
|
|
1100
|
-
request/response and message communication.
|
|
1101
|
-
|
|
1102
|
-
- **Peer Information**:
|
|
1103
|
-
Determine unique identification and add-on information about the
|
|
1104
|
-
client peer.
|
|
1105
|
-
|
|
1106
|
-
- **Session Handling**:
|
|
1107
|
-
Manage secured per-connection sessions to keep state between
|
|
1108
|
-
communication requests and/or client sessions.
|
|
1109
|
-
|
|
1110
|
-
- **User Authentication**:
|
|
1111
|
-
Determine and validate the unique identity of the user communicating
|
|
1112
|
-
over the current network connection.
|
|
1113
|
-
|
|
1114
|
-
- **Request Validation**:
|
|
1115
|
-
Validate the syntactical and semantical compliance of the requests
|
|
1116
|
-
and sanitize the requests.
|
|
1117
|
-
|
|
1118
|
-
- **Request Processing**:
|
|
1119
|
-
Process the request by dispatching execution according to the
|
|
1120
|
-
provided request and determined context information.
|
|
1121
|
-
|
|
1122
|
-
- **Role Authorization**:
|
|
1123
|
-
Determine whether the role of the current user is allowed to execute
|
|
1124
|
-
the current request.
|
|
1125
|
-
|
|
1126
|
-
- **Client Networking**:
|
|
1127
|
-
Provide mechanisms to connect to peers over the network and perform
|
|
1128
|
-
request/response and/or publish/subscribe communication.
|
|
1129
|
-
|
|
1130
|
-
- **Task Scheduling**:
|
|
1131
|
-
Schedule and execute recurring tasks independent of regular I/O
|
|
1132
|
-
operations.
|
|
1133
|
-
|
|
1134
|
-
- **Execution Tracing**:
|
|
1135
|
-
Provide mechanisms for tracing the execution by logging event and
|
|
1136
|
-
measurement information at certain points of interest.
|
|
1137
|
-
|
|
1138
|
-
- **Database Access**:
|
|
1139
|
-
Map in-memory domain entities onto a data-store-dependent persistent
|
|
1140
|
-
data structure.
|
|
1141
|
-
|
|
1142
|
-
- **Database Connectivity**:
|
|
1143
|
-
Locally or remotely connect the database access layer to the
|
|
1144
|
-
underlying data store.
|
|
1145
|
-
|
|
1146
|
-
- **Database Schema**:
|
|
1147
|
-
Create, update or downgrade the data schema inside the underlying
|
|
1148
|
-
data store.
|
|
1149
|
-
|
|
1150
|
-
- **Database Bootstrapping**:
|
|
1151
|
-
Create, update or downgrade both mandatory bootstrapping and optional
|
|
1152
|
-
domain-specific data inside the underlying data store.
|
|
1153
|
-
|
|
1154
|
-
- Export: `export.md`
|
|
1155
|
-
|
|
1156
|
-
The components rendered as a single, compact Markdown table -- one
|
|
1157
|
-
row per <arch-ts-component/>, sorted by <arch-ts-component-tier/>
|
|
1158
|
-
then <arch-ts-component-when/> -- with the columns:
|
|
1159
|
-
|
|
1160
|
-
- `Component` (<arch-ts-component-name/>)
|
|
1161
|
-
- `Product` (**<arch-ts-component-product/>**)
|
|
1162
|
-
- `Tier` (<arch-ts-component-tier/>)
|
|
1163
|
-
- `When` (<arch-ts-component-when/>)
|
|
1164
|
-
- `Coverage` (*<arch-ts-component-coverage/>*)
|