@rse/ase 0.9.1 → 0.9.3
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-hello.js +24 -0
- package/dst/ase-statusline.js +15 -5
- package/package.json +2 -2
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.github/plugin/plugin.json +1 -1
- package/plugin/agents/ase-meta-review.md +188 -0
- package/plugin/etc/eslint.mjs +25 -0
- package/plugin/etc/markdownlint.yaml +13 -11
- package/plugin/etc/stx.conf +2 -1
- package/plugin/meta/ase-control.md +7 -2
- package/plugin/meta/ase-dialog.md +2 -0
- package/plugin/meta/ase-format-arch.md +317 -102
- package/plugin/meta/ase-format-meta.md +12 -0
- package/plugin/meta/ase-format-spec.md +535 -251
- package/plugin/meta/ase-getopt.md +1 -0
- package/plugin/meta/ase-persona.md +1 -1
- package/plugin/meta/ase-skill.md +6 -6
- package/plugin/package.json +5 -2
- package/plugin/skills/ase-arch-analyze/SKILL.md +33 -33
- package/plugin/skills/ase-code-lint/SKILL.md +1 -1
- package/plugin/skills/ase-code-lint/help.md +1 -1
- package/plugin/skills/ase-docs-distill/SKILL.md +158 -0
- package/plugin/skills/ase-docs-distill/help.md +76 -0
- package/plugin/skills/ase-docs-proofread/SKILL.md +1 -1
- package/plugin/skills/ase-docs-proofread/help.md +1 -1
- package/plugin/skills/ase-meta-brainstorm/SKILL.md +17 -11
- package/plugin/skills/ase-meta-brainstorm/help.md +4 -4
- package/plugin/skills/ase-meta-diaboli/SKILL.md +4 -4
- package/plugin/skills/ase-meta-diaboli/help.md +2 -2
- package/plugin/skills/ase-meta-diff/SKILL.md +110 -64
- package/plugin/skills/ase-meta-diff/help.md +30 -6
- package/plugin/skills/ase-meta-review/SKILL.md +166 -0
- package/plugin/skills/ase-meta-review/help.md +70 -0
- package/plugin/skills/ase-meta-steelman/SKILL.md +159 -0
- package/plugin/skills/ase-meta-steelman/help.md +60 -0
- package/plugin/skills/ase-meta-why/help.md +1 -1
- package/plugin/skills/ase-task-condense/SKILL.md +3 -3
- package/plugin/skills/ase-task-implement/help.md +1 -1
- package/plugin/meta/ase-format-adr.md +0 -199
|
@@ -7,11 +7,20 @@ Architecture (ARCH)
|
|
|
7
7
|
The **Artifact Set** **Architecture (ARCH)** specifies the "input"
|
|
8
8
|
and the "how" of the Software Engineering project.
|
|
9
9
|
|
|
10
|
-
Each **Artifact** of the **Artifact Set**
|
|
11
|
-
is stored under
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
Each **Artifact** of the **Artifact Set**
|
|
11
|
+
**Architecture (ARCH)** is stored under
|
|
12
|
+
`docs/arch/ARCH-<artifact-no/>-<artifact-id/>-<artifact-slug/>.md`,
|
|
13
|
+
relative to the project root directory, with <artifact-no/> being the
|
|
14
|
+
zero-padded, two-digit sequence number of the **Artifact** (starting at
|
|
15
|
+
`01`) according to the order of the **Artifact** list below, and with
|
|
16
|
+
<artifact-slug/> being derived from <artifact-name/> (see below) by
|
|
17
|
+
Pascal-casing each word (upper-casing its first letter) and using `-`
|
|
18
|
+
characters instead of spaces (e.g. `Context-View`).
|
|
19
|
+
|
|
20
|
+
Each **Artifact** file *MUST* begin with a single blank line before its
|
|
21
|
+
`#` heading and end with a single blank line after its last content line
|
|
22
|
+
(followed by the trailing newline), mirroring the blank lines shown
|
|
23
|
+
inside the `<format>` blocks below.
|
|
15
24
|
|
|
16
25
|
Each **Artifact** contains two timestamps: the <timestamp-created/>
|
|
17
26
|
is the timestamp when this **Artifact** was created. The
|
|
@@ -26,41 +35,62 @@ The **Artifact Set** **Architecture (ARCH)** consists of the following
|
|
|
26
35
|
distinct **Artifact**s (listed under their <artifact-name/> and their
|
|
27
36
|
<artifact-id/>):
|
|
28
37
|
|
|
29
|
-
|
|
38
|
+
01. **Context View (CV)**:
|
|
30
39
|
The relationships, dependencies, and interactions between the solution
|
|
31
40
|
and its environment, defining the system's scope, external entities,
|
|
32
41
|
and boundaries.
|
|
33
42
|
|
|
34
|
-
|
|
35
|
-
The functional
|
|
43
|
+
02. **Functionality View (FV)**:
|
|
44
|
+
The functional components of the solution, their responsibilities,
|
|
36
45
|
interfaces, and primary interactions, describing *what* the system does
|
|
37
46
|
at runtime.
|
|
38
47
|
|
|
39
|
-
|
|
48
|
+
03. **Information View (IV)**:
|
|
40
49
|
The way the solution stores, manages, manipulates, and distributes
|
|
41
50
|
information, defining the static data structure and dynamic information
|
|
42
51
|
flow.
|
|
43
52
|
|
|
44
|
-
|
|
45
|
-
The concurrency structure of the solution, mapping functional
|
|
53
|
+
04. **Concurrency View (CO)**:
|
|
54
|
+
The concurrency structure of the solution, mapping functional components
|
|
46
55
|
to processes and threads, and defining how they coordinate and
|
|
47
56
|
communicate.
|
|
48
57
|
|
|
49
|
-
|
|
58
|
+
05. **Development View (DV)**:
|
|
50
59
|
The architecture supporting the software development process, defining
|
|
51
60
|
the module organization, build approach, and codeline conventions.
|
|
52
61
|
|
|
53
|
-
|
|
62
|
+
06. **Deployment View (DP)**:
|
|
54
63
|
The environment into which the solution is deployed, mapping software
|
|
55
64
|
elements to the runtime platform, hardware, and network topology.
|
|
56
65
|
|
|
57
|
-
|
|
66
|
+
07. **Operations View (OV)**:
|
|
58
67
|
The way the solution is operated, administered, and supported in
|
|
59
68
|
production, defining installation, monitoring, and management concerns.
|
|
60
69
|
|
|
61
|
-
|
|
70
|
+
08. **Quality Perspectives (QP)**:
|
|
62
71
|
How the Non-Functional Requirements (NR) are addressed.
|
|
63
72
|
|
|
73
|
+
09. **Decision Record (DR)**:
|
|
74
|
+
The major decisions related to the architecture, each recording the
|
|
75
|
+
forces at play, the chosen response, and the reasoning that justifies it.
|
|
76
|
+
|
|
77
|
+
The **Artifact**s have the following cross-references:
|
|
78
|
+
|
|
79
|
+
```text
|
|
80
|
+
ARCH-02-FV Functionality View ──(depends on)─► ARCH-02-FV Functionality View
|
|
81
|
+
ARCH-03-IV Information View ──(entity)─► SPEC-05-DM Data Model
|
|
82
|
+
ARCH-03-IV Information View ──(owner)─► ARCH-02-FV Functionality View
|
|
83
|
+
ARCH-04-CO Concurrency View ──(hosts)─► ARCH-02-FV Functionality View
|
|
84
|
+
ARCH-06-DP Deployment View ──(hosts)─► ARCH-02-FV Functionality View
|
|
85
|
+
ARCH-07-OV Operations View ──(element)─► ARCH-02-FV Functionality View
|
|
86
|
+
ARCH-07-OV Operations View ──(element)─► ARCH-06-DP Deployment View
|
|
87
|
+
ARCH-08-QP Quality Perspectives ──(addresses)─► SPEC-04-NR Non-Functional Requirements
|
|
88
|
+
ARCH-08-QP Quality Perspectives ──(affects)─► ARCH-02-FV Functionality View
|
|
89
|
+
ARCH-08-QP Quality Perspectives ──(affects)─► ARCH-06-DP Deployment View
|
|
90
|
+
ARCH-09-DR Decision Record ──(affects)─► ARCH-02-FV Functionality View
|
|
91
|
+
ARCH-09-DR Decision Record ──(affects)─► ARCH-06-DP Deployment View
|
|
92
|
+
```
|
|
93
|
+
|
|
64
94
|
Context View (CV)
|
|
65
95
|
-----------------
|
|
66
96
|
|
|
@@ -87,15 +117,15 @@ and boundaries.
|
|
|
87
117
|
|
|
88
118
|
<format>
|
|
89
119
|
|
|
90
|
-
## ENTITY
|
|
120
|
+
## ENTITY: <arch-cv-entity-name/> <a id="ARCH-CV-<arch-cv-entity-id/>"></a>
|
|
91
121
|
|
|
92
122
|
- Kind: <arch-cv-entity-kind/>
|
|
93
123
|
- Direction: <arch-cv-entity-direction/>
|
|
94
124
|
- Interface: <arch-cv-entity-interface/>
|
|
95
125
|
- Data: <arch-cv-entity-data/>
|
|
96
126
|
|
|
97
|
-
<arch-cv-entity-description
|
|
98
|
-
|
|
127
|
+
<arch-cv-entity-description/>,
|
|
128
|
+
**BECAUSE** <arch-cv-entity-rationale/>.
|
|
99
129
|
|
|
100
130
|
</format>
|
|
101
131
|
|
|
@@ -117,7 +147,7 @@ and boundaries.
|
|
|
117
147
|
- `Service`: A third-party or managed service the solution consumes.
|
|
118
148
|
- `Datastore`: An external data repository the solution reads from or writes to.
|
|
119
149
|
- `Device`: A physical device or sensor the solution communicates with.
|
|
120
|
-
- `Organization`: An external organizational party
|
|
150
|
+
- `Organization`: An external organizational party.
|
|
121
151
|
|
|
122
152
|
- <arch-cv-entity-direction/> is the flow of interaction relative to
|
|
123
153
|
the solution: `Inbound` (entity drives the solution), `Outbound`
|
|
@@ -137,12 +167,12 @@ and boundaries.
|
|
|
137
167
|
for the entity being part of the system context.
|
|
138
168
|
|
|
139
169
|
- In case the rationale is not present, the
|
|
140
|
-
entire
|
|
170
|
+
entire `, **BECAUSE** [...]` clause is omitted.
|
|
141
171
|
|
|
142
172
|
Functionality View (FV)
|
|
143
173
|
-----------------------
|
|
144
174
|
|
|
145
|
-
The functional
|
|
175
|
+
The functional components of the solution, their responsibilities,
|
|
146
176
|
interfaces, and primary interactions, describing *what* the system does
|
|
147
177
|
at runtime.
|
|
148
178
|
|
|
@@ -155,69 +185,68 @@ at runtime.
|
|
|
155
185
|
✳ Created: **<timestamp-created/>**
|
|
156
186
|
✎ Modified: **<timestamp-modified/>**
|
|
157
187
|
|
|
158
|
-
<arch-fv-
|
|
159
|
-
<arch-fv-
|
|
188
|
+
<arch-fv-component/>
|
|
189
|
+
<arch-fv-component/>
|
|
160
190
|
[...]
|
|
161
191
|
|
|
162
192
|
</format>
|
|
163
193
|
|
|
164
|
-
- <arch-fv-
|
|
194
|
+
- <arch-fv-component/> format:
|
|
165
195
|
|
|
166
196
|
<format>
|
|
167
197
|
|
|
168
|
-
##
|
|
198
|
+
## COMPONENT: <arch-fv-component-name/> <a id="ARCH-FV-<arch-fv-component-id/>"></a>
|
|
169
199
|
|
|
170
|
-
- Kind: <arch-fv-
|
|
171
|
-
- Responsibility: <arch-fv-
|
|
172
|
-
- Interface: <arch-fv-
|
|
173
|
-
- Depends On: <arch-fv-
|
|
200
|
+
- Kind: <arch-fv-component-kind/>
|
|
201
|
+
- Responsibility: <arch-fv-component-responsibility/>
|
|
202
|
+
- Interface: <arch-fv-component-interface/>
|
|
203
|
+
- Depends On: <arch-fv-component-dependency/>, [...]
|
|
174
204
|
|
|
175
|
-
<arch-fv-
|
|
176
|
-
|
|
205
|
+
<arch-fv-component-description/>,
|
|
206
|
+
**BECAUSE** <arch-fv-component-rationale/>.
|
|
177
207
|
|
|
178
208
|
</format>
|
|
179
209
|
|
|
180
|
-
- <arch-fv-
|
|
210
|
+
- <arch-fv-component/> details:
|
|
181
211
|
|
|
182
|
-
- <arch-fv-
|
|
212
|
+
- <arch-fv-component-id/>: per-artifact unique "slug" of always 1-3
|
|
183
213
|
lower-cased words (concatenated with "-" characters and
|
|
184
214
|
in total not longer than 30 characters), derived from
|
|
185
|
-
<arch-fv-
|
|
215
|
+
<arch-fv-component-name/>.
|
|
186
216
|
|
|
187
|
-
- <arch-fv-
|
|
188
|
-
functional
|
|
217
|
+
- <arch-fv-component-name/> is a short (2-5 word) summary of the
|
|
218
|
+
functional component (e.g. `Authentication Service`, `Order
|
|
189
219
|
Processor`, `Notification Dispatcher`).
|
|
190
220
|
|
|
191
|
-
- <arch-fv-
|
|
192
|
-
|
|
193
|
-
- `
|
|
194
|
-
- `
|
|
195
|
-
- `
|
|
196
|
-
- `
|
|
197
|
-
- `Subsystem`: A larger composite grouping several components.
|
|
221
|
+
- <arch-fv-component-kind/> is one of:
|
|
222
|
+
- `Component`: Cohesive unit of functionality with a defined interface.
|
|
223
|
+
- `Service`: Independently deployable provider of functionality.
|
|
224
|
+
- `Module`: Logical grouping of related functionality within a component.
|
|
225
|
+
- `Connector`: Mediator that conveys interactions between components (e.g. bus, gateway).
|
|
226
|
+
- `Subsystem`: Larger composite grouping several components.
|
|
198
227
|
|
|
199
|
-
- <arch-fv-
|
|
200
|
-
the single, primary responsibility the
|
|
228
|
+
- <arch-fv-component-responsibility/> is the 1-sentence statement of
|
|
229
|
+
the single, primary responsibility the component owns.
|
|
201
230
|
|
|
202
|
-
- <arch-fv-
|
|
203
|
-
this
|
|
231
|
+
- <arch-fv-component-interface/> is how other components interact with
|
|
232
|
+
this component (e.g. REST API, library API, message topic, CLI).
|
|
204
233
|
|
|
205
|
-
- <arch-fv-
|
|
206
|
-
reference to another functional
|
|
234
|
+
- <arch-fv-component-dependency/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
235
|
+
reference to another functional component this component depends on
|
|
207
236
|
at runtime.
|
|
208
237
|
|
|
209
|
-
- <arch-fv-
|
|
210
|
-
sentences) of prose describing *what* the
|
|
211
|
-
collaborates with the
|
|
238
|
+
- <arch-fv-component-description/> is a concise paragraph (1-3
|
|
239
|
+
sentences) of prose describing *what* the component does and how it
|
|
240
|
+
collaborates with the components it depends on.
|
|
212
241
|
|
|
213
|
-
- <arch-fv-
|
|
214
|
-
for the
|
|
242
|
+
- <arch-fv-component-rationale/> is the 1-sentence rationale ("why")
|
|
243
|
+
for the component's existence and boundary.
|
|
215
244
|
|
|
216
|
-
- In case
|
|
245
|
+
- In case a component has no dependencies at all, the
|
|
217
246
|
entire `- Depends On:` bullet point is omitted.
|
|
218
247
|
|
|
219
248
|
- In case the rationale is not present, the
|
|
220
|
-
entire
|
|
249
|
+
entire `, **BECAUSE** [...]` clause is omitted.
|
|
221
250
|
|
|
222
251
|
Information View (IV)
|
|
223
252
|
---------------------
|
|
@@ -245,15 +274,15 @@ flow.
|
|
|
245
274
|
|
|
246
275
|
<format>
|
|
247
276
|
|
|
248
|
-
## ASPECT
|
|
277
|
+
## ASPECT: <arch-iv-aspect-name/> <a id="ARCH-IV-<arch-iv-aspect-id/>"></a>
|
|
249
278
|
|
|
250
279
|
- Concern: <arch-iv-aspect-concern/>
|
|
251
280
|
- Entities: <arch-iv-aspect-entity/>, [...]
|
|
252
281
|
- Owner: <arch-iv-aspect-owner/>
|
|
253
282
|
- Lifecycle: <arch-iv-aspect-lifecycle/>
|
|
254
283
|
|
|
255
|
-
<arch-iv-aspect-description
|
|
256
|
-
|
|
284
|
+
<arch-iv-aspect-description/>,
|
|
285
|
+
**BECAUSE** <arch-iv-aspect-rationale/>.
|
|
257
286
|
|
|
258
287
|
</format>
|
|
259
288
|
|
|
@@ -277,8 +306,8 @@ flow.
|
|
|
277
306
|
reference to a corresponding entity of the Data Model **Artifact**
|
|
278
307
|
the aspect governs.
|
|
279
308
|
|
|
280
|
-
- <arch-iv-aspect-owner/> is an `ARCH-FV-<arch-fv-
|
|
281
|
-
reference to the functional
|
|
309
|
+
- <arch-iv-aspect-owner/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
310
|
+
reference to the functional component that owns this information.
|
|
282
311
|
|
|
283
312
|
- <arch-iv-aspect-lifecycle/> is how the information comes into
|
|
284
313
|
being, changes, and is disposed of (e.g. `created on order,
|
|
@@ -295,12 +324,12 @@ flow.
|
|
|
295
324
|
respective bullet point is omitted.
|
|
296
325
|
|
|
297
326
|
- In case the rationale is not present, the
|
|
298
|
-
entire
|
|
327
|
+
entire `, **BECAUSE** [...]` clause is omitted.
|
|
299
328
|
|
|
300
329
|
Concurrency View (CO)
|
|
301
330
|
---------------------
|
|
302
331
|
|
|
303
|
-
The concurrency structure of the solution, mapping functional
|
|
332
|
+
The concurrency structure of the solution, mapping functional components
|
|
304
333
|
to processes and threads, and defining how they coordinate and
|
|
305
334
|
communicate.
|
|
306
335
|
|
|
@@ -323,15 +352,15 @@ communicate.
|
|
|
323
352
|
|
|
324
353
|
<format>
|
|
325
354
|
|
|
326
|
-
## UNIT
|
|
355
|
+
## UNIT: <arch-co-unit-name/> <a id="ARCH-CO-<arch-co-unit-id/>"></a>
|
|
327
356
|
|
|
328
357
|
- Kind: <arch-co-unit-kind/>
|
|
329
358
|
- Hosts: <arch-co-unit-element/>, [...]
|
|
330
359
|
- Multiplicity: <arch-co-unit-multiplicity/>
|
|
331
360
|
- Coordination: <arch-co-unit-coordination/>
|
|
332
361
|
|
|
333
|
-
<arch-co-unit-description
|
|
334
|
-
|
|
362
|
+
<arch-co-unit-description/>,
|
|
363
|
+
**BECAUSE** <arch-co-unit-rationale/>.
|
|
335
364
|
|
|
336
365
|
</format>
|
|
337
366
|
|
|
@@ -348,14 +377,14 @@ communicate.
|
|
|
348
377
|
|
|
349
378
|
- <arch-co-unit-kind/> is one of:
|
|
350
379
|
|
|
351
|
-
- `Process`:
|
|
352
|
-
- `Thread`:
|
|
353
|
-
- `Pool`:
|
|
354
|
-
- `Queue`:
|
|
355
|
-
- `EventLoop`:
|
|
380
|
+
- `Process`: An independent OS process with its own address space.
|
|
381
|
+
- `Thread`: A thread of execution within a process.
|
|
382
|
+
- `Pool`: A managed group of interchangeable workers.
|
|
383
|
+
- `Queue`: An asynchronous buffer decoupling producers and consumers.
|
|
384
|
+
- `EventLoop`: A single-threaded cooperative scheduler of tasks.
|
|
356
385
|
|
|
357
|
-
- <arch-co-unit-element/> is an `ARCH-FV-<arch-fv-
|
|
358
|
-
reference to a functional
|
|
386
|
+
- <arch-co-unit-element/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
387
|
+
reference to a functional component that runs inside this
|
|
359
388
|
concurrency unit.
|
|
360
389
|
|
|
361
390
|
- <arch-co-unit-multiplicity/> is how many instances of the unit run
|
|
@@ -372,11 +401,11 @@ communicate.
|
|
|
372
401
|
- <arch-co-unit-rationale/> is the 1-sentence rationale ("why") for
|
|
373
402
|
the chosen concurrency structure.
|
|
374
403
|
|
|
375
|
-
- In case the unit hosts no functional
|
|
404
|
+
- In case the unit hosts no functional components, the
|
|
376
405
|
entire `- Hosts:` bullet point is omitted.
|
|
377
406
|
|
|
378
407
|
- In case the rationale is not present, the
|
|
379
|
-
entire
|
|
408
|
+
entire `, **BECAUSE** [...]` clause is omitted.
|
|
380
409
|
|
|
381
410
|
Development View (DV)
|
|
382
411
|
---------------------
|
|
@@ -403,12 +432,12 @@ the module organization, build approach, and codeline conventions.
|
|
|
403
432
|
|
|
404
433
|
<format>
|
|
405
434
|
|
|
406
|
-
## ASPECT
|
|
435
|
+
## ASPECT: <arch-dv-aspect-name/> <a id="ARCH-DV-<arch-dv-aspect-id/>"></a>
|
|
407
436
|
|
|
408
437
|
- Category: <arch-dv-aspect-category/>
|
|
409
438
|
|
|
410
|
-
<arch-dv-aspect-description
|
|
411
|
-
|
|
439
|
+
<arch-dv-aspect-description/>,
|
|
440
|
+
**BECAUSE** <arch-dv-aspect-rationale/>.
|
|
412
441
|
|
|
413
442
|
</format>
|
|
414
443
|
|
|
@@ -438,7 +467,7 @@ the module organization, build approach, and codeline conventions.
|
|
|
438
467
|
for the development aspect.
|
|
439
468
|
|
|
440
469
|
- In case the rationale is not present, the
|
|
441
|
-
entire
|
|
470
|
+
entire `, **BECAUSE** [...]` clause is omitted.
|
|
442
471
|
|
|
443
472
|
Deployment View (DP)
|
|
444
473
|
--------------------
|
|
@@ -465,15 +494,15 @@ elements to the runtime platform, hardware, and network topology.
|
|
|
465
494
|
|
|
466
495
|
<format>
|
|
467
496
|
|
|
468
|
-
## NODE
|
|
497
|
+
## NODE: <arch-dp-node-name/> <a id="ARCH-DP-<arch-dp-node-id/>"></a>
|
|
469
498
|
|
|
470
499
|
- Kind: <arch-dp-node-kind/>
|
|
471
500
|
- Platform: <arch-dp-node-platform/>
|
|
472
501
|
- Hosts: <arch-dp-node-element/>, [...]
|
|
473
502
|
- Network: <arch-dp-node-network/>
|
|
474
503
|
|
|
475
|
-
<arch-dp-node-description
|
|
476
|
-
|
|
504
|
+
<arch-dp-node-description/>,
|
|
505
|
+
**BECAUSE** <arch-dp-node-rationale/>.
|
|
477
506
|
|
|
478
507
|
</format>
|
|
479
508
|
|
|
@@ -489,18 +518,18 @@ elements to the runtime platform, hardware, and network topology.
|
|
|
489
518
|
|
|
490
519
|
- <arch-dp-node-kind/> is one of:
|
|
491
520
|
|
|
492
|
-
- `Server`:
|
|
493
|
-
- `Container`:
|
|
494
|
-
- `Cluster`:
|
|
495
|
-
- `Function`:
|
|
496
|
-
- `Device`:
|
|
497
|
-
- `Managed`:
|
|
521
|
+
- `Server`: A physical or virtual machine.
|
|
522
|
+
- `Container`: A containerized runtime (e.g. Docker, OCI).
|
|
523
|
+
- `Cluster`: A managed group of nodes (e.g. Kubernetes cluster).
|
|
524
|
+
- `Function`: A serverless / function-as-a-service runtime.
|
|
525
|
+
- `Device`: An edge or client device.
|
|
526
|
+
- `Managed`: A managed cloud service (e.g. managed database, queue).
|
|
498
527
|
|
|
499
528
|
- <arch-dp-node-platform/> is the runtime platform of the node
|
|
500
529
|
(e.g. `Linux x86-64`, `Kubernetes 1.30`, `AWS Lambda (Node.js)`).
|
|
501
530
|
|
|
502
|
-
- <arch-dp-node-element/> is an `ARCH-FV-<arch-fv-
|
|
503
|
-
reference to a functional
|
|
531
|
+
- <arch-dp-node-element/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
532
|
+
reference to a functional component deployed onto this node.
|
|
504
533
|
|
|
505
534
|
- <arch-dp-node-network/> is the network placement and connectivity
|
|
506
535
|
of the node (e.g. `public subnet, TLS 443`, `private VLAN`).
|
|
@@ -512,11 +541,11 @@ elements to the runtime platform, hardware, and network topology.
|
|
|
512
541
|
- <arch-dp-node-rationale/> is the 1-sentence rationale ("why") for
|
|
513
542
|
the node's placement and platform choice.
|
|
514
543
|
|
|
515
|
-
- In case the node hosts no functional
|
|
544
|
+
- In case the node hosts no functional components, the
|
|
516
545
|
entire `- Hosts:` bullet point is omitted.
|
|
517
546
|
|
|
518
547
|
- In case the rationale is not present, the
|
|
519
|
-
entire
|
|
548
|
+
entire `, **BECAUSE** [...]` clause is omitted.
|
|
520
549
|
|
|
521
550
|
Operations View (OV)
|
|
522
551
|
--------------------
|
|
@@ -543,13 +572,13 @@ production, defining installation, monitoring, and management concerns.
|
|
|
543
572
|
|
|
544
573
|
<format>
|
|
545
574
|
|
|
546
|
-
## CONCERN
|
|
575
|
+
## CONCERN: <arch-ov-concern-name/> <a id="ARCH-OV-<arch-ov-concern-id/>"></a>
|
|
547
576
|
|
|
548
577
|
- Category: <arch-ov-concern-category/>
|
|
549
578
|
- Element: <arch-ov-concern-element/>, [...]
|
|
550
579
|
|
|
551
|
-
<arch-ov-concern-description
|
|
552
|
-
|
|
580
|
+
<arch-ov-concern-description/>,
|
|
581
|
+
**BECAUSE** <arch-ov-concern-rationale/>.
|
|
553
582
|
|
|
554
583
|
</format>
|
|
555
584
|
|
|
@@ -569,7 +598,7 @@ production, defining installation, monitoring, and management concerns.
|
|
|
569
598
|
`Monitoring`, `Logging`, `Alerting`, `Backup`, `Recovery`,
|
|
570
599
|
`Upgrade`, or `Support`.
|
|
571
600
|
|
|
572
|
-
- <arch-ov-concern-element/> is an `ARCH-FV-<arch-fv-
|
|
601
|
+
- <arch-ov-concern-element/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
573
602
|
or `ARCH-DP-<arch-dp-node-id/>` reference to the functional
|
|
574
603
|
element or deployment node the concern applies to.
|
|
575
604
|
|
|
@@ -584,7 +613,7 @@ production, defining installation, monitoring, and management concerns.
|
|
|
584
613
|
entire `- Element:` bullet point is omitted.
|
|
585
614
|
|
|
586
615
|
- In case the rationale is not present, the
|
|
587
|
-
entire
|
|
616
|
+
entire `, **BECAUSE** [...]` clause is omitted.
|
|
588
617
|
|
|
589
618
|
Quality Perspectives (QP)
|
|
590
619
|
-------------------------
|
|
@@ -610,15 +639,15 @@ How the Non-Functional Requirements (NR) are addressed.
|
|
|
610
639
|
|
|
611
640
|
<format>
|
|
612
641
|
|
|
613
|
-
## PERSPECTIVE
|
|
642
|
+
## PERSPECTIVE: <arch-qp-perspective-name/> <a id="ARCH-QP-<arch-qp-perspective-id/>"></a>
|
|
614
643
|
|
|
615
644
|
- Quality: <arch-qp-perspective-quality/>
|
|
616
645
|
- Addresses: <arch-qp-perspective-requirement/>, [...]
|
|
617
646
|
- Tactic: <arch-qp-perspective-tactic/>
|
|
618
647
|
- Affects: <arch-qp-perspective-element/>, [...]
|
|
619
648
|
|
|
620
|
-
<arch-qp-perspective-description
|
|
621
|
-
|
|
649
|
+
<arch-qp-perspective-description/>,
|
|
650
|
+
**BECAUSE** <arch-qp-perspective-rationale/>.
|
|
622
651
|
|
|
623
652
|
</format>
|
|
624
653
|
|
|
@@ -649,7 +678,7 @@ How the Non-Functional Requirements (NR) are addressed.
|
|
|
649
678
|
replication behind a load balancer`, `read-through cache`, `circuit
|
|
650
679
|
breaker`).
|
|
651
680
|
|
|
652
|
-
- <arch-qp-perspective-element/> is an `ARCH-FV-<arch-fv-
|
|
681
|
+
- <arch-qp-perspective-element/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
653
682
|
or `ARCH-DP-<arch-dp-node-id/>` reference to the functional
|
|
654
683
|
element or deployment node the tactic affects.
|
|
655
684
|
|
|
@@ -664,4 +693,190 @@ How the Non-Functional Requirements (NR) are addressed.
|
|
|
664
693
|
entire `- Affects:` bullet point is omitted.
|
|
665
694
|
|
|
666
695
|
- In case the rationale is not present, the
|
|
667
|
-
entire
|
|
696
|
+
entire `, **BECAUSE** [...]` clause is omitted.
|
|
697
|
+
|
|
698
|
+
Decision Record (DR)
|
|
699
|
+
--------------------
|
|
700
|
+
|
|
701
|
+
The major decisions related to the architecture, each recording the
|
|
702
|
+
forces at play, the chosen response, and the reasoning that justifies it.
|
|
703
|
+
|
|
704
|
+
- Format:
|
|
705
|
+
|
|
706
|
+
<format>
|
|
707
|
+
|
|
708
|
+
# ARCHITECTURE: DECISION RECORD (ARCH-DR)
|
|
709
|
+
|
|
710
|
+
✳ Created: **<timestamp-created/>**
|
|
711
|
+
✎ Modified: **<timestamp-modified/>**
|
|
712
|
+
|
|
713
|
+
<arch-dr-decision/>
|
|
714
|
+
<arch-dr-decision/>
|
|
715
|
+
[...]
|
|
716
|
+
|
|
717
|
+
</format>
|
|
718
|
+
|
|
719
|
+
- <arch-dr-decision/> format:
|
|
720
|
+
|
|
721
|
+
<format>
|
|
722
|
+
|
|
723
|
+
## DECISION: <arch-dr-decision-name/> <a id="ARCH-DR-<arch-dr-decision-id/>"></a>
|
|
724
|
+
|
|
725
|
+
- Status: <arch-dr-decision-status/>
|
|
726
|
+
- Affects: <arch-dr-decision-element/>, [...]
|
|
727
|
+
- Created: <arch-dr-decision-created/>
|
|
728
|
+
- Modified: <arch-dr-decision-modified/>
|
|
729
|
+
|
|
730
|
+
- WHEN (Context):
|
|
731
|
+
<arch-dr-decision-context/>
|
|
732
|
+
|
|
733
|
+
- WHAT (Decision):
|
|
734
|
+
<arch-dr-decision-decision/>
|
|
735
|
+
|
|
736
|
+
- WHY (Rationale):
|
|
737
|
+
<arch-dr-decision-rationale/>
|
|
738
|
+
|
|
739
|
+
- NOTES (Background):
|
|
740
|
+
<arch-dr-decision-notes/>
|
|
741
|
+
|
|
742
|
+
</format>
|
|
743
|
+
|
|
744
|
+
- <arch-dr-decision/> details:
|
|
745
|
+
|
|
746
|
+
- <arch-dr-decision-id/>: per-artifact unique "slug" of always 1-3
|
|
747
|
+
lower-cased words (concatenated with "-" characters and
|
|
748
|
+
in total not longer than 30 characters), derived from
|
|
749
|
+
<arch-dr-decision-name/>.
|
|
750
|
+
|
|
751
|
+
- <arch-dr-decision-name/> is a short summary of the
|
|
752
|
+
<arch-dr-decision-decision/>, not longer than 80 characters.
|
|
753
|
+
|
|
754
|
+
- <arch-dr-decision-status/> is one of `proposed`, `accepted`,
|
|
755
|
+
`deprecated`, or `superseded by ARCH-DR-<arch-dr-decision-id/>`.
|
|
756
|
+
|
|
757
|
+
- <arch-dr-decision-element/> is an `ARCH-FV-<arch-fv-component-id/>`
|
|
758
|
+
or `ARCH-DP-<arch-dp-node-id/>` reference to the functional
|
|
759
|
+
element or deployment node the decision affects.
|
|
760
|
+
|
|
761
|
+
- <arch-dr-decision-created/> is the timestamp when this decision was
|
|
762
|
+
created, and <arch-dr-decision-modified/> is the timestamp when
|
|
763
|
+
this decision was last modified, both in the same ISO-style format
|
|
764
|
+
as the **Artifact**'s own timestamps.
|
|
765
|
+
|
|
766
|
+
- <arch-dr-decision-context/> captures the situation that forces the
|
|
767
|
+
decision - the "why are we even talking about this" part. It
|
|
768
|
+
describes the situation as it is, before the decision is made. The
|
|
769
|
+
following usually goes into it: the problem or need (what's broken,
|
|
770
|
+
missing, or about to change that requires a decision); the forces at
|
|
771
|
+
play (technical constraints, business requirements, deadlines, team
|
|
772
|
+
skills, existing systems, regulatory/compliance pressures - often
|
|
773
|
+
competing, and that tension is the whole point); relevant facts
|
|
774
|
+
(current architecture, prior decisions, assumptions, what's known
|
|
775
|
+
and what's uncertain); and scope/boundaries (what this decision is
|
|
776
|
+
and isn't about). It is written neutrally and factually. It should
|
|
777
|
+
not contain the decision itself, nor advocate for an option - a
|
|
778
|
+
reader should be able to read it, pause, and arrive at the decision
|
|
779
|
+
themselves because the forces make it (nearly) inevitable.
|
|
780
|
+
|
|
781
|
+
- <arch-dr-decision-decision/> states what is actually going to be
|
|
782
|
+
done - the chosen response to the forces laid out in the context. It
|
|
783
|
+
is written in active, assertive voice, in the present or imperative
|
|
784
|
+
tense, as a committed position rather than a discussion. The
|
|
785
|
+
following usually goes into it: the choice itself (clearly and
|
|
786
|
+
unambiguously) and the essence of how (enough of the approach to
|
|
787
|
+
make the choice concrete - the mechanism, pattern, or technology -
|
|
788
|
+
but not a full implementation specification). It is a declaration,
|
|
789
|
+
not a deliberation, usually using the wording "We use..." or "We
|
|
790
|
+
do...", active, definite, owning the choice. Avoid hedging ("we
|
|
791
|
+
might", "we could consider") - the deliberation already happened,
|
|
792
|
+
the decision records the verdict.
|
|
793
|
+
|
|
794
|
+
- <arch-dr-decision-rationale/> is the reasoning that justifies the
|
|
795
|
+
decision - the bridge that explains why this choice, given those
|
|
796
|
+
forces. It answers "Of all the things we could have done, why was
|
|
797
|
+
this the right one?". Where the context states the forces and the
|
|
798
|
+
decision states the choice, the rationale is the logical connective
|
|
799
|
+
tissue between them - it shows that the decision actually follows
|
|
800
|
+
from the context. The following usually goes into it: the deciding
|
|
801
|
+
factors (which forces from the context carried the most weight, and
|
|
802
|
+
how the chosen option satisfies them best); the trade-off reasoning
|
|
803
|
+
(what was optimized for and what was knowingly sacrificed - naming
|
|
804
|
+
the trade-off is the heart of rationale); why the alternatives lost
|
|
805
|
+
(the comparative argument: "option B failed on X, option C cost too
|
|
806
|
+
much on Y"); and assumptions and evidence (benchmarks, prior
|
|
807
|
+
experience, constraints, or principles the reasoning rests on).
|
|
808
|
+
|
|
809
|
+
- <arch-dr-decision-notes/> is *OPTIONAL* and can be omitted when it
|
|
810
|
+
does not add genuine value - most decisions won't need it. The
|
|
811
|
+
following usually goes into it: information of the decision *process*
|
|
812
|
+
(e.g. a weighted decision matrix of considered alternatives);
|
|
813
|
+
consequences of the decision (but only when non-obvious downstream
|
|
814
|
+
effects need to be called out); and links to strongly related
|
|
815
|
+
decisions.
|
|
816
|
+
|
|
817
|
+
- <arch-dr-decision-context/>, <arch-dr-decision-decision/>, and
|
|
818
|
+
<arch-dr-decision-rationale/> are each just a single paragraph of
|
|
819
|
+
concise and brief prose text, usually comprised of just 1 to 3
|
|
820
|
+
sentences. The value of a decision is in recording *that* a decision
|
|
821
|
+
was made and *why* - not in filling out sections of a document.
|
|
822
|
+
|
|
823
|
+
- For the relationship between context, decision, and rationale, good
|
|
824
|
+
checks are: the "litmus test" is that context = forces, decision =
|
|
825
|
+
response to those forces, rationale = why the decision answers the
|
|
826
|
+
forces in the context. The decision should feel like the natural,
|
|
827
|
+
almost inevitable answer to the context - if a reader is surprised
|
|
828
|
+
by the decision, either the context is missing a force, or the
|
|
829
|
+
decision is under-justified. The rationale should make the decision
|
|
830
|
+
feel earned, not asserted - if you would delete the rationale and
|
|
831
|
+
the decision suddenly looks arbitrary, the rationale was doing its
|
|
832
|
+
job.
|
|
833
|
+
|
|
834
|
+
- In case the element reference is not present, the
|
|
835
|
+
entire `- Affects:` bullet point is omitted.
|
|
836
|
+
|
|
837
|
+
- In case the `NOTES (Background)` content is not present, the
|
|
838
|
+
entire `NOTES (Background)` chunk is omitted.
|
|
839
|
+
|
|
840
|
+
- A decision *MUST* qualify on all of the following three tenets:
|
|
841
|
+
|
|
842
|
+
- **Hard to Reverse**: the cost of changing it later is meaningful
|
|
843
|
+
("Oh my god, this would result in a dramatic refactoring!"). So,
|
|
844
|
+
if a decision is easy to reverse, just skip it.
|
|
845
|
+
|
|
846
|
+
- **Surprising without Context**: a future architect will look at
|
|
847
|
+
the code and wonder ("Why on earth did they do it this way?").
|
|
848
|
+
So, if a decision is not surprising, nobody will wonder why.
|
|
849
|
+
|
|
850
|
+
- **Result of a Real Trade-Off**: there were genuine alternatives
|
|
851
|
+
and one was picked for specific reasons ("We deliberately chose
|
|
852
|
+
this, because..."). So, if there was no real alternative,
|
|
853
|
+
there's nothing to record beyond "we did the obvious thing."
|
|
854
|
+
|
|
855
|
+
- The following typically qualify as a decision:
|
|
856
|
+
|
|
857
|
+
- **Architectural shape.** "We're using a monorepo." "The write
|
|
858
|
+
model is event-sourced, the read model is projected into PostgreSQL."
|
|
859
|
+
|
|
860
|
+
- **Integration patterns between contexts.** "Ordering and Billing
|
|
861
|
+
communicate via domain events, not synchronous HTTP."
|
|
862
|
+
|
|
863
|
+
- **Technology choices that carry lock-in.** Database, message bus,
|
|
864
|
+
auth provider, deployment target. Not every library - just the
|
|
865
|
+
ones that would take a quarter to swap out.
|
|
866
|
+
|
|
867
|
+
- **Boundary and scope decisions.** "Customer data is owned by the
|
|
868
|
+
Customer context; other contexts reference it by ID only." The explicit
|
|
869
|
+
no-s are as valuable as the yes-s.
|
|
870
|
+
|
|
871
|
+
- **Deliberate deviations from the obvious path.** "We're using
|
|
872
|
+
manual SQL instead of an ORM because X." Anything where a reasonable
|
|
873
|
+
reader would assume the opposite. These stop the next engineer from
|
|
874
|
+
"fixing" something that was deliberate.
|
|
875
|
+
|
|
876
|
+
- **Constraints not visible in the code.** "We can't use AWS because
|
|
877
|
+
of compliance requirements." "Response times must be under 200ms because
|
|
878
|
+
of the partner API contract."
|
|
879
|
+
|
|
880
|
+
- **Rejected alternatives when the rejection is non-obvious.** If
|
|
881
|
+
you considered GraphQL and picked REST for subtle reasons, record it -
|
|
882
|
+
otherwise someone will suggest GraphQL again in six months.
|